@serve.zone/dcrouter 11.0.6 → 11.0.9

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.
Files changed (85) hide show
  1. package/dist_serve/bundle.js +3358 -3358
  2. package/dist_ts/00_commitinfo_data.js +1 -1
  3. package/dist_ts_web/00_commitinfo_data.js +1 -1
  4. package/package.json +3 -3
  5. package/ts/00_commitinfo_data.ts +1 -1
  6. package/ts_web/00_commitinfo_data.ts +1 -1
  7. package/dist_ts/cache/classes.cache.cleaner.d.ts +0 -47
  8. package/dist_ts/cache/documents/index.d.ts +0 -2
  9. package/dist_ts/cache/documents/index.js +0 -3
  10. package/dist_ts/cache/index.d.ts +0 -4
  11. package/dist_ts/cache/index.js +0 -7
  12. package/dist_ts/config/classes.api-token-manager.d.ts +0 -46
  13. package/dist_ts/config/classes.api-token-manager.js +0 -150
  14. package/dist_ts/config/classes.route-config-manager.d.ts +0 -35
  15. package/dist_ts/config/classes.route-config-manager.js +0 -231
  16. package/dist_ts/config/index.d.ts +0 -3
  17. package/dist_ts/config/index.js +0 -5
  18. package/dist_ts/config/validator.d.ts +0 -104
  19. package/dist_ts/config/validator.js +0 -152
  20. package/dist_ts/errors/base.errors.d.ts +0 -224
  21. package/dist_ts/errors/base.errors.js +0 -320
  22. package/dist_ts/errors/error.codes.d.ts +0 -115
  23. package/dist_ts/errors/error.codes.js +0 -136
  24. package/dist_ts/monitoring/classes.metricscache.d.ts +0 -32
  25. package/dist_ts/monitoring/classes.metricscache.js +0 -63
  26. package/dist_ts/monitoring/classes.metricsmanager.d.ts +0 -178
  27. package/dist_ts/monitoring/classes.metricsmanager.js +0 -642
  28. package/dist_ts/monitoring/index.d.ts +0 -1
  29. package/dist_ts/monitoring/index.js +0 -2
  30. package/dist_ts/opsserver/classes.opsserver.d.ts +0 -37
  31. package/dist_ts/opsserver/classes.opsserver.js +0 -85
  32. package/dist_ts/opsserver/handlers/admin.handler.d.ts +0 -31
  33. package/dist_ts/opsserver/handlers/admin.handler.js +0 -180
  34. package/dist_ts/opsserver/handlers/api-token.handler.d.ts +0 -6
  35. package/dist_ts/opsserver/handlers/api-token.handler.js +0 -62
  36. package/dist_ts/opsserver/handlers/certificate.handler.d.ts +0 -32
  37. package/dist_ts/opsserver/handlers/certificate.handler.js +0 -421
  38. package/dist_ts/opsserver/handlers/config.handler.d.ts +0 -7
  39. package/dist_ts/opsserver/handlers/config.handler.js +0 -192
  40. package/dist_ts/opsserver/handlers/email-ops.handler.d.ts +0 -30
  41. package/dist_ts/opsserver/handlers/email-ops.handler.js +0 -227
  42. package/dist_ts/opsserver/handlers/index.d.ts +0 -11
  43. package/dist_ts/opsserver/handlers/index.js +0 -12
  44. package/dist_ts/opsserver/handlers/logs.handler.d.ts +0 -25
  45. package/dist_ts/opsserver/handlers/logs.handler.js +0 -256
  46. package/dist_ts/opsserver/handlers/radius.handler.d.ts +0 -6
  47. package/dist_ts/opsserver/handlers/radius.handler.js +0 -295
  48. package/dist_ts/opsserver/handlers/remoteingress.handler.d.ts +0 -6
  49. package/dist_ts/opsserver/handlers/remoteingress.handler.js +0 -156
  50. package/dist_ts/opsserver/handlers/route-management.handler.d.ts +0 -14
  51. package/dist_ts/opsserver/handlers/route-management.handler.js +0 -117
  52. package/dist_ts/opsserver/handlers/security.handler.d.ts +0 -9
  53. package/dist_ts/opsserver/handlers/security.handler.js +0 -231
  54. package/dist_ts/opsserver/handlers/stats.handler.d.ts +0 -11
  55. package/dist_ts/opsserver/handlers/stats.handler.js +0 -399
  56. package/dist_ts/opsserver/helpers/guards.d.ts +0 -27
  57. package/dist_ts/opsserver/helpers/guards.js +0 -43
  58. package/dist_ts/opsserver/index.d.ts +0 -1
  59. package/dist_ts/opsserver/index.js +0 -2
  60. package/dist_ts/radius/classes.accounting.manager.d.ts +0 -218
  61. package/dist_ts/radius/classes.accounting.manager.js +0 -417
  62. package/dist_ts/radius/classes.radius.server.d.ts +0 -171
  63. package/dist_ts/radius/classes.radius.server.js +0 -385
  64. package/dist_ts/radius/classes.vlan.manager.d.ts +0 -128
  65. package/dist_ts/radius/classes.vlan.manager.js +0 -279
  66. package/dist_ts/radius/index.d.ts +0 -13
  67. package/dist_ts/radius/index.js +0 -14
  68. package/dist_ts/remoteingress/classes.remoteingress-manager.d.ts +0 -82
  69. package/dist_ts/remoteingress/classes.remoteingress-manager.js +0 -227
  70. package/dist_ts/remoteingress/classes.tunnel-manager.d.ts +0 -59
  71. package/dist_ts/remoteingress/classes.tunnel-manager.js +0 -165
  72. package/dist_ts/remoteingress/index.d.ts +0 -2
  73. package/dist_ts/remoteingress/index.js +0 -3
  74. package/dist_ts/security/classes.contentscanner.d.ts +0 -164
  75. package/dist_ts/security/classes.contentscanner.js +0 -642
  76. package/dist_ts/security/classes.ipreputationchecker.d.ts +0 -160
  77. package/dist_ts/security/classes.ipreputationchecker.js +0 -537
  78. package/dist_ts/security/classes.securitylogger.d.ts +0 -144
  79. package/dist_ts/security/classes.securitylogger.js +0 -233
  80. package/dist_ts/security/index.d.ts +0 -3
  81. package/dist_ts/security/index.js +0 -4
  82. package/dist_ts/storage/classes.storagemanager.d.ts +0 -83
  83. package/dist_ts/storage/classes.storagemanager.js +0 -350
  84. package/dist_ts/storage/index.d.ts +0 -1
  85. package/dist_ts/storage/index.js +0 -3
@@ -1,227 +0,0 @@
1
- import * as plugins from '../plugins.js';
2
- const STORAGE_PREFIX = '/remote-ingress/';
3
- /**
4
- * Flatten a port range (number | number[] | Array<{from, to}>) to a sorted unique number array.
5
- */
6
- function extractPorts(portRange) {
7
- const ports = new Set();
8
- if (typeof portRange === 'number') {
9
- ports.add(portRange);
10
- }
11
- else if (Array.isArray(portRange)) {
12
- for (const entry of portRange) {
13
- if (typeof entry === 'number') {
14
- ports.add(entry);
15
- }
16
- else if (typeof entry === 'object' && 'from' in entry && 'to' in entry) {
17
- for (let p = entry.from; p <= entry.to; p++) {
18
- ports.add(p);
19
- }
20
- }
21
- }
22
- }
23
- return [...ports].sort((a, b) => a - b);
24
- }
25
- /**
26
- * Manages CRUD for remote ingress edge registrations.
27
- * Persists edge configs via StorageManager and provides
28
- * the allowed edges list for the Rust hub.
29
- */
30
- export class RemoteIngressManager {
31
- storageManager;
32
- edges = new Map();
33
- routes = [];
34
- constructor(storageManager) {
35
- this.storageManager = storageManager;
36
- }
37
- /**
38
- * Load all edge registrations from storage into memory.
39
- */
40
- async initialize() {
41
- const keys = await this.storageManager.list(STORAGE_PREFIX);
42
- for (const key of keys) {
43
- const edge = await this.storageManager.getJSON(key);
44
- if (edge) {
45
- // Migration: old edges without autoDerivePorts default to true
46
- if (edge.autoDerivePorts === undefined) {
47
- edge.autoDerivePorts = true;
48
- await this.storageManager.setJSON(key, edge);
49
- }
50
- this.edges.set(edge.id, edge);
51
- }
52
- }
53
- }
54
- /**
55
- * Store the current route configs for port derivation.
56
- */
57
- setRoutes(routes) {
58
- this.routes = routes;
59
- }
60
- /**
61
- * Derive listen ports for an edge from routes tagged with remoteIngress.enabled.
62
- * When a route specifies edgeFilter, only edges whose id or tags match get that route's ports.
63
- * When edgeFilter is absent, the route applies to all edges.
64
- */
65
- derivePortsForEdge(edgeId, edgeTags) {
66
- const ports = new Set();
67
- for (const route of this.routes) {
68
- if (!route.remoteIngress?.enabled)
69
- continue;
70
- // Apply edge filter if present
71
- const filter = route.remoteIngress.edgeFilter;
72
- if (filter && filter.length > 0) {
73
- const idMatch = filter.includes(edgeId);
74
- const tagMatch = edgeTags?.some((tag) => filter.includes(tag)) ?? false;
75
- if (!idMatch && !tagMatch)
76
- continue;
77
- }
78
- // Extract ports from the route match
79
- if (route.match?.ports) {
80
- for (const p of extractPorts(route.match.ports)) {
81
- ports.add(p);
82
- }
83
- }
84
- }
85
- return [...ports].sort((a, b) => a - b);
86
- }
87
- /**
88
- * Get the effective listen ports for an edge.
89
- * Manual ports are always included. Auto-derived ports are added (union) when autoDerivePorts is true.
90
- */
91
- getEffectiveListenPorts(edge) {
92
- const manualPorts = edge.listenPorts || [];
93
- const shouldDerive = edge.autoDerivePorts !== false;
94
- if (!shouldDerive)
95
- return [...manualPorts].sort((a, b) => a - b);
96
- const derivedPorts = this.derivePortsForEdge(edge.id, edge.tags);
97
- return [...new Set([...manualPorts, ...derivedPorts])].sort((a, b) => a - b);
98
- }
99
- /**
100
- * Get manual and derived port breakdown for an edge (used in API responses).
101
- * Derived ports exclude any ports already present in the manual list.
102
- */
103
- getPortBreakdown(edge) {
104
- const manual = edge.listenPorts || [];
105
- const shouldDerive = edge.autoDerivePorts !== false;
106
- if (!shouldDerive)
107
- return { manual, derived: [] };
108
- const manualSet = new Set(manual);
109
- const allDerived = this.derivePortsForEdge(edge.id, edge.tags);
110
- const derived = allDerived.filter((p) => !manualSet.has(p));
111
- return { manual, derived };
112
- }
113
- /**
114
- * Create a new edge registration.
115
- */
116
- async createEdge(name, listenPorts = [], tags, autoDerivePorts = true) {
117
- const id = plugins.uuid.v4();
118
- const secret = plugins.crypto.randomBytes(32).toString('hex');
119
- const now = Date.now();
120
- const edge = {
121
- id,
122
- name,
123
- secret,
124
- listenPorts,
125
- enabled: true,
126
- autoDerivePorts,
127
- tags: tags || [],
128
- createdAt: now,
129
- updatedAt: now,
130
- };
131
- await this.storageManager.setJSON(`${STORAGE_PREFIX}${id}`, edge);
132
- this.edges.set(id, edge);
133
- return edge;
134
- }
135
- /**
136
- * Get an edge by ID.
137
- */
138
- getEdge(id) {
139
- return this.edges.get(id);
140
- }
141
- /**
142
- * Get all edge registrations.
143
- */
144
- getAllEdges() {
145
- return Array.from(this.edges.values());
146
- }
147
- /**
148
- * Update an edge registration.
149
- */
150
- async updateEdge(id, updates) {
151
- const edge = this.edges.get(id);
152
- if (!edge) {
153
- return null;
154
- }
155
- if (updates.name !== undefined)
156
- edge.name = updates.name;
157
- if (updates.listenPorts !== undefined)
158
- edge.listenPorts = updates.listenPorts;
159
- if (updates.autoDerivePorts !== undefined)
160
- edge.autoDerivePorts = updates.autoDerivePorts;
161
- if (updates.enabled !== undefined)
162
- edge.enabled = updates.enabled;
163
- if (updates.tags !== undefined)
164
- edge.tags = updates.tags;
165
- edge.updatedAt = Date.now();
166
- await this.storageManager.setJSON(`${STORAGE_PREFIX}${id}`, edge);
167
- this.edges.set(id, edge);
168
- return edge;
169
- }
170
- /**
171
- * Delete an edge registration.
172
- */
173
- async deleteEdge(id) {
174
- if (!this.edges.has(id)) {
175
- return false;
176
- }
177
- await this.storageManager.delete(`${STORAGE_PREFIX}${id}`);
178
- this.edges.delete(id);
179
- return true;
180
- }
181
- /**
182
- * Regenerate the secret for an edge.
183
- */
184
- async regenerateSecret(id) {
185
- const edge = this.edges.get(id);
186
- if (!edge) {
187
- return null;
188
- }
189
- edge.secret = plugins.crypto.randomBytes(32).toString('hex');
190
- edge.updatedAt = Date.now();
191
- await this.storageManager.setJSON(`${STORAGE_PREFIX}${id}`, edge);
192
- this.edges.set(id, edge);
193
- return edge.secret;
194
- }
195
- /**
196
- * Verify an edge's secret using constant-time comparison.
197
- */
198
- verifySecret(id, secret) {
199
- const edge = this.edges.get(id);
200
- if (!edge) {
201
- return false;
202
- }
203
- const expected = Buffer.from(edge.secret);
204
- const provided = Buffer.from(secret);
205
- if (expected.length !== provided.length) {
206
- return false;
207
- }
208
- return plugins.crypto.timingSafeEqual(expected, provided);
209
- }
210
- /**
211
- * Get the list of allowed edges (enabled only) for the Rust hub.
212
- */
213
- getAllowedEdges() {
214
- const result = [];
215
- for (const edge of this.edges.values()) {
216
- if (edge.enabled) {
217
- result.push({
218
- id: edge.id,
219
- secret: edge.secret,
220
- listenPorts: this.getEffectiveListenPorts(edge),
221
- });
222
- }
223
- }
224
- return result;
225
- }
226
- }
227
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5yZW1vdGVpbmdyZXNzLW1hbmFnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9yZW1vdGVpbmdyZXNzL2NsYXNzZXMucmVtb3RlaW5ncmVzcy1tYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sZUFBZSxDQUFDO0FBSXpDLE1BQU0sY0FBYyxHQUFHLGtCQUFrQixDQUFDO0FBRTFDOztHQUVHO0FBQ0gsU0FBUyxZQUFZLENBQUMsU0FBa0U7SUFDdEYsTUFBTSxLQUFLLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztJQUNoQyxJQUFJLE9BQU8sU0FBUyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQ2xDLEtBQUssQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDdkIsQ0FBQztTQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1FBQ3BDLEtBQUssTUFBTSxLQUFLLElBQUksU0FBUyxFQUFFLENBQUM7WUFDOUIsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDOUIsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNuQixDQUFDO2lCQUFNLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLE1BQU0sSUFBSSxLQUFLLElBQUksSUFBSSxJQUFJLEtBQUssRUFBRSxDQUFDO2dCQUN6RSxLQUFLLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztvQkFDNUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDZixDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzFDLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxPQUFPLG9CQUFvQjtJQUN2QixjQUFjLENBQWlCO0lBQy9CLEtBQUssR0FBZ0MsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUMvQyxNQUFNLEdBQTJCLEVBQUUsQ0FBQztJQUU1QyxZQUFZLGNBQThCO1FBQ3hDLElBQUksQ0FBQyxjQUFjLEdBQUcsY0FBYyxDQUFDO0lBQ3ZDLENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxVQUFVO1FBQ3JCLE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDNUQsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUN2QixNQUFNLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFpQixHQUFHLENBQUMsQ0FBQztZQUNwRSxJQUFJLElBQUksRUFBRSxDQUFDO2dCQUNULCtEQUErRDtnQkFDL0QsSUFBSyxJQUFZLENBQUMsZUFBZSxLQUFLLFNBQVMsRUFBRSxDQUFDO29CQUNoRCxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztvQkFDNUIsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQy9DLENBQUM7Z0JBQ0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNoQyxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNJLFNBQVMsQ0FBQyxNQUE4QjtRQUM3QyxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztJQUN2QixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLGtCQUFrQixDQUFDLE1BQWMsRUFBRSxRQUFtQjtRQUMzRCxNQUFNLEtBQUssR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO1FBRWhDLEtBQUssTUFBTSxLQUFLLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2hDLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLE9BQU87Z0JBQUUsU0FBUztZQUU1QywrQkFBK0I7WUFDL0IsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUM7WUFDOUMsSUFBSSxNQUFNLElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDaEMsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDeEMsTUFBTSxRQUFRLEdBQUcsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQztnQkFDeEUsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLFFBQVE7b0JBQUUsU0FBUztZQUN0QyxDQUFDO1lBRUQscUNBQXFDO1lBQ3JDLElBQUksS0FBSyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQztnQkFDdkIsS0FBSyxNQUFNLENBQUMsSUFBSSxZQUFZLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO29CQUNoRCxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNmLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksdUJBQXVCLENBQUMsSUFBb0I7UUFDakQsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsSUFBSSxFQUFFLENBQUM7UUFDM0MsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGVBQWUsS0FBSyxLQUFLLENBQUM7UUFDcEQsSUFBSSxDQUFDLFlBQVk7WUFBRSxPQUFPLENBQUMsR0FBRyxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDakUsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pFLE9BQU8sQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxXQUFXLEVBQUUsR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQy9FLENBQUM7SUFFRDs7O09BR0c7SUFDSSxnQkFBZ0IsQ0FBQyxJQUFvQjtRQUMxQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsV0FBVyxJQUFJLEVBQUUsQ0FBQztRQUN0QyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsZUFBZSxLQUFLLEtBQUssQ0FBQztRQUNwRCxJQUFJLENBQUMsWUFBWTtZQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxDQUFDO1FBQ2xELE1BQU0sU0FBUyxHQUFHLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2xDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMvRCxNQUFNLE9BQU8sR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM1RCxPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxVQUFVLENBQ3JCLElBQVksRUFDWixjQUF3QixFQUFFLEVBQzFCLElBQWUsRUFDZixrQkFBMkIsSUFBSTtRQUUvQixNQUFNLEVBQUUsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQzdCLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5RCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFFdkIsTUFBTSxJQUFJLEdBQW1CO1lBQzNCLEVBQUU7WUFDRixJQUFJO1lBQ0osTUFBTTtZQUNOLFdBQVc7WUFDWCxPQUFPLEVBQUUsSUFBSTtZQUNiLGVBQWU7WUFDZixJQUFJLEVBQUUsSUFBSSxJQUFJLEVBQUU7WUFDaEIsU0FBUyxFQUFFLEdBQUc7WUFDZCxTQUFTLEVBQUUsR0FBRztTQUNmLENBQUM7UUFFRixNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLEdBQUcsY0FBYyxHQUFHLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2xFLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN6QixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7T0FFRztJQUNJLE9BQU8sQ0FBQyxFQUFVO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUVEOztPQUVHO0lBQ0ksV0FBVztRQUNoQixPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxVQUFVLENBQ3JCLEVBQVUsRUFDVixPQU1DO1FBRUQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDaEMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ1YsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQsSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLFNBQVM7WUFBRSxJQUFJLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUM7UUFDekQsSUFBSSxPQUFPLENBQUMsV0FBVyxLQUFLLFNBQVM7WUFBRSxJQUFJLENBQUMsV0FBVyxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUM7UUFDOUUsSUFBSSxPQUFPLENBQUMsZUFBZSxLQUFLLFNBQVM7WUFBRSxJQUFJLENBQUMsZUFBZSxHQUFHLE9BQU8sQ0FBQyxlQUFlLENBQUM7UUFDMUYsSUFBSSxPQUFPLENBQUMsT0FBTyxLQUFLLFNBQVM7WUFBRSxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUM7UUFDbEUsSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLFNBQVM7WUFBRSxJQUFJLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUM7UUFDekQsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFFNUIsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxHQUFHLGNBQWMsR0FBRyxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNsRSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDekIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsVUFBVSxDQUFDLEVBQVU7UUFDaEMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDeEIsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBQ0QsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxHQUFHLGNBQWMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzNELElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3RCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVEOztPQUVHO0lBQ0ksS0FBSyxDQUFDLGdCQUFnQixDQUFDLEVBQVU7UUFDdEMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDaEMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ1YsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQsSUFBSSxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDN0QsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFFNUIsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxHQUFHLGNBQWMsR0FBRyxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNsRSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDekIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3JCLENBQUM7SUFFRDs7T0FFRztJQUNJLFlBQVksQ0FBQyxFQUFVLEVBQUUsTUFBYztRQUM1QyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNoQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDVixPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFDRCxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMxQyxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3JDLElBQUksUUFBUSxDQUFDLE1BQU0sS0FBSyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDeEMsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBQ0QsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDNUQsQ0FBQztJQUVEOztPQUVHO0lBQ0ksZUFBZTtRQUNwQixNQUFNLE1BQU0sR0FBaUUsRUFBRSxDQUFDO1FBQ2hGLEtBQUssTUFBTSxJQUFJLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDO1lBQ3ZDLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNqQixNQUFNLENBQUMsSUFBSSxDQUFDO29CQUNWLEVBQUUsRUFBRSxJQUFJLENBQUMsRUFBRTtvQkFDWCxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07b0JBQ25CLFdBQVcsRUFBRSxJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDO2lCQUNoRCxDQUFDLENBQUM7WUFDTCxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7Q0FDRiJ9
@@ -1,59 +0,0 @@
1
- import type { IRemoteIngressStatus } from '../../dist_ts_interfaces/data/remoteingress.js';
2
- import type { RemoteIngressManager } from './classes.remoteingress-manager.js';
3
- export interface ITunnelManagerConfig {
4
- tunnelPort?: number;
5
- targetHost?: string;
6
- tls?: {
7
- certPem?: string;
8
- keyPem?: string;
9
- };
10
- }
11
- /**
12
- * Manages the RemoteIngressHub instance and tracks connected edge statuses.
13
- */
14
- export declare class TunnelManager {
15
- private hub;
16
- private manager;
17
- private config;
18
- private edgeStatuses;
19
- private reconcileInterval;
20
- constructor(manager: RemoteIngressManager, config?: ITunnelManagerConfig);
21
- /**
22
- * Start the tunnel hub and load allowed edges.
23
- */
24
- start(): Promise<void>;
25
- /**
26
- * Stop the tunnel hub.
27
- */
28
- stop(): Promise<void>;
29
- /**
30
- * Reconcile TS-side edge statuses with the authoritative Rust hub status.
31
- * Overwrites event-derived activeTunnels with the real activeStreams count.
32
- */
33
- private reconcile;
34
- /**
35
- * Sync allowed edges from the manager to the hub.
36
- * Call this after creating/deleting/updating edges.
37
- */
38
- syncAllowedEdges(): Promise<void>;
39
- /**
40
- * Get runtime statuses for all known edges.
41
- */
42
- getEdgeStatuses(): IRemoteIngressStatus[];
43
- /**
44
- * Get status for a specific edge.
45
- */
46
- getEdgeStatus(edgeId: string): IRemoteIngressStatus | undefined;
47
- /**
48
- * Get the count of connected edges.
49
- */
50
- getConnectedCount(): number;
51
- /**
52
- * Get the public IPs of all connected edges.
53
- */
54
- getConnectedEdgeIps(): string[];
55
- /**
56
- * Get the total number of active tunnels across all edges.
57
- */
58
- getTotalActiveTunnels(): number;
59
- }
@@ -1,165 +0,0 @@
1
- import * as plugins from '../plugins.js';
2
- /**
3
- * Manages the RemoteIngressHub instance and tracks connected edge statuses.
4
- */
5
- export class TunnelManager {
6
- hub;
7
- manager;
8
- config;
9
- edgeStatuses = new Map();
10
- reconcileInterval = null;
11
- constructor(manager, config = {}) {
12
- this.manager = manager;
13
- this.config = config;
14
- this.hub = new plugins.remoteingress.RemoteIngressHub();
15
- // Listen for edge connect/disconnect events
16
- this.hub.on('edgeConnected', (data) => {
17
- this.edgeStatuses.set(data.edgeId, {
18
- edgeId: data.edgeId,
19
- connected: true,
20
- publicIp: data.peerAddr || null,
21
- activeTunnels: 0,
22
- lastHeartbeat: Date.now(),
23
- connectedAt: Date.now(),
24
- });
25
- });
26
- this.hub.on('edgeDisconnected', (data) => {
27
- this.edgeStatuses.delete(data.edgeId);
28
- });
29
- this.hub.on('streamOpened', (data) => {
30
- const existing = this.edgeStatuses.get(data.edgeId);
31
- if (existing) {
32
- existing.activeTunnels++;
33
- existing.lastHeartbeat = Date.now();
34
- }
35
- });
36
- this.hub.on('streamClosed', (data) => {
37
- const existing = this.edgeStatuses.get(data.edgeId);
38
- if (existing && existing.activeTunnels > 0) {
39
- existing.activeTunnels--;
40
- }
41
- });
42
- }
43
- /**
44
- * Start the tunnel hub and load allowed edges.
45
- */
46
- async start() {
47
- await this.hub.start({
48
- tunnelPort: this.config.tunnelPort ?? 8443,
49
- targetHost: this.config.targetHost ?? '127.0.0.1',
50
- tls: this.config.tls,
51
- });
52
- // Send allowed edges to the hub
53
- await this.syncAllowedEdges();
54
- // Periodically reconcile with authoritative Rust hub status
55
- this.reconcileInterval = setInterval(() => {
56
- this.reconcile().catch(() => { });
57
- }, 15_000);
58
- }
59
- /**
60
- * Stop the tunnel hub.
61
- */
62
- async stop() {
63
- if (this.reconcileInterval) {
64
- clearInterval(this.reconcileInterval);
65
- this.reconcileInterval = null;
66
- }
67
- // Remove event listeners before stopping to prevent leaks
68
- this.hub.removeAllListeners();
69
- await this.hub.stop();
70
- this.edgeStatuses.clear();
71
- }
72
- /**
73
- * Reconcile TS-side edge statuses with the authoritative Rust hub status.
74
- * Overwrites event-derived activeTunnels with the real activeStreams count.
75
- */
76
- async reconcile() {
77
- const hubStatus = await this.hub.getStatus();
78
- if (!hubStatus || !hubStatus.connectedEdges)
79
- return;
80
- const rustEdgeIds = new Set();
81
- for (const rustEdge of hubStatus.connectedEdges) {
82
- rustEdgeIds.add(rustEdge.edgeId);
83
- const existing = this.edgeStatuses.get(rustEdge.edgeId);
84
- if (existing) {
85
- existing.activeTunnels = rustEdge.activeStreams;
86
- existing.lastHeartbeat = Date.now();
87
- // Update peer address if available from Rust hub
88
- if (rustEdge.peerAddr) {
89
- existing.publicIp = rustEdge.peerAddr;
90
- }
91
- }
92
- else {
93
- // Missed edgeConnected event — add entry
94
- this.edgeStatuses.set(rustEdge.edgeId, {
95
- edgeId: rustEdge.edgeId,
96
- connected: true,
97
- publicIp: rustEdge.peerAddr || null,
98
- activeTunnels: rustEdge.activeStreams,
99
- lastHeartbeat: Date.now(),
100
- connectedAt: rustEdge.connectedAt * 1000,
101
- });
102
- }
103
- }
104
- // Remove entries for edges no longer connected in Rust (missed edgeDisconnected)
105
- for (const edgeId of this.edgeStatuses.keys()) {
106
- if (!rustEdgeIds.has(edgeId)) {
107
- this.edgeStatuses.delete(edgeId);
108
- }
109
- }
110
- }
111
- /**
112
- * Sync allowed edges from the manager to the hub.
113
- * Call this after creating/deleting/updating edges.
114
- */
115
- async syncAllowedEdges() {
116
- const edges = this.manager.getAllowedEdges();
117
- await this.hub.updateAllowedEdges(edges);
118
- }
119
- /**
120
- * Get runtime statuses for all known edges.
121
- */
122
- getEdgeStatuses() {
123
- return Array.from(this.edgeStatuses.values());
124
- }
125
- /**
126
- * Get status for a specific edge.
127
- */
128
- getEdgeStatus(edgeId) {
129
- return this.edgeStatuses.get(edgeId);
130
- }
131
- /**
132
- * Get the count of connected edges.
133
- */
134
- getConnectedCount() {
135
- let count = 0;
136
- for (const status of this.edgeStatuses.values()) {
137
- if (status.connected)
138
- count++;
139
- }
140
- return count;
141
- }
142
- /**
143
- * Get the public IPs of all connected edges.
144
- */
145
- getConnectedEdgeIps() {
146
- const ips = [];
147
- for (const status of this.edgeStatuses.values()) {
148
- if (status.connected && status.publicIp) {
149
- ips.push(status.publicIp);
150
- }
151
- }
152
- return ips;
153
- }
154
- /**
155
- * Get the total number of active tunnels across all edges.
156
- */
157
- getTotalActiveTunnels() {
158
- let total = 0;
159
- for (const status of this.edgeStatuses.values()) {
160
- total += status.activeTunnels;
161
- }
162
- return total;
163
- }
164
- }
165
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy50dW5uZWwtbWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzL3JlbW90ZWluZ3Jlc3MvY2xhc3Nlcy50dW5uZWwtbWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGVBQWUsQ0FBQztBQWF6Qzs7R0FFRztBQUNILE1BQU0sT0FBTyxhQUFhO0lBQ2hCLEdBQUcsQ0FBOEQ7SUFDakUsT0FBTyxDQUF1QjtJQUM5QixNQUFNLENBQXVCO0lBQzdCLFlBQVksR0FBc0MsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUM1RCxpQkFBaUIsR0FBMEMsSUFBSSxDQUFDO0lBRXhFLFlBQVksT0FBNkIsRUFBRSxTQUErQixFQUFFO1FBQzFFLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxPQUFPLENBQUMsYUFBYSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFFeEQsNENBQTRDO1FBQzVDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLGVBQWUsRUFBRSxDQUFDLElBQTBDLEVBQUUsRUFBRTtZQUMxRSxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFO2dCQUNqQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07Z0JBQ25CLFNBQVMsRUFBRSxJQUFJO2dCQUNmLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUk7Z0JBQy9CLGFBQWEsRUFBRSxDQUFDO2dCQUNoQixhQUFhLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRTtnQkFDekIsV0FBVyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUU7YUFDeEIsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsR0FBRyxDQUFDLEVB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
@@ -1,2 +0,0 @@
1
- export * from './classes.remoteingress-manager.js';
2
- export * from './classes.tunnel-manager.js';
@@ -1,3 +0,0 @@
1
- export * from './classes.remoteingress-manager.js';
2
- export * from './classes.tunnel-manager.js';
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9yZW1vdGVpbmdyZXNzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsb0NBQW9DLENBQUM7QUFDbkQsY0FBYyw2QkFBNkIsQ0FBQyJ9
@@ -1,164 +0,0 @@
1
- import { Email } from '@push.rocks/smartmta';
2
- /**
3
- * Scan result information
4
- */
5
- export interface IScanResult {
6
- isClean: boolean;
7
- threatType?: string;
8
- threatDetails?: string;
9
- threatScore: number;
10
- scannedElements: string[];
11
- timestamp: number;
12
- }
13
- /**
14
- * Options for content scanner configuration
15
- */
16
- export interface IContentScannerOptions {
17
- maxCacheSize?: number;
18
- cacheTTL?: number;
19
- scanSubject?: boolean;
20
- scanBody?: boolean;
21
- scanAttachments?: boolean;
22
- maxAttachmentSizeToScan?: number;
23
- scanAttachmentNames?: boolean;
24
- blockExecutables?: boolean;
25
- blockMacros?: boolean;
26
- customRules?: Array<{
27
- pattern: string | RegExp;
28
- type: string;
29
- score: number;
30
- description: string;
31
- }>;
32
- minThreatScore?: number;
33
- highThreatScore?: number;
34
- }
35
- /**
36
- * Threat categories
37
- */
38
- export declare enum ThreatCategory {
39
- SPAM = "spam",
40
- PHISHING = "phishing",
41
- MALWARE = "malware",
42
- EXECUTABLE = "executable",
43
- SUSPICIOUS_LINK = "suspicious_link",
44
- MALICIOUS_MACRO = "malicious_macro",
45
- XSS = "xss",
46
- SENSITIVE_DATA = "sensitive_data",
47
- BLACKLISTED_CONTENT = "blacklisted_content",
48
- CUSTOM_RULE = "custom_rule"
49
- }
50
- /**
51
- * Content Scanner for detecting malicious email content
52
- */
53
- export declare class ContentScanner {
54
- private static instance;
55
- private scanCache;
56
- private options;
57
- private static readonly MALICIOUS_PATTERNS;
58
- private static readonly EXECUTABLE_EXTENSIONS;
59
- private static readonly MACRO_DOCUMENT_EXTENSIONS;
60
- /**
61
- * Default options for the content scanner
62
- */
63
- private static readonly DEFAULT_OPTIONS;
64
- /**
65
- * Constructor for the ContentScanner
66
- * @param options Configuration options
67
- */
68
- constructor(options?: IContentScannerOptions);
69
- /**
70
- * Get the singleton instance of the scanner
71
- * @param options Configuration options
72
- * @returns Singleton scanner instance
73
- */
74
- static getInstance(options?: IContentScannerOptions): ContentScanner;
75
- /**
76
- * Reset the singleton instance (for shutdown/testing)
77
- */
78
- static resetInstance(): void;
79
- /**
80
- * Scan an email for malicious content
81
- * @param email The email to scan
82
- * @returns Scan result
83
- */
84
- scanEmail(email: Email): Promise<IScanResult>;
85
- /**
86
- * Generate a cache key from an email
87
- * @param email The email to generate a key for
88
- * @returns Cache key
89
- */
90
- private generateCacheKey;
91
- /**
92
- * Scan email subject for threats
93
- * @param subject The subject to scan
94
- * @param result The scan result to update
95
- */
96
- private scanSubject;
97
- /**
98
- * Scan plain text content for threats
99
- * @param text The text content to scan
100
- * @param result The scan result to update
101
- */
102
- private scanTextContent;
103
- /**
104
- * Scan HTML content for threats
105
- * @param html The HTML content to scan
106
- * @param result The scan result to update
107
- */
108
- private scanHtmlContent;
109
- /**
110
- * Scan an attachment for threats
111
- * @param attachment The attachment to scan
112
- * @param result The scan result to update
113
- */
114
- private scanAttachment;
115
- /**
116
- * Extract links from HTML content
117
- * @param html HTML content
118
- * @returns Array of extracted links
119
- */
120
- private extractLinksFromHtml;
121
- /**
122
- * Extract plain text from HTML
123
- * @param html HTML content
124
- * @returns Extracted text
125
- */
126
- private extractTextFromHtml;
127
- /**
128
- * Extract text from a binary buffer for scanning
129
- * @param buffer Binary content
130
- * @returns Extracted text (may be partial)
131
- */
132
- private extractTextFromBuffer;
133
- /**
134
- * Check if an Office document likely contains macros
135
- * This is a simplified check - real implementation would use specialized libraries
136
- * @param attachment The attachment to check
137
- * @returns Whether the file likely contains macros
138
- */
139
- private likelyContainsMacros;
140
- /**
141
- * Map a pattern category to a threat type
142
- * @param category The pattern category
143
- * @returns The corresponding threat type
144
- */
145
- private mapCategoryToThreatType;
146
- /**
147
- * Log a high threat finding to the security logger
148
- * @param email The email containing the threat
149
- * @param result The scan result
150
- */
151
- private logHighThreatFound;
152
- /**
153
- * Log a threat finding to the security logger
154
- * @param email The email containing the threat
155
- * @param result The scan result
156
- */
157
- private logThreatFound;
158
- /**
159
- * Get threat level description based on score
160
- * @param score Threat score
161
- * @returns Threat level description
162
- */
163
- static getThreatLevel(score: number): 'none' | 'low' | 'medium' | 'high';
164
- }