@serve.zone/dcrouter 5.0.2 → 5.0.4

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 (207) hide show
  1. package/dist_serve/bundle.js +30539 -0
  2. package/dist_serve/bundle.js.map +7 -0
  3. package/dist_serve/index.html +1 -0
  4. package/dist_ts/00_commitinfo_data.d.ts +8 -0
  5. package/dist_ts/00_commitinfo_data.js +9 -0
  6. package/dist_ts/cache/classes.cache.cleaner.d.ts +47 -0
  7. package/dist_ts/cache/classes.cache.cleaner.js +130 -0
  8. package/dist_ts/cache/classes.cached.document.d.ts +76 -0
  9. package/dist_ts/cache/classes.cached.document.js +100 -0
  10. package/dist_ts/cache/classes.cachedb.d.ts +60 -0
  11. package/dist_ts/cache/classes.cachedb.js +126 -0
  12. package/dist_ts/cache/documents/classes.cached.email.d.ts +125 -0
  13. package/dist_ts/cache/documents/classes.cached.email.js +337 -0
  14. package/dist_ts/cache/documents/classes.cached.ip.reputation.d.ts +119 -0
  15. package/dist_ts/cache/documents/classes.cached.ip.reputation.js +323 -0
  16. package/dist_ts/cache/documents/index.d.ts +2 -0
  17. package/dist_ts/cache/documents/index.js +3 -0
  18. package/dist_ts/cache/index.d.ts +4 -0
  19. package/dist_ts/cache/index.js +7 -0
  20. package/dist_ts/classes.dcrouter.d.ts +276 -0
  21. package/dist_ts/classes.dcrouter.js +1033 -0
  22. package/dist_ts/config/index.d.ts +1 -0
  23. package/dist_ts/config/index.js +3 -0
  24. package/dist_ts/config/validator.d.ts +104 -0
  25. package/dist_ts/config/validator.js +152 -0
  26. package/dist_ts/errors/base.errors.d.ts +224 -0
  27. package/dist_ts/errors/base.errors.js +320 -0
  28. package/dist_ts/errors/error-handler.d.ts +98 -0
  29. package/dist_ts/errors/error-handler.js +282 -0
  30. package/dist_ts/errors/error.codes.d.ts +115 -0
  31. package/dist_ts/errors/error.codes.js +136 -0
  32. package/dist_ts/errors/index.d.ts +54 -0
  33. package/dist_ts/errors/index.js +136 -0
  34. package/dist_ts/errors/reputation.errors.d.ts +183 -0
  35. package/dist_ts/errors/reputation.errors.js +292 -0
  36. package/dist_ts/index.d.ts +6 -0
  37. package/dist_ts/index.js +9 -0
  38. package/dist_ts/logger.d.ts +17 -0
  39. package/dist_ts/logger.js +76 -0
  40. package/dist_ts/monitoring/classes.metricscache.d.ts +32 -0
  41. package/dist_ts/monitoring/classes.metricscache.js +63 -0
  42. package/dist_ts/monitoring/classes.metricsmanager.d.ts +112 -0
  43. package/dist_ts/monitoring/classes.metricsmanager.js +446 -0
  44. package/dist_ts/monitoring/index.d.ts +1 -0
  45. package/dist_ts/monitoring/index.js +2 -0
  46. package/dist_ts/opsserver/classes.opsserver.d.ts +22 -0
  47. package/dist_ts/opsserver/classes.opsserver.js +56 -0
  48. package/dist_ts/opsserver/handlers/admin.handler.d.ts +31 -0
  49. package/dist_ts/opsserver/handlers/admin.handler.js +180 -0
  50. package/dist_ts/opsserver/handlers/config.handler.d.ts +9 -0
  51. package/dist_ts/opsserver/handlers/config.handler.js +67 -0
  52. package/dist_ts/opsserver/handlers/email-ops.handler.d.ts +12 -0
  53. package/dist_ts/opsserver/handlers/email-ops.handler.js +219 -0
  54. package/dist_ts/opsserver/handlers/index.d.ts +7 -0
  55. package/dist_ts/opsserver/handlers/index.js +8 -0
  56. package/dist_ts/opsserver/handlers/logs.handler.d.ts +10 -0
  57. package/dist_ts/opsserver/handlers/logs.handler.js +122 -0
  58. package/dist_ts/opsserver/handlers/radius.handler.d.ts +8 -0
  59. package/dist_ts/opsserver/handlers/radius.handler.js +296 -0
  60. package/dist_ts/opsserver/handlers/security.handler.d.ts +11 -0
  61. package/dist_ts/opsserver/handlers/security.handler.js +217 -0
  62. package/dist_ts/opsserver/handlers/stats.handler.d.ts +13 -0
  63. package/dist_ts/opsserver/handlers/stats.handler.js +366 -0
  64. package/dist_ts/opsserver/helpers/guards.d.ts +25 -0
  65. package/dist_ts/opsserver/helpers/guards.js +41 -0
  66. package/dist_ts/opsserver/index.d.ts +1 -0
  67. package/dist_ts/opsserver/index.js +2 -0
  68. package/dist_ts/paths.d.ts +16 -0
  69. package/dist_ts/paths.js +43 -0
  70. package/dist_ts/plugins.d.ts +78 -0
  71. package/dist_ts/plugins.js +112 -0
  72. package/dist_ts/radius/classes.accounting.manager.d.ts +218 -0
  73. package/dist_ts/radius/classes.accounting.manager.js +417 -0
  74. package/dist_ts/radius/classes.radius.server.d.ts +171 -0
  75. package/dist_ts/radius/classes.radius.server.js +385 -0
  76. package/dist_ts/radius/classes.vlan.manager.d.ts +128 -0
  77. package/dist_ts/radius/classes.vlan.manager.js +272 -0
  78. package/dist_ts/radius/index.d.ts +13 -0
  79. package/dist_ts/radius/index.js +14 -0
  80. package/dist_ts/security/classes.contentscanner.d.ts +160 -0
  81. package/dist_ts/security/classes.contentscanner.js +637 -0
  82. package/dist_ts/security/classes.ipreputationchecker.d.ts +150 -0
  83. package/dist_ts/security/classes.ipreputationchecker.js +512 -0
  84. package/dist_ts/security/classes.securitylogger.d.ts +140 -0
  85. package/dist_ts/security/classes.securitylogger.js +235 -0
  86. package/dist_ts/security/index.d.ts +3 -0
  87. package/dist_ts/security/index.js +4 -0
  88. package/dist_ts/sms/classes.smsservice.d.ts +15 -0
  89. package/dist_ts/sms/classes.smsservice.js +72 -0
  90. package/dist_ts/sms/config/sms.config.d.ts +93 -0
  91. package/dist_ts/sms/config/sms.config.js +2 -0
  92. package/dist_ts/sms/config/sms.schema.d.ts +5 -0
  93. package/dist_ts/sms/config/sms.schema.js +121 -0
  94. package/dist_ts/sms/index.d.ts +1 -0
  95. package/dist_ts/sms/index.js +2 -0
  96. package/dist_ts/storage/classes.storagemanager.d.ts +82 -0
  97. package/dist_ts/storage/classes.storagemanager.js +344 -0
  98. package/dist_ts/storage/index.d.ts +1 -0
  99. package/dist_ts/storage/index.js +3 -0
  100. package/dist_ts_interfaces/data/auth.d.ts +8 -0
  101. package/dist_ts_interfaces/data/auth.js +2 -0
  102. package/dist_ts_interfaces/data/index.d.ts +2 -0
  103. package/dist_ts_interfaces/data/index.js +3 -0
  104. package/dist_ts_interfaces/data/stats.d.ts +120 -0
  105. package/dist_ts_interfaces/data/stats.js +2 -0
  106. package/{ts_interfaces/index.ts → dist_ts_interfaces/index.d.ts} +1 -5
  107. package/dist_ts_interfaces/index.js +8 -0
  108. package/{ts_interfaces/plugins.ts → dist_ts_interfaces/plugins.d.ts} +1 -5
  109. package/dist_ts_interfaces/plugins.js +4 -0
  110. package/dist_ts_interfaces/requests/admin.d.ts +31 -0
  111. package/dist_ts_interfaces/requests/admin.js +3 -0
  112. package/dist_ts_interfaces/requests/combined.stats.d.ts +24 -0
  113. package/dist_ts_interfaces/requests/combined.stats.js +2 -0
  114. package/dist_ts_interfaces/requests/config.d.ts +13 -0
  115. package/dist_ts_interfaces/requests/config.js +3 -0
  116. package/dist_ts_interfaces/requests/email-ops.d.ts +139 -0
  117. package/dist_ts_interfaces/requests/email-ops.js +3 -0
  118. package/{ts_interfaces/requests/index.ts → dist_ts_interfaces/requests/index.d.ts} +1 -1
  119. package/dist_ts_interfaces/requests/index.js +8 -0
  120. package/dist_ts_interfaces/requests/logs.d.ts +34 -0
  121. package/dist_ts_interfaces/requests/logs.js +4 -0
  122. package/dist_ts_interfaces/requests/radius.d.ts +268 -0
  123. package/dist_ts_interfaces/requests/radius.js +3 -0
  124. package/dist_ts_interfaces/requests/stats.d.ts +131 -0
  125. package/dist_ts_interfaces/requests/stats.js +4 -0
  126. package/dist_ts_web/00_commitinfo_data.d.ts +8 -0
  127. package/dist_ts_web/00_commitinfo_data.js +9 -0
  128. package/dist_ts_web/appstate.d.ts +96 -0
  129. package/dist_ts_web/appstate.js +587 -0
  130. package/dist_ts_web/elements/index.d.ts +8 -0
  131. package/dist_ts_web/elements/index.js +9 -0
  132. package/dist_ts_web/elements/ops-dashboard.d.ts +23 -0
  133. package/dist_ts_web/elements/ops-dashboard.js +271 -0
  134. package/dist_ts_web/elements/ops-view-config.d.ts +17 -0
  135. package/dist_ts_web/elements/ops-view-config.js +414 -0
  136. package/dist_ts_web/elements/ops-view-emails.d.ts +44 -0
  137. package/dist_ts_web/elements/ops-view-emails.js +880 -0
  138. package/dist_ts_web/elements/ops-view-logs.d.ts +13 -0
  139. package/dist_ts_web/elements/ops-view-logs.js +249 -0
  140. package/dist_ts_web/elements/ops-view-network.d.ts +65 -0
  141. package/dist_ts_web/elements/ops-view-network.js +579 -0
  142. package/dist_ts_web/elements/ops-view-overview.d.ts +14 -0
  143. package/dist_ts_web/elements/ops-view-overview.js +344 -0
  144. package/dist_ts_web/elements/ops-view-security.d.ts +21 -0
  145. package/dist_ts_web/elements/ops-view-security.js +568 -0
  146. package/dist_ts_web/elements/shared/css.d.ts +1 -0
  147. package/dist_ts_web/elements/shared/css.js +10 -0
  148. package/dist_ts_web/elements/shared/index.d.ts +2 -0
  149. package/dist_ts_web/elements/shared/index.js +3 -0
  150. package/dist_ts_web/elements/shared/ops-sectionheading.d.ts +5 -0
  151. package/dist_ts_web/elements/shared/ops-sectionheading.js +82 -0
  152. package/dist_ts_web/index.d.ts +1 -0
  153. package/dist_ts_web/index.js +10 -0
  154. package/dist_ts_web/plugins.d.ts +4 -0
  155. package/dist_ts_web/plugins.js +7 -0
  156. package/dist_ts_web/router.d.ts +25 -0
  157. package/dist_ts_web/router.js +165 -0
  158. package/package.json +22 -18
  159. package/readme.hints.md +3 -3
  160. package/readme.md +3 -3
  161. package/ts/00_commitinfo_data.ts +1 -1
  162. package/ts/cache/classes.cachedb.ts +3 -2
  163. package/ts/classes.dcrouter.ts +2 -2
  164. package/ts/paths.ts +11 -5
  165. package/ts_web/00_commitinfo_data.ts +1 -1
  166. package/.dockerignore +0 -1
  167. package/.gitea/workflows/docker_nottags.yaml +0 -71
  168. package/.gitea/workflows/docker_tags.yaml +0 -106
  169. package/.playwright-mcp/dcrouter-scrollbar-issue.png +0 -0
  170. package/.playwright-mcp/page-2026-02-01T23-10-23-737Z.png +0 -0
  171. package/.playwright-mcp/page-2026-02-01T23-11-19-449Z.png +0 -0
  172. package/.playwright-mcp/page-2026-02-01T23-12-03-126Z.png +0 -0
  173. package/.playwright-mcp/page-2026-02-01T23-12-15-576Z.png +0 -0
  174. package/.vscode/launch.json +0 -11
  175. package/.vscode/settings.json +0 -26
  176. package/Dockerfile +0 -46
  177. package/changelog.md +0 -350
  178. package/cli.child.js +0 -4
  179. package/cli.child.ts +0 -4
  180. package/cli.ts.js +0 -5
  181. package/html/index.html +0 -121
  182. package/test/readme.md +0 -443
  183. package/test/test.config.md +0 -175
  184. package/test/test.contentscanner.ts +0 -265
  185. package/test/test.dcrouter.email.ts +0 -159
  186. package/test/test.dns-server-config.ts +0 -140
  187. package/test/test.dns-socket-handler.ts +0 -148
  188. package/test/test.errors.ts +0 -274
  189. package/test/test.ipreputationchecker.ts +0 -179
  190. package/test/test.jwt-auth.ts +0 -131
  191. package/test/test.opsserver-api.ts +0 -84
  192. package/test/test.protected-endpoint.ts +0 -120
  193. package/test/test.storagemanager.ts +0 -289
  194. package/test_watch/devserver.ts +0 -35
  195. package/ts_interfaces/data/auth.ts +0 -8
  196. package/ts_interfaces/data/index.ts +0 -2
  197. package/ts_interfaces/data/stats.ts +0 -131
  198. package/ts_interfaces/readme.md +0 -205
  199. package/ts_interfaces/requests/admin.ts +0 -46
  200. package/ts_interfaces/requests/combined.stats.ts +0 -25
  201. package/ts_interfaces/requests/config.ts +0 -18
  202. package/ts_interfaces/requests/email-ops.ts +0 -239
  203. package/ts_interfaces/requests/logs.ts +0 -44
  204. package/ts_interfaces/requests/radius.ts +0 -329
  205. package/ts_interfaces/requests/stats.ts +0 -162
  206. package/ts_interfaces/tspublish.json +0 -3
  207. package/tsconfig.json +0 -12
@@ -0,0 +1,180 @@
1
+ import * as plugins from '../../plugins.js';
2
+ import * as interfaces from '../../../dist_ts_interfaces/index.js';
3
+ export class AdminHandler {
4
+ opsServerRef;
5
+ typedrouter = new plugins.typedrequest.TypedRouter();
6
+ // JWT instance
7
+ smartjwtInstance;
8
+ // Simple in-memory user storage (in production, use proper database)
9
+ users = new Map();
10
+ constructor(opsServerRef) {
11
+ this.opsServerRef = opsServerRef;
12
+ // Add this handler's router to the parent
13
+ this.opsServerRef.typedrouter.addTypedRouter(this.typedrouter);
14
+ }
15
+ async initialize() {
16
+ await this.initializeJwt();
17
+ this.initializeDefaultUsers();
18
+ this.registerHandlers();
19
+ }
20
+ async initializeJwt() {
21
+ this.smartjwtInstance = new plugins.smartjwt.SmartJwt();
22
+ await this.smartjwtInstance.init();
23
+ // For development, create new keypair each time
24
+ // In production, load from storage like cloudly does
25
+ await this.smartjwtInstance.createNewKeyPair();
26
+ }
27
+ initializeDefaultUsers() {
28
+ // Add default admin user
29
+ const adminId = plugins.uuid.v4();
30
+ this.users.set(adminId, {
31
+ id: adminId,
32
+ username: 'admin',
33
+ password: 'admin',
34
+ role: 'admin',
35
+ });
36
+ }
37
+ registerHandlers() {
38
+ // Admin Login Handler
39
+ this.typedrouter.addTypedHandler(new plugins.typedrequest.TypedHandler('adminLoginWithUsernameAndPassword', async (dataArg) => {
40
+ try {
41
+ // Find user by username and password
42
+ let user = null;
43
+ for (const [_, userData] of this.users) {
44
+ if (userData.username === dataArg.username && userData.password === dataArg.password) {
45
+ user = userData;
46
+ break;
47
+ }
48
+ }
49
+ if (!user) {
50
+ throw new plugins.typedrequest.TypedResponseError('login failed');
51
+ }
52
+ const expiresAtTimestamp = Date.now() + 3600 * 1000 * 24; // 24 hours
53
+ const jwt = await this.smartjwtInstance.createJWT({
54
+ userId: user.id,
55
+ status: 'loggedIn',
56
+ expiresAt: expiresAtTimestamp,
57
+ });
58
+ return {
59
+ identity: {
60
+ jwt,
61
+ userId: user.id,
62
+ name: user.username,
63
+ expiresAt: expiresAtTimestamp,
64
+ role: user.role,
65
+ type: 'user',
66
+ },
67
+ };
68
+ }
69
+ catch (error) {
70
+ if (error instanceof plugins.typedrequest.TypedResponseError) {
71
+ throw error;
72
+ }
73
+ throw new plugins.typedrequest.TypedResponseError('login failed');
74
+ }
75
+ }));
76
+ // Admin Logout Handler
77
+ this.typedrouter.addTypedHandler(new plugins.typedrequest.TypedHandler('adminLogout', async (dataArg) => {
78
+ // In a real implementation, you might want to blacklist the JWT
79
+ // For now, just return success
80
+ return {
81
+ success: true,
82
+ };
83
+ }));
84
+ // Verify Identity Handler
85
+ this.typedrouter.addTypedHandler(new plugins.typedrequest.TypedHandler('verifyIdentity', async (dataArg) => {
86
+ if (!dataArg.identity?.jwt) {
87
+ return {
88
+ valid: false,
89
+ };
90
+ }
91
+ try {
92
+ const jwtData = await this.smartjwtInstance.verifyJWTAndGetData(dataArg.identity.jwt);
93
+ // Check if expired
94
+ if (jwtData.expiresAt < Date.now()) {
95
+ return {
96
+ valid: false,
97
+ };
98
+ }
99
+ // Check if logged in
100
+ if (jwtData.status !== 'loggedIn') {
101
+ return {
102
+ valid: false,
103
+ };
104
+ }
105
+ // Find user
106
+ const user = this.users.get(jwtData.userId);
107
+ if (!user) {
108
+ return {
109
+ valid: false,
110
+ };
111
+ }
112
+ return {
113
+ valid: true,
114
+ identity: {
115
+ jwt: dataArg.identity.jwt,
116
+ userId: user.id,
117
+ name: user.username,
118
+ expiresAt: jwtData.expiresAt,
119
+ role: user.role,
120
+ type: 'user',
121
+ },
122
+ };
123
+ }
124
+ catch (error) {
125
+ return {
126
+ valid: false,
127
+ };
128
+ }
129
+ }));
130
+ }
131
+ /**
132
+ * Create a guard for valid identity (matching cloudly pattern)
133
+ */
134
+ validIdentityGuard = new plugins.smartguard.Guard(async (dataArg) => {
135
+ if (!dataArg.identity?.jwt) {
136
+ return false;
137
+ }
138
+ try {
139
+ const jwtData = await this.smartjwtInstance.verifyJWTAndGetData(dataArg.identity.jwt);
140
+ // Check expiration
141
+ if (jwtData.expiresAt < Date.now()) {
142
+ return false;
143
+ }
144
+ // Check status
145
+ if (jwtData.status !== 'loggedIn') {
146
+ return false;
147
+ }
148
+ // Verify data hasn't been tampered with
149
+ if (dataArg.identity.expiresAt !== jwtData.expiresAt) {
150
+ return false;
151
+ }
152
+ if (dataArg.identity.userId !== jwtData.userId) {
153
+ return false;
154
+ }
155
+ return true;
156
+ }
157
+ catch (error) {
158
+ return false;
159
+ }
160
+ }, {
161
+ failedHint: 'identity is not valid',
162
+ name: 'validIdentityGuard',
163
+ });
164
+ /**
165
+ * Create a guard for admin identity (matching cloudly pattern)
166
+ */
167
+ adminIdentityGuard = new plugins.smartguard.Guard(async (dataArg) => {
168
+ // First check if identity is valid
169
+ const isValid = await this.validIdentityGuard.exec(dataArg);
170
+ if (!isValid) {
171
+ return false;
172
+ }
173
+ // Check if user has admin role
174
+ return dataArg.identity.role === 'admin';
175
+ }, {
176
+ failedHint: 'user is not admin',
177
+ name: 'adminIdentityGuard',
178
+ });
179
+ }
180
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRtaW4uaGFuZGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3RzL29wc3NlcnZlci9oYW5kbGVycy9hZG1pbi5oYW5kbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFFNUMsT0FBTyxLQUFLLFVBQVUsTUFBTSxpQ0FBaUMsQ0FBQztBQVE5RCxNQUFNLE9BQU8sWUFBWTtJQWNIO0lBYmIsV0FBVyxHQUFHLElBQUksT0FBTyxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUU1RCxlQUFlO0lBQ1IsZ0JBQWdCLENBQXNDO0lBRTdELHFFQUFxRTtJQUM3RCxLQUFLLEdBQUcsSUFBSSxHQUFHLEVBS25CLENBQUM7SUFFTCxZQUFvQixZQUF1QjtRQUF2QixpQkFBWSxHQUFaLFlBQVksQ0FBVztRQUN6QywwQ0FBMEM7UUFDMUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBRU0sS0FBSyxDQUFDLFVBQVU7UUFDckIsTUFBTSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDM0IsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7UUFDOUIsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVPLEtBQUssQ0FBQyxhQUFhO1FBQ3pCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDeEQsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLENBQUM7UUFFbkMsZ0RBQWdEO1FBQ2hELHFEQUFxRDtRQUNyRCxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO0lBQ2pELENBQUM7SUFFTyxzQkFBc0I7UUFDNUIseUJBQXlCO1FB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
@@ -0,0 +1,9 @@
1
+ import * as plugins from '../../plugins.js';
2
+ import type { OpsServer } from '../classes.opsserver.js';
3
+ export declare class ConfigHandler {
4
+ private opsServerRef;
5
+ typedrouter: plugins.typedrequest.TypedRouter;
6
+ constructor(opsServerRef: OpsServer);
7
+ private registerHandlers;
8
+ private getConfiguration;
9
+ }
@@ -0,0 +1,67 @@
1
+ import * as plugins from '../../plugins.js';
2
+ import * as interfaces from '../../../dist_ts_interfaces/index.js';
3
+ export class ConfigHandler {
4
+ opsServerRef;
5
+ typedrouter = new plugins.typedrequest.TypedRouter();
6
+ constructor(opsServerRef) {
7
+ this.opsServerRef = opsServerRef;
8
+ // Add this handler's router to the parent
9
+ this.opsServerRef.typedrouter.addTypedRouter(this.typedrouter);
10
+ this.registerHandlers();
11
+ }
12
+ registerHandlers() {
13
+ // Get Configuration Handler (read-only)
14
+ this.typedrouter.addTypedHandler(new plugins.typedrequest.TypedHandler('getConfiguration', async (dataArg, toolsArg) => {
15
+ const config = await this.getConfiguration(dataArg.section);
16
+ return {
17
+ config,
18
+ section: dataArg.section,
19
+ };
20
+ }));
21
+ }
22
+ async getConfiguration(section) {
23
+ const dcRouter = this.opsServerRef.dcRouterRef;
24
+ // Get email domains if email server is configured
25
+ let emailDomains = [];
26
+ if (dcRouter.emailServer && dcRouter.emailServer.domainRegistry) {
27
+ emailDomains = dcRouter.emailServer.domainRegistry.getAllDomains();
28
+ }
29
+ else if (dcRouter.options.emailConfig?.domains) {
30
+ // Fallback: get domains from email config options
31
+ emailDomains = dcRouter.options.emailConfig.domains.map(d => typeof d === 'string' ? d : d.domain);
32
+ }
33
+ return {
34
+ email: {
35
+ enabled: !!dcRouter.emailServer,
36
+ ports: dcRouter.emailServer ? [25, 465, 587, 2525] : [],
37
+ maxMessageSize: 10 * 1024 * 1024, // 10MB default
38
+ rateLimits: {
39
+ perMinute: 10,
40
+ perHour: 100,
41
+ perDay: 1000,
42
+ },
43
+ domains: emailDomains,
44
+ },
45
+ dns: {
46
+ enabled: !!dcRouter.dnsServer,
47
+ port: 53,
48
+ nameservers: dcRouter.options.dnsNsDomains || [],
49
+ caching: true,
50
+ ttl: 300,
51
+ },
52
+ proxy: {
53
+ enabled: !!dcRouter.smartProxy,
54
+ httpPort: 80,
55
+ httpsPort: 443,
56
+ maxConnections: 1000,
57
+ },
58
+ security: {
59
+ blockList: [],
60
+ rateLimit: true,
61
+ spamDetection: true,
62
+ tlsRequired: false,
63
+ },
64
+ };
65
+ }
66
+ }
67
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmhhbmRsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90cy9vcHNzZXJ2ZXIvaGFuZGxlcnMvY29uZmlnLmhhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUU1QyxPQUFPLEtBQUssVUFBVSxNQUFNLGlDQUFpQyxDQUFDO0FBRTlELE1BQU0sT0FBTyxhQUFhO0lBR0o7SUFGYixXQUFXLEdBQUcsSUFBSSxPQUFPLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBRTVELFlBQW9CLFlBQXVCO1FBQXZCLGlCQUFZLEdBQVosWUFBWSxDQUFXO1FBQ3pDLDBDQUEwQztRQUMxQyxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQy9ELElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFTyxnQkFBZ0I7UUFDdEIsd0NBQXdDO1FBQ3hDLElBQUksQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUM5QixJQUFJLE9BQU8sQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUNuQyxrQkFBa0IsRUFDbEIsS0FBSyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsRUFBRTtZQUMxQixNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDNUQsT0FBTztnQkFDTCxNQUFNO2dCQUNOLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTzthQUN6QixDQUFDO1FBQ0osQ0FBQyxDQUNGLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFTyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsT0FBZ0I7UUFnQzdDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDO1FBRS9DLGtEQUFrRDtRQUNsRCxJQUFJLFlBQVksR0FBYSxFQUFFLENBQUM7UUFDaEMsSUFBSSxRQUFRLENBQUMsV0FBVyxJQUFJLFFBQVEsQ0FBQyxXQUFXLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDaEUsWUFBWSxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3JFLENBQUM7YUFBTSxJQUFJLFFBQVEsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLE9BQU8sRUFBRSxDQUFDO1lBQ2pELGtEQUFrRDtZQUNsRCxZQUFZLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUMxRCxPQUFPLENBQUMsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FDckMsQ0FBQztRQUNKLENBQUM7UUFFRCxPQUFPO1lBQ0wsS0FBSyxFQUFFO2dCQUNMLE9BQU8sRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLFdBQVc7Z0JBQy9CLEtBQUssRUFBRSxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO2dCQUN2RCxjQUFjLEVBQUUsRUFBRSxHQUFHLElBQUksR0FBRyxJQUFJLEVBQUUsZUFBZTtnQkFDakQsVUFBVSxFQUFFO29CQUNWLFNBQVMsRUFBRSxFQUFFO29CQUNiLE9BQU8sRUFBRSxHQUFHO29CQUNaLE1BQU0sRUFBRSxJQUFJO2lCQUNiO2dCQUNELE9BQU8sRUFBRSxZQUFZO2FBQ3RCO1lBQ0QsR0FBRyxFQUFFO2dCQUNILE9BQU8sRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVM7Z0JBQzdCLElBQUksRUFBRSxFQUFFO2dCQUNSLFdBQVcsRUFBRSxRQUFRLENBQUMsT0FBTyxDQUFDLFlBQVksSUFBSSxFQUFFO2dCQUNoRCxPQUFPLEVBQUUsSUFBSTtnQkFDYixHQUFHLEVBQUUsR0FBRzthQUNUO1lBQ0QsS0FBSyxFQUFFO2dCQUNMLE9BQU8sRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLFVBQVU7Z0JBQzlCLFFBQVEsRUFBRSxFQUFFO2dCQUNaLFNBQVMsRUFBRSxHQUFHO2dCQUNkLGNBQWMsRUFBRSxJQUFJO2FBQ3JCO1lBQ0QsUUFBUSxFQUFFO2dCQUNSLFNBQVMsRUFBRSxFQUFFO2dCQUNiLFNBQVMsRUFBRSxJQUFJO2dCQUNmLGFBQWEsRUFBRSxJQUFJO2dCQUNuQixXQUFXLEVBQUUsS0FBSzthQUNuQjtTQUNGLENBQUM7SUFDSixDQUFDO0NBQ0YifQ==
@@ -0,0 +1,12 @@
1
+ import * as plugins from '../../plugins.js';
2
+ import type { OpsServer } from '../classes.opsserver.js';
3
+ export declare class EmailOpsHandler {
4
+ private opsServerRef;
5
+ typedrouter: plugins.typedrequest.TypedRouter;
6
+ constructor(opsServerRef: OpsServer);
7
+ private registerHandlers;
8
+ /**
9
+ * Helper method to get queue items with filtering and pagination
10
+ */
11
+ private getQueueItems;
12
+ }
@@ -0,0 +1,219 @@
1
+ import * as plugins from '../../plugins.js';
2
+ import * as interfaces from '../../../dist_ts_interfaces/index.js';
3
+ import { SecurityLogger } from '../../security/index.js';
4
+ export class EmailOpsHandler {
5
+ opsServerRef;
6
+ typedrouter = new plugins.typedrequest.TypedRouter();
7
+ constructor(opsServerRef) {
8
+ this.opsServerRef = opsServerRef;
9
+ // Add this handler's router to the parent
10
+ this.opsServerRef.typedrouter.addTypedRouter(this.typedrouter);
11
+ this.registerHandlers();
12
+ }
13
+ registerHandlers() {
14
+ // Get Queued Emails Handler
15
+ this.typedrouter.addTypedHandler(new plugins.typedrequest.TypedHandler('getQueuedEmails', async (dataArg) => {
16
+ const emailServer = this.opsServerRef.dcRouterRef.emailServer;
17
+ if (!emailServer?.deliveryQueue) {
18
+ return { items: [], total: 0 };
19
+ }
20
+ const queue = emailServer.deliveryQueue;
21
+ const stats = queue.getStats();
22
+ // Get all queue items and filter by status if provided
23
+ const items = this.getQueueItems(dataArg.status, dataArg.limit || 50, dataArg.offset || 0);
24
+ return {
25
+ items,
26
+ total: stats.queueSize,
27
+ };
28
+ }));
29
+ // Get Sent Emails Handler
30
+ this.typedrouter.addTypedHandler(new plugins.typedrequest.TypedHandler('getSentEmails', async (dataArg) => {
31
+ const items = this.getQueueItems('delivered', dataArg.limit || 50, dataArg.offset || 0);
32
+ return {
33
+ items,
34
+ total: items.length, // Note: total would ideally come from a counter
35
+ };
36
+ }));
37
+ // Get Failed Emails Handler
38
+ this.typedrouter.addTypedHandler(new plugins.typedrequest.TypedHandler('getFailedEmails', async (dataArg) => {
39
+ const items = this.getQueueItems('failed', dataArg.limit || 50, dataArg.offset || 0);
40
+ return {
41
+ items,
42
+ total: items.length,
43
+ };
44
+ }));
45
+ // Resend Failed Email Handler
46
+ this.typedrouter.addTypedHandler(new plugins.typedrequest.TypedHandler('resendEmail', async (dataArg) => {
47
+ const emailServer = this.opsServerRef.dcRouterRef.emailServer;
48
+ if (!emailServer?.deliveryQueue) {
49
+ return { success: false, error: 'Email server not available' };
50
+ }
51
+ const queue = emailServer.deliveryQueue;
52
+ const item = queue.getItem(dataArg.emailId);
53
+ if (!item) {
54
+ return { success: false, error: 'Email not found in queue' };
55
+ }
56
+ if (item.status !== 'failed') {
57
+ return { success: false, error: `Email is not in failed state (current: ${item.status})` };
58
+ }
59
+ try {
60
+ // Re-enqueue the failed email by creating a new queue entry
61
+ // with the same data but reset attempt count
62
+ const newQueueId = await queue.enqueue(item.processingResult, item.processingMode, item.route);
63
+ // Optionally remove the old failed entry
64
+ await queue.removeItem(dataArg.emailId);
65
+ return { success: true, newQueueId };
66
+ }
67
+ catch (error) {
68
+ return {
69
+ success: false,
70
+ error: error instanceof Error ? error.message : 'Failed to resend email'
71
+ };
72
+ }
73
+ }));
74
+ // Get Security Incidents Handler
75
+ this.typedrouter.addTypedHandler(new plugins.typedrequest.TypedHandler('getSecurityIncidents', async (dataArg) => {
76
+ const securityLogger = SecurityLogger.getInstance();
77
+ const filter = {};
78
+ if (dataArg.level) {
79
+ filter.level = dataArg.level;
80
+ }
81
+ if (dataArg.type) {
82
+ filter.type = dataArg.type;
83
+ }
84
+ const incidents = securityLogger.getRecentEvents(dataArg.limit || 100, Object.keys(filter).length > 0 ? filter : undefined);
85
+ return {
86
+ incidents: incidents.map(event => ({
87
+ timestamp: event.timestamp,
88
+ level: event.level,
89
+ type: event.type,
90
+ message: event.message,
91
+ details: event.details,
92
+ ipAddress: event.ipAddress,
93
+ userId: event.userId,
94
+ sessionId: event.sessionId,
95
+ emailId: event.emailId,
96
+ domain: event.domain,
97
+ action: event.action,
98
+ result: event.result,
99
+ success: event.success,
100
+ })),
101
+ total: incidents.length,
102
+ };
103
+ }));
104
+ // Get Bounce Records Handler
105
+ this.typedrouter.addTypedHandler(new plugins.typedrequest.TypedHandler('getBounceRecords', async (dataArg) => {
106
+ const emailServer = this.opsServerRef.dcRouterRef.emailServer;
107
+ if (!emailServer) {
108
+ return { records: [], suppressionList: [], total: 0 };
109
+ }
110
+ // Use smartmta's public API for bounce/suppression data
111
+ const suppressionList = emailServer.getSuppressionList();
112
+ const hardBouncedAddresses = emailServer.getHardBouncedAddresses();
113
+ // Create bounce records from the available data
114
+ const records = [];
115
+ for (const email of hardBouncedAddresses) {
116
+ const bounceInfo = emailServer.getBounceHistory(email);
117
+ if (bounceInfo) {
118
+ records.push({
119
+ id: `bounce-${email}`,
120
+ recipient: email,
121
+ sender: '',
122
+ domain: email.split('@')[1] || '',
123
+ bounceType: bounceInfo.type,
124
+ bounceCategory: bounceInfo.category,
125
+ timestamp: bounceInfo.lastBounce,
126
+ processed: true,
127
+ });
128
+ }
129
+ }
130
+ // Apply limit and offset
131
+ const limit = dataArg.limit || 50;
132
+ const offset = dataArg.offset || 0;
133
+ const paginatedRecords = records.slice(offset, offset + limit);
134
+ return {
135
+ records: paginatedRecords,
136
+ suppressionList,
137
+ total: records.length,
138
+ };
139
+ }));
140
+ // Remove from Suppression List Handler
141
+ this.typedrouter.addTypedHandler(new plugins.typedrequest.TypedHandler('removeFromSuppressionList', async (dataArg) => {
142
+ const emailServer = this.opsServerRef.dcRouterRef.emailServer;
143
+ if (!emailServer) {
144
+ return { success: false, error: 'Email server not available' };
145
+ }
146
+ try {
147
+ emailServer.removeFromSuppressionList(dataArg.email);
148
+ return { success: true };
149
+ }
150
+ catch (error) {
151
+ return {
152
+ success: false,
153
+ error: error instanceof Error ? error.message : 'Failed to remove from suppression list'
154
+ };
155
+ }
156
+ }));
157
+ }
158
+ /**
159
+ * Helper method to get queue items with filtering and pagination
160
+ */
161
+ getQueueItems(status, limit = 50, offset = 0) {
162
+ const emailServer = this.opsServerRef.dcRouterRef.emailServer;
163
+ if (!emailServer?.deliveryQueue) {
164
+ return [];
165
+ }
166
+ const queue = emailServer.deliveryQueue;
167
+ const items = [];
168
+ // Access the internal queue map via reflection
169
+ // This is necessary because the queue doesn't expose iteration methods
170
+ const queueMap = queue.queue;
171
+ if (!queueMap) {
172
+ return [];
173
+ }
174
+ // Filter and convert items
175
+ for (const [id, item] of queueMap.entries()) {
176
+ // Apply status filter if provided
177
+ if (status && item.status !== status) {
178
+ continue;
179
+ }
180
+ // Extract email details from processingResult if available
181
+ const processingResult = item.processingResult;
182
+ let from = '';
183
+ let to = [];
184
+ let subject = '';
185
+ if (processingResult) {
186
+ // Check if it's an Email object or raw email data
187
+ if (processingResult.email) {
188
+ from = processingResult.email.from || '';
189
+ to = processingResult.email.to || [];
190
+ subject = processingResult.email.subject || '';
191
+ }
192
+ else if (processingResult.from) {
193
+ from = processingResult.from;
194
+ to = processingResult.to || [];
195
+ subject = processingResult.subject || '';
196
+ }
197
+ }
198
+ items.push({
199
+ id: item.id,
200
+ processingMode: item.processingMode,
201
+ status: item.status,
202
+ attempts: item.attempts,
203
+ nextAttempt: item.nextAttempt instanceof Date ? item.nextAttempt.getTime() : item.nextAttempt,
204
+ lastError: item.lastError,
205
+ createdAt: item.createdAt instanceof Date ? item.createdAt.getTime() : item.createdAt,
206
+ updatedAt: item.updatedAt instanceof Date ? item.updatedAt.getTime() : item.updatedAt,
207
+ deliveredAt: item.deliveredAt instanceof Date ? item.deliveredAt.getTime() : item.deliveredAt,
208
+ from,
209
+ to,
210
+ subject,
211
+ });
212
+ }
213
+ // Sort by createdAt descending (newest first)
214
+ items.sort((a, b) => b.createdAt - a.createdAt);
215
+ // Apply pagination
216
+ return items.slice(offset, offset + limit);
217
+ }
218
+ }
219
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW1haWwtb3BzLmhhbmRsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90cy9vcHNzZXJ2ZXIvaGFuZGxlcnMvZW1haWwtb3BzLmhhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUU1QyxPQUFPLEtBQUssVUFBVSxNQUFNLGlDQUFpQyxDQUFDO0FBQzlELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUV6RCxNQUFNLE9BQU8sZUFBZTtJQUdOO0lBRmIsV0FBVyxHQUFHLElBQUksT0FBTyxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUU1RCxZQUFvQixZQUF1QjtRQUF2QixpQkFBWSxHQUFaLFlBQVksQ0FBVztRQUN6QywwQ0FBMEM7UUFDMUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUMvRCxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRU8sZ0JBQWdCO1FBQ3RCLDRCQUE0QjtRQUM1QixJQUFJLENBQUMsV0FBVyxDQUFDLGVBQWUsQ0FDOUIsSUFBSSxPQUFPLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FDbkMsaUJBQWlCLEVBQ2pCLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRTtZQUNoQixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUM7WUFDOUQsSUFBSSxDQUFDLFdBQVcsRUFBRSxhQUFhLEVBQUUsQ0FBQztnQkFDaEMsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ2pDLENBQUM7WUFFRCxNQUFNLEtBQUssR0FBRyxXQUFXLENBQUMsYUFBYSxDQUFDO1lBQ3hDLE1BQU0sS0FBSyxHQUFHLEtBQUss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
@@ -0,0 +1,7 @@
1
+ export * from './admin.handler.js';
2
+ export * from './config.handler.js';
3
+ export * from './logs.handler.js';
4
+ export * from './security.handler.js';
5
+ export * from './stats.handler.js';
6
+ export * from './radius.handler.js';
7
+ export * from './email-ops.handler.js';
@@ -0,0 +1,8 @@
1
+ export * from './admin.handler.js';
2
+ export * from './config.handler.js';
3
+ export * from './logs.handler.js';
4
+ export * from './security.handler.js';
5
+ export * from './stats.handler.js';
6
+ export * from './radius.handler.js';
7
+ export * from './email-ops.handler.js';
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90cy9vcHNzZXJ2ZXIvaGFuZGxlcnMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxvQkFBb0IsQ0FBQztBQUNuQyxjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMsbUJBQW1CLENBQUM7QUFDbEMsY0FBYyx1QkFBdUIsQ0FBQztBQUN0QyxjQUFjLG9CQUFvQixDQUFDO0FBQ25DLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyx3QkFBd0IsQ0FBQyJ9
@@ -0,0 +1,10 @@
1
+ import * as plugins from '../../plugins.js';
2
+ import type { OpsServer } from '../classes.opsserver.js';
3
+ export declare class LogsHandler {
4
+ private opsServerRef;
5
+ typedrouter: plugins.typedrequest.TypedRouter;
6
+ constructor(opsServerRef: OpsServer);
7
+ private registerHandlers;
8
+ private getRecentLogs;
9
+ private setupLogStream;
10
+ }