@fgbg/mdocs 0.6.9 → 0.7.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/dist/server/db/repositories/visitor.repo.js +27 -2
- package/dist/server/db/repositories/visitor.repo.js.map +1 -1
- package/dist/server/db/schema.js +41 -0
- package/dist/server/db/schema.js.map +1 -1
- package/dist/server/identity/auth.middleware.js +1 -0
- package/dist/server/identity/auth.middleware.js.map +1 -1
- package/dist/server/identity/token.js +35 -1
- package/dist/server/identity/token.js.map +1 -1
- package/dist/server/identity/visitor.service.js +142 -12
- package/dist/server/identity/visitor.service.js.map +1 -1
- package/dist/server/routes/visitors.routes.js +66 -2
- package/dist/server/routes/visitors.routes.js.map +1 -1
- package/dist/web/assets/{_baseUniq-yckB-ViZ.js → _baseUniq-BZQDllec.js} +1 -1
- package/dist/web/assets/{arc-CJwjVGoV.js → arc-Cb69uDK1.js} +1 -1
- package/dist/web/assets/{architectureDiagram-Q4EWVU46-DlMBMvAp.js → architectureDiagram-Q4EWVU46-B4QPjlfl.js} +1 -1
- package/dist/web/assets/{blockDiagram-DXYQGD6D-DVth0PQT.js → blockDiagram-DXYQGD6D-DVphvRlV.js} +1 -1
- package/dist/web/assets/{c4Diagram-AHTNJAMY-BdAFJmuu.js → c4Diagram-AHTNJAMY-Cwlrn4tO.js} +1 -1
- package/dist/web/assets/channel-8-u9LChi.js +1 -0
- package/dist/web/assets/{chunk-4BX2VUAB-D2WGPo8y.js → chunk-4BX2VUAB-CUSc3ljZ.js} +1 -1
- package/dist/web/assets/{chunk-4TB4RGXK-Dkm9SzW7.js → chunk-4TB4RGXK-B9ynmkmz.js} +1 -1
- package/dist/web/assets/{chunk-55IACEB6-CWRBXcO3.js → chunk-55IACEB6-Cf_JSRxt.js} +1 -1
- package/dist/web/assets/{chunk-EDXVE4YY-BeEIhuUz.js → chunk-EDXVE4YY-YsSIMNW8.js} +1 -1
- package/dist/web/assets/{chunk-FMBD7UC4-XjAYeYWx.js → chunk-FMBD7UC4-CujGcG-3.js} +1 -1
- package/dist/web/assets/{chunk-OYMX7WX6-wo32eaJZ.js → chunk-OYMX7WX6-Bi5NfGux.js} +1 -1
- package/dist/web/assets/{chunk-QZHKN3VN-DV3RIS0h.js → chunk-QZHKN3VN-Nyt4EJI9.js} +1 -1
- package/dist/web/assets/{chunk-YZCP3GAM-CAEsOeC5.js → chunk-YZCP3GAM-B9o9RZrm.js} +1 -1
- package/dist/web/assets/classDiagram-6PBFFD2Q-DDyL10hW.js +1 -0
- package/dist/web/assets/classDiagram-v2-HSJHXN6E-DDyL10hW.js +1 -0
- package/dist/web/assets/clone-D3pxX9P9.js +1 -0
- package/dist/web/assets/{cose-bilkent-S5V4N54A-BEnyUbob.js → cose-bilkent-S5V4N54A-DttL4aNQ.js} +1 -1
- package/dist/web/assets/{dagre-KV5264BT-CGLj5knE.js → dagre-KV5264BT-BWYitZN5.js} +1 -1
- package/dist/web/assets/{diagram-5BDNPKRD-DtEoi6Lq.js → diagram-5BDNPKRD-CahquxPs.js} +1 -1
- package/dist/web/assets/{diagram-G4DWMVQ6-CSFCJ5Ck.js → diagram-G4DWMVQ6-B9KPD5SO.js} +1 -1
- package/dist/web/assets/{diagram-MMDJMWI5-DyrHWWHa.js → diagram-MMDJMWI5-CkcyKpqM.js} +1 -1
- package/dist/web/assets/{diagram-TYMM5635-gXsHWhnh.js → diagram-TYMM5635-C8o8Veq7.js} +1 -1
- package/dist/web/assets/{erDiagram-SMLLAGMA-Duh2wkjY.js → erDiagram-SMLLAGMA-CajMg_FK.js} +1 -1
- package/dist/web/assets/{flowDiagram-DWJPFMVM-BpghiWrT.js → flowDiagram-DWJPFMVM-mZwzFrXQ.js} +1 -1
- package/dist/web/assets/{ganttDiagram-T4ZO3ILL-xFaumTzU.js → ganttDiagram-T4ZO3ILL-BMELKTGk.js} +1 -1
- package/dist/web/assets/{gitGraphDiagram-UUTBAWPF-DH9vrbnF.js → gitGraphDiagram-UUTBAWPF-DHU6t5jv.js} +1 -1
- package/dist/web/assets/{graph-BsXke1vy.js → graph-D5BLcSs1.js} +1 -1
- package/dist/web/assets/{index-B7iWkIDo.js → index-DHy98Bfe.js} +26 -26
- package/dist/web/assets/{infoDiagram-42DDH7IO-gti5sPUy.js → infoDiagram-42DDH7IO-DQRI0VEQ.js} +1 -1
- package/dist/web/assets/{ishikawaDiagram-UXIWVN3A-Byy0uqCU.js → ishikawaDiagram-UXIWVN3A-WCMNWmcy.js} +1 -1
- package/dist/web/assets/{journeyDiagram-VCZTEJTY-CDG9dpf7.js → journeyDiagram-VCZTEJTY-DX__y_WK.js} +1 -1
- package/dist/web/assets/{kanban-definition-6JOO6SKY-i6VYcLX1.js → kanban-definition-6JOO6SKY-BU6AzWp5.js} +1 -1
- package/dist/web/assets/{layout-CTRuaRi5.js → layout-Bpj9IvYV.js} +1 -1
- package/dist/web/assets/{linear-CMNKgdX1.js → linear-CNt_cMab.js} +1 -1
- package/dist/web/assets/{min-C8iLS74o.js → min-DGPRYtJA.js} +1 -1
- package/dist/web/assets/{mindmap-definition-QFDTVHPH-CQNffGM_.js → mindmap-definition-QFDTVHPH-U7lp8ucC.js} +1 -1
- package/dist/web/assets/{pieDiagram-DEJITSTG-a4Agzb4W.js → pieDiagram-DEJITSTG-CAWH8R5H.js} +1 -1
- package/dist/web/assets/{quadrantDiagram-34T5L4WZ-Dnq4Jgik.js → quadrantDiagram-34T5L4WZ-B85fptrq.js} +1 -1
- package/dist/web/assets/{requirementDiagram-MS252O5E-D9QGhQ6Y.js → requirementDiagram-MS252O5E-C8knABGA.js} +1 -1
- package/dist/web/assets/{sankeyDiagram-XADWPNL6-Bzjp01vV.js → sankeyDiagram-XADWPNL6-DHsF-NRn.js} +1 -1
- package/dist/web/assets/{sequenceDiagram-FGHM5R23-BBYpSBxH.js → sequenceDiagram-FGHM5R23-GwCwkHcC.js} +1 -1
- package/dist/web/assets/{stateDiagram-FHFEXIEX-DjA-cvxv.js → stateDiagram-FHFEXIEX-Dtk4nfpI.js} +1 -1
- package/dist/web/assets/stateDiagram-v2-QKLJ7IA2-CQ-e8psG.js +1 -0
- package/dist/web/assets/{timeline-definition-GMOUNBTQ-jnGXLdiw.js → timeline-definition-GMOUNBTQ-D5VcNnfb.js} +1 -1
- package/dist/web/assets/{vennDiagram-DHZGUBPP-BsgnNZ25.js → vennDiagram-DHZGUBPP-BggCNJJw.js} +1 -1
- package/dist/web/assets/wardley-RL74JXVD-DQ91D9QE.js +162 -0
- package/dist/web/assets/{wardleyDiagram-NUSXRM2D-B-3XLKsQ.js → wardleyDiagram-NUSXRM2D-Cn9jHzah.js} +1 -1
- package/dist/web/assets/{xychartDiagram-5P7HB3ND-B2rsZh2u.js → xychartDiagram-5P7HB3ND-Cbj6xy-p.js} +1 -1
- package/dist/web/index.html +1 -1
- package/package.json +1 -1
- package/dist/web/assets/channel-CwgGjhIw.js +0 -1
- package/dist/web/assets/classDiagram-6PBFFD2Q-CPcT8Wwv.js +0 -1
- package/dist/web/assets/classDiagram-v2-HSJHXN6E-CPcT8Wwv.js +0 -1
- package/dist/web/assets/clone-B_WisCme.js +0 -1
- package/dist/web/assets/stateDiagram-v2-QKLJ7IA2-DLOvogHK.js +0 -1
- package/dist/web/assets/wardley-RL74JXVD-Dpdecs9N.js +0 -162
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export function insertVisitor(db, input) {
|
|
5
5
|
db.prepare(`INSERT INTO visitors (
|
|
6
|
-
visitor_id, visitor_name, visitor_token_hash, recovery_code_hash, created_at
|
|
7
|
-
) VALUES (?, ?, ?, ?, ?)`).run(input.visitorId, input.visitorName, input.visitorTokenHash, input.recoveryCodeHash ?? null, input.createdAt);
|
|
6
|
+
visitor_id, visitor_name, visitor_token_hash, recovery_code_hash, password_hash, created_at
|
|
7
|
+
) VALUES (?, ?, ?, ?, ?, ?)`).run(input.visitorId, input.visitorName, input.visitorTokenHash, input.recoveryCodeHash ?? null, input.passwordHash ?? null, input.createdAt);
|
|
8
8
|
}
|
|
9
9
|
/**
|
|
10
10
|
* 根据 token 哈希查找访客。
|
|
@@ -81,4 +81,29 @@ export function listActiveVisitorsDirectory(db) {
|
|
|
81
81
|
ORDER BY visitor_name COLLATE NOCASE`)
|
|
82
82
|
.all();
|
|
83
83
|
}
|
|
84
|
+
export function insertSession(db, input) {
|
|
85
|
+
db.prepare(`INSERT INTO visitor_sessions (
|
|
86
|
+
session_id, visitor_id, token_hash, device_name, created_at, last_seen_at
|
|
87
|
+
) VALUES (?, ?, ?, ?, ?, ?)`).run(input.sessionId, input.visitorId, input.tokenHash, input.deviceName ?? null, input.createdAt, input.lastSeenAt);
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* 根据 token 哈希查找会话,并关联访客信息。
|
|
91
|
+
* 只返回未禁用访客的会话。
|
|
92
|
+
*/
|
|
93
|
+
export function findSessionByTokenHash(db, tokenHash) {
|
|
94
|
+
return db
|
|
95
|
+
.prepare(`SELECT vs.*, v.*
|
|
96
|
+
FROM visitor_sessions vs
|
|
97
|
+
JOIN visitors v ON vs.visitor_id = v.visitor_id
|
|
98
|
+
WHERE vs.token_hash = ? AND v.disabled_at IS NULL`)
|
|
99
|
+
.get(tokenHash);
|
|
100
|
+
}
|
|
101
|
+
/** 更新指定会话的 last_seen_at 字段。 */
|
|
102
|
+
export function updateSessionLastSeen(db, sessionId, at) {
|
|
103
|
+
db.prepare(`UPDATE visitor_sessions SET last_seen_at = ? WHERE session_id = ?`).run(at, sessionId);
|
|
104
|
+
}
|
|
105
|
+
/** 删除指定会话(退出登录)。 */
|
|
106
|
+
export function deleteSession(db, sessionId) {
|
|
107
|
+
db.prepare(`DELETE FROM visitor_sessions WHERE session_id = ?`).run(sessionId);
|
|
108
|
+
}
|
|
84
109
|
//# sourceMappingURL=visitor.repo.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"visitor.repo.js","sourceRoot":"","sources":["../../../../src/server/db/repositories/visitor.repo.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"visitor.repo.js","sourceRoot":"","sources":["../../../../src/server/db/repositories/visitor.repo.ts"],"names":[],"mappings":"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"}
|
package/dist/server/db/schema.js
CHANGED
|
@@ -10,6 +10,17 @@ const SCHEMA_STATEMENTS = [
|
|
|
10
10
|
merged_into_visitor_id TEXT
|
|
11
11
|
)`,
|
|
12
12
|
`CREATE INDEX IF NOT EXISTS idx_visitors_token_hash ON visitors (visitor_token_hash)`,
|
|
13
|
+
`CREATE TABLE IF NOT EXISTS visitor_sessions (
|
|
14
|
+
session_id TEXT PRIMARY KEY,
|
|
15
|
+
visitor_id TEXT NOT NULL,
|
|
16
|
+
token_hash TEXT NOT NULL UNIQUE,
|
|
17
|
+
device_name TEXT,
|
|
18
|
+
created_at TEXT NOT NULL,
|
|
19
|
+
last_seen_at TEXT NOT NULL,
|
|
20
|
+
FOREIGN KEY (visitor_id) REFERENCES visitors(visitor_id) ON DELETE CASCADE
|
|
21
|
+
)`,
|
|
22
|
+
`CREATE INDEX IF NOT EXISTS idx_visitor_sessions_visitor ON visitor_sessions (visitor_id)`,
|
|
23
|
+
`CREATE INDEX IF NOT EXISTS idx_visitor_sessions_token_hash ON visitor_sessions (token_hash)`,
|
|
13
24
|
`CREATE TABLE IF NOT EXISTS domains (
|
|
14
25
|
domain_id TEXT PRIMARY KEY,
|
|
15
26
|
domain_name TEXT NOT NULL UNIQUE,
|
|
@@ -151,6 +162,8 @@ export function applySchema(db) {
|
|
|
151
162
|
migrateDocumentsTable(db);
|
|
152
163
|
migrateDocumentsDirty(db);
|
|
153
164
|
migrateVisitorsRecoveryCode(db);
|
|
165
|
+
migrateVisitorsPasswordHash(db);
|
|
166
|
+
migrateVisitorSessions(db);
|
|
154
167
|
ensureDefaultDomain(db);
|
|
155
168
|
});
|
|
156
169
|
tx();
|
|
@@ -283,4 +296,32 @@ function visitorColumnNames(db) {
|
|
|
283
296
|
const rows = db.prepare(`PRAGMA table_info(visitors)`).all();
|
|
284
297
|
return new Set(rows.map((r) => r.name));
|
|
285
298
|
}
|
|
299
|
+
/** 为 visitors 表添加 password_hash 列(若不存在)。 */
|
|
300
|
+
function migrateVisitorsPasswordHash(db) {
|
|
301
|
+
const names = visitorColumnNames(db);
|
|
302
|
+
if (names.has("password_hash"))
|
|
303
|
+
return;
|
|
304
|
+
db.exec(`ALTER TABLE visitors ADD COLUMN password_hash TEXT`);
|
|
305
|
+
}
|
|
306
|
+
/** 将 visitors 表的 token 迁移到 visitor_sessions 表(向后兼容)。 */
|
|
307
|
+
function migrateVisitorSessions(db) {
|
|
308
|
+
// 检查是否已经迁移过(有 session 记录说明迁过了)
|
|
309
|
+
const hasSessions = db.prepare(`SELECT 1 AS c FROM visitor_sessions LIMIT 1`).get();
|
|
310
|
+
if (hasSessions)
|
|
311
|
+
return;
|
|
312
|
+
// 把所有现有 visitor 的 token 迁移到 visitor_sessions 表(作为初始 session)
|
|
313
|
+
const stmt = db.prepare(`
|
|
314
|
+
INSERT INTO visitor_sessions (session_id, visitor_id, token_hash, device_name, created_at, last_seen_at)
|
|
315
|
+
SELECT
|
|
316
|
+
'legacy_' || visitor_id,
|
|
317
|
+
visitor_id,
|
|
318
|
+
visitor_token_hash,
|
|
319
|
+
'Legacy Device',
|
|
320
|
+
created_at,
|
|
321
|
+
COALESCE(last_seen_at, created_at)
|
|
322
|
+
FROM visitors
|
|
323
|
+
WHERE visitor_token_hash IS NOT NULL
|
|
324
|
+
`);
|
|
325
|
+
stmt.run();
|
|
326
|
+
}
|
|
286
327
|
//# sourceMappingURL=schema.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/server/db/schema.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/server/db/schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.middleware.js","sourceRoot":"","sources":["../../../src/server/identity/auth.middleware.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"auth.middleware.js","sourceRoot":"","sources":["../../../src/server/identity/auth.middleware.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { createHash, randomBytes, randomUUID } from "node:crypto";
|
|
1
|
+
import { createHash, randomBytes, randomUUID, scryptSync, timingSafeEqual } from "node:crypto";
|
|
2
2
|
/**
|
|
3
3
|
* 生成一个新的访客唯一标识符(UUID v4)。
|
|
4
4
|
*
|
|
@@ -7,6 +7,14 @@ import { createHash, randomBytes, randomUUID } from "node:crypto";
|
|
|
7
7
|
export function newVisitorId() {
|
|
8
8
|
return randomUUID();
|
|
9
9
|
}
|
|
10
|
+
/**
|
|
11
|
+
* 生成一个新的会话唯一标识符(UUID v4)。
|
|
12
|
+
*
|
|
13
|
+
* @returns 会话 ID 字符串
|
|
14
|
+
*/
|
|
15
|
+
export function newSessionId() {
|
|
16
|
+
return randomUUID();
|
|
17
|
+
}
|
|
10
18
|
/**
|
|
11
19
|
* 生成一个新的访客原始令牌。
|
|
12
20
|
* 使用 32 字节随机数并通过 base64url 编码,保证 URL 安全且长度适中。
|
|
@@ -55,4 +63,30 @@ export function newRecoveryCode() {
|
|
|
55
63
|
export function hashRecoveryCode(code) {
|
|
56
64
|
return createHash("sha256").update(code.toUpperCase(), "utf8").digest("hex");
|
|
57
65
|
}
|
|
66
|
+
const PASSWORD_SALT = "mdocs-password-salt-v1";
|
|
67
|
+
const PASSWORD_KEYLEN = 32;
|
|
68
|
+
/**
|
|
69
|
+
* 对密码进行 scrypt 哈希,用于安全存储。
|
|
70
|
+
*
|
|
71
|
+
* @param password - 明文密码
|
|
72
|
+
* @returns scrypt 哈希的十六进制字符串
|
|
73
|
+
*/
|
|
74
|
+
export function hashPassword(password) {
|
|
75
|
+
return scryptSync(password, PASSWORD_SALT, PASSWORD_KEYLEN).toString("hex");
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* 验证密码是否匹配哈希值。
|
|
79
|
+
* 使用 timingSafeEqual 防止计时攻击。
|
|
80
|
+
*
|
|
81
|
+
* @param password - 明文密码
|
|
82
|
+
* @param hash - 存储的哈希值
|
|
83
|
+
* @returns 匹配返回 true,否则返回 false
|
|
84
|
+
*/
|
|
85
|
+
export function verifyPassword(password, hash) {
|
|
86
|
+
const derivedKey = scryptSync(password, PASSWORD_SALT, PASSWORD_KEYLEN);
|
|
87
|
+
const storedKey = Buffer.from(hash, "hex");
|
|
88
|
+
if (derivedKey.length !== storedKey.length)
|
|
89
|
+
return false;
|
|
90
|
+
return timingSafeEqual(derivedKey, storedKey);
|
|
91
|
+
}
|
|
58
92
|
//# sourceMappingURL=token.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token.js","sourceRoot":"","sources":["../../../src/server/identity/token.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"token.js","sourceRoot":"","sources":["../../../src/server/identity/token.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE/F;;;;GAIG;AACH,MAAM,UAAU,YAAY;IAC1B,OAAO,UAAU,EAAE,CAAC;AACtB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY;IAC1B,OAAO,UAAU,EAAE,CAAC;AACtB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe;IAC7B,OAAO,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AAC/C,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAAC,QAAgB;IAC/C,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACrE,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,eAAe;IAC7B,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,KAAK,GAAG,kCAAkC,CAAC,CAAC,iBAAiB;IACnE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,IAAI,KAAK,GAAG,EAAE,CAAC;QACf,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3B,KAAK,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;QAC3D,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC1B,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC/E,CAAC;AAED,MAAM,aAAa,GAAG,wBAAwB,CAAC;AAC/C,MAAM,eAAe,GAAG,EAAE,CAAC;AAE3B;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,QAAgB;IAC3C,OAAO,UAAU,CAAC,QAAQ,EAAE,aAAa,EAAE,eAAe,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,cAAc,CAAC,QAAgB,EAAE,IAAY;IAC3D,MAAM,UAAU,GAAG,UAAU,CAAC,QAAQ,EAAE,aAAa,EAAE,eAAe,CAAC,CAAC;IACxE,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC3C,IAAI,UAAU,CAAC,MAAM,KAAK,SAAS,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IACzD,OAAO,eAAe,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;AAChD,CAAC"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { getDb } from "../db/connection.js";
|
|
2
|
-
import { findVisitorById, findVisitorByRecoveryCodeHash, findVisitorByTokenHash, insertVisitor, listVisitors, updateRecoveryCodeHash, updateVisitorLastSeen, } from "../db/repositories/visitor.repo.js";
|
|
2
|
+
import { findVisitorById, findVisitorByName, findVisitorByRecoveryCodeHash, findVisitorByTokenHash, findSessionByTokenHash, insertVisitor, insertSession, listVisitors, updateRecoveryCodeHash, updateSessionLastSeen, updateVisitorLastSeen, } from "../db/repositories/visitor.repo.js";
|
|
3
3
|
import { insertAuditLog } from "../db/repositories/audit.repo.js";
|
|
4
4
|
import { ensurePersonalDomain } from "../domains/personal-domain.service.js";
|
|
5
|
-
import { hashRecoveryCode, hashVisitorToken, newRecoveryCode, newVisitorId, newVisitorToken, } from "./token.js";
|
|
5
|
+
import { hashPassword, hashRecoveryCode, hashVisitorToken, newRecoveryCode, newSessionId, newVisitorId, newVisitorToken, verifyPassword, } from "./token.js";
|
|
6
6
|
import { useLogger } from "../logger/logger.js";
|
|
7
7
|
const log = useLogger("identity");
|
|
8
8
|
/**
|
|
@@ -10,9 +10,10 @@ const log = useLogger("identity");
|
|
|
10
10
|
* 校验名称合法性后,生成访客 ID 与令牌,在数据库中创建记录并为其建立个人域。
|
|
11
11
|
*
|
|
12
12
|
* @param visitorName - 访客名称
|
|
13
|
+
* @param password - 可选密码(留空则不设置密码保护)
|
|
13
14
|
* @returns 包含访客公开信息与原始令牌的注册结果
|
|
14
15
|
*/
|
|
15
|
-
export function registerVisitor(visitorName) {
|
|
16
|
+
export function registerVisitor(visitorName, password) {
|
|
16
17
|
const trimmed = visitorName.trim();
|
|
17
18
|
// 校验名称非空
|
|
18
19
|
if (!trimmed) {
|
|
@@ -22,6 +23,9 @@ export function registerVisitor(visitorName) {
|
|
|
22
23
|
if (trimmed.length > 60) {
|
|
23
24
|
throw new VisitorValidationError("visitor name is too long");
|
|
24
25
|
}
|
|
26
|
+
if (password && password.length < 4) {
|
|
27
|
+
throw new VisitorValidationError("password must be at least 4 characters");
|
|
28
|
+
}
|
|
25
29
|
const db = getDb();
|
|
26
30
|
// 检查名称是否已被占用(仅检查未被禁用的访客)
|
|
27
31
|
const existingByName = db
|
|
@@ -36,15 +40,26 @@ export function registerVisitor(visitorName) {
|
|
|
36
40
|
const tokenHash = hashVisitorToken(rawToken);
|
|
37
41
|
const recoveryCode = newRecoveryCode();
|
|
38
42
|
const recoveryCodeHash = hashRecoveryCode(recoveryCode);
|
|
43
|
+
const passwordHash = password ? hashPassword(password) : undefined;
|
|
39
44
|
const createdAt = new Date().toISOString();
|
|
40
|
-
//
|
|
45
|
+
// 在事务中插入访客记录(含恢复码哈希和密码哈希)、创建会话、创建个人域并记录审计日志
|
|
41
46
|
const tx = db.transaction(() => {
|
|
42
47
|
insertVisitor(db, {
|
|
43
48
|
visitorId,
|
|
44
49
|
visitorName: trimmed,
|
|
45
50
|
visitorTokenHash: tokenHash,
|
|
46
51
|
recoveryCodeHash,
|
|
52
|
+
passwordHash,
|
|
53
|
+
createdAt,
|
|
54
|
+
});
|
|
55
|
+
// 同时创建会话记录(新架构)
|
|
56
|
+
insertSession(db, {
|
|
57
|
+
sessionId: newSessionId(),
|
|
58
|
+
visitorId,
|
|
59
|
+
tokenHash,
|
|
60
|
+
deviceName: "New Device",
|
|
47
61
|
createdAt,
|
|
62
|
+
lastSeenAt: createdAt,
|
|
48
63
|
});
|
|
49
64
|
ensurePersonalDomain(db, visitorId, trimmed);
|
|
50
65
|
insertAuditLog(db, {
|
|
@@ -64,6 +79,7 @@ export function registerVisitor(visitorName) {
|
|
|
64
79
|
visitor_name: trimmed,
|
|
65
80
|
visitor_token_hash: tokenHash,
|
|
66
81
|
recovery_code_hash: recoveryCodeHash,
|
|
82
|
+
password_hash: passwordHash ?? null,
|
|
67
83
|
created_at: createdAt,
|
|
68
84
|
last_seen_at: null,
|
|
69
85
|
disabled_at: null,
|
|
@@ -75,7 +91,7 @@ export function registerVisitor(visitorName) {
|
|
|
75
91
|
}
|
|
76
92
|
/**
|
|
77
93
|
* 根据原始访客令牌解析对应的访客记录,并更新最后访问时间。
|
|
78
|
-
*
|
|
94
|
+
* 优先查 session 表(新架构),找不到再查 visitors 表的旧 token(向后兼容)。
|
|
79
95
|
*
|
|
80
96
|
* @param rawToken - 原始访客令牌
|
|
81
97
|
* @returns 访客数据库记录,解析失败时返回 null
|
|
@@ -83,14 +99,41 @@ export function registerVisitor(visitorName) {
|
|
|
83
99
|
export function resolveVisitorByToken(rawToken) {
|
|
84
100
|
const tokenHash = hashVisitorToken(rawToken);
|
|
85
101
|
const db = getDb();
|
|
102
|
+
// 优先查 session 表
|
|
103
|
+
const session = findSessionByTokenHash(db, tokenHash);
|
|
104
|
+
if (session) {
|
|
105
|
+
// 更新 session 最后活跃时间
|
|
106
|
+
updateSessionLastSeen(db, session.session_id, new Date().toISOString());
|
|
107
|
+
return {
|
|
108
|
+
visitor_id: session.visitor_id,
|
|
109
|
+
visitor_name: session.visitor_name,
|
|
110
|
+
visitor_token_hash: session.visitor_token_hash,
|
|
111
|
+
recovery_code_hash: session.recovery_code_hash,
|
|
112
|
+
password_hash: session.password_hash,
|
|
113
|
+
created_at: session.created_at,
|
|
114
|
+
last_seen_at: session.last_seen_at,
|
|
115
|
+
disabled_at: session.disabled_at,
|
|
116
|
+
merged_into_visitor_id: session.merged_into_visitor_id,
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
// 向后兼容:查旧的 visitors.visitor_token_hash
|
|
86
120
|
const row = findVisitorByTokenHash(db, tokenHash);
|
|
87
|
-
// 未找到记录或访客已禁用均视为无效
|
|
88
121
|
if (!row)
|
|
89
122
|
return null;
|
|
90
123
|
if (row.disabled_at)
|
|
91
124
|
return null;
|
|
92
|
-
//
|
|
93
|
-
|
|
125
|
+
// 找到旧 token → 迁移到 session 表
|
|
126
|
+
const now = new Date().toISOString();
|
|
127
|
+
insertSession(db, {
|
|
128
|
+
sessionId: newSessionId(),
|
|
129
|
+
visitorId: row.visitor_id,
|
|
130
|
+
tokenHash: tokenHash,
|
|
131
|
+
deviceName: "Migrated Device",
|
|
132
|
+
createdAt: now,
|
|
133
|
+
lastSeenAt: now,
|
|
134
|
+
});
|
|
135
|
+
// 更新 visitor 最后活跃时间
|
|
136
|
+
updateVisitorLastSeen(db, row.visitor_id, now);
|
|
94
137
|
return row;
|
|
95
138
|
}
|
|
96
139
|
/**
|
|
@@ -114,7 +157,7 @@ export function listAllVisitors(filter = "all") {
|
|
|
114
157
|
}
|
|
115
158
|
/**
|
|
116
159
|
* 使用恢复码找回访客身份。
|
|
117
|
-
* 验证恢复码 → 生成新 Token
|
|
160
|
+
* 验证恢复码 → 生成新 Token + 新会话(旧会话仍然有效)→ 清除恢复码(一次性使用)→ 返回新的身份。
|
|
118
161
|
*
|
|
119
162
|
* @param recoveryCode - 用户输入的恢复码
|
|
120
163
|
* @returns 新的身份信息(访客 + 新 Token),若恢复码无效则返回 null
|
|
@@ -125,13 +168,22 @@ export function recoverVisitor(recoveryCode) {
|
|
|
125
168
|
const row = findVisitorByRecoveryCodeHash(db, codeHash);
|
|
126
169
|
if (!row)
|
|
127
170
|
return null;
|
|
128
|
-
// 生成新 Token
|
|
171
|
+
// 生成新 Token,创建新会话(不影响旧会话)
|
|
129
172
|
const rawToken = newVisitorToken();
|
|
130
173
|
const tokenHash = hashVisitorToken(rawToken);
|
|
131
174
|
const now = new Date().toISOString();
|
|
132
175
|
const tx = db.transaction(() => {
|
|
133
|
-
//
|
|
134
|
-
db.prepare(`UPDATE visitors SET
|
|
176
|
+
// 清除恢复码(一次性使用)
|
|
177
|
+
db.prepare(`UPDATE visitors SET last_seen_at = ?, recovery_code_hash = NULL WHERE visitor_id = ?`).run(now, row.visitor_id);
|
|
178
|
+
// 创建新会话(多设备同时在线)
|
|
179
|
+
insertSession(db, {
|
|
180
|
+
sessionId: newSessionId(),
|
|
181
|
+
visitorId: row.visitor_id,
|
|
182
|
+
tokenHash,
|
|
183
|
+
deviceName: "Recovered Device",
|
|
184
|
+
createdAt: now,
|
|
185
|
+
lastSeenAt: now,
|
|
186
|
+
});
|
|
135
187
|
// 审计日志
|
|
136
188
|
insertAuditLog(db, {
|
|
137
189
|
actorVisitorId: row.visitor_id,
|
|
@@ -203,4 +255,82 @@ export class VisitorValidationError extends Error {
|
|
|
203
255
|
this.name = "VisitorValidationError";
|
|
204
256
|
}
|
|
205
257
|
}
|
|
258
|
+
/**
|
|
259
|
+
* 使用用户名+密码登录。
|
|
260
|
+
* 验证成功则生成新会话(不影响其他设备),返回访客信息 + 新 token。
|
|
261
|
+
*
|
|
262
|
+
* @param visitorName - 访客名称
|
|
263
|
+
* @param password - 密码
|
|
264
|
+
* @returns 登录结果,失败或未设置密码时返回 null
|
|
265
|
+
*/
|
|
266
|
+
export function loginWithPassword(visitorName, password) {
|
|
267
|
+
const trimmed = visitorName.trim();
|
|
268
|
+
if (!trimmed || !password)
|
|
269
|
+
return null;
|
|
270
|
+
const db = getDb();
|
|
271
|
+
const row = findVisitorByName(db, trimmed);
|
|
272
|
+
if (!row)
|
|
273
|
+
return null;
|
|
274
|
+
// 该访客未设置密码,不能使用密码登录
|
|
275
|
+
if (!row.password_hash)
|
|
276
|
+
return null;
|
|
277
|
+
// 密码验证
|
|
278
|
+
if (!verifyPassword(password, row.password_hash))
|
|
279
|
+
return null;
|
|
280
|
+
// 生成新 token 和新会话
|
|
281
|
+
const rawToken = newVisitorToken();
|
|
282
|
+
const tokenHash = hashVisitorToken(rawToken);
|
|
283
|
+
const now = new Date().toISOString();
|
|
284
|
+
const tx = db.transaction(() => {
|
|
285
|
+
insertSession(db, {
|
|
286
|
+
sessionId: newSessionId(),
|
|
287
|
+
visitorId: row.visitor_id,
|
|
288
|
+
tokenHash,
|
|
289
|
+
deviceName: "Password Login",
|
|
290
|
+
createdAt: now,
|
|
291
|
+
lastSeenAt: now,
|
|
292
|
+
});
|
|
293
|
+
updateVisitorLastSeen(db, row.visitor_id, now);
|
|
294
|
+
insertAuditLog(db, {
|
|
295
|
+
actorVisitorId: row.visitor_id,
|
|
296
|
+
action: "visitor.login-password",
|
|
297
|
+
targetType: "visitor",
|
|
298
|
+
targetId: row.visitor_id,
|
|
299
|
+
metadata: {},
|
|
300
|
+
createdAt: now,
|
|
301
|
+
});
|
|
302
|
+
});
|
|
303
|
+
tx();
|
|
304
|
+
log.info("visitor %s logged in with password", row.visitor_id);
|
|
305
|
+
return {
|
|
306
|
+
visitor: toPublic(row),
|
|
307
|
+
visitorToken: rawToken,
|
|
308
|
+
recoveryCode: "",
|
|
309
|
+
};
|
|
310
|
+
}
|
|
311
|
+
/**
|
|
312
|
+
* 为当前访客设置密码。
|
|
313
|
+
* 空字符串表示清除密码(但前端可能不暴露这个功能)。
|
|
314
|
+
*
|
|
315
|
+
* @param visitorId - 访客 ID
|
|
316
|
+
* @param password - 新密码
|
|
317
|
+
*/
|
|
318
|
+
export function setVisitorPassword(visitorId, password) {
|
|
319
|
+
const db = getDb();
|
|
320
|
+
const passwordHash = password ? hashPassword(password) : undefined;
|
|
321
|
+
const now = new Date().toISOString();
|
|
322
|
+
const tx = db.transaction(() => {
|
|
323
|
+
db.prepare(`UPDATE visitors SET password_hash = ?, last_seen_at = ? WHERE visitor_id = ?`).run(passwordHash, now, visitorId);
|
|
324
|
+
insertAuditLog(db, {
|
|
325
|
+
actorVisitorId: visitorId,
|
|
326
|
+
action: "visitor.set-password",
|
|
327
|
+
targetType: "visitor",
|
|
328
|
+
targetId: visitorId,
|
|
329
|
+
metadata: {},
|
|
330
|
+
createdAt: now,
|
|
331
|
+
});
|
|
332
|
+
});
|
|
333
|
+
tx();
|
|
334
|
+
log.info("visitor %s set password", visitorId);
|
|
335
|
+
}
|
|
206
336
|
//# sourceMappingURL=visitor.service.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"visitor.service.js","sourceRoot":"","sources":["../../../src/server/identity/visitor.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EACL,eAAe,
|
|
1
|
+
{"version":3,"file":"visitor.service.js","sourceRoot":"","sources":["../../../src/server/identity/visitor.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Router } from "express";
|
|
2
|
-
import { generateRecoveryCode, recoverVisitor, registerVisitor, toPublic, VisitorValidationError, } from "../identity/visitor.service.js";
|
|
2
|
+
import { generateRecoveryCode, loginWithPassword, recoverVisitor, registerVisitor, setVisitorPassword, toPublic, VisitorValidationError, } from "../identity/visitor.service.js";
|
|
3
3
|
import { getDb } from "../db/connection.js";
|
|
4
4
|
import { listActiveVisitorsDirectory } from "../db/repositories/visitor.repo.js";
|
|
5
5
|
import { listDocumentsByVisitor } from "../db/repositories/document.repo.js";
|
|
@@ -16,6 +16,7 @@ export function buildVisitorsRouter() {
|
|
|
16
16
|
/**
|
|
17
17
|
* POST /register
|
|
18
18
|
* 注册新访客。
|
|
19
|
+
* 请求体: { visitorName: string, password?: string }
|
|
19
20
|
* 返回 { visitor, visitorToken, recoveryCode }
|
|
20
21
|
*/
|
|
21
22
|
router.post("/register", (req, res) => {
|
|
@@ -25,8 +26,9 @@ export function buildVisitorsRouter() {
|
|
|
25
26
|
res.status(400).json({ error: { code: "BAD_REQUEST", message: "visitorName is required" } });
|
|
26
27
|
return;
|
|
27
28
|
}
|
|
29
|
+
const password = typeof body.password === "string" ? body.password.trim() : "";
|
|
28
30
|
try {
|
|
29
|
-
const result = registerVisitor(body.visitorName);
|
|
31
|
+
const result = registerVisitor(body.visitorName, password || undefined);
|
|
30
32
|
// 设置 HttpOnly Cookie(10 年有效期,约等于永久)
|
|
31
33
|
res.cookie("visitor_token", result.visitorToken, {
|
|
32
34
|
httpOnly: true,
|
|
@@ -51,6 +53,52 @@ export function buildVisitorsRouter() {
|
|
|
51
53
|
res.status(500).json({ error: { code: "INTERNAL", message: "failed to register visitor" } });
|
|
52
54
|
}
|
|
53
55
|
});
|
|
56
|
+
/**
|
|
57
|
+
* POST /login
|
|
58
|
+
* 使用用户名+密码登录。
|
|
59
|
+
* 请求体: { visitorName: string, password: string }
|
|
60
|
+
* 返回: { visitor } + Cookie
|
|
61
|
+
* 错误码: NO_PASSWORD_SET(该用户未设置密码)、INVALID_CREDENTIALS(用户名或密码错误)
|
|
62
|
+
*/
|
|
63
|
+
router.post("/login", (req, res) => {
|
|
64
|
+
const body = (req.body ?? {});
|
|
65
|
+
if (typeof body.visitorName !== "string" || !body.visitorName.trim()) {
|
|
66
|
+
res.status(400).json({ error: { code: "BAD_REQUEST", message: "visitorName is required" } });
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
if (typeof body.password !== "string" || !body.password.trim()) {
|
|
70
|
+
res.status(400).json({ error: { code: "BAD_REQUEST", message: "password is required" } });
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
const db = getDb();
|
|
74
|
+
// 先查用户是否存在
|
|
75
|
+
const row = db
|
|
76
|
+
.prepare(`SELECT password_hash FROM visitors WHERE visitor_name = ? AND disabled_at IS NULL`)
|
|
77
|
+
.get(body.visitorName.trim());
|
|
78
|
+
if (!row) {
|
|
79
|
+
res.status(401).json({ error: { code: "INVALID_CREDENTIALS", message: "用户名或密码错误" } });
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
// 该用户未设置密码
|
|
83
|
+
if (!row.password_hash) {
|
|
84
|
+
res.status(400).json({ error: { code: "NO_PASSWORD_SET", message: "该账号未设置密码,无法远程登录" } });
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
// 验证密码
|
|
88
|
+
const result = loginWithPassword(body.visitorName.trim(), body.password.trim());
|
|
89
|
+
if (!result) {
|
|
90
|
+
res.status(401).json({ error: { code: "INVALID_CREDENTIALS", message: "用户名或密码错误" } });
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
// 登录成功,设置 Cookie
|
|
94
|
+
res.cookie("visitor_token", result.visitorToken, {
|
|
95
|
+
httpOnly: true,
|
|
96
|
+
sameSite: "lax",
|
|
97
|
+
path: "/",
|
|
98
|
+
maxAge: 10 * 365 * 24 * 60 * 60 * 1000,
|
|
99
|
+
});
|
|
100
|
+
res.json({ data: { visitor: result.visitor } });
|
|
101
|
+
});
|
|
54
102
|
/**
|
|
55
103
|
* POST /recover
|
|
56
104
|
* 使用恢复码找回访客身份。
|
|
@@ -94,6 +142,22 @@ export function buildVisitorsRouter() {
|
|
|
94
142
|
const code = generateRecoveryCode(req.visitor.visitor_id);
|
|
95
143
|
res.json({ data: { recoveryCode: code } });
|
|
96
144
|
});
|
|
145
|
+
/**
|
|
146
|
+
* POST /set-password
|
|
147
|
+
* 为当前已登录的访客设置密码。
|
|
148
|
+
* 请求体: { password: string }
|
|
149
|
+
* 空字符串表示清除密码。
|
|
150
|
+
*/
|
|
151
|
+
router.post("/set-password", (req, res) => {
|
|
152
|
+
if (!req.visitor) {
|
|
153
|
+
res.status(401).json({ error: { code: "UNAUTHENTICATED", message: "no visitor" } });
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
const body = (req.body ?? {});
|
|
157
|
+
const password = typeof body.password === "string" ? body.password.trim() : "";
|
|
158
|
+
setVisitorPassword(req.visitor.visitor_id, password);
|
|
159
|
+
res.json({ data: { ok: true } });
|
|
160
|
+
});
|
|
97
161
|
/**
|
|
98
162
|
* GET /
|
|
99
163
|
* 获取活跃访客目录(不含已停用/已删除的访客)。
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"visitors.routes.js","sourceRoot":"","sources":["../../../src/server/routes/visitors.routes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAA+B,MAAM,SAAS,CAAC;AAC9D,OAAO,EACL,oBAAoB,EACpB,cAAc,EACd,eAAe,EACf,QAAQ,EACR,sBAAsB,GACvB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAAE,2BAA2B,EAAE,MAAM,oCAAoC,CAAC;AACjF,OAAO,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAC;AAC7E,OAAO,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAC7E,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAEhD,MAAM,GAAG,GAAG,SAAS,CAAC,gBAAgB,CAAC,CAAC;AAExC;;;;GAIG;AACH,MAAM,UAAU,mBAAmB;IACjC,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC;IAExB
|
|
1
|
+
{"version":3,"file":"visitors.routes.js","sourceRoot":"","sources":["../../../src/server/routes/visitors.routes.ts"],"names":[],"mappings":"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"}
|