rdsh-gateway 0.11.0 → 0.11.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/join.d.ts +4 -0
- package/dist/join.js +15 -4
- package/package.json +1 -1
package/dist/join.d.ts
CHANGED
|
@@ -36,6 +36,8 @@ export interface JoinOptions {
|
|
|
36
36
|
host?: string;
|
|
37
37
|
port?: number;
|
|
38
38
|
};
|
|
39
|
+
/** host E2EE 静态密钥对目录(缺省 ~/.rdsh;**仅供测试注入**,生产不要传 —— 见 e2ee-key-store.ts) */
|
|
40
|
+
e2eeKeyDir?: string;
|
|
39
41
|
}
|
|
40
42
|
/** 注册/接入结果:解析出的 host token + 是否需 insecure + 生效的主机名(缺省=机器 hostname)。 */
|
|
41
43
|
export interface RegisterOutcome {
|
|
@@ -65,6 +67,8 @@ export interface StartJoinOptions {
|
|
|
65
67
|
role: JoinLockRole;
|
|
66
68
|
/** 锁文件路径(缺省 ~/.rdsh/join.lock;测试可注入临时路径) */
|
|
67
69
|
lockPath?: string;
|
|
70
|
+
/** E2EE 静态密钥对目录(缺省 ~/.rdsh;**仅供测试注入**,见 e2ee-key-store.ts) */
|
|
71
|
+
e2eeKeyDir?: string;
|
|
68
72
|
hooks?: JoinHooks;
|
|
69
73
|
/** DSH UI 兼容(缺省 trustE2EEAsLoopback=true;false 关闭 JS patch) */
|
|
70
74
|
dshUiCompat?: {
|
package/dist/join.js
CHANGED
|
@@ -110,7 +110,7 @@ export async function registerJoin(opts) {
|
|
|
110
110
|
let token;
|
|
111
111
|
if (opts.token !== undefined) {
|
|
112
112
|
// --token = join token(或旧 host token)→ register 端点换 host token
|
|
113
|
-
const e2eeKeyPair = loadOrCreateE2eeKeyPair();
|
|
113
|
+
const e2eeKeyPair = loadOrCreateE2eeKeyPair(opts.e2eeKeyDir);
|
|
114
114
|
const { hostToken } = await register(opts.hubUrl, opts.token, name, insecure, e2eeKeyPair.publicRaw.toString("base64url"));
|
|
115
115
|
token = hostToken;
|
|
116
116
|
persistToken(opts.hubUrl, token);
|
|
@@ -273,6 +273,19 @@ export function startJoin(opts) {
|
|
|
273
273
|
const uiCompat = { trustE2EEAsLoopback: opts.dshUiCompat?.trustE2EEAsLoopback !== false };
|
|
274
274
|
// 访问口令(feature 15):可变引用 → setAccessCode 运行中切换;null = gate off
|
|
275
275
|
const gate = { accessCode: opts.gateway?.accessCode ?? null };
|
|
276
|
+
/**
|
|
277
|
+
* raw 门禁:页面是否已授权。**实例级共享**(原为 per-raw-stream)。
|
|
278
|
+
*
|
|
279
|
+
* authorize 证明的是"**页面**知道口令",不是"某条 raw 流知道"——而页面注入脚本每页只跑一次
|
|
280
|
+
* (`direct.ts` 的 `__rdshDirectBootstrapped` 守卫)。原先声明在 `makeInnerDispatcher()` 内,
|
|
281
|
+
* 该方法**每条 raw 流都会调用一次**(`startRawStream`),于是新建流标志被重置为 false、
|
|
282
|
+
* 页面又不会重新 authorize ⇒ 该流上所有请求被 CLOSE 403 `raw stream not authorized`。
|
|
283
|
+
*
|
|
284
|
+
* 放在 `startJoin` 作用域 = **每个网关进程一份**:同一进程内共享(**含隧道重连**——`connect()`
|
|
285
|
+
* 嵌在 `startJoin` 内、重连不重建该作用域),跨进程仍隔离。
|
|
286
|
+
* 2026-10-04 修复,详见 `doc/fix/20261004-raw-authorize-per-stream/`。
|
|
287
|
+
*/
|
|
288
|
+
let rawAuthorized = false;
|
|
276
289
|
// raw 门禁 + 候选(24-direct-first):提供 direct 回调即启用候选端点;raw 门禁(authorize)仅设口令时生效
|
|
277
290
|
const rawGate = opts.direct !== undefined
|
|
278
291
|
? { candidates: opts.direct.candidates, mintTicket: opts.direct.mintTicket }
|
|
@@ -338,8 +351,6 @@ export function startJoin(opts) {
|
|
|
338
351
|
const patchSkipped = new Set();
|
|
339
352
|
/** rdsh WebView API 是否已注入过(每个进程只打一次日志,避免页面加载刷屏)。 */
|
|
340
353
|
let adapterInjectionLogged = false;
|
|
341
|
-
/** raw 门禁:当前 raw 流是否已被页面授权(动态判定:见 handleOpen 的条件,含运行中 gate 开关) */
|
|
342
|
-
let rawAuthorized = false;
|
|
343
354
|
/** 从转发头里取 rdsh_gate cookie(hub D12 白名单透传)。 */
|
|
344
355
|
function gateCookie(headers) {
|
|
345
356
|
const ck = headers["cookie"];
|
|
@@ -728,7 +739,7 @@ export function startJoin(opts) {
|
|
|
728
739
|
// host 端 E2EE 静态密钥对(持久化 ~/.rdsh/e2ee-key.json;join 注册时上送指纹)
|
|
729
740
|
let hostE2eeKeypair;
|
|
730
741
|
try {
|
|
731
|
-
hostE2eeKeypair = loadOrCreateE2eeKeyPair();
|
|
742
|
+
hostE2eeKeypair = loadOrCreateE2eeKeyPair(opts.e2eeKeyDir);
|
|
732
743
|
}
|
|
733
744
|
catch (err) {
|
|
734
745
|
releaseLockAndRethrow(err);
|