@serve.zone/dcrouter 12.0.0 → 12.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist_serve/bundle.js +1179 -1004
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/classes.dcrouter.d.ts +17 -1
- package/dist_ts/classes.dcrouter.js +16 -3
- package/dist_ts/config/classes.db-seeder.d.ts +25 -0
- package/dist_ts/config/classes.db-seeder.js +69 -0
- package/dist_ts/config/classes.reference-resolver.d.ts +80 -0
- package/dist_ts/config/classes.reference-resolver.js +482 -0
- package/dist_ts/config/classes.route-config-manager.d.ts +13 -3
- package/dist_ts/config/classes.route-config-manager.js +53 -3
- package/dist_ts/config/index.d.ts +2 -0
- package/dist_ts/config/index.js +3 -1
- package/dist_ts/db/documents/classes.network-target.doc.d.ts +15 -0
- package/dist_ts/db/documents/classes.network-target.doc.js +118 -0
- package/dist_ts/db/documents/classes.security-profile.doc.d.ts +16 -0
- package/dist_ts/db/documents/classes.security-profile.doc.js +118 -0
- package/dist_ts/db/documents/classes.stored-route.doc.d.ts +2 -0
- package/dist_ts/db/documents/classes.stored-route.doc.js +8 -2
- package/dist_ts/db/documents/classes.vpn-client.doc.d.ts +8 -0
- package/dist_ts/db/documents/classes.vpn-client.doc.js +50 -2
- package/dist_ts/db/documents/index.d.ts +2 -0
- package/dist_ts/db/documents/index.js +3 -1
- package/dist_ts/opsserver/classes.opsserver.d.ts +2 -0
- package/dist_ts/opsserver/classes.opsserver.js +5 -1
- package/dist_ts/opsserver/handlers/index.d.ts +2 -0
- package/dist_ts/opsserver/handlers/index.js +3 -1
- package/dist_ts/opsserver/handlers/network-target.handler.d.ts +10 -0
- package/dist_ts/opsserver/handlers/network-target.handler.js +117 -0
- package/dist_ts/opsserver/handlers/route-management.handler.js +3 -2
- package/dist_ts/opsserver/handlers/security-profile.handler.d.ts +10 -0
- package/dist_ts/opsserver/handlers/security-profile.handler.js +119 -0
- package/dist_ts/opsserver/handlers/vpn.handler.js +35 -1
- package/dist_ts/vpn/classes.vpn-manager.d.ts +33 -0
- package/dist_ts/vpn/classes.vpn-manager.js +122 -7
- package/dist_ts_interfaces/data/route-management.d.ts +48 -1
- package/dist_ts_interfaces/data/vpn.d.ts +8 -0
- package/dist_ts_interfaces/requests/index.d.ts +2 -0
- package/dist_ts_interfaces/requests/index.js +3 -1
- package/dist_ts_interfaces/requests/network-targets.d.ts +102 -0
- package/dist_ts_interfaces/requests/network-targets.js +2 -0
- package/dist_ts_interfaces/requests/route-management.d.ts +3 -1
- package/dist_ts_interfaces/requests/security-profiles.d.ts +102 -0
- package/dist_ts_interfaces/requests/security-profiles.js +2 -0
- package/dist_ts_interfaces/requests/vpn.d.ts +16 -0
- package/dist_ts_web/00_commitinfo_data.js +1 -1
- package/dist_ts_web/appstate.d.ts +59 -0
- package/dist_ts_web/appstate.js +192 -2
- package/dist_ts_web/elements/index.d.ts +2 -0
- package/dist_ts_web/elements/index.js +3 -1
- package/dist_ts_web/elements/ops-dashboard.js +13 -1
- package/dist_ts_web/elements/ops-view-networktargets.d.ts +17 -0
- package/dist_ts_web/elements/ops-view-networktargets.js +246 -0
- package/dist_ts_web/elements/ops-view-securityprofiles.d.ts +17 -0
- package/dist_ts_web/elements/ops-view-securityprofiles.js +275 -0
- package/dist_ts_web/elements/ops-view-vpn.js +155 -3
- package/dist_ts_web/router.d.ts +1 -1
- package/dist_ts_web/router.js +2 -2
- package/package.json +3 -3
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/classes.dcrouter.ts +35 -1
- package/ts/config/classes.db-seeder.ts +95 -0
- package/ts/config/classes.reference-resolver.ts +576 -0
- package/ts/config/classes.route-config-manager.ts +64 -1
- package/ts/config/index.ts +3 -1
- package/ts/db/documents/classes.network-target.doc.ts +48 -0
- package/ts/db/documents/classes.security-profile.doc.ts +49 -0
- package/ts/db/documents/classes.stored-route.doc.ts +4 -0
- package/ts/db/documents/classes.vpn-client.doc.ts +24 -0
- package/ts/db/documents/index.ts +2 -0
- package/ts/opsserver/classes.opsserver.ts +4 -0
- package/ts/opsserver/handlers/index.ts +3 -1
- package/ts/opsserver/handlers/network-target.handler.ts +167 -0
- package/ts/opsserver/handlers/route-management.handler.ts +2 -1
- package/ts/opsserver/handlers/security-profile.handler.ts +169 -0
- package/ts/opsserver/handlers/vpn.handler.ts +37 -0
- package/ts/vpn/classes.vpn-manager.ts +143 -6
- package/ts_web/00_commitinfo_data.ts +1 -1
- package/ts_web/appstate.ts +275 -1
- package/ts_web/elements/index.ts +2 -0
- package/ts_web/elements/ops-dashboard.ts +12 -0
- package/ts_web/elements/ops-view-networktargets.ts +214 -0
- package/ts_web/elements/ops-view-securityprofiles.ts +242 -0
- package/ts_web/elements/ops-view-vpn.ts +153 -2
- package/ts_web/router.ts +1 -1
|
@@ -74,6 +74,30 @@ let VpnClientDoc = (() => {
|
|
|
74
74
|
let _expiresAt_decorators;
|
|
75
75
|
let _expiresAt_initializers = [];
|
|
76
76
|
let _expiresAt_extraInitializers = [];
|
|
77
|
+
let _forceDestinationSmartproxy_decorators;
|
|
78
|
+
let _forceDestinationSmartproxy_initializers = [];
|
|
79
|
+
let _forceDestinationSmartproxy_extraInitializers = [];
|
|
80
|
+
let _destinationAllowList_decorators;
|
|
81
|
+
let _destinationAllowList_initializers = [];
|
|
82
|
+
let _destinationAllowList_extraInitializers = [];
|
|
83
|
+
let _destinationBlockList_decorators;
|
|
84
|
+
let _destinationBlockList_initializers = [];
|
|
85
|
+
let _destinationBlockList_extraInitializers = [];
|
|
86
|
+
let _useHostIp_decorators;
|
|
87
|
+
let _useHostIp_initializers = [];
|
|
88
|
+
let _useHostIp_extraInitializers = [];
|
|
89
|
+
let _useDhcp_decorators;
|
|
90
|
+
let _useDhcp_initializers = [];
|
|
91
|
+
let _useDhcp_extraInitializers = [];
|
|
92
|
+
let _staticIp_decorators;
|
|
93
|
+
let _staticIp_initializers = [];
|
|
94
|
+
let _staticIp_extraInitializers = [];
|
|
95
|
+
let _forceVlan_decorators;
|
|
96
|
+
let _forceVlan_initializers = [];
|
|
97
|
+
let _forceVlan_extraInitializers = [];
|
|
98
|
+
let _vlanId_decorators;
|
|
99
|
+
let _vlanId_initializers = [];
|
|
100
|
+
let _vlanId_extraInitializers = [];
|
|
77
101
|
var VpnClientDoc = class extends _classSuper {
|
|
78
102
|
static { _classThis = this; }
|
|
79
103
|
static {
|
|
@@ -89,6 +113,14 @@ let VpnClientDoc = (() => {
|
|
|
89
113
|
_createdAt_decorators = [plugins.smartdata.svDb()];
|
|
90
114
|
_updatedAt_decorators = [plugins.smartdata.svDb()];
|
|
91
115
|
_expiresAt_decorators = [plugins.smartdata.svDb()];
|
|
116
|
+
_forceDestinationSmartproxy_decorators = [plugins.smartdata.svDb()];
|
|
117
|
+
_destinationAllowList_decorators = [plugins.smartdata.svDb()];
|
|
118
|
+
_destinationBlockList_decorators = [plugins.smartdata.svDb()];
|
|
119
|
+
_useHostIp_decorators = [plugins.smartdata.svDb()];
|
|
120
|
+
_useDhcp_decorators = [plugins.smartdata.svDb()];
|
|
121
|
+
_staticIp_decorators = [plugins.smartdata.svDb()];
|
|
122
|
+
_forceVlan_decorators = [plugins.smartdata.svDb()];
|
|
123
|
+
_vlanId_decorators = [plugins.smartdata.svDb()];
|
|
92
124
|
__esDecorate(null, null, _clientId_decorators, { kind: "field", name: "clientId", static: false, private: false, access: { has: obj => "clientId" in obj, get: obj => obj.clientId, set: (obj, value) => { obj.clientId = value; } }, metadata: _metadata }, _clientId_initializers, _clientId_extraInitializers);
|
|
93
125
|
__esDecorate(null, null, _enabled_decorators, { kind: "field", name: "enabled", static: false, private: false, access: { has: obj => "enabled" in obj, get: obj => obj.enabled, set: (obj, value) => { obj.enabled = value; } }, metadata: _metadata }, _enabled_initializers, _enabled_extraInitializers);
|
|
94
126
|
__esDecorate(null, null, _serverDefinedClientTags_decorators, { kind: "field", name: "serverDefinedClientTags", static: false, private: false, access: { has: obj => "serverDefinedClientTags" in obj, get: obj => obj.serverDefinedClientTags, set: (obj, value) => { obj.serverDefinedClientTags = value; } }, metadata: _metadata }, _serverDefinedClientTags_initializers, _serverDefinedClientTags_extraInitializers);
|
|
@@ -100,6 +132,14 @@ let VpnClientDoc = (() => {
|
|
|
100
132
|
__esDecorate(null, null, _createdAt_decorators, { kind: "field", name: "createdAt", static: false, private: false, access: { has: obj => "createdAt" in obj, get: obj => obj.createdAt, set: (obj, value) => { obj.createdAt = value; } }, metadata: _metadata }, _createdAt_initializers, _createdAt_extraInitializers);
|
|
101
133
|
__esDecorate(null, null, _updatedAt_decorators, { kind: "field", name: "updatedAt", static: false, private: false, access: { has: obj => "updatedAt" in obj, get: obj => obj.updatedAt, set: (obj, value) => { obj.updatedAt = value; } }, metadata: _metadata }, _updatedAt_initializers, _updatedAt_extraInitializers);
|
|
102
134
|
__esDecorate(null, null, _expiresAt_decorators, { kind: "field", name: "expiresAt", static: false, private: false, access: { has: obj => "expiresAt" in obj, get: obj => obj.expiresAt, set: (obj, value) => { obj.expiresAt = value; } }, metadata: _metadata }, _expiresAt_initializers, _expiresAt_extraInitializers);
|
|
135
|
+
__esDecorate(null, null, _forceDestinationSmartproxy_decorators, { kind: "field", name: "forceDestinationSmartproxy", static: false, private: false, access: { has: obj => "forceDestinationSmartproxy" in obj, get: obj => obj.forceDestinationSmartproxy, set: (obj, value) => { obj.forceDestinationSmartproxy = value; } }, metadata: _metadata }, _forceDestinationSmartproxy_initializers, _forceDestinationSmartproxy_extraInitializers);
|
|
136
|
+
__esDecorate(null, null, _destinationAllowList_decorators, { kind: "field", name: "destinationAllowList", static: false, private: false, access: { has: obj => "destinationAllowList" in obj, get: obj => obj.destinationAllowList, set: (obj, value) => { obj.destinationAllowList = value; } }, metadata: _metadata }, _destinationAllowList_initializers, _destinationAllowList_extraInitializers);
|
|
137
|
+
__esDecorate(null, null, _destinationBlockList_decorators, { kind: "field", name: "destinationBlockList", static: false, private: false, access: { has: obj => "destinationBlockList" in obj, get: obj => obj.destinationBlockList, set: (obj, value) => { obj.destinationBlockList = value; } }, metadata: _metadata }, _destinationBlockList_initializers, _destinationBlockList_extraInitializers);
|
|
138
|
+
__esDecorate(null, null, _useHostIp_decorators, { kind: "field", name: "useHostIp", static: false, private: false, access: { has: obj => "useHostIp" in obj, get: obj => obj.useHostIp, set: (obj, value) => { obj.useHostIp = value; } }, metadata: _metadata }, _useHostIp_initializers, _useHostIp_extraInitializers);
|
|
139
|
+
__esDecorate(null, null, _useDhcp_decorators, { kind: "field", name: "useDhcp", static: false, private: false, access: { has: obj => "useDhcp" in obj, get: obj => obj.useDhcp, set: (obj, value) => { obj.useDhcp = value; } }, metadata: _metadata }, _useDhcp_initializers, _useDhcp_extraInitializers);
|
|
140
|
+
__esDecorate(null, null, _staticIp_decorators, { kind: "field", name: "staticIp", static: false, private: false, access: { has: obj => "staticIp" in obj, get: obj => obj.staticIp, set: (obj, value) => { obj.staticIp = value; } }, metadata: _metadata }, _staticIp_initializers, _staticIp_extraInitializers);
|
|
141
|
+
__esDecorate(null, null, _forceVlan_decorators, { kind: "field", name: "forceVlan", static: false, private: false, access: { has: obj => "forceVlan" in obj, get: obj => obj.forceVlan, set: (obj, value) => { obj.forceVlan = value; } }, metadata: _metadata }, _forceVlan_initializers, _forceVlan_extraInitializers);
|
|
142
|
+
__esDecorate(null, null, _vlanId_decorators, { kind: "field", name: "vlanId", static: false, private: false, access: { has: obj => "vlanId" in obj, get: obj => obj.vlanId, set: (obj, value) => { obj.vlanId = value; } }, metadata: _metadata }, _vlanId_initializers, _vlanId_extraInitializers);
|
|
103
143
|
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
104
144
|
VpnClientDoc = _classThis = _classDescriptor.value;
|
|
105
145
|
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
@@ -116,9 +156,17 @@ let VpnClientDoc = (() => {
|
|
|
116
156
|
createdAt = (__runInitializers(this, _wgPrivateKey_extraInitializers), __runInitializers(this, _createdAt_initializers, void 0));
|
|
117
157
|
updatedAt = (__runInitializers(this, _createdAt_extraInitializers), __runInitializers(this, _updatedAt_initializers, void 0));
|
|
118
158
|
expiresAt = (__runInitializers(this, _updatedAt_extraInitializers), __runInitializers(this, _expiresAt_initializers, void 0));
|
|
159
|
+
forceDestinationSmartproxy = (__runInitializers(this, _expiresAt_extraInitializers), __runInitializers(this, _forceDestinationSmartproxy_initializers, true));
|
|
160
|
+
destinationAllowList = (__runInitializers(this, _forceDestinationSmartproxy_extraInitializers), __runInitializers(this, _destinationAllowList_initializers, void 0));
|
|
161
|
+
destinationBlockList = (__runInitializers(this, _destinationAllowList_extraInitializers), __runInitializers(this, _destinationBlockList_initializers, void 0));
|
|
162
|
+
useHostIp = (__runInitializers(this, _destinationBlockList_extraInitializers), __runInitializers(this, _useHostIp_initializers, void 0));
|
|
163
|
+
useDhcp = (__runInitializers(this, _useHostIp_extraInitializers), __runInitializers(this, _useDhcp_initializers, void 0));
|
|
164
|
+
staticIp = (__runInitializers(this, _useDhcp_extraInitializers), __runInitializers(this, _staticIp_initializers, void 0));
|
|
165
|
+
forceVlan = (__runInitializers(this, _staticIp_extraInitializers), __runInitializers(this, _forceVlan_initializers, void 0));
|
|
166
|
+
vlanId = (__runInitializers(this, _forceVlan_extraInitializers), __runInitializers(this, _vlanId_initializers, void 0));
|
|
119
167
|
constructor() {
|
|
120
168
|
super();
|
|
121
|
-
__runInitializers(this,
|
|
169
|
+
__runInitializers(this, _vlanId_extraInitializers);
|
|
122
170
|
}
|
|
123
171
|
static async findByClientId(clientId) {
|
|
124
172
|
return await VpnClientDoc.getInstance({ clientId });
|
|
@@ -133,4 +181,4 @@ let VpnClientDoc = (() => {
|
|
|
133
181
|
return VpnClientDoc = _classThis;
|
|
134
182
|
})();
|
|
135
183
|
export { VpnClientDoc };
|
|
136
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
184
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy52cG4tY2xpZW50LmRvYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3RzL2RiL2RvY3VtZW50cy9jbGFzc2VzLnZwbi1jbGllbnQuZG9jLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUV2RCxNQUFNLEtBQUssR0FBRyxHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7SUFHeEMsWUFBWTs0QkFEeEIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7Ozs7c0JBQ1YsT0FBTyxDQUFDLFNBQVMsQ0FBQyxjQUFjOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzRCQUF4QyxTQUFRLFdBQTREOzs7O29DQUMzRixPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxFQUN2QixPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRTttQ0FHeEIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUU7bURBR3hCLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFO3VDQUd4QixPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRTtzQ0FHeEIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUU7MENBR3hCLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFO3VDQUd4QixPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRTt3Q0FHeEIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUU7cUNBR3hCLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxF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
|
|
@@ -3,6 +3,8 @@ export * from './classes.cached.ip.reputation.js';
|
|
|
3
3
|
export * from './classes.stored-route.doc.js';
|
|
4
4
|
export * from './classes.route-override.doc.js';
|
|
5
5
|
export * from './classes.api-token.doc.js';
|
|
6
|
+
export * from './classes.security-profile.doc.js';
|
|
7
|
+
export * from './classes.network-target.doc.js';
|
|
6
8
|
export * from './classes.vpn-server-keys.doc.js';
|
|
7
9
|
export * from './classes.vpn-client.doc.js';
|
|
8
10
|
export * from './classes.acme-cert.doc.js';
|
|
@@ -5,6 +5,8 @@ export * from './classes.cached.ip.reputation.js';
|
|
|
5
5
|
export * from './classes.stored-route.doc.js';
|
|
6
6
|
export * from './classes.route-override.doc.js';
|
|
7
7
|
export * from './classes.api-token.doc.js';
|
|
8
|
+
export * from './classes.security-profile.doc.js';
|
|
9
|
+
export * from './classes.network-target.doc.js';
|
|
8
10
|
// VPN document classes
|
|
9
11
|
export * from './classes.vpn-server-keys.doc.js';
|
|
10
12
|
export * from './classes.vpn-client.doc.js';
|
|
@@ -17,4 +19,4 @@ export * from './classes.remote-ingress-edge.doc.js';
|
|
|
17
19
|
// RADIUS document classes
|
|
18
20
|
export * from './classes.vlan-mappings.doc.js';
|
|
19
21
|
export * from './classes.accounting-session.doc.js';
|
|
20
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
22
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90cy9kYi9kb2N1bWVudHMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsOEJBQThCO0FBQzlCLGNBQWMsMkJBQTJCLENBQUM7QUFDMUMsY0FBYyxtQ0FBbUMsQ0FBQztBQUVsRCwwQkFBMEI7QUFDMUIsY0FBYywrQkFBK0IsQ0FBQztBQUM5QyxjQUFjLGlDQUFpQyxDQUFDO0FBQ2hELGNBQWMsNEJBQTRCLENBQUM7QUFDM0MsY0FBYyxtQ0FBbUMsQ0FBQztBQUNsRCxjQUFjLGlDQUFpQyxDQUFDO0FBRWhELHVCQUF1QjtBQUN2QixjQUFjLGtDQUFrQyxDQUFDO0FBQ2pELGNBQWMsNkJBQTZCLENBQUM7QUFFNUMsK0JBQStCO0FBQy9CLGNBQWMsNEJBQTRCLENBQUM7QUFDM0MsY0FBYyw2QkFBNkIsQ0FBQztBQUM1QyxjQUFjLCtCQUErQixDQUFDO0FBRTlDLGtDQUFrQztBQUNsQyxjQUFjLHNDQUFzQyxDQUFDO0FBRXJELDBCQUEwQjtBQUMxQixjQUFjLGdDQUFnQyxDQUFDO0FBQy9DLGNBQWMscUNBQXFDLENBQUMifQ==
|
|
@@ -28,6 +28,8 @@ export declare class OpsServer {
|
|
|
28
28
|
private routeManagementHandler;
|
|
29
29
|
private apiTokenHandler;
|
|
30
30
|
private vpnHandler;
|
|
31
|
+
private securityProfileHandler;
|
|
32
|
+
private networkTargetHandler;
|
|
31
33
|
constructor(dcRouterRefArg: DcRouter);
|
|
32
34
|
start(): Promise<void>;
|
|
33
35
|
/**
|
|
@@ -24,6 +24,8 @@ export class OpsServer {
|
|
|
24
24
|
routeManagementHandler;
|
|
25
25
|
apiTokenHandler;
|
|
26
26
|
vpnHandler;
|
|
27
|
+
securityProfileHandler;
|
|
28
|
+
networkTargetHandler;
|
|
27
29
|
constructor(dcRouterRefArg) {
|
|
28
30
|
this.dcRouterRef = dcRouterRefArg;
|
|
29
31
|
// Add our typedrouter to the dcRouter's main typedrouter
|
|
@@ -72,6 +74,8 @@ export class OpsServer {
|
|
|
72
74
|
this.routeManagementHandler = new handlers.RouteManagementHandler(this);
|
|
73
75
|
this.apiTokenHandler = new handlers.ApiTokenHandler(this);
|
|
74
76
|
this.vpnHandler = new handlers.VpnHandler(this);
|
|
77
|
+
this.securityProfileHandler = new handlers.SecurityProfileHandler(this);
|
|
78
|
+
this.networkTargetHandler = new handlers.NetworkTargetHandler(this);
|
|
75
79
|
console.log('✅ OpsServer TypedRequest handlers initialized');
|
|
76
80
|
}
|
|
77
81
|
async stop() {
|
|
@@ -84,4 +88,4 @@ export class OpsServer {
|
|
|
84
88
|
}
|
|
85
89
|
}
|
|
86
90
|
}
|
|
87
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
91
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5vcHNzZXJ2ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9vcHNzZXJ2ZXIvY2xhc3Nlcy5vcHNzZXJ2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxLQUFLLE9BQU8sTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxLQUFLLEtBQUssTUFBTSxhQUFhLENBQUM7QUFDckMsT0FBTyxLQUFLLFFBQVEsTUFBTSxxQkFBcUIsQ0FBQztBQUNoRCxPQUFPLEtBQUssVUFBVSxNQUFNLDhCQUE4QixDQUFDO0FBQzNELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRWpGLE1BQU0sT0FBTyxTQUFTO0lBQ2IsV0FBVyxDQUFXO0lBQ3RCLE1BQU0sQ0FBMkQ7SUFFeEUsMkZBQTJGO0lBQ3BGLFdBQVcsR0FBRyxJQUFJLE9BQU8sQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLENBQUM7SUFFNUQsZ0ZBQWdGO0lBQ3pFLFVBQVUsR0FBRyxJQUFJLE9BQU8sQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUF3RCxDQUFDO0lBQzFHLFdBQVcsR0FBRyxJQUFJLE9BQU8sQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUF3RCxDQUFDO0lBRWxILG9CQUFvQjtJQUNiLFlBQVksQ0FBeUI7SUFDcEMsYUFBYSxDQUEwQjtJQUN2QyxXQUFXLENBQXdCO0lBQ25DLGVBQWUsQ0FBNEI7SUFDM0MsWUFBWSxDQUF5QjtJQUNyQyxhQUFhLENBQTBCO0lBQ3ZDLGVBQWUsQ0FBNEI7SUFDM0Msa0JBQWtCLENBQStCO0lBQ2pELG9CQUFvQixDQUFpQztJQUNyRCxzQkFBc0IsQ0FBbUM7SUFDekQsZUFBZSxDQUE0QjtJQUMzQyxVQUFVLENBQXVCO0lBQ2pDLHNCQUFzQixDQUFtQztJQUN6RCxvQkFBb0IsQ0FBaUM7SUFFN0QsWUFBWSxjQUF3QjtRQUNsQyxJQUFJLENBQUMsV0FBVyxHQUFHLGNBQWMs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
|
|
@@ -10,3 +10,5 @@ export * from './remoteingress.handler.js';
|
|
|
10
10
|
export * from './route-management.handler.js';
|
|
11
11
|
export * from './api-token.handler.js';
|
|
12
12
|
export * from './vpn.handler.js';
|
|
13
|
+
export * from './security-profile.handler.js';
|
|
14
|
+
export * from './network-target.handler.js';
|
|
@@ -10,4 +10,6 @@ export * from './remoteingress.handler.js';
|
|
|
10
10
|
export * from './route-management.handler.js';
|
|
11
11
|
export * from './api-token.handler.js';
|
|
12
12
|
export * from './vpn.handler.js';
|
|
13
|
-
|
|
13
|
+
export * from './security-profile.handler.js';
|
|
14
|
+
export * from './network-target.handler.js';
|
|
15
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90cy9vcHNzZXJ2ZXIvaGFuZGxlcnMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxvQkFBb0IsQ0FBQztBQUNuQyxjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMsbUJBQW1CLENBQUM7QUFDbEMsY0FBYyx1QkFBdUIsQ0FBQztBQUN0QyxjQUFjLG9CQUFvQixDQUFDO0FBQ25DLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyx3QkFBd0IsQ0FBQztBQUN2QyxjQUFjLDBCQUEwQixDQUFDO0FBQ3pDLGNBQWMsNEJBQTRCLENBQUM7QUFDM0MsY0FBYywrQkFBK0IsQ0FBQztBQUM5QyxjQUFjLHdCQUF3QixDQUFDO0FBQ3ZDLGNBQWMsa0JBQWtCLENBQUM7QUFDakMsY0FBYywrQkFBK0IsQ0FBQztBQUM5QyxjQUFjLDZCQUE2QixDQUFDIn0=
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import * as plugins from '../../plugins.js';
|
|
2
|
+
import type { OpsServer } from '../classes.opsserver.js';
|
|
3
|
+
import * as interfaces from '../../../dist_ts_interfaces/index.js';
|
|
4
|
+
export declare class NetworkTargetHandler {
|
|
5
|
+
private opsServerRef;
|
|
6
|
+
typedrouter: plugins.typedrequest.TypedRouter<interfaces.typedrequestInterfaces.ITypedRequest>;
|
|
7
|
+
constructor(opsServerRef: OpsServer);
|
|
8
|
+
private requireAuth;
|
|
9
|
+
private registerHandlers;
|
|
10
|
+
}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import * as plugins from '../../plugins.js';
|
|
2
|
+
import * as interfaces from '../../../dist_ts_interfaces/index.js';
|
|
3
|
+
export class NetworkTargetHandler {
|
|
4
|
+
opsServerRef;
|
|
5
|
+
typedrouter = new plugins.typedrequest.TypedRouter();
|
|
6
|
+
constructor(opsServerRef) {
|
|
7
|
+
this.opsServerRef = opsServerRef;
|
|
8
|
+
this.opsServerRef.typedrouter.addTypedRouter(this.typedrouter);
|
|
9
|
+
this.registerHandlers();
|
|
10
|
+
}
|
|
11
|
+
async requireAuth(request, requiredScope) {
|
|
12
|
+
if (request.identity?.jwt) {
|
|
13
|
+
try {
|
|
14
|
+
const isAdmin = await this.opsServerRef.adminHandler.adminIdentityGuard.exec({
|
|
15
|
+
identity: request.identity,
|
|
16
|
+
});
|
|
17
|
+
if (isAdmin)
|
|
18
|
+
return request.identity.userId;
|
|
19
|
+
}
|
|
20
|
+
catch { /* fall through */ }
|
|
21
|
+
}
|
|
22
|
+
if (request.apiToken) {
|
|
23
|
+
const tokenManager = this.opsServerRef.dcRouterRef.apiTokenManager;
|
|
24
|
+
if (tokenManager) {
|
|
25
|
+
const token = await tokenManager.validateToken(request.apiToken);
|
|
26
|
+
if (token) {
|
|
27
|
+
if (!requiredScope || tokenManager.hasScope(token, requiredScope)) {
|
|
28
|
+
return token.createdBy;
|
|
29
|
+
}
|
|
30
|
+
throw new plugins.typedrequest.TypedResponseError('insufficient scope');
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
throw new plugins.typedrequest.TypedResponseError('unauthorized');
|
|
35
|
+
}
|
|
36
|
+
registerHandlers() {
|
|
37
|
+
// Get all network targets
|
|
38
|
+
this.typedrouter.addTypedHandler(new plugins.typedrequest.TypedHandler('getNetworkTargets', async (dataArg) => {
|
|
39
|
+
await this.requireAuth(dataArg, 'targets:read');
|
|
40
|
+
const resolver = this.opsServerRef.dcRouterRef.referenceResolver;
|
|
41
|
+
if (!resolver) {
|
|
42
|
+
return { targets: [] };
|
|
43
|
+
}
|
|
44
|
+
return { targets: resolver.listTargets() };
|
|
45
|
+
}));
|
|
46
|
+
// Get a single network target
|
|
47
|
+
this.typedrouter.addTypedHandler(new plugins.typedrequest.TypedHandler('getNetworkTarget', async (dataArg) => {
|
|
48
|
+
await this.requireAuth(dataArg, 'targets:read');
|
|
49
|
+
const resolver = this.opsServerRef.dcRouterRef.referenceResolver;
|
|
50
|
+
if (!resolver) {
|
|
51
|
+
return { target: null };
|
|
52
|
+
}
|
|
53
|
+
return { target: resolver.getTarget(dataArg.id) || null };
|
|
54
|
+
}));
|
|
55
|
+
// Create a network target
|
|
56
|
+
this.typedrouter.addTypedHandler(new plugins.typedrequest.TypedHandler('createNetworkTarget', async (dataArg) => {
|
|
57
|
+
const userId = await this.requireAuth(dataArg, 'targets:write');
|
|
58
|
+
const resolver = this.opsServerRef.dcRouterRef.referenceResolver;
|
|
59
|
+
if (!resolver) {
|
|
60
|
+
return { success: false, message: 'Reference resolver not initialized' };
|
|
61
|
+
}
|
|
62
|
+
const id = await resolver.createTarget({
|
|
63
|
+
name: dataArg.name,
|
|
64
|
+
description: dataArg.description,
|
|
65
|
+
host: dataArg.host,
|
|
66
|
+
port: dataArg.port,
|
|
67
|
+
createdBy: userId,
|
|
68
|
+
});
|
|
69
|
+
return { success: true, id };
|
|
70
|
+
}));
|
|
71
|
+
// Update a network target
|
|
72
|
+
this.typedrouter.addTypedHandler(new plugins.typedrequest.TypedHandler('updateNetworkTarget', async (dataArg) => {
|
|
73
|
+
await this.requireAuth(dataArg, 'targets:write');
|
|
74
|
+
const resolver = this.opsServerRef.dcRouterRef.referenceResolver;
|
|
75
|
+
const manager = this.opsServerRef.dcRouterRef.routeConfigManager;
|
|
76
|
+
if (!resolver || !manager) {
|
|
77
|
+
return { success: false, message: 'Not initialized' };
|
|
78
|
+
}
|
|
79
|
+
const { affectedRouteIds } = await resolver.updateTarget(dataArg.id, {
|
|
80
|
+
name: dataArg.name,
|
|
81
|
+
description: dataArg.description,
|
|
82
|
+
host: dataArg.host,
|
|
83
|
+
port: dataArg.port,
|
|
84
|
+
});
|
|
85
|
+
if (affectedRouteIds.length > 0) {
|
|
86
|
+
await manager.reResolveRoutes(affectedRouteIds);
|
|
87
|
+
}
|
|
88
|
+
return { success: true, affectedRouteCount: affectedRouteIds.length };
|
|
89
|
+
}));
|
|
90
|
+
// Delete a network target
|
|
91
|
+
this.typedrouter.addTypedHandler(new plugins.typedrequest.TypedHandler('deleteNetworkTarget', async (dataArg) => {
|
|
92
|
+
await this.requireAuth(dataArg, 'targets:write');
|
|
93
|
+
const resolver = this.opsServerRef.dcRouterRef.referenceResolver;
|
|
94
|
+
const manager = this.opsServerRef.dcRouterRef.routeConfigManager;
|
|
95
|
+
if (!resolver || !manager) {
|
|
96
|
+
return { success: false, message: 'Not initialized' };
|
|
97
|
+
}
|
|
98
|
+
const result = await resolver.deleteTarget(dataArg.id, dataArg.force ?? false, manager.getStoredRoutes());
|
|
99
|
+
if (result.success && dataArg.force) {
|
|
100
|
+
await manager.applyRoutes();
|
|
101
|
+
}
|
|
102
|
+
return result;
|
|
103
|
+
}));
|
|
104
|
+
// Get routes using a network target
|
|
105
|
+
this.typedrouter.addTypedHandler(new plugins.typedrequest.TypedHandler('getNetworkTargetUsage', async (dataArg) => {
|
|
106
|
+
await this.requireAuth(dataArg, 'targets:read');
|
|
107
|
+
const resolver = this.opsServerRef.dcRouterRef.referenceResolver;
|
|
108
|
+
const manager = this.opsServerRef.dcRouterRef.routeConfigManager;
|
|
109
|
+
if (!resolver || !manager) {
|
|
110
|
+
return { routes: [] };
|
|
111
|
+
}
|
|
112
|
+
const usage = resolver.getTargetUsageForId(dataArg.id, manager.getStoredRoutes());
|
|
113
|
+
return { routes: usage.map((u) => ({ id: u.id, name: u.routeName })) };
|
|
114
|
+
}));
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV0d29yay10YXJnZXQuaGFuZGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3RzL29wc3NlcnZlci9oYW5kbGVycy9uZXR3b3JrLXRhcmdldC5oYW5kbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFFNUMsT0FBTyxLQUFLLFVBQVUsTUFBTSxpQ0FBaUMsQ0FBQztBQUU5RCxNQUFNLE9BQU8sb0JBQW9CO0lBR1g7SUFGYixXQUFXLEdBQUcsSUFBSSxPQUFPLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBRTVELFlBQW9CLFlBQXVCO1FBQXZCLGlCQUFZLEdBQVosWUFBWSxDQUFXO1FBQ3pDLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDL0QsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVPLEtBQUssQ0FBQyxXQUFXLENBQ3ZCLE9BQW9FLEVBQ3BFLGFBQThDO1FBRTlDLElBQUksT0FBTyxDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUUsQ0FBQztZQUMxQixJQUFJLENBQUM7Z0JBQ0gsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUM7b0JBQzNFLFFBQVEsRUFBRSxPQUFPLENBQUMsUUFBUTtpQkFDM0IsQ0FBQyxDQUFDO2dCQUNILElBQUksT0FBTztvQkFBRSxPQUFPLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO1lBQzlDLENBQUM7WUFBQyxNQUFNLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQ2hDLENBQUM7UUFFRCxJQUFJLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNyQixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxD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
|
|
@@ -56,7 +56,7 @@ export class RouteManagementHandler {
|
|
|
56
56
|
if (!manager) {
|
|
57
57
|
return { success: false, message: 'Route management not initialized' };
|
|
58
58
|
}
|
|
59
|
-
const id = await manager.createRoute(dataArg.route, userId, dataArg.enabled ?? true);
|
|
59
|
+
const id = await manager.createRoute(dataArg.route, userId, dataArg.enabled ?? true, dataArg.metadata);
|
|
60
60
|
return { success: true, storedRouteId: id };
|
|
61
61
|
}));
|
|
62
62
|
// Update route
|
|
@@ -69,6 +69,7 @@ export class RouteManagementHandler {
|
|
|
69
69
|
const ok = await manager.updateRoute(dataArg.id, {
|
|
70
70
|
route: dataArg.route,
|
|
71
71
|
enabled: dataArg.enabled,
|
|
72
|
+
metadata: dataArg.metadata,
|
|
72
73
|
});
|
|
73
74
|
return { success: ok, message: ok ? undefined : 'Route not found' };
|
|
74
75
|
}));
|
|
@@ -114,4 +115,4 @@ export class RouteManagementHandler {
|
|
|
114
115
|
}));
|
|
115
116
|
}
|
|
116
117
|
}
|
|
117
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
118
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUtbWFuYWdlbWVudC5oYW5kbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdHMvb3Bzc2VydmVyL2hhbmRsZXJzL3JvdXRlLW1hbmFnZW1lbnQuaGFuZGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBRTVDLE9BQU8sS0FBSyxVQUFVLE1BQU0saUNBQWlDLENBQUM7QUFFOUQsTUFBTSxPQUFPLHNCQUFzQjtJQUdiO0lBRmIsV0FBVyxHQUFHLElBQUksT0FBTyxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUU1RCxZQUFvQixZQUF1QjtRQUF2QixpQkFBWSxHQUFaLFlBQVksQ0FBVztRQUN6QyxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQy9ELElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFRDs7O09BR0c7SUFDSyxLQUFLLENBQUMsV0FBVyxDQUN2QixPQUFvRSxFQUNwRSxhQUE4QztRQUU5Qyx5QkFBeUI7UUFDekIsSUFBSSxPQUFPLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRSxDQUFDO1lBQzFCLElBQUksQ0FBQztnQkFDSCxNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQztvQkFDM0UsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRO2lCQUMzQixDQUFDLENBQUM7Z0JBQ0gsSUFBSSxPQUFPO29CQUFFLE9BQU8sT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7WUFDOUMsQ0FBQztZQUFDLE1BQU0sQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDaEMsQ0FBQztRQUVELGdCQUFnQjtRQUNoQixJQUFJLE9BQU8sQ0FBQyxRQUFRLEVBQUUs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
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import * as plugins from '../../plugins.js';
|
|
2
|
+
import type { OpsServer } from '../classes.opsserver.js';
|
|
3
|
+
import * as interfaces from '../../../dist_ts_interfaces/index.js';
|
|
4
|
+
export declare class SecurityProfileHandler {
|
|
5
|
+
private opsServerRef;
|
|
6
|
+
typedrouter: plugins.typedrequest.TypedRouter<interfaces.typedrequestInterfaces.ITypedRequest>;
|
|
7
|
+
constructor(opsServerRef: OpsServer);
|
|
8
|
+
private requireAuth;
|
|
9
|
+
private registerHandlers;
|
|
10
|
+
}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import * as plugins from '../../plugins.js';
|
|
2
|
+
import * as interfaces from '../../../dist_ts_interfaces/index.js';
|
|
3
|
+
export class SecurityProfileHandler {
|
|
4
|
+
opsServerRef;
|
|
5
|
+
typedrouter = new plugins.typedrequest.TypedRouter();
|
|
6
|
+
constructor(opsServerRef) {
|
|
7
|
+
this.opsServerRef = opsServerRef;
|
|
8
|
+
this.opsServerRef.typedrouter.addTypedRouter(this.typedrouter);
|
|
9
|
+
this.registerHandlers();
|
|
10
|
+
}
|
|
11
|
+
async requireAuth(request, requiredScope) {
|
|
12
|
+
if (request.identity?.jwt) {
|
|
13
|
+
try {
|
|
14
|
+
const isAdmin = await this.opsServerRef.adminHandler.adminIdentityGuard.exec({
|
|
15
|
+
identity: request.identity,
|
|
16
|
+
});
|
|
17
|
+
if (isAdmin)
|
|
18
|
+
return request.identity.userId;
|
|
19
|
+
}
|
|
20
|
+
catch { /* fall through */ }
|
|
21
|
+
}
|
|
22
|
+
if (request.apiToken) {
|
|
23
|
+
const tokenManager = this.opsServerRef.dcRouterRef.apiTokenManager;
|
|
24
|
+
if (tokenManager) {
|
|
25
|
+
const token = await tokenManager.validateToken(request.apiToken);
|
|
26
|
+
if (token) {
|
|
27
|
+
if (!requiredScope || tokenManager.hasScope(token, requiredScope)) {
|
|
28
|
+
return token.createdBy;
|
|
29
|
+
}
|
|
30
|
+
throw new plugins.typedrequest.TypedResponseError('insufficient scope');
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
throw new plugins.typedrequest.TypedResponseError('unauthorized');
|
|
35
|
+
}
|
|
36
|
+
registerHandlers() {
|
|
37
|
+
// Get all security profiles
|
|
38
|
+
this.typedrouter.addTypedHandler(new plugins.typedrequest.TypedHandler('getSecurityProfiles', async (dataArg) => {
|
|
39
|
+
await this.requireAuth(dataArg, 'profiles:read');
|
|
40
|
+
const resolver = this.opsServerRef.dcRouterRef.referenceResolver;
|
|
41
|
+
if (!resolver) {
|
|
42
|
+
return { profiles: [] };
|
|
43
|
+
}
|
|
44
|
+
return { profiles: resolver.listProfiles() };
|
|
45
|
+
}));
|
|
46
|
+
// Get a single security profile
|
|
47
|
+
this.typedrouter.addTypedHandler(new plugins.typedrequest.TypedHandler('getSecurityProfile', async (dataArg) => {
|
|
48
|
+
await this.requireAuth(dataArg, 'profiles:read');
|
|
49
|
+
const resolver = this.opsServerRef.dcRouterRef.referenceResolver;
|
|
50
|
+
if (!resolver) {
|
|
51
|
+
return { profile: null };
|
|
52
|
+
}
|
|
53
|
+
return { profile: resolver.getProfile(dataArg.id) || null };
|
|
54
|
+
}));
|
|
55
|
+
// Create a security profile
|
|
56
|
+
this.typedrouter.addTypedHandler(new plugins.typedrequest.TypedHandler('createSecurityProfile', async (dataArg) => {
|
|
57
|
+
const userId = await this.requireAuth(dataArg, 'profiles:write');
|
|
58
|
+
const resolver = this.opsServerRef.dcRouterRef.referenceResolver;
|
|
59
|
+
if (!resolver) {
|
|
60
|
+
return { success: false, message: 'Reference resolver not initialized' };
|
|
61
|
+
}
|
|
62
|
+
const id = await resolver.createProfile({
|
|
63
|
+
name: dataArg.name,
|
|
64
|
+
description: dataArg.description,
|
|
65
|
+
security: dataArg.security,
|
|
66
|
+
extendsProfiles: dataArg.extendsProfiles,
|
|
67
|
+
createdBy: userId,
|
|
68
|
+
});
|
|
69
|
+
return { success: true, id };
|
|
70
|
+
}));
|
|
71
|
+
// Update a security profile
|
|
72
|
+
this.typedrouter.addTypedHandler(new plugins.typedrequest.TypedHandler('updateSecurityProfile', async (dataArg) => {
|
|
73
|
+
await this.requireAuth(dataArg, 'profiles:write');
|
|
74
|
+
const resolver = this.opsServerRef.dcRouterRef.referenceResolver;
|
|
75
|
+
const manager = this.opsServerRef.dcRouterRef.routeConfigManager;
|
|
76
|
+
if (!resolver || !manager) {
|
|
77
|
+
return { success: false, message: 'Not initialized' };
|
|
78
|
+
}
|
|
79
|
+
const { affectedRouteIds } = await resolver.updateProfile(dataArg.id, {
|
|
80
|
+
name: dataArg.name,
|
|
81
|
+
description: dataArg.description,
|
|
82
|
+
security: dataArg.security,
|
|
83
|
+
extendsProfiles: dataArg.extendsProfiles,
|
|
84
|
+
});
|
|
85
|
+
// Propagate to affected routes
|
|
86
|
+
if (affectedRouteIds.length > 0) {
|
|
87
|
+
await manager.reResolveRoutes(affectedRouteIds);
|
|
88
|
+
}
|
|
89
|
+
return { success: true, affectedRouteCount: affectedRouteIds.length };
|
|
90
|
+
}));
|
|
91
|
+
// Delete a security profile
|
|
92
|
+
this.typedrouter.addTypedHandler(new plugins.typedrequest.TypedHandler('deleteSecurityProfile', async (dataArg) => {
|
|
93
|
+
await this.requireAuth(dataArg, 'profiles:write');
|
|
94
|
+
const resolver = this.opsServerRef.dcRouterRef.referenceResolver;
|
|
95
|
+
const manager = this.opsServerRef.dcRouterRef.routeConfigManager;
|
|
96
|
+
if (!resolver || !manager) {
|
|
97
|
+
return { success: false, message: 'Not initialized' };
|
|
98
|
+
}
|
|
99
|
+
const result = await resolver.deleteProfile(dataArg.id, dataArg.force ?? false, manager.getStoredRoutes());
|
|
100
|
+
// If force-deleted with affected routes, re-apply
|
|
101
|
+
if (result.success && dataArg.force) {
|
|
102
|
+
await manager.applyRoutes();
|
|
103
|
+
}
|
|
104
|
+
return result;
|
|
105
|
+
}));
|
|
106
|
+
// Get routes using a security profile
|
|
107
|
+
this.typedrouter.addTypedHandler(new plugins.typedrequest.TypedHandler('getSecurityProfileUsage', async (dataArg) => {
|
|
108
|
+
await this.requireAuth(dataArg, 'profiles:read');
|
|
109
|
+
const resolver = this.opsServerRef.dcRouterRef.referenceResolver;
|
|
110
|
+
const manager = this.opsServerRef.dcRouterRef.routeConfigManager;
|
|
111
|
+
if (!resolver || !manager) {
|
|
112
|
+
return { routes: [] };
|
|
113
|
+
}
|
|
114
|
+
const usage = resolver.getProfileUsageForId(dataArg.id, manager.getStoredRoutes());
|
|
115
|
+
return { routes: usage.map((u) => ({ id: u.id, name: u.routeName })) };
|
|
116
|
+
}));
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VjdXJpdHktcHJvZmlsZS5oYW5kbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdHMvb3Bzc2VydmVyL2hhbmRsZXJzL3NlY3VyaXR5LXByb2ZpbGUuaGFuZGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBRTVDLE9BQU8sS0FBSyxVQUFVLE1BQU0saUNBQWlDLENBQUM7QUFFOUQsTUFBTSxPQUFPLHNCQUFzQjtJQUdiO0lBRmIsV0FBVyxHQUFHLElBQUksT0FBTyxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUU1RCxZQUFvQixZQUF1QjtRQUF2QixpQkFBWSxHQUFaLFlBQVksQ0FBVztRQUN6QyxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQy9ELElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFTyxLQUFLLENBQUMsV0FBVyxDQUN2QixPQUFvRSxFQUNwRSxhQUE4QztRQUU5QyxJQUFJLE9BQU8sQ0FBQyxRQUFRLEVBQUUsR0FBRyxFQUFFLENBQUM7WUFDMUIsSUFBSSxDQUFDO2dCQUNILE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDO29CQUMzRSxRQUFRLEVBQUUsT0FBTyxDQUFDLFFBQVE7aUJBQzNCLENBQUMsQ0FBQztnQkFDSCxJQUFJLE9BQU87b0JBQUUsT0FBTyxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztZQUM5QyxDQUFDO1lBQUMsTUFBTSxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUNoQyxDQUFDO1FBRUQsSUFBSSxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDckIsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFlB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
|