diff --git a/changelog.md b/changelog.md index 220ffe0..34f1d63 100644 --- a/changelog.md +++ b/changelog.md @@ -1,5 +1,13 @@ # Changelog +## 2026-02-13 - 5.4.2 - fix(dcrouter) +improve domain pattern matching to support routing-glob and wildcard patterns and use matching logic when resolving routes + +- Support routing-glob patterns beginning with '*' (e.g. *example.com) to match base domain, wildcard form, and subdomains +- Treat standard wildcard patterns ('*.example.com') as matching both the base domain (example.com) and its subdomains +- Use isDomainMatch when resolving routes instead of exact array includes to allow pattern matching +- Normalize domain and pattern to lowercase and simplify equality checks + ## 2026-02-13 - 5.4.1 - fix(network,dcrouter) Always register SmartProxy certificate event handlers and include total bytes + improved connection metrics in network stats/UI diff --git a/ts/00_commitinfo_data.ts b/ts/00_commitinfo_data.ts index e65a7c1..dc40c7c 100644 --- a/ts/00_commitinfo_data.ts +++ b/ts/00_commitinfo_data.ts @@ -3,6 +3,6 @@ */ export const commitinfo = { name: '@serve.zone/dcrouter', - version: '5.4.1', + version: '5.4.2', description: 'A multifaceted routing service handling mail and SMS delivery functions.' } diff --git a/ts/classes.dcrouter.ts b/ts/classes.dcrouter.ts index 30fcead..68d3682 100644 --- a/ts/classes.dcrouter.ts +++ b/ts/classes.dcrouter.ts @@ -674,24 +674,25 @@ export class DcRouter { * @returns Whether the domain matches the pattern */ private isDomainMatch(domain: string, pattern: string): boolean { - // Normalize inputs domain = domain.toLowerCase(); pattern = pattern.toLowerCase(); - - // Check for exact match - if (domain === pattern) { - return true; + + if (domain === pattern) return true; + + // Routing-glob: *example.com matches example.com, sub.example.com, *.example.com + if (pattern.startsWith('*') && !pattern.startsWith('*.')) { + const baseDomain = pattern.slice(1); // *nevermind.cloud → nevermind.cloud + if (domain === baseDomain || domain === `*.${baseDomain}`) return true; + if (domain.endsWith(baseDomain) && domain.length > baseDomain.length) return true; } - - // Check for wildcard match (*.example.com) + + // Standard wildcard: *.example.com matches sub.example.com and example.com if (pattern.startsWith('*.')) { - const patternSuffix = pattern.slice(2); // Remove the "*." prefix - - // Check if domain ends with the pattern suffix and has at least one character before it - return domain.endsWith(patternSuffix) && domain.length > patternSuffix.length; + const suffix = pattern.slice(2); + if (domain === suffix) return true; + return domain.endsWith(suffix) && domain.length > suffix.length; } - - // No match + return false; } @@ -705,7 +706,9 @@ export class DcRouter { const routeDomains = Array.isArray(route.match.domains) ? route.match.domains : [route.match.domains]; - if (routeDomains.includes(domain)) return route.name; + for (const pattern of routeDomains) { + if (this.isDomainMatch(domain, pattern)) return route.name; + } } return undefined; } diff --git a/ts_web/00_commitinfo_data.ts b/ts_web/00_commitinfo_data.ts index e65a7c1..dc40c7c 100644 --- a/ts_web/00_commitinfo_data.ts +++ b/ts_web/00_commitinfo_data.ts @@ -3,6 +3,6 @@ */ export const commitinfo = { name: '@serve.zone/dcrouter', - version: '5.4.1', + version: '5.4.2', description: 'A multifaceted routing service handling mail and SMS delivery functions.' }