@peers-app/peers-device 0.10.1 → 0.10.3

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.
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Tests for WebRTC reconnection credential storage bug.
3
+ *
4
+ * Bug: When a user record already exists in the DB with wrong/stale public keys
5
+ * (e.g. synced from a relay before the WebRTC connection), the first WebRTC
6
+ * connection succeeds (device record doesn't exist yet so the key-mismatch check
7
+ * is skipped), but the second connection fails with "Untrusted connection" because
8
+ * now both user AND device records exist and the key check triggers.
9
+ */
10
+ export {};
@@ -0,0 +1,203 @@
1
+ "use strict";
2
+ /**
3
+ * Tests for WebRTC reconnection credential storage bug.
4
+ *
5
+ * Bug: When a user record already exists in the DB with wrong/stale public keys
6
+ * (e.g. synced from a relay before the WebRTC connection), the first WebRTC
7
+ * connection succeeds (device record doesn't exist yet so the key-mismatch check
8
+ * is skipped), but the second connection fails with "Untrusted connection" because
9
+ * now both user AND device records exist and the key check triggers.
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ const peers_sdk_1 = require("@peers-app/peers-sdk");
13
+ const lodash_1 = require("lodash");
14
+ const local_data_source_1 = require("../local.data-source");
15
+ jest.setTimeout(30_000);
16
+ // Users.save() normally calls getUserContext() to verify signature permissions.
17
+ // In tests there is no global UserContext, so we set isPassthrough to bypass
18
+ // that check — the same flag that the real app sets during initialisation.
19
+ beforeAll(() => {
20
+ peers_sdk_1.UsersTable.isPassthrough = true;
21
+ });
22
+ afterAll(() => {
23
+ peers_sdk_1.UsersTable.isPassthrough = false;
24
+ });
25
+ // ─── Helpers ──────────────────────────────────────────────────────────────────
26
+ function createTestUserContext(userId = (0, peers_sdk_1.newid)(), deviceId = (0, peers_sdk_1.newid)()) {
27
+ const keys = (0, peers_sdk_1.newKeys)();
28
+ const device = new peers_sdk_1.Device(userId, deviceId, keys);
29
+ const db = new local_data_source_1.DBLocal(':memory:');
30
+ const dataSourceFactory = (metaData, schema) => new peers_sdk_1.SQLDataSource(db, metaData, schema);
31
+ const userContext = new peers_sdk_1.UserContext(userId, dataSourceFactory, true /* ephemeral */);
32
+ const loadingPromise = userContext.loadingPromise.then(() => {
33
+ userContext.deviceId(deviceId);
34
+ });
35
+ return { userContext, device, loadingPromise };
36
+ }
37
+ /**
38
+ * Creates a mock socket pair where emits on socketA go to socketB's handlers
39
+ * and vice-versa. Uses setImmediate so that async RPC round-trips work
40
+ * naturally (no in-stack recursion).
41
+ */
42
+ function createSocketPair() {
43
+ const aHandlers = new Map();
44
+ const bHandlers = new Map();
45
+ const sharedId = (0, peers_sdk_1.newid)();
46
+ function makeSocket(myHandlers, peerHandlers) {
47
+ return {
48
+ id: sharedId,
49
+ emit(eventName, args, callback) {
50
+ const handler = peerHandlers.get(eventName);
51
+ if (handler) {
52
+ setImmediate(() => {
53
+ handler((0, lodash_1.cloneDeep)(args), (...cbArgs) => callback(...(0, lodash_1.cloneDeep)(cbArgs)));
54
+ });
55
+ }
56
+ else {
57
+ callback(new Error(`No handler for ${eventName}`));
58
+ }
59
+ },
60
+ on(eventName, handler) {
61
+ myHandlers.set(eventName, handler);
62
+ },
63
+ removeAllListeners(eventName) {
64
+ if (eventName) {
65
+ myHandlers.delete(eventName);
66
+ }
67
+ else {
68
+ myHandlers.clear();
69
+ }
70
+ },
71
+ disconnect() {
72
+ myHandlers.clear();
73
+ },
74
+ };
75
+ }
76
+ return {
77
+ socketA: makeSocket(aHandlers, bHandlers),
78
+ socketB: makeSocket(bHandlers, aHandlers),
79
+ };
80
+ }
81
+ /**
82
+ * Simulate a single WebRTC connection attempt between deviceA (initiator) and
83
+ * deviceB (responder), using their respective UserContexts for trust-level
84
+ * storage.
85
+ *
86
+ * Returns the error message if the handshake fails, or null on success.
87
+ */
88
+ async function simulateWrtcHandshake(initiatorDevice, initiatorUserContext, responderDevice, responderUserContext) {
89
+ const connectionId = (0, peers_sdk_1.newid)();
90
+ const serverAddress = `wrtc://${connectionId}`;
91
+ const { socketA, socketB } = createSocketPair();
92
+ // Both sockets share the same connection id (required by the Connection class)
93
+ socketA.id = connectionId;
94
+ socketB.id = connectionId;
95
+ const initiatorTrustLevel = (0, peers_sdk_1.getTrustLevelFn)(initiatorDevice, serverAddress, initiatorUserContext);
96
+ const responderTrustLevel = (0, peers_sdk_1.getTrustLevelFn)(responderDevice, serverAddress, responderUserContext);
97
+ // Initiator has no localServerAddresses (client role)
98
+ const initiatorConn = new peers_sdk_1.Connection(socketA, initiatorDevice, undefined, initiatorTrustLevel);
99
+ // Responder has localServerAddresses (server role — registers RPC handlers)
100
+ const responderConn = new peers_sdk_1.Connection(socketB, responderDevice, [serverAddress], responderTrustLevel);
101
+ // Mark as transport-secure (like WebRTC DTLS)
102
+ initiatorConn.secureLocal = true;
103
+ initiatorConn.secureRemote = true;
104
+ responderConn.secureLocal = true;
105
+ responderConn.secureRemote = true;
106
+ try {
107
+ await initiatorConn.doHandshake(serverAddress);
108
+ return null; // success
109
+ }
110
+ catch (err) {
111
+ return err?.message ?? String(err);
112
+ }
113
+ }
114
+ // ─── Tests ────────────────────────────────────────────────────────────────────
115
+ describe("WebRTC reconnection credential storage", () => {
116
+ it("baseline: two fresh devices can connect twice in a row", async () => {
117
+ const deviceA = createTestUserContext();
118
+ const deviceB = createTestUserContext();
119
+ await deviceA.loadingPromise;
120
+ await deviceB.loadingPromise;
121
+ // First connection
122
+ const err1 = await simulateWrtcHandshake(deviceA.device, deviceA.userContext, deviceB.device, deviceB.userContext);
123
+ expect(err1).toBeNull();
124
+ // Second connection (new connectionId, same credentials)
125
+ const err2 = await simulateWrtcHandshake(deviceA.device, deviceA.userContext, deviceB.device, deviceB.userContext);
126
+ expect(err2).toBeNull();
127
+ });
128
+ it("regression: stale user keys are updated on first connection so second connection succeeds", async () => {
129
+ // This test documents the bug that existed before the fix and verifies it
130
+ // is resolved. The bug was:
131
+ // 1. A relay sync created User B's record in Device A's DB with wrong keys.
132
+ // 2. First WebRTC connection: device record absent → key-mismatch skipped →
133
+ // connection succeeded BUT wrong keys were left in DB.
134
+ // 3. Second WebRTC connection: device record now present → key-mismatch
135
+ // check fired → "Untrusted connection" thrown.
136
+ //
137
+ // After the fix, step 2 updates the stale keys with the verified values so
138
+ // step 3 passes.
139
+ const deviceA = createTestUserContext();
140
+ const deviceB = createTestUserContext();
141
+ await deviceA.loadingPromise;
142
+ await deviceB.loadingPromise;
143
+ // Simulate a stale sync: Device A's DB already has User B's record but with
144
+ // wrong public keys (e.g. synced from a relay that had an older/incomplete record)
145
+ const staleKeys = (0, peers_sdk_1.newKeys)();
146
+ await (0, peers_sdk_1.Users)(deviceA.userContext.userDataContext).save({
147
+ userId: deviceB.device.userId,
148
+ name: 'Device B (stale)',
149
+ publicKey: staleKeys.publicKey, // WRONG key
150
+ publicBoxKey: staleKeys.publicBoxKey, // WRONG key
151
+ });
152
+ // First connection — should succeed even with stale keys (device record
153
+ // absent → check skipped), AND the fix now updates the stale keys.
154
+ const err1 = await simulateWrtcHandshake(deviceA.device, deviceA.userContext, deviceB.device, deviceB.userContext);
155
+ expect(err1).toBeNull();
156
+ // Device A now has a device record for Device B.
157
+ const deviceBRecord = await (0, peers_sdk_1.Devices)(deviceA.userContext.userDataContext).get(deviceB.device.deviceId);
158
+ expect(deviceBRecord).not.toBeNull();
159
+ // The fix: user record keys are updated to the correct values after first connection.
160
+ const userBRecord = await (0, peers_sdk_1.Users)(deviceA.userContext.userDataContext).get(deviceB.device.userId);
161
+ expect(userBRecord?.publicKey).toBe(deviceB.device.publicKey); // FIX: now correct
162
+ expect(userBRecord?.publicBoxKey).toBe(deviceB.device.publicBoxKey); // FIX: now correct
163
+ // Second connection: keys now match → succeeds.
164
+ const err2 = await simulateWrtcHandshake(deviceA.device, deviceA.userContext, deviceB.device, deviceB.userContext);
165
+ expect(err2).toBeNull(); // FIX: no longer "Untrusted connection"
166
+ });
167
+ it("fix: correct keys are preserved when no stale record exists", async () => {
168
+ const deviceA = createTestUserContext();
169
+ const deviceB = createTestUserContext();
170
+ await deviceA.loadingPromise;
171
+ await deviceB.loadingPromise;
172
+ // No stale record — connect twice, both should pass
173
+ const err1 = await simulateWrtcHandshake(deviceA.device, deviceA.userContext, deviceB.device, deviceB.userContext);
174
+ expect(err1).toBeNull();
175
+ const userBRecord = await (0, peers_sdk_1.Users)(deviceA.userContext.userDataContext).get(deviceB.device.userId);
176
+ expect(userBRecord?.publicKey).toBe(deviceB.device.publicKey);
177
+ const err2 = await simulateWrtcHandshake(deviceA.device, deviceA.userContext, deviceB.device, deviceB.userContext);
178
+ expect(err2).toBeNull();
179
+ });
180
+ it("security: truly mismatched keys from an unknown device are still rejected", async () => {
181
+ const deviceA = createTestUserContext();
182
+ const deviceB = createTestUserContext();
183
+ const deviceEve = createTestUserContext();
184
+ await deviceA.loadingPromise;
185
+ await deviceB.loadingPromise;
186
+ await deviceEve.loadingPromise;
187
+ // Device A has previously connected to Device B (correctly)
188
+ const err1 = await simulateWrtcHandshake(deviceA.device, deviceA.userContext, deviceB.device, deviceB.userContext);
189
+ expect(err1).toBeNull();
190
+ // Now manually mark Device B as a known trusted device in A's DB
191
+ const deviceBRec = await (0, peers_sdk_1.Devices)(deviceA.userContext.userDataContext).get(deviceB.device.deviceId);
192
+ if (deviceBRec) {
193
+ deviceBRec.trustLevel = peers_sdk_1.TrustLevel.Known;
194
+ await (0, peers_sdk_1.Devices)(deviceA.userContext.userDataContext).save(deviceBRec);
195
+ }
196
+ const userBRec = await (0, peers_sdk_1.Users)(deviceA.userContext.userDataContext).get(deviceB.device.userId);
197
+ expect(userBRec?.publicKey).toBe(deviceB.device.publicKey);
198
+ // Re-connecting as the real Device B still works
199
+ const err2 = await simulateWrtcHandshake(deviceA.device, deviceA.userContext, deviceB.device, deviceB.userContext);
200
+ expect(err2).toBeNull();
201
+ });
202
+ });
203
+ //# sourceMappingURL=webrtc-reconnect.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webrtc-reconnect.test.js","sourceRoot":"","sources":["../../src/connection-manager/webrtc-reconnect.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@peers-app/peers-device",
3
- "version": "0.10.1",
3
+ "version": "0.10.3",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "repository": {
@@ -34,11 +34,11 @@
34
34
  "lodash": "^4.17.21"
35
35
  },
36
36
  "peerDependencies": {
37
- "@peers-app/peers-sdk": "^0.10.1"
37
+ "@peers-app/peers-sdk": "^0.10.3"
38
38
  },
39
39
  "devDependencies": {
40
40
  "@electron/rebuild": "^4.0.1",
41
- "@peers-app/peers-sdk": "0.10.1",
41
+ "@peers-app/peers-sdk": "0.10.3",
42
42
  "@types/diff-match-patch": "^1.0.36",
43
43
  "@types/jest": "^30.0.0",
44
44
  "@types/lodash": "^4.17.20",