@@ -21,7 +21,12 @@ export function getAllowedOrigins() {
2121
2222 // Vercel preview deployment support - match any Vercel preview URL
2323 const vercelPreviewRegexes = [
24+ // Standard preview URLs: project-branch-username.vercel.app
2425 / ^ h t t p s : \/ \/ [ a - z A - Z 0 - 9 - ] + - [ a - z A - Z 0 - 9 - ] + - [ a - z A - Z 0 - 9 - ] + \. v e r c e l \. a p p $ / ,
26+ // Shortened preview URLs: project-username.vercel.app
27+ / ^ h t t p s : \/ \/ [ a - z A - Z 0 - 9 - ] + - [ a - z A - Z 0 - 9 - ] + \. v e r c e l \. a p p $ / ,
28+ // Any subdomain on vercel.app (most permissive)
29+ / ^ h t t p s : \/ \/ [ a - z A - Z 0 - 9 - ] + \. v e r c e l \. a p p $ / ,
2530 ] ;
2631
2732 return {
@@ -88,19 +93,38 @@ export function validateRequest(req, res, allowedMethod) {
8893 }
8994
9095 // Referer validation for docs context
91- if (
92- referer &&
93- // Check if referer starts with any allowed origin
94- ! ALLOWED_ORIGINS . originsList . some ( ( allowed ) => referer . startsWith ( allowed ) ) &&
95- // Check if referer matches any regex pattern
96- ! ALLOWED_ORIGINS . regexPatterns . some ( ( pattern ) =>
97- pattern . test ( referer . split ( "/" ) [ 0 ] + "//" + referer . split ( "/" ) [ 2 ] ) ) &&
98- // Allow if it contains the docs path
99- ! referer . includes ( "/docs/connect/" )
100- ) {
101- return res . status ( 403 ) . json ( {
102- error : "Access denied" ,
103- } ) ;
96+ if ( referer ) {
97+ // Extract the origin part of the referer URL (protocol + hostname)
98+ let refererOrigin ;
99+ try {
100+ // Try to parse the referer as a URL
101+ const refererUrl = new URL ( referer ) ;
102+ refererOrigin = refererUrl . origin ;
103+ } catch ( e ) {
104+ // If parsing fails, construct it manually
105+ const parts = referer . split ( "/" ) ;
106+ if ( parts . length >= 3 ) {
107+ refererOrigin = parts [ 0 ] + "//" + parts [ 2 ] ;
108+ }
109+ }
110+
111+ // Check if the referer origin is allowed
112+ const isRefererAllowed =
113+ // Check if referer matches allowed origins list
114+ ALLOWED_ORIGINS . originsList . some ( ( allowed ) => referer . startsWith ( allowed ) ) ||
115+ // Check if referer origin matches any regex pattern
116+ ( refererOrigin &&
117+ ALLOWED_ORIGINS . regexPatterns . some ( ( pattern ) =>
118+ pattern . test ( refererOrigin ) )
119+ ) ||
120+ // Allow if it contains the docs path
121+ referer . includes ( "/docs/connect/" ) ;
122+
123+ if ( ! isRefererAllowed ) {
124+ return res . status ( 403 ) . json ( {
125+ error : "Access denied" ,
126+ } ) ;
127+ }
104128 }
105129
106130 // Request token validation to prevent API automation
0 commit comments