@@ -344,22 +344,30 @@ export function newAppBridge(
344344 appBridge . onopenlink = async ( params , _extra ) => {
345345 log . info ( "Open link request:" , params ) ;
346346
347+ let url : URL ;
348+ try {
349+ url = new URL ( params . url ) ;
350+ } catch {
351+ log . warn ( "Invalid URL:" , params . url ) ;
352+ return { isError : true } ;
353+ }
354+
347355 const HOST_OPENLINK_DENYLIST = [ new URL ( "https://malicious.com" ) ] ;
348- if ( HOST_OPENLINK_DENYLIST . some ( ( { origin } ) => origin === new URL ( params . url ) . origin ) ) {
356+ if ( HOST_OPENLINK_DENYLIST . some ( ( { origin } ) => origin === url . origin ) ) {
349357 log . info ( "Blocked link by host denylist:" , params . url ) ;
350358 return { isError : true } ;
351359 }
352360
353361 const isTrustedByApp = options ?. linkTrustedDomains ?. some ( ( trustedDomain ) =>
354- new URLPattern ( trustedDomain ) . test ( params . url )
362+ new URLPattern ( trustedDomain ) . test ( url )
355363 ) ;
356- const shouldOpen = isTrustedByApp || window . confirm ( `Open external link?\n${ params . url } ` ) ;
364+ const shouldOpen = isTrustedByApp || window . confirm ( `Open external link?\n${ url } ` ) ;
357365 if ( shouldOpen ) {
358- window . open ( params . url , "_blank" , "noopener,noreferrer" ) ;
366+ window . open ( url , "_blank" , "noopener,noreferrer" ) ;
359367 return { } ;
360368 }
361369
362- log . info ( "User declined to open link:" , params . url ) ;
370+ log . info ( "User declined to open link:" , url ) ;
363371 return { isError : true } ;
364372 } ;
365373
0 commit comments