@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.
Files changed (207) hide show
  1. package/dist_serve/bundle.js +5 -9
  2. package/dist_ts/00_commitinfo_data.d.ts +8 -0
  3. package/dist_ts/00_commitinfo_data.js +9 -0
  4. package/dist_ts/cache/classes.cache.cleaner.d.ts +47 -0
  5. package/dist_ts/cache/classes.cache.cleaner.js +130 -0
  6. package/dist_ts/cache/classes.cached.document.d.ts +76 -0
  7. package/dist_ts/cache/classes.cached.document.js +100 -0
  8. package/dist_ts/cache/classes.cachedb.d.ts +60 -0
  9. package/dist_ts/cache/classes.cachedb.js +126 -0
  10. package/dist_ts/cache/documents/classes.cached.email.d.ts +125 -0
  11. package/dist_ts/cache/documents/classes.cached.email.js +337 -0
  12. package/dist_ts/cache/documents/classes.cached.ip.reputation.d.ts +119 -0
  13. package/dist_ts/cache/documents/classes.cached.ip.reputation.js +323 -0
  14. package/dist_ts/cache/documents/index.d.ts +2 -0
  15. package/dist_ts/cache/documents/index.js +3 -0
  16. package/dist_ts/cache/index.d.ts +4 -0
  17. package/dist_ts/cache/index.js +7 -0
  18. package/dist_ts/classes.cert-provision-scheduler.d.ts +54 -0
  19. package/dist_ts/classes.cert-provision-scheduler.js +118 -0
  20. package/dist_ts/classes.dcrouter.d.ts +399 -0
  21. package/dist_ts/classes.dcrouter.js +1697 -0
  22. package/dist_ts/classes.storage-cert-manager.d.ts +18 -0
  23. package/dist_ts/classes.storage-cert-manager.js +43 -0
  24. package/dist_ts/config/classes.api-token-manager.d.ts +46 -0
  25. package/dist_ts/config/classes.api-token-manager.js +150 -0
  26. package/dist_ts/config/classes.route-config-manager.d.ts +38 -0
  27. package/dist_ts/config/classes.route-config-manager.js +257 -0
  28. package/dist_ts/config/index.d.ts +3 -0
  29. package/dist_ts/config/index.js +5 -0
  30. package/dist_ts/config/validator.d.ts +104 -0
  31. package/dist_ts/config/validator.js +152 -0
  32. package/dist_ts/errors/base.errors.d.ts +224 -0
  33. package/dist_ts/errors/base.errors.js +320 -0
  34. package/dist_ts/errors/error-handler.d.ts +98 -0
  35. package/dist_ts/errors/error-handler.js +282 -0
  36. package/dist_ts/errors/error.codes.d.ts +115 -0
  37. package/dist_ts/errors/error.codes.js +136 -0
  38. package/dist_ts/errors/index.d.ts +54 -0
  39. package/dist_ts/errors/index.js +136 -0
  40. package/dist_ts/errors/reputation.errors.d.ts +183 -0
  41. package/dist_ts/errors/reputation.errors.js +292 -0
  42. package/dist_ts/http3/http3-route-augmentation.d.ts +50 -0
  43. package/dist_ts/http3/http3-route-augmentation.js +98 -0
  44. package/dist_ts/http3/index.d.ts +1 -0
  45. package/dist_ts/http3/index.js +2 -0
  46. package/dist_ts/index.d.ts +8 -0
  47. package/dist_ts/index.js +29 -0
  48. package/dist_ts/logger.d.ts +21 -0
  49. package/dist_ts/logger.js +81 -0
  50. package/dist_ts/monitoring/classes.metricscache.d.ts +32 -0
  51. package/dist_ts/monitoring/classes.metricscache.js +63 -0
  52. package/dist_ts/monitoring/classes.metricsmanager.d.ts +184 -0
  53. package/dist_ts/monitoring/classes.metricsmanager.js +744 -0
  54. package/dist_ts/monitoring/index.d.ts +1 -0
  55. package/dist_ts/monitoring/index.js +2 -0
  56. package/dist_ts/opsserver/classes.opsserver.d.ts +38 -0
  57. package/dist_ts/opsserver/classes.opsserver.js +87 -0
  58. package/dist_ts/opsserver/handlers/admin.handler.d.ts +31 -0
  59. package/dist_ts/opsserver/handlers/admin.handler.js +180 -0
  60. package/dist_ts/opsserver/handlers/api-token.handler.d.ts +6 -0
  61. package/dist_ts/opsserver/handlers/api-token.handler.js +62 -0
  62. package/dist_ts/opsserver/handlers/certificate.handler.d.ts +32 -0
  63. package/dist_ts/opsserver/handlers/certificate.handler.js +421 -0
  64. package/dist_ts/opsserver/handlers/config.handler.d.ts +7 -0
  65. package/dist_ts/opsserver/handlers/config.handler.js +192 -0
  66. package/dist_ts/opsserver/handlers/email-ops.handler.d.ts +30 -0
  67. package/dist_ts/opsserver/handlers/email-ops.handler.js +227 -0
  68. package/dist_ts/opsserver/handlers/index.d.ts +12 -0
  69. package/dist_ts/opsserver/handlers/index.js +13 -0
  70. package/dist_ts/opsserver/handlers/logs.handler.d.ts +25 -0
  71. package/dist_ts/opsserver/handlers/logs.handler.js +256 -0
  72. package/dist_ts/opsserver/handlers/radius.handler.d.ts +6 -0
  73. package/dist_ts/opsserver/handlers/radius.handler.js +295 -0
  74. package/dist_ts/opsserver/handlers/remoteingress.handler.d.ts +6 -0
  75. package/dist_ts/opsserver/handlers/remoteingress.handler.js +156 -0
  76. package/dist_ts/opsserver/handlers/route-management.handler.d.ts +14 -0
  77. package/dist_ts/opsserver/handlers/route-management.handler.js +117 -0
  78. package/dist_ts/opsserver/handlers/security.handler.d.ts +9 -0
  79. package/dist_ts/opsserver/handlers/security.handler.js +233 -0
  80. package/dist_ts/opsserver/handlers/stats.handler.d.ts +11 -0
  81. package/dist_ts/opsserver/handlers/stats.handler.js +403 -0
  82. package/dist_ts/opsserver/handlers/vpn.handler.d.ts +6 -0
  83. package/dist_ts/opsserver/handlers/vpn.handler.js +197 -0
  84. package/dist_ts/opsserver/helpers/guards.d.ts +27 -0
  85. package/dist_ts/opsserver/helpers/guards.js +43 -0
  86. package/dist_ts/opsserver/index.d.ts +1 -0
  87. package/dist_ts/opsserver/index.js +2 -0
  88. package/dist_ts/paths.d.ts +26 -0
  89. package/dist_ts/paths.js +45 -0
  90. package/dist_ts/plugins.d.ts +81 -0
  91. package/dist_ts/plugins.js +115 -0
  92. package/dist_ts/radius/classes.accounting.manager.d.ts +231 -0
  93. package/dist_ts/radius/classes.accounting.manager.js +462 -0
  94. package/dist_ts/radius/classes.radius.server.d.ts +171 -0
  95. package/dist_ts/radius/classes.radius.server.js +386 -0
  96. package/dist_ts/radius/classes.vlan.manager.d.ts +128 -0
  97. package/dist_ts/radius/classes.vlan.manager.js +279 -0
  98. package/dist_ts/radius/index.d.ts +13 -0
  99. package/dist_ts/radius/index.js +14 -0
  100. package/dist_ts/remoteingress/classes.remoteingress-manager.d.ts +94 -0
  101. package/dist_ts/remoteingress/classes.remoteingress-manager.js +271 -0
  102. package/dist_ts/remoteingress/classes.tunnel-manager.d.ts +59 -0
  103. package/dist_ts/remoteingress/classes.tunnel-manager.js +165 -0
  104. package/dist_ts/remoteingress/index.d.ts +2 -0
  105. package/dist_ts/remoteingress/index.js +3 -0
  106. package/dist_ts/security/classes.contentscanner.d.ts +164 -0
  107. package/dist_ts/security/classes.contentscanner.js +642 -0
  108. package/dist_ts/security/classes.ipreputationchecker.d.ts +160 -0
  109. package/dist_ts/security/classes.ipreputationchecker.js +537 -0
  110. package/dist_ts/security/classes.securitylogger.d.ts +144 -0
  111. package/dist_ts/security/classes.securitylogger.js +235 -0
  112. package/dist_ts/security/index.d.ts +3 -0
  113. package/dist_ts/security/index.js +4 -0
  114. package/dist_ts/sms/classes.smsservice.d.ts +15 -0
  115. package/dist_ts/sms/classes.smsservice.js +72 -0
  116. package/dist_ts/sms/config/sms.config.d.ts +93 -0
  117. package/dist_ts/sms/config/sms.config.js +2 -0
  118. package/dist_ts/sms/config/sms.schema.d.ts +5 -0
  119. package/dist_ts/sms/config/sms.schema.js +121 -0
  120. package/dist_ts/sms/index.d.ts +1 -0
  121. package/dist_ts/sms/index.js +2 -0
  122. package/dist_ts/storage/classes.storagemanager.d.ts +83 -0
  123. package/dist_ts/storage/classes.storagemanager.js +348 -0
  124. package/dist_ts/storage/index.d.ts +1 -0
  125. package/dist_ts/storage/index.js +3 -0
  126. package/dist_ts/vpn/classes.vpn-manager.d.ts +129 -0
  127. package/dist_ts/vpn/classes.vpn-manager.js +329 -0
  128. package/dist_ts/vpn/index.d.ts +1 -0
  129. package/dist_ts/vpn/index.js +2 -0
  130. package/dist_ts_apiclient/classes.apitoken.d.ts +41 -0
  131. package/dist_ts_apiclient/classes.apitoken.js +115 -0
  132. package/dist_ts_apiclient/classes.certificate.d.ts +57 -0
  133. package/dist_ts_apiclient/classes.certificate.js +69 -0
  134. package/dist_ts_apiclient/classes.config.d.ts +7 -0
  135. package/dist_ts_apiclient/classes.config.js +11 -0
  136. package/dist_ts_apiclient/classes.dcrouterapiclient.d.ts +41 -0
  137. package/dist_ts_apiclient/classes.dcrouterapiclient.js +81 -0
  138. package/dist_ts_apiclient/classes.email.d.ts +30 -0
  139. package/dist_ts_apiclient/classes.email.js +52 -0
  140. package/dist_ts_apiclient/classes.logs.d.ts +21 -0
  141. package/dist_ts_apiclient/classes.logs.js +14 -0
  142. package/dist_ts_apiclient/classes.radius.d.ts +59 -0
  143. package/dist_ts_apiclient/classes.radius.js +95 -0
  144. package/dist_ts_apiclient/classes.remoteingress.d.ts +54 -0
  145. package/dist_ts_apiclient/classes.remoteingress.js +136 -0
  146. package/dist_ts_apiclient/classes.route.d.ts +42 -0
  147. package/dist_ts_apiclient/classes.route.js +154 -0
  148. package/dist_ts_apiclient/classes.stats.d.ts +47 -0
  149. package/dist_ts_apiclient/classes.stats.js +38 -0
  150. package/dist_ts_apiclient/index.d.ts +10 -0
  151. package/dist_ts_apiclient/index.js +14 -0
  152. package/dist_ts_apiclient/plugins.d.ts +3 -0
  153. package/dist_ts_apiclient/plugins.js +5 -0
  154. package/dist_ts_interfaces/data/remoteingress.d.ts +2 -0
  155. package/dist_ts_interfaces/data/vpn.d.ts +1 -2
  156. package/dist_ts_interfaces/requests/vpn.d.ts +1 -1
  157. package/dist_ts_web/00_commitinfo_data.d.ts +8 -0
  158. package/dist_ts_web/00_commitinfo_data.js +9 -0
  159. package/dist_ts_web/appstate.d.ts +238 -0
  160. package/dist_ts_web/appstate.js +1174 -0
  161. package/dist_ts_web/elements/index.d.ts +13 -0
  162. package/dist_ts_web/elements/index.js +14 -0
  163. package/dist_ts_web/elements/ops-dashboard.d.ts +23 -0
  164. package/dist_ts_web/elements/ops-dashboard.js +323 -0
  165. package/dist_ts_web/elements/ops-view-apitokens.d.ts +13 -0
  166. package/dist_ts_web/elements/ops-view-apitokens.js +371 -0
  167. package/dist_ts_web/elements/ops-view-certificates.d.ts +22 -0
  168. package/dist_ts_web/elements/ops-view-certificates.js +528 -0
  169. package/dist_ts_web/elements/ops-view-config.d.ts +19 -0
  170. package/dist_ts_web/elements/ops-view-config.js +339 -0
  171. package/dist_ts_web/elements/ops-view-emails.d.ts +21 -0
  172. package/dist_ts_web/elements/ops-view-emails.js +165 -0
  173. package/dist_ts_web/elements/ops-view-logs.d.ts +13 -0
  174. package/dist_ts_web/elements/ops-view-logs.js +159 -0
  175. package/dist_ts_web/elements/ops-view-network.d.ts +71 -0
  176. package/dist_ts_web/elements/ops-view-network.js +764 -0
  177. package/dist_ts_web/elements/ops-view-overview.d.ts +22 -0
  178. package/dist_ts_web/elements/ops-view-overview.js +456 -0
  179. package/dist_ts_web/elements/ops-view-remoteingress.d.ts +20 -0
  180. package/dist_ts_web/elements/ops-view-remoteingress.js +494 -0
  181. package/dist_ts_web/elements/ops-view-routes.d.ts +12 -0
  182. package/dist_ts_web/elements/ops-view-routes.js +404 -0
  183. package/dist_ts_web/elements/ops-view-security.d.ts +21 -0
  184. package/dist_ts_web/elements/ops-view-security.js +574 -0
  185. package/dist_ts_web/elements/ops-view-vpn.d.ts +14 -0
  186. package/dist_ts_web/elements/ops-view-vpn.js +365 -0
  187. package/dist_ts_web/elements/shared/css.d.ts +1 -0
  188. package/dist_ts_web/elements/shared/css.js +10 -0
  189. package/dist_ts_web/elements/shared/index.d.ts +2 -0
  190. package/dist_ts_web/elements/shared/index.js +3 -0
  191. package/dist_ts_web/elements/shared/ops-sectionheading.d.ts +5 -0
  192. package/dist_ts_web/elements/shared/ops-sectionheading.js +82 -0
  193. package/dist_ts_web/index.d.ts +1 -0
  194. package/dist_ts_web/index.js +10 -0
  195. package/dist_ts_web/plugins.d.ts +6 -0
  196. package/dist_ts_web/plugins.js +11 -0
  197. package/dist_ts_web/router.d.ts +19 -0
  198. package/dist_ts_web/router.js +91 -0
  199. package/package.json +2 -2
  200. package/ts/00_commitinfo_data.ts +1 -1
  201. package/ts/classes.dcrouter.ts +51 -20
  202. package/ts/config/classes.route-config-manager.ts +7 -6
  203. package/ts/opsserver/handlers/vpn.handler.ts +3 -5
  204. package/ts/vpn/classes.vpn-manager.ts +68 -19
  205. package/ts_web/00_commitinfo_data.ts +1 -1
  206. package/ts_web/appstate.ts +2 -2
  207. package/ts_web/elements/ops-view-vpn.ts +5 -9
@@ -0,0 +1,574 @@
1
+ var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
2
+ function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
3
+ var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
4
+ var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
5
+ var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
6
+ var _, done = false;
7
+ for (var i = decorators.length - 1; i >= 0; i--) {
8
+ var context = {};
9
+ for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
10
+ for (var p in contextIn.access) context.access[p] = contextIn.access[p];
11
+ context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
12
+ var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
13
+ if (kind === "accessor") {
14
+ if (result === void 0) continue;
15
+ if (result === null || typeof result !== "object") throw new TypeError("Object expected");
16
+ if (_ = accept(result.get)) descriptor.get = _;
17
+ if (_ = accept(result.set)) descriptor.set = _;
18
+ if (_ = accept(result.init)) initializers.unshift(_);
19
+ }
20
+ else if (_ = accept(result)) {
21
+ if (kind === "field") initializers.unshift(_);
22
+ else descriptor[key] = _;
23
+ }
24
+ }
25
+ if (target) Object.defineProperty(target, contextIn.name, descriptor);
26
+ done = true;
27
+ };
28
+ var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
29
+ var useValue = arguments.length > 2;
30
+ for (var i = 0; i < initializers.length; i++) {
31
+ value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
32
+ }
33
+ return useValue ? value : void 0;
34
+ };
35
+ import * as plugins from '../plugins.js';
36
+ import * as shared from './shared/index.js';
37
+ import * as appstate from '../appstate.js';
38
+ import { DeesElement, customElement, html, state, css, cssManager, } from '@design.estate/dees-element';
39
+ import {} from '@design.estate/dees-catalog';
40
+ let OpsViewSecurity = (() => {
41
+ let _classDecorators = [customElement('ops-view-security')];
42
+ let _classDescriptor;
43
+ let _classExtraInitializers = [];
44
+ let _classThis;
45
+ let _classSuper = DeesElement;
46
+ let _statsState_decorators;
47
+ let _statsState_initializers = [];
48
+ let _statsState_extraInitializers = [];
49
+ let _selectedTab_decorators;
50
+ let _selectedTab_initializers = [];
51
+ let _selectedTab_extraInitializers = [];
52
+ var OpsViewSecurity = class extends _classSuper {
53
+ static { _classThis = this; }
54
+ static {
55
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
56
+ _statsState_decorators = [state()];
57
+ _selectedTab_decorators = [state()];
58
+ __esDecorate(this, null, _statsState_decorators, { kind: "accessor", name: "statsState", static: false, private: false, access: { has: obj => "statsState" in obj, get: obj => obj.statsState, set: (obj, value) => { obj.statsState = value; } }, metadata: _metadata }, _statsState_initializers, _statsState_extraInitializers);
59
+ __esDecorate(this, null, _selectedTab_decorators, { kind: "accessor", name: "selectedTab", static: false, private: false, access: { has: obj => "selectedTab" in obj, get: obj => obj.selectedTab, set: (obj, value) => { obj.selectedTab = value; } }, metadata: _metadata }, _selectedTab_initializers, _selectedTab_extraInitializers);
60
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
61
+ OpsViewSecurity = _classThis = _classDescriptor.value;
62
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
63
+ }
64
+ #statsState_accessor_storage = __runInitializers(this, _statsState_initializers, {
65
+ serverStats: null,
66
+ emailStats: null,
67
+ dnsStats: null,
68
+ securityMetrics: null,
69
+ lastUpdated: 0,
70
+ isLoading: false,
71
+ error: null,
72
+ });
73
+ get statsState() { return this.#statsState_accessor_storage; }
74
+ set statsState(value) { this.#statsState_accessor_storage = value; }
75
+ #selectedTab_accessor_storage = (__runInitializers(this, _statsState_extraInitializers), __runInitializers(this, _selectedTab_initializers, 'overview'));
76
+ get selectedTab() { return this.#selectedTab_accessor_storage; }
77
+ set selectedTab(value) { this.#selectedTab_accessor_storage = value; }
78
+ constructor() {
79
+ super();
80
+ __runInitializers(this, _selectedTab_extraInitializers);
81
+ const subscription = appstate.statsStatePart
82
+ .select((stateArg) => stateArg)
83
+ .subscribe((statsState) => {
84
+ this.statsState = statsState;
85
+ });
86
+ this.rxSubscriptions.push(subscription);
87
+ }
88
+ static styles = [
89
+ cssManager.defaultStyles,
90
+ shared.viewHostCss,
91
+ css `
92
+ .tabs {
93
+ display: flex;
94
+ gap: 8px;
95
+ margin-bottom: 24px;
96
+ border-bottom: 2px solid ${cssManager.bdTheme('#e9ecef', '#333')};
97
+ }
98
+
99
+ .tab {
100
+ padding: 12px 24px;
101
+ background: none;
102
+ border: none;
103
+ border-bottom: 2px solid transparent;
104
+ cursor: pointer;
105
+ font-size: 16px;
106
+ color: ${cssManager.bdTheme('#666', '#999')};
107
+ transition: all 0.2s ease;
108
+ }
109
+
110
+ .tab:hover {
111
+ color: ${cssManager.bdTheme('#333', '#ccc')};
112
+ }
113
+
114
+ .tab.active {
115
+ color: ${cssManager.bdTheme('#2196F3', '#4a90e2')};
116
+ border-bottom-color: ${cssManager.bdTheme('#2196F3', '#4a90e2')};
117
+ }
118
+
119
+ h2 {
120
+ margin: 32px 0 16px 0;
121
+ font-size: 24px;
122
+ font-weight: 600;
123
+ color: ${cssManager.bdTheme('#333', '#ccc')};
124
+ }
125
+
126
+ dees-statsgrid {
127
+ margin-bottom: 32px;
128
+ }
129
+
130
+ .securityCard {
131
+ background: ${cssManager.bdTheme('#fff', '#222')};
132
+ border: 1px solid ${cssManager.bdTheme('#e9ecef', '#333')};
133
+ border-radius: 8px;
134
+ padding: 24px;
135
+ position: relative;
136
+ overflow: hidden;
137
+ }
138
+
139
+ .securityCard.alert {
140
+ border-color: ${cssManager.bdTheme('#f44336', '#ff6666')};
141
+ background: ${cssManager.bdTheme('#ffebee', '#4a1f1f')};
142
+ }
143
+
144
+ .securityCard.warning {
145
+ border-color: ${cssManager.bdTheme('#ff9800', '#ffaa33')};
146
+ background: ${cssManager.bdTheme('#fff3e0', '#4a3a1f')};
147
+ }
148
+
149
+ .securityCard.success {
150
+ border-color: ${cssManager.bdTheme('#4caf50', '#66cc66')};
151
+ background: ${cssManager.bdTheme('#e8f5e9', '#1f3f1f')};
152
+ }
153
+
154
+ .cardHeader {
155
+ display: flex;
156
+ justify-content: space-between;
157
+ align-items: center;
158
+ margin-bottom: 16px;
159
+ }
160
+
161
+ .cardTitle {
162
+ font-size: 18px;
163
+ font-weight: 600;
164
+ color: ${cssManager.bdTheme('#333', '#ccc')};
165
+ }
166
+
167
+ .cardStatus {
168
+ font-size: 14px;
169
+ padding: 4px 12px;
170
+ border-radius: 16px;
171
+ font-weight: 500;
172
+ }
173
+
174
+ .status-critical {
175
+ background: ${cssManager.bdTheme('#f44336', '#ff6666')};
176
+ color: ${cssManager.bdTheme('#fff', '#fff')};
177
+ }
178
+
179
+ .status-warning {
180
+ background: ${cssManager.bdTheme('#ff9800', '#ffaa33')};
181
+ color: ${cssManager.bdTheme('#fff', '#fff')};
182
+ }
183
+
184
+ .status-good {
185
+ background: ${cssManager.bdTheme('#4caf50', '#66cc66')};
186
+ color: ${cssManager.bdTheme('#fff', '#fff')};
187
+ }
188
+
189
+ .metricValue {
190
+ font-size: 32px;
191
+ font-weight: 700;
192
+ margin-bottom: 8px;
193
+ }
194
+
195
+ .metricLabel {
196
+ font-size: 14px;
197
+ color: ${cssManager.bdTheme('#666', '#999')};
198
+ }
199
+
200
+ .actionButton {
201
+ margin-top: 16px;
202
+ }
203
+
204
+ .blockedIpList {
205
+ max-height: 400px;
206
+ overflow-y: auto;
207
+ }
208
+
209
+ .blockedIpItem {
210
+ display: flex;
211
+ justify-content: space-between;
212
+ align-items: center;
213
+ padding: 12px;
214
+ border-bottom: 1px solid ${cssManager.bdTheme('#e9ecef', '#333')};
215
+ }
216
+
217
+ .blockedIpItem:last-child {
218
+ border-bottom: none;
219
+ }
220
+
221
+ .ipAddress {
222
+ font-family: 'Consolas', 'Monaco', monospace;
223
+ font-weight: 600;
224
+ }
225
+
226
+ .blockReason {
227
+ font-size: 14px;
228
+ color: ${cssManager.bdTheme('#666', '#999')};
229
+ }
230
+
231
+ .blockTime {
232
+ font-size: 12px;
233
+ color: ${cssManager.bdTheme('#999', '#666')};
234
+ }
235
+ `,
236
+ ];
237
+ render() {
238
+ return html `
239
+ <ops-sectionheading>Security</ops-sectionheading>
240
+
241
+ <div class="tabs">
242
+ <button
243
+ class="tab ${this.selectedTab === 'overview' ? 'active' : ''}"
244
+ @click=${() => this.selectedTab = 'overview'}
245
+ >
246
+ Overview
247
+ </button>
248
+ <button
249
+ class="tab ${this.selectedTab === 'blocked' ? 'active' : ''}"
250
+ @click=${() => this.selectedTab = 'blocked'}
251
+ >
252
+ Blocked IPs
253
+ </button>
254
+ <button
255
+ class="tab ${this.selectedTab === 'authentication' ? 'active' : ''}"
256
+ @click=${() => this.selectedTab = 'authentication'}
257
+ >
258
+ Authentication
259
+ </button>
260
+ <button
261
+ class="tab ${this.selectedTab === 'email-security' ? 'active' : ''}"
262
+ @click=${() => this.selectedTab = 'email-security'}
263
+ >
264
+ Email Security
265
+ </button>
266
+ </div>
267
+
268
+ ${this.renderTabContent()}
269
+ `;
270
+ }
271
+ renderTabContent() {
272
+ const metrics = this.statsState.securityMetrics;
273
+ if (!metrics) {
274
+ return html `
275
+ <div class="loadingMessage">
276
+ <p>Loading security metrics...</p>
277
+ </div>
278
+ `;
279
+ }
280
+ switch (this.selectedTab) {
281
+ case 'overview':
282
+ return this.renderOverview(metrics);
283
+ case 'blocked':
284
+ return this.renderBlockedIPs(metrics);
285
+ case 'authentication':
286
+ return this.renderAuthentication(metrics);
287
+ case 'email-security':
288
+ return this.renderEmailSecurity(metrics);
289
+ }
290
+ }
291
+ renderOverview(metrics) {
292
+ const threatLevel = this.calculateThreatLevel(metrics);
293
+ const threatScore = this.getThreatScore(metrics);
294
+ // Derive active sessions from recent successful auth events (last hour)
295
+ const allEvents = metrics.recentEvents || [];
296
+ const oneHourAgo = Date.now() - 3600000;
297
+ const recentAuthSuccesses = allEvents.filter((evt) => evt.type === 'authentication' && evt.success === true && evt.timestamp >= oneHourAgo).length;
298
+ const tiles = [
299
+ {
300
+ id: 'threatLevel',
301
+ title: 'Threat Level',
302
+ value: threatScore,
303
+ type: 'gauge',
304
+ icon: 'lucide:Shield',
305
+ gaugeOptions: {
306
+ min: 0,
307
+ max: 100,
308
+ thresholds: [
309
+ { value: 0, color: '#ef4444' },
310
+ { value: 30, color: '#f59e0b' },
311
+ { value: 70, color: '#22c55e' },
312
+ ],
313
+ },
314
+ description: `Status: ${threatLevel.toUpperCase()}`,
315
+ },
316
+ {
317
+ id: 'blockedThreats',
318
+ title: 'Blocked Threats',
319
+ value: (metrics.blockedIPs?.length || 0) + metrics.spamDetected,
320
+ type: 'number',
321
+ icon: 'lucide:ShieldCheck',
322
+ color: '#ef4444',
323
+ description: 'Total threats blocked today',
324
+ },
325
+ {
326
+ id: 'activeSessions',
327
+ title: 'Active Sessions',
328
+ value: recentAuthSuccesses,
329
+ type: 'number',
330
+ icon: 'lucide:Users',
331
+ color: '#22c55e',
332
+ description: 'Authenticated in last hour',
333
+ },
334
+ {
335
+ id: 'authFailures',
336
+ title: 'Auth Failures',
337
+ value: metrics.authenticationFailures,
338
+ type: 'number',
339
+ icon: 'lucide:LockOpen',
340
+ color: metrics.authenticationFailures > 10 ? '#ef4444' : '#f59e0b',
341
+ description: 'Failed login attempts today',
342
+ },
343
+ ];
344
+ return html `
345
+ <dees-statsgrid
346
+ .tiles=${tiles}
347
+ .minTileWidth=${200}
348
+ ></dees-statsgrid>
349
+
350
+ <h2>Recent Security Events</h2>
351
+ <dees-table
352
+ .heading1=${'Security Events'}
353
+ .heading2=${'Last 24 hours'}
354
+ .data=${this.getSecurityEvents(metrics)}
355
+ .displayFunction=${(item) => ({
356
+ 'Time': new Date(item.timestamp).toLocaleTimeString(),
357
+ 'Event': item.event,
358
+ 'Severity': item.severity,
359
+ 'Details': item.details,
360
+ })}
361
+ ></dees-table>
362
+ `;
363
+ }
364
+ renderBlockedIPs(metrics) {
365
+ return html `
366
+ <div class="securityCard">
367
+ <div class="cardHeader">
368
+ <h3 class="cardTitle">Blocked IP Addresses</h3>
369
+ <dees-button @click=${() => this.clearBlockedIPs()}>
370
+ Clear All
371
+ </dees-button>
372
+ </div>
373
+
374
+ <div class="blockedIpList">
375
+ ${metrics.blockedIPs && metrics.blockedIPs.length > 0 ? metrics.blockedIPs.map((ipAddress, index) => html `
376
+ <div class="blockedIpItem">
377
+ <div>
378
+ <div class="ipAddress">${ipAddress}</div>
379
+ <div class="blockReason">Suspicious activity</div>
380
+ <div class="blockTime">Blocked</div>
381
+ </div>
382
+ <dees-button @click=${() => this.unblockIP(ipAddress)}>
383
+ Unblock
384
+ </dees-button>
385
+ </div>
386
+ `) : html `
387
+ <p>No blocked IPs</p>
388
+ `}
389
+ </div>
390
+ </div>
391
+ `;
392
+ }
393
+ renderAuthentication(metrics) {
394
+ // Derive auth events from recentEvents
395
+ const allEvents = metrics.recentEvents || [];
396
+ const authEvents = allEvents.filter((evt) => evt.type === 'authentication');
397
+ const successfulLogins = authEvents.filter((evt) => evt.success === true).length;
398
+ const tiles = [
399
+ {
400
+ id: 'authFailures',
401
+ title: 'Authentication Failures',
402
+ value: metrics.authenticationFailures,
403
+ type: 'number',
404
+ icon: 'lucide:LockOpen',
405
+ color: metrics.authenticationFailures > 10 ? '#ef4444' : '#f59e0b',
406
+ description: 'Failed authentication attempts today',
407
+ },
408
+ {
409
+ id: 'successfulLogins',
410
+ title: 'Successful Logins',
411
+ value: successfulLogins,
412
+ type: 'number',
413
+ icon: 'lucide:Lock',
414
+ color: '#22c55e',
415
+ description: 'Successful logins today',
416
+ },
417
+ ];
418
+ // Map auth events to login history table data
419
+ const loginHistory = authEvents.map((evt) => ({
420
+ timestamp: evt.timestamp,
421
+ username: evt.details?.username || 'unknown',
422
+ ipAddress: evt.ipAddress || 'unknown',
423
+ success: evt.success ?? false,
424
+ reason: evt.success ? '' : evt.message || 'Authentication failed',
425
+ }));
426
+ return html `
427
+ <dees-statsgrid
428
+ .tiles=${tiles}
429
+ .minTileWidth=${200}
430
+ ></dees-statsgrid>
431
+
432
+ <h2>Recent Login Attempts</h2>
433
+ <dees-table
434
+ .heading1=${'Login History'}
435
+ .heading2=${'Recent authentication attempts'}
436
+ .data=${loginHistory}
437
+ .displayFunction=${(item) => ({
438
+ 'Time': new Date(item.timestamp).toLocaleString(),
439
+ 'Username': item.username,
440
+ 'IP Address': item.ipAddress,
441
+ 'Status': item.success ? 'Success' : 'Failed',
442
+ 'Reason': item.reason || '-',
443
+ })}
444
+ ></dees-table>
445
+ `;
446
+ }
447
+ renderEmailSecurity(metrics) {
448
+ const tiles = [
449
+ {
450
+ id: 'malware',
451
+ title: 'Malware Detection',
452
+ value: metrics.malwareDetected,
453
+ type: 'number',
454
+ icon: 'lucide:BugOff',
455
+ color: metrics.malwareDetected > 0 ? '#ef4444' : '#22c55e',
456
+ description: 'Malware detected',
457
+ },
458
+ {
459
+ id: 'phishing',
460
+ title: 'Phishing Detection',
461
+ value: metrics.phishingDetected,
462
+ type: 'number',
463
+ icon: 'lucide:Fish',
464
+ color: metrics.phishingDetected > 0 ? '#ef4444' : '#22c55e',
465
+ description: 'Phishing attempts detected',
466
+ },
467
+ {
468
+ id: 'suspicious',
469
+ title: 'Suspicious Activities',
470
+ value: metrics.suspiciousActivities,
471
+ type: 'number',
472
+ icon: 'lucide:TriangleAlert',
473
+ color: metrics.suspiciousActivities > 5 ? '#ef4444' : '#f59e0b',
474
+ description: 'Suspicious activities detected',
475
+ },
476
+ {
477
+ id: 'spam',
478
+ title: 'Spam Detection',
479
+ value: metrics.spamDetected,
480
+ type: 'number',
481
+ icon: 'lucide:Ban',
482
+ color: '#f59e0b',
483
+ description: 'Spam emails blocked',
484
+ },
485
+ ];
486
+ return html `
487
+ <dees-statsgrid
488
+ .tiles=${tiles}
489
+ .minTileWidth=${200}
490
+ ></dees-statsgrid>
491
+
492
+ <h2>Email Security Configuration</h2>
493
+ <div class="securityCard">
494
+ <dees-form>
495
+ <dees-input-checkbox
496
+ .key=${'enableSPF'}
497
+ .label=${'Enable SPF checking'}
498
+ .value=${true}
499
+ ></dees-input-checkbox>
500
+ <dees-input-checkbox
501
+ .key=${'enableDKIM'}
502
+ .label=${'Enable DKIM validation'}
503
+ .value=${true}
504
+ ></dees-input-checkbox>
505
+ <dees-input-checkbox
506
+ .key=${'enableDMARC'}
507
+ .label=${'Enable DMARC policy enforcement'}
508
+ .value=${true}
509
+ ></dees-input-checkbox>
510
+ <dees-input-checkbox
511
+ .key=${'enableSpamFilter'}
512
+ .label=${'Enable spam filtering'}
513
+ .value=${true}
514
+ ></dees-input-checkbox>
515
+ </dees-form>
516
+ <dees-button
517
+ class="actionButton"
518
+ type="highlighted"
519
+ @click=${() => this.saveEmailSecuritySettings()}
520
+ >
521
+ Save Settings
522
+ </dees-button>
523
+ </div>
524
+ `;
525
+ }
526
+ calculateThreatLevel(metrics) {
527
+ const score = this.getThreatScore(metrics);
528
+ if (score < 30)
529
+ return 'alert';
530
+ if (score < 70)
531
+ return 'warning';
532
+ return 'success';
533
+ }
534
+ getThreatScore(metrics) {
535
+ // Simple scoring algorithm
536
+ let score = 100;
537
+ const blockedCount = Array.isArray(metrics.blockedIPs) ? metrics.blockedIPs.length : (metrics.blockedIPs || 0);
538
+ score -= blockedCount * 2;
539
+ score -= (metrics.authenticationFailures || 0) * 1;
540
+ score -= (metrics.spamDetected || 0) * 0.5;
541
+ score -= (metrics.malwareDetected || 0) * 3;
542
+ score -= (metrics.phishingDetected || 0) * 3;
543
+ score -= (metrics.suspiciousActivities || 0) * 2;
544
+ return Math.max(0, Math.min(100, Math.round(score)));
545
+ }
546
+ getSecurityEvents(metrics) {
547
+ const events = metrics.recentEvents || [];
548
+ return events.map((evt) => ({
549
+ timestamp: evt.timestamp,
550
+ event: evt.message,
551
+ severity: evt.level === 'critical' ? 'critical' : evt.level === 'error' ? 'high' : evt.level === 'warn' ? 'warning' : 'info',
552
+ details: evt.ipAddress ? `IP: ${evt.ipAddress}` : evt.domain ? `Domain: ${evt.domain}` : evt.type,
553
+ }));
554
+ }
555
+ async clearBlockedIPs() {
556
+ // SmartProxy manages IP blocking — not yet exposed via API
557
+ alert('Clearing blocked IPs is not yet supported from the UI.');
558
+ }
559
+ async unblockIP(ip) {
560
+ // SmartProxy manages IP blocking — not yet exposed via API
561
+ alert(`Unblocking IP ${ip} is not yet supported from the UI.`);
562
+ }
563
+ async saveEmailSecuritySettings() {
564
+ // Config is read-only from the UI for now
565
+ alert('Email security settings are read-only. Update the dcrouter configuration file to change these settings.');
566
+ }
567
+ static {
568
+ __runInitializers(_classThis, _classExtraInitializers);
569
+ }
570
+ };
571
+ return OpsViewSecurity = _classThis;
572
+ })();
573
+ export { OpsViewSecurity };
574
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BzLXZpZXctc2VjdXJpdHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90c193ZWIvZWxlbWVudHMvb3BzLXZpZXctc2VjdXJpdHkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxNQUFNLE1BQU0sbUJBQW1CLENBQUM7QUFDNUMsT0FBTyxLQUFLLFFBQVEsTUFBTSxnQkFBZ0IsQ0FBQztBQUUzQyxPQUFPLEVBQ0wsV0FBVyxFQUNYLGFBQWEsRUFDYixJQUFJLEVBQ0osS0FBSyxFQUNMLEdBQUcsRUFDSCxVQUFVLEdBQ1gsTUFBTSw2QkFBNkIsQ0FBQztBQUNyQyxPQUFPLEVBQW1CLE1BQU0sNkJBQTZCLENBQUM7SUFHakQsZUFBZTs0QkFEM0IsYUFBYSxDQUFDLG1CQUFtQixDQUFDOzs7O3NCQUNFLFdBQVc7Ozs7Ozs7K0JBQW5CLFNBQVEsV0FBVzs7OztzQ0FDN0MsS0FBSyxFQUFFO3VDQVdQLEtBQUssRUFBRTtZQVZSLG1MQUFTLFVBQVUsNkJBQVYsVUFBVSwrRkFRakI7WUFHRixzTEFBUyxXQUFXLDZCQUFYLFdBQVcsaUdBQTRFO1lBYmxHLDZLQTZnQkM7Ozs7UUEzZ0JDLGlGQUE0QztZQUMxQyxXQUFXLEVBQUUsSUFBSTtZQUNqQixVQUFVLEVBQUUsSUFBSTtZQUNoQixRQUFRLEVBQUUsSUFBSTtZQUNkLGVBQWUsRUFBRSxJQUFJO1lBQ3JCLFdBQVcsRUFBRSxDQUFDO1lBQ2QsU0FBUyxFQUFFLEtBQUs7WUFDaEIsS0FBSyxFQUFFLElBQUk7U0FDWixFQUFDO1FBUkYsSUFBUyxVQUFVLGdEQVFqQjtRQVJGLElBQVMsVUFBVSxzREFRakI7UUFHRiw0SUFBcUYsVUFBVSxHQUFDO1FBQWhHLElBQVMsV0FBVyxpREFBNEU7UUFBaEcsSUFBUyxXQUFXLHVEQUE0RTtRQUVoRztZQUNF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
@@ -0,0 +1,14 @@
1
+ import { DeesElement, type TemplateResult } from '@design.estate/dees-element';
2
+ import * as appstate from '../appstate.js';
3
+ declare global {
4
+ interface HTMLElementTagNameMap {
5
+ 'ops-view-vpn': OpsViewVpn;
6
+ }
7
+ }
8
+ export declare class OpsViewVpn extends DeesElement {
9
+ accessor vpnState: appstate.IVpnState;
10
+ constructor();
11
+ connectedCallback(): Promise<void>;
12
+ static styles: import("@design.estate/dees-element").CSSResult[];
13
+ render(): TemplateResult;
14
+ }