@serve.zone/dcrouter 11.14.0 → 11.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist_serve/bundle.js +5 -9
- package/dist_ts/00_commitinfo_data.d.ts +8 -0
- package/dist_ts/00_commitinfo_data.js +9 -0
- package/dist_ts/cache/classes.cache.cleaner.d.ts +47 -0
- package/dist_ts/cache/classes.cache.cleaner.js +130 -0
- package/dist_ts/cache/classes.cached.document.d.ts +76 -0
- package/dist_ts/cache/classes.cached.document.js +100 -0
- package/dist_ts/cache/classes.cachedb.d.ts +60 -0
- package/dist_ts/cache/classes.cachedb.js +126 -0
- package/dist_ts/cache/documents/classes.cached.email.d.ts +125 -0
- package/dist_ts/cache/documents/classes.cached.email.js +337 -0
- package/dist_ts/cache/documents/classes.cached.ip.reputation.d.ts +119 -0
- package/dist_ts/cache/documents/classes.cached.ip.reputation.js +323 -0
- package/dist_ts/cache/documents/index.d.ts +2 -0
- package/dist_ts/cache/documents/index.js +3 -0
- package/dist_ts/cache/index.d.ts +4 -0
- package/dist_ts/cache/index.js +7 -0
- package/dist_ts/classes.cert-provision-scheduler.d.ts +54 -0
- package/dist_ts/classes.cert-provision-scheduler.js +118 -0
- package/dist_ts/classes.dcrouter.d.ts +399 -0
- package/dist_ts/classes.dcrouter.js +1697 -0
- package/dist_ts/classes.storage-cert-manager.d.ts +18 -0
- package/dist_ts/classes.storage-cert-manager.js +43 -0
- package/dist_ts/config/classes.api-token-manager.d.ts +46 -0
- package/dist_ts/config/classes.api-token-manager.js +150 -0
- package/dist_ts/config/classes.route-config-manager.d.ts +38 -0
- package/dist_ts/config/classes.route-config-manager.js +257 -0
- package/dist_ts/config/index.d.ts +3 -0
- package/dist_ts/config/index.js +5 -0
- package/dist_ts/config/validator.d.ts +104 -0
- package/dist_ts/config/validator.js +152 -0
- package/dist_ts/errors/base.errors.d.ts +224 -0
- package/dist_ts/errors/base.errors.js +320 -0
- package/dist_ts/errors/error-handler.d.ts +98 -0
- package/dist_ts/errors/error-handler.js +282 -0
- package/dist_ts/errors/error.codes.d.ts +115 -0
- package/dist_ts/errors/error.codes.js +136 -0
- package/dist_ts/errors/index.d.ts +54 -0
- package/dist_ts/errors/index.js +136 -0
- package/dist_ts/errors/reputation.errors.d.ts +183 -0
- package/dist_ts/errors/reputation.errors.js +292 -0
- package/dist_ts/http3/http3-route-augmentation.d.ts +50 -0
- package/dist_ts/http3/http3-route-augmentation.js +98 -0
- package/dist_ts/http3/index.d.ts +1 -0
- package/dist_ts/http3/index.js +2 -0
- package/dist_ts/index.d.ts +8 -0
- package/dist_ts/index.js +29 -0
- package/dist_ts/logger.d.ts +21 -0
- package/dist_ts/logger.js +81 -0
- package/dist_ts/monitoring/classes.metricscache.d.ts +32 -0
- package/dist_ts/monitoring/classes.metricscache.js +63 -0
- package/dist_ts/monitoring/classes.metricsmanager.d.ts +184 -0
- package/dist_ts/monitoring/classes.metricsmanager.js +744 -0
- package/dist_ts/monitoring/index.d.ts +1 -0
- package/dist_ts/monitoring/index.js +2 -0
- package/dist_ts/opsserver/classes.opsserver.d.ts +38 -0
- package/dist_ts/opsserver/classes.opsserver.js +87 -0
- package/dist_ts/opsserver/handlers/admin.handler.d.ts +31 -0
- package/dist_ts/opsserver/handlers/admin.handler.js +180 -0
- package/dist_ts/opsserver/handlers/api-token.handler.d.ts +6 -0
- package/dist_ts/opsserver/handlers/api-token.handler.js +62 -0
- package/dist_ts/opsserver/handlers/certificate.handler.d.ts +32 -0
- package/dist_ts/opsserver/handlers/certificate.handler.js +421 -0
- package/dist_ts/opsserver/handlers/config.handler.d.ts +7 -0
- package/dist_ts/opsserver/handlers/config.handler.js +192 -0
- package/dist_ts/opsserver/handlers/email-ops.handler.d.ts +30 -0
- package/dist_ts/opsserver/handlers/email-ops.handler.js +227 -0
- package/dist_ts/opsserver/handlers/index.d.ts +12 -0
- package/dist_ts/opsserver/handlers/index.js +13 -0
- package/dist_ts/opsserver/handlers/logs.handler.d.ts +25 -0
- package/dist_ts/opsserver/handlers/logs.handler.js +256 -0
- package/dist_ts/opsserver/handlers/radius.handler.d.ts +6 -0
- package/dist_ts/opsserver/handlers/radius.handler.js +295 -0
- package/dist_ts/opsserver/handlers/remoteingress.handler.d.ts +6 -0
- package/dist_ts/opsserver/handlers/remoteingress.handler.js +156 -0
- package/dist_ts/opsserver/handlers/route-management.handler.d.ts +14 -0
- package/dist_ts/opsserver/handlers/route-management.handler.js +117 -0
- package/dist_ts/opsserver/handlers/security.handler.d.ts +9 -0
- package/dist_ts/opsserver/handlers/security.handler.js +233 -0
- package/dist_ts/opsserver/handlers/stats.handler.d.ts +11 -0
- package/dist_ts/opsserver/handlers/stats.handler.js +403 -0
- package/dist_ts/opsserver/handlers/vpn.handler.d.ts +6 -0
- package/dist_ts/opsserver/handlers/vpn.handler.js +197 -0
- package/dist_ts/opsserver/helpers/guards.d.ts +27 -0
- package/dist_ts/opsserver/helpers/guards.js +43 -0
- package/dist_ts/opsserver/index.d.ts +1 -0
- package/dist_ts/opsserver/index.js +2 -0
- package/dist_ts/paths.d.ts +26 -0
- package/dist_ts/paths.js +45 -0
- package/dist_ts/plugins.d.ts +81 -0
- package/dist_ts/plugins.js +115 -0
- package/dist_ts/radius/classes.accounting.manager.d.ts +231 -0
- package/dist_ts/radius/classes.accounting.manager.js +462 -0
- package/dist_ts/radius/classes.radius.server.d.ts +171 -0
- package/dist_ts/radius/classes.radius.server.js +386 -0
- package/dist_ts/radius/classes.vlan.manager.d.ts +128 -0
- package/dist_ts/radius/classes.vlan.manager.js +279 -0
- package/dist_ts/radius/index.d.ts +13 -0
- package/dist_ts/radius/index.js +14 -0
- package/dist_ts/remoteingress/classes.remoteingress-manager.d.ts +94 -0
- package/dist_ts/remoteingress/classes.remoteingress-manager.js +271 -0
- package/dist_ts/remoteingress/classes.tunnel-manager.d.ts +59 -0
- package/dist_ts/remoteingress/classes.tunnel-manager.js +165 -0
- package/dist_ts/remoteingress/index.d.ts +2 -0
- package/dist_ts/remoteingress/index.js +3 -0
- package/dist_ts/security/classes.contentscanner.d.ts +164 -0
- package/dist_ts/security/classes.contentscanner.js +642 -0
- package/dist_ts/security/classes.ipreputationchecker.d.ts +160 -0
- package/dist_ts/security/classes.ipreputationchecker.js +537 -0
- package/dist_ts/security/classes.securitylogger.d.ts +144 -0
- package/dist_ts/security/classes.securitylogger.js +235 -0
- package/dist_ts/security/index.d.ts +3 -0
- package/dist_ts/security/index.js +4 -0
- package/dist_ts/sms/classes.smsservice.d.ts +15 -0
- package/dist_ts/sms/classes.smsservice.js +72 -0
- package/dist_ts/sms/config/sms.config.d.ts +93 -0
- package/dist_ts/sms/config/sms.config.js +2 -0
- package/dist_ts/sms/config/sms.schema.d.ts +5 -0
- package/dist_ts/sms/config/sms.schema.js +121 -0
- package/dist_ts/sms/index.d.ts +1 -0
- package/dist_ts/sms/index.js +2 -0
- package/dist_ts/storage/classes.storagemanager.d.ts +83 -0
- package/dist_ts/storage/classes.storagemanager.js +348 -0
- package/dist_ts/storage/index.d.ts +1 -0
- package/dist_ts/storage/index.js +3 -0
- package/dist_ts/vpn/classes.vpn-manager.d.ts +129 -0
- package/dist_ts/vpn/classes.vpn-manager.js +329 -0
- package/dist_ts/vpn/index.d.ts +1 -0
- package/dist_ts/vpn/index.js +2 -0
- package/dist_ts_apiclient/classes.apitoken.d.ts +41 -0
- package/dist_ts_apiclient/classes.apitoken.js +115 -0
- package/dist_ts_apiclient/classes.certificate.d.ts +57 -0
- package/dist_ts_apiclient/classes.certificate.js +69 -0
- package/dist_ts_apiclient/classes.config.d.ts +7 -0
- package/dist_ts_apiclient/classes.config.js +11 -0
- package/dist_ts_apiclient/classes.dcrouterapiclient.d.ts +41 -0
- package/dist_ts_apiclient/classes.dcrouterapiclient.js +81 -0
- package/dist_ts_apiclient/classes.email.d.ts +30 -0
- package/dist_ts_apiclient/classes.email.js +52 -0
- package/dist_ts_apiclient/classes.logs.d.ts +21 -0
- package/dist_ts_apiclient/classes.logs.js +14 -0
- package/dist_ts_apiclient/classes.radius.d.ts +59 -0
- package/dist_ts_apiclient/classes.radius.js +95 -0
- package/dist_ts_apiclient/classes.remoteingress.d.ts +54 -0
- package/dist_ts_apiclient/classes.remoteingress.js +136 -0
- package/dist_ts_apiclient/classes.route.d.ts +42 -0
- package/dist_ts_apiclient/classes.route.js +154 -0
- package/dist_ts_apiclient/classes.stats.d.ts +47 -0
- package/dist_ts_apiclient/classes.stats.js +38 -0
- package/dist_ts_apiclient/index.d.ts +10 -0
- package/dist_ts_apiclient/index.js +14 -0
- package/dist_ts_apiclient/plugins.d.ts +3 -0
- package/dist_ts_apiclient/plugins.js +5 -0
- package/dist_ts_interfaces/data/remoteingress.d.ts +2 -0
- package/dist_ts_interfaces/data/vpn.d.ts +1 -2
- package/dist_ts_interfaces/requests/vpn.d.ts +1 -1
- package/dist_ts_web/00_commitinfo_data.d.ts +8 -0
- package/dist_ts_web/00_commitinfo_data.js +9 -0
- package/dist_ts_web/appstate.d.ts +238 -0
- package/dist_ts_web/appstate.js +1174 -0
- package/dist_ts_web/elements/index.d.ts +13 -0
- package/dist_ts_web/elements/index.js +14 -0
- package/dist_ts_web/elements/ops-dashboard.d.ts +23 -0
- package/dist_ts_web/elements/ops-dashboard.js +323 -0
- package/dist_ts_web/elements/ops-view-apitokens.d.ts +13 -0
- package/dist_ts_web/elements/ops-view-apitokens.js +371 -0
- package/dist_ts_web/elements/ops-view-certificates.d.ts +22 -0
- package/dist_ts_web/elements/ops-view-certificates.js +528 -0
- package/dist_ts_web/elements/ops-view-config.d.ts +19 -0
- package/dist_ts_web/elements/ops-view-config.js +339 -0
- package/dist_ts_web/elements/ops-view-emails.d.ts +21 -0
- package/dist_ts_web/elements/ops-view-emails.js +165 -0
- package/dist_ts_web/elements/ops-view-logs.d.ts +13 -0
- package/dist_ts_web/elements/ops-view-logs.js +159 -0
- package/dist_ts_web/elements/ops-view-network.d.ts +71 -0
- package/dist_ts_web/elements/ops-view-network.js +764 -0
- package/dist_ts_web/elements/ops-view-overview.d.ts +22 -0
- package/dist_ts_web/elements/ops-view-overview.js +456 -0
- package/dist_ts_web/elements/ops-view-remoteingress.d.ts +20 -0
- package/dist_ts_web/elements/ops-view-remoteingress.js +494 -0
- package/dist_ts_web/elements/ops-view-routes.d.ts +12 -0
- package/dist_ts_web/elements/ops-view-routes.js +404 -0
- package/dist_ts_web/elements/ops-view-security.d.ts +21 -0
- package/dist_ts_web/elements/ops-view-security.js +574 -0
- package/dist_ts_web/elements/ops-view-vpn.d.ts +14 -0
- package/dist_ts_web/elements/ops-view-vpn.js +365 -0
- package/dist_ts_web/elements/shared/css.d.ts +1 -0
- package/dist_ts_web/elements/shared/css.js +10 -0
- package/dist_ts_web/elements/shared/index.d.ts +2 -0
- package/dist_ts_web/elements/shared/index.js +3 -0
- package/dist_ts_web/elements/shared/ops-sectionheading.d.ts +5 -0
- package/dist_ts_web/elements/shared/ops-sectionheading.js +82 -0
- package/dist_ts_web/index.d.ts +1 -0
- package/dist_ts_web/index.js +10 -0
- package/dist_ts_web/plugins.d.ts +6 -0
- package/dist_ts_web/plugins.js +11 -0
- package/dist_ts_web/router.d.ts +19 -0
- package/dist_ts_web/router.js +91 -0
- package/package.json +2 -2
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/classes.dcrouter.ts +51 -20
- package/ts/config/classes.route-config-manager.ts +7 -6
- package/ts/opsserver/handlers/vpn.handler.ts +3 -5
- package/ts/vpn/classes.vpn-manager.ts +68 -19
- package/ts_web/00_commitinfo_data.ts +1 -1
- package/ts_web/appstate.ts +2 -2
- package/ts_web/elements/ops-view-vpn.ts +5 -9
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
import { StorageManager } from './storage/index.js';
|
|
3
|
+
/**
|
|
4
|
+
* ICertManager implementation backed by StorageManager.
|
|
5
|
+
* Persists SmartAcme certificates under a /certs/ key prefix so they
|
|
6
|
+
* survive process restarts without re-hitting ACME.
|
|
7
|
+
*/
|
|
8
|
+
export declare class StorageBackedCertManager implements plugins.smartacme.ICertManager {
|
|
9
|
+
private storageManager;
|
|
10
|
+
private keyPrefix;
|
|
11
|
+
constructor(storageManager: StorageManager);
|
|
12
|
+
init(): Promise<void>;
|
|
13
|
+
retrieveCertificate(domainName: string): Promise<plugins.smartacme.Cert | null>;
|
|
14
|
+
storeCertificate(cert: plugins.smartacme.Cert): Promise<void>;
|
|
15
|
+
deleteCertificate(domainName: string): Promise<void>;
|
|
16
|
+
close(): Promise<void>;
|
|
17
|
+
wipe(): Promise<void>;
|
|
18
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
import { StorageManager } from './storage/index.js';
|
|
3
|
+
/**
|
|
4
|
+
* ICertManager implementation backed by StorageManager.
|
|
5
|
+
* Persists SmartAcme certificates under a /certs/ key prefix so they
|
|
6
|
+
* survive process restarts without re-hitting ACME.
|
|
7
|
+
*/
|
|
8
|
+
export class StorageBackedCertManager {
|
|
9
|
+
storageManager;
|
|
10
|
+
keyPrefix = '/certs/';
|
|
11
|
+
constructor(storageManager) {
|
|
12
|
+
this.storageManager = storageManager;
|
|
13
|
+
}
|
|
14
|
+
async init() { }
|
|
15
|
+
async retrieveCertificate(domainName) {
|
|
16
|
+
const data = await this.storageManager.getJSON(this.keyPrefix + domainName);
|
|
17
|
+
if (!data)
|
|
18
|
+
return null;
|
|
19
|
+
return new plugins.smartacme.Cert(data);
|
|
20
|
+
}
|
|
21
|
+
async storeCertificate(cert) {
|
|
22
|
+
await this.storageManager.setJSON(this.keyPrefix + cert.domainName, {
|
|
23
|
+
id: cert.id,
|
|
24
|
+
domainName: cert.domainName,
|
|
25
|
+
created: cert.created,
|
|
26
|
+
privateKey: cert.privateKey,
|
|
27
|
+
publicKey: cert.publicKey,
|
|
28
|
+
csr: cert.csr,
|
|
29
|
+
validUntil: cert.validUntil,
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
async deleteCertificate(domainName) {
|
|
33
|
+
await this.storageManager.delete(this.keyPrefix + domainName);
|
|
34
|
+
}
|
|
35
|
+
async close() { }
|
|
36
|
+
async wipe() {
|
|
37
|
+
const keys = await this.storageManager.list(this.keyPrefix);
|
|
38
|
+
for (const key of keys) {
|
|
39
|
+
await this.storageManager.delete(key);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5zdG9yYWdlLWNlcnQtbWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL2NsYXNzZXMuc3RvcmFnZS1jZXJ0LW1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFDeEMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRXBEOzs7O0dBSUc7QUFDSCxNQUFNLE9BQU8sd0JBQXdCO0lBR2Y7SUFGWixTQUFTLEdBQUcsU0FBUyxDQUFDO0lBRTlCLFlBQW9CLGNBQThCO1FBQTlCLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtJQUFHLENBQUM7SUFFdEQsS0FBSyxDQUFDLElBQUksS0FBbUIsQ0FBQztJQUU5QixLQUFLLENBQUMsbUJBQW1CLENBQUMsVUFBa0I7UUFDMUMsTUFBTSxJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLFVBQVUsQ0FBQyxDQUFDO1FBQzVFLElBQUksQ0FBQyxJQUFJO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDdkIsT0FBTyxJQUFJLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRCxLQUFLLENBQUMsZ0JBQWdCLENBQUMsSUFBNEI7UUFDakQsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDbEUsRUFBRSxFQUFFLElBQUksQ0FBQyxFQUFFO1lBQ1gsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVO1lBQzNCLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztZQUNyQixVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVU7WUFDM0IsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTO1lBQ3pCLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRztZQUNiLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVTtTQUM1QixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsS0FBSyxDQUFDLGlCQUFpQixDQUFDLFVBQWtCO1FBQ3hDLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxVQUFVLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBRUQsS0FBSyxDQUFDLEtBQUssS0FBbUIsQ0FBQztJQUUvQixLQUFLLENBQUMsSUFBSTtRQUNSLE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzVELEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7WUFDdkIsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN4QyxDQUFDO0lBQ0gsQ0FBQztDQUNGIn0=
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { StorageManager } from '../storage/index.js';
|
|
2
|
+
import type { IStoredApiToken, IApiTokenInfo, TApiTokenScope } from '../../dist_ts_interfaces/data/route-management.js';
|
|
3
|
+
export declare class ApiTokenManager {
|
|
4
|
+
private storageManager;
|
|
5
|
+
private tokens;
|
|
6
|
+
constructor(storageManager: StorageManager);
|
|
7
|
+
initialize(): Promise<void>;
|
|
8
|
+
/**
|
|
9
|
+
* Create a new API token. Returns the raw token value (shown once).
|
|
10
|
+
*/
|
|
11
|
+
createToken(name: string, scopes: TApiTokenScope[], expiresInDays: number | null, createdBy: string): Promise<{
|
|
12
|
+
id: string;
|
|
13
|
+
rawToken: string;
|
|
14
|
+
}>;
|
|
15
|
+
/**
|
|
16
|
+
* Validate a raw token string. Returns the stored token if valid, null otherwise.
|
|
17
|
+
* Also updates lastUsedAt.
|
|
18
|
+
*/
|
|
19
|
+
validateToken(rawToken: string): Promise<IStoredApiToken | null>;
|
|
20
|
+
/**
|
|
21
|
+
* Check if a token has a specific scope.
|
|
22
|
+
*/
|
|
23
|
+
hasScope(token: IStoredApiToken, scope: TApiTokenScope): boolean;
|
|
24
|
+
/**
|
|
25
|
+
* List all tokens (safe info only, no hashes).
|
|
26
|
+
*/
|
|
27
|
+
listTokens(): IApiTokenInfo[];
|
|
28
|
+
/**
|
|
29
|
+
* Revoke (delete) a token.
|
|
30
|
+
*/
|
|
31
|
+
revokeToken(id: string): Promise<boolean>;
|
|
32
|
+
/**
|
|
33
|
+
* Roll (regenerate) a token's secret while keeping its identity.
|
|
34
|
+
* Returns the new raw token value (shown once).
|
|
35
|
+
*/
|
|
36
|
+
rollToken(id: string): Promise<{
|
|
37
|
+
id: string;
|
|
38
|
+
rawToken: string;
|
|
39
|
+
} | null>;
|
|
40
|
+
/**
|
|
41
|
+
* Enable or disable a token.
|
|
42
|
+
*/
|
|
43
|
+
toggleToken(id: string, enabled: boolean): Promise<boolean>;
|
|
44
|
+
private loadTokens;
|
|
45
|
+
private persistToken;
|
|
46
|
+
}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import * as plugins from '../plugins.js';
|
|
2
|
+
import { logger } from '../logger.js';
|
|
3
|
+
const TOKENS_PREFIX = '/config-api/tokens/';
|
|
4
|
+
const TOKEN_PREFIX_STR = 'dcr_';
|
|
5
|
+
export class ApiTokenManager {
|
|
6
|
+
storageManager;
|
|
7
|
+
tokens = new Map();
|
|
8
|
+
constructor(storageManager) {
|
|
9
|
+
this.storageManager = storageManager;
|
|
10
|
+
}
|
|
11
|
+
async initialize() {
|
|
12
|
+
await this.loadTokens();
|
|
13
|
+
if (this.tokens.size > 0) {
|
|
14
|
+
logger.log('info', `Loaded ${this.tokens.size} API token(s) from storage`);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
// =========================================================================
|
|
18
|
+
// Token lifecycle
|
|
19
|
+
// =========================================================================
|
|
20
|
+
/**
|
|
21
|
+
* Create a new API token. Returns the raw token value (shown once).
|
|
22
|
+
*/
|
|
23
|
+
async createToken(name, scopes, expiresInDays, createdBy) {
|
|
24
|
+
const id = plugins.uuid.v4();
|
|
25
|
+
const randomBytes = plugins.crypto.randomBytes(32);
|
|
26
|
+
const rawPayload = `${id}:${randomBytes.toString('base64url')}`;
|
|
27
|
+
const rawToken = `${TOKEN_PREFIX_STR}${rawPayload}`;
|
|
28
|
+
const tokenHash = plugins.crypto.createHash('sha256').update(rawToken).digest('hex');
|
|
29
|
+
const now = Date.now();
|
|
30
|
+
const stored = {
|
|
31
|
+
id,
|
|
32
|
+
name,
|
|
33
|
+
tokenHash,
|
|
34
|
+
scopes,
|
|
35
|
+
createdAt: now,
|
|
36
|
+
expiresAt: expiresInDays != null ? now + expiresInDays * 86400000 : null,
|
|
37
|
+
lastUsedAt: null,
|
|
38
|
+
createdBy,
|
|
39
|
+
enabled: true,
|
|
40
|
+
};
|
|
41
|
+
this.tokens.set(id, stored);
|
|
42
|
+
await this.persistToken(stored);
|
|
43
|
+
logger.log('info', `API token '${name}' created (id: ${id})`);
|
|
44
|
+
return { id, rawToken };
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Validate a raw token string. Returns the stored token if valid, null otherwise.
|
|
48
|
+
* Also updates lastUsedAt.
|
|
49
|
+
*/
|
|
50
|
+
async validateToken(rawToken) {
|
|
51
|
+
if (!rawToken.startsWith(TOKEN_PREFIX_STR))
|
|
52
|
+
return null;
|
|
53
|
+
const hash = plugins.crypto.createHash('sha256').update(rawToken).digest('hex');
|
|
54
|
+
for (const stored of this.tokens.values()) {
|
|
55
|
+
if (stored.tokenHash === hash) {
|
|
56
|
+
if (!stored.enabled)
|
|
57
|
+
return null;
|
|
58
|
+
if (stored.expiresAt !== null && stored.expiresAt < Date.now())
|
|
59
|
+
return null;
|
|
60
|
+
// Update lastUsedAt (fire and forget)
|
|
61
|
+
stored.lastUsedAt = Date.now();
|
|
62
|
+
this.persistToken(stored).catch(() => { });
|
|
63
|
+
return stored;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Check if a token has a specific scope.
|
|
70
|
+
*/
|
|
71
|
+
hasScope(token, scope) {
|
|
72
|
+
return token.scopes.includes(scope);
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* List all tokens (safe info only, no hashes).
|
|
76
|
+
*/
|
|
77
|
+
listTokens() {
|
|
78
|
+
const result = [];
|
|
79
|
+
for (const stored of this.tokens.values()) {
|
|
80
|
+
result.push({
|
|
81
|
+
id: stored.id,
|
|
82
|
+
name: stored.name,
|
|
83
|
+
scopes: stored.scopes,
|
|
84
|
+
createdAt: stored.createdAt,
|
|
85
|
+
expiresAt: stored.expiresAt,
|
|
86
|
+
lastUsedAt: stored.lastUsedAt,
|
|
87
|
+
enabled: stored.enabled,
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
return result;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Revoke (delete) a token.
|
|
94
|
+
*/
|
|
95
|
+
async revokeToken(id) {
|
|
96
|
+
if (!this.tokens.has(id))
|
|
97
|
+
return false;
|
|
98
|
+
const token = this.tokens.get(id);
|
|
99
|
+
this.tokens.delete(id);
|
|
100
|
+
await this.storageManager.delete(`${TOKENS_PREFIX}${id}.json`);
|
|
101
|
+
logger.log('info', `API token '${token.name}' revoked (id: ${id})`);
|
|
102
|
+
return true;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Roll (regenerate) a token's secret while keeping its identity.
|
|
106
|
+
* Returns the new raw token value (shown once).
|
|
107
|
+
*/
|
|
108
|
+
async rollToken(id) {
|
|
109
|
+
const stored = this.tokens.get(id);
|
|
110
|
+
if (!stored)
|
|
111
|
+
return null;
|
|
112
|
+
const randomBytes = plugins.crypto.randomBytes(32);
|
|
113
|
+
const rawPayload = `${id}:${randomBytes.toString('base64url')}`;
|
|
114
|
+
const rawToken = `${TOKEN_PREFIX_STR}${rawPayload}`;
|
|
115
|
+
stored.tokenHash = plugins.crypto.createHash('sha256').update(rawToken).digest('hex');
|
|
116
|
+
await this.persistToken(stored);
|
|
117
|
+
logger.log('info', `API token '${stored.name}' rolled (id: ${id})`);
|
|
118
|
+
return { id, rawToken };
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Enable or disable a token.
|
|
122
|
+
*/
|
|
123
|
+
async toggleToken(id, enabled) {
|
|
124
|
+
const stored = this.tokens.get(id);
|
|
125
|
+
if (!stored)
|
|
126
|
+
return false;
|
|
127
|
+
stored.enabled = enabled;
|
|
128
|
+
await this.persistToken(stored);
|
|
129
|
+
logger.log('info', `API token '${stored.name}' ${enabled ? 'enabled' : 'disabled'} (id: ${id})`);
|
|
130
|
+
return true;
|
|
131
|
+
}
|
|
132
|
+
// =========================================================================
|
|
133
|
+
// Private
|
|
134
|
+
// =========================================================================
|
|
135
|
+
async loadTokens() {
|
|
136
|
+
const keys = await this.storageManager.list(TOKENS_PREFIX);
|
|
137
|
+
for (const key of keys) {
|
|
138
|
+
if (!key.endsWith('.json'))
|
|
139
|
+
continue;
|
|
140
|
+
const stored = await this.storageManager.getJSON(key);
|
|
141
|
+
if (stored?.id) {
|
|
142
|
+
this.tokens.set(stored.id, stored);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
async persistToken(stored) {
|
|
147
|
+
await this.storageManager.setJSON(`${TOKENS_PREFIX}${stored.id}.json`, stored);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5hcGktdG9rZW4tbWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzL2NvbmZpZy9jbGFzc2VzLmFwaS10b2tlbi1tYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFRdEMsTUFBTSxhQUFhLEdBQUcscUJBQXFCLENBQUM7QUFDNUMsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLENBQUM7QUFFaEMsTUFBTSxPQUFPLGVBQWU7SUFHTjtJQUZaLE1BQU0sR0FBRyxJQUFJLEdBQUcsRUFBMkIsQ0FBQztJQUVwRCxZQUFvQixjQUE4QjtRQUE5QixtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7SUFBRyxDQUFDO0lBRS9DLEtBQUssQ0FBQyxVQUFVO1FBQ3JCLE1BQU0sSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3hCLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDekIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsVUFBVSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksNEJBQTRCLENBQUMsQ0FBQztRQUM3RSxDQUFDO0lBQ0gsQ0FBQztJQUVELDRFQUE0RTtJQUM1RSxrQkFBa0I7SUFDbEIsNEVBQTRFO0lBRTVFOztPQUVHO0lBQ0ksS0FBSyxDQUFDLFdBQVcsQ0FDdEIsSUFBWSxFQUNaLE1BQXdCLEVBQ3hCLGFBQTRCLEVBQzVCLFNBQWlCO1FBRWpCLE1BQU0sRUFBRSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDN0IsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDbkQsTUFBTSxVQUFVLEdBQUcsR0FBRyxFQUFFLElB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
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import * as plugins from '../plugins.js';
|
|
2
|
+
import type { StorageManager } from '../storage/index.js';
|
|
3
|
+
import type { IMergedRoute, IRouteWarning } from '../../dist_ts_interfaces/data/route-management.js';
|
|
4
|
+
import { type IHttp3Config } from '../http3/index.js';
|
|
5
|
+
export declare class RouteConfigManager {
|
|
6
|
+
private storageManager;
|
|
7
|
+
private getHardcodedRoutes;
|
|
8
|
+
private getSmartProxy;
|
|
9
|
+
private getHttp3Config?;
|
|
10
|
+
private getVpnAllowList?;
|
|
11
|
+
private storedRoutes;
|
|
12
|
+
private overrides;
|
|
13
|
+
private warnings;
|
|
14
|
+
constructor(storageManager: StorageManager, getHardcodedRoutes: () => plugins.smartproxy.IRouteConfig[], getSmartProxy: () => plugins.smartproxy.SmartProxy | undefined, getHttp3Config?: (() => IHttp3Config | undefined) | undefined, getVpnAllowList?: ((tags?: string[]) => string[]) | undefined);
|
|
15
|
+
/**
|
|
16
|
+
* Load persisted routes and overrides, compute warnings, apply to SmartProxy.
|
|
17
|
+
*/
|
|
18
|
+
initialize(): Promise<void>;
|
|
19
|
+
getMergedRoutes(): {
|
|
20
|
+
routes: IMergedRoute[];
|
|
21
|
+
warnings: IRouteWarning[];
|
|
22
|
+
};
|
|
23
|
+
createRoute(route: plugins.smartproxy.IRouteConfig, createdBy: string, enabled?: boolean): Promise<string>;
|
|
24
|
+
updateRoute(id: string, patch: {
|
|
25
|
+
route?: Partial<plugins.smartproxy.IRouteConfig>;
|
|
26
|
+
enabled?: boolean;
|
|
27
|
+
}): Promise<boolean>;
|
|
28
|
+
deleteRoute(id: string): Promise<boolean>;
|
|
29
|
+
toggleRoute(id: string, enabled: boolean): Promise<boolean>;
|
|
30
|
+
setOverride(routeName: string, enabled: boolean, updatedBy: string): Promise<void>;
|
|
31
|
+
removeOverride(routeName: string): Promise<boolean>;
|
|
32
|
+
private loadStoredRoutes;
|
|
33
|
+
private loadOverrides;
|
|
34
|
+
private persistRoute;
|
|
35
|
+
private computeWarnings;
|
|
36
|
+
private logWarnings;
|
|
37
|
+
applyRoutes(): Promise<void>;
|
|
38
|
+
}
|
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
import * as plugins from '../plugins.js';
|
|
2
|
+
import { logger } from '../logger.js';
|
|
3
|
+
import { augmentRouteWithHttp3 } from '../http3/index.js';
|
|
4
|
+
const ROUTES_PREFIX = '/config-api/routes/';
|
|
5
|
+
const OVERRIDES_PREFIX = '/config-api/overrides/';
|
|
6
|
+
export class RouteConfigManager {
|
|
7
|
+
storageManager;
|
|
8
|
+
getHardcodedRoutes;
|
|
9
|
+
getSmartProxy;
|
|
10
|
+
getHttp3Config;
|
|
11
|
+
getVpnAllowList;
|
|
12
|
+
storedRoutes = new Map();
|
|
13
|
+
overrides = new Map();
|
|
14
|
+
warnings = [];
|
|
15
|
+
constructor(storageManager, getHardcodedRoutes, getSmartProxy, getHttp3Config, getVpnAllowList) {
|
|
16
|
+
this.storageManager = storageManager;
|
|
17
|
+
this.getHardcodedRoutes = getHardcodedRoutes;
|
|
18
|
+
this.getSmartProxy = getSmartProxy;
|
|
19
|
+
this.getHttp3Config = getHttp3Config;
|
|
20
|
+
this.getVpnAllowList = getVpnAllowList;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Load persisted routes and overrides, compute warnings, apply to SmartProxy.
|
|
24
|
+
*/
|
|
25
|
+
async initialize() {
|
|
26
|
+
await this.loadStoredRoutes();
|
|
27
|
+
await this.loadOverrides();
|
|
28
|
+
this.computeWarnings();
|
|
29
|
+
this.logWarnings();
|
|
30
|
+
await this.applyRoutes();
|
|
31
|
+
}
|
|
32
|
+
// =========================================================================
|
|
33
|
+
// Merged view
|
|
34
|
+
// =========================================================================
|
|
35
|
+
getMergedRoutes() {
|
|
36
|
+
const merged = [];
|
|
37
|
+
// Hardcoded routes
|
|
38
|
+
for (const route of this.getHardcodedRoutes()) {
|
|
39
|
+
const name = route.name || '';
|
|
40
|
+
const override = this.overrides.get(name);
|
|
41
|
+
merged.push({
|
|
42
|
+
route,
|
|
43
|
+
source: 'hardcoded',
|
|
44
|
+
enabled: override ? override.enabled : true,
|
|
45
|
+
overridden: !!override,
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
// Programmatic routes
|
|
49
|
+
for (const stored of this.storedRoutes.values()) {
|
|
50
|
+
merged.push({
|
|
51
|
+
route: stored.route,
|
|
52
|
+
source: 'programmatic',
|
|
53
|
+
enabled: stored.enabled,
|
|
54
|
+
overridden: false,
|
|
55
|
+
storedRouteId: stored.id,
|
|
56
|
+
createdAt: stored.createdAt,
|
|
57
|
+
updatedAt: stored.updatedAt,
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
return { routes: merged, warnings: [...this.warnings] };
|
|
61
|
+
}
|
|
62
|
+
// =========================================================================
|
|
63
|
+
// Programmatic route CRUD
|
|
64
|
+
// =========================================================================
|
|
65
|
+
async createRoute(route, createdBy, enabled = true) {
|
|
66
|
+
const id = plugins.uuid.v4();
|
|
67
|
+
const now = Date.now();
|
|
68
|
+
// Ensure route has a name
|
|
69
|
+
if (!route.name) {
|
|
70
|
+
route.name = `programmatic-${id.slice(0, 8)}`;
|
|
71
|
+
}
|
|
72
|
+
const stored = {
|
|
73
|
+
id,
|
|
74
|
+
route,
|
|
75
|
+
enabled,
|
|
76
|
+
createdAt: now,
|
|
77
|
+
updatedAt: now,
|
|
78
|
+
createdBy,
|
|
79
|
+
};
|
|
80
|
+
this.storedRoutes.set(id, stored);
|
|
81
|
+
await this.persistRoute(stored);
|
|
82
|
+
await this.applyRoutes();
|
|
83
|
+
return id;
|
|
84
|
+
}
|
|
85
|
+
async updateRoute(id, patch) {
|
|
86
|
+
const stored = this.storedRoutes.get(id);
|
|
87
|
+
if (!stored)
|
|
88
|
+
return false;
|
|
89
|
+
if (patch.route) {
|
|
90
|
+
stored.route = { ...stored.route, ...patch.route };
|
|
91
|
+
}
|
|
92
|
+
if (patch.enabled !== undefined) {
|
|
93
|
+
stored.enabled = patch.enabled;
|
|
94
|
+
}
|
|
95
|
+
stored.updatedAt = Date.now();
|
|
96
|
+
await this.persistRoute(stored);
|
|
97
|
+
await this.applyRoutes();
|
|
98
|
+
return true;
|
|
99
|
+
}
|
|
100
|
+
async deleteRoute(id) {
|
|
101
|
+
if (!this.storedRoutes.has(id))
|
|
102
|
+
return false;
|
|
103
|
+
this.storedRoutes.delete(id);
|
|
104
|
+
await this.storageManager.delete(`${ROUTES_PREFIX}${id}.json`);
|
|
105
|
+
await this.applyRoutes();
|
|
106
|
+
return true;
|
|
107
|
+
}
|
|
108
|
+
async toggleRoute(id, enabled) {
|
|
109
|
+
return this.updateRoute(id, { enabled });
|
|
110
|
+
}
|
|
111
|
+
// =========================================================================
|
|
112
|
+
// Hardcoded route overrides
|
|
113
|
+
// =========================================================================
|
|
114
|
+
async setOverride(routeName, enabled, updatedBy) {
|
|
115
|
+
const override = {
|
|
116
|
+
routeName,
|
|
117
|
+
enabled,
|
|
118
|
+
updatedAt: Date.now(),
|
|
119
|
+
updatedBy,
|
|
120
|
+
};
|
|
121
|
+
this.overrides.set(routeName, override);
|
|
122
|
+
await this.storageManager.setJSON(`${OVERRIDES_PREFIX}${routeName}.json`, override);
|
|
123
|
+
this.computeWarnings();
|
|
124
|
+
await this.applyRoutes();
|
|
125
|
+
}
|
|
126
|
+
async removeOverride(routeName) {
|
|
127
|
+
if (!this.overrides.has(routeName))
|
|
128
|
+
return false;
|
|
129
|
+
this.overrides.delete(routeName);
|
|
130
|
+
await this.storageManager.delete(`${OVERRIDES_PREFIX}${routeName}.json`);
|
|
131
|
+
this.computeWarnings();
|
|
132
|
+
await this.applyRoutes();
|
|
133
|
+
return true;
|
|
134
|
+
}
|
|
135
|
+
// =========================================================================
|
|
136
|
+
// Private: persistence
|
|
137
|
+
// =========================================================================
|
|
138
|
+
async loadStoredRoutes() {
|
|
139
|
+
const keys = await this.storageManager.list(ROUTES_PREFIX);
|
|
140
|
+
for (const key of keys) {
|
|
141
|
+
if (!key.endsWith('.json'))
|
|
142
|
+
continue;
|
|
143
|
+
const stored = await this.storageManager.getJSON(key);
|
|
144
|
+
if (stored?.id) {
|
|
145
|
+
this.storedRoutes.set(stored.id, stored);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
if (this.storedRoutes.size > 0) {
|
|
149
|
+
logger.log('info', `Loaded ${this.storedRoutes.size} programmatic route(s) from storage`);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
async loadOverrides() {
|
|
153
|
+
const keys = await this.storageManager.list(OVERRIDES_PREFIX);
|
|
154
|
+
for (const key of keys) {
|
|
155
|
+
if (!key.endsWith('.json'))
|
|
156
|
+
continue;
|
|
157
|
+
const override = await this.storageManager.getJSON(key);
|
|
158
|
+
if (override?.routeName) {
|
|
159
|
+
this.overrides.set(override.routeName, override);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
if (this.overrides.size > 0) {
|
|
163
|
+
logger.log('info', `Loaded ${this.overrides.size} route override(s) from storage`);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
async persistRoute(stored) {
|
|
167
|
+
await this.storageManager.setJSON(`${ROUTES_PREFIX}${stored.id}.json`, stored);
|
|
168
|
+
}
|
|
169
|
+
// =========================================================================
|
|
170
|
+
// Private: warnings
|
|
171
|
+
// =========================================================================
|
|
172
|
+
computeWarnings() {
|
|
173
|
+
this.warnings = [];
|
|
174
|
+
const hardcodedNames = new Set(this.getHardcodedRoutes().map((r) => r.name || ''));
|
|
175
|
+
// Check overrides
|
|
176
|
+
for (const [routeName, override] of this.overrides) {
|
|
177
|
+
if (!hardcodedNames.has(routeName)) {
|
|
178
|
+
this.warnings.push({
|
|
179
|
+
type: 'orphaned-override',
|
|
180
|
+
routeName,
|
|
181
|
+
message: `Orphaned override for route '${routeName}' — hardcoded route no longer exists`,
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
else if (!override.enabled) {
|
|
185
|
+
this.warnings.push({
|
|
186
|
+
type: 'disabled-hardcoded',
|
|
187
|
+
routeName,
|
|
188
|
+
message: `Route '${routeName}' is disabled via API override`,
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
// Check disabled programmatic routes
|
|
193
|
+
for (const stored of this.storedRoutes.values()) {
|
|
194
|
+
if (!stored.enabled) {
|
|
195
|
+
const name = stored.route.name || stored.id;
|
|
196
|
+
this.warnings.push({
|
|
197
|
+
type: 'disabled-programmatic',
|
|
198
|
+
routeName: name,
|
|
199
|
+
message: `Programmatic route '${name}' (id: ${stored.id}) is disabled`,
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
logWarnings() {
|
|
205
|
+
for (const w of this.warnings) {
|
|
206
|
+
logger.log('warn', w.message);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
// =========================================================================
|
|
210
|
+
// Private: apply merged routes to SmartProxy
|
|
211
|
+
// =========================================================================
|
|
212
|
+
async applyRoutes() {
|
|
213
|
+
const smartProxy = this.getSmartProxy();
|
|
214
|
+
if (!smartProxy)
|
|
215
|
+
return;
|
|
216
|
+
const enabledRoutes = [];
|
|
217
|
+
// Add enabled hardcoded routes (respecting overrides)
|
|
218
|
+
for (const route of this.getHardcodedRoutes()) {
|
|
219
|
+
const name = route.name || '';
|
|
220
|
+
const override = this.overrides.get(name);
|
|
221
|
+
if (override && !override.enabled) {
|
|
222
|
+
continue; // Skip disabled hardcoded route
|
|
223
|
+
}
|
|
224
|
+
enabledRoutes.push(route);
|
|
225
|
+
}
|
|
226
|
+
// Add enabled programmatic routes (with HTTP/3 and VPN augmentation)
|
|
227
|
+
const http3Config = this.getHttp3Config?.();
|
|
228
|
+
const vpnAllowList = this.getVpnAllowList;
|
|
229
|
+
for (const stored of this.storedRoutes.values()) {
|
|
230
|
+
if (stored.enabled) {
|
|
231
|
+
let route = stored.route;
|
|
232
|
+
if (http3Config && http3Config.enabled !== false) {
|
|
233
|
+
route = augmentRouteWithHttp3(route, { enabled: true, ...http3Config });
|
|
234
|
+
}
|
|
235
|
+
// Inject VPN security for programmatic routes with vpn.required
|
|
236
|
+
if (vpnAllowList) {
|
|
237
|
+
const dcRoute = route;
|
|
238
|
+
if (dcRoute.vpn?.required) {
|
|
239
|
+
const existing = route.security?.ipAllowList || [];
|
|
240
|
+
const allowList = vpnAllowList(dcRoute.vpn.allowedServerDefinedClientTags);
|
|
241
|
+
route = {
|
|
242
|
+
...route,
|
|
243
|
+
security: {
|
|
244
|
+
...route.security,
|
|
245
|
+
ipAllowList: [...existing, ...allowList],
|
|
246
|
+
},
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
enabledRoutes.push(route);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
await smartProxy.updateRoutes(enabledRoutes);
|
|
254
|
+
logger.log('info', `Applied ${enabledRoutes.length} routes to SmartProxy (${this.storedRoutes.size} programmatic, ${this.overrides.size} overrides)`);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5yb3V0ZS1jb25maWctbWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzL2NvbmZpZy9jbGFzc2VzLnJvdXRlLWNvbmZpZy1tYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFTdEMsT0FBTyxFQUFxQixxQkFBcUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRTdFLE1BQU0sYUFBYSxHQUFHLHFCQUFxQixDQUFDO0FBQzVDLE1BQU0sZ0JBQWdCLEdBQUcsd0JBQXdCLENBQUM7QUFFbEQsTUFBTSxPQUFPLGtCQUFrQjtJQU1uQjtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBVEYsWUFBWSxHQUFHLElBQUksR0FBRyxFQUF3QixDQUFDO0lBQy9DLFNBQVMsR0FBRyxJQUFJLEdBQUcsRUFBMEIsQ0FBQztJQUM5QyxRQUFRLEdBQW9CLEVBQUUsQ0FBQztJQUV2QyxZQUNVLGNBQThCLEVBQzlCLGtCQUEyRCxFQUMzRCxhQUE4RCxFQUM5RCxjQUErQyxFQUMvQyxlQUErQztRQUovQyxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUF5QztRQUMzRCxrQkFBYSxHQUFiLGFBQWEsQ0FBaUQ7UUFDOUQsbUJBQWMsR0FBZCxjQUFjLENBQWlDO1FBQy9DLG9CQUFlLEdBQWYsZUFBZSxDQUFnQztJQUN0RCxDQUFDO0lBRUo7O09BRUc7SUFDSSxLQUFLLENBQUMsVUFBVTtRQUNyQixNQUFNLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQzlCLE1BQU0sSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQzNCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDbkIsTUFBTSxJQUFJ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
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
// Export validation tools only
|
|
2
|
+
export * from './validator.js';
|
|
3
|
+
export { RouteConfigManager } from './classes.route-config-manager.js';
|
|
4
|
+
export { ApiTokenManager } from './classes.api-token-manager.js';
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9jb25maWcvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0JBQStCO0FBQy9CLGNBQWMsZ0JBQWdCLENBQUM7QUFDL0IsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDdkUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDIn0=
|