Files
nodeagent/tests/unit/discovery-sig.test.mjs
T
jkooe 2cb0ed148e chore(privacy): 源码与测试里的真机常量脱敏(机器名 / 真机内网 IP)
路线图 §七 序 7「源码真机常量注入化」的脱敏部分。

## 改了什么
- apps/agent/src/capabilities/network.ts:注释里的真机机器名 → 泛化为「机器名+纯数字」
  (保留"为什么不能拼 USERDOMAIN/USERNAME"这个教训本身,去掉具体机器名)
- scripts/rescue-network.ps1:.EXAMPLE 里的真机内网地址 → 文档示例段 192.168.1.100;
  网卡名示例由中文默认名改为 'Ethernet'(既避免像真机、又更通用)
- packages/protocol/src/acl.ts:注释里的真机 Mac 地址 → 192.168.1.100
- tests/unit×4:测试数据里的真机 IP 统一换成 192.168.1.x 示例段

## 过程中的两个教训(都记在代码注释里了)
1. **正则转义形态漏替换**:断言里写的是 `192\.168\.0\.88`(转义点),第一轮只替换了
   裸形态 `192.168.0.`,导致脚本值变了、断言没变 → 3 个测试红。
2. **机械替换会破坏「跨网段」这类语义测试**:acl 的 `/24 网段匹配` 用例里有一条
   本意是「**不同网段不匹配**」,替换后两侧变成同段 → 断言必红。已改回不同网段
   并在注释里标注原因,防止下次再被批量替换破坏。

## 验证
单测 269 全绿(复跑);e2e 30 全绿。
2026-10-10 00:39:28 +08:00

42 lines
1.6 KiB
JavaScript

import { test } from 'node:test';
import assert from 'node:assert/strict';
import { computeHmac, verifyHmac } from '../../packages/protocol/dist/index.js';
/**
* v22:发现广播的详情签名。
* 被控端与控制端必须**逐字节同构**,否则「🔒 已认证」永远不亮 —— 故这里做往返一致性测试。
*/
const detail = {
host: '192.168.1.21',
port: 8765,
tls: true,
auth_mode: 'psk',
input_enabled: false,
cert_sha256: null,
platform: 'win32',
};
const nodeId = 'win_01';
const ts = 1790000000000;
const SECRET = 'S3CRET-DISCOVERY-KEY';
test('详情签名:同一输入两端算出同一值并验签通过', () => {
const payload = `${nodeId}|${ts}|${JSON.stringify(detail)}`;
const sig = computeHmac(SECRET, payload);
assert.ok(verifyHmac(SECRET, payload, sig), '控制端应验签通过');
});
test('详情签名:错误密钥 / 篡改详情 / 改时间戳 都必须验签失败', () => {
const payload = `${nodeId}|${ts}|${JSON.stringify(detail)}`;
const sig = computeHmac(SECRET, payload);
assert.ok(!verifyHmac('wrong-key', payload, sig), '错误密钥应失败');
const tampered = `${nodeId}|${ts}|${JSON.stringify({ ...detail, port: 9999 })}`;
assert.ok(!verifyHmac(SECRET, tampered, sig), '篡改详情应失败');
assert.ok(!verifyHmac(SECRET, `${nodeId}|${ts + 1}|${JSON.stringify(detail)}`, sig), '改时间戳应失败');
});
test('详情签名:字段顺序变化会改变签名(提醒:两侧都按对象字面量顺序拼)', () => {
const a = computeHmac(SECRET, JSON.stringify({ x: 1, y: 2 }));
const b = computeHmac(SECRET, JSON.stringify({ y: 2, x: 1 }));
assert.notEqual(a, b);
});