@dynamic-labs-wallet/browser-wallet-client 1.0.83 → 1.0.84

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/index.cjs CHANGED
@@ -246,6 +246,23 @@ class IframeMessageHandler {
246
246
 
247
247
  const logger = new logger$1.Logger('DynamicWaasWalletClient');
248
248
 
249
+ const isOpaqueOrigin = (origin)=>!origin || origin === '' || origin === 'null';
250
+ const isNativeBridgeEvent = (event)=>event.source === null && isOpaqueOrigin(event.origin);
251
+ /**
252
+ * Validate the browser-supplied `origin` and `source` of an incoming message.
253
+ * Native WebView bridge events have an opaque origin and a null source.
254
+ * Messages from the iframe must come from the iframe's contentWindow and
255
+ * declare the iframe's origin.
256
+ *
257
+ * TODO: replace with `@dynamic-labs/message-transport/isMessageEventTrusted`
258
+ * once the wallet client is on a version that exports it.
259
+ */ const isTrustedIncomingMessage = (event, source, iframe, iframeOrigin)=>{
260
+ if (source === 'document') {
261
+ return isNativeBridgeEvent(event);
262
+ }
263
+ const isFromIframe = event.source === iframe.contentWindow && event.origin === iframeOrigin;
264
+ return isFromIframe || isNativeBridgeEvent(event);
265
+ };
249
266
  const setupMessageTransportBridge = (messageTransport$1, iframe, iframeOrigin)=>{
250
267
  const logger = new logger$1.Logger('debug');
251
268
  function hostListener(message) {
@@ -267,15 +284,19 @@ const setupMessageTransportBridge = (messageTransport$1, iframe, iframeOrigin)=>
267
284
  }
268
285
  }
269
286
  messageTransport$1.on(hostListener);
270
- const handleIncomingMessage = (message)=>{
271
- const { data } = message;
272
- if (!data) return;
273
- if ((data == null ? void 0 : data.origin) !== 'webview') {
287
+ const handleIncomingMessage = (event, source)=>{
288
+ if (!isTrustedIncomingMessage(event, source, iframe, iframeOrigin)) {
289
+ logger.debug(`skipped message: untrusted ${source} event (origin: ${event.origin}, source mismatch)`);
274
290
  return;
275
291
  }
292
+ const { data } = event;
293
+ if (!data) return;
276
294
  if (typeof data !== 'object') {
277
295
  return;
278
296
  }
297
+ if ((data == null ? void 0 : data.origin) !== 'webview') {
298
+ return;
299
+ }
279
300
  try {
280
301
  const message = messageTransport.parseMessageTransportData(data);
281
302
  messageTransport$1.emit(message);
@@ -285,20 +306,22 @@ const setupMessageTransportBridge = (messageTransport$1, iframe, iframeOrigin)=>
285
306
  }
286
307
  }
287
308
  };
309
+ const handleDocumentMessage = (event)=>handleIncomingMessage(event, 'document');
310
+ const handleWindowMessage = (event)=>handleIncomingMessage(event, 'window');
288
311
  /**
289
312
  * Handle incoming message from android client
290
313
  */ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
291
314
  // @ts-expect-error
292
- document.addEventListener('message', handleIncomingMessage);
315
+ document.addEventListener('message', handleDocumentMessage);
293
316
  /**
294
317
  * Handle incoming message from iOS client
295
- */ window.addEventListener('message', handleIncomingMessage);
318
+ */ window.addEventListener('message', handleWindowMessage);
296
319
  return ()=>{
297
320
  messageTransport$1.off(hostListener);
298
321
  // eslint-disable-next-line @typescript-eslint/ban-ts-comment
299
322
  // @ts-expect-error
300
- document.removeEventListener('message', handleIncomingMessage);
301
- window.removeEventListener('message', handleIncomingMessage);
323
+ document.removeEventListener('message', handleDocumentMessage);
324
+ window.removeEventListener('message', handleWindowMessage);
302
325
  };
303
326
  };
304
327
 
package/index.esm.js CHANGED
@@ -245,6 +245,23 @@ class IframeMessageHandler {
245
245
 
246
246
  const logger = new Logger('DynamicWaasWalletClient');
247
247
 
248
+ const isOpaqueOrigin = (origin)=>!origin || origin === '' || origin === 'null';
249
+ const isNativeBridgeEvent = (event)=>event.source === null && isOpaqueOrigin(event.origin);
250
+ /**
251
+ * Validate the browser-supplied `origin` and `source` of an incoming message.
252
+ * Native WebView bridge events have an opaque origin and a null source.
253
+ * Messages from the iframe must come from the iframe's contentWindow and
254
+ * declare the iframe's origin.
255
+ *
256
+ * TODO: replace with `@dynamic-labs/message-transport/isMessageEventTrusted`
257
+ * once the wallet client is on a version that exports it.
258
+ */ const isTrustedIncomingMessage = (event, source, iframe, iframeOrigin)=>{
259
+ if (source === 'document') {
260
+ return isNativeBridgeEvent(event);
261
+ }
262
+ const isFromIframe = event.source === iframe.contentWindow && event.origin === iframeOrigin;
263
+ return isFromIframe || isNativeBridgeEvent(event);
264
+ };
248
265
  const setupMessageTransportBridge = (messageTransport, iframe, iframeOrigin)=>{
249
266
  const logger = new Logger('debug');
250
267
  function hostListener(message) {
@@ -266,15 +283,19 @@ const setupMessageTransportBridge = (messageTransport, iframe, iframeOrigin)=>{
266
283
  }
267
284
  }
268
285
  messageTransport.on(hostListener);
269
- const handleIncomingMessage = (message)=>{
270
- const { data } = message;
271
- if (!data) return;
272
- if ((data == null ? void 0 : data.origin) !== 'webview') {
286
+ const handleIncomingMessage = (event, source)=>{
287
+ if (!isTrustedIncomingMessage(event, source, iframe, iframeOrigin)) {
288
+ logger.debug(`skipped message: untrusted ${source} event (origin: ${event.origin}, source mismatch)`);
273
289
  return;
274
290
  }
291
+ const { data } = event;
292
+ if (!data) return;
275
293
  if (typeof data !== 'object') {
276
294
  return;
277
295
  }
296
+ if ((data == null ? void 0 : data.origin) !== 'webview') {
297
+ return;
298
+ }
278
299
  try {
279
300
  const message = parseMessageTransportData(data);
280
301
  messageTransport.emit(message);
@@ -284,20 +305,22 @@ const setupMessageTransportBridge = (messageTransport, iframe, iframeOrigin)=>{
284
305
  }
285
306
  }
286
307
  };
308
+ const handleDocumentMessage = (event)=>handleIncomingMessage(event, 'document');
309
+ const handleWindowMessage = (event)=>handleIncomingMessage(event, 'window');
287
310
  /**
288
311
  * Handle incoming message from android client
289
312
  */ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
290
313
  // @ts-expect-error
291
- document.addEventListener('message', handleIncomingMessage);
314
+ document.addEventListener('message', handleDocumentMessage);
292
315
  /**
293
316
  * Handle incoming message from iOS client
294
- */ window.addEventListener('message', handleIncomingMessage);
317
+ */ window.addEventListener('message', handleWindowMessage);
295
318
  return ()=>{
296
319
  messageTransport.off(hostListener);
297
320
  // eslint-disable-next-line @typescript-eslint/ban-ts-comment
298
321
  // @ts-expect-error
299
- document.removeEventListener('message', handleIncomingMessage);
300
- window.removeEventListener('message', handleIncomingMessage);
322
+ document.removeEventListener('message', handleDocumentMessage);
323
+ window.removeEventListener('message', handleWindowMessage);
301
324
  };
302
325
  };
303
326
 
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "@dynamic-labs-wallet/browser-wallet-client",
3
- "version": "1.0.83",
3
+ "version": "1.0.84",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "dependencies": {
7
- "@dynamic-labs-wallet/core": "1.0.83",
7
+ "@dynamic-labs-wallet/core": "1.0.84",
8
8
  "@dynamic-labs/logger": "^4.81.0",
9
9
  "@dynamic-labs/message-transport": "^4.81.0"
10
10
  },
@@ -1 +1 @@
1
- {"version":3,"file":"messageTransportBridge.d.ts","sourceRoot":"","sources":["../../src/services/messageTransportBridge.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,iCAAiC,EAGvC,MAAM,iCAAiC,CAAC;AAGzC,eAAO,MAAM,2BAA2B,qBACpB,iCAAiC,UAC3C,iBAAiB,gBACX,MAAM,KACnB,CAAC,MAAM,IAAI,CAmEb,CAAC"}
1
+ {"version":3,"file":"messageTransportBridge.d.ts","sourceRoot":"","sources":["../../src/services/messageTransportBridge.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,iCAAiC,EAGvC,MAAM,iCAAiC,CAAC;AA+BzC,eAAO,MAAM,2BAA2B,qBACpB,iCAAiC,UAC3C,iBAAiB,gBACX,MAAM,KACnB,CAAC,MAAM,IAAI,CA2Eb,CAAC"}