文档库:目录改为编号制(01-规范/02-架构设计/03-数据库/04-调整方案/
05-交接单/06-ops/07-scripts/08-skills/09-archive),顶层散文件归入 01-规范/;
INDEX.md 与 docs-manifest.json 重刷(档案 146 篇);旧目录名引用全量对齐。
IM 线:src/im/**(SDK / hub / store / presence / ws / gateway-token)、
src/web/routes/im.ts、src/db/plugin-data/**、src/supervisor/plugin-assembly.ts
及对应 test/**。
插件线:poc/{im-agent-bridge,im-connection-gateway,im-conversation-tabs,
business-plugins-im,carbon-mcp-probe}、src/web/routes/{sessions,overlay-device}.ts、
src/net/relay/{device-grant,instance-credential}.ts。
仓库卫生:清出 40 个历史误入库 / 已改名文件(34 个交接单归档 + 6 个旧结构,
本地均有副本);dsh-server-docs/.gitignore 补 tmp/;交接单不入库(政策)。
This commit is contained in:
1 parent
3d8f50e366
commit
e6207aa691
239 files changed
+34477
-14633
No files matched your search
@@ -40,6 +40,7 @@ import {
|
||||
DIRECT_OFF_VALUES,
|
||||
DirectCooldown,
|
||||
DirectPath,
|
||||
describeDialers,
|
||||
NODES_REGISTRY_VERSION,
|
||||
PUNCH_PORT_BASE,
|
||||
PUNCH_PORT_SPAN,
|
||||
@@ -212,15 +213,31 @@ test('T4 准入策略**复用** server.ts 的那一条(⛔ 防两处写分叉
|
||||
const netSrc = readFileSync(ssPath, 'utf8')
|
||||
const srvSrc = readFileSync(serverPath, 'utf8')
|
||||
|
||||
// ① 唯一出口确实在 network.ts 里,且语义就是"该网桶里有没有这个 hostId"
|
||||
// ① 唯一出口确实在 network.ts 里,且语义就是"该网桶里有没有这个 hostId / 是否整网放行"
|
||||
assert.match(netSrc, /export function isAllowedDialer\(/)
|
||||
assert.match(netSrc, /return map\.get\(network\)\?\.has\(hostId\) === true/)
|
||||
assert.match(netSrc, /bucket\.has\(DIALER_WILDCARD\)/, '网级通配(序㊻ S2)应在唯一出口里判')
|
||||
assert.match(netSrc, /if \(bucket\.has\(hostId\)\) return true/, '逐设备命中仍在唯一出口里判')
|
||||
assert.match(
|
||||
netSrc,
|
||||
/TENANT_NETWORK_WILDCARD\)\?\.has\(DIALER_WILDCARD\)/,
|
||||
'租户网全域兜底(序㊻ 步骤6/遗留1)必须在**唯一出口**里判,⛔ 不许在调用方另判一处',
|
||||
)
|
||||
|
||||
// ② server.ts 的两处闸门与它**同策略**(同 map 、同 `=== true` 默认拒绝)
|
||||
const registerGate = srvSrc.includes('const wantDialer = this.dialers.get(network)?.has(hostId) === true')
|
||||
const dialGate = srvSrc.includes('if (this.dialers.get(session.network)?.has(session.hostId) !== true) {')
|
||||
assert.ok(registerGate, '注册闸门(server.ts)应仍是 dialers.get(network)?.has(hostId) === true(⛔ 本棒不许改它的语义)')
|
||||
assert.ok(dialGate, 'DIAL 闸门(server.ts)应仍是 dialers.get(session.network)?.has(session.hostId) !== true')
|
||||
// ② server.ts 的两处闸门**调用**它(序㊻ S2 起:等价性 = 同一份代码,⛔ 不再是"两份逐字相同")
|
||||
assert.ok(
|
||||
srvSrc.includes('const wantDialer = isAllowedDialer(this.dialers, network, hostId)'),
|
||||
'注册闸门(server.ts)应调用 isAllowedDialer(this.dialers, network, hostId)',
|
||||
)
|
||||
assert.ok(
|
||||
srvSrc.includes('if (!isAllowedDialer(this.dialers, session.network, session.hostId)) {'),
|
||||
'DIAL 闸门(server.ts)应调用 isAllowedDialer(this.dialers, session.network, session.hostId)',
|
||||
)
|
||||
|
||||
// ②b ⛔ 反证:server.ts 里**不许**再出现内联形态 —— 否则网级通配会"漏改一处"(本线老病根)
|
||||
assert.ok(
|
||||
!/this\.dialers\.get\([^)]*\)\?\.has\(/.test(srvSrc),
|
||||
'server.ts 里又出现了内联白名单判定 dialers.get(...)?.has(...) ⇒ 序㊻ S2 之后它必须走唯一出口',
|
||||
)
|
||||
|
||||
// ③ 直连模块**不许**自己再判一遍(⛔ 防"同一事实两处写")
|
||||
for (const f of ['direct/candidate.ts', 'direct/index.ts', 'direct/punch.ts']) {
|
||||
@@ -232,6 +249,48 @@ test('T4 准入策略**复用** server.ts 的那一条(⛔ 防两处写分叉
|
||||
// ④ 等价性:默认拒绝(空桶 / 未列网络 / 名字错)—— 与 server.ts 同为"默认拒绝"
|
||||
assert.equal(isAllowedDialer(new Map(), 'ops', 'manager'), false)
|
||||
assert.equal(isAllowedDialer(dialers(), 'ops', 'MANAGER'), false, 'hostId 大小写敏感(与 HOST_RE 口径一致)')
|
||||
|
||||
// ⑤ 网级通配(序㊻ S2):只对**写了通配的那张网**放行,⛔ 不外溢到别的网
|
||||
const wild = normalizeDialers(new Set(['ops:manager', 'u:5/*']))
|
||||
assert.equal(isAllowedDialer(wild, 'u:5', 'd-any-brand-new-device'), true, '通配网里:未枚举的 hostId 也可拨')
|
||||
assert.equal(isAllowedDialer(wild, 'ops', 'w-2'), false, '⛔ 通配不外溢:ops 桶里没有 w-2 就是拒')
|
||||
assert.equal(isAllowedDialer(wild, 'u:7', 'd-any'), false, '⛔ 通配不外溢:没列到的网一律拒')
|
||||
assert.deepEqual(describeDialers(wild).sort(), ['manager', 'u:5/*'], '通配在 /status 里要看得见')
|
||||
|
||||
/**
|
||||
* ⑥ **租户网全域兜底**(序㊻ 步骤 6/遗留1):配一条「网名位 `u:*` + hostId 位 `*`」(等价于
|
||||
* 分桶形态的 `u:*` 桶)⇒ **没被单独列举过**的租户网也放行。
|
||||
*
|
||||
* 这条要解决的是上一棒实测到的"零介入"硬缺口:**租户 id 是运行时才生成的**(`users.id`),
|
||||
* 所以"把新租户网加进白名单"在原理上做不到 ⇒ 只能表达为"任何租户网"。
|
||||
*/
|
||||
const tenantAll = normalizeDialers(new Set(['ops:manager', 'u:*/*']))
|
||||
assert.equal(
|
||||
isAllowedDialer(tenantAll, 'u:brand-new-tenant-id', 'd-brand-new-device'),
|
||||
true,
|
||||
'未列举过的租户网也应命中(这条就是"新用户零介入"的准入面依据)',
|
||||
)
|
||||
assert.equal(isAllowedDialer(tenantAll, 'u', 'd-1'), false, '⛔ 裸 `u` 不是合法租户网 ⇒ 兜底不生效(保留字仍被挡住)')
|
||||
assert.equal(isAllowedDialer(tenantAll, 'ops', 'w-2'), false, '⛔ 兜底**不外溢到 ops**(结构性:只对租户网生效)')
|
||||
assert.equal(isAllowedDialer(tenantAll, 'named-net', 'w-2'), false, '⛔ 兜底不外溢到命名网')
|
||||
assert.equal(isAllowedDialer(normalizeDialers(new Set(['ops:manager'])), 'u:5', 'd-1'), false, '⛔ 没写兜底就照旧默认拒绝')
|
||||
// 取**并集**语义:精确条目与兜底互不覆盖(⛔ 不会"兜底把 ops 的条目压掉")
|
||||
assert.equal(isAllowedDialer(tenantAll, 'ops', 'manager'), true, '精确条目在兜底存在时照旧生效')
|
||||
assert.deepEqual(describeDialers(tenantAll).sort(), ['manager', 'u:*/*'], '兜底在 /status 里要看得见(一眼能确认它开着)')
|
||||
|
||||
// ⑦ 非法用法**装载即抛**(本模块的一贯判据:配错就炸,⛔ 不静默变成"谁也没匹配上")
|
||||
for (const bad of ['ops:*', 'named-net:*', 'u:*/d-1']) {
|
||||
assert.throws(
|
||||
() => normalizeDialers(new Set([bad])),
|
||||
/只能用在租户网|半通配/,
|
||||
`${JSON.stringify(bad)} 应当装载即抛(实际没抛)`,
|
||||
)
|
||||
}
|
||||
assert.throws(
|
||||
() => normalizeDialers(new Map([['u:*', new Set(['manager'])]])),
|
||||
/只允许写/,
|
||||
'`u:*` 桶里写具体 hostId 应当抛(该桶只表达"任何租户网整网放行")',
|
||||
)
|
||||
})
|
||||
|
||||
// ── T5 · 打洞成功路径(真 dgram + NAT 模拟) ────────────────────────────────────
|
||||
|
||||
Reference in new issue
Block a user