feat(config): 涉密内容外置到配置目录(档案 140)
把散落在代码里的真实部署值统一收进 config/,代码改为引用配置, 使仓库副本/开源导出不再带出生产域名、IP、内网路径与凭据。 新增 config/:platform.env.example(模板)· load.sh(shell 加载器)· index.cjs(node 加载器)· README.md(键一览与优先级)。 真实值放 config/platform.env —— 已 .gitignore 排除,不入库、不进导出。 TS 侧新增 src/platform-paths.ts 作部署路径的唯一解析处(零副作用): platformDir/stateDir/backupDir/artifactDir/installDir/scriptPath。 config.ts 接入这些字段;内置中继种子由生产 URL 改为空(改由 DSHS_OVERLAY_BOOTSTRAP_SEEDS 提供)。修掉 5 处硬编码绝对路径, src/** 注释中性化 116 行/53 文件。 scripts/** 36 个内部运维脚本:真令牌/PG 口令/隧道目标/主机号/路径 一律改从配置取;web/wake.html 的注册域白名单改为运行时从 location.hostname 推导;test/** 夹具 119 行/13 文件改 RFC 2606/5737 保留值,并把「内置种子必须为空」固化为回归断言。 取证:tsc 0 错;npm test 373/375(唯一失败 lease 属既有); 全仓扫描(大小写不敏感)代码面涉密标识 = 0;已部署 47 并零回归 (/opt/dsh/* 未搬家,/var/lib/dshs/platform 未被误建)。
This commit is contained in:
1 parent
9c2e7975ac
commit
452924d89c
100 files changed
+1167
-453
No files matched your search
@@ -161,9 +161,9 @@ test('retryAfter 人话格式化', () => {
|
||||
})
|
||||
|
||||
test('mail: 正文含验证码与有效期,且明确告知"非本人操作请忽略"', () => {
|
||||
const { subject, text } = renderVerificationMail({ to: '[email protected]', code: '123456', ttlMinutes: 10, brand: 'AI1NET' })
|
||||
const { subject, text } = renderVerificationMail({ to: '[email protected]', code: '123456', ttlMinutes: 10, brand: 'EXAMPLE' })
|
||||
assert.ok(subject.includes('123456'))
|
||||
assert.ok(subject.includes('AI1NET'))
|
||||
assert.ok(subject.includes('EXAMPLE'))
|
||||
assert.ok(text.includes('123456'))
|
||||
assert.ok(text.includes('10'))
|
||||
assert.ok(text.includes('ignore this e-mail'))
|
||||
@@ -210,8 +210,8 @@ test('mail: http 驱动把 URL / 鉴权头 / body 模板交给配置(换供应
|
||||
apiUrl: `http://127.0.0.1:${port}/send`,
|
||||
apiKey: 'sekret',
|
||||
authHeader: 'x-api-key',
|
||||
from: 'no-reply@ai1net.com',
|
||||
fromName: 'AI1NET',
|
||||
from: 'no-reply@example.net',
|
||||
fromName: 'EXAMPLE',
|
||||
bodyTemplate: '{"to":"{{to}}","subject":"{{subject}}","payload":{"code":"{{code}}"}}',
|
||||
timeoutMs: 3000,
|
||||
},
|
||||
@@ -249,7 +249,7 @@ test('mail: 上游 5xx ⇒ 明确失败(不重试、不假装成功)', async
|
||||
})
|
||||
|
||||
test('turnstile: 只填一把钥匙视为未配置(半配置不许当"已启用")', () => {
|
||||
const base = { siteKey: 'k', secret: 's', action: 'signup', hostnames: ['ai1net.com'], timeoutMs: 1000 }
|
||||
const base = { siteKey: 'k', secret: 's', action: 'signup', hostnames: ['example.net'], timeoutMs: 1000 }
|
||||
assert.equal(turnstileEnabled(base), true)
|
||||
assert.equal(turnstileEnabled({ ...base, secret: '' }), false)
|
||||
assert.equal(turnstileEnabled({ ...base, siteKey: '' }), false)
|
||||
@@ -260,8 +260,8 @@ test('turnstile: 只填一把钥匙视为未配置(半配置不许当"已启
|
||||
test('turnstile: success 之后仍校 action 与 hostname(官方 canonical 三项)', async () => {
|
||||
// 本地假 siteverify:按 path 决定回什么,从而逐组合断言判定逻辑
|
||||
const cases = {
|
||||
'/ok': { success: true, action: 'signup', hostname: 'ai1net.com' },
|
||||
'/badaction': { success: true, action: 'login', hostname: 'ai1net.com' },
|
||||
'/ok': { success: true, action: 'signup', hostname: 'example.net' },
|
||||
'/badaction': { success: true, action: 'login', hostname: 'example.net' },
|
||||
'/badhost': { success: true, action: 'signup', hostname: 'evil.example' },
|
||||
'/nohost': { success: true, action: 'signup' },
|
||||
'/fail': { success: false, 'error-codes': ['invalid-input-response'] },
|
||||
@@ -277,7 +277,7 @@ test('turnstile: success 之后仍校 action 与 hostname(官方 canonical 三
|
||||
const port = server.address().port
|
||||
const settings = (path) => ({
|
||||
siteKey: 'k', secret: 's', timeoutMs: 3000, action: 'signup',
|
||||
hostnames: ['ai1net.com', 'www.ai1net.com'],
|
||||
hostnames: ['example.net', 'www.example.net'],
|
||||
verifyUrl: `http://127.0.0.1:${port}${path}`,
|
||||
})
|
||||
try {
|
||||
@@ -301,21 +301,21 @@ test('turnstile: success 之后仍校 action 与 hostname(官方 canonical 三
|
||||
})
|
||||
|
||||
test('config: 期望主机名归一 + 派生 + ⛔ 绝不自动加 localhost', () => {
|
||||
assert.deepEqual(normalizeHostnames(['https://AI1net.com/', 'www.ai1net.com:443', ' ai1net.com ']), [
|
||||
'ai1net.com', 'www.ai1net.com',
|
||||
assert.deepEqual(normalizeHostnames(['https://EXAMPLE.net/', 'www.example.net:443', ' example.net ']), [
|
||||
'example.net', 'www.example.net',
|
||||
])
|
||||
// 未配(undefined)⇒ 从 baseDomain 派生
|
||||
assert.deepEqual(resolveTurnstileHostnames(undefined, 'ai1net.com'), ['ai1net.com', 'www.ai1net.com'])
|
||||
assert.deepEqual(resolveTurnstileHostnames(undefined, 'example.net'), ['example.net', 'www.example.net'])
|
||||
// 显式配 ⇒ 只用配的(可加旧域,旧域门户仍在线)
|
||||
assert.deepEqual(
|
||||
resolveTurnstileHostnames(['ai1net.com', 'alotbuy.com'], 'ai1net.com'),
|
||||
['ai1net.com', 'alotbuy.com'],
|
||||
resolveTurnstileHostnames(['example.net', 'example.org'], 'example.net'),
|
||||
['example.net', 'example.org'],
|
||||
)
|
||||
// 显式空 ⇒ 关闭(不派生)
|
||||
assert.deepEqual(resolveTurnstileHostnames([], 'ai1net.com'), [])
|
||||
assert.deepEqual(resolveTurnstileHostnames([], 'example.net'), [])
|
||||
// baseDomain 空 ⇒ 空(= 未配置完成 ⇒ 人机验证停用,不会静默放开)
|
||||
assert.deepEqual(resolveTurnstileHostnames(undefined, ''), [])
|
||||
assert.equal(normalizeHostnames(['localhost']).includes('ai1net.com'), false)
|
||||
assert.equal(normalizeHostnames(['localhost']).includes('example.net'), false)
|
||||
})
|
||||
|
||||
/* ── 编排层:真库 + log 驱动 ─────────────────────────────────────────────── */
|
||||
|
||||
Reference in new issue
Block a user