From c8f19cf7834a1f6578b86d24805a75cc2382a299 Mon Sep 17 00:00:00 2001 From: Juergen Kunz Date: Sat, 4 Apr 2026 19:29:49 +0000 Subject: [PATCH] fix(route-management): include stored VPN routes in domain resolution and align programmatic route types with dcrouter configs --- changelog.md | 7 +++++++ package.json | 2 +- pnpm-lock.yaml | 10 +++++----- ts/00_commitinfo_data.ts | 2 +- ts/classes.dcrouter.ts | 20 ++++++++++++++++++++ ts/config/classes.route-config-manager.ts | 6 +++--- ts/db/documents/classes.stored-route.doc.ts | 3 ++- ts_interfaces/data/route-management.ts | 5 +++-- ts_interfaces/requests/route-management.ts | 5 +++-- ts_web/00_commitinfo_data.ts | 2 +- 10 files changed, 46 insertions(+), 16 deletions(-) diff --git a/changelog.md b/changelog.md index 5ae7ac9..cfc7593 100644 --- a/changelog.md +++ b/changelog.md @@ -1,5 +1,12 @@ # Changelog +## 2026-04-04 - 12.9.3 - fix(route-management) +include stored VPN routes in domain resolution and align programmatic route types with dcrouter configs + +- Scans enabled stored/programmatic routes for VPN domain matches when resolving client access domains. +- Replaces generic smartproxy route typings with IDcRouterRouteConfig across route management and stored route models. +- Updates @push.rocks/smartproxy to ^27.4.0. + ## 2026-04-04 - 12.9.2 - fix(config-ui) handle missing HTTP/3 config safely and standardize overview section headings diff --git a/package.json b/package.json index be1e70c..8502622 100644 --- a/package.json +++ b/package.json @@ -53,7 +53,7 @@ "@push.rocks/smartnetwork": "^4.5.2", "@push.rocks/smartpath": "^6.0.0", "@push.rocks/smartpromise": "^4.2.3", - "@push.rocks/smartproxy": "^27.3.1", + "@push.rocks/smartproxy": "^27.4.0", "@push.rocks/smartradius": "^1.1.1", "@push.rocks/smartrequest": "^5.0.1", "@push.rocks/smartrx": "^3.0.10", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9ddd574..7dcd44d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -78,8 +78,8 @@ importers: specifier: ^4.2.3 version: 4.2.3 '@push.rocks/smartproxy': - specifier: ^27.3.1 - version: 27.3.1 + specifier: ^27.4.0 + version: 27.4.0 '@push.rocks/smartradius': specifier: ^1.1.1 version: 1.1.1 @@ -1279,8 +1279,8 @@ packages: '@push.rocks/smartpromise@4.2.3': resolution: {integrity: sha512-Ycg/TJR+tMt+S3wSFurOpEoW6nXv12QBtKXgBcjMZ4RsdO28geN46U09osPn9N9WuwQy1PkmTV5J/V4F9U8qEw==} - '@push.rocks/smartproxy@27.3.1': - resolution: {integrity: sha512-h5RK0WJFCwbv/Mq2euIyUCIqaC/aI5S/hM0TNxlFhT4tAQomBQ7Ufs+10R9wAXbjb9O/7zkqVjLxXhmE/3v9TA==} + '@push.rocks/smartproxy@27.4.0': + resolution: {integrity: sha512-r6ym6+FpiHHLFgCdY0KfCe8s2eLuLUU/daXIcKwsmMHNY3BOlBIxwN5CL17+v2Hvh7Lg2JWBY+1L7/7ehYXj1w==} '@push.rocks/smartpuppeteer@2.0.5': resolution: {integrity: sha512-yK/qSeWVHIGWRp3c8S5tfdGP6WCKllZC4DR8d8CQlEjszOSBmHtlTdyyqOMBZ/BA4kd+eU5f3A1r4K2tGYty1g==} @@ -6522,7 +6522,7 @@ snapshots: '@push.rocks/smartpromise@4.2.3': {} - '@push.rocks/smartproxy@27.3.1': + '@push.rocks/smartproxy@27.4.0': dependencies: '@push.rocks/smartcrypto': 2.0.4 '@push.rocks/smartlog': 3.2.1 diff --git a/ts/00_commitinfo_data.ts b/ts/00_commitinfo_data.ts index f61350b..32295e8 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: '12.9.2', + version: '12.9.3', description: 'A multifaceted routing service handling mail and SMS delivery functions.' } diff --git a/ts/classes.dcrouter.ts b/ts/classes.dcrouter.ts index 6fa9784..51d7d26 100644 --- a/ts/classes.dcrouter.ts +++ b/ts/classes.dcrouter.ts @@ -2164,6 +2164,26 @@ export class DcRouter { } } + // Also scan stored/programmatic routes + const storedRoutes = this.routeConfigManager?.getStoredRoutes(); + if (storedRoutes) { + for (const [, stored] of storedRoutes) { + if (!stored.enabled) continue; + const dcRoute = stored.route as import('../ts_interfaces/data/remoteingress.js').IDcRouterRouteConfig; + if (!dcRoute.vpn?.enabled) continue; + + const routeTags = dcRoute.vpn.allowedServerDefinedClientTags; + if (!routeTags?.length || clientTags.some(t => routeTags.includes(t))) { + const domains = (stored.route.match as any)?.domains; + if (Array.isArray(domains)) { + for (const d of domains) { + domainsToResolve.add(d.replace(/^\*\./, '')); + } + } + } + } + } + // Resolve DNS A records for matched domains (with caching) for (const domain of domainsToResolve) { const resolvedIps = await this.resolveVpnDomainIPs(domain); diff --git a/ts/config/classes.route-config-manager.ts b/ts/config/classes.route-config-manager.ts index 0ae2e88..2382224 100644 --- a/ts/config/classes.route-config-manager.ts +++ b/ts/config/classes.route-config-manager.ts @@ -83,7 +83,7 @@ export class RouteConfigManager { // ========================================================================= public async createRoute( - route: plugins.smartproxy.IRouteConfig, + route: IDcRouterRouteConfig, createdBy: string, enabled = true, metadata?: IRouteMetadata, @@ -123,7 +123,7 @@ export class RouteConfigManager { public async updateRoute( id: string, patch: { - route?: Partial; + route?: Partial; enabled?: boolean; metadata?: Partial; }, @@ -132,7 +132,7 @@ export class RouteConfigManager { if (!stored) return false; if (patch.route) { - stored.route = { ...stored.route, ...patch.route } as plugins.smartproxy.IRouteConfig; + stored.route = { ...stored.route, ...patch.route } as IDcRouterRouteConfig; } if (patch.enabled !== undefined) { stored.enabled = patch.enabled; diff --git a/ts/db/documents/classes.stored-route.doc.ts b/ts/db/documents/classes.stored-route.doc.ts index 542bcc2..cbc2dff 100644 --- a/ts/db/documents/classes.stored-route.doc.ts +++ b/ts/db/documents/classes.stored-route.doc.ts @@ -1,6 +1,7 @@ import * as plugins from '../../plugins.js'; import { DcRouterDb } from '../classes.dcrouter-db.js'; import type { IRouteMetadata } from '../../../ts_interfaces/data/route-management.js'; +import type { IDcRouterRouteConfig } from '../../../ts_interfaces/data/remoteingress.js'; const getDb = () => DcRouterDb.getInstance().getDb(); @@ -11,7 +12,7 @@ export class StoredRouteDoc extends plugins.smartdata.SmartDataDbDoc; @@ -77,7 +78,7 @@ export interface IRouteMetadata { * A merged route combining hardcoded and programmatic sources. */ export interface IMergedRoute { - route: IRouteConfig; + route: IDcRouterRouteConfig; source: 'hardcoded' | 'programmatic'; enabled: boolean; overridden: boolean; @@ -118,7 +119,7 @@ export interface IApiTokenInfo { */ export interface IStoredRoute { id: string; - route: IRouteConfig; + route: IDcRouterRouteConfig; enabled: boolean; createdAt: number; updatedAt: number; diff --git a/ts_interfaces/requests/route-management.ts b/ts_interfaces/requests/route-management.ts index 698bd65..c87e6b5 100644 --- a/ts_interfaces/requests/route-management.ts +++ b/ts_interfaces/requests/route-management.ts @@ -2,6 +2,7 @@ import * as plugins from '../plugins.js'; import type * as authInterfaces from '../data/auth.js'; import type { IMergedRoute, IRouteWarning, IRouteMetadata } from '../data/route-management.js'; import type { IRouteConfig } from '@push.rocks/smartproxy'; +import type { IDcRouterRouteConfig } from '../data/remoteingress.js'; // ============================================================================ // Route Management Endpoints @@ -36,7 +37,7 @@ export interface IReq_CreateRoute extends plugins.typedrequestInterfaces.impleme request: { identity?: authInterfaces.IIdentity; apiToken?: string; - route: IRouteConfig; + route: IDcRouterRouteConfig; enabled?: boolean; metadata?: IRouteMetadata; }; @@ -59,7 +60,7 @@ export interface IReq_UpdateRoute extends plugins.typedrequestInterfaces.impleme identity?: authInterfaces.IIdentity; apiToken?: string; id: string; - route?: Partial; + route?: Partial; enabled?: boolean; metadata?: Partial; }; diff --git a/ts_web/00_commitinfo_data.ts b/ts_web/00_commitinfo_data.ts index f61350b..32295e8 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: '12.9.2', + version: '12.9.3', description: 'A multifaceted routing service handling mail and SMS delivery functions.' }