originGuard.js (1401B)
1 import { MSG } from './messages.js'; 2 import { sendError } from './utils.js'; 3 4 const DEFAULT_ORIGINS = [ 5 'http://localhost:41737', 6 'http://127.0.0.1:41737', 7 ]; 8 9 let allowedOrigins = [...DEFAULT_ORIGINS]; 10 11 export function parseAllowedOrigins(value) { 12 if (!value || value.trim() === '') { 13 return [...DEFAULT_ORIGINS]; 14 } 15 return value 16 .split(',') 17 .map((origin) => origin.trim()) 18 .filter(Boolean); 19 } 20 21 export function setAllowedOrigins(origins) { 22 allowedOrigins = origins.length > 0 ? origins : [...DEFAULT_ORIGINS]; 23 } 24 25 export function getAllowedOrigins() { 26 return allowedOrigins; 27 } 28 29 function normalizeOrigin(urlString) { 30 try { 31 const url = new URL(urlString); 32 return `${url.protocol}//${url.host}`; 33 } catch { 34 return null; 35 } 36 } 37 38 function resolveRequestOrigin(req) { 39 const origin = req.headers.origin; 40 if (origin) { 41 return normalizeOrigin(origin); 42 } 43 44 const referer = req.headers.referer; 45 if (referer) { 46 return normalizeOrigin(referer); 47 } 48 49 return null; 50 } 51 52 export function requireAllowedOrigin(req, res, next) { 53 const requestOrigin = resolveRequestOrigin(req); 54 55 if (!requestOrigin || !allowedOrigins.includes(requestOrigin)) { 56 console.warn( 57 `[origin-guard] blocked POST /documents origin=${requestOrigin ?? 'missing'}`, 58 ); 59 return sendError(res, 403, 'ORIGIN_NOT_ALLOWED', MSG.ORIGIN_NOT_ALLOWED); 60 } 61 62 return next(); 63 }