diff --git a/src/app/api/admin/data_migration/import/route.ts b/src/app/api/admin/data_migration/import/route.ts index 4b13195..65d7eb0 100644 --- a/src/app/api/admin/data_migration/import/route.ts +++ b/src/app/api/admin/data_migration/import/route.ts @@ -7,7 +7,7 @@ import { gunzip } from 'zlib'; import { getAuthInfoFromCookie } from '@/lib/auth'; import { SimpleCrypto } from '@/lib/crypto'; import { db } from '@/lib/db'; -import { setCachedConfig } from '@/lib/config'; +import { configSelfCheck, setCachedConfig } from '@/lib/config'; const gunzipAsync = promisify(gunzip); @@ -79,6 +79,7 @@ export async function POST(req: NextRequest) { await db.clearAllData(); // 导入管理员配置 + importData.data.adminConfig = configSelfCheck(importData.data.adminConfig); await db.saveAdminConfig(importData.data.adminConfig); await setCachedConfig(importData.data.adminConfig); diff --git a/src/lib/config.ts b/src/lib/config.ts index 64391dc..56f053c 100644 --- a/src/lib/config.ts +++ b/src/lib/config.ts @@ -240,10 +240,61 @@ export async function getConfig(): Promise { if (!adminConfig) { adminConfig = await getInitConfig(""); } + adminConfig = configSelfCheck(adminConfig); cachedConfig = adminConfig; + db.saveAdminConfig(cachedConfig); return cachedConfig; } +export function configSelfCheck(adminConfig: AdminConfig): AdminConfig { + // 站长变更自检 + const ownerUser = process.env.USERNAME; + // 去重 + const seenUsernames = new Set(); + adminConfig.UserConfig.Users = adminConfig.UserConfig.Users.filter((user) => { + if (seenUsernames.has(user.username)) { + return false; + } + seenUsernames.add(user.username); + return true; + }); + // 过滤站长 + adminConfig.UserConfig.Users = adminConfig.UserConfig.Users.filter((user) => user.username !== ownerUser); + // 其他用户不得拥有 owner 权限 + adminConfig.UserConfig.Users.forEach((user) => { + if (user.role === 'owner') { + user.role = 'user'; + } + }); + // 重新添加回站长 + adminConfig.UserConfig.Users.unshift({ + username: ownerUser!, + role: 'owner', + banned: false, + }); + + // 采集源去重 + const seenSourceKeys = new Set(); + adminConfig.SourceConfig = adminConfig.SourceConfig.filter((source) => { + if (seenSourceKeys.has(source.key)) { + return false; + } + seenSourceKeys.add(source.key); + return true; + }); + + // 自定义分类去重 + const seenCustomCategoryKeys = new Set(); + adminConfig.CustomCategories = adminConfig.CustomCategories.filter((category) => { + if (seenCustomCategoryKeys.has(category.query + category.type)) { + return false; + } + seenCustomCategoryKeys.add(category.query + category.type); + return true; + }); + return adminConfig; +} + export async function resetConfig() { let originConfig: AdminConfig | null = null; try {