@@ -7,17 +7,27 @@ type OriginCheckResult =
77 }
88 | { ok : false ; reason : string } ;
99
10+ function normalizeOriginForMatch ( url : URL ) : string {
11+ const normalizedOrigin = url . origin . toLowerCase ( ) ;
12+ if ( normalizedOrigin !== "null" ) {
13+ return normalizedOrigin ;
14+ }
15+ // Non-standard schemes like chrome-extension://<id> stringify to origin === "null",
16+ // but still have a stable scheme + host that operators can allowlist exactly.
17+ return `${ url . protocol } //${ url . host } ` . toLowerCase ( ) ;
18+ }
19+
1020function parseOrigin (
1121 originRaw ?: string ,
12- ) : { origin : string ; host : string ; hostname : string } | null {
22+ ) : { matchOrigin : string ; host : string ; hostname : string } | null {
1323 const trimmed = ( originRaw ?? "" ) . trim ( ) ;
1424 if ( ! trimmed || trimmed === "null" ) {
1525 return null ;
1626 }
1727 try {
1828 const url = new URL ( trimmed ) ;
1929 return {
20- origin : url . origin . toLowerCase ( ) ,
30+ matchOrigin : normalizeOriginForMatch ( url ) ,
2131 host : url . host . toLowerCase ( ) ,
2232 hostname : url . hostname . toLowerCase ( ) ,
2333 } ;
@@ -26,6 +36,17 @@ function parseOrigin(
2636 }
2737}
2838
39+ function normalizeAllowedOrigin ( originRaw : string ) : string | null {
40+ const trimmed = originRaw . trim ( ) ;
41+ if ( ! trimmed ) {
42+ return null ;
43+ }
44+ if ( trimmed === "*" ) {
45+ return "*" ;
46+ }
47+ return parseOrigin ( trimmed ) ?. matchOrigin ?? null ;
48+ }
49+
2950export function checkBrowserOrigin ( params : {
3051 requestHost ?: string ;
3152 origin ?: string ;
@@ -39,9 +60,9 @@ export function checkBrowserOrigin(params: {
3960 }
4061
4162 const allowlist = new Set (
42- ( params . allowedOrigins ?? [ ] ) . map ( ( value ) => value . trim ( ) . toLowerCase ( ) ) . filter ( Boolean ) ,
63+ ( params . allowedOrigins ?? [ ] ) . map ( normalizeAllowedOrigin ) . filter ( Boolean ) ,
4364 ) ;
44- if ( allowlist . has ( "*" ) || allowlist . has ( parsedOrigin . origin ) ) {
65+ if ( allowlist . has ( "*" ) || allowlist . has ( parsedOrigin . matchOrigin ) ) {
4566 return { ok : true , matchedBy : "allowlist" } ;
4667 }
4768
0 commit comments