@serve.zone/dcrouter 12.2.1 → 12.2.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.
@@ -162,8 +162,8 @@ let OpsViewSecurityProfiles = (() => {
162
162
  <dees-form>
163
163
  <dees-input-text .key=${'name'} .label=${'Name'} .required=${true}></dees-input-text>
164
164
  <dees-input-text .key=${'description'} .label=${'Description'}></dees-input-text>
165
- <dees-input-text .key=${'ipAllowList'} .label=${'IP Allow List (comma-separated)'}></dees-input-text>
166
- <dees-input-text .key=${'ipBlockList'} .label=${'IP Block List (comma-separated)'}></dees-input-text>
165
+ <dees-input-list .key=${'ipAllowList'} .label=${'IP Allow List'} .placeholder=${'Add IP or CIDR...'}></dees-input-list>
166
+ <dees-input-list .key=${'ipBlockList'} .label=${'IP Block List'} .placeholder=${'Add IP or CIDR...'}></dees-input-list>
167
167
  <dees-input-text .key=${'maxConnections'} .label=${'Max Connections'}></dees-input-text>
168
168
  </dees-form>
169
169
  `,
@@ -173,19 +173,15 @@ let OpsViewSecurityProfiles = (() => {
173
173
  action: async (modalArg) => {
174
174
  const form = modalArg.shadowRoot.querySelector('dees-form');
175
175
  const data = await form.collectFormData();
176
- const ipAllowList = data.ipAllowList
177
- ? String(data.ipAllowList).split(',').map((s) => s.trim()).filter(Boolean)
178
- : undefined;
179
- const ipBlockList = data.ipBlockList
180
- ? String(data.ipBlockList).split(',').map((s) => s.trim()).filter(Boolean)
181
- : undefined;
176
+ const ipAllowList = Array.isArray(data.ipAllowList) ? data.ipAllowList : [];
177
+ const ipBlockList = Array.isArray(data.ipBlockList) ? data.ipBlockList : [];
182
178
  const maxConnections = data.maxConnections ? parseInt(String(data.maxConnections)) : undefined;
183
179
  await appstate.profilesTargetsStatePart.dispatchAction(appstate.createProfileAction, {
184
180
  name: String(data.name),
185
181
  description: data.description ? String(data.description) : undefined,
186
182
  security: {
187
- ...(ipAllowList ? { ipAllowList } : {}),
188
- ...(ipBlockList ? { ipBlockList } : {}),
183
+ ...(ipAllowList.length > 0 ? { ipAllowList } : {}),
184
+ ...(ipBlockList.length > 0 ? { ipBlockList } : {}),
189
185
  ...(maxConnections ? { maxConnections } : {}),
190
186
  },
191
187
  });
@@ -204,8 +200,8 @@ let OpsViewSecurityProfiles = (() => {
204
200
  <dees-form>
205
201
  <dees-input-text .key=${'name'} .label=${'Name'} .value=${profile.name}></dees-input-text>
206
202
  <dees-input-text .key=${'description'} .label=${'Description'} .value=${profile.description || ''}></dees-input-text>
207
- <dees-input-text .key=${'ipAllowList'} .label=${'IP Allow List (comma-separated)'} .value=${(profile.security?.ipAllowList || []).join(', ')}></dees-input-text>
208
- <dees-input-text .key=${'ipBlockList'} .label=${'IP Block List (comma-separated)'} .value=${(profile.security?.ipBlockList || []).join(', ')}></dees-input-text>
203
+ <dees-input-list .key=${'ipAllowList'} .label=${'IP Allow List'} .placeholder=${'Add IP or CIDR...'} .value=${profile.security?.ipAllowList || []}></dees-input-list>
204
+ <dees-input-list .key=${'ipBlockList'} .label=${'IP Block List'} .placeholder=${'Add IP or CIDR...'} .value=${profile.security?.ipBlockList || []}></dees-input-list>
209
205
  <dees-input-text .key=${'maxConnections'} .label=${'Max Connections'} .value=${String(profile.security?.maxConnections || '')}></dees-input-text>
210
206
  </dees-form>
211
207
  `,
@@ -215,12 +211,8 @@ let OpsViewSecurityProfiles = (() => {
215
211
  action: async (modalArg) => {
216
212
  const form = modalArg.shadowRoot.querySelector('dees-form');
217
213
  const data = await form.collectFormData();
218
- const ipAllowList = data.ipAllowList
219
- ? String(data.ipAllowList).split(',').map((s) => s.trim()).filter(Boolean)
220
- : [];
221
- const ipBlockList = data.ipBlockList
222
- ? String(data.ipBlockList).split(',').map((s) => s.trim()).filter(Boolean)
223
- : [];
214
+ const ipAllowList = Array.isArray(data.ipAllowList) ? data.ipAllowList : [];
215
+ const ipBlockList = Array.isArray(data.ipBlockList) ? data.ipBlockList : [];
224
216
  const maxConnections = data.maxConnections ? parseInt(String(data.maxConnections)) : undefined;
225
217
  await appstate.profilesTargetsStatePart.dispatchAction(appstate.updateProfileAction, {
226
218
  id: profile.id,
@@ -273,4 +265,4 @@ let OpsViewSecurityProfiles = (() => {
273
265
  return OpsViewSecurityProfiles = _classThis;
274
266
  })();
275
267
  export { OpsViewSecurityProfiles };
276
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BzLXZpZXctc2VjdXJpdHlwcm9maWxlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzX3dlYi9lbGVtZW50cy9vcHMtdmlldy1zZWN1cml0eXByb2ZpbGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxPQUFPLEVBQ0wsV0FBVyxFQUNYLElBQUksRUFDSixhQUFhLEVBRWIsR0FBRyxFQUNILEtBQUssRUFDTCxVQUFVLEdBQ1gsTUFBTSw2QkFBNkIsQ0FBQztBQUNyQyxPQUFPLEtBQUssUUFBUSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sS0FBSyxVQUFVLE1BQU0sbUNBQW1DLENBQUM7QUFDaEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzlDLE9BQU8sRUFBbUIsTUFBTSw2QkFBNkIsQ0FBQztJQVNqRCx1QkFBdUI7NEJBRG5DLGFBQWEsQ0FBQywyQkFBMkIsQ0FBQzs7OztzQkFDRSxXQUFXOzs7O3VDQUFuQixTQUFRLFdBQVc7Ozs7eUNBQ3JELEtBQUssRUFBRTtZQUNSLDRMQUFTLGFBQWEsNkJBQWIsYUFBYSxxR0FBaUY7WUFGekcsNktBNk5DOzs7O1FBM05DLHVGQUF5RCxRQUFRLENBQUMsd0JBQXdCLENBQUMsUUFBUSxFQUFHLEVBQUM7UUFBdkcsSUFBUyxhQUFhLG1EQUFpRjtRQUF2RyxJQUFTLGFBQWEseURBQWlGO1FBRXZHO1lBQ0UsS0FBSyxFQUFFLENBQUM7O1lBQ1IsTUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLHdCQUF3QixDQUFDLE1BQU0sRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFO2dCQUM1RSxJQUFJLENBQUMsYUFBYSxHQUFHLFFBQVEsQ0FBQztZQUNoQyxDQUFDLENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFD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
268
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BzLXZpZXctc2VjdXJpdHlwcm9maWxlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzX3dlYi9lbGVtZW50cy9vcHMtdmlldy1zZWN1cml0eXByb2ZpbGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxPQUFPLEVBQ0wsV0FBVyxFQUNYLElBQUksRUFDSixhQUFhLEVBRWIsR0FBRyxFQUNILEtBQUssRUFDTCxVQUFVLEdBQ1gsTUFBTSw2QkFBNkIsQ0FBQztBQUNyQyxPQUFPLEtBQUssUUFBUSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sS0FBSyxVQUFVLE1BQU0sbUNBQW1DLENBQUM7QUFDaEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzlDLE9BQU8sRUFBbUIsTUFBTSw2QkFBNkIsQ0FBQztJQVNqRCx1QkFBdUI7NEJBRG5DLGFBQWEsQ0FBQywyQkFBMkIsQ0FBQzs7OztzQkFDRSxXQUFXOzs7O3VDQUFuQixTQUFRLFdBQVc7Ozs7eUNBQ3JELEtBQUssRUFBRTtZQUNSLDRMQUFTLGFBQWEsNkJBQWIsYUFBYSxxR0FBaUY7WUFGekcsNktBcU5DOzs7O1FBbk5DLHVGQUF5RCxRQUFRLENBQUMsd0JBQXdCLENBQUMsUUFBUSxFQUFHLEVBQUM7UUFBdkcsSUFBUyxhQUFhLG1EQUFpRjtRQUF2RyxJQUFTLGFBQWEseURBQWlGO1FBRXZHO1lBQ0UsS0FBSyxFQUFFLENBQUM7O1lBQ1IsTUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLHdCQUF3QixDQUFDLE1BQU0sRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFO2dCQUM1RSxJQUFJLENBQUMsYUFBYSxHQUFHLFFBQVEsQ0FBQztZQUNoQyxDQUFDLENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFD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
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@serve.zone/dcrouter",
3
3
  "private": false,
4
- "version": "12.2.1",
4
+ "version": "12.2.4",
5
5
  "description": "A multifaceted routing service handling mail and SMS delivery functions.",
6
6
  "type": "module",
7
7
  "exports": {
@@ -35,14 +35,14 @@
35
35
  "@api.global/typedserver": "^8.4.6",
36
36
  "@api.global/typedsocket": "^4.1.2",
37
37
  "@apiclient.xyz/cloudflare": "^7.1.0",
38
- "@design.estate/dees-catalog": "^3.49.1",
38
+ "@design.estate/dees-catalog": "^3.49.2",
39
39
  "@design.estate/dees-element": "^2.2.4",
40
40
  "@push.rocks/lik": "^6.4.0",
41
41
  "@push.rocks/projectinfo": "^5.1.0",
42
42
  "@push.rocks/qenv": "^6.1.3",
43
43
  "@push.rocks/smartacme": "^9.3.1",
44
44
  "@push.rocks/smartdata": "^7.1.3",
45
- "@push.rocks/smartdb": "^2.0.0",
45
+ "@push.rocks/smartdb": "^2.1.1",
46
46
  "@push.rocks/smartdns": "^7.9.0",
47
47
  "@push.rocks/smartfs": "^1.5.0",
48
48
  "@push.rocks/smartguard": "^3.1.0",
@@ -61,7 +61,7 @@
61
61
  "@push.rocks/smartunique": "^3.0.9",
62
62
  "@push.rocks/smartvpn": "1.19.1",
63
63
  "@push.rocks/taskbuffer": "^8.0.2",
64
- "@serve.zone/catalog": "^2.9.0",
64
+ "@serve.zone/catalog": "^2.9.1",
65
65
  "@serve.zone/interfaces": "^5.3.0",
66
66
  "@serve.zone/remoteingress": "^4.15.3",
67
67
  "@tsclass/tsclass": "^9.5.0",
@@ -3,6 +3,6 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@serve.zone/dcrouter',
6
- version: '12.2.1',
6
+ version: '12.2.4',
7
7
  description: 'A multifaceted routing service handling mail and SMS delivery functions.'
8
8
  }
@@ -478,6 +478,12 @@ export class DcRouter {
478
478
  }
479
479
  : undefined,
480
480
  this.referenceResolver,
481
+ // Sync merged routes to RemoteIngressManager whenever routes change
482
+ (routes) => {
483
+ if (this.remoteIngressManager) {
484
+ this.remoteIngressManager.setRoutes(routes as any[]);
485
+ }
486
+ },
481
487
  );
482
488
  this.apiTokenManager = new ApiTokenManager();
483
489
  await this.apiTokenManager.initialize();
@@ -2054,6 +2060,13 @@ export class DcRouter {
2054
2060
  const currentRoutes = this.constructorRoutes;
2055
2061
  this.remoteIngressManager.setRoutes(currentRoutes as any[]);
2056
2062
 
2063
+ // Race-condition fix: if ConfigManagers finished before us, re-apply routes
2064
+ // so the callback delivers the full merged set (including DB-stored routes)
2065
+ // to our newly-created remoteIngressManager.
2066
+ if (this.routeConfigManager) {
2067
+ await this.routeConfigManager.applyRoutes();
2068
+ }
2069
+
2057
2070
  // Resolve TLS certs for tunnel: explicit paths > ACME for hubDomain > self-signed (Rust default)
2058
2071
  const riCfg = this.options.remoteIngressConfig;
2059
2072
  let tlsConfig: { certPem: string; keyPem: string } | undefined;
@@ -23,6 +23,7 @@ export class RouteConfigManager {
23
23
  private getHttp3Config?: () => IHttp3Config | undefined,
24
24
  private getVpnAllowList?: (tags?: string[]) => string[],
25
25
  private referenceResolver?: ReferenceResolver,
26
+ private onRoutesApplied?: (routes: plugins.smartproxy.IRouteConfig[]) => void,
26
27
  ) {}
27
28
 
28
29
  /** Expose stored routes map for reference resolution lookups. */
@@ -393,6 +394,12 @@ export class RouteConfigManager {
393
394
  }
394
395
 
395
396
  await smartProxy.updateRoutes(enabledRoutes);
397
+
398
+ // Notify listeners (e.g. RemoteIngressManager) of the merged route set
399
+ if (this.onRoutesApplied) {
400
+ this.onRoutesApplied(enabledRoutes);
401
+ }
402
+
396
403
  logger.log('info', `Applied ${enabledRoutes.length} routes to SmartProxy (${this.storedRoutes.size} programmatic, ${this.overrides.size} overrides)`);
397
404
  }
398
405
  }
@@ -3,6 +3,6 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@serve.zone/dcrouter',
6
- version: '12.2.1',
6
+ version: '12.2.4',
7
7
  description: 'A multifaceted routing service handling mail and SMS delivery functions.'
8
8
  }
@@ -427,6 +427,8 @@ export const setActiveViewAction = uiStatePart.createAction<string>(async (state
427
427
  if (viewName === 'routes' && currentState.activeView !== 'routes') {
428
428
  setTimeout(() => {
429
429
  routeManagementStatePart.dispatchAction(fetchMergedRoutesAction, null);
430
+ // Also fetch profiles/targets for the Create Route dropdowns
431
+ profilesTargetsStatePart.dispatchAction(fetchProfilesAndTargetsAction, null);
430
432
  }, 100);
431
433
  }
432
434
 
@@ -1413,6 +1415,7 @@ export const fetchMergedRoutesAction = routeManagementStatePart.createAction(asy
1413
1415
  export const createRouteAction = routeManagementStatePart.createAction<{
1414
1416
  route: any;
1415
1417
  enabled?: boolean;
1418
+ metadata?: any;
1416
1419
  }>(async (statePartArg, dataArg, actionContext): Promise<IRouteManagementState> => {
1417
1420
  const context = getActionContext();
1418
1421
  const currentState = statePartArg.getState()!;
@@ -1426,6 +1429,7 @@ export const createRouteAction = routeManagementStatePart.createAction<{
1426
1429
  identity: context.identity!,
1427
1430
  route: dataArg.route,
1428
1431
  enabled: dataArg.enabled,
1432
+ metadata: dataArg.metadata,
1429
1433
  });
1430
1434
 
1431
1435
  return await actionContext!.dispatch(fetchMergedRoutesAction, null);
@@ -24,6 +24,14 @@ export class OpsViewRoutes extends DeesElement {
24
24
  lastUpdated: 0,
25
25
  };
26
26
 
27
+ @state() accessor profilesTargetsState: appstate.IProfilesTargetsState = {
28
+ profiles: [],
29
+ targets: [],
30
+ isLoading: false,
31
+ error: null,
32
+ lastUpdated: 0,
33
+ };
34
+
27
35
  constructor() {
28
36
  super();
29
37
  const sub = appstate.routeManagementStatePart
@@ -33,6 +41,13 @@ export class OpsViewRoutes extends DeesElement {
33
41
  });
34
42
  this.rxSubscriptions.push(sub);
35
43
 
44
+ const ptSub = appstate.profilesTargetsStatePart
45
+ .select((s) => s)
46
+ .subscribe((ptState) => {
47
+ this.profilesTargetsState = ptState;
48
+ });
49
+ this.rxSubscriptions.push(ptSub);
50
+
36
51
  // Re-fetch routes when user logs in (fixes race condition where
37
52
  // the view is created before authentication completes)
38
53
  const loginSub = appstate.loginStatePart
@@ -40,6 +55,7 @@ export class OpsViewRoutes extends DeesElement {
40
55
  .subscribe((isLoggedIn) => {
41
56
  if (isLoggedIn) {
42
57
  appstate.routeManagementStatePart.dispatchAction(appstate.fetchMergedRoutesAction, null);
58
+ appstate.profilesTargetsStatePart.dispatchAction(appstate.fetchProfilesAndTargetsAction, null);
43
59
  }
44
60
  });
45
61
  this.rxSubscriptions.push(loginSub);
@@ -145,6 +161,7 @@ export class OpsViewRoutes extends DeesElement {
145
161
  enabled: mr.enabled,
146
162
  tags,
147
163
  id: mr.storedRouteId || mr.route.name || undefined,
164
+ metadata: mr.metadata,
148
165
  };
149
166
  });
150
167
 
@@ -275,6 +292,7 @@ export class OpsViewRoutes extends DeesElement {
275
292
  });
276
293
  } else {
277
294
  // Programmatic route
295
+ const meta = merged.metadata;
278
296
  await DeesModal.createAndShow({
279
297
  heading: `Route: ${merged.route.name}`,
280
298
  content: html`
@@ -282,6 +300,8 @@ export class OpsViewRoutes extends DeesElement {
282
300
  <p>Source: <strong style="color: #0af;">programmatic</strong></p>
283
301
  <p>Status: <strong>${merged.enabled ? 'Enabled' : 'Disabled'}</strong></p>
284
302
  <p>ID: <code style="color: #888;">${merged.storedRouteId}</code></p>
303
+ ${meta?.securityProfileName ? html`<p>Security Profile: <strong style="color: #a78bfa;">${meta.securityProfileName}</strong></p>` : ''}
304
+ ${meta?.networkTargetName ? html`<p>Network Target: <strong style="color: #a78bfa;">${meta.networkTargetName}</strong></p>` : ''}
285
305
  </div>
286
306
  `,
287
307
  menuOptions: [
@@ -319,6 +339,24 @@ export class OpsViewRoutes extends DeesElement {
319
339
 
320
340
  private async showCreateRouteDialog() {
321
341
  const { DeesModal } = await import('@design.estate/dees-catalog');
342
+ const profiles = this.profilesTargetsState.profiles;
343
+ const targets = this.profilesTargetsState.targets;
344
+
345
+ // Build dropdown options for profiles and targets
346
+ const profileOptions = [
347
+ { key: '', option: '(none — inline security)' },
348
+ ...profiles.map((p) => ({
349
+ key: p.id,
350
+ option: `${p.name}${p.description ? ' — ' + p.description : ''}`,
351
+ })),
352
+ ];
353
+ const targetOptions = [
354
+ { key: '', option: '(none — inline target)' },
355
+ ...targets.map((t) => ({
356
+ key: t.id,
357
+ option: `${t.name} (${Array.isArray(t.host) ? t.host.join(',') : t.host}:${t.port})`,
358
+ })),
359
+ ];
322
360
 
323
361
  await DeesModal.createAndShow({
324
362
  heading: 'Add Programmatic Route',
@@ -327,8 +365,10 @@ export class OpsViewRoutes extends DeesElement {
327
365
  <dees-input-text .key=${'name'} .label=${'Route Name'} .required=${true}></dees-input-text>
328
366
  <dees-input-text .key=${'ports'} .label=${'Ports (comma-separated)'} .required=${true}></dees-input-text>
329
367
  <dees-input-text .key=${'domains'} .label=${'Domains (comma-separated, optional)'}></dees-input-text>
330
- <dees-input-text .key=${'targetHost'} .label=${'Target Host'} .value=${'localhost'} .required=${true}></dees-input-text>
331
- <dees-input-text .key=${'targetPort'} .label=${'Target Port'} .required=${true}></dees-input-text>
368
+ <dees-input-dropdown .key=${'securityProfileRef'} .label=${'Security Profile'} .options=${profileOptions} .selectedKey=${''}></dees-input-dropdown>
369
+ <dees-input-dropdown .key=${'networkTargetRef'} .label=${'Network Target'} .options=${targetOptions} .selectedKey=${''}></dees-input-dropdown>
370
+ <dees-input-text .key=${'targetHost'} .label=${'Target Host (if no target selected)'} .value=${'localhost'}></dees-input-text>
371
+ <dees-input-text .key=${'targetPort'} .label=${'Target Port (if no target selected)'}></dees-input-text>
332
372
  </dees-form>
333
373
  `,
334
374
  menuOptions: [
@@ -362,15 +402,27 @@ export class OpsViewRoutes extends DeesElement {
362
402
  targets: [
363
403
  {
364
404
  host: formData.targetHost || 'localhost',
365
- port: parseInt(formData.targetPort, 10),
405
+ port: parseInt(formData.targetPort, 10) || 443,
366
406
  },
367
407
  ],
368
408
  },
369
409
  };
370
410
 
411
+ // Build metadata if profile/target selected
412
+ const metadata: any = {};
413
+ if (formData.securityProfileRef) {
414
+ metadata.securityProfileRef = formData.securityProfileRef;
415
+ }
416
+ if (formData.networkTargetRef) {
417
+ metadata.networkTargetRef = formData.networkTargetRef;
418
+ }
419
+
371
420
  await appstate.routeManagementStatePart.dispatchAction(
372
421
  appstate.createRouteAction,
373
- { route },
422
+ {
423
+ route,
424
+ metadata: Object.keys(metadata).length > 0 ? metadata : undefined,
425
+ },
374
426
  );
375
427
  await modalArg.destroy();
376
428
  },
@@ -131,8 +131,8 @@ export class OpsViewSecurityProfiles extends DeesElement {
131
131
  <dees-form>
132
132
  <dees-input-text .key=${'name'} .label=${'Name'} .required=${true}></dees-input-text>
133
133
  <dees-input-text .key=${'description'} .label=${'Description'}></dees-input-text>
134
- <dees-input-text .key=${'ipAllowList'} .label=${'IP Allow List (comma-separated)'}></dees-input-text>
135
- <dees-input-text .key=${'ipBlockList'} .label=${'IP Block List (comma-separated)'}></dees-input-text>
134
+ <dees-input-list .key=${'ipAllowList'} .label=${'IP Allow List'} .placeholder=${'Add IP or CIDR...'}></dees-input-list>
135
+ <dees-input-list .key=${'ipBlockList'} .label=${'IP Block List'} .placeholder=${'Add IP or CIDR...'}></dees-input-list>
136
136
  <dees-input-text .key=${'maxConnections'} .label=${'Max Connections'}></dees-input-text>
137
137
  </dees-form>
138
138
  `,
@@ -142,20 +142,16 @@ export class OpsViewSecurityProfiles extends DeesElement {
142
142
  action: async (modalArg: any) => {
143
143
  const form = modalArg.shadowRoot!.querySelector('dees-form');
144
144
  const data = await form.collectFormData();
145
- const ipAllowList = data.ipAllowList
146
- ? String(data.ipAllowList).split(',').map((s: string) => s.trim()).filter(Boolean)
147
- : undefined;
148
- const ipBlockList = data.ipBlockList
149
- ? String(data.ipBlockList).split(',').map((s: string) => s.trim()).filter(Boolean)
150
- : undefined;
145
+ const ipAllowList: string[] = Array.isArray(data.ipAllowList) ? data.ipAllowList : [];
146
+ const ipBlockList: string[] = Array.isArray(data.ipBlockList) ? data.ipBlockList : [];
151
147
  const maxConnections = data.maxConnections ? parseInt(String(data.maxConnections)) : undefined;
152
148
 
153
149
  await appstate.profilesTargetsStatePart.dispatchAction(appstate.createProfileAction, {
154
150
  name: String(data.name),
155
151
  description: data.description ? String(data.description) : undefined,
156
152
  security: {
157
- ...(ipAllowList ? { ipAllowList } : {}),
158
- ...(ipBlockList ? { ipBlockList } : {}),
153
+ ...(ipAllowList.length > 0 ? { ipAllowList } : {}),
154
+ ...(ipBlockList.length > 0 ? { ipBlockList } : {}),
159
155
  ...(maxConnections ? { maxConnections } : {}),
160
156
  },
161
157
  });
@@ -175,8 +171,8 @@ export class OpsViewSecurityProfiles extends DeesElement {
175
171
  <dees-form>
176
172
  <dees-input-text .key=${'name'} .label=${'Name'} .value=${profile.name}></dees-input-text>
177
173
  <dees-input-text .key=${'description'} .label=${'Description'} .value=${profile.description || ''}></dees-input-text>
178
- <dees-input-text .key=${'ipAllowList'} .label=${'IP Allow List (comma-separated)'} .value=${(profile.security?.ipAllowList || []).join(', ')}></dees-input-text>
179
- <dees-input-text .key=${'ipBlockList'} .label=${'IP Block List (comma-separated)'} .value=${(profile.security?.ipBlockList || []).join(', ')}></dees-input-text>
174
+ <dees-input-list .key=${'ipAllowList'} .label=${'IP Allow List'} .placeholder=${'Add IP or CIDR...'} .value=${profile.security?.ipAllowList || []}></dees-input-list>
175
+ <dees-input-list .key=${'ipBlockList'} .label=${'IP Block List'} .placeholder=${'Add IP or CIDR...'} .value=${profile.security?.ipBlockList || []}></dees-input-list>
180
176
  <dees-input-text .key=${'maxConnections'} .label=${'Max Connections'} .value=${String(profile.security?.maxConnections || '')}></dees-input-text>
181
177
  </dees-form>
182
178
  `,
@@ -186,12 +182,8 @@ export class OpsViewSecurityProfiles extends DeesElement {
186
182
  action: async (modalArg: any) => {
187
183
  const form = modalArg.shadowRoot!.querySelector('dees-form');
188
184
  const data = await form.collectFormData();
189
- const ipAllowList = data.ipAllowList
190
- ? String(data.ipAllowList).split(',').map((s: string) => s.trim()).filter(Boolean)
191
- : [];
192
- const ipBlockList = data.ipBlockList
193
- ? String(data.ipBlockList).split(',').map((s: string) => s.trim()).filter(Boolean)
194
- : [];
185
+ const ipAllowList: string[] = Array.isArray(data.ipAllowList) ? data.ipAllowList : [];
186
+ const ipBlockList: string[] = Array.isArray(data.ipBlockList) ? data.ipBlockList : [];
195
187
  const maxConnections = data.maxConnections ? parseInt(String(data.maxConnections)) : undefined;
196
188
 
197
189
  await appstate.profilesTargetsStatePart.dispatchAction(appstate.updateProfileAction, {