asaihost-nodejs 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +518 -0
- package/dist/InterventionLog-25EHE4QR.cjs +30 -0
- package/dist/InterventionLog-25EHE4QR.cjs.map +1 -0
- package/dist/InterventionLog-R6CCPU2B.es.js +30 -0
- package/dist/InterventionLog-R6CCPU2B.es.js.map +1 -0
- package/dist/LogStore-ECXX34WC.es.js +54 -0
- package/dist/LogStore-ECXX34WC.es.js.map +1 -0
- package/dist/LogStore-M2AUBNGO.cjs +54 -0
- package/dist/LogStore-M2AUBNGO.cjs.map +1 -0
- package/dist/asaihost-nodejs.cjs +6761 -0
- package/dist/asaihost-nodejs.cjs.map +1 -0
- package/dist/asaihost-nodejs.d.cts +406 -0
- package/dist/asaihost-nodejs.d.ts +406 -0
- package/dist/asaihost-nodejs.es.js +6761 -0
- package/dist/asaihost-nodejs.es.js.map +1 -0
- package/dist/chunk-4WJDC4M4.es.js +311 -0
- package/dist/chunk-4WJDC4M4.es.js.map +1 -0
- package/dist/chunk-6U2I5EON.es.js +12 -0
- package/dist/chunk-6U2I5EON.es.js.map +1 -0
- package/dist/chunk-DROOHKB3.es.js +87 -0
- package/dist/chunk-DROOHKB3.es.js.map +1 -0
- package/dist/chunk-E7V3EBDB.es.js +435 -0
- package/dist/chunk-E7V3EBDB.es.js.map +1 -0
- package/dist/chunk-EOGZPRML.es.js +740 -0
- package/dist/chunk-EOGZPRML.es.js.map +1 -0
- package/dist/chunk-G4WVDUBH.cjs +463 -0
- package/dist/chunk-G4WVDUBH.cjs.map +1 -0
- package/dist/chunk-HHPGUJ75.cjs +162 -0
- package/dist/chunk-HHPGUJ75.cjs.map +1 -0
- package/dist/chunk-KOFCBB3N.cjs +87 -0
- package/dist/chunk-KOFCBB3N.cjs.map +1 -0
- package/dist/chunk-KUZQ36IJ.es.js +162 -0
- package/dist/chunk-KUZQ36IJ.es.js.map +1 -0
- package/dist/chunk-LOMSUPPU.es.js +1202 -0
- package/dist/chunk-LOMSUPPU.es.js.map +1 -0
- package/dist/chunk-MCMADJQR.es.js +463 -0
- package/dist/chunk-MCMADJQR.es.js.map +1 -0
- package/dist/chunk-NLBFIRDB.cjs +105 -0
- package/dist/chunk-NLBFIRDB.cjs.map +1 -0
- package/dist/chunk-O6LVLSNB.cjs +40 -0
- package/dist/chunk-O6LVLSNB.cjs.map +1 -0
- package/dist/chunk-QWVR2HNT.cjs +435 -0
- package/dist/chunk-QWVR2HNT.cjs.map +1 -0
- package/dist/chunk-SMVZ3ZDJ.cjs +12 -0
- package/dist/chunk-SMVZ3ZDJ.cjs.map +1 -0
- package/dist/chunk-UTKVJE7N.es.js +40 -0
- package/dist/chunk-UTKVJE7N.es.js.map +1 -0
- package/dist/chunk-VLMM735Q.cjs +1202 -0
- package/dist/chunk-VLMM735Q.cjs.map +1 -0
- package/dist/chunk-W7DVKGX5.cjs +311 -0
- package/dist/chunk-W7DVKGX5.cjs.map +1 -0
- package/dist/chunk-X7VHW2TD.cjs +740 -0
- package/dist/chunk-X7VHW2TD.cjs.map +1 -0
- package/dist/chunk-XBIN4C2V.es.js +105 -0
- package/dist/chunk-XBIN4C2V.es.js.map +1 -0
- package/dist/intervention-hooks-FI4EHOL5.es.js +21 -0
- package/dist/intervention-hooks-FI4EHOL5.es.js.map +1 -0
- package/dist/intervention-hooks-LE6X4C6N.cjs +21 -0
- package/dist/intervention-hooks-LE6X4C6N.cjs.map +1 -0
- package/dist/log-alert-GLCULMQP.es.js +51 -0
- package/dist/log-alert-GLCULMQP.es.js.map +1 -0
- package/dist/log-alert-LAJ6VSAG.cjs +51 -0
- package/dist/log-alert-LAJ6VSAG.cjs.map +1 -0
- package/dist/log-formats-FKFMQKNO.cjs +31 -0
- package/dist/log-formats-FKFMQKNO.cjs.map +1 -0
- package/dist/log-formats-I5E32H5F.es.js +31 -0
- package/dist/log-formats-I5E32H5F.es.js.map +1 -0
- package/dist/password-63OY27RX.es.js +20 -0
- package/dist/password-63OY27RX.es.js.map +1 -0
- package/dist/password-NZ5EGDWG.cjs +20 -0
- package/dist/password-NZ5EGDWG.cjs.map +1 -0
- package/dist/user-store-J7LWEXSW.es.js +12 -0
- package/dist/user-store-J7LWEXSW.es.js.map +1 -0
- package/dist/user-store-SX4N6PQ4.cjs +12 -0
- package/dist/user-store-SX4N6PQ4.cjs.map +1 -0
- package/package.json +79 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/sysserver/api/login/store/user-db.ts","../src/infra/security-policy.ts","../src/sysserver/api/login/service/user-level-config.ts","../src/sysserver/api/login/service/route-defaults.ts"],"sourcesContent":["import type Idb from '../../../db/src/type';\r\nimport type { DbType } from '../../../db/db';\r\nimport {\r\n\tasRows,\r\n\tgetDataServer,\r\n\tqNum,\r\n\tqStr,\r\n\treadJsonBlob,\r\n\tresolveStoreConfig,\r\n\twriteJsonBlob,\r\n} from '../../../db/data-store';\r\n\r\nexport const USER_FIELDS = [\r\n\t'id',\r\n\t'us',\r\n\t'email',\r\n\t'passHash',\r\n\t'passSalt',\r\n\t'lv',\r\n\t'role',\r\n\t'status',\r\n\t'failCount',\r\n\t'lockedUntil',\r\n\t'mustChangePassword',\r\n\t'passwordChangedAt',\r\n\t'passHistory',\r\n\t'createdAt',\r\n\t'updatedAt',\r\n] as const;\r\n\r\nexport const SESSION_FIELDS = ['id', 'us', 'ip', 'createdAt', 'expiresAt', 'lastActivityAt', 'pri', 'pub'] as const;\r\n\r\nconst FILE_USERS = 'users.json';\r\nconst FILE_SESSIONS = 'sessions.json';\r\nconst TABLE_USERS = 'auth_users';\r\nconst TABLE_SESSIONS = 'auth_sessions';\r\n\r\nexport interface UserStoreDbConfig {\r\n\ttype: DbType;\r\n\topt: Record<string, unknown>;\r\n}\r\n\r\nexport function getUserStoreConfig($asai: any): UserStoreDbConfig {\r\n\tconst resolved = resolveStoreConfig($asai, 'user');\r\n\treturn { type: resolved.type, opt: resolved.opt };\r\n}\r\n\r\nexport function getUserDataServer($asai: any): { sqlDb(sql: Idb): Promise<unknown> } {\r\n\treturn getDataServer($asai, 'user');\r\n}\r\n\r\nexport function isFileStore($asai: any): boolean {\r\n\treturn getUserStoreConfig($asai).type === 'file';\r\n}\r\n\r\nfunction rowToRecord<T extends Record<string, unknown>>(row: Record<string, unknown>, numericKeys: string[]): T {\r\n\tconst out: Record<string, unknown> = { ...row };\r\n\tfor (const key of numericKeys) {\r\n\t\tif (out[key] != null && out[key] !== '') out[key] = Number(out[key]);\r\n\t}\r\n\tif (out.lockedUntil === '' || out.lockedUntil == null) delete out.lockedUntil;\r\n\tif (out.email === '') delete out.email;\r\n\treturn out as T;\r\n}\r\n\r\nasync function readJsonArray(db: { sqlDb(sql: Idb): Promise<unknown> }, filename: string): Promise<Record<string, unknown>[]> {\r\n\treturn readJsonBlob(db, filename);\r\n}\r\n\r\nasync function writeJsonArray(\r\n\tdb: { sqlDb(sql: Idb): Promise<unknown> },\r\n\tfilename: string,\r\n\tdata: Record<string, unknown>[],\r\n): Promise<void> {\r\n\tawait writeJsonBlob(db, filename, data);\r\n}\r\n\r\nexport async function dbListUsers($asai: any): Promise<Record<string, unknown>[]> {\r\n\tconst db = getUserDataServer($asai);\r\n\tconst cfg = getUserStoreConfig($asai);\r\n\tif (cfg.type === 'file') {\r\n\t\treturn readJsonArray(db, FILE_USERS);\r\n\t}\r\n\tconst res = await db.sqlDb({ type: 'select', table: TABLE_USERS, field: [...USER_FIELDS] });\r\n\treturn asRows(res).map((r) => rowToRecord(r, ['lv', 'failCount', 'lockedUntil', 'mustChangePassword', 'passwordChangedAt', 'createdAt', 'updatedAt']));\r\n}\r\n\r\nexport async function dbFindUser($asai: any, field: 'us' | 'id', value: string): Promise<Record<string, unknown> | null> {\r\n\tconst db = getUserDataServer($asai);\r\n\tconst cfg = getUserStoreConfig($asai);\r\n\tif (cfg.type === 'file') {\r\n\t\tconst users = await readJsonArray(db, FILE_USERS);\r\n\t\treturn users.find((u) => u[field] === value) || null;\r\n\t}\r\n\tconst res = await db.sqlDb({\r\n\t\ttype: 'select',\r\n\t\ttable: TABLE_USERS,\r\n\t\tfield: [...USER_FIELDS],\r\n\t\twhere: [[field, '=', qStr(value, cfg.type)]],\r\n\t\tlimit: 1,\r\n\t});\r\n\tconst rows = asRows(res);\r\n\treturn rows.length ? rowToRecord(rows[0], ['lv', 'failCount', 'lockedUntil', 'mustChangePassword', 'passwordChangedAt', 'createdAt', 'updatedAt']) : null;\r\n}\r\n\r\nexport async function dbCreateUser($asai: any, user: Record<string, unknown>): Promise<Record<string, unknown>> {\r\n\tconst db = getUserDataServer($asai);\r\n\tconst cfg = getUserStoreConfig($asai);\r\n\tif (cfg.type === 'file') {\r\n\t\tconst users = await readJsonArray(db, FILE_USERS);\r\n\t\tusers.push(user);\r\n\t\tawait writeJsonArray(db, FILE_USERS, users);\r\n\t\treturn user;\r\n\t}\r\n\tawait db.sqlDb({\r\n\t\ttype: 'insert',\r\n\t\ttable: TABLE_USERS,\r\n\t\tfield: [...USER_FIELDS],\r\n\t\tvalue: [\r\n\t\t\tUSER_FIELDS.map((f) => {\r\n\t\t\t\tconst v = user[f];\r\n\t\t\t\tif (typeof v === 'number') return qNum(v);\r\n\t\t\t\treturn qStr(v == null ? '' : String(v), cfg.type);\r\n\t\t\t}),\r\n\t\t],\r\n\t});\r\n\treturn user;\r\n}\r\n\r\nexport async function dbUpdateUser($asai: any, us: string, patch: Record<string, unknown>): Promise<Record<string, unknown> | null> {\r\n\tconst existing = await dbFindUser($asai, 'us', us);\r\n\tif (!existing) return null;\r\n\tconst merged = { ...existing, ...patch, updatedAt: Date.now() };\r\n\tconst db = getUserDataServer($asai);\r\n\tconst cfg = getUserStoreConfig($asai);\r\n\tif (cfg.type === 'file') {\r\n\t\tconst users = await readJsonArray(db, FILE_USERS);\r\n\t\tconst idx = users.findIndex((u) => u.us === us);\r\n\t\tif (idx < 0) return null;\r\n\t\tusers[idx] = merged;\r\n\t\tawait writeJsonArray(db, FILE_USERS, users);\r\n\t\treturn merged;\r\n\t}\r\n\tconst sets: Idb['set'] = [];\r\n\tfor (const [key, val] of Object.entries(patch)) {\r\n\t\tif (val === undefined) continue;\r\n\t\tif (typeof val === 'number') sets!.push([key, val]);\r\n\t\telse sets!.push([key, val == null ? '' : String(val)]);\r\n\t}\r\n\tsets!.push(['updatedAt', merged.updatedAt as number]);\r\n\tawait db.sqlDb({\r\n\t\ttype: 'update',\r\n\t\ttable: TABLE_USERS,\r\n\t\tset: sets,\r\n\t\twhere: [['us', '=', qStr(us, cfg.type)]],\r\n\t});\r\n\treturn merged;\r\n}\r\n\r\nexport async function dbListSessions($asai: any): Promise<Record<string, unknown>[]> {\r\n\tconst db = getUserDataServer($asai);\r\n\tconst cfg = getUserStoreConfig($asai);\r\n\tif (cfg.type === 'file') {\r\n\t\treturn readJsonArray(db, FILE_SESSIONS);\r\n\t}\r\n\tconst res = await db.sqlDb({ type: 'select', table: TABLE_SESSIONS, field: [...SESSION_FIELDS] });\r\n\treturn asRows(res).map((r) => rowToRecord(r, ['createdAt', 'expiresAt', 'lastActivityAt']));\r\n}\r\n\r\nexport async function dbWriteSessions($asai: any, sessions: Record<string, unknown>[]): Promise<void> {\r\n\tconst db = getUserDataServer($asai);\r\n\tconst cfg = getUserStoreConfig($asai);\r\n\tif (cfg.type === 'file') {\r\n\t\tawait writeJsonArray(db, FILE_SESSIONS, sessions);\r\n\t\treturn;\r\n\t}\r\n\tconst existing = await dbListSessions($asai);\r\n\tfor (const s of existing) {\r\n\t\tawait db.sqlDb({\r\n\t\t\ttype: 'delete',\r\n\t\t\ttable: TABLE_SESSIONS,\r\n\t\t\twhere: [['id', '=', qStr(String(s.id), cfg.type)]],\r\n\t\t});\r\n\t}\r\n\tfor (const s of sessions) {\r\n\t\tawait db.sqlDb({\r\n\t\t\ttype: 'insert',\r\n\t\t\ttable: TABLE_SESSIONS,\r\n\t\t\tfield: [...SESSION_FIELDS],\r\n\t\t\tvalue: [\r\n\t\t\t\tSESSION_FIELDS.map((f) => {\r\n\t\t\t\t\tconst v = s[f];\r\n\t\t\t\t\tif (typeof v === 'number') return qNum(v);\r\n\t\t\t\t\treturn qStr(v == null ? '' : String(v), cfg.type);\r\n\t\t\t\t}),\r\n\t\t\t],\r\n\t\t});\r\n\t}\r\n}\r\n\r\nexport async function dbAddSession($asai: any, session: Record<string, unknown>): Promise<void> {\r\n\tconst db = getUserDataServer($asai);\r\n\tconst cfg = getUserStoreConfig($asai);\r\n\tif (cfg.type === 'file') {\r\n\t\tconst sessions = await readJsonArray(db, FILE_SESSIONS);\r\n\t\tsessions.push(session);\r\n\t\tawait writeJsonArray(db, FILE_SESSIONS, sessions);\r\n\t\treturn;\r\n\t}\r\n\tawait db.sqlDb({\r\n\t\ttype: 'insert',\r\n\t\ttable: TABLE_SESSIONS,\r\n\t\tfield: [...SESSION_FIELDS],\r\n\t\tvalue: [\r\n\t\t\tSESSION_FIELDS.map((f) => {\r\n\t\t\t\tconst v = session[f];\r\n\t\t\t\tif (typeof v === 'number') return qNum(v);\r\n\t\t\t\treturn qStr(v == null ? '' : String(v), cfg.type);\r\n\t\t\t}),\r\n\t\t],\r\n\t});\r\n}\r\n\r\nexport async function dbRemoveSession($asai: any, sessionId: string): Promise<void> {\r\n\tconst db = getUserDataServer($asai);\r\n\tconst cfg = getUserStoreConfig($asai);\r\n\tif (cfg.type === 'file') {\r\n\t\tconst sessions = await readJsonArray(db, FILE_SESSIONS);\r\n\t\tawait writeJsonArray(\r\n\t\t\tdb,\r\n\t\t\tFILE_SESSIONS,\r\n\t\t\tsessions.filter((s) => s.id !== sessionId),\r\n\t\t);\r\n\t\treturn;\r\n\t}\r\n\tawait db.sqlDb({\r\n\t\ttype: 'delete',\r\n\t\ttable: TABLE_SESSIONS,\r\n\t\twhere: [['id', '=', qStr(sessionId, cfg.type)]],\r\n\t});\r\n}\r\n\r\nexport async function dbRemoveSessionsByUser($asai: any, us: string): Promise<void> {\r\n\tconst db = getUserDataServer($asai);\r\n\tconst cfg = getUserStoreConfig($asai);\r\n\tif (cfg.type === 'file') {\r\n\t\tconst sessions = await readJsonArray(db, FILE_SESSIONS);\r\n\t\tawait writeJsonArray(\r\n\t\t\tdb,\r\n\t\t\tFILE_SESSIONS,\r\n\t\t\tsessions.filter((s) => s.us !== us),\r\n\t\t);\r\n\t\treturn;\r\n\t}\r\n\tawait db.sqlDb({\r\n\t\ttype: 'delete',\r\n\t\ttable: TABLE_SESSIONS,\r\n\t\twhere: [['us', '=', qStr(us, cfg.type)]],\r\n\t});\r\n}\r\n\r\nexport async function dbDeleteUser($asai: any, us: string): Promise<boolean> {\r\n\tconst existing = await dbFindUser($asai, 'us', us);\r\n\tif (!existing) return false;\r\n\tconst db = getUserDataServer($asai);\r\n\tconst cfg = getUserStoreConfig($asai);\r\n\tawait dbRemoveSessionsByUser($asai, us);\r\n\tif (cfg.type === 'file') {\r\n\t\tconst users = await readJsonArray(db, FILE_USERS);\r\n\t\tconst next = users.filter((u) => u.us !== us);\r\n\t\tif (next.length === users.length) return false;\r\n\t\tawait writeJsonArray(db, FILE_USERS, next);\r\n\t\treturn true;\r\n\t}\r\n\tawait db.sqlDb({\r\n\t\ttype: 'delete',\r\n\t\ttable: TABLE_USERS,\r\n\t\twhere: [['us', '=', qStr(us, cfg.type)]],\r\n\t});\r\n\treturn true;\r\n}\r\n","/**\r\n * IEC 62443-4-2 — 可配置安全策略(CR 1.7 / 1.12 / 2.1 / 2.5)\r\n */\r\nimport { createHash } from 'node:crypto';\r\n\r\nexport interface PasswordPolicy {\r\n\tminLength: number;\r\n\trequireUpper: boolean;\r\n\trequireLower: boolean;\r\n\trequireDigit: boolean;\r\n\trequireSpecial: boolean;\r\n\tmaxAgeDays: number;\r\n\thistoryCount: number;\r\n}\r\n\r\nexport interface RoleDef {\r\n\tname: string;\r\n\tminLv: number;\r\n\tpermissions: string[];\r\n}\r\n\r\nconst DEFAULT_POLICY: PasswordPolicy = {\r\n\tminLength: 8,\r\n\trequireUpper: false,\r\n\trequireLower: true,\r\n\trequireDigit: true,\r\n\trequireSpecial: false,\r\n\tmaxAgeDays: 0,\r\n\thistoryCount: 0,\r\n};\r\n\r\nconst DEFAULT_ROLES: RoleDef[] = [\r\n\t{ name: 'viewer', minLv: 0, permissions: ['read'] },\r\n\t{ name: 'operator', minLv: 3, permissions: ['read', 'operate'] },\r\n\t{ name: 'engineer', minLv: 5, permissions: ['read', 'operate', 'audit'] },\r\n\t{ name: 'admin', minLv: 7, permissions: ['read', 'operate', 'audit', 'admin'] },\r\n\t{ name: 'developer', minLv: 9, permissions: ['read', 'operate', 'audit', 'admin', 'develop'] },\r\n\t{ name: 'superadmin', minLv: 99, permissions: ['read', 'operate', 'audit', 'admin', 'develop', 'super'] },\r\n];\r\n\r\nexport function getSecurityBlock($asai: any): Record<string, unknown> {\r\n\treturn ($asai?.hostconfig?.security as Record<string, unknown>) || {};\r\n}\r\n\r\nexport function getLoginBanner($asai: any): { enabled: boolean; text: string } {\r\n\tconst sec = getSecurityBlock($asai);\r\n\tconst banner = (sec.banner as Record<string, unknown>) || {};\r\n\treturn {\r\n\t\tenabled: banner.enabled === 1 || banner.enabled === true,\r\n\t\ttext: String(banner.text || ''),\r\n\t};\r\n}\r\n\r\nexport function getPasswordPolicy($asai: any): PasswordPolicy {\r\n\tconst sec = getSecurityBlock($asai);\r\n\tconst p = (sec.passwordPolicy as Record<string, unknown>) || {};\r\n\tconst minFromLegacy = Number(sec.passwordMinLength ?? DEFAULT_POLICY.minLength);\r\n\treturn {\r\n\t\tminLength: Number(p.minLength ?? minFromLegacy) || DEFAULT_POLICY.minLength,\r\n\t\trequireUpper: p.requireUpper === 1 || p.requireUpper === true,\r\n\t\trequireLower: p.requireLower !== 0 && p.requireLower !== false,\r\n\t\trequireDigit: p.requireDigit !== 0 && p.requireDigit !== false,\r\n\t\trequireSpecial: p.requireSpecial === 1 || p.requireSpecial === true,\r\n\t\tmaxAgeDays: Number(p.maxAgeDays ?? 0) || 0,\r\n\t\thistoryCount: Number(p.historyCount ?? 0) || 0,\r\n\t};\r\n}\r\n\r\nexport function getSessionIdleMinutes($asai: any): number {\r\n\tconst sec = getSecurityBlock($asai);\r\n\tconst v = sec.sessionIdleMinutes;\r\n\treturn v == null || v === 0 ? 0 : Number(v);\r\n}\r\n\r\nexport function getRoleDefinitions($asai: any): RoleDef[] {\r\n\tconst sec = getSecurityBlock($asai);\r\n\tconst raw = sec.roles;\r\n\tif (!Array.isArray(raw) || !raw.length) return DEFAULT_ROLES;\r\n\treturn raw.map((r: Record<string, unknown>) => ({\r\n\t\tname: String(r.name || 'role'),\r\n\t\tminLv: Number(r.minLv ?? 0),\r\n\t\tpermissions: Array.isArray(r.permissions) ? r.permissions.map(String) : [],\r\n\t}));\r\n}\r\n\r\nexport function resolveRoleForLevel($asai: any, lv: number): RoleDef {\r\n\tconst roles = getRoleDefinitions($asai);\r\n\tlet best = roles[0];\r\n\tfor (const r of roles) {\r\n\t\tif (lv >= r.minLv && r.minLv >= (best?.minLv ?? -1)) best = r;\r\n\t}\r\n\treturn best || DEFAULT_ROLES[0];\r\n}\r\n\r\nexport function hashPasswordForHistory(password: string): string {\r\n\treturn createHash('sha256').update(password).digest('hex');\r\n}\r\n\r\nexport function validatePasswordWithPolicy(password: string, policy: PasswordPolicy): string | null {\r\n\tif (!password || typeof password !== 'string') return 'PASSWORD_REQUIRED';\r\n\tif (password.length < policy.minLength) return 'PASSWORD_TOO_SHORT';\r\n\tif (policy.requireLower && !/[a-z]/.test(password)) return 'PASSWORD_WEAK';\r\n\tif (policy.requireUpper && !/[A-Z]/.test(password)) return 'PASSWORD_WEAK';\r\n\tif (policy.requireDigit && !/[0-9]/.test(password)) return 'PASSWORD_WEAK';\r\n\tif (policy.requireSpecial && !/[^a-zA-Z0-9]/.test(password)) return 'PASSWORD_WEAK';\r\n\treturn null;\r\n}\r\n\r\nexport function parsePassHistory(raw: unknown): string[] {\r\n\tif (!raw) return [];\r\n\tif (Array.isArray(raw)) return raw.map(String);\r\n\tif (typeof raw === 'string' && raw.startsWith('[')) {\r\n\t\ttry {\r\n\t\t\tconst arr = JSON.parse(raw);\r\n\t\t\treturn Array.isArray(arr) ? arr.map(String) : [];\r\n\t\t} catch {\r\n\t\t\treturn [];\r\n\t\t}\r\n\t}\r\n\treturn [];\r\n}\r\n\r\nexport function isPasswordInHistory(password: string, history: string[]): boolean {\r\n\tconst h = hashPasswordForHistory(password);\r\n\treturn history.includes(h);\r\n}\r\n\r\nexport function isPasswordExpired(passwordChangedAt: number | undefined, maxAgeDays: number): boolean {\r\n\tif (!maxAgeDays || maxAgeDays <= 0) return false;\r\n\tif (!passwordChangedAt) return false;\r\n\treturn Date.now() - passwordChangedAt > maxAgeDays * 86400000;\r\n}\r\n\r\nimport { toPublicUserLevels } from '../sysserver/api/login/service/user-level-config';\r\n\r\nexport function getPublicSecurityConfig($asai: any, lang = 'zh-CN') {\r\n\tconst policy = getPasswordPolicy($asai);\r\n\tconst banner = getLoginBanner($asai);\r\n\treturn {\r\n\t\tbanner,\r\n\t\tpasswordPolicy: {\r\n\t\t\tminLength: policy.minLength,\r\n\t\t\trequireUpper: policy.requireUpper,\r\n\t\t\trequireLower: policy.requireLower,\r\n\t\t\trequireDigit: policy.requireDigit,\r\n\t\t\trequireSpecial: policy.requireSpecial,\r\n\t\t},\r\n\t\tsessionIdleMinutes: getSessionIdleMinutes($asai),\r\n\t\troles: getRoleDefinitions($asai).map((r) => ({ name: r.name, minLv: r.minLv })),\r\n\t\tuserLevels: toPublicUserLevels($asai, lang),\r\n\t\tallowRegister: getSecurityBlock($asai).allowRegister !== 0,\r\n\t};\r\n}\r\n","/**\r\n * 用户等级与名称 — 管理员可自定义(持久化至 user store _meta/user-levels.json)\r\n */\r\nimport fs from 'node:fs/promises';\r\nimport path from 'node:path';\r\nimport { getUserStoreConfig } from '../store/user-db';\r\nimport {\r\n\tDEFAULT_ROUTE_RIGHTS,\r\n\tmergeRouteRights,\r\n\tnormalizeRouteRight,\r\n\troutesFromLegacyRights,\r\n\ttype RouteRight,\r\n} from './route-defaults';\r\n\r\nexport type { RouteRight };\r\n\r\nexport interface UserLevelDef {\r\n\tlv: number;\r\n\tkey: string;\r\n\tname: string;\r\n\tnameEn?: string;\r\n}\r\n\r\nexport interface PermissionThresholds {\r\n\tlogRead: number;\r\n\tadminRead: number;\r\n\tadminWrite: number;\r\n}\r\n\r\nexport interface UserLevelConfig {\r\n\tlevels: UserLevelDef[];\r\n\tthresholds: PermissionThresholds;\r\n\trouteRights?: RouteRight[];\r\n\tupdatedAt?: number;\r\n\tupdatedBy?: string;\r\n}\r\n\r\nexport const DEFAULT_LEVELS: UserLevelDef[] = [\r\n\t{ lv: 0, key: 'guest', name: '普通用户', nameEn: 'Guest' },\r\n\t{ lv: 3, key: 'operator', name: '操作员', nameEn: 'Operator' },\r\n\t{ lv: 5, key: 'engineer', name: '工程师', nameEn: 'Engineer' },\r\n\t{ lv: 7, key: 'admin', name: '管理员', nameEn: 'Administrator' },\r\n\t{ lv: 9, key: 'developer', name: '开发者', nameEn: 'Developer' },\r\n\t{ lv: 99, key: 'superadmin', name: '超级管理员', nameEn: 'Super Administrator' },\r\n];\r\n\r\nexport const DEFAULT_THRESHOLDS: PermissionThresholds = {\r\n\tlogRead: 3,\r\n\tadminRead: 7,\r\n\tadminWrite: 9,\r\n};\r\n\r\nconst META_FILE = '_meta/user-levels.json';\r\n\r\nfunction configPath($asai: any): string {\r\n\tconst dir = String(getUserStoreConfig($asai).opt?.dir || 'webdata/webdb/users/');\r\n\treturn path.resolve(dir, META_FILE);\r\n}\r\n\r\nfunction fromHostLevels($asai: any): UserLevelDef[] | null {\r\n\tconst raw = $asai?.hostconfig?.security?.userLevels;\r\n\tif (!Array.isArray(raw) || !raw.length) return null;\r\n\tconst levels: UserLevelDef[] = [];\r\n\tfor (const item of raw) {\r\n\t\tif (!item || typeof item !== 'object') continue;\r\n\t\tconst lv = Number((item as any).lv);\r\n\t\tconst key = String((item as any).key || '').trim();\r\n\t\tconst name = String((item as any).name || (item as any).label || '').trim();\r\n\t\tif (!Number.isFinite(lv) || !key || !name) continue;\r\n\t\tlevels.push({\r\n\t\t\tlv,\r\n\t\t\tkey,\r\n\t\t\tname,\r\n\t\t\tnameEn: (item as any).nameEn ? String((item as any).nameEn) : undefined,\r\n\t\t});\r\n\t}\r\n\treturn levels.length ? levels.sort((a, b) => a.lv - b.lv) : null;\r\n}\r\n\r\nfunction fromHostThresholds($asai: any): PermissionThresholds {\r\n\tconst t = $asai?.hostconfig?.security?.permissionThresholds;\r\n\tif (!t || typeof t !== 'object') return { ...DEFAULT_THRESHOLDS };\r\n\treturn {\r\n\t\tlogRead: Number(t.logRead ?? DEFAULT_THRESHOLDS.logRead),\r\n\t\tadminRead: Number(t.adminRead ?? DEFAULT_THRESHOLDS.adminRead),\r\n\t\tadminWrite: Number(t.adminWrite ?? DEFAULT_THRESHOLDS.adminWrite),\r\n\t};\r\n}\r\n\r\nexport function getDefaultRouteRights($asai: any): RouteRight[] {\r\n\tconst fromHost = $asai?.hostconfig?.security?.routeRights;\r\n\tlet base = DEFAULT_ROUTE_RIGHTS.map((r) => ({ ...r }));\r\n\tif (Array.isArray(fromHost) && fromHost.length) {\r\n\t\tconst parsed: RouteRight[] = [];\r\n\t\tfor (const item of fromHost) {\r\n\t\t\tconst row = normalizeRouteRight(item);\r\n\t\t\tif (row) parsed.push(row);\r\n\t\t}\r\n\t\tif (parsed.length) base = mergeRouteRights(base, parsed);\r\n\t}\r\n\tconst legacy = $asai?.hostconfig?.security?.routerRights;\r\n\tif (legacy && typeof legacy === 'object') {\r\n\t\tbase = mergeRouteRights(base, routesFromLegacyRights(legacy));\r\n\t}\r\n\treturn base;\r\n}\r\n\r\nexport function getDefaultUserLevelConfig($asai: any): UserLevelConfig {\r\n\treturn {\r\n\t\tlevels: fromHostLevels($asai) || DEFAULT_LEVELS.map((l) => ({ ...l })),\r\n\t\tthresholds: fromHostThresholds($asai),\r\n\t\trouteRights: getDefaultRouteRights($asai),\r\n\t};\r\n}\r\n\r\nfunction normalizeLevel(item: unknown): UserLevelDef | null {\r\n\tif (!item || typeof item !== 'object') return null;\r\n\tconst lv = Number((item as any).lv);\r\n\tconst key = String((item as any).key || '').trim().slice(0, 32);\r\n\tconst name = String((item as any).name || '').trim().slice(0, 64);\r\n\tif (!Number.isFinite(lv) || lv < 0 || !key || !name) return null;\r\n\treturn {\r\n\t\tlv: Math.floor(lv),\r\n\t\tkey,\r\n\t\tname,\r\n\t\tnameEn: (item as any).nameEn ? String((item as any).nameEn).trim().slice(0, 64) : undefined,\r\n\t};\r\n}\r\n\r\nexport function normalizeUserLevelConfig(input: Partial<UserLevelConfig>, $asai: any): UserLevelConfig {\r\n\tconst base = getDefaultUserLevelConfig($asai);\r\n\tconst synced = getUserLevelConfigSync($asai);\r\n\tconst levelBase = synced.levels?.length ? synced : base;\r\n\tconst levels: UserLevelDef[] = [];\r\n\tconst seenLv = new Set<number>();\r\n\tconst seenKey = new Set<string>();\r\n\tif (Array.isArray(input.levels) && input.levels.length) {\r\n\t\tfor (const raw of input.levels) {\r\n\t\t\tconst row = normalizeLevel(raw);\r\n\t\t\tif (!row || seenLv.has(row.lv) || seenKey.has(row.key)) continue;\r\n\t\t\tseenLv.add(row.lv);\r\n\t\t\tseenKey.add(row.key);\r\n\t\t\tlevels.push(row);\r\n\t\t}\r\n\t} else {\r\n\t\tlevels.push(...levelBase.levels.map((l) => ({ ...l })));\r\n\t}\r\n\tif (!levels.some((l) => l.lv === 0)) {\r\n\t\tlevels.unshift({ lv: 0, key: 'guest', name: '普通用户', nameEn: 'Guest' });\r\n\t}\r\n\tlevels.sort((a, b) => a.lv - b.lv);\r\n\r\n\tconst th = input.thresholds || {};\r\n\tconst thresholds: PermissionThresholds = {\r\n\t\tlogRead: Number.isFinite(Number(th.logRead)) ? Number(th.logRead) : base.thresholds.logRead,\r\n\t\tadminRead: Number.isFinite(Number(th.adminRead)) ? Number(th.adminRead) : base.thresholds.adminRead,\r\n\t\tadminWrite: Number.isFinite(Number(th.adminWrite)) ? Number(th.adminWrite) : base.thresholds.adminWrite,\r\n\t};\r\n\r\n\treturn {\r\n\t\tlevels,\r\n\t\tthresholds,\r\n\t\trouteRights: normalizeRouteRightsList(input.routeRights, base.routeRights || getDefaultRouteRights($asai)),\r\n\t\tupdatedAt: input.updatedAt,\r\n\t\tupdatedBy: input.updatedBy,\r\n\t};\r\n}\r\n\r\nfunction normalizeRouteRightsList(raw: unknown, fallback: RouteRight[]): RouteRight[] {\r\n\tif (!Array.isArray(raw) || !raw.length) return fallback.map((r) => ({ ...r }));\r\n\tconst parsed: RouteRight[] = [];\r\n\tconst seen = new Set<string>();\r\n\tfor (const item of raw) {\r\n\t\tconst row = normalizeRouteRight(item);\r\n\t\tif (!row || seen.has(row.route)) continue;\r\n\t\tseen.add(row.route);\r\n\t\tparsed.push(row);\r\n\t}\r\n\treturn parsed.length ? parsed : fallback.map((r) => ({ ...r }));\r\n}\r\n\r\nexport function validateUserLevelConfig(cfg: UserLevelConfig): string | null {\r\n\tif (!cfg.levels.length) return 'LEVELS_EMPTY';\r\n\tconst keys = new Set<string>();\r\n\tconst lvs = new Set<number>();\r\n\tfor (const l of cfg.levels) {\r\n\t\tif (keys.has(l.key) || lvs.has(l.lv)) return 'LEVELS_DUPLICATE';\r\n\t\tkeys.add(l.key);\r\n\t\tlvs.add(l.lv);\r\n\t}\r\n\tif (!lvs.has(0)) return 'LEVELS_GUEST_REQUIRED';\r\n\tconst { thresholds } = cfg;\r\n\tif (thresholds.logRead > thresholds.adminRead) return 'THRESHOLD_ORDER';\r\n\tif (thresholds.adminRead > thresholds.adminWrite) return 'THRESHOLD_ORDER';\r\n\tfor (const r of cfg.routeRights || []) {\r\n\t\tif (!r.route) return 'ROUTE_INVALID';\r\n\t\tif (!Number.isFinite(r.minLv) || r.minLv < 0) return 'ROUTE_MINLV_INVALID';\r\n\t}\r\n\treturn null;\r\n}\r\n\r\nexport function getUserLevelConfigSync($asai: any): UserLevelConfig {\r\n\treturn ($asai._userLevelConfig as UserLevelConfig) || getDefaultUserLevelConfig($asai);\r\n}\r\n\r\nexport async function loadUserLevelConfig($asai: any): Promise<UserLevelConfig> {\r\n\tconst file = configPath($asai);\r\n\ttry {\r\n\t\tconst text = await fs.readFile(file, 'utf8');\r\n\t\tconst parsed = JSON.parse(text) as Partial<UserLevelConfig>;\r\n\t\tconst cfg = normalizeUserLevelConfig(parsed, $asai);\r\n\t\tconst err = validateUserLevelConfig(cfg);\r\n\t\tif (err) {\r\n\t\t\t$asai._userLevelConfig = getDefaultUserLevelConfig($asai);\r\n\t\t} else {\r\n\t\t\t$asai._userLevelConfig = cfg;\r\n\t\t}\r\n\t} catch {\r\n\t\t$asai._userLevelConfig = getDefaultUserLevelConfig($asai);\r\n\t}\r\n\treturn $asai._userLevelConfig;\r\n}\r\n\r\nexport async function saveUserLevelConfig($asai: any, input: Partial<UserLevelConfig>, updatedBy?: string): Promise<UserLevelConfig> {\r\n\tconst cfg = normalizeUserLevelConfig(input, $asai);\r\n\tconst err = validateUserLevelConfig(cfg);\r\n\tif (err) throw new Error(err);\r\n\tcfg.updatedAt = Date.now();\r\n\tcfg.updatedBy = updatedBy;\r\n\tconst file = configPath($asai);\r\n\tawait fs.mkdir(path.dirname(file), { recursive: true });\r\n\tawait fs.writeFile(file, JSON.stringify(cfg, null, 2), 'utf8');\r\n\t$asai._userLevelConfig = cfg;\r\n\treturn cfg;\r\n}\r\n\r\nexport function getPermissionThreshold($asai: any, key: keyof PermissionThresholds): number {\r\n\treturn getUserLevelConfigSync($asai).thresholds[key];\r\n}\r\n\r\nexport function getLvSteps($asai: any): number[] {\r\n\treturn getUserLevelConfigSync($asai).levels.map((l) => l.lv);\r\n}\r\n\r\nexport function getLevelDef($asai: any, lv: number): UserLevelDef | undefined {\r\n\treturn getUserLevelConfigSync($asai).levels.find((l) => l.lv === lv);\r\n}\r\n\r\nexport function isValidUserLv($asai: any, lv: number): boolean {\r\n\treturn getUserLevelConfigSync($asai).levels.some((l) => l.lv === lv);\r\n}\r\n\r\nexport function getLevelLabel($asai: any, lv: number, lang = 'zh-CN'): string {\r\n\tconst def = getLevelDef($asai, lv);\r\n\tif (!def) return `lv${lv}`;\r\n\tif (lang.startsWith('en') && def.nameEn) return def.nameEn;\r\n\treturn def.name;\r\n}\r\n\r\nexport function toPublicUserLevels($asai: any, lang = 'zh-CN') {\r\n\tconst cfg = getUserLevelConfigSync($asai);\r\n\treturn {\r\n\t\tlevels: cfg.levels.map((l) => ({\r\n\t\t\tlv: l.lv,\r\n\t\t\tkey: l.key,\r\n\t\t\tname: getLevelLabel($asai, l.lv, lang),\r\n\t\t\tnameZh: l.name,\r\n\t\t\tnameEn: l.nameEn || l.name,\r\n\t\t})),\r\n\t\tthresholds: { ...cfg.thresholds },\r\n\t\trouteRights: (cfg.routeRights || getDefaultRouteRights($asai)).map((r) => ({ ...r })),\r\n\t};\r\n}\r\n\r\nexport function getRouteRights($asai: any): RouteRight[] {\r\n\treturn getUserLevelConfigSync($asai).routeRights || getDefaultRouteRights($asai);\r\n}\r\n\r\nexport function findRouteRight($asai: any, hash: string): RouteRight | null {\r\n\tconst routeRights = getRouteRights($asai);\r\n\tconst h = String(hash || '').replace(/^#?\\/?/, '').split('?')[0];\r\n\tif (!h || h === '/') {\r\n\t\treturn routeRights.find((r) => r.route === 'testkdd/testindex') || { route: '/', minLv: 0, public: true };\r\n\t}\r\n\tlet best: RouteRight | null = null;\r\n\tlet bestLen = -1;\r\n\tfor (const r of routeRights) {\r\n\t\tif (h === r.route || h.startsWith(r.route + '/') || h.includes(r.route)) {\r\n\t\t\tif (r.route.length > bestLen) {\r\n\t\t\t\tbest = r;\r\n\t\t\t\tbestLen = r.route.length;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn best;\r\n}\r\n\r\nexport function canAccessRoute($asai: any, hash: string, userLv: number): boolean {\r\n\tconst entry = findRouteRight($asai, hash);\r\n\tif (!entry) {\r\n\t\tconst fallback = Number($asai?.hostconfig?.security?.minUserLevel ?? 0);\r\n\t\treturn userLv >= fallback;\r\n\t}\r\n\tif (entry.public || entry.minLv === 0) return true;\r\n\treturn userLv >= entry.minLv;\r\n}\r\n","/** 默认路由权限(与 configrouter + testkdd 目录对齐) */\r\nexport interface RouteRight {\r\n\troute: string;\r\n\ttitle?: string;\r\n\tminLv: number;\r\n\tpublic?: boolean;\r\n}\r\n\r\nexport const DEFAULT_ROUTE_RIGHTS: RouteRight[] = [\r\n\t{ route: 'testkdd', title: 'testkdd', minLv: 0, public: true },\r\n\t{ route: 'testkdd/testindex', title: '功能总览', minLv: 0, public: true },\r\n\t{ route: 'user/login', title: '用户登录', minLv: 0, public: true },\r\n\t{ route: 'user/reg', title: '用户注册', minLv: 0, public: true },\r\n\t{ route: 'user/exit', title: '退出登录', minLv: 0, public: true },\r\n\t{ route: 'testkdd/testerrorcodes', title: '错误码注册表', minLv: 0, public: true },\r\n\t{ route: 'testkdd/testhealth', title: '健康监控', minLv: 0, public: true },\r\n\t{ route: 'testkdd/testauth', title: '认证实验室', minLv: 0, public: true },\r\n\t{ route: 'testkdd/testasdb', title: 'AsDb 总览', minLv: 0, public: true },\r\n\t{ route: 'testkdd/testasdbfile', title: 'AsDb 文件', minLv: 0, public: true },\r\n\t{ route: 'testkdd/testasdbsqlite', title: 'AsDb SQLite', minLv: 0, public: true },\r\n\t{ route: 'testkdd/testmfc', title: 'AES MFC', minLv: 0, public: true },\r\n\t{ route: 'testkdd/testws', title: 'WebSocket', minLv: 0, public: true },\r\n\t{ route: 'testkdd/testchat', title: 'WS 聊天室', minLv: 0, public: true },\r\n\t{ route: 'testkdd/testascss', title: 'AsCss', minLv: 0, public: true },\r\n\t{ route: 'testkdd/testpopbox', title: '弹窗组件', minLv: 0, public: true },\r\n\t{ route: 'testkdd/testaes', title: 'AES 加解密', minLv: 0, public: true },\r\n\t{ route: 'testkdd/testdirectives', title: 'Vue 指令', minLv: 0, public: true },\r\n\t{ route: 'testkdd/testjsonp', title: 'JSONP', minLv: 0, public: true },\r\n\t{ route: 'testkdd/testlv1', title: '权限演示·操作员', minLv: 3 },\r\n\t{ route: 'testkdd/testlv2', title: '权限演示·管理员', minLv: 7 },\r\n\t{ route: 'testkdd/testlv3', title: '权限演示·开发者', minLv: 9 },\r\n\t{ route: 'testkdd/testlog', title: 'IEC62443 日志', minLv: 3 },\r\n\t{ route: 'user/manage', title: '用户管理', minLv: 7 },\r\n];\r\n\r\n/** configrouter rights.lvN → 默认 minLv 映射 */\r\nexport const LEGACY_RIGHTS_MIN_LV: Record<string, number> = {\r\n\tlv0: 0,\r\n\tlv1: 3,\r\n\tlv2: 7,\r\n\tlv3: 9,\r\n};\r\n\r\nexport function normalizeRouteRight(item: unknown): RouteRight | null {\r\n\tif (!item || typeof item !== 'object') return null;\r\n\tconst route = String((item as any).route || '').trim().replace(/^\\/+|\\/+$/g, '');\r\n\tif (!route) return null;\r\n\tconst minLv = Number((item as any).minLv ?? 0);\r\n\treturn {\r\n\t\troute,\r\n\t\ttitle: (item as any).title ? String((item as any).title).trim().slice(0, 128) : undefined,\r\n\t\tminLv: Number.isFinite(minLv) ? Math.max(0, Math.floor(minLv)) : 0,\r\n\t\tpublic: !!(item as any).public || minLv === 0,\r\n\t};\r\n}\r\n\r\nexport function mergeRouteRights(existing: RouteRight[], incoming: RouteRight[]): RouteRight[] {\r\n\tconst map = new Map<string, RouteRight>();\r\n\tfor (const r of existing) map.set(r.route, { ...r });\r\n\tfor (const r of incoming) {\r\n\t\tconst prev = map.get(r.route);\r\n\t\tmap.set(r.route, prev ? { ...prev, ...r, route: r.route } : r);\r\n\t}\r\n\treturn [...map.values()].sort((a, b) => a.route.localeCompare(b.route));\r\n}\r\n\r\nexport function routesFromLegacyRights(rights: Record<string, string[] | undefined>, titles?: Record<string, string>): RouteRight[] {\r\n\tconst out: RouteRight[] = [];\r\n\tif (!rights || typeof rights !== 'object') return out;\r\n\tfor (const [bucket, routes] of Object.entries(rights)) {\r\n\t\tif (!Array.isArray(routes)) continue;\r\n\t\tconst minLv = LEGACY_RIGHTS_MIN_LV[bucket] ?? 0;\r\n\t\tfor (const route of routes) {\r\n\t\t\tconst r = String(route || '').trim();\r\n\t\t\tif (!r) continue;\r\n\t\t\tout.push({\r\n\t\t\t\troute: r,\r\n\t\t\t\ttitle: titles?.[r],\r\n\t\t\t\tminLv,\r\n\t\t\t\tpublic: minLv === 0,\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\treturn out;\r\n}\r\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,463 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
var _chunkVLMM735Qcjs = require('./chunk-VLMM735Q.cjs');
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
var _chunkW7DVKGX5cjs = require('./chunk-W7DVKGX5.cjs');
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
var _chunkO6LVLSNBcjs = require('./chunk-O6LVLSNB.cjs');
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
var _chunkSMVZ3ZDJcjs = require('./chunk-SMVZ3ZDJ.cjs');
|
|
15
|
+
|
|
16
|
+
// src/sysserver/lib/common/InterventionLog.ts
|
|
17
|
+
var InterventionLog_exports = {};
|
|
18
|
+
_chunkSMVZ3ZDJcjs.__export.call(void 0, InterventionLog_exports, {
|
|
19
|
+
crc32: () => crc32,
|
|
20
|
+
deleteInterventionFile: () => deleteInterventionFile,
|
|
21
|
+
getInterventionTaxonomy: () => getInterventionTaxonomy,
|
|
22
|
+
getRetentionMeta: () => getRetentionMeta,
|
|
23
|
+
listInterventionFiles: () => listInterventionFiles,
|
|
24
|
+
logIntervention: () => logIntervention,
|
|
25
|
+
parseCefLine: () => parseCefLine,
|
|
26
|
+
readInterventionFile: () => readInterventionFile,
|
|
27
|
+
sha256Hex: () => sha256Hex,
|
|
28
|
+
verifyChainForFile: () => verifyChainForFile
|
|
29
|
+
});
|
|
30
|
+
var _promises = require('fs/promises'); var _promises2 = _interopRequireDefault(_promises);
|
|
31
|
+
var _path = require('path'); var _path2 = _interopRequireDefault(_path);
|
|
32
|
+
var _crypto = require('crypto');
|
|
33
|
+
var FILE_NAME_RE = /^intervention-\d{4}-\d{2}-\d{2}\.cef\.log$/;
|
|
34
|
+
var DELETION_AUDIT_FILE = "intervention-deletion-audit.cef.log";
|
|
35
|
+
var SIGNATURE_ID = {
|
|
36
|
+
SAFETY_PARAM: "ASAI.SAFETY.PARAM.001",
|
|
37
|
+
SRESW_UPDATE: "ASAI.SRESW.UPDATE.001",
|
|
38
|
+
SRASW_UPDATE: "ASAI.SRASW.UPDATE.001",
|
|
39
|
+
HMI_PARAM: "ASAI.HMI.PARAM.001",
|
|
40
|
+
SAFETY_DISPLAY_SW: "ASAI.SAFETY.DISPLAY.001",
|
|
41
|
+
LOG_DELETE: "ASAI.AUDIT.LOGDELETE.001",
|
|
42
|
+
PROCESS_GUARD: "ASAI.PROCESS.GUARD.001"
|
|
43
|
+
};
|
|
44
|
+
var DEFAULT_CATEGORY = {
|
|
45
|
+
SAFETY_PARAM: "ConfigurationChanges",
|
|
46
|
+
SRESW_UPDATE: "ConfigurationChanges",
|
|
47
|
+
SRASW_UPDATE: "ConfigurationChanges",
|
|
48
|
+
HMI_PARAM: "ConfigurationChanges",
|
|
49
|
+
SAFETY_DISPLAY_SW: "ConfigurationChanges",
|
|
50
|
+
LOG_DELETE: "AuditLogEvents",
|
|
51
|
+
PROCESS_GUARD: "ControlSystemEvents"
|
|
52
|
+
};
|
|
53
|
+
var DEFAULT_SEVERITY = {
|
|
54
|
+
SAFETY_PARAM: 8,
|
|
55
|
+
SRESW_UPDATE: 9,
|
|
56
|
+
SRASW_UPDATE: 8,
|
|
57
|
+
HMI_PARAM: 7,
|
|
58
|
+
SAFETY_DISPLAY_SW: 8,
|
|
59
|
+
LOG_DELETE: 7,
|
|
60
|
+
PROCESS_GUARD: 9
|
|
61
|
+
};
|
|
62
|
+
var CATEGORY_GUIDE = {
|
|
63
|
+
AccessControl: { min: 7, max: 8, en: "Access Control", zh: "\u8BBF\u95EE\u63A7\u5236", note: "\u767B\u5F55\u5931\u8D25\u3001\u6743\u9650\u63D0\u5347\u3001\u672A\u6388\u6743\u8BBF\u95EE\u5C1D\u8BD5" },
|
|
64
|
+
RequestErrors: { min: 2, max: 4, en: "Request Errors", zh: "\u8BF7\u6C42\u9519\u8BEF", note: "\u534F\u8BAE\u683C\u5F0F\u9519\u8BEF\u3001\u65E0\u6548\u547D\u4EE4\u3001\u901A\u4FE1\u5F02\u5E38" },
|
|
65
|
+
ControlSystemEvents: { min: 8, max: 10, en: "Control System Events", zh: "\u63A7\u5236\u7CFB\u7EDF\u4E8B\u4EF6", note: "\u5B89\u5168\u529F\u80FD\u89E6\u53D1\u3001PLC \u6A21\u5F0F\u5207\u6362\u3001I/O \u5F3A\u5236\u503C" },
|
|
66
|
+
BackupRestore: { min: 6, max: 7, en: "Backup and Restore Events", zh: "\u5907\u4EFD\u4E0E\u6062\u590D", note: "\u6B63\u5E38\u5907\u4EFD\u504F\u4F4E\uFF0C\u6062\u590D\u64CD\u4F5C\u98CE\u9669\u5F88\u9AD8" },
|
|
67
|
+
ConfigurationChanges: { min: 7, max: 9, en: "Configuration Changes", zh: "\u914D\u7F6E\u66F4\u6539", note: "\u5B89\u5168\u53C2\u6570\u3001\u63A7\u5236\u903B\u8F91\u3001\u7F51\u7EDC\u8BBE\u7F6E\u53D8\u66F4" },
|
|
68
|
+
AuditLogEvents: { min: 7, max: 8, en: "Audit Log Events", zh: "\u5BA1\u8BA1\u65E5\u5FD7\u4E8B\u4EF6", note: "\u65E5\u5FD7\u6E05\u9664\u3001\u65E5\u5FD7\u7BE1\u6539\u3001\u65E5\u5FD7\u7CFB\u7EDF\u6545\u969C" }
|
|
69
|
+
};
|
|
70
|
+
function getInterventionDir($asai, ns = "prod") {
|
|
71
|
+
const cfg = _optionalChain([$asai, 'optionalAccess', _ => _.hostconfig, 'optionalAccess', _2 => _2.logger, 'optionalAccess', _3 => _3.intervention]) || {};
|
|
72
|
+
if (ns === "test") return cfg.testPath || "./webdata/webdb/log/intervention-test/";
|
|
73
|
+
return cfg.path || "./webdata/webdb/log/intervention/";
|
|
74
|
+
}
|
|
75
|
+
_chunkSMVZ3ZDJcjs.__name.call(void 0, getInterventionDir, "getInterventionDir");
|
|
76
|
+
function getRetentionYears($asai) {
|
|
77
|
+
const y = _optionalChain([$asai, 'optionalAccess', _4 => _4.hostconfig, 'optionalAccess', _5 => _5.logger, 'optionalAccess', _6 => _6.intervention, 'optionalAccess', _7 => _7.retentionYears]);
|
|
78
|
+
return typeof y === "number" && y > 0 ? y : 5;
|
|
79
|
+
}
|
|
80
|
+
_chunkSMVZ3ZDJcjs.__name.call(void 0, getRetentionYears, "getRetentionYears");
|
|
81
|
+
function escHeader(v) {
|
|
82
|
+
return String(_nullishCoalesce(v, () => ( ""))).replace(/\\/g, "\\\\").replace(/\|/g, "\\|").replace(/[\r\n]+/g, " ");
|
|
83
|
+
}
|
|
84
|
+
_chunkSMVZ3ZDJcjs.__name.call(void 0, escHeader, "escHeader");
|
|
85
|
+
function escExt(v) {
|
|
86
|
+
return String(_nullishCoalesce(v, () => ( ""))).replace(/\\/g, "\\\\").replace(/=/g, "\\=").replace(/[\r\n]+/g, " ");
|
|
87
|
+
}
|
|
88
|
+
_chunkSMVZ3ZDJcjs.__name.call(void 0, escExt, "escExt");
|
|
89
|
+
function sha256Hex(input) {
|
|
90
|
+
return _crypto.createHash.call(void 0, "sha256").update(input, "utf8").digest("hex");
|
|
91
|
+
}
|
|
92
|
+
_chunkSMVZ3ZDJcjs.__name.call(void 0, sha256Hex, "sha256Hex");
|
|
93
|
+
var CRC_TABLE = (() => {
|
|
94
|
+
const table = new Uint32Array(256);
|
|
95
|
+
for (let n = 0; n < 256; n++) {
|
|
96
|
+
let c = n;
|
|
97
|
+
for (let k = 0; k < 8; k++) {
|
|
98
|
+
c = c & 1 ? 3988292384 ^ c >>> 1 : c >>> 1;
|
|
99
|
+
}
|
|
100
|
+
table[n] = c >>> 0;
|
|
101
|
+
}
|
|
102
|
+
return table;
|
|
103
|
+
})();
|
|
104
|
+
function crc32(input) {
|
|
105
|
+
let crc = 4294967295;
|
|
106
|
+
const buf = Buffer.from(input, "utf8");
|
|
107
|
+
for (let i = 0; i < buf.length; i++) {
|
|
108
|
+
crc = CRC_TABLE[(crc ^ buf[i]) & 255] ^ crc >>> 8;
|
|
109
|
+
}
|
|
110
|
+
crc = (crc ^ 4294967295) >>> 0;
|
|
111
|
+
return crc.toString(16).padStart(8, "0");
|
|
112
|
+
}
|
|
113
|
+
_chunkSMVZ3ZDJcjs.__name.call(void 0, crc32, "crc32");
|
|
114
|
+
var cachedStateByDir = /* @__PURE__ */ new Map();
|
|
115
|
+
var bootHandledDirs = /* @__PURE__ */ new Set();
|
|
116
|
+
function statePath($asai, ns) {
|
|
117
|
+
return _path2.default.join(getInterventionDir($asai, ns), ".chain-state.json");
|
|
118
|
+
}
|
|
119
|
+
_chunkSMVZ3ZDJcjs.__name.call(void 0, statePath, "statePath");
|
|
120
|
+
async function loadState($asai, ns) {
|
|
121
|
+
const dir = getInterventionDir($asai, ns);
|
|
122
|
+
const cached = cachedStateByDir.get(dir);
|
|
123
|
+
if (cached) return cached;
|
|
124
|
+
await _promises2.default.mkdir(dir, { recursive: true });
|
|
125
|
+
let state = { lastHash: "GENESIS", runningCounter: 0, bootCounter: 0, fileAnchors: {}, fileTip: {} };
|
|
126
|
+
try {
|
|
127
|
+
const raw = await _promises2.default.readFile(statePath($asai, ns), "utf8");
|
|
128
|
+
const loaded = JSON.parse(raw);
|
|
129
|
+
state = { ...state, ...loaded, fileAnchors: loaded.fileAnchors || {}, fileTip: loaded.fileTip || {} };
|
|
130
|
+
} catch (e2) {
|
|
131
|
+
}
|
|
132
|
+
if (!bootHandledDirs.has(dir)) {
|
|
133
|
+
state.bootCounter += 1;
|
|
134
|
+
bootHandledDirs.add(dir);
|
|
135
|
+
await _promises2.default.writeFile(statePath($asai, ns), JSON.stringify(state), "utf8");
|
|
136
|
+
}
|
|
137
|
+
cachedStateByDir.set(dir, state);
|
|
138
|
+
return state;
|
|
139
|
+
}
|
|
140
|
+
_chunkSMVZ3ZDJcjs.__name.call(void 0, loadState, "loadState");
|
|
141
|
+
async function saveState($asai, ns, state) {
|
|
142
|
+
await _promises2.default.writeFile(statePath($asai, ns), JSON.stringify(state), "utf8");
|
|
143
|
+
cachedStateByDir.set(getInterventionDir($asai, ns), state);
|
|
144
|
+
}
|
|
145
|
+
_chunkSMVZ3ZDJcjs.__name.call(void 0, saveState, "saveState");
|
|
146
|
+
var writeQueueByDir = /* @__PURE__ */ new Map();
|
|
147
|
+
async function doLogIntervention($asai, event, ns) {
|
|
148
|
+
const state = await loadState($asai, ns);
|
|
149
|
+
state.runningCounter += 1;
|
|
150
|
+
const category = event.category || DEFAULT_CATEGORY[event.type];
|
|
151
|
+
const severity = _nullishCoalesce(_nullishCoalesce(event.severity, () => ( DEFAULT_SEVERITY[event.type])), () => ( 7));
|
|
152
|
+
const sigId = SIGNATURE_ID[event.type];
|
|
153
|
+
const nowIso = (/* @__PURE__ */ new Date()).toISOString();
|
|
154
|
+
const ext = [];
|
|
155
|
+
ext.push(`rt=${escExt(nowIso)}`);
|
|
156
|
+
if (event.src) ext.push(`src=${escExt(event.src)}`);
|
|
157
|
+
if (event.dst) ext.push(`dst=${escExt(event.dst)}`);
|
|
158
|
+
ext.push(`proto=${escExt(event.proto || "HTTPS")}`);
|
|
159
|
+
ext.push(`cs1=${escExt(CATEGORY_GUIDE[category].en)}`);
|
|
160
|
+
ext.push("cs1Label=EventCategory");
|
|
161
|
+
ext.push(`cs2=${escExt(event.type)}`);
|
|
162
|
+
ext.push("cs2Label=EventType");
|
|
163
|
+
if (event.identification) {
|
|
164
|
+
ext.push(`cs3=${escExt(event.identification)}`);
|
|
165
|
+
ext.push("cs3Label=Identification");
|
|
166
|
+
}
|
|
167
|
+
ext.push(`cn1=${state.bootCounter}`);
|
|
168
|
+
ext.push("cn1Label=BootCounter");
|
|
169
|
+
ext.push(`cn2=${state.runningCounter}`);
|
|
170
|
+
ext.push("cn2Label=RunningCounter");
|
|
171
|
+
ext.push(`cn3=${Math.round(process.uptime() * 1e3)}`);
|
|
172
|
+
ext.push("cn3Label=UptimeMs");
|
|
173
|
+
if (event.us) ext.push(`suser=${escExt(event.us)}`);
|
|
174
|
+
ext.push(`outcome=${escExt(event.outcome || "Success")}`);
|
|
175
|
+
if (event.detail) ext.push(`msg=${escExt(event.detail)}`);
|
|
176
|
+
if (event.fname) ext.push(`fname=${escExt(event.fname)}`);
|
|
177
|
+
const header = [
|
|
178
|
+
"CEF:0",
|
|
179
|
+
escHeader(_optionalChain([$asai, 'optionalAccess', _8 => _8.hostconfig, 'optionalAccess', _9 => _9.website, 'optionalAccess', _10 => _10.title]) || "AsaiCMS"),
|
|
180
|
+
escHeader("AsaiHost"),
|
|
181
|
+
escHeader(_optionalChain([$asai, 'optionalAccess', _11 => _11.hostconfig, 'optionalAccess', _12 => _12.website, 'optionalAccess', _13 => _13.ver]) || "1.0.0.0"),
|
|
182
|
+
escHeader(sigId),
|
|
183
|
+
escHeader(event.name),
|
|
184
|
+
String(severity)
|
|
185
|
+
].join("|");
|
|
186
|
+
const bodyLine = `${header}|${ext.join(" ")}`;
|
|
187
|
+
const dir = getInterventionDir($asai, ns);
|
|
188
|
+
const fileName = event.type === "LOG_DELETE" ? DELETION_AUDIT_FILE : `intervention-${_chunkO6LVLSNBcjs.getNowTime.call(void 0, 2)}.cef.log`;
|
|
189
|
+
if (!state.fileAnchors[fileName]) {
|
|
190
|
+
state.fileAnchors[fileName] = state.lastHash;
|
|
191
|
+
}
|
|
192
|
+
const prevHashForFile = _nullishCoalesce(state.fileTip[fileName], () => ( state.fileAnchors[fileName]));
|
|
193
|
+
const chainHash = sha256Hex(`${prevHashForFile}|${bodyLine}`);
|
|
194
|
+
const fullLine = `${bodyLine} cs4=${chainHash} cs4Label=ChainHash
|
|
195
|
+
`;
|
|
196
|
+
const filePath = _path2.default.join(dir, fileName);
|
|
197
|
+
await _promises2.default.mkdir(dir, { recursive: true });
|
|
198
|
+
await _promises2.default.appendFile(filePath, fullLine, "utf8");
|
|
199
|
+
state.fileTip[fileName] = chainHash;
|
|
200
|
+
state.lastHash = chainHash;
|
|
201
|
+
await saveState($asai, ns, state);
|
|
202
|
+
void _chunkVLMM735Qcjs.mirrorInterventionLog.call(void 0, $asai, {
|
|
203
|
+
ns,
|
|
204
|
+
fileName,
|
|
205
|
+
event,
|
|
206
|
+
rawLine: fullLine,
|
|
207
|
+
chainHash,
|
|
208
|
+
prevHash: prevHashForFile,
|
|
209
|
+
category,
|
|
210
|
+
severity
|
|
211
|
+
}).catch(() => void 0);
|
|
212
|
+
(_optionalChain([$asai, 'optionalAccess', _14 => _14.$log]) || console.log)("INTERVENTION", `[${ns}]`, event.type, sigId, event.outcome || "Success");
|
|
213
|
+
return { line: fullLine, file: fileName };
|
|
214
|
+
}
|
|
215
|
+
_chunkSMVZ3ZDJcjs.__name.call(void 0, doLogIntervention, "doLogIntervention");
|
|
216
|
+
function logIntervention($asai, event, ns = "prod") {
|
|
217
|
+
const dir = getInterventionDir($asai, ns);
|
|
218
|
+
const prevQueue = writeQueueByDir.get(dir) || Promise.resolve();
|
|
219
|
+
const task = prevQueue.then(() => doLogIntervention($asai, event, ns));
|
|
220
|
+
writeQueueByDir.set(
|
|
221
|
+
dir,
|
|
222
|
+
task.then(
|
|
223
|
+
() => void 0,
|
|
224
|
+
() => void 0
|
|
225
|
+
)
|
|
226
|
+
);
|
|
227
|
+
return task;
|
|
228
|
+
}
|
|
229
|
+
_chunkSMVZ3ZDJcjs.__name.call(void 0, logIntervention, "logIntervention");
|
|
230
|
+
function parseDateFromFileName(fileName) {
|
|
231
|
+
const m = fileName.match(/intervention-(\d{4})-(\d{2})-(\d{2})\.cef\.log$/);
|
|
232
|
+
if (!m) return null;
|
|
233
|
+
return new Date(Number(m[1]), Number(m[2]) - 1, Number(m[3]));
|
|
234
|
+
}
|
|
235
|
+
_chunkSMVZ3ZDJcjs.__name.call(void 0, parseDateFromFileName, "parseDateFromFileName");
|
|
236
|
+
function getRetentionMeta($asai, fileName, ns = "prod") {
|
|
237
|
+
const dir = getInterventionDir($asai, ns);
|
|
238
|
+
const filePath = _path2.default.join(dir, fileName);
|
|
239
|
+
const fileDate = parseDateFromFileName(fileName) || /* @__PURE__ */ new Date(0);
|
|
240
|
+
const ageDays = Math.floor((Date.now() - fileDate.getTime()) / 864e5);
|
|
241
|
+
const retentionYears = getRetentionYears($asai);
|
|
242
|
+
const retentionDays = Math.round(retentionYears * 365.25);
|
|
243
|
+
return { filePath, ageDays, retentionDays, retentionYears, expired: ageDays >= retentionDays };
|
|
244
|
+
}
|
|
245
|
+
_chunkSMVZ3ZDJcjs.__name.call(void 0, getRetentionMeta, "getRetentionMeta");
|
|
246
|
+
async function listInterventionFiles($asai, ns = "prod") {
|
|
247
|
+
const dir = getInterventionDir($asai, ns);
|
|
248
|
+
await _promises2.default.mkdir(dir, { recursive: true });
|
|
249
|
+
const entries = await _promises2.default.readdir(dir, { withFileTypes: true });
|
|
250
|
+
const files = entries.filter((e) => e.isFile() && (FILE_NAME_RE.test(e.name) || e.name === DELETION_AUDIT_FILE));
|
|
251
|
+
const list = await Promise.all(
|
|
252
|
+
files.map(async (e) => {
|
|
253
|
+
const isAuditFile = e.name === DELETION_AUDIT_FILE;
|
|
254
|
+
const filePath = _path2.default.join(dir, e.name);
|
|
255
|
+
const stat = await _promises2.default.stat(filePath);
|
|
256
|
+
const meta = isAuditFile ? { ageDays: 0, retentionDays: 0, retentionYears: getRetentionYears($asai), expired: false } : getRetentionMeta($asai, e.name, ns);
|
|
257
|
+
let entryCount = 0;
|
|
258
|
+
try {
|
|
259
|
+
const content = await _promises2.default.readFile(filePath, "utf8");
|
|
260
|
+
entryCount = content.split("\n").filter((l) => l.trim().startsWith("CEF:")).length;
|
|
261
|
+
} catch (e3) {
|
|
262
|
+
}
|
|
263
|
+
return {
|
|
264
|
+
name: e.name,
|
|
265
|
+
ns,
|
|
266
|
+
size: stat.size,
|
|
267
|
+
mtime: stat.mtime.toISOString(),
|
|
268
|
+
entryCount,
|
|
269
|
+
ageDays: meta.ageDays,
|
|
270
|
+
retentionDays: meta.retentionDays,
|
|
271
|
+
retentionYears: meta.retentionYears,
|
|
272
|
+
expired: meta.expired,
|
|
273
|
+
protectedAudit: isAuditFile
|
|
274
|
+
};
|
|
275
|
+
})
|
|
276
|
+
);
|
|
277
|
+
list.sort((a, b) => a.name < b.name ? 1 : -1);
|
|
278
|
+
return list;
|
|
279
|
+
}
|
|
280
|
+
_chunkSMVZ3ZDJcjs.__name.call(void 0, listInterventionFiles, "listInterventionFiles");
|
|
281
|
+
function splitCefHeader(line) {
|
|
282
|
+
if (!line.startsWith("CEF:")) return null;
|
|
283
|
+
const header = [];
|
|
284
|
+
let cur = "";
|
|
285
|
+
let i = 4;
|
|
286
|
+
let count = 0;
|
|
287
|
+
while (i < line.length && count < 7) {
|
|
288
|
+
const ch = line[i];
|
|
289
|
+
if (ch === "\\" && i + 1 < line.length) {
|
|
290
|
+
cur += line[i + 1];
|
|
291
|
+
i += 2;
|
|
292
|
+
continue;
|
|
293
|
+
}
|
|
294
|
+
if (ch === "|") {
|
|
295
|
+
header.push(cur);
|
|
296
|
+
cur = "";
|
|
297
|
+
count++;
|
|
298
|
+
i++;
|
|
299
|
+
continue;
|
|
300
|
+
}
|
|
301
|
+
cur += ch;
|
|
302
|
+
i++;
|
|
303
|
+
}
|
|
304
|
+
if (count < 7) return null;
|
|
305
|
+
return { header, extensionStr: line.slice(i) };
|
|
306
|
+
}
|
|
307
|
+
_chunkSMVZ3ZDJcjs.__name.call(void 0, splitCefHeader, "splitCefHeader");
|
|
308
|
+
function parseExtension(extStr) {
|
|
309
|
+
const extension = {};
|
|
310
|
+
const re = /([A-Za-z0-9]+)=((?:\\.|[^\\])*?)(?=\s+[A-Za-z0-9]+=|$)/g;
|
|
311
|
+
let m;
|
|
312
|
+
while (m = re.exec(extStr)) {
|
|
313
|
+
extension[m[1]] = m[2].replace(/\\=/g, "=").replace(/\\\\/g, "\\").trim();
|
|
314
|
+
}
|
|
315
|
+
return extension;
|
|
316
|
+
}
|
|
317
|
+
_chunkSMVZ3ZDJcjs.__name.call(void 0, parseExtension, "parseExtension");
|
|
318
|
+
function parseCefLine(line, lineNo = 0) {
|
|
319
|
+
const split = splitCefHeader(line);
|
|
320
|
+
if (!split) return { lineNo, valid: false, raw: line };
|
|
321
|
+
const [cefVersion, vendor, product, version, signatureId, name, severity] = split.header;
|
|
322
|
+
const ext = parseExtension(split.extensionStr);
|
|
323
|
+
return {
|
|
324
|
+
lineNo,
|
|
325
|
+
valid: true,
|
|
326
|
+
raw: line,
|
|
327
|
+
cefVersion,
|
|
328
|
+
vendor,
|
|
329
|
+
product,
|
|
330
|
+
version,
|
|
331
|
+
signatureId,
|
|
332
|
+
name,
|
|
333
|
+
severity: Number(severity),
|
|
334
|
+
category: ext.cs1,
|
|
335
|
+
eventType: ext.cs2,
|
|
336
|
+
identification: ext.cs3,
|
|
337
|
+
bootCounter: ext.cn1,
|
|
338
|
+
runningCounter: ext.cn2,
|
|
339
|
+
uptimeMs: ext.cn3,
|
|
340
|
+
operator: ext.suser,
|
|
341
|
+
outcome: ext.outcome,
|
|
342
|
+
detail: ext.msg,
|
|
343
|
+
timestamp: ext.rt,
|
|
344
|
+
chainHash: ext.cs4
|
|
345
|
+
};
|
|
346
|
+
}
|
|
347
|
+
_chunkSMVZ3ZDJcjs.__name.call(void 0, parseCefLine, "parseCefLine");
|
|
348
|
+
async function verifyChainForFile($asai, fileName, lines, ns = "prod") {
|
|
349
|
+
const state = await loadState($asai, ns);
|
|
350
|
+
let prevHash = _nullishCoalesce(_optionalChain([state, 'access', _15 => _15.fileAnchors, 'optionalAccess', _16 => _16[fileName]]), () => ( "GENESIS"));
|
|
351
|
+
const results = [];
|
|
352
|
+
let lineNo = 0;
|
|
353
|
+
for (const raw of lines) {
|
|
354
|
+
lineNo++;
|
|
355
|
+
if (!raw.trim()) continue;
|
|
356
|
+
const m = raw.match(/\bcs4=([0-9a-f]{64})\b/);
|
|
357
|
+
const found = m ? m[1] : "";
|
|
358
|
+
const bodyLine = raw.replace(/\s+cs4=[0-9a-f]{64}\s+cs4Label=ChainHash\s*$/, "");
|
|
359
|
+
const expected = sha256Hex(`${prevHash}|${bodyLine}`);
|
|
360
|
+
const ok = !!found && found === expected;
|
|
361
|
+
results.push({ line: lineNo, ok, expected, found });
|
|
362
|
+
prevHash = found || expected;
|
|
363
|
+
}
|
|
364
|
+
return { ok: results.every((r) => r.ok), results };
|
|
365
|
+
}
|
|
366
|
+
_chunkSMVZ3ZDJcjs.__name.call(void 0, verifyChainForFile, "verifyChainForFile");
|
|
367
|
+
async function readInterventionFile($asai, fileName, ns = "prod") {
|
|
368
|
+
if (!FILE_NAME_RE.test(fileName) && fileName !== DELETION_AUDIT_FILE) throw new Error("Invalid file name");
|
|
369
|
+
const dir = getInterventionDir($asai, ns);
|
|
370
|
+
const filePath = _path2.default.join(dir, fileName);
|
|
371
|
+
const raw = await _promises2.default.readFile(filePath, "utf8");
|
|
372
|
+
const lines = raw.split("\n").filter((l) => l.trim().length > 0);
|
|
373
|
+
const parsed = lines.map((l, idx) => parseCefLine(l, idx + 1));
|
|
374
|
+
const chain = await verifyChainForFile($asai, fileName, lines, ns);
|
|
375
|
+
if (!chain.ok) {
|
|
376
|
+
const { maybeAlertChainBreak } = await Promise.resolve().then(() => _interopRequireWildcard(require("./log-alert-LAJ6VSAG.cjs")));
|
|
377
|
+
maybeAlertChainBreak($asai, fileName, false, ns);
|
|
378
|
+
}
|
|
379
|
+
const meta = fileName === DELETION_AUDIT_FILE ? { filePath, ageDays: 0, retentionDays: 0, retentionYears: getRetentionYears($asai), expired: false } : getRetentionMeta($asai, fileName, ns);
|
|
380
|
+
return { fileName, raw, parsed, chain, meta };
|
|
381
|
+
}
|
|
382
|
+
_chunkSMVZ3ZDJcjs.__name.call(void 0, readInterventionFile, "readInterventionFile");
|
|
383
|
+
async function deleteInterventionFile($asai, fileName, opt = {}, ns = "prod") {
|
|
384
|
+
if (!FILE_NAME_RE.test(fileName)) throw new Error("Invalid file name");
|
|
385
|
+
const meta = getRetentionMeta($asai, fileName, ns);
|
|
386
|
+
const lv = _nullishCoalesce(opt.lv, () => ( -1));
|
|
387
|
+
let allowed = false;
|
|
388
|
+
let reasonCode = "";
|
|
389
|
+
if (meta.expired) {
|
|
390
|
+
allowed = lv >= 2;
|
|
391
|
+
reasonCode = allowed ? "" : "INSUFFICIENT_LEVEL";
|
|
392
|
+
} else if (!opt.force) {
|
|
393
|
+
reasonCode = "RETENTION_NOT_EXPIRED";
|
|
394
|
+
} else if (lv < 3) {
|
|
395
|
+
reasonCode = "INSUFFICIENT_LEVEL";
|
|
396
|
+
} else if (!opt.reason) {
|
|
397
|
+
reasonCode = "REASON_REQUIRED";
|
|
398
|
+
} else {
|
|
399
|
+
allowed = true;
|
|
400
|
+
}
|
|
401
|
+
await logIntervention(
|
|
402
|
+
$asai,
|
|
403
|
+
{
|
|
404
|
+
type: "LOG_DELETE",
|
|
405
|
+
name: `Delete intervention log file: ${fileName}`,
|
|
406
|
+
us: opt.us || "system",
|
|
407
|
+
outcome: allowed ? "Success" : "Failure",
|
|
408
|
+
identification: fileName,
|
|
409
|
+
severity: allowed ? 7 : 8,
|
|
410
|
+
detail: `${allowed ? "deleted" : "denied"} reason="${opt.reason || ""}" ageDays=${meta.ageDays} retentionDays=${meta.retentionDays} force=${!!opt.force} code=${reasonCode}`
|
|
411
|
+
},
|
|
412
|
+
ns
|
|
413
|
+
);
|
|
414
|
+
if (!allowed) {
|
|
415
|
+
const err = new Error(reasonCode || "DELETE_DENIED");
|
|
416
|
+
throw err;
|
|
417
|
+
}
|
|
418
|
+
await _promises2.default.unlink(meta.filePath);
|
|
419
|
+
void _chunkVLMM735Qcjs.purgeSqliteEntriesForFile.call(void 0, $asai, fileName, ns).catch(() => void 0);
|
|
420
|
+
const state = await loadState($asai, ns);
|
|
421
|
+
delete state.fileAnchors[fileName];
|
|
422
|
+
delete state.fileTip[fileName];
|
|
423
|
+
await saveState($asai, ns, state);
|
|
424
|
+
return { deleted: true, fileName };
|
|
425
|
+
}
|
|
426
|
+
_chunkSMVZ3ZDJcjs.__name.call(void 0, deleteInterventionFile, "deleteInterventionFile");
|
|
427
|
+
function getInterventionTaxonomy($asai) {
|
|
428
|
+
return {
|
|
429
|
+
formats: _chunkW7DVKGX5cjs.getLogFormatTaxonomy.call(void 0, $asai).formats,
|
|
430
|
+
types: Object.keys(SIGNATURE_ID).map((type) => ({
|
|
431
|
+
type,
|
|
432
|
+
signatureId: SIGNATURE_ID[type],
|
|
433
|
+
category: DEFAULT_CATEGORY[type],
|
|
434
|
+
defaultSeverity: DEFAULT_SEVERITY[type]
|
|
435
|
+
})),
|
|
436
|
+
categories: Object.keys(CATEGORY_GUIDE).map((key) => ({
|
|
437
|
+
key,
|
|
438
|
+
...CATEGORY_GUIDE[key]
|
|
439
|
+
})),
|
|
440
|
+
retentionYears: 5,
|
|
441
|
+
exceptions: [
|
|
442
|
+
"\u672A\u6539\u53D8\u5B89\u5168\u53C2\u6570/\u914D\u7F6E/\u8F6F\u4EF6/HMI \u5371\u9669\u53C2\u6570/\u5B89\u5168\u6307\u4EE4\u663E\u793A\u8F6F\u4EF6\u7684\u5E72\u9884\u65E0\u9700\u8BB0\u5F55\uFF08\u5982\u5E38\u89C4\u9274\u6743\u6210\u529F/\u5931\u8D25\uFF09",
|
|
443
|
+
"\u89E6\u53D1\u673A\u5668\u5B89\u5168\u72B6\u6001\u7684\u52A8\u4F5C\uFF08\u5982\u5B89\u5168\u5149\u5E55\u5F00\u542F\uFF09\u4E0D\u5728\u8BB0\u5F55\u8303\u56F4\u5185",
|
|
444
|
+
"\u65E0\u9700\u5728\u65E5\u5FD7\u4E2D\u5B58\u50A8 SRASW/SRESW \u4E8C\u8FDB\u5236\u6587\u4EF6\u7684\u771F\u5B9E\u7248\u672C\u53F7\uFF0C\u4F7F\u7528 CRC/\u54C8\u5E0C\u7B49\u6807\u8BC6\u624B\u6BB5\u5373\u53EF"
|
|
445
|
+
]
|
|
446
|
+
};
|
|
447
|
+
}
|
|
448
|
+
_chunkSMVZ3ZDJcjs.__name.call(void 0, getInterventionTaxonomy, "getInterventionTaxonomy");
|
|
449
|
+
|
|
450
|
+
|
|
451
|
+
|
|
452
|
+
|
|
453
|
+
|
|
454
|
+
|
|
455
|
+
|
|
456
|
+
|
|
457
|
+
|
|
458
|
+
|
|
459
|
+
|
|
460
|
+
|
|
461
|
+
|
|
462
|
+
exports.sha256Hex = sha256Hex; exports.crc32 = crc32; exports.logIntervention = logIntervention; exports.getRetentionMeta = getRetentionMeta; exports.listInterventionFiles = listInterventionFiles; exports.parseCefLine = parseCefLine; exports.verifyChainForFile = verifyChainForFile; exports.readInterventionFile = readInterventionFile; exports.deleteInterventionFile = deleteInterventionFile; exports.getInterventionTaxonomy = getInterventionTaxonomy; exports.InterventionLog_exports = InterventionLog_exports;
|
|
463
|
+
//# sourceMappingURL=chunk-G4WVDUBH.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["d:\\Web\\Git\\asaicms-v1\\webserver\\src\\plugs\\asaihost-nodejs\\dist\\chunk-G4WVDUBH.cjs"],"names":[],"mappings":"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AA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"D:\\Web\\Git\\asaicms-v1\\webserver\\src\\plugs\\asaihost-nodejs\\dist\\chunk-G4WVDUBH.cjs","sourcesContent":[null]}
|