Commit 9dcb7b9b5bc13c39b7531322259ee90ceb52050c
Committed by
GitHub
1 parent
99a25cab
UI: Refactoring for the build rule node ui (#4460)
* UI: Refactoring LWM2M; fixed build ui rule node * UI: Refactoring LWM2M security config
Showing
26 changed files
with
863 additions
and
991 deletions
@@ -20,7 +20,7 @@ | @@ -20,7 +20,7 @@ | ||
20 | <mat-label translate>device.credentials-type</mat-label> | 20 | <mat-label translate>device.credentials-type</mat-label> |
21 | <mat-select formControlName="credentialsType"> | 21 | <mat-select formControlName="credentialsType"> |
22 | <mat-option *ngFor="let credentialsType of credentialsTypes" [value]="credentialsType"> | 22 | <mat-option *ngFor="let credentialsType of credentialsTypes" [value]="credentialsType"> |
23 | - {{ credentialTypeNamesMap.get(deviceCredentialsType[credentialsType]) }} | 23 | + {{ credentialTypeNamesMap.get(credentialsType) }} |
24 | </mat-option> | 24 | </mat-option> |
25 | </mat-select> | 25 | </mat-select> |
26 | </mat-form-field> | 26 | </mat-form-field> |
@@ -85,7 +85,7 @@ | @@ -85,7 +85,7 @@ | ||
85 | <mat-form-field class="mat-block"> | 85 | <mat-form-field class="mat-block"> |
86 | <mat-label translate>device.lwm2m-value</mat-label> | 86 | <mat-label translate>device.lwm2m-value</mat-label> |
87 | <textarea matInput formControlName="credentialsValue" rows="10" required | 87 | <textarea matInput formControlName="credentialsValue" rows="10" required |
88 | - [matTooltip]="lwm2mCredentialsValueTip(deviceCredentialsFormGroup.get('credentialsValue').hasError('jsonError'))" | 88 | + [matTooltip]="lwm2mCredentialsValueTooltip(deviceCredentialsFormGroup.get('credentialsValue').hasError('jsonError'))" |
89 | matTooltipPosition="above" | 89 | matTooltipPosition="above" |
90 | ></textarea> | 90 | ></textarea> |
91 | <mat-error *ngIf="deviceCredentialsFormGroup.get('credentialsValue').hasError('required')"> | 91 | <mat-error *ngIf="deviceCredentialsFormGroup.get('credentialsValue').hasError('required')"> |
@@ -14,7 +14,7 @@ | @@ -14,7 +14,7 @@ | ||
14 | /// limitations under the License. | 14 | /// limitations under the License. |
15 | /// | 15 | /// |
16 | 16 | ||
17 | -import {Component, forwardRef, Input, OnDestroy, OnInit} from '@angular/core'; | 17 | +import { Component, forwardRef, Input, OnDestroy, OnInit } from '@angular/core'; |
18 | import { | 18 | import { |
19 | ControlValueAccessor, | 19 | ControlValueAccessor, |
20 | FormBuilder, | 20 | FormBuilder, |
@@ -33,9 +33,9 @@ import { | @@ -33,9 +33,9 @@ import { | ||
33 | DeviceCredentials, | 33 | DeviceCredentials, |
34 | DeviceCredentialsType | 34 | DeviceCredentialsType |
35 | } from '@shared/models/device.models'; | 35 | } from '@shared/models/device.models'; |
36 | -import {Subscription} from 'rxjs'; | ||
37 | -import {distinctUntilChanged} from 'rxjs/operators'; | ||
38 | -import {SecurityConfigComponent} from '@home/pages/device/lwm2m/security-config.component'; | 36 | +import { Subject } from 'rxjs'; |
37 | +import { distinctUntilChanged, takeUntil } from 'rxjs/operators'; | ||
38 | +import { SecurityConfigLwm2mComponent } from '@home/components/device/security-config-lwm2m.component'; | ||
39 | import { | 39 | import { |
40 | ClientSecurityConfig, | 40 | ClientSecurityConfig, |
41 | DEFAULT_END_POINT, | 41 | DEFAULT_END_POINT, |
@@ -44,10 +44,10 @@ import { | @@ -44,10 +44,10 @@ import { | ||
44 | getDefaultSecurityConfig, | 44 | getDefaultSecurityConfig, |
45 | JSON_ALL_CONFIG, | 45 | JSON_ALL_CONFIG, |
46 | validateSecurityConfig | 46 | validateSecurityConfig |
47 | -} from '@home/pages/device/lwm2m/security-config.models'; | ||
48 | -import {TranslateService} from '@ngx-translate/core'; | ||
49 | -import {MatDialog} from '@angular/material/dialog'; | ||
50 | -import {isDefinedAndNotNull} from '@core/utils'; | 47 | +} from '@shared/models/lwm2m-security-config.models'; |
48 | +import { TranslateService } from '@ngx-translate/core'; | ||
49 | +import { MatDialog } from '@angular/material/dialog'; | ||
50 | +import { isDefinedAndNotNull } from '@core/utils'; | ||
51 | 51 | ||
52 | @Component({ | 52 | @Component({ |
53 | selector: 'tb-device-credentials', | 53 | selector: 'tb-device-credentials', |
@@ -67,20 +67,16 @@ import {isDefinedAndNotNull} from '@core/utils'; | @@ -67,20 +67,16 @@ import {isDefinedAndNotNull} from '@core/utils'; | ||
67 | }) | 67 | }) |
68 | export class DeviceCredentialsComponent implements ControlValueAccessor, OnInit, Validator, OnDestroy { | 68 | export class DeviceCredentialsComponent implements ControlValueAccessor, OnInit, Validator, OnDestroy { |
69 | 69 | ||
70 | - deviceCredentialsFormGroup: FormGroup; | ||
71 | - | ||
72 | - subscriptions: Subscription[] = []; | ||
73 | - | ||
74 | @Input() | 70 | @Input() |
75 | disabled: boolean; | 71 | disabled: boolean; |
76 | 72 | ||
77 | - deviceCredentials: DeviceCredentials = null; | 73 | + private destroy$ = new Subject(); |
78 | 74 | ||
79 | - submitted = false; | 75 | + deviceCredentialsFormGroup: FormGroup; |
80 | 76 | ||
81 | deviceCredentialsType = DeviceCredentialsType; | 77 | deviceCredentialsType = DeviceCredentialsType; |
82 | 78 | ||
83 | - credentialsTypes = Object.keys(DeviceCredentialsType); | 79 | + credentialsTypes = Object.values(DeviceCredentialsType); |
84 | 80 | ||
85 | credentialTypeNamesMap = credentialTypeNames; | 81 | credentialTypeNamesMap = credentialTypeNames; |
86 | 82 | ||
@@ -102,16 +98,17 @@ export class DeviceCredentialsComponent implements ControlValueAccessor, OnInit, | @@ -102,16 +98,17 @@ export class DeviceCredentialsComponent implements ControlValueAccessor, OnInit, | ||
102 | }, {validators: this.atLeastOne(Validators.required, ['clientId', 'userName'])}) | 98 | }, {validators: this.atLeastOne(Validators.required, ['clientId', 'userName'])}) |
103 | }); | 99 | }); |
104 | this.deviceCredentialsFormGroup.get('credentialsBasic').disable(); | 100 | this.deviceCredentialsFormGroup.get('credentialsBasic').disable(); |
105 | - this.subscriptions.push( | ||
106 | - this.deviceCredentialsFormGroup.valueChanges.pipe(distinctUntilChanged()).subscribe(() => { | ||
107 | - this.updateView(); | ||
108 | - }) | ||
109 | - ); | ||
110 | - this.subscriptions.push( | ||
111 | - this.deviceCredentialsFormGroup.get('credentialsType').valueChanges.subscribe(() => { | ||
112 | - this.credentialsTypeChanged(); | ||
113 | - }) | ||
114 | - ); | 101 | + this.deviceCredentialsFormGroup.valueChanges.pipe( |
102 | + distinctUntilChanged(), | ||
103 | + takeUntil(this.destroy$) | ||
104 | + ).subscribe(() => { | ||
105 | + this.updateView(); | ||
106 | + }); | ||
107 | + this.deviceCredentialsFormGroup.get('credentialsType').valueChanges.pipe( | ||
108 | + takeUntil(this.destroy$) | ||
109 | + ).subscribe((type) => { | ||
110 | + this.credentialsTypeChanged(type); | ||
111 | + }); | ||
115 | } | 112 | } |
116 | 113 | ||
117 | ngOnInit(): void { | 114 | ngOnInit(): void { |
@@ -121,12 +118,12 @@ export class DeviceCredentialsComponent implements ControlValueAccessor, OnInit, | @@ -121,12 +118,12 @@ export class DeviceCredentialsComponent implements ControlValueAccessor, OnInit, | ||
121 | } | 118 | } |
122 | 119 | ||
123 | ngOnDestroy() { | 120 | ngOnDestroy() { |
124 | - this.subscriptions.forEach(s => s.unsubscribe()); | 121 | + this.destroy$.next(); |
122 | + this.destroy$.complete(); | ||
125 | } | 123 | } |
126 | 124 | ||
127 | writeValue(value: DeviceCredentials | null): void { | 125 | writeValue(value: DeviceCredentials | null): void { |
128 | if (isDefinedAndNotNull(value)) { | 126 | if (isDefinedAndNotNull(value)) { |
129 | - this.deviceCredentials = value; | ||
130 | let credentialsBasic = {clientId: null, userName: null, password: null}; | 127 | let credentialsBasic = {clientId: null, userName: null, password: null}; |
131 | let credentialsValue = null; | 128 | let credentialsValue = null; |
132 | if (value.credentialsType === DeviceCredentialsType.MQTT_BASIC) { | 129 | if (value.credentialsType === DeviceCredentialsType.MQTT_BASIC) { |
@@ -179,10 +176,11 @@ export class DeviceCredentialsComponent implements ControlValueAccessor, OnInit, | @@ -179,10 +176,11 @@ export class DeviceCredentialsComponent implements ControlValueAccessor, OnInit, | ||
179 | }; | 176 | }; |
180 | } | 177 | } |
181 | 178 | ||
182 | - credentialsTypeChanged(): void { | 179 | + credentialsTypeChanged(credentialsType: DeviceCredentialsType): void { |
180 | + const credentialsValue = credentialsType === DeviceCredentialsType.LWM2M_CREDENTIALS ? this.lwm2mDefaultConfig : null; | ||
183 | this.deviceCredentialsFormGroup.patchValue({ | 181 | this.deviceCredentialsFormGroup.patchValue({ |
184 | credentialsId: null, | 182 | credentialsId: null, |
185 | - credentialsValue: JSON.stringify(getDefaultSecurityConfig(), null, 2), | 183 | + credentialsValue, |
186 | credentialsBasic: {clientId: '', userName: '', password: ''} | 184 | credentialsBasic: {clientId: '', userName: '', password: ''} |
187 | }); | 185 | }); |
188 | this.updateValidators(); | 186 | this.updateValidators(); |
@@ -264,7 +262,7 @@ export class DeviceCredentialsComponent implements ControlValueAccessor, OnInit, | @@ -264,7 +262,7 @@ export class DeviceCredentialsComponent implements ControlValueAccessor, OnInit, | ||
264 | } | 262 | } |
265 | } | 263 | } |
266 | const credentialsId = this.deviceCredentialsFormGroup.get('credentialsId').value || DEFAULT_END_POINT; | 264 | const credentialsId = this.deviceCredentialsFormGroup.get('credentialsId').value || DEFAULT_END_POINT; |
267 | - this.dialog.open<SecurityConfigComponent, DeviceCredentialsDialogLwm2mData, object>(SecurityConfigComponent, { | 265 | + this.dialog.open<SecurityConfigLwm2mComponent, DeviceCredentialsDialogLwm2mData, object>(SecurityConfigLwm2mComponent, { |
268 | disableClose: true, | 266 | disableClose: true, |
269 | panelClass: ['tb-dialog', 'tb-fullscreen-dialog'], | 267 | panelClass: ['tb-dialog', 'tb-fullscreen-dialog'], |
270 | data: { | 268 | data: { |
@@ -275,8 +273,8 @@ export class DeviceCredentialsComponent implements ControlValueAccessor, OnInit, | @@ -275,8 +273,8 @@ export class DeviceCredentialsComponent implements ControlValueAccessor, OnInit, | ||
275 | (res) => { | 273 | (res) => { |
276 | if (res) { | 274 | if (res) { |
277 | this.deviceCredentialsFormGroup.patchValue({ | 275 | this.deviceCredentialsFormGroup.patchValue({ |
278 | - credentialsValue: this.isDefautLw2mResponse(res[JSON_ALL_CONFIG]) ? null : JSON.stringify(res[JSON_ALL_CONFIG]), | ||
279 | - credentialsId: this.isDefautLw2mResponse(res[END_POINT]) ? null : JSON.stringify(res[END_POINT]).split('\"').join('') | 276 | + credentialsValue: this.isDefaultLw2mResponse(res[JSON_ALL_CONFIG]) ? null : JSON.stringify(res[JSON_ALL_CONFIG]), |
277 | + credentialsId: this.isDefaultLw2mResponse(res[END_POINT]) ? null : JSON.stringify(res[END_POINT]).split('\"').join('') | ||
280 | }); | 278 | }); |
281 | this.deviceCredentialsFormGroup.get('credentialsValue').markAsDirty(); | 279 | this.deviceCredentialsFormGroup.get('credentialsValue').markAsDirty(); |
282 | } | 280 | } |
@@ -284,16 +282,19 @@ export class DeviceCredentialsComponent implements ControlValueAccessor, OnInit, | @@ -284,16 +282,19 @@ export class DeviceCredentialsComponent implements ControlValueAccessor, OnInit, | ||
284 | ); | 282 | ); |
285 | } | 283 | } |
286 | 284 | ||
287 | - private isDefautLw2mResponse(response: object): boolean { | 285 | + private isDefaultLw2mResponse(response: object): boolean { |
288 | return Object.keys(response).length === 0 || JSON.stringify(response) === '[{}]'; | 286 | return Object.keys(response).length === 0 || JSON.stringify(response) === '[{}]'; |
289 | } | 287 | } |
290 | 288 | ||
291 | private lwm2mConfigJsonValidator(control: FormControl) { | 289 | private lwm2mConfigJsonValidator(control: FormControl) { |
292 | - return validateSecurityConfig(control.value) ? null: {jsonError: {parsedJson: "error"}}; | 290 | + return validateSecurityConfig(control.value) ? null : {jsonError: {parsedJson: 'error'}}; |
291 | + } | ||
292 | + | ||
293 | + private get lwm2mDefaultConfig(): string { | ||
294 | + return JSON.stringify(getDefaultSecurityConfig(), null, 2); | ||
293 | } | 295 | } |
294 | 296 | ||
295 | - lwm2mCredentialsValueTip (flag: boolean): string { | ||
296 | - let jsonConfigDef = JSON.stringify(getDefaultSecurityConfig(), null, 2); | ||
297 | - return !flag ? "" : 'Example (mode=\"NoSec\"):\n\r ' + jsonConfigDef; | 297 | + lwm2mCredentialsValueTooltip(flag: boolean): string { |
298 | + return !flag ? '' : 'Example (mode=\"NoSec\"):\n\r ' + this.lwm2mDefaultConfig; | ||
298 | } | 299 | } |
299 | } | 300 | } |
ui-ngx/src/app/modules/home/components/device/security-config-lwm2m-server.component.html
renamed from
ui-ngx/src/app/modules/home/pages/device/lwm2m/security-config-server.component.html
@@ -15,87 +15,65 @@ | @@ -15,87 +15,65 @@ | ||
15 | limitations under the License. | 15 | limitations under the License. |
16 | 16 | ||
17 | --> | 17 | --> |
18 | -<section [formGroup]="serverFormGroup" style="min-width: 400px;"> | ||
19 | - <div class="mat-padding"> | ||
20 | - <div fxLayout="column"> | ||
21 | - <div fxLayout="row" fxLayoutGap="8px"> | ||
22 | - <mat-form-field class="mat-block"> | ||
23 | - <mat-label translate>device.lwm2m-security-config.mode</mat-label> | ||
24 | - <mat-select formControlName="securityMode" | ||
25 | - (ngModelChange)="securityModeChanged($event)"> | ||
26 | - <mat-option *ngFor="let securityMode of securityConfigLwM2MTypes" | ||
27 | - [value]="securityMode"> | ||
28 | - {{ credentialTypeLwM2MNamesMap.get(securityConfigLwM2MType[securityMode]) }} | ||
29 | - </mat-option> | ||
30 | - </mat-select> | ||
31 | - </mat-form-field> | ||
32 | - </div> | ||
33 | - </div> | ||
34 | - <div fxLayout="column"> | ||
35 | - <div [fxShow]="serverFormGroup.get('securityMode').value !== securityConfigLwM2MType.NO_SEC"> | ||
36 | - <mat-form-field class="mat-block"> | ||
37 | - <mat-label>{{ 'device.lwm2m-security-config.client-publicKey-or-id' | translate }}</mat-label> | ||
38 | - <textarea matInput | ||
39 | - #clientPublicKeyOrId | ||
40 | - maxlength={{lenMaxClientPublicKeyOrId}} | ||
41 | - cdkTextareaAutosize | ||
42 | - cdkAutosizeMinRows="1" | ||
43 | - style="overflow:hidden" | ||
44 | - cols="1" | ||
45 | - formControlName="clientPublicKeyOrId" | ||
46 | - [required]="serverFormGroup.get('securityMode').value !== securityConfigLwM2MType.NO_SEC"> | ||
47 | - </textarea> | ||
48 | - <mat-hint align="end">{{clientPublicKeyOrId.value?.length || 0}}/{{lenMaxClientPublicKeyOrId}}</mat-hint> | ||
49 | - <mat-error *ngIf="serverFormGroup.get('clientPublicKeyOrId').hasError('required')"> | ||
50 | - {{ 'device.lwm2m-security-config.client-publicKey-or-id' | translate }} | ||
51 | - <strong>{{ 'device.lwm2m-security-config.required' | translate }}</strong> | ||
52 | - </mat-error> | ||
53 | - <mat-error *ngIf="serverFormGroup.get('clientPublicKeyOrId').hasError('pattern')"> | ||
54 | - {{ 'device.lwm2m-security-config.client-key' | translate }} | ||
55 | - <strong>{{ 'device.lwm2m-security-config.pattern_hex_dec' | translate: { | ||
56 | - count: 0 | ||
57 | - } }}</strong> | ||
58 | - </mat-error> | ||
59 | - <mat-error *ngIf="(serverFormGroup.get('clientPublicKeyOrId').hasError('maxlength') || | ||
60 | - serverFormGroup.get('clientPublicKeyOrId').hasError('minlength'))"> | ||
61 | - {{ 'device.lwm2m-security-config.client-key' | translate }} | ||
62 | - <strong>{{ 'device.lwm2m-security-config.pattern_hex_dec' | translate: { | ||
63 | - count: lenMaxClientPublicKeyOrId | ||
64 | - } }}</strong> | ||
65 | - </mat-error> | ||
66 | - </mat-form-field> | ||
67 | - <mat-form-field class="mat-block"> | ||
68 | - <mat-label>{{ 'device.lwm2m-security-config.client-secret-key' | translate }}</mat-label> | ||
69 | - <textarea matInput | ||
70 | - #clientSecretKey | ||
71 | - maxlength={{lenMaxClientSecretKey}} | ||
72 | - cdkTextareaAutosize | ||
73 | - cdkAutosizeMinRows="1" | ||
74 | - style="overflow:hidden" | ||
75 | - cols="1" | ||
76 | - formControlName="clientSecretKey" | ||
77 | - [required]="serverFormGroup.get('securityMode').value !== securityConfigLwM2MType.NO_SEC"> | ||
78 | - </textarea> | ||
79 | - <mat-hint align="end">{{clientSecretKey.value?.length || 0}}/{{lenMaxClientSecretKey}}</mat-hint> | ||
80 | - <mat-error *ngIf="serverFormGroup.get('clientSecretKey').hasError('required')"> | ||
81 | - {{ 'device.lwm2m-security-config.client-secret-key' | translate }} | ||
82 | - <strong>{{ 'device.lwm2m-security-config.required' | translate }}</strong> | ||
83 | - </mat-error> | ||
84 | - <mat-error *ngIf="serverFormGroup.get('clientSecretKey').hasError('pattern')"> | ||
85 | - {{ 'device.lwm2m-security-config.client-key' | translate }} | ||
86 | - <strong>{{ 'device.lwm2m-security-config.pattern_hex_dec' | translate: { | ||
87 | - count: 0 | ||
88 | - } }}</strong> | ||
89 | - </mat-error> | ||
90 | - <mat-error *ngIf="(serverFormGroup.get('clientSecretKey').hasError('maxlength') || | ||
91 | - serverFormGroup.get('clientSecretKey').hasError('minlength'))"> | ||
92 | - {{ 'device.lwm2m-security-config.client-key' | translate }} | ||
93 | - <strong>{{ 'device.lwm2m-security-config.pattern_hex_dec' | translate: { | ||
94 | - count: lenMaxClientSecretKey | ||
95 | - } }}</strong> | ||
96 | - </mat-error> | ||
97 | - </mat-form-field> | ||
98 | - </div> | ||
99 | - </div> | 18 | +<section [formGroup]="serverFormGroup" fxLayout="column"> |
19 | + <mat-form-field class="mat-block"> | ||
20 | + <mat-label translate>device.lwm2m-security-config.mode</mat-label> | ||
21 | + <mat-select formControlName="securityMode"> | ||
22 | + <mat-option *ngFor="let securityType of securityConfigLwM2MTypes" [value]="securityType"> | ||
23 | + {{ lwm2mSecurityTypeTranslationMap.get(securityType) }} | ||
24 | + </mat-option> | ||
25 | + </mat-select> | ||
26 | + </mat-form-field> | ||
27 | + <div [fxShow]="serverFormGroup.get('securityMode').value !== securityConfigLwM2MType.NO_SEC"> | ||
28 | + <mat-form-field class="mat-block"> | ||
29 | + <mat-label>{{ 'device.lwm2m-security-config.client-publicKey-or-id' | translate }}</mat-label> | ||
30 | + <textarea matInput | ||
31 | + #clientPublicKeyOrId | ||
32 | + [maxlength]="lenMaxClientPublicKeyOrId" | ||
33 | + cdkTextareaAutosize | ||
34 | + cdkAutosizeMinRows="1" | ||
35 | + cols="1" | ||
36 | + formControlName="clientPublicKeyOrId" | ||
37 | + required> | ||
38 | + </textarea> | ||
39 | + <mat-hint align="end">{{clientPublicKeyOrId.value?.length || 0}}/{{lenMaxClientPublicKeyOrId}}</mat-hint> | ||
40 | + <mat-error *ngIf="serverFormGroup.get('clientPublicKeyOrId').hasError('required')"> | ||
41 | + {{ 'device.lwm2m-security-config.client-publicKey-or-id-required' | translate }} | ||
42 | + </mat-error> | ||
43 | + <mat-error *ngIf="serverFormGroup.get('clientPublicKeyOrId').hasError('pattern')"> | ||
44 | + {{ 'device.lwm2m-security-config.client-publicKey-or-id-pattern' | translate }} | ||
45 | + </mat-error> | ||
46 | + <mat-error *ngIf="(serverFormGroup.get('clientPublicKeyOrId').hasError('maxlength') || | ||
47 | + serverFormGroup.get('clientPublicKeyOrId').hasError('minlength'))"> | ||
48 | + {{ 'device.lwm2m-security-config.client-publicKey-or-id-length' | translate: { | ||
49 | + count: lenMaxClientPublicKeyOrId | ||
50 | + } }} | ||
51 | + </mat-error> | ||
52 | + </mat-form-field> | ||
53 | + <mat-form-field class="mat-block"> | ||
54 | + <mat-label>{{ 'device.lwm2m-security-config.client-secret-key' | translate }}</mat-label> | ||
55 | + <textarea matInput | ||
56 | + #clientSecretKey | ||
57 | + [maxlength]="lengthClientSecretKey" | ||
58 | + cdkTextareaAutosize | ||
59 | + cdkAutosizeMinRows="1" | ||
60 | + cols="1" | ||
61 | + formControlName="clientSecretKey" | ||
62 | + required> | ||
63 | + </textarea> | ||
64 | + <mat-hint align="end">{{clientSecretKey.value?.length || 0}}/{{lengthClientSecretKey}}</mat-hint> | ||
65 | + <mat-error *ngIf="serverFormGroup.get('clientSecretKey').hasError('required')"> | ||
66 | + {{ 'device.lwm2m-security-config.client-secret-key-required' | translate }} | ||
67 | + </mat-error> | ||
68 | + <mat-error *ngIf="serverFormGroup.get('clientSecretKey').hasError('pattern')"> | ||
69 | + {{ 'device.lwm2m-security-config.client-secret-key-pattern' | translate }} | ||
70 | + </mat-error> | ||
71 | + <mat-error *ngIf="(serverFormGroup.get('clientSecretKey').hasError('maxlength') || | ||
72 | + serverFormGroup.get('clientSecretKey').hasError('minlength'))"> | ||
73 | + {{ 'device.lwm2m-security-config.client-secret-key-length' | translate: { | ||
74 | + count: lengthClientSecretKey | ||
75 | + } }} | ||
76 | + </mat-error> | ||
77 | + </mat-form-field> | ||
100 | </div> | 78 | </div> |
101 | </section> | 79 | </section> |
ui-ngx/src/app/modules/home/components/device/security-config-lwm2m-server.component.scss
0 → 100644
1 | +/** | ||
2 | + * Copyright © 2016-2021 The Thingsboard Authors | ||
3 | + * | ||
4 | + * Licensed under the Apache License, Version 2.0 (the "License"); | ||
5 | + * you may not use this file except in compliance with the License. | ||
6 | + * You may obtain a copy of the License at | ||
7 | + * | ||
8 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
9 | + * | ||
10 | + * Unless required by applicable law or agreed to in writing, software | ||
11 | + * distributed under the License is distributed on an "AS IS" BASIS, | ||
12 | + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
13 | + * See the License for the specific language governing permissions and | ||
14 | + * limitations under the License. | ||
15 | + */ | ||
16 | +:host ::ng-deep { | ||
17 | + textarea.mat-input-element.cdk-textarea-autosize { | ||
18 | + box-sizing: content-box; | ||
19 | + } | ||
20 | +} |
1 | +/// | ||
2 | +/// Copyright © 2016-2021 The Thingsboard Authors | ||
3 | +/// | ||
4 | +/// Licensed under the Apache License, Version 2.0 (the "License"); | ||
5 | +/// you may not use this file except in compliance with the License. | ||
6 | +/// You may obtain a copy of the License at | ||
7 | +/// | ||
8 | +/// http://www.apache.org/licenses/LICENSE-2.0 | ||
9 | +/// | ||
10 | +/// Unless required by applicable law or agreed to in writing, software | ||
11 | +/// distributed under the License is distributed on an "AS IS" BASIS, | ||
12 | +/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
13 | +/// See the License for the specific language governing permissions and | ||
14 | +/// limitations under the License. | ||
15 | +/// | ||
16 | + | ||
17 | +import { Component, forwardRef, OnDestroy } from '@angular/core'; | ||
18 | +import { | ||
19 | + ControlValueAccessor, | ||
20 | + FormBuilder, | ||
21 | + FormGroup, | ||
22 | + NG_VALIDATORS, | ||
23 | + NG_VALUE_ACCESSOR, | ||
24 | + ValidationErrors, | ||
25 | + Validator, | ||
26 | + Validators | ||
27 | +} from '@angular/forms'; | ||
28 | +import { | ||
29 | + KEY_REGEXP_HEX_DEC, | ||
30 | + LEN_MAX_PRIVATE_KEY, | ||
31 | + LEN_MAX_PSK, | ||
32 | + LEN_MAX_PUBLIC_KEY_RPK, | ||
33 | + LEN_MAX_PUBLIC_KEY_X509, | ||
34 | + Lwm2mSecurityType, | ||
35 | + Lwm2mSecurityTypeTranslationMap, | ||
36 | + ServerSecurityConfig | ||
37 | +} from '@shared/models/lwm2m-security-config.models'; | ||
38 | +import { takeUntil } from 'rxjs/operators'; | ||
39 | +import { Subject } from 'rxjs'; | ||
40 | + | ||
41 | +@Component({ | ||
42 | + selector: 'tb-security-config-lwm2m-server', | ||
43 | + templateUrl: './security-config-lwm2m-server.component.html', | ||
44 | + styleUrls: ['./security-config-lwm2m-server.component.scss'], | ||
45 | + providers: [ | ||
46 | + { | ||
47 | + provide: NG_VALUE_ACCESSOR, | ||
48 | + useExisting: forwardRef(() => SecurityConfigLwm2mServerComponent), | ||
49 | + multi: true | ||
50 | + }, | ||
51 | + { | ||
52 | + provide: NG_VALIDATORS, | ||
53 | + useExisting: forwardRef(() => SecurityConfigLwm2mServerComponent), | ||
54 | + multi: true | ||
55 | + } | ||
56 | + ] | ||
57 | +}) | ||
58 | + | ||
59 | +export class SecurityConfigLwm2mServerComponent implements OnDestroy, ControlValueAccessor, Validator { | ||
60 | + | ||
61 | + serverFormGroup: FormGroup; | ||
62 | + securityConfigLwM2MType = Lwm2mSecurityType; | ||
63 | + securityConfigLwM2MTypes = Object.values(Lwm2mSecurityType); | ||
64 | + lwm2mSecurityTypeTranslationMap = Lwm2mSecurityTypeTranslationMap; | ||
65 | + lenMinClientPublicKeyOrId = 0; | ||
66 | + lenMaxClientPublicKeyOrId = LEN_MAX_PUBLIC_KEY_RPK; | ||
67 | + lengthClientSecretKey = LEN_MAX_PRIVATE_KEY; | ||
68 | + | ||
69 | + private destroy$ = new Subject(); | ||
70 | + private propagateChange = (v: any) => {}; | ||
71 | + | ||
72 | + constructor(private fb: FormBuilder) { | ||
73 | + this.serverFormGroup = this.fb.group({ | ||
74 | + securityMode: [Lwm2mSecurityType.NO_SEC], | ||
75 | + clientPublicKeyOrId: [''], | ||
76 | + clientSecretKey: [''] | ||
77 | + }); | ||
78 | + this.serverFormGroup.get('securityMode').valueChanges.pipe( | ||
79 | + takeUntil(this.destroy$) | ||
80 | + ).subscribe((securityMode) => { | ||
81 | + this.updateValidate(securityMode); | ||
82 | + }); | ||
83 | + | ||
84 | + this.serverFormGroup.valueChanges.pipe( | ||
85 | + takeUntil(this.destroy$) | ||
86 | + ).subscribe((value) => { | ||
87 | + this.propagateChange(value); | ||
88 | + }); | ||
89 | + } | ||
90 | + | ||
91 | + writeValue(value: any): void { | ||
92 | + if (value) { | ||
93 | + this.updateValueFields(value); | ||
94 | + } | ||
95 | + } | ||
96 | + | ||
97 | + registerOnChange(fn: any): void { | ||
98 | + this.propagateChange = fn; | ||
99 | + } | ||
100 | + | ||
101 | + registerOnTouched(fn: any): void { | ||
102 | + } | ||
103 | + | ||
104 | + setDisabledState(isDisabled: boolean): void { | ||
105 | + if (isDisabled) { | ||
106 | + this.serverFormGroup.disable({emitEvent: false}); | ||
107 | + } else { | ||
108 | + this.serverFormGroup.enable({emitEvent: false}); | ||
109 | + } | ||
110 | + } | ||
111 | + | ||
112 | + validate(control): ValidationErrors | null { | ||
113 | + return this.serverFormGroup.valid ? null : { | ||
114 | + securityConfig: {valid: false} | ||
115 | + }; | ||
116 | + } | ||
117 | + | ||
118 | + ngOnDestroy() { | ||
119 | + this.destroy$.next(); | ||
120 | + this.destroy$.complete(); | ||
121 | + } | ||
122 | + | ||
123 | + private updateValueFields(serverData: ServerSecurityConfig): void { | ||
124 | + this.serverFormGroup.patchValue(serverData, {emitEvent: false}); | ||
125 | + this.updateValidate(serverData.securityMode, true); | ||
126 | + } | ||
127 | + | ||
128 | + private updateValidate(securityMode: Lwm2mSecurityType, initValue = false): void { | ||
129 | + switch (securityMode) { | ||
130 | + case Lwm2mSecurityType.NO_SEC: | ||
131 | + this.serverFormGroup.get('clientPublicKeyOrId').clearValidators(); | ||
132 | + this.serverFormGroup.get('clientSecretKey').clearValidators(); | ||
133 | + break; | ||
134 | + case Lwm2mSecurityType.PSK: | ||
135 | + this.lenMinClientPublicKeyOrId = 0; | ||
136 | + this.lenMaxClientPublicKeyOrId = LEN_MAX_PUBLIC_KEY_RPK; | ||
137 | + this.lengthClientSecretKey = LEN_MAX_PSK; | ||
138 | + this.setValidatorsSecurity(securityMode); | ||
139 | + break; | ||
140 | + case Lwm2mSecurityType.RPK: | ||
141 | + this.lenMinClientPublicKeyOrId = LEN_MAX_PUBLIC_KEY_RPK; | ||
142 | + this.lenMaxClientPublicKeyOrId = LEN_MAX_PUBLIC_KEY_RPK; | ||
143 | + this.lengthClientSecretKey = LEN_MAX_PRIVATE_KEY; | ||
144 | + this.setValidatorsSecurity(securityMode); | ||
145 | + break; | ||
146 | + case Lwm2mSecurityType.X509: | ||
147 | + this.lenMinClientPublicKeyOrId = 0; | ||
148 | + this.lenMaxClientPublicKeyOrId = LEN_MAX_PUBLIC_KEY_X509; | ||
149 | + this.lengthClientSecretKey = LEN_MAX_PRIVATE_KEY; | ||
150 | + this.setValidatorsSecurity(securityMode); | ||
151 | + break; | ||
152 | + } | ||
153 | + this.serverFormGroup.get('clientPublicKeyOrId').updateValueAndValidity({emitEvent: false}); | ||
154 | + this.serverFormGroup.get('clientSecretKey').updateValueAndValidity({emitEvent: !initValue}); | ||
155 | + } | ||
156 | + | ||
157 | + private setValidatorsSecurity = (securityMode: Lwm2mSecurityType): void => { | ||
158 | + if (securityMode === Lwm2mSecurityType.PSK) { | ||
159 | + this.serverFormGroup.get('clientPublicKeyOrId').setValidators([Validators.required]); | ||
160 | + } else { | ||
161 | + this.serverFormGroup.get('clientPublicKeyOrId').setValidators([ | ||
162 | + Validators.required, | ||
163 | + Validators.pattern(KEY_REGEXP_HEX_DEC), | ||
164 | + Validators.minLength(this.lenMinClientPublicKeyOrId), | ||
165 | + Validators.maxLength(this.lenMaxClientPublicKeyOrId) | ||
166 | + ]); | ||
167 | + } | ||
168 | + | ||
169 | + this.serverFormGroup.get('clientSecretKey').setValidators([ | ||
170 | + Validators.required, | ||
171 | + Validators.pattern(KEY_REGEXP_HEX_DEC), | ||
172 | + Validators.minLength(this.lengthClientSecretKey), | ||
173 | + Validators.maxLength(this.lengthClientSecretKey) | ||
174 | + ]); | ||
175 | + } | ||
176 | +} |
ui-ngx/src/app/modules/home/components/device/security-config-lwm2m.component.html
renamed from
ui-ngx/src/app/modules/home/pages/device/lwm2m/security-config.component.html
@@ -26,145 +26,108 @@ | @@ -26,145 +26,108 @@ | ||
26 | </button> | 26 | </button> |
27 | </mat-toolbar> | 27 | </mat-toolbar> |
28 | <div mat-dialog-content> | 28 | <div mat-dialog-content> |
29 | - <fieldset [disabled]="isLoading$ | async"> | ||
30 | - <mat-form-field class="mat-block"> | ||
31 | - <mat-label translate>device.lwm2m-security-config.endpoint</mat-label> | ||
32 | - <input matInput type="text" formControlName="endPoint" required> | ||
33 | - <mat-error *ngIf="lwm2mConfigFormGroup.get('endPoint').hasError('required')"> | ||
34 | - {{ 'device.lwm2m-security-config.endpoint' | translate }} | ||
35 | - <strong>{{ 'device.lwm2m-security-config.required' | translate }}</strong> | ||
36 | - </mat-error> | ||
37 | - </mat-form-field> | ||
38 | - <mat-tab-group dynamicHeight (selectedTabChange)="tabChanged($event)"> | ||
39 | - <mat-tab label="{{ 'device.lwm2m-security-config.client-tab' | translate }}"> | ||
40 | - <ng-template matTabContent> | ||
41 | - <div class="mat-padding"> | ||
42 | - <mat-form-field class="mat-block"> | ||
43 | - <mat-label translate>device.lwm2m-security-config.mode</mat-label> | ||
44 | - <mat-select formControlName="securityConfigClientMode" | ||
45 | - (ngModelChange)="securityConfigClientModeChanged($event)"> | ||
46 | - <mat-option *ngFor="let securityConfigClientMode of securityConfigLwM2MTypes" | ||
47 | - [value]="securityConfigClientMode"> | ||
48 | - {{ credentialTypeLwM2MNamesMap.get(securityConfigLwM2MType[securityConfigClientMode]) }} | ||
49 | - </mat-option> | ||
50 | - </mat-select> | ||
51 | - </mat-form-field> | ||
52 | - <div *ngIf="lwm2mConfigFormGroup.get('securityConfigClientMode').value === securityConfigLwM2MType.PSK"> | ||
53 | - <mat-form-field class="mat-block"> | ||
54 | - <mat-label>{{ 'device.lwm2m-security-config.identity' | translate }}</mat-label> | ||
55 | - <input matInput type="text" formControlName="identityPSK" | ||
56 | - [required]="lwm2mConfigFormGroup.get('securityConfigClientMode').value === securityConfigLwM2MType.PSK"> | ||
57 | - <mat-error *ngIf="lwm2mConfigFormGroup.get('identityPSK').hasError('required')"> | ||
58 | - {{ 'device.lwm2m-security-config.identity' | translate }} | ||
59 | - <strong>{{ 'device.lwm2m-security-config.required' | translate }}</strong> | ||
60 | - </mat-error> | ||
61 | - </mat-form-field> | ||
62 | - </div> | ||
63 | - <div *ngIf="lwm2mConfigFormGroup.get('securityConfigClientMode').value === securityConfigLwM2MType.RPK || | ||
64 | - lwm2mConfigFormGroup.get('securityConfigClientMode').value === securityConfigLwM2MType.PSK"> | ||
65 | - <mat-form-field class="mat-block"> | ||
66 | - <mat-label>{{ 'device.lwm2m-security-config.client-key' | translate }}</mat-label> | ||
67 | - <textarea matInput | ||
68 | - #clientKey | ||
69 | - maxlength="{{lenMaxKeyClient}}" | ||
70 | - cdkTextareaAutosize | ||
71 | - cdkAutosizeMinRows="1" | ||
72 | - cols="1" | ||
73 | - formControlName="clientKey" | ||
74 | - style="overflow:hidden" | ||
75 | - [required]="lwm2mConfigFormGroup.get('securityConfigClientMode').value === securityConfigLwM2MType.RPK || | ||
76 | - lwm2mConfigFormGroup.get('securityConfigClientMode').value === securityConfigLwM2MType.PSK"> | ||
77 | - </textarea> | ||
78 | - <mat-hint align="end">{{clientKey.value?.length || 0}}/{{lenMaxKeyClient}}</mat-hint> | ||
79 | - <mat-error *ngIf="lwm2mConfigFormGroup.get('clientKey').hasError('required')"> | ||
80 | - {{ 'device.lwm2m-security-config.client-key' | translate }} | ||
81 | - <strong>{{ 'device.lwm2m-security-config.required' | translate }}</strong> | ||
82 | - </mat-error> | ||
83 | - <mat-error *ngIf="lwm2mConfigFormGroup.get('clientKey').hasError('pattern')"> | ||
84 | - {{ 'device.lwm2m-security-config.client-key' | translate }} | ||
85 | - <strong>{{ 'device.lwm2m-security-config.pattern_hex_dec' | translate: { | ||
86 | - count: 0 | ||
87 | - } }}</strong> | ||
88 | - </mat-error> | ||
89 | - <mat-error *ngIf="(lwm2mConfigFormGroup.get('clientKey').hasError('maxlength') || | ||
90 | - lwm2mConfigFormGroup.get('clientKey').hasError('minlength'))"> | ||
91 | - {{ 'device.lwm2m-security-config.client-key' | translate }} | ||
92 | - <strong>{{ 'device.lwm2m-security-config.pattern_hex_dec' | translate: { | ||
93 | - count: lenMaxKeyClient | ||
94 | - } }}</strong> | ||
95 | - </mat-error> | ||
96 | - </mat-form-field> | ||
97 | - </div> | ||
98 | - <div *ngIf="lwm2mConfigFormGroup.get('securityConfigClientMode').value === securityConfigLwM2MType.X509"> | ||
99 | - <mat-checkbox formControlName="clientCertificate" color="primary"> | ||
100 | - {{ 'device.lwm2m-security-config.client-certificate' | translate }} | ||
101 | - </mat-checkbox> | ||
102 | - </div> | ||
103 | - </div> | ||
104 | - </ng-template> | ||
105 | - </mat-tab> | ||
106 | - <mat-tab label="{{ 'device.lwm2m-security-config.bootstrap-tab' | translate }}"> | ||
107 | - <ng-template matTabContent> | ||
108 | - <div class="mat-padding"> | ||
109 | - <mat-accordion multi="true" class="mat-body-1"> | ||
110 | - <mat-expansion-panel> | ||
111 | - <mat-expansion-panel-header> | ||
112 | - <mat-panel-title> | ||
113 | - <div | ||
114 | - class="tb-panel-title">{{ 'device.lwm2m-security-config.bootstrap-server' | translate | uppercase }}</div> | ||
115 | - </mat-panel-title> | ||
116 | - </mat-expansion-panel-header> | ||
117 | - <ng-template matExpansionPanelContent> | ||
118 | - <div class="mat-padding"> | ||
119 | - <tb-security-config-server-lwm2m | ||
120 | - [formControlName]="bootstrapServer" | ||
121 | - [serverFormGroup]="bootstrapFormGroup"> | ||
122 | - </tb-security-config-server-lwm2m> | ||
123 | - </div> | ||
124 | - </ng-template> | ||
125 | - </mat-expansion-panel> | ||
126 | - </mat-accordion> | ||
127 | - <mat-accordion multi="true" class="mat-body-1"> | ||
128 | - <mat-expansion-panel> | ||
129 | - <mat-expansion-panel-header> | ||
130 | - <mat-panel-title> | ||
131 | - <div | ||
132 | - class="tb-panel-title">{{ 'device.lwm2m-security-config.lwm2m-server' | translate | uppercase }}</div> | ||
133 | - </mat-panel-title> | ||
134 | - </mat-expansion-panel-header> | ||
135 | - <ng-template matExpansionPanelContent> | ||
136 | - <div class="mat-padding"> | ||
137 | - <tb-security-config-server-lwm2m | ||
138 | - [formControlName]="lwm2mServer" | ||
139 | - [serverFormGroup]="lwm2mServerFormGroup"> | ||
140 | - </tb-security-config-server-lwm2m> | ||
141 | - </div> | ||
142 | - </ng-template> | ||
143 | - </mat-expansion-panel> | ||
144 | - </mat-accordion> | ||
145 | - </div> | ||
146 | - </ng-template> | ||
147 | - </mat-tab> | ||
148 | - <mat-tab label="{{ 'device.lwm2m-security-config.config-json-tab' | translate }}"> | ||
149 | - <ng-template matTabContent> | ||
150 | - <div class="mat-padding"> | ||
151 | - <fieldset [disabled]="isLoading$ | async"> | ||
152 | - <tb-json-object-edit | ||
153 | - [formControlName]="formControlNameJsonAllConfig" | ||
154 | - label="{{ 'device.lwm2m-value' | translate }}" | ||
155 | - validateContent="true" | ||
156 | - [required]="true" | ||
157 | - [fillHeight]="false"> | ||
158 | - </tb-json-object-edit> | ||
159 | - </fieldset> | ||
160 | - </div> | ||
161 | - </ng-template> | ||
162 | - </mat-tab> | ||
163 | - </mat-tab-group> | ||
164 | - </fieldset> | 29 | + <mat-form-field class="mat-block"> |
30 | + <mat-label translate>device.lwm2m-security-config.endpoint</mat-label> | ||
31 | + <input matInput type="text" formControlName="endPoint" required> | ||
32 | + <mat-error *ngIf="lwm2mConfigFormGroup.get('endPoint').hasError('required')"> | ||
33 | + {{ 'device.lwm2m-security-config.endpoint-required' | translate }} | ||
34 | + </mat-error> | ||
35 | + </mat-form-field> | ||
36 | + <mat-tab-group (selectedTabChange)="tabChanged($event)"> | ||
37 | + <mat-tab label="{{ 'device.lwm2m-security-config.client-tab' | translate }}"> | ||
38 | + <mat-form-field class="mat-block"> | ||
39 | + <mat-label translate>device.lwm2m-security-config.mode</mat-label> | ||
40 | + <mat-select formControlName="securityConfigClientMode"> | ||
41 | + <mat-option *ngFor="let securityConfigClientMode of securityConfigLwM2MTypes" | ||
42 | + [value]="securityConfigClientMode"> | ||
43 | + {{ credentialTypeLwM2MNamesMap.get(securityConfigLwM2MType[securityConfigClientMode]) }} | ||
44 | + </mat-option> | ||
45 | + </mat-select> | ||
46 | + </mat-form-field> | ||
47 | + <div *ngIf="lwm2mConfigFormGroup.get('securityConfigClientMode').value === securityConfigLwM2MType.PSK"> | ||
48 | + <mat-form-field class="mat-block"> | ||
49 | + <mat-label>{{ 'device.lwm2m-security-config.identity' | translate }}</mat-label> | ||
50 | + <input matInput type="text" formControlName="identity" required> | ||
51 | + <mat-error *ngIf="lwm2mConfigFormGroup.get('identity').hasError('required')"> | ||
52 | + {{ 'device.lwm2m-security-config.identity-required' | translate }} | ||
53 | + </mat-error> | ||
54 | + </mat-form-field> | ||
55 | + </div> | ||
56 | + <mat-form-field class="mat-block" *ngIf="lwm2mConfigFormGroup.get('securityConfigClientMode').value === securityConfigLwM2MType.RPK || | ||
57 | + lwm2mConfigFormGroup.get('securityConfigClientMode').value === securityConfigLwM2MType.PSK"> | ||
58 | + <mat-label>{{ 'device.lwm2m-security-config.client-key' | translate }}</mat-label> | ||
59 | + <textarea matInput | ||
60 | + #key | ||
61 | + maxlength="{{lenMaxKeyClient}}" | ||
62 | + cdkTextareaAutosize | ||
63 | + cdkAutosizeMinRows="1" | ||
64 | + cols="1" | ||
65 | + formControlName="key" | ||
66 | + required> | ||
67 | + </textarea> | ||
68 | + <mat-hint align="end">{{key.value?.length || 0}}/{{lenMaxKeyClient}}</mat-hint> | ||
69 | + <mat-error *ngIf="lwm2mConfigFormGroup.get('key').hasError('required')"> | ||
70 | + {{ 'device.lwm2m-security-config.client-key-required' | translate }} | ||
71 | + </mat-error> | ||
72 | + <mat-error *ngIf="lwm2mConfigFormGroup.get('key').hasError('pattern')"> | ||
73 | + {{ 'device.lwm2m-security-config.client-key-pattern' | translate }} | ||
74 | + </mat-error> | ||
75 | + <mat-error *ngIf="(lwm2mConfigFormGroup.get('key').hasError('maxlength') || | ||
76 | + lwm2mConfigFormGroup.get('key').hasError('minlength'))"> | ||
77 | + {{ 'device.lwm2m-security-config.client-key-length' | translate: { | ||
78 | + count: lenMaxKeyClient | ||
79 | + } }} | ||
80 | + </mat-error> | ||
81 | + </mat-form-field> | ||
82 | + <mat-checkbox formControlName="x509" color="primary" | ||
83 | + *ngIf="lwm2mConfigFormGroup.get('securityConfigClientMode').value === securityConfigLwM2MType.X509"> | ||
84 | + {{ 'device.lwm2m-security-config.client-certificate' | translate }} | ||
85 | + </mat-checkbox> | ||
86 | + </mat-tab> | ||
87 | + <mat-tab label="{{ 'device.lwm2m-security-config.bootstrap-tab' | translate }}"> | ||
88 | + <div style="padding: 2px;"> | ||
89 | + <mat-accordion multi="true" class="mat-body-1"> | ||
90 | + <mat-expansion-panel> | ||
91 | + <mat-expansion-panel-header> | ||
92 | + <mat-panel-title> | ||
93 | + {{ 'device.lwm2m-security-config.bootstrap-server' | translate }} | ||
94 | + </mat-panel-title> | ||
95 | + </mat-expansion-panel-header> | ||
96 | + <ng-template matExpansionPanelContent> | ||
97 | + <tb-security-config-lwm2m-server | ||
98 | + formControlName="bootstrapServer"> | ||
99 | + </tb-security-config-lwm2m-server> | ||
100 | + </ng-template> | ||
101 | + </mat-expansion-panel> | ||
102 | + <mat-expansion-panel> | ||
103 | + <mat-expansion-panel-header> | ||
104 | + <mat-panel-title> | ||
105 | + {{ 'device.lwm2m-security-config.lwm2m-server' | translate }} | ||
106 | + </mat-panel-title> | ||
107 | + </mat-expansion-panel-header> | ||
108 | + <ng-template matExpansionPanelContent> | ||
109 | + <tb-security-config-lwm2m-server | ||
110 | + formControlName="lwm2mServer"> | ||
111 | + </tb-security-config-lwm2m-server> | ||
112 | + </ng-template> | ||
113 | + </mat-expansion-panel> | ||
114 | + </mat-accordion> | ||
115 | + </div> | ||
116 | + </mat-tab> | ||
117 | + <mat-tab label="{{ 'device.lwm2m-security-config.config-json-tab' | translate }}"> | ||
118 | + <ng-template matTabContent> | ||
119 | + <tb-json-object-edit | ||
120 | + [formControlName]="formControlNameJsonAllConfig" | ||
121 | + label="{{ 'device.lwm2m-value' | translate }}" | ||
122 | + readonly | ||
123 | + [required]="true" | ||
124 | + [fillHeight]="false"> | ||
125 | + </tb-json-object-edit> | ||
126 | + </ng-template> | ||
127 | + </mat-tab> | ||
128 | + </mat-tab-group> | ||
165 | </div> | 129 | </div> |
166 | <div mat-dialog-actions fxLayout="row" fxLayoutAlign="end center"> | 130 | <div mat-dialog-actions fxLayout="row" fxLayoutAlign="end center"> |
167 | - <span fxFlex></span> | ||
168 | <button mat-button color="primary" | 131 | <button mat-button color="primary" |
169 | type="button" | 132 | type="button" |
170 | [disabled]="(isLoading$ | async)" | 133 | [disabled]="(isLoading$ | async)" |
1 | +/** | ||
2 | + * Copyright © 2016-2021 The Thingsboard Authors | ||
3 | + * | ||
4 | + * Licensed under the Apache License, Version 2.0 (the "License"); | ||
5 | + * you may not use this file except in compliance with the License. | ||
6 | + * You may obtain a copy of the License at | ||
7 | + * | ||
8 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
9 | + * | ||
10 | + * Unless required by applicable law or agreed to in writing, software | ||
11 | + * distributed under the License is distributed on an "AS IS" BASIS, | ||
12 | + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
13 | + * See the License for the specific language governing permissions and | ||
14 | + * limitations under the License. | ||
15 | + */ | ||
16 | +:host { | ||
17 | + mat-tab-group { | ||
18 | + min-height: 330px; | ||
19 | + } | ||
20 | +} | ||
21 | + | ||
22 | +:host ::ng-deep { | ||
23 | + .mat-tab-body-wrapper { | ||
24 | + min-height: 200px; | ||
25 | + } | ||
26 | + | ||
27 | + .mat-tab-body { | ||
28 | + padding: 16px 0; | ||
29 | + } | ||
30 | + | ||
31 | + textarea.mat-input-element.cdk-textarea-autosize { | ||
32 | + box-sizing: content-box; | ||
33 | + } | ||
34 | +} |
1 | +/// | ||
2 | +/// Copyright © 2016-2021 The Thingsboard Authors | ||
3 | +/// | ||
4 | +/// Licensed under the Apache License, Version 2.0 (the "License"); | ||
5 | +/// you may not use this file except in compliance with the License. | ||
6 | +/// You may obtain a copy of the License at | ||
7 | +/// | ||
8 | +/// http://www.apache.org/licenses/LICENSE-2.0 | ||
9 | +/// | ||
10 | +/// Unless required by applicable law or agreed to in writing, software | ||
11 | +/// distributed under the License is distributed on an "AS IS" BASIS, | ||
12 | +/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
13 | +/// See the License for the specific language governing permissions and | ||
14 | +/// limitations under the License. | ||
15 | +/// | ||
16 | + | ||
17 | + | ||
18 | +import { Component, Inject, OnDestroy, OnInit } from '@angular/core'; | ||
19 | +import { DialogComponent } from '@shared/components/dialog.component'; | ||
20 | +import { Store } from '@ngrx/store'; | ||
21 | +import { AppState } from '@core/core.state'; | ||
22 | +import { Router } from '@angular/router'; | ||
23 | +import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; | ||
24 | +import { FormBuilder, FormGroup, Validators } from '@angular/forms'; | ||
25 | +import { TranslateService } from '@ngx-translate/core'; | ||
26 | +import { | ||
27 | + DeviceCredentialsDialogLwm2mData, | ||
28 | + getClientSecurityConfig, | ||
29 | + JSON_ALL_CONFIG, | ||
30 | + KEY_REGEXP_HEX_DEC, | ||
31 | + LEN_MAX_PSK, | ||
32 | + LEN_MAX_PUBLIC_KEY_RPK, | ||
33 | + Lwm2mSecurityConfigModels, | ||
34 | + Lwm2mSecurityType, | ||
35 | + Lwm2mSecurityTypeTranslationMap | ||
36 | +} from '@shared/models/lwm2m-security-config.models'; | ||
37 | +import { MatTabChangeEvent } from '@angular/material/tabs'; | ||
38 | +import { MatTab } from '@angular/material/tabs/tab'; | ||
39 | +import { Subject } from 'rxjs'; | ||
40 | +import { takeUntil } from 'rxjs/operators'; | ||
41 | + | ||
42 | +@Component({ | ||
43 | + selector: 'tb-security-config-lwm2m', | ||
44 | + templateUrl: './security-config-lwm2m.component.html', | ||
45 | + styleUrls: ['./security-config-lwm2m.component.scss'] | ||
46 | +}) | ||
47 | + | ||
48 | +export class SecurityConfigLwm2mComponent extends DialogComponent<SecurityConfigLwm2mComponent, object> implements OnInit, OnDestroy { | ||
49 | + | ||
50 | + private destroy$ = new Subject(); | ||
51 | + | ||
52 | + lwm2mConfigFormGroup: FormGroup; | ||
53 | + title: string; | ||
54 | + securityConfigLwM2MType = Lwm2mSecurityType; | ||
55 | + securityConfigLwM2MTypes = Object.keys(Lwm2mSecurityType); | ||
56 | + credentialTypeLwM2MNamesMap = Lwm2mSecurityTypeTranslationMap; | ||
57 | + formControlNameJsonAllConfig = JSON_ALL_CONFIG; | ||
58 | + jsonAllConfig: Lwm2mSecurityConfigModels; | ||
59 | + lenMaxKeyClient = LEN_MAX_PSK; | ||
60 | + tabPrevious: MatTab; | ||
61 | + tabIndexPrevious = 0; | ||
62 | + | ||
63 | + constructor(protected store: Store<AppState>, | ||
64 | + protected router: Router, | ||
65 | + @Inject(MAT_DIALOG_DATA) public data: DeviceCredentialsDialogLwm2mData, | ||
66 | + public dialogRef: MatDialogRef<SecurityConfigLwm2mComponent, object>, | ||
67 | + public fb: FormBuilder, | ||
68 | + public translate: TranslateService) { | ||
69 | + super(store, router, dialogRef); | ||
70 | + } | ||
71 | + | ||
72 | + ngOnInit() { | ||
73 | + this.jsonAllConfig = JSON.parse(JSON.stringify(this.data.jsonAllConfig)); | ||
74 | + this.lwm2mConfigFormGroup = this.initLwm2mConfigFormGroup(); | ||
75 | + this.title = this.translate.instant('device.lwm2m-security-info') + ': ' + this.data.endPoint; | ||
76 | + this.lwm2mConfigFormGroup.get('x509').disable(); | ||
77 | + this.initClientSecurityConfig(this.lwm2mConfigFormGroup.get('jsonAllConfig').value); | ||
78 | + this.registerDisableOnLoadFormControl(this.lwm2mConfigFormGroup.get('securityConfigClientMode')); | ||
79 | + } | ||
80 | + | ||
81 | + ngOnDestroy() { | ||
82 | + this.destroy$.next(); | ||
83 | + this.destroy$.complete(); | ||
84 | + } | ||
85 | + | ||
86 | + private initClientSecurityConfig = (jsonAllConfig: Lwm2mSecurityConfigModels): void => { | ||
87 | + if (jsonAllConfig.client.securityConfigClientMode !== Lwm2mSecurityType.NO_SEC) { | ||
88 | + this.lwm2mConfigFormGroup.patchValue(jsonAllConfig.client, {emitEvent: false}); | ||
89 | + } | ||
90 | + this.securityConfigClientUpdateValidators(jsonAllConfig.client.securityConfigClientMode); | ||
91 | + } | ||
92 | + | ||
93 | + private securityConfigClientModeChanged(type: Lwm2mSecurityType): void { | ||
94 | + const config = getClientSecurityConfig(type, this.lwm2mConfigFormGroup.get('endPoint').value); | ||
95 | + switch (type) { | ||
96 | + case Lwm2mSecurityType.PSK: | ||
97 | + config.identity = this.data.endPoint; | ||
98 | + config.key = this.lwm2mConfigFormGroup.get('key').value; | ||
99 | + break; | ||
100 | + case Lwm2mSecurityType.RPK: | ||
101 | + config.key = this.lwm2mConfigFormGroup.get('key').value; | ||
102 | + break; | ||
103 | + } | ||
104 | + this.jsonAllConfig.client = config; | ||
105 | + this.lwm2mConfigFormGroup.patchValue({ | ||
106 | + ...config, | ||
107 | + jsonAllConfig: this.jsonAllConfig | ||
108 | + }, {emitEvent: false}); | ||
109 | + this.securityConfigClientUpdateValidators(type); | ||
110 | + } | ||
111 | + | ||
112 | + private securityConfigClientUpdateValidators = (mode: Lwm2mSecurityType): void => { | ||
113 | + switch (mode) { | ||
114 | + case Lwm2mSecurityType.NO_SEC: | ||
115 | + case Lwm2mSecurityType.X509: | ||
116 | + this.setValidatorsNoSecX509(); | ||
117 | + break; | ||
118 | + case Lwm2mSecurityType.PSK: | ||
119 | + this.lenMaxKeyClient = LEN_MAX_PSK; | ||
120 | + this.setValidatorsPskRpk(mode); | ||
121 | + break; | ||
122 | + case Lwm2mSecurityType.RPK: | ||
123 | + this.lenMaxKeyClient = LEN_MAX_PUBLIC_KEY_RPK; | ||
124 | + this.setValidatorsPskRpk(mode); | ||
125 | + break; | ||
126 | + } | ||
127 | + this.lwm2mConfigFormGroup.get('identity').updateValueAndValidity({emitEvent: false}); | ||
128 | + this.lwm2mConfigFormGroup.get('key').updateValueAndValidity({emitEvent: false}); | ||
129 | + } | ||
130 | + | ||
131 | + private setValidatorsNoSecX509 = (): void => { | ||
132 | + this.lwm2mConfigFormGroup.get('identity').setValidators([]); | ||
133 | + this.lwm2mConfigFormGroup.get('key').setValidators([]); | ||
134 | + } | ||
135 | + | ||
136 | + private setValidatorsPskRpk = (mode: Lwm2mSecurityType): void => { | ||
137 | + if (mode === Lwm2mSecurityType.PSK) { | ||
138 | + this.lwm2mConfigFormGroup.get('identity').setValidators([Validators.required]); | ||
139 | + } else { | ||
140 | + this.lwm2mConfigFormGroup.get('identity').setValidators([]); | ||
141 | + } | ||
142 | + this.lwm2mConfigFormGroup.get('key').setValidators([Validators.required, | ||
143 | + Validators.pattern(KEY_REGEXP_HEX_DEC), | ||
144 | + Validators.maxLength(this.lenMaxKeyClient), Validators.minLength(this.lenMaxKeyClient)]); | ||
145 | + } | ||
146 | + | ||
147 | + tabChanged = (tabChangeEvent: MatTabChangeEvent): void => { | ||
148 | + if (this.tabIndexPrevious !== tabChangeEvent.index) { | ||
149 | + this.upDateValueToJson(); | ||
150 | + } | ||
151 | + this.tabIndexPrevious = tabChangeEvent.index; | ||
152 | + } | ||
153 | + | ||
154 | + private upDateValueToJson(): void { | ||
155 | + switch (this.tabIndexPrevious) { | ||
156 | + case 0: | ||
157 | + this.upDateValueToJsonTab0(); | ||
158 | + break; | ||
159 | + case 1: | ||
160 | + this.upDateValueToJsonTab1(); | ||
161 | + break; | ||
162 | + } | ||
163 | + } | ||
164 | + | ||
165 | + private upDateValueToJsonTab0 = (): void => { | ||
166 | + if (this.lwm2mConfigFormGroup.get('identity').dirty && this.lwm2mConfigFormGroup.get('identity').valid || | ||
167 | + this.lwm2mConfigFormGroup.get('key').dirty && this.lwm2mConfigFormGroup.get('key').valid) { | ||
168 | + this.updateBootstrapSettings(); | ||
169 | + this.upDateJsonAllConfig(); | ||
170 | + } | ||
171 | + } | ||
172 | + | ||
173 | + private upDateValueToJsonTab1 = (): void => { | ||
174 | + const bootstrap = this.lwm2mConfigFormGroup.get('bootstrapServer').value; | ||
175 | + if (bootstrap !== null | ||
176 | + && this.lwm2mConfigFormGroup.get('bootstrapServer').dirty | ||
177 | + && this.lwm2mConfigFormGroup.get('bootstrapServer').valid) { | ||
178 | + this.jsonAllConfig.bootstrap.bootstrapServer = bootstrap; | ||
179 | + this.upDateJsonAllConfig(); | ||
180 | + } | ||
181 | + const serverConfig = this.lwm2mConfigFormGroup.get('lwm2mServer').value; | ||
182 | + if (serverConfig !== null | ||
183 | + && this.lwm2mConfigFormGroup.get('lwm2mServer').dirty | ||
184 | + && this.lwm2mConfigFormGroup.get('lwm2mServer').valid) { | ||
185 | + this.jsonAllConfig.bootstrap.lwm2mServer = serverConfig; | ||
186 | + this.upDateJsonAllConfig(); | ||
187 | + } | ||
188 | + } | ||
189 | + | ||
190 | + private updateBootstrapSettings() { | ||
191 | + const securityMode = 'securityMode'; | ||
192 | + this.jsonAllConfig.client.identity = this.lwm2mConfigFormGroup.get('identity').value; | ||
193 | + this.jsonAllConfig.client.key = this.lwm2mConfigFormGroup.get('key').value; | ||
194 | + if (this.lwm2mConfigFormGroup.get('bootstrapServer').value[securityMode] === Lwm2mSecurityType.PSK) { | ||
195 | + this.jsonAllConfig.bootstrap.bootstrapServer.clientPublicKeyOrId = this.jsonAllConfig.client.identity; | ||
196 | + this.jsonAllConfig.bootstrap.bootstrapServer.clientSecretKey = this.jsonAllConfig.client.key; | ||
197 | + this.lwm2mConfigFormGroup.get('bootstrapServer').patchValue(this.jsonAllConfig.bootstrap.bootstrapServer, {emitEvent: false}); | ||
198 | + } | ||
199 | + if (this.lwm2mConfigFormGroup.get('lwm2mServer').value[securityMode] === Lwm2mSecurityType.PSK) { | ||
200 | + this.jsonAllConfig.bootstrap.lwm2mServer.clientPublicKeyOrId = this.jsonAllConfig.client.identity; | ||
201 | + this.jsonAllConfig.bootstrap.lwm2mServer.clientSecretKey = this.jsonAllConfig.client.key; | ||
202 | + this.lwm2mConfigFormGroup.get('lwm2mServer').patchValue(this.jsonAllConfig.bootstrap.lwm2mServer, {emitEvent: false}); | ||
203 | + } | ||
204 | + } | ||
205 | + | ||
206 | + private upDateJsonAllConfig = (): void => { | ||
207 | + this.lwm2mConfigFormGroup.patchValue({ | ||
208 | + jsonAllConfig: this.jsonAllConfig | ||
209 | + }, {emitEvent: false}); | ||
210 | + } | ||
211 | + | ||
212 | + private initLwm2mConfigFormGroup = (): FormGroup => { | ||
213 | + if (this.jsonAllConfig.client.securityConfigClientMode === Lwm2mSecurityType.PSK) { | ||
214 | + this.data.endPoint = this.jsonAllConfig.client.endpoint; | ||
215 | + } | ||
216 | + const formGroup = this.fb.group({ | ||
217 | + securityConfigClientMode: [this.jsonAllConfig.client.securityConfigClientMode], | ||
218 | + identity: [''], | ||
219 | + key: [''], | ||
220 | + x509: [false], | ||
221 | + bootstrapServer: [this.jsonAllConfig.bootstrap.bootstrapServer], | ||
222 | + lwm2mServer: [this.jsonAllConfig.bootstrap.lwm2mServer], | ||
223 | + endPoint: [this.data.endPoint], | ||
224 | + jsonAllConfig: [this.jsonAllConfig] | ||
225 | + }); | ||
226 | + formGroup.get('securityConfigClientMode').valueChanges.pipe( | ||
227 | + takeUntil(this.destroy$) | ||
228 | + ).subscribe((type) => { | ||
229 | + this.securityConfigClientModeChanged(type); | ||
230 | + }); | ||
231 | + formGroup.get('endPoint').valueChanges.pipe( | ||
232 | + takeUntil(this.destroy$) | ||
233 | + ).subscribe((endpoint) => { | ||
234 | + if (formGroup.get('securityConfigClientMode').value === Lwm2mSecurityType.PSK) { | ||
235 | + this.jsonAllConfig.client.endpoint = endpoint; | ||
236 | + this.upDateJsonAllConfig(); | ||
237 | + } | ||
238 | + }); | ||
239 | + return formGroup; | ||
240 | + } | ||
241 | + | ||
242 | + save(): void { | ||
243 | + this.upDateValueToJson(); | ||
244 | + this.data.endPoint = this.lwm2mConfigFormGroup.get('endPoint').value.split('\'').join(''); | ||
245 | + this.data.jsonAllConfig = this.jsonAllConfig; | ||
246 | + if (this.lwm2mConfigFormGroup.get('securityConfigClientMode').value === Lwm2mSecurityType.PSK) { | ||
247 | + this.data.endPoint = this.data.jsonAllConfig.client.identity; | ||
248 | + } | ||
249 | + this.dialogRef.close(this.data); | ||
250 | + } | ||
251 | + | ||
252 | + cancel(): void { | ||
253 | + this.dialogRef.close(undefined); | ||
254 | + } | ||
255 | +} | ||
256 | + | ||
257 | + |
@@ -138,6 +138,8 @@ import { EMBED_DASHBOARD_DIALOG_TOKEN } from '@home/components/widget/dialog/emb | @@ -138,6 +138,8 @@ import { EMBED_DASHBOARD_DIALOG_TOKEN } from '@home/components/widget/dialog/emb | ||
138 | import { EdgeDownlinkTableComponent } from '@home/components/edge/edge-downlink-table.component'; | 138 | import { EdgeDownlinkTableComponent } from '@home/components/edge/edge-downlink-table.component'; |
139 | import { EdgeDownlinkTableHeaderComponent } from '@home/components/edge/edge-downlink-table-header.component'; | 139 | import { EdgeDownlinkTableHeaderComponent } from '@home/components/edge/edge-downlink-table-header.component'; |
140 | import { DisplayWidgetTypesPanelComponent } from '@home/components/dashboard-page/widget-types-panel.component'; | 140 | import { DisplayWidgetTypesPanelComponent } from '@home/components/dashboard-page/widget-types-panel.component'; |
141 | +import { SecurityConfigLwm2mComponent } from '@home/components/device/security-config-lwm2m.component'; | ||
142 | +import { SecurityConfigLwm2mServerComponent } from '@home/components/device/security-config-lwm2m-server.component'; | ||
141 | 143 | ||
142 | @NgModule({ | 144 | @NgModule({ |
143 | declarations: | 145 | declarations: |
@@ -239,6 +241,8 @@ import { DisplayWidgetTypesPanelComponent } from '@home/components/dashboard-pag | @@ -239,6 +241,8 @@ import { DisplayWidgetTypesPanelComponent } from '@home/components/dashboard-pag | ||
239 | DeviceWizardDialogComponent, | 241 | DeviceWizardDialogComponent, |
240 | DeviceCredentialsComponent, | 242 | DeviceCredentialsComponent, |
241 | CopyDeviceCredentialsComponent, | 243 | CopyDeviceCredentialsComponent, |
244 | + SecurityConfigLwm2mComponent, | ||
245 | + SecurityConfigLwm2mServerComponent, | ||
242 | AlarmScheduleDialogComponent, | 246 | AlarmScheduleDialogComponent, |
243 | EditAlarmDetailsDialogComponent, | 247 | EditAlarmDetailsDialogComponent, |
244 | SmsProviderConfigurationComponent, | 248 | SmsProviderConfigurationComponent, |
@@ -342,6 +346,8 @@ import { DisplayWidgetTypesPanelComponent } from '@home/components/dashboard-pag | @@ -342,6 +346,8 @@ import { DisplayWidgetTypesPanelComponent } from '@home/components/dashboard-pag | ||
342 | DeviceWizardDialogComponent, | 346 | DeviceWizardDialogComponent, |
343 | DeviceCredentialsComponent, | 347 | DeviceCredentialsComponent, |
344 | CopyDeviceCredentialsComponent, | 348 | CopyDeviceCredentialsComponent, |
349 | + SecurityConfigLwm2mComponent, | ||
350 | + SecurityConfigLwm2mServerComponent, | ||
345 | AlarmScheduleInfoComponent, | 351 | AlarmScheduleInfoComponent, |
346 | AlarmScheduleComponent, | 352 | AlarmScheduleComponent, |
347 | AlarmScheduleDialogComponent, | 353 | AlarmScheduleDialogComponent, |
@@ -14,21 +14,20 @@ | @@ -14,21 +14,20 @@ | ||
14 | /// limitations under the License. | 14 | /// limitations under the License. |
15 | /// | 15 | /// |
16 | 16 | ||
17 | -import {Component, Inject, OnInit, SkipSelf} from "@angular/core"; | ||
18 | -import {ErrorStateMatcher} from "@angular/material/core"; | ||
19 | -import {DialogComponent} from "@shared/components/dialog.component"; | ||
20 | -import {Store} from "@ngrx/store"; | ||
21 | -import {AppState} from "@core/core.state"; | ||
22 | -import {Router} from "@angular/router"; | ||
23 | -import {MAT_DIALOG_DATA, MatDialogRef} from "@angular/material/dialog"; | ||
24 | -import {FormBuilder, FormControl, FormGroup, FormGroupDirective, NgForm} from "@angular/forms"; | ||
25 | -import {TranslateService} from "@ngx-translate/core"; | ||
26 | -import {JsonObject} from "@angular/compiler-cli/ngcc/src/packages/entry_point"; | 17 | +import { Component, Inject, OnInit, SkipSelf } from '@angular/core'; |
18 | +import { ErrorStateMatcher } from '@angular/material/core'; | ||
19 | +import { DialogComponent } from '@shared/components/dialog.component'; | ||
20 | +import { Store } from '@ngrx/store'; | ||
21 | +import { AppState } from '@core/core.state'; | ||
22 | +import { Router } from '@angular/router'; | ||
23 | +import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; | ||
24 | +import { FormBuilder, FormControl, FormGroup, FormGroupDirective, NgForm } from '@angular/forms'; | ||
25 | +import { JsonObject } from '@angular/compiler-cli/ngcc/src/packages/entry_point'; | ||
27 | 26 | ||
28 | export interface Lwm2mAttributesDialogData { | 27 | export interface Lwm2mAttributesDialogData { |
29 | readonly: boolean; | 28 | readonly: boolean; |
30 | attributeLwm2m: JsonObject; | 29 | attributeLwm2m: JsonObject; |
31 | - destName: string | 30 | + destName: string; |
32 | } | 31 | } |
33 | 32 | ||
34 | @Component({ | 33 | @Component({ |
@@ -37,7 +36,8 @@ export interface Lwm2mAttributesDialogData { | @@ -37,7 +36,8 @@ export interface Lwm2mAttributesDialogData { | ||
37 | styleUrls: ['./lwm2m-attributes.component.scss'], | 36 | styleUrls: ['./lwm2m-attributes.component.scss'], |
38 | providers: [{provide: ErrorStateMatcher, useExisting: Lwm2mAttributesDialogComponent}], | 37 | providers: [{provide: ErrorStateMatcher, useExisting: Lwm2mAttributesDialogComponent}], |
39 | }) | 38 | }) |
40 | -export class Lwm2mAttributesDialogComponent extends DialogComponent<Lwm2mAttributesDialogComponent, Object> implements OnInit, ErrorStateMatcher { | 39 | +export class Lwm2mAttributesDialogComponent extends DialogComponent<Lwm2mAttributesDialogComponent, object> |
40 | + implements OnInit, ErrorStateMatcher { | ||
41 | 41 | ||
42 | readonly = this.data.readonly; | 42 | readonly = this.data.readonly; |
43 | 43 | ||
@@ -54,8 +54,7 @@ export class Lwm2mAttributesDialogComponent extends DialogComponent<Lwm2mAttribu | @@ -54,8 +54,7 @@ export class Lwm2mAttributesDialogComponent extends DialogComponent<Lwm2mAttribu | ||
54 | @Inject(MAT_DIALOG_DATA) public data: Lwm2mAttributesDialogData, | 54 | @Inject(MAT_DIALOG_DATA) public data: Lwm2mAttributesDialogData, |
55 | @SkipSelf() private errorStateMatcher: ErrorStateMatcher, | 55 | @SkipSelf() private errorStateMatcher: ErrorStateMatcher, |
56 | public dialogRef: MatDialogRef<Lwm2mAttributesDialogComponent, object>, | 56 | public dialogRef: MatDialogRef<Lwm2mAttributesDialogComponent, object>, |
57 | - private fb: FormBuilder, | ||
58 | - public translate: TranslateService) { | 57 | + private fb: FormBuilder) { |
59 | super(store, router, dialogRef); | 58 | super(store, router, dialogRef); |
60 | 59 | ||
61 | this.attributeLwm2mDialogFormGroup = this.fb.group({ | 60 | this.attributeLwm2mDialogFormGroup = this.fb.group({ |
@@ -14,7 +14,7 @@ | @@ -14,7 +14,7 @@ | ||
14 | /// limitations under the License. | 14 | /// limitations under the License. |
15 | /// | 15 | /// |
16 | 16 | ||
17 | -import {Component, forwardRef, Input, OnInit} from "@angular/core"; | 17 | +import { Component, forwardRef, Input, OnInit } from '@angular/core'; |
18 | import { | 18 | import { |
19 | AbstractControl, | 19 | AbstractControl, |
20 | ControlValueAccessor, | 20 | ControlValueAccessor, |
@@ -26,17 +26,17 @@ import { | @@ -26,17 +26,17 @@ import { | ||
26 | NG_VALUE_ACCESSOR, | 26 | NG_VALUE_ACCESSOR, |
27 | Validator, | 27 | Validator, |
28 | Validators | 28 | Validators |
29 | -} from "@angular/forms"; | ||
30 | -import {Subscription} from "rxjs"; | ||
31 | -import {PageComponent} from "@shared/components/page.component"; | ||
32 | -import {Store} from "@ngrx/store"; | ||
33 | -import {AppState} from "@core/core.state"; | 29 | +} from '@angular/forms'; |
30 | +import { Subscription } from 'rxjs'; | ||
34 | import { | 31 | import { |
35 | ATTRIBUTE_KEYS, | 32 | ATTRIBUTE_KEYS, |
36 | ATTRIBUTE_LWM2M_ENUM, | 33 | ATTRIBUTE_LWM2M_ENUM, |
37 | ATTRIBUTE_LWM2M_MAP | 34 | ATTRIBUTE_LWM2M_MAP |
38 | -} from "@home/components/profile/device/lwm2m/lwm2m-profile-config.models"; | ||
39 | -import {isDefinedAndNotNull, isEmpty, isEmptyStr, isUndefinedOrNull} from "@core/utils"; | 35 | +} from './lwm2m-profile-config.models'; |
36 | +import { isDefinedAndNotNull, isEmpty, isEmptyStr, isUndefinedOrNull } from '@core/utils'; | ||
37 | +import { Store } from '@ngrx/store'; | ||
38 | +import { AppState } from '@core/core.state'; | ||
39 | +import { PageComponent } from '@shared/components/page.component'; | ||
40 | 40 | ||
41 | 41 | ||
42 | @Component({ | 42 | @Component({ |
@@ -98,7 +98,7 @@ export class Lwm2mAttributesKeyListComponent extends PageComponent implements Co | @@ -98,7 +98,7 @@ export class Lwm2mAttributesKeyListComponent extends PageComponent implements Co | ||
98 | registerOnTouched(fn: any): void { | 98 | registerOnTouched(fn: any): void { |
99 | } | 99 | } |
100 | 100 | ||
101 | - setDisabledState?(isDisabled: boolean): void { | 101 | + setDisabledState(isDisabled: boolean): void { |
102 | this.disabled = isDisabled; | 102 | this.disabled = isDisabled; |
103 | if (this.disabled) { | 103 | if (this.disabled) { |
104 | this.kvListFormGroup.disable({emitEvent: false}); | 104 | this.kvListFormGroup.disable({emitEvent: false}); |
@@ -166,10 +166,10 @@ export class Lwm2mAttributesKeyListComponent extends PageComponent implements Co | @@ -166,10 +166,10 @@ export class Lwm2mAttributesKeyListComponent extends PageComponent implements Co | ||
166 | }; | 166 | }; |
167 | } | 167 | } |
168 | 168 | ||
169 | - private updateValidate (c?: FormControl) { | 169 | + private updateValidate() { |
170 | const kvList = this.kvListFormGroup.get('keyVals') as FormArray; | 170 | const kvList = this.kvListFormGroup.get('keyVals') as FormArray; |
171 | kvList.controls.forEach(fg => { | 171 | kvList.controls.forEach(fg => { |
172 | - if (fg.get('key').value==='ver') { | 172 | + if (fg.get('key').value === 'ver') { |
173 | fg.get('value').setValidators(null); | 173 | fg.get('value').setValidators(null); |
174 | fg.get('value').setErrors(null); | 174 | fg.get('value').setErrors(null); |
175 | } | 175 | } |
@@ -189,7 +189,7 @@ export class Lwm2mAttributesKeyListComponent extends PageComponent implements Co | @@ -189,7 +189,7 @@ export class Lwm2mAttributesKeyListComponent extends PageComponent implements Co | ||
189 | if (isUndefinedOrNull(entry.value) || entry.key === 'ver' || isEmptyStr(entry.value.toString())) { | 189 | if (isUndefinedOrNull(entry.value) || entry.key === 'ver' || isEmptyStr(entry.value.toString())) { |
190 | keyValMap[entry.key] = entry.value.toString(); | 190 | keyValMap[entry.key] = entry.value.toString(); |
191 | } else { | 191 | } else { |
192 | - keyValMap[entry.key] = Number(entry.value) | 192 | + keyValMap[entry.key] = Number(entry.value); |
193 | } | 193 | } |
194 | }); | 194 | }); |
195 | this.propagateChange(keyValMap); | 195 | this.propagateChange(keyValMap); |
@@ -215,13 +215,13 @@ export class Lwm2mAttributesKeyListComponent extends PageComponent implements Co | @@ -215,13 +215,13 @@ export class Lwm2mAttributesKeyListComponent extends PageComponent implements Co | ||
215 | private attributeLwm2mValueNumberValidator = (control: AbstractControl) => { | 215 | private attributeLwm2mValueNumberValidator = (control: AbstractControl) => { |
216 | if (isNaN(Number(control.value)) || Number(control.value) < 0) { | 216 | if (isNaN(Number(control.value)) || Number(control.value) < 0) { |
217 | return { | 217 | return { |
218 | - 'validAttributeValue': true | 218 | + validAttributeValue: true |
219 | }; | 219 | }; |
220 | } | 220 | } |
221 | return null; | 221 | return null; |
222 | } | 222 | } |
223 | 223 | ||
224 | - private attributeLwm2mValueValidator = (property: string): Object [] => { | ||
225 | - return property === 'ver'? [] : [this.attributeLwm2mValueNumberValidator]; | 224 | + private attributeLwm2mValueValidator = (property: string): object[] => { |
225 | + return property === 'ver' ? [] : [this.attributeLwm2mValueNumberValidator]; | ||
226 | } | 226 | } |
227 | } | 227 | } |
@@ -14,21 +14,14 @@ | @@ -14,21 +14,14 @@ | ||
14 | /// limitations under the License. | 14 | /// limitations under the License. |
15 | /// | 15 | /// |
16 | 16 | ||
17 | -import {Component, EventEmitter, forwardRef, Inject, Input, Output} from "@angular/core"; | ||
18 | -import {ControlValueAccessor, FormBuilder, FormGroup, NG_VALUE_ACCESSOR} from "@angular/forms"; | ||
19 | -import {coerceBooleanProperty} from "@angular/cdk/coercion"; | ||
20 | -import {Store} from "@ngrx/store"; | ||
21 | -import {AppState} from "@core/core.state"; | ||
22 | -import {DeviceProfileService} from "@core/http/device-profile.service"; | ||
23 | -import {WINDOW} from "@core/services/window.service"; | ||
24 | -import {deepClone, isDefinedAndNotNull, isEmpty} from "@core/utils"; | ||
25 | -import { | ||
26 | - Lwm2mAttributesDialogComponent, | ||
27 | - Lwm2mAttributesDialogData | ||
28 | -} from "@home/components/profile/device/lwm2m/lwm2m-attributes-dialog.component"; | ||
29 | -import {MatDialog} from "@angular/material/dialog"; | ||
30 | -import {TranslateService} from "@ngx-translate/core"; | ||
31 | -import {ATTRIBUTE_LWM2M_LABEL} from "@home/components/profile/device/lwm2m/lwm2m-profile-config.models"; | 17 | +import { Component, EventEmitter, forwardRef, Input, Output } from '@angular/core'; |
18 | +import { ControlValueAccessor, FormBuilder, FormGroup, NG_VALUE_ACCESSOR } from '@angular/forms'; | ||
19 | +import { coerceBooleanProperty } from '@angular/cdk/coercion'; | ||
20 | +import { deepClone, isDefinedAndNotNull, isEmpty } from '@core/utils'; | ||
21 | +import { Lwm2mAttributesDialogComponent, Lwm2mAttributesDialogData } from './lwm2m-attributes-dialog.component'; | ||
22 | +import { MatDialog } from '@angular/material/dialog'; | ||
23 | +import { TranslateService } from '@ngx-translate/core'; | ||
24 | +import { ATTRIBUTE_LWM2M_LABEL } from './lwm2m-profile-config.models'; | ||
32 | 25 | ||
33 | 26 | ||
34 | @Component({ | 27 | @Component({ |
@@ -46,7 +39,6 @@ export class Lwm2mAttributesComponent implements ControlValueAccessor { | @@ -46,7 +39,6 @@ export class Lwm2mAttributesComponent implements ControlValueAccessor { | ||
46 | attributeLwm2mLabel = ATTRIBUTE_LWM2M_LABEL; | 39 | attributeLwm2mLabel = ATTRIBUTE_LWM2M_LABEL; |
47 | 40 | ||
48 | private requiredValue: boolean; | 41 | private requiredValue: boolean; |
49 | - private dirty = false; | ||
50 | 42 | ||
51 | @Input() | 43 | @Input() |
52 | attributeLwm2m: {}; | 44 | attributeLwm2m: {}; |
@@ -71,12 +63,9 @@ export class Lwm2mAttributesComponent implements ControlValueAccessor { | @@ -71,12 +63,9 @@ export class Lwm2mAttributesComponent implements ControlValueAccessor { | ||
71 | private propagateChange = (v: any) => { | 63 | private propagateChange = (v: any) => { |
72 | } | 64 | } |
73 | 65 | ||
74 | - constructor(private store: Store<AppState>, | ||
75 | - private dialog: MatDialog, | 66 | + constructor(private dialog: MatDialog, |
76 | private fb: FormBuilder, | 67 | private fb: FormBuilder, |
77 | - private deviceProfileService: DeviceProfileService, | ||
78 | - private translate: TranslateService, | ||
79 | - @Inject(WINDOW) private window: Window) {} | 68 | + private translate: TranslateService) {} |
80 | 69 | ||
81 | registerOnChange(fn: any): void { | 70 | registerOnChange(fn: any): void { |
82 | this.propagateChange = fn; | 71 | this.propagateChange = fn; |
@@ -117,20 +106,20 @@ export class Lwm2mAttributesComponent implements ControlValueAccessor { | @@ -117,20 +106,20 @@ export class Lwm2mAttributesComponent implements ControlValueAccessor { | ||
117 | return label; | 106 | return label; |
118 | } | 107 | } |
119 | 108 | ||
120 | - isDisableBtn (): boolean { | 109 | + isDisableBtn(): boolean { |
121 | return this.disabled || this.isAttributeTelemetry ? !(isDefinedAndNotNull(this.attributeLwm2m) && | 110 | return this.disabled || this.isAttributeTelemetry ? !(isDefinedAndNotNull(this.attributeLwm2m) && |
122 | !isEmpty(this.attributeLwm2m) && this.disabled) : this.disabled; | 111 | !isEmpty(this.attributeLwm2m) && this.disabled) : this.disabled; |
123 | } | 112 | } |
124 | 113 | ||
125 | - isIconView (): boolean { | 114 | + isIconView(): boolean { |
126 | return this.isAttributeTelemetry || this.disabled; | 115 | return this.isAttributeTelemetry || this.disabled; |
127 | } | 116 | } |
128 | 117 | ||
129 | - isIconEditAdd (): boolean { | 118 | + isIconEditAdd(): boolean { |
130 | return isDefinedAndNotNull(this.attributeLwm2m) && !isEmpty(this.attributeLwm2m); | 119 | return isDefinedAndNotNull(this.attributeLwm2m) && !isEmpty(this.attributeLwm2m); |
131 | } | 120 | } |
132 | 121 | ||
133 | - isToolTipLabel (): string { | 122 | + isToolTipLabel(): string { |
134 | return this.disabled ? this.translate.instant('device-profile.lwm2m.attribute-lwm2m-tip') : | 123 | return this.disabled ? this.translate.instant('device-profile.lwm2m.attribute-lwm2m-tip') : |
135 | this.isAttributeTelemetry ? this.translate.instant('device-profile.lwm2m.attribute-lwm2m-disable-tip') : | 124 | this.isAttributeTelemetry ? this.translate.instant('device-profile.lwm2m.attribute-lwm2m-disable-tip') : |
136 | this.translate.instant('device-profile.lwm2m.attribute-lwm2m-tip'); | 125 | this.translate.instant('device-profile.lwm2m.attribute-lwm2m-tip'); |
@@ -140,7 +129,7 @@ export class Lwm2mAttributesComponent implements ControlValueAccessor { | @@ -140,7 +129,7 @@ export class Lwm2mAttributesComponent implements ControlValueAccessor { | ||
140 | if ($event) { | 129 | if ($event) { |
141 | $event.stopPropagation(); | 130 | $event.stopPropagation(); |
142 | } | 131 | } |
143 | - this.dialog.open<Lwm2mAttributesDialogComponent, Lwm2mAttributesDialogData, Object>(Lwm2mAttributesDialogComponent, { | 132 | + this.dialog.open<Lwm2mAttributesDialogComponent, Lwm2mAttributesDialogData, object>(Lwm2mAttributesDialogComponent, { |
144 | disableClose: true, | 133 | disableClose: true, |
145 | panelClass: ['tb-dialog', 'tb-fullscreen-dialog'], | 134 | panelClass: ['tb-dialog', 'tb-fullscreen-dialog'], |
146 | data: { | 135 | data: { |
@@ -14,8 +14,8 @@ | @@ -14,8 +14,8 @@ | ||
14 | /// limitations under the License. | 14 | /// limitations under the License. |
15 | /// | 15 | /// |
16 | 16 | ||
17 | -import {Component, forwardRef, Inject, Input} from '@angular/core'; | ||
18 | -import {ControlValueAccessor, FormBuilder, FormGroup, NG_VALUE_ACCESSOR, Validators} from '@angular/forms'; | 17 | +import { Component, forwardRef, Inject, Input } from '@angular/core'; |
18 | +import { ControlValueAccessor, FormBuilder, FormGroup, NG_VALUE_ACCESSOR, Validators } from '@angular/forms'; | ||
19 | import { | 19 | import { |
20 | DEFAULT_CLIENT_HOLD_OFF_TIME, | 20 | DEFAULT_CLIENT_HOLD_OFF_TIME, |
21 | DEFAULT_ID_SERVER, | 21 | DEFAULT_ID_SERVER, |
@@ -28,13 +28,12 @@ import { | @@ -28,13 +28,12 @@ import { | ||
28 | SECURITY_CONFIG_MODE_NAMES, | 28 | SECURITY_CONFIG_MODE_NAMES, |
29 | ServerSecurityConfig | 29 | ServerSecurityConfig |
30 | } from './lwm2m-profile-config.models'; | 30 | } from './lwm2m-profile-config.models'; |
31 | -import {Store} from '@ngrx/store'; | ||
32 | -import {AppState} from '@core/core.state'; | ||
33 | -import {coerceBooleanProperty} from '@angular/cdk/coercion'; | ||
34 | -import {WINDOW} from '@core/services/window.service'; | ||
35 | -import {pairwise, startWith} from 'rxjs/operators'; | ||
36 | -import {DeviceProfileService} from '@core/http/device-profile.service'; | 31 | +import { coerceBooleanProperty } from '@angular/cdk/coercion'; |
32 | +import { WINDOW } from '@core/services/window.service'; | ||
33 | +import { pairwise, startWith } from 'rxjs/operators'; | ||
34 | +import { DeviceProfileService } from '@core/http/device-profile.service'; | ||
37 | 35 | ||
36 | +// @dynamic | ||
38 | @Component({ | 37 | @Component({ |
39 | selector: 'tb-profile-lwm2m-device-config-server', | 38 | selector: 'tb-profile-lwm2m-device-config-server', |
40 | templateUrl: './lwm2m-device-config-server.component.html', | 39 | templateUrl: './lwm2m-device-config-server.component.html', |
@@ -73,8 +72,7 @@ export class Lwm2mDeviceConfigServerComponent implements ControlValueAccessor { | @@ -73,8 +72,7 @@ export class Lwm2mDeviceConfigServerComponent implements ControlValueAccessor { | ||
73 | this.requiredValue = coerceBooleanProperty(value); | 72 | this.requiredValue = coerceBooleanProperty(value); |
74 | } | 73 | } |
75 | 74 | ||
76 | - constructor(protected store: Store<AppState>, | ||
77 | - public fb: FormBuilder, | 75 | + constructor(public fb: FormBuilder, |
78 | private deviceProfileService: DeviceProfileService, | 76 | private deviceProfileService: DeviceProfileService, |
79 | @Inject(WINDOW) private window: Window) { | 77 | @Inject(WINDOW) private window: Window) { |
80 | this.serverFormGroup = this.initServerGroup(); | 78 | this.serverFormGroup = this.initServerGroup(); |
@@ -15,10 +15,8 @@ | @@ -15,10 +15,8 @@ | ||
15 | /// | 15 | /// |
16 | 16 | ||
17 | import { DeviceProfileTransportConfiguration } from '@shared/models/device.models'; | 17 | import { DeviceProfileTransportConfiguration } from '@shared/models/device.models'; |
18 | -import { Component, forwardRef, Inject, Input } from '@angular/core'; | 18 | +import { Component, forwardRef, Input } from '@angular/core'; |
19 | import { ControlValueAccessor, FormBuilder, FormGroup, NG_VALUE_ACCESSOR, Validators } from '@angular/forms'; | 19 | import { ControlValueAccessor, FormBuilder, FormGroup, NG_VALUE_ACCESSOR, Validators } from '@angular/forms'; |
20 | -import { Store } from '@ngrx/store'; | ||
21 | -import { AppState } from '@app/core/core.state'; | ||
22 | import { coerceBooleanProperty } from '@angular/cdk/coercion'; | 20 | import { coerceBooleanProperty } from '@angular/cdk/coercion'; |
23 | import { | 21 | import { |
24 | ATTRIBUTE, | 22 | ATTRIBUTE, |
@@ -37,7 +35,6 @@ import { | @@ -37,7 +35,6 @@ import { | ||
37 | } from './lwm2m-profile-config.models'; | 35 | } from './lwm2m-profile-config.models'; |
38 | import { DeviceProfileService } from '@core/http/device-profile.service'; | 36 | import { DeviceProfileService } from '@core/http/device-profile.service'; |
39 | import { deepClone, isDefinedAndNotNull, isEmpty, isUndefined } from '@core/utils'; | 37 | import { deepClone, isDefinedAndNotNull, isEmpty, isUndefined } from '@core/utils'; |
40 | -import { WINDOW } from '@core/services/window.service'; | ||
41 | import { JsonArray, JsonObject } from '@angular/compiler-cli/ngcc/src/packages/entry_point'; | 38 | import { JsonArray, JsonObject } from '@angular/compiler-cli/ngcc/src/packages/entry_point'; |
42 | import { Direction } from '@shared/models/page/sort-order'; | 39 | import { Direction } from '@shared/models/page/sort-order'; |
43 | 40 | ||
@@ -78,10 +75,8 @@ export class Lwm2mDeviceProfileTransportConfigurationComponent implements Contro | @@ -78,10 +75,8 @@ export class Lwm2mDeviceProfileTransportConfigurationComponent implements Contro | ||
78 | private propagateChange = (v: any) => { | 75 | private propagateChange = (v: any) => { |
79 | } | 76 | } |
80 | 77 | ||
81 | - constructor(private store: Store<AppState>, | ||
82 | - private fb: FormBuilder, | ||
83 | - private deviceProfileService: DeviceProfileService, | ||
84 | - @Inject(WINDOW) private window: Window) { | 78 | + constructor(private fb: FormBuilder, |
79 | + private deviceProfileService: DeviceProfileService) { | ||
85 | this.lwm2mDeviceProfileFormGroup = this.fb.group({ | 80 | this.lwm2mDeviceProfileFormGroup = this.fb.group({ |
86 | clientOnlyObserveAfterConnect: [1, []], | 81 | clientOnlyObserveAfterConnect: [1, []], |
87 | objectIds: [null, Validators.required], | 82 | objectIds: [null, Validators.required], |
@@ -155,7 +150,7 @@ export class Lwm2mDeviceProfileTransportConfigurationComponent implements Contro | @@ -155,7 +150,7 @@ export class Lwm2mDeviceProfileTransportConfigurationComponent implements Contro | ||
155 | this.lwm2mDeviceProfileFormGroup.patchValue({ | 150 | this.lwm2mDeviceProfileFormGroup.patchValue({ |
156 | clientOnlyObserveAfterConnect: this.configurationValue.clientLwM2mSettings.clientOnlyObserveAfterConnect, | 151 | clientOnlyObserveAfterConnect: this.configurationValue.clientLwM2mSettings.clientOnlyObserveAfterConnect, |
157 | objectIds: value, | 152 | objectIds: value, |
158 | - observeAttrTelemetry: this.getObserveAttrTelemetryObjects(value['objectsList']), | 153 | + observeAttrTelemetry: this.getObserveAttrTelemetryObjects(value.objectsList), |
159 | shortId: this.configurationValue.bootstrap.servers.shortId, | 154 | shortId: this.configurationValue.bootstrap.servers.shortId, |
160 | lifetime: this.configurationValue.bootstrap.servers.lifetime, | 155 | lifetime: this.configurationValue.bootstrap.servers.lifetime, |
161 | defaultMinPeriod: this.configurationValue.bootstrap.servers.defaultMinPeriod, | 156 | defaultMinPeriod: this.configurationValue.bootstrap.servers.defaultMinPeriod, |
@@ -171,7 +166,6 @@ export class Lwm2mDeviceProfileTransportConfigurationComponent implements Contro | @@ -171,7 +166,6 @@ export class Lwm2mDeviceProfileTransportConfigurationComponent implements Contro | ||
171 | let configuration: DeviceProfileTransportConfiguration = null; | 166 | let configuration: DeviceProfileTransportConfiguration = null; |
172 | if (this.lwm2mDeviceConfigFormGroup.valid && this.lwm2mDeviceProfileFormGroup.valid) { | 167 | if (this.lwm2mDeviceConfigFormGroup.valid && this.lwm2mDeviceProfileFormGroup.valid) { |
173 | configuration = this.lwm2mDeviceConfigFormGroup.value.configurationJson; | 168 | configuration = this.lwm2mDeviceConfigFormGroup.value.configurationJson; |
174 | - // configuration.type = DeviceTransportType.LWM2M; | ||
175 | } | 169 | } |
176 | this.propagateChange(configuration); | 170 | this.propagateChange(configuration); |
177 | } | 171 | } |
@@ -206,7 +200,7 @@ export class Lwm2mDeviceProfileTransportConfigurationComponent implements Contro | @@ -206,7 +200,7 @@ export class Lwm2mDeviceProfileTransportConfigurationComponent implements Contro | ||
206 | if (this.configurationValue.observeAttr && objectLwM2MS.length > 0) { | 200 | if (this.configurationValue.observeAttr && objectLwM2MS.length > 0) { |
207 | const attributeArray = this.configurationValue.observeAttr.attribute; | 201 | const attributeArray = this.configurationValue.observeAttr.attribute; |
208 | const telemetryArray = this.configurationValue.observeAttr.telemetry; | 202 | const telemetryArray = this.configurationValue.observeAttr.telemetry; |
209 | - let keyNameJson = this.configurationValue.observeAttr.keyName; | 203 | + const keyNameJson = this.configurationValue.observeAttr.keyName; |
210 | if (this.includesNotZeroInstance(attributeArray, telemetryArray)) { | 204 | if (this.includesNotZeroInstance(attributeArray, telemetryArray)) { |
211 | this.addInstances(attributeArray, telemetryArray, objectLwM2MS); | 205 | this.addInstances(attributeArray, telemetryArray, objectLwM2MS); |
212 | } | 206 | } |
@@ -270,9 +264,9 @@ export class Lwm2mDeviceProfileTransportConfigurationComponent implements Contro | @@ -270,9 +264,9 @@ export class Lwm2mDeviceProfileTransportConfigurationComponent implements Contro | ||
270 | private updateAttributeLwm2m = (objectLwM2MS: ObjectLwM2M[]): void => { | 264 | private updateAttributeLwm2m = (objectLwM2MS: ObjectLwM2M[]): void => { |
271 | Object.keys(this.configurationValue.observeAttr.attributeLwm2m).forEach(key => { | 265 | Object.keys(this.configurationValue.observeAttr.attributeLwm2m).forEach(key => { |
272 | const [objectKeyId, instanceId, resourceId] = Array.from(key.substring(1).split('/'), String); | 266 | const [objectKeyId, instanceId, resourceId] = Array.from(key.substring(1).split('/'), String); |
273 | - let objectLwM2M = objectLwM2MS.find(objectLwm2m => objectLwm2m.keyId === objectKeyId); | 267 | + const objectLwM2M = objectLwM2MS.find(objectLwm2m => objectLwm2m.keyId === objectKeyId); |
274 | if (objectLwM2M && instanceId) { | 268 | if (objectLwM2M && instanceId) { |
275 | - let instance = objectLwM2M.instances.find(instance => instance.id === +instanceId) | 269 | + const instance = objectLwM2M.instances.find(obj => obj.id === +instanceId); |
276 | if (instance && resourceId) { | 270 | if (instance && resourceId) { |
277 | instance.resources.find(resource => resource.id === +resourceId) | 271 | instance.resources.find(resource => resource.id === +resourceId) |
278 | .attributeLwm2m = this.configurationValue.observeAttr.attributeLwm2m[key]; | 272 | .attributeLwm2m = this.configurationValue.observeAttr.attributeLwm2m[key]; |
@@ -288,7 +282,7 @@ export class Lwm2mDeviceProfileTransportConfigurationComponent implements Contro | @@ -288,7 +282,7 @@ export class Lwm2mDeviceProfileTransportConfigurationComponent implements Contro | ||
288 | private updateKeyNameObjects = (objectLwM2MS: ObjectLwM2M[]): void => { | 282 | private updateKeyNameObjects = (objectLwM2MS: ObjectLwM2M[]): void => { |
289 | Object.keys(this.configurationValue.observeAttr.keyName).forEach(key => { | 283 | Object.keys(this.configurationValue.observeAttr.keyName).forEach(key => { |
290 | const [objectKeyId, instanceId, resourceId] = Array.from(key.substring(1).split('/'), String); | 284 | const [objectKeyId, instanceId, resourceId] = Array.from(key.substring(1).split('/'), String); |
291 | - const objectLwM2M = objectLwM2MS.find(objectLwm2m => objectLwm2m.keyId === objectKeyId) | 285 | + const objectLwM2M = objectLwM2MS.find(objectLwm2m => objectLwm2m.keyId === objectKeyId); |
292 | if (objectLwM2M) { | 286 | if (objectLwM2M) { |
293 | objectLwM2M.instances.find(instance => instance.id === +instanceId) | 287 | objectLwM2M.instances.find(instance => instance.id === +instanceId) |
294 | .resources.find(resource => resource.id === +resourceId) | 288 | .resources.find(resource => resource.id === +resourceId) |
@@ -299,7 +293,7 @@ export class Lwm2mDeviceProfileTransportConfigurationComponent implements Contro | @@ -299,7 +293,7 @@ export class Lwm2mDeviceProfileTransportConfigurationComponent implements Contro | ||
299 | 293 | ||
300 | private validateKeyNameObjects = (nameJson: JsonObject, attributeArray: JsonArray, telemetryArray: JsonArray): {} => { | 294 | private validateKeyNameObjects = (nameJson: JsonObject, attributeArray: JsonArray, telemetryArray: JsonArray): {} => { |
301 | const keyName = JSON.parse(JSON.stringify(nameJson)); | 295 | const keyName = JSON.parse(JSON.stringify(nameJson)); |
302 | - let keyNameValidate = {}; | 296 | + const keyNameValidate = {}; |
303 | const keyAttrTelemetry = attributeArray.concat(telemetryArray); | 297 | const keyAttrTelemetry = attributeArray.concat(telemetryArray); |
304 | Object.keys(keyName).forEach(key => { | 298 | Object.keys(keyName).forEach(key => { |
305 | if (keyAttrTelemetry.includes(key)) { | 299 | if (keyAttrTelemetry.includes(key)) { |
@@ -345,9 +339,9 @@ export class Lwm2mDeviceProfileTransportConfigurationComponent implements Contro | @@ -345,9 +339,9 @@ export class Lwm2mDeviceProfileTransportConfigurationComponent implements Contro | ||
345 | attributeLwm2m[pathRes] = resource.attributeLwm2m; | 339 | attributeLwm2m[pathRes] = resource.attributeLwm2m; |
346 | } | 340 | } |
347 | } | 341 | } |
348 | - }) | 342 | + }); |
349 | } | 343 | } |
350 | - }) | 344 | + }); |
351 | } | 345 | } |
352 | }); | 346 | }); |
353 | if (isUndefined(this.configurationValue.observeAttr)) { | 347 | if (isUndefined(this.configurationValue.observeAttr)) { |
@@ -356,7 +350,7 @@ export class Lwm2mDeviceProfileTransportConfigurationComponent implements Contro | @@ -356,7 +350,7 @@ export class Lwm2mDeviceProfileTransportConfigurationComponent implements Contro | ||
356 | attribute: attributeArray, | 350 | attribute: attributeArray, |
357 | telemetry: telemetryArray, | 351 | telemetry: telemetryArray, |
358 | keyName: this.sortObjectKeyPathJson(KEY_NAME, keyNameNew), | 352 | keyName: this.sortObjectKeyPathJson(KEY_NAME, keyNameNew), |
359 | - attributeLwm2m: attributeLwm2m | 353 | + attributeLwm2m |
360 | }; | 354 | }; |
361 | } else { | 355 | } else { |
362 | this.configurationValue.observeAttr.observe = observeArray; | 356 | this.configurationValue.observeAttr.observe = observeArray; |
@@ -457,7 +451,6 @@ export class Lwm2mDeviceProfileTransportConfigurationComponent implements Contro | @@ -457,7 +451,6 @@ export class Lwm2mDeviceProfileTransportConfigurationComponent implements Contro | ||
457 | } | 451 | } |
458 | 452 | ||
459 | private removeAttributeLwm2mFromJson = (keyId: string): void => { | 453 | private removeAttributeLwm2mFromJson = (keyId: string): void => { |
460 | - debugger | ||
461 | const keyNameJson = this.configurationValue.observeAttr.attributeLwm2m; | 454 | const keyNameJson = this.configurationValue.observeAttr.attributeLwm2m; |
462 | Object.keys(keyNameJson).forEach(key => { | 455 | Object.keys(keyNameJson).forEach(key => { |
463 | if (key.startsWith(`/${keyId}`)) { | 456 | if (key.startsWith(`/${keyId}`)) { |
@@ -14,13 +14,13 @@ | @@ -14,13 +14,13 @@ | ||
14 | /// limitations under the License. | 14 | /// limitations under the License. |
15 | /// | 15 | /// |
16 | 16 | ||
17 | -import {Component, Inject, OnInit} from '@angular/core'; | ||
18 | -import {DialogComponent} from '@shared/components/dialog.component'; | ||
19 | -import {FormBuilder, FormGroup} from '@angular/forms'; | ||
20 | -import {Store} from '@ngrx/store'; | ||
21 | -import {AppState} from '@core/core.state'; | ||
22 | -import {Router} from '@angular/router'; | ||
23 | -import {MAT_DIALOG_DATA, MatDialogRef} from '@angular/material/dialog'; | 17 | +import { Component, Inject, OnInit } from '@angular/core'; |
18 | +import { DialogComponent } from '@shared/components/dialog.component'; | ||
19 | +import { FormBuilder, FormGroup } from '@angular/forms'; | ||
20 | +import { Store } from '@ngrx/store'; | ||
21 | +import { AppState } from '@core/core.state'; | ||
22 | +import { Router } from '@angular/router'; | ||
23 | +import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; | ||
24 | 24 | ||
25 | export interface Lwm2mObjectAddInstancesData { | 25 | export interface Lwm2mObjectAddInstancesData { |
26 | instancesIds: Set<number>; | 26 | instancesIds: Set<number>; |
@@ -14,11 +14,9 @@ | @@ -14,11 +14,9 @@ | ||
14 | /// limitations under the License. | 14 | /// limitations under the License. |
15 | /// | 15 | /// |
16 | 16 | ||
17 | -import {Component, forwardRef} from '@angular/core'; | ||
18 | -import {ControlValueAccessor, FormBuilder, FormGroup, NG_VALUE_ACCESSOR, Validators} from '@angular/forms'; | ||
19 | -import {Store} from '@ngrx/store'; | ||
20 | -import {AppState} from '@core/core.state'; | ||
21 | -import {INSTANCES_ID_VALUE_MAX, INSTANCES_ID_VALUE_MIN, KEY_REGEXP_NUMBER} from './lwm2m-profile-config.models'; | 17 | +import { Component, forwardRef } from '@angular/core'; |
18 | +import { ControlValueAccessor, FormBuilder, FormGroup, NG_VALUE_ACCESSOR, Validators } from '@angular/forms'; | ||
19 | +import { INSTANCES_ID_VALUE_MAX, INSTANCES_ID_VALUE_MIN, KEY_REGEXP_NUMBER } from './lwm2m-profile-config.models'; | ||
22 | 20 | ||
23 | @Component({ | 21 | @Component({ |
24 | selector: 'tb-profile-lwm2m-object-add-instances-list', | 22 | selector: 'tb-profile-lwm2m-object-add-instances-list', |
@@ -41,8 +39,7 @@ export class Lwm2mObjectAddInstancesListComponent implements ControlValueAccesso | @@ -41,8 +39,7 @@ export class Lwm2mObjectAddInstancesListComponent implements ControlValueAccesso | ||
41 | 39 | ||
42 | private propagateChange = (v: any) => { }; | 40 | private propagateChange = (v: any) => { }; |
43 | 41 | ||
44 | - constructor(private store: Store<AppState>, | ||
45 | - private fb: FormBuilder) { | 42 | + constructor(private fb: FormBuilder) { |
46 | this.instancesListFormGroup = this.fb.group({ | 43 | this.instancesListFormGroup = this.fb.group({ |
47 | instanceIdInput: [null, [ | 44 | instanceIdInput: [null, [ |
48 | Validators.min(this.instanceIdValueMin), | 45 | Validators.min(this.instanceIdValueMin), |
@@ -14,18 +14,16 @@ | @@ -14,18 +14,16 @@ | ||
14 | /// limitations under the License. | 14 | /// limitations under the License. |
15 | /// | 15 | /// |
16 | 16 | ||
17 | -import {Component, ElementRef, EventEmitter, forwardRef, Input, OnInit, Output, ViewChild} from '@angular/core'; | ||
18 | -import {ControlValueAccessor, FormBuilder, FormGroup, NG_VALUE_ACCESSOR, Validators} from '@angular/forms'; | ||
19 | -import {coerceBooleanProperty} from '@angular/cdk/coercion'; | ||
20 | -import {Store} from '@ngrx/store'; | ||
21 | -import {AppState} from '@core/core.state'; | ||
22 | -import {Observable} from 'rxjs'; | ||
23 | -import {filter, map, mergeMap, publishReplay, refCount, tap} from 'rxjs/operators'; | ||
24 | -import {ModelValue, ObjectLwM2M, PAGE_SIZE_LIMIT} from './lwm2m-profile-config.models'; | ||
25 | -import {DeviceProfileService} from '@core/http/device-profile.service'; | ||
26 | -import {Direction} from '@shared/models/page/sort-order'; | ||
27 | -import {isDefined, isDefinedAndNotNull, isString} from '@core/utils'; | ||
28 | -import {PageLink} from "@shared/models/page/page-link"; | 17 | +import { Component, ElementRef, EventEmitter, forwardRef, Input, OnInit, Output, ViewChild } from '@angular/core'; |
18 | +import { ControlValueAccessor, FormBuilder, FormGroup, NG_VALUE_ACCESSOR, Validators } from '@angular/forms'; | ||
19 | +import { coerceBooleanProperty } from '@angular/cdk/coercion'; | ||
20 | +import { Observable } from 'rxjs'; | ||
21 | +import { filter, map, mergeMap, publishReplay, refCount, tap } from 'rxjs/operators'; | ||
22 | +import { ModelValue, ObjectLwM2M, PAGE_SIZE_LIMIT } from './lwm2m-profile-config.models'; | ||
23 | +import { DeviceProfileService } from '@core/http/device-profile.service'; | ||
24 | +import { Direction } from '@shared/models/page/sort-order'; | ||
25 | +import { isDefined, isDefinedAndNotNull, isString } from '@core/utils'; | ||
26 | +import { PageLink } from '@shared/models/page/page-link'; | ||
29 | 27 | ||
30 | @Component({ | 28 | @Component({ |
31 | selector: 'tb-profile-lwm2m-object-list', | 29 | selector: 'tb-profile-lwm2m-object-list', |
@@ -71,8 +69,7 @@ export class Lwm2mObjectListComponent implements ControlValueAccessor, OnInit, V | @@ -71,8 +69,7 @@ export class Lwm2mObjectListComponent implements ControlValueAccessor, OnInit, V | ||
71 | private propagateChange = (v: any) => { | 69 | private propagateChange = (v: any) => { |
72 | } | 70 | } |
73 | 71 | ||
74 | - constructor(private store: Store<AppState>, | ||
75 | - private deviceProfileService: DeviceProfileService, | 72 | + constructor(private deviceProfileService: DeviceProfileService, |
76 | private fb: FormBuilder) { | 73 | private fb: FormBuilder) { |
77 | this.lwm2mListFormGroup = this.fb.group({ | 74 | this.lwm2mListFormGroup = this.fb.group({ |
78 | objectsList: [this.objectsList], | 75 | objectsList: [this.objectsList], |
@@ -162,20 +159,20 @@ export class Lwm2mObjectListComponent implements ControlValueAccessor, OnInit, V | @@ -162,20 +159,20 @@ export class Lwm2mObjectListComponent implements ControlValueAccessor, OnInit, V | ||
162 | 159 | ||
163 | private fetchListObjects = (searchText?: string): Observable<Array<ObjectLwM2M>> => { | 160 | private fetchListObjects = (searchText?: string): Observable<Array<ObjectLwM2M>> => { |
164 | this.searchText = searchText; | 161 | this.searchText = searchText; |
165 | - return this.getLwM2mModelsPage().pipe( | ||
166 | - map(objectLwM2Ms => objectLwM2Ms) | ||
167 | - ); | 162 | + return this.getLwM2mModelsPage().pipe( |
163 | + map(objectLwM2Ms => objectLwM2Ms) | ||
164 | + ); | ||
168 | } | 165 | } |
169 | 166 | ||
170 | private getLwM2mModelsPage(): Observable<Array<ObjectLwM2M>> { | 167 | private getLwM2mModelsPage(): Observable<Array<ObjectLwM2M>> { |
171 | - const pageLink = new PageLink(PAGE_SIZE_LIMIT, 0, this.searchText, { | ||
172 | - property: 'id', | ||
173 | - direction: Direction.ASC | ||
174 | - }); | ||
175 | - this.lw2mModels = this.deviceProfileService.getLwm2mObjectsPage(pageLink).pipe( | ||
176 | - publishReplay(1), | ||
177 | - refCount() | ||
178 | - ); | 168 | + const pageLink = new PageLink(PAGE_SIZE_LIMIT, 0, this.searchText, { |
169 | + property: 'id', | ||
170 | + direction: Direction.ASC | ||
171 | + }); | ||
172 | + this.lw2mModels = this.deviceProfileService.getLwm2mObjectsPage(pageLink).pipe( | ||
173 | + publishReplay(1), | ||
174 | + refCount() | ||
175 | + ); | ||
179 | return this.lw2mModels; | 176 | return this.lw2mModels; |
180 | } | 177 | } |
181 | 178 |
@@ -14,13 +14,11 @@ | @@ -14,13 +14,11 @@ | ||
14 | /// limitations under the License. | 14 | /// limitations under the License. |
15 | /// | 15 | /// |
16 | 16 | ||
17 | -import {Component, forwardRef, Input} from '@angular/core'; | ||
18 | -import {ControlValueAccessor, FormArray, FormBuilder, FormGroup, NG_VALUE_ACCESSOR, Validators} from '@angular/forms'; | ||
19 | -import {ResourceLwM2M, RESOURCES} from '@home/components/profile/device/lwm2m/lwm2m-profile-config.models'; | ||
20 | -import {Store} from '@ngrx/store'; | ||
21 | -import {AppState} from '@core/core.state'; | 17 | +import { Component, forwardRef, Input } from '@angular/core'; |
18 | +import { ControlValueAccessor, FormArray, FormBuilder, FormGroup, NG_VALUE_ACCESSOR, Validators } from '@angular/forms'; | ||
19 | +import { ResourceLwM2M, RESOURCES } from '@home/components/profile/device/lwm2m/lwm2m-profile-config.models'; | ||
22 | import _ from 'lodash'; | 20 | import _ from 'lodash'; |
23 | -import {coerceBooleanProperty} from '@angular/cdk/coercion'; | 21 | +import { coerceBooleanProperty } from '@angular/cdk/coercion'; |
24 | 22 | ||
25 | @Component({ | 23 | @Component({ |
26 | selector: 'tb-profile-lwm2m-observe-attr-telemetry-resource', | 24 | selector: 'tb-profile-lwm2m-observe-attr-telemetry-resource', |
@@ -54,8 +52,7 @@ export class Lwm2mObserveAttrTelemetryResourceComponent implements ControlValueA | @@ -54,8 +52,7 @@ export class Lwm2mObserveAttrTelemetryResourceComponent implements ControlValueA | ||
54 | } | 52 | } |
55 | } | 53 | } |
56 | 54 | ||
57 | - constructor(private store: Store<AppState>, | ||
58 | - private fb: FormBuilder) { | 55 | + constructor(private fb: FormBuilder) { |
59 | this.resourceFormGroup = this.fb.group({ | 56 | this.resourceFormGroup = this.fb.group({ |
60 | resources: this.fb.array([]) | 57 | resources: this.fb.array([]) |
61 | }); | 58 | }); |
@@ -95,7 +92,7 @@ export class Lwm2mObserveAttrTelemetryResourceComponent implements ControlValueA | @@ -95,7 +92,7 @@ export class Lwm2mObserveAttrTelemetryResourceComponent implements ControlValueA | ||
95 | } | 92 | } |
96 | 93 | ||
97 | getNameResourceLwm2m = (resourceLwM2M: ResourceLwM2M): string => { | 94 | getNameResourceLwm2m = (resourceLwM2M: ResourceLwM2M): string => { |
98 | - return '<' + resourceLwM2M.id +'> ' + resourceLwM2M.name; | 95 | + return `<${resourceLwM2M.id}> ${resourceLwM2M.name}`; |
99 | } | 96 | } |
100 | 97 | ||
101 | createResourceLwM2M(resourcesLwM2M: ResourceLwM2M[]): void { | 98 | createResourceLwM2M(resourcesLwM2M: ResourceLwM2M[]): void { |
@@ -135,14 +132,14 @@ export class Lwm2mObserveAttrTelemetryResourceComponent implements ControlValueA | @@ -135,14 +132,14 @@ export class Lwm2mObserveAttrTelemetryResourceComponent implements ControlValueA | ||
135 | return index; | 132 | return index; |
136 | } | 133 | } |
137 | 134 | ||
138 | - updateObserve = (index: number): void =>{ | 135 | + updateObserve = (index: number): void => { |
139 | if (this.resourceFormArray.at(index).value.attribute === false && this.resourceFormArray.at(index).value.telemetry === false) { | 136 | if (this.resourceFormArray.at(index).value.attribute === false && this.resourceFormArray.at(index).value.telemetry === false) { |
140 | this.resourceFormArray.at(index).patchValue({observe: false}); | 137 | this.resourceFormArray.at(index).patchValue({observe: false}); |
141 | this.resourceFormArray.at(index).patchValue({attributeLwm2m: {}}); | 138 | this.resourceFormArray.at(index).patchValue({attributeLwm2m: {}}); |
142 | } | 139 | } |
143 | } | 140 | } |
144 | 141 | ||
145 | - disableObserve = (index: number): boolean =>{ | 142 | + disableObserve = (index: number): boolean => { |
146 | return !this.resourceFormArray.at(index).value.telemetry && !this.resourceFormArray.at(index).value.attribute; | 143 | return !this.resourceFormArray.at(index).value.telemetry && !this.resourceFormArray.at(index).value.attribute; |
147 | } | 144 | } |
148 | } | 145 | } |
@@ -14,7 +14,7 @@ | @@ -14,7 +14,7 @@ | ||
14 | /// limitations under the License. | 14 | /// limitations under the License. |
15 | /// | 15 | /// |
16 | 16 | ||
17 | -import {Component, forwardRef, Input} from '@angular/core'; | 17 | +import { Component, forwardRef, Input } from '@angular/core'; |
18 | import { | 18 | import { |
19 | AbstractControl, | 19 | AbstractControl, |
20 | ControlValueAccessor, | 20 | ControlValueAccessor, |
@@ -24,9 +24,7 @@ import { | @@ -24,9 +24,7 @@ import { | ||
24 | NG_VALUE_ACCESSOR, | 24 | NG_VALUE_ACCESSOR, |
25 | Validators | 25 | Validators |
26 | } from '@angular/forms'; | 26 | } from '@angular/forms'; |
27 | -import {Store} from '@ngrx/store'; | ||
28 | -import {AppState} from '@core/core.state'; | ||
29 | -import {coerceBooleanProperty} from '@angular/cdk/coercion'; | 27 | +import { coerceBooleanProperty } from '@angular/cdk/coercion'; |
30 | import { | 28 | import { |
31 | ATTRIBUTE, | 29 | ATTRIBUTE, |
32 | ATTRIBUTE_LWM2M, | 30 | ATTRIBUTE_LWM2M, |
@@ -38,9 +36,8 @@ import { | @@ -38,9 +36,8 @@ import { | ||
38 | RESOURCES, | 36 | RESOURCES, |
39 | TELEMETRY | 37 | TELEMETRY |
40 | } from './lwm2m-profile-config.models'; | 38 | } from './lwm2m-profile-config.models'; |
41 | -import {deepClone, isDefinedAndNotNull, isEqual, isUndefined} from '@core/utils'; | ||
42 | -import {MatDialog} from '@angular/material/dialog'; | ||
43 | -import {TranslateService} from '@ngx-translate/core'; | 39 | +import { deepClone, isDefinedAndNotNull, isEqual, isUndefined } from '@core/utils'; |
40 | +import { MatDialog } from '@angular/material/dialog'; | ||
44 | import { | 41 | import { |
45 | Lwm2mObjectAddInstancesData, | 42 | Lwm2mObjectAddInstancesData, |
46 | Lwm2mObjectAddInstancesDialogComponent | 43 | Lwm2mObjectAddInstancesDialogComponent |
@@ -83,10 +80,8 @@ export class Lwm2mObserveAttrTelemetryComponent implements ControlValueAccessor | @@ -83,10 +80,8 @@ export class Lwm2mObserveAttrTelemetryComponent implements ControlValueAccessor | ||
83 | @Input() | 80 | @Input() |
84 | disabled: boolean; | 81 | disabled: boolean; |
85 | 82 | ||
86 | - constructor(private store: Store<AppState>, | ||
87 | - private fb: FormBuilder, | ||
88 | - private dialog: MatDialog, | ||
89 | - public translate: TranslateService) { | 83 | + constructor(private fb: FormBuilder, |
84 | + private dialog: MatDialog) { | ||
90 | this.observeAttrTelemetryFormGroup = this.fb.group({ | 85 | this.observeAttrTelemetryFormGroup = this.fb.group({ |
91 | [CLIENT_LWM2M]: this.fb.array([]) | 86 | [CLIENT_LWM2M]: this.fb.array([]) |
92 | }); | 87 | }); |
@@ -98,7 +93,7 @@ export class Lwm2mObserveAttrTelemetryComponent implements ControlValueAccessor | @@ -98,7 +93,7 @@ export class Lwm2mObserveAttrTelemetryComponent implements ControlValueAccessor | ||
98 | } | 93 | } |
99 | 94 | ||
100 | private propagateChange = (v: any) => { | 95 | private propagateChange = (v: any) => { |
101 | - }; | 96 | + } |
102 | 97 | ||
103 | registerOnChange(fn: any): void { | 98 | registerOnChange(fn: any): void { |
104 | this.propagateChange = fn; | 99 | this.propagateChange = fn; |
@@ -189,7 +184,7 @@ export class Lwm2mObserveAttrTelemetryComponent implements ControlValueAccessor | @@ -189,7 +184,7 @@ export class Lwm2mObserveAttrTelemetryComponent implements ControlValueAccessor | ||
189 | this.observeAttrTelemetryFormGroup.get(CLIENT_LWM2M).updateValueAndValidity(); | 184 | this.observeAttrTelemetryFormGroup.get(CLIENT_LWM2M).updateValueAndValidity(); |
190 | } | 185 | } |
191 | 186 | ||
192 | - trackByParams = (index: number, element: any): number => { | 187 | + trackByParams = (index: number): number => { |
193 | return index; | 188 | return index; |
194 | } | 189 | } |
195 | 190 | ||
@@ -252,7 +247,6 @@ export class Lwm2mObserveAttrTelemetryComponent implements ControlValueAccessor | @@ -252,7 +247,6 @@ export class Lwm2mObserveAttrTelemetryComponent implements ControlValueAccessor | ||
252 | } | 247 | } |
253 | 248 | ||
254 | private updateInstancesIds = (data: Lwm2mObjectAddInstancesData): void => { | 249 | private updateInstancesIds = (data: Lwm2mObjectAddInstancesData): void => { |
255 | - debugger | ||
256 | const objectLwM2MFormGroup = (this.observeAttrTelemetryFormGroup.get(CLIENT_LWM2M) as FormArray).controls | 250 | const objectLwM2MFormGroup = (this.observeAttrTelemetryFormGroup.get(CLIENT_LWM2M) as FormArray).controls |
257 | .find(e => e.value.keyId === data.objectKeyId) as FormGroup; | 251 | .find(e => e.value.keyId === data.objectKeyId) as FormGroup; |
258 | const instancesArray = objectLwM2MFormGroup.value.instances as Instance []; | 252 | const instancesArray = objectLwM2MFormGroup.value.instances as Instance []; |
@@ -318,7 +312,7 @@ export class Lwm2mObserveAttrTelemetryComponent implements ControlValueAccessor | @@ -318,7 +312,7 @@ export class Lwm2mObserveAttrTelemetryComponent implements ControlValueAccessor | ||
318 | return objectName + ' <' + idVerObj + '>'; | 312 | return objectName + ' <' + idVerObj + '>'; |
319 | } | 313 | } |
320 | getNameInstanceLwm2m = (instance: Instance, idVerObj: string): string => { | 314 | getNameInstanceLwm2m = (instance: Instance, idVerObj: string): string => { |
321 | - return ' instance <' + idVerObj + '/' + instance.id +'>'; | 315 | + return ` instance <${idVerObj}/${instance.id}>`; |
322 | } | 316 | } |
323 | 317 | ||
324 | updateAttributeLwm2mObject = (event: Event, objectKeyId: number): void => { | 318 | updateAttributeLwm2mObject = (event: Event, objectKeyId: number): void => { |
@@ -14,19 +14,19 @@ | @@ -14,19 +14,19 @@ | ||
14 | /// limitations under the License. | 14 | /// limitations under the License. |
15 | /// | 15 | /// |
16 | 16 | ||
17 | -import {NgModule} from '@angular/core'; | ||
18 | -import {Lwm2mDeviceProfileTransportConfigurationComponent} from './lwm2m-device-profile-transport-configuration.component'; | ||
19 | -import {Lwm2mObjectListComponent} from './lwm2m-object-list.component'; | ||
20 | -import {Lwm2mObserveAttrTelemetryComponent} from './lwm2m-observe-attr-telemetry.component'; | ||
21 | -import {Lwm2mObserveAttrTelemetryResourceComponent} from './lwm2m-observe-attr-telemetry-resource.component'; | ||
22 | -import {Lwm2mAttributesDialogComponent} from './lwm2m-attributes-dialog.component'; | ||
23 | -import {Lwm2mAttributesComponent} from './lwm2m-attributes.component'; | ||
24 | -import {Lwm2mAttributesKeyListComponent} from './lwm2m-attributes-key-list.component'; | ||
25 | -import {Lwm2mDeviceConfigServerComponent} from './lwm2m-device-config-server.component'; | ||
26 | -import {Lwm2mObjectAddInstancesDialogComponent} from './lwm2m-object-add-instances-dialog.component'; | ||
27 | -import {Lwm2mObjectAddInstancesListComponent} from './lwm2m-object-add-instances-list.component'; | ||
28 | -import {CommonModule} from '@angular/common'; | ||
29 | -import {SharedModule} from '@app/shared/shared.module'; | 17 | +import { NgModule } from '@angular/core'; |
18 | +import { Lwm2mDeviceProfileTransportConfigurationComponent } from './lwm2m-device-profile-transport-configuration.component'; | ||
19 | +import { Lwm2mObjectListComponent } from './lwm2m-object-list.component'; | ||
20 | +import { Lwm2mObserveAttrTelemetryComponent } from './lwm2m-observe-attr-telemetry.component'; | ||
21 | +import { Lwm2mObserveAttrTelemetryResourceComponent } from './lwm2m-observe-attr-telemetry-resource.component'; | ||
22 | +import { Lwm2mAttributesDialogComponent } from './lwm2m-attributes-dialog.component'; | ||
23 | +import { Lwm2mAttributesComponent } from './lwm2m-attributes.component'; | ||
24 | +import { Lwm2mAttributesKeyListComponent } from './lwm2m-attributes-key-list.component'; | ||
25 | +import { Lwm2mDeviceConfigServerComponent } from './lwm2m-device-config-server.component'; | ||
26 | +import { Lwm2mObjectAddInstancesDialogComponent } from './lwm2m-object-add-instances-dialog.component'; | ||
27 | +import { Lwm2mObjectAddInstancesListComponent } from './lwm2m-object-add-instances-list.component'; | ||
28 | +import { CommonModule } from '@angular/common'; | ||
29 | +import { SharedModule } from '@app/shared/shared.module'; | ||
30 | 30 | ||
31 | @NgModule({ | 31 | @NgModule({ |
32 | declarations: | 32 | declarations: |
@@ -127,8 +127,8 @@ export const SECURITY_CONFIG_MODE_NAMES = new Map<SECURITY_CONFIG_MODE, string>( | @@ -127,8 +127,8 @@ export const SECURITY_CONFIG_MODE_NAMES = new Map<SECURITY_CONFIG_MODE, string>( | ||
127 | ); | 127 | ); |
128 | 128 | ||
129 | export interface ModelValue { | 129 | export interface ModelValue { |
130 | - objectIds: string[], | ||
131 | - objectsList: ObjectLwM2M[] | 130 | + objectIds: string[]; |
131 | + objectsList: ObjectLwM2M[]; | ||
132 | } | 132 | } |
133 | 133 | ||
134 | export interface BootstrapServersSecurityConfig { | 134 | export interface BootstrapServersSecurityConfig { |
@@ -24,8 +24,6 @@ import { DeviceCredentialsDialogComponent } from '@modules/home/pages/device/dev | @@ -24,8 +24,6 @@ import { DeviceCredentialsDialogComponent } from '@modules/home/pages/device/dev | ||
24 | import { HomeDialogsModule } from '../../dialogs/home-dialogs.module'; | 24 | import { HomeDialogsModule } from '../../dialogs/home-dialogs.module'; |
25 | import { HomeComponentsModule } from '@modules/home/components/home-components.module'; | 25 | import { HomeComponentsModule } from '@modules/home/components/home-components.module'; |
26 | import { DeviceTabsComponent } from '@home/pages/device/device-tabs.component'; | 26 | import { DeviceTabsComponent } from '@home/pages/device/device-tabs.component'; |
27 | -import { SecurityConfigComponent } from '@home/pages/device/lwm2m/security-config.component'; | ||
28 | -import { SecurityConfigServerComponent } from '@home/pages/device/lwm2m/security-config-server.component'; | ||
29 | import { DefaultDeviceConfigurationComponent } from './data/default-device-configuration.component'; | 27 | import { DefaultDeviceConfigurationComponent } from './data/default-device-configuration.component'; |
30 | import { DeviceConfigurationComponent } from './data/device-configuration.component'; | 28 | import { DeviceConfigurationComponent } from './data/device-configuration.component'; |
31 | import { DeviceDataComponent } from './data/device-data.component'; | 29 | import { DeviceDataComponent } from './data/device-data.component'; |
@@ -50,9 +48,7 @@ import { SnmpDeviceTransportConfigurationComponent } from './data/snmp-device-tr | @@ -50,9 +48,7 @@ import { SnmpDeviceTransportConfigurationComponent } from './data/snmp-device-tr | ||
50 | DeviceComponent, | 48 | DeviceComponent, |
51 | DeviceTabsComponent, | 49 | DeviceTabsComponent, |
52 | DeviceTableHeaderComponent, | 50 | DeviceTableHeaderComponent, |
53 | - DeviceCredentialsDialogComponent, | ||
54 | - SecurityConfigComponent, | ||
55 | - SecurityConfigServerComponent | 51 | + DeviceCredentialsDialogComponent |
56 | ], | 52 | ], |
57 | imports: [ | 53 | imports: [ |
58 | CommonModule, | 54 | CommonModule, |
ui-ngx/src/app/modules/home/pages/device/lwm2m/security-config-server.component.ts
deleted
100644 → 0
1 | -/// | ||
2 | -/// Copyright © 2016-2021 The Thingsboard Authors | ||
3 | -/// | ||
4 | -/// Licensed under the Apache License, Version 2.0 (the "License"); | ||
5 | -/// you may not use this file except in compliance with the License. | ||
6 | -/// You may obtain a copy of the License at | ||
7 | -/// | ||
8 | -/// http://www.apache.org/licenses/LICENSE-2.0 | ||
9 | -/// | ||
10 | -/// Unless required by applicable law or agreed to in writing, software | ||
11 | -/// distributed under the License is distributed on an "AS IS" BASIS, | ||
12 | -/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
13 | -/// See the License for the specific language governing permissions and | ||
14 | -/// limitations under the License. | ||
15 | -/// | ||
16 | - | ||
17 | -import { Component, forwardRef, Inject, Input, OnInit } from '@angular/core'; | ||
18 | -import { ControlValueAccessor, FormBuilder, FormGroup, NG_VALUE_ACCESSOR, Validators } from '@angular/forms'; | ||
19 | -import { | ||
20 | - DeviceCredentialsDialogLwm2mData, | ||
21 | - KEY_REGEXP_HEX_DEC, | ||
22 | - LEN_MAX_PRIVATE_KEY, | ||
23 | - LEN_MAX_PSK, | ||
24 | - LEN_MAX_PUBLIC_KEY_RPK, | ||
25 | - LEN_MAX_PUBLIC_KEY_X509, | ||
26 | - SECURITY_CONFIG_MODE, | ||
27 | - SECURITY_CONFIG_MODE_NAMES, | ||
28 | - ServerSecurityConfig | ||
29 | -} from '@home/pages/device/lwm2m/security-config.models'; | ||
30 | -import { Store } from '@ngrx/store'; | ||
31 | -import { AppState } from '@core/core.state'; | ||
32 | -import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; | ||
33 | -import { PageComponent } from '@shared/components/page.component'; | ||
34 | - | ||
35 | -@Component({ | ||
36 | - selector: 'tb-security-config-server-lwm2m', | ||
37 | - templateUrl: './security-config-server.component.html', | ||
38 | - styleUrls: [], | ||
39 | - providers: [ | ||
40 | - { | ||
41 | - provide: NG_VALUE_ACCESSOR, | ||
42 | - useExisting: forwardRef(() => SecurityConfigServerComponent), | ||
43 | - multi: true | ||
44 | - } | ||
45 | - ] | ||
46 | -}) | ||
47 | - | ||
48 | -export class SecurityConfigServerComponent extends PageComponent implements OnInit, ControlValueAccessor { | ||
49 | - | ||
50 | - securityConfigLwM2MType = SECURITY_CONFIG_MODE; | ||
51 | - securityConfigLwM2MTypes = Object.keys(SECURITY_CONFIG_MODE); | ||
52 | - credentialTypeLwM2MNamesMap = SECURITY_CONFIG_MODE_NAMES; | ||
53 | - lenMinClientPublicKeyOrId = 0; | ||
54 | - lenMaxClientPublicKeyOrId = LEN_MAX_PUBLIC_KEY_RPK; | ||
55 | - lenMinClientSecretKey = LEN_MAX_PRIVATE_KEY; | ||
56 | - lenMaxClientSecretKey = LEN_MAX_PRIVATE_KEY; | ||
57 | - | ||
58 | - @Input() serverFormGroup: FormGroup; | ||
59 | - | ||
60 | - constructor(protected store: Store<AppState>, | ||
61 | - @Inject(MAT_DIALOG_DATA) public data: DeviceCredentialsDialogLwm2mData, | ||
62 | - public dialogRef: MatDialogRef<SecurityConfigServerComponent, object>, | ||
63 | - public fb: FormBuilder) { | ||
64 | - super(store); | ||
65 | - } | ||
66 | - | ||
67 | - ngOnInit(): void { | ||
68 | - this.registerDisableOnLoadFormControl(this.serverFormGroup.get('securityMode')); | ||
69 | - } | ||
70 | - | ||
71 | - private updateValueFields(serverData: ServerSecurityConfig): void { | ||
72 | - this.serverFormGroup.patchValue(serverData, {emitEvent: false}); | ||
73 | - const securityMode = this.serverFormGroup.get('securityMode').value as SECURITY_CONFIG_MODE; | ||
74 | - this.updateValidate(securityMode); | ||
75 | - } | ||
76 | - | ||
77 | - private updateValidate(securityMode: SECURITY_CONFIG_MODE): void { | ||
78 | - switch (securityMode) { | ||
79 | - case SECURITY_CONFIG_MODE.NO_SEC: | ||
80 | - this.serverFormGroup.get('clientPublicKeyOrId').setValidators([]); | ||
81 | - this.serverFormGroup.get('clientSecretKey').setValidators([]); | ||
82 | - break; | ||
83 | - case SECURITY_CONFIG_MODE.PSK: | ||
84 | - this.lenMinClientPublicKeyOrId = 0; | ||
85 | - this.lenMaxClientPublicKeyOrId = LEN_MAX_PUBLIC_KEY_RPK; | ||
86 | - this.lenMinClientSecretKey = LEN_MAX_PSK; | ||
87 | - this.lenMaxClientSecretKey = LEN_MAX_PSK; | ||
88 | - this.setValidatorsSecurity(securityMode); | ||
89 | - break; | ||
90 | - case SECURITY_CONFIG_MODE.RPK: | ||
91 | - this.lenMinClientPublicKeyOrId = LEN_MAX_PUBLIC_KEY_RPK; | ||
92 | - this.lenMaxClientPublicKeyOrId = LEN_MAX_PUBLIC_KEY_RPK; | ||
93 | - this.lenMinClientSecretKey = LEN_MAX_PRIVATE_KEY; | ||
94 | - this.lenMaxClientSecretKey = LEN_MAX_PRIVATE_KEY; | ||
95 | - this.setValidatorsSecurity(securityMode); | ||
96 | - break; | ||
97 | - case SECURITY_CONFIG_MODE.X509: | ||
98 | - this.lenMinClientPublicKeyOrId = 0; | ||
99 | - this.lenMaxClientPublicKeyOrId = LEN_MAX_PUBLIC_KEY_X509; | ||
100 | - this.lenMinClientSecretKey = LEN_MAX_PRIVATE_KEY; | ||
101 | - this.lenMaxClientSecretKey = LEN_MAX_PRIVATE_KEY; | ||
102 | - this.setValidatorsSecurity(securityMode); | ||
103 | - break; | ||
104 | - } | ||
105 | - this.serverFormGroup.updateValueAndValidity(); | ||
106 | - } | ||
107 | - | ||
108 | - private setValidatorsSecurity = (securityMode: SECURITY_CONFIG_MODE): void => { | ||
109 | - if (securityMode === SECURITY_CONFIG_MODE.PSK) { | ||
110 | - this.serverFormGroup.get('clientPublicKeyOrId').setValidators([Validators.required]); | ||
111 | - } else { | ||
112 | - this.serverFormGroup.get('clientPublicKeyOrId').setValidators([Validators.required, | ||
113 | - Validators.pattern(KEY_REGEXP_HEX_DEC), | ||
114 | - Validators.minLength(this.lenMinClientPublicKeyOrId), | ||
115 | - Validators.maxLength(this.lenMaxClientPublicKeyOrId)]); | ||
116 | - } | ||
117 | - | ||
118 | - this.serverFormGroup.get('clientSecretKey').setValidators([Validators.required, | ||
119 | - Validators.pattern(KEY_REGEXP_HEX_DEC), | ||
120 | - Validators.minLength(this.lenMinClientSecretKey), | ||
121 | - Validators.maxLength(this.lenMaxClientSecretKey)]); | ||
122 | - } | ||
123 | - | ||
124 | - securityModeChanged(securityMode: SECURITY_CONFIG_MODE): void { | ||
125 | - this.updateValidate(securityMode); | ||
126 | - } | ||
127 | - | ||
128 | - writeValue(value: any): void { | ||
129 | - if (value) { | ||
130 | - this.updateValueFields(value); | ||
131 | - } | ||
132 | - } | ||
133 | - | ||
134 | - registerOnChange(fn: (value: any) => any): void { | ||
135 | - } | ||
136 | - | ||
137 | - registerOnTouched(fn: any): void { | ||
138 | - } | ||
139 | - | ||
140 | - setDisabledState?(isDisabled: boolean): void { | ||
141 | - } | ||
142 | -} |
ui-ngx/src/app/modules/home/pages/device/lwm2m/security-config.component.ts
deleted
100644 → 0
1 | -/// | ||
2 | -/// Copyright © 2016-2021 The Thingsboard Authors | ||
3 | -/// | ||
4 | -/// Licensed under the Apache License, Version 2.0 (the "License"); | ||
5 | -/// you may not use this file except in compliance with the License. | ||
6 | -/// You may obtain a copy of the License at | ||
7 | -/// | ||
8 | -/// http://www.apache.org/licenses/LICENSE-2.0 | ||
9 | -/// | ||
10 | -/// Unless required by applicable law or agreed to in writing, software | ||
11 | -/// distributed under the License is distributed on an "AS IS" BASIS, | ||
12 | -/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
13 | -/// See the License for the specific language governing permissions and | ||
14 | -/// limitations under the License. | ||
15 | -/// | ||
16 | - | ||
17 | - | ||
18 | -import {Component, Inject, OnInit} from '@angular/core'; | ||
19 | -import {DialogComponent} from '@shared/components/dialog.component'; | ||
20 | -import {Store} from '@ngrx/store'; | ||
21 | -import {AppState} from '@core/core.state'; | ||
22 | -import {Router} from '@angular/router'; | ||
23 | -import {MAT_DIALOG_DATA, MatDialogRef} from '@angular/material/dialog'; | ||
24 | -import {FormBuilder, FormGroup, Validators} from '@angular/forms'; | ||
25 | -import {TranslateService} from '@ngx-translate/core'; | ||
26 | -import { | ||
27 | - BOOTSTRAP_SERVER, | ||
28 | - BOOTSTRAP_SERVERS, | ||
29 | - ClientSecurityConfig, | ||
30 | - DeviceCredentialsDialogLwm2mData, | ||
31 | - getClientSecurityConfig, | ||
32 | - JSON_ALL_CONFIG, | ||
33 | - KEY_REGEXP_HEX_DEC, | ||
34 | - LEN_MAX_PSK, | ||
35 | - LEN_MAX_PUBLIC_KEY_RPK, | ||
36 | - LWM2M_SERVER, | ||
37 | - SECURITY_CONFIG_MODE, | ||
38 | - SECURITY_CONFIG_MODE_NAMES, | ||
39 | - SecurityConfigModels | ||
40 | -} from './security-config.models'; | ||
41 | -import {WINDOW} from '@core/services/window.service'; | ||
42 | -import {MatTabChangeEvent} from '@angular/material/tabs'; | ||
43 | -import {MatTab} from '@angular/material/tabs/tab'; | ||
44 | - | ||
45 | -@Component({ | ||
46 | - selector: 'tb-security-config-lwm2m', | ||
47 | - templateUrl: './security-config.component.html', | ||
48 | - styleUrls: [] | ||
49 | -}) | ||
50 | - | ||
51 | -export class SecurityConfigComponent extends DialogComponent<SecurityConfigComponent, object> implements OnInit { | ||
52 | - | ||
53 | - lwm2mConfigFormGroup: FormGroup; | ||
54 | - title: string; | ||
55 | - submitted = false; | ||
56 | - securityConfigLwM2MType = SECURITY_CONFIG_MODE; | ||
57 | - securityConfigLwM2MTypes = Object.keys(SECURITY_CONFIG_MODE); | ||
58 | - credentialTypeLwM2MNamesMap = SECURITY_CONFIG_MODE_NAMES; | ||
59 | - formControlNameJsonAllConfig = JSON_ALL_CONFIG; | ||
60 | - jsonAllConfig: SecurityConfigModels; | ||
61 | - bootstrapServers: string; | ||
62 | - bootstrapServer: string; | ||
63 | - lwm2mServer: string; | ||
64 | - jsonObserveData: {}; | ||
65 | - lenMaxKeyClient = LEN_MAX_PSK; | ||
66 | - tabPrevious: MatTab; | ||
67 | - tabIndexPrevious = 0; | ||
68 | - | ||
69 | - constructor(protected store: Store<AppState>, | ||
70 | - protected router: Router, | ||
71 | - @Inject(MAT_DIALOG_DATA) public data: DeviceCredentialsDialogLwm2mData, | ||
72 | - public dialogRef: MatDialogRef<SecurityConfigComponent, object>, | ||
73 | - public fb: FormBuilder, | ||
74 | - public translate: TranslateService, | ||
75 | - @Inject(WINDOW) private window: Window) { | ||
76 | - super(store, router, dialogRef); | ||
77 | - } | ||
78 | - | ||
79 | - ngOnInit(): void { | ||
80 | - this.jsonAllConfig = JSON.parse(JSON.stringify(this.data.jsonAllConfig)) as SecurityConfigModels; | ||
81 | - this.initConstants(); | ||
82 | - this.lwm2mConfigFormGroup = this.initLwm2mConfigFormGroup(); | ||
83 | - this.title = this.translate.instant('device.lwm2m-security-info') + ': ' + this.data.endPoint; | ||
84 | - this.lwm2mConfigFormGroup.get('clientCertificate').disable(); | ||
85 | - this.initClientSecurityConfig(this.lwm2mConfigFormGroup.get('jsonAllConfig').value); | ||
86 | - this.registerDisableOnLoadFormControl(this.lwm2mConfigFormGroup.get('securityConfigClientMode')); | ||
87 | - } | ||
88 | - | ||
89 | - private initConstants = (): void => { | ||
90 | - this.bootstrapServers = BOOTSTRAP_SERVERS; | ||
91 | - this.bootstrapServer = BOOTSTRAP_SERVER; | ||
92 | - this.lwm2mServer = LWM2M_SERVER; | ||
93 | - } | ||
94 | - | ||
95 | - /** | ||
96 | - * initChildesFormGroup | ||
97 | - */ | ||
98 | - get bootstrapFormGroup(): FormGroup { | ||
99 | - return this.lwm2mConfigFormGroup.get('bootstrapFormGroup') as FormGroup; | ||
100 | - } | ||
101 | - | ||
102 | - get lwm2mServerFormGroup(): FormGroup { | ||
103 | - return this.lwm2mConfigFormGroup.get('lwm2mServerFormGroup') as FormGroup; | ||
104 | - } | ||
105 | - | ||
106 | - get observeAttrFormGroup(): FormGroup { | ||
107 | - return this.lwm2mConfigFormGroup.get('observeFormGroup') as FormGroup; | ||
108 | - } | ||
109 | - | ||
110 | - private initClientSecurityConfig = (jsonAllConfig: SecurityConfigModels): void => { | ||
111 | - switch (jsonAllConfig.client.securityConfigClientMode) { | ||
112 | - case SECURITY_CONFIG_MODE.NO_SEC: | ||
113 | - break; | ||
114 | - case SECURITY_CONFIG_MODE.PSK: | ||
115 | - const clientSecurityConfigPSK = jsonAllConfig.client as ClientSecurityConfig; | ||
116 | - this.lwm2mConfigFormGroup.patchValue({ | ||
117 | - identityPSK: clientSecurityConfigPSK.identity, | ||
118 | - clientKey: clientSecurityConfigPSK.key, | ||
119 | - }, {emitEvent: false}); | ||
120 | - break; | ||
121 | - case SECURITY_CONFIG_MODE.RPK: | ||
122 | - const clientSecurityConfigRPK = jsonAllConfig.client as ClientSecurityConfig; | ||
123 | - this.lwm2mConfigFormGroup.patchValue({ | ||
124 | - clientKey: clientSecurityConfigRPK.key, | ||
125 | - }, {emitEvent: false}); | ||
126 | - break; | ||
127 | - case SECURITY_CONFIG_MODE.X509: | ||
128 | - const clientSecurityConfigX509 = jsonAllConfig.client as ClientSecurityConfig; | ||
129 | - this.lwm2mConfigFormGroup.patchValue({ | ||
130 | - clientCertificate: clientSecurityConfigX509.x509 | ||
131 | - }, {emitEvent: false}); | ||
132 | - break; | ||
133 | - } | ||
134 | - this.securityConfigClientUpdateValidators(this.lwm2mConfigFormGroup.get('securityConfigClientMode').value); | ||
135 | - } | ||
136 | - | ||
137 | - securityConfigClientModeChanged = (mode: SECURITY_CONFIG_MODE): void => { | ||
138 | - switch (mode) { | ||
139 | - case SECURITY_CONFIG_MODE.NO_SEC: | ||
140 | - const clientSecurityConfigNoSEC = getClientSecurityConfig(mode) as ClientSecurityConfig; | ||
141 | - this.jsonAllConfig.client = clientSecurityConfigNoSEC; | ||
142 | - this.lwm2mConfigFormGroup.patchValue({ | ||
143 | - jsonAllConfig: this.jsonAllConfig, | ||
144 | - clientCertificate: false | ||
145 | - }, {emitEvent: false}); | ||
146 | - break; | ||
147 | - case SECURITY_CONFIG_MODE.PSK: | ||
148 | - const clientSecurityConfigPSK = getClientSecurityConfig(mode, this.lwm2mConfigFormGroup.get('endPoint') | ||
149 | - .value) as ClientSecurityConfig; | ||
150 | - clientSecurityConfigPSK.identity = this.data.endPoint; | ||
151 | - clientSecurityConfigPSK.key = this.lwm2mConfigFormGroup.get('clientKey').value; | ||
152 | - this.jsonAllConfig.client = clientSecurityConfigPSK; | ||
153 | - this.lwm2mConfigFormGroup.patchValue({ | ||
154 | - identityPSK: clientSecurityConfigPSK.identity, | ||
155 | - clientCertificate: false | ||
156 | - }, {emitEvent: false}); | ||
157 | - break; | ||
158 | - case SECURITY_CONFIG_MODE.RPK: | ||
159 | - const clientSecurityConfigRPK = getClientSecurityConfig(mode) as ClientSecurityConfig; | ||
160 | - clientSecurityConfigRPK.key = this.lwm2mConfigFormGroup.get('clientKey').value; | ||
161 | - this.jsonAllConfig.client = clientSecurityConfigRPK; | ||
162 | - this.lwm2mConfigFormGroup.patchValue({ | ||
163 | - clientCertificate: false | ||
164 | - }, {emitEvent: false}); | ||
165 | - break; | ||
166 | - case SECURITY_CONFIG_MODE.X509: | ||
167 | - this.jsonAllConfig.client = getClientSecurityConfig(mode) as ClientSecurityConfig; | ||
168 | - this.lwm2mConfigFormGroup.patchValue({ | ||
169 | - clientCertificate: true | ||
170 | - }, {emitEvent: false}); | ||
171 | - break; | ||
172 | - } | ||
173 | - this.securityConfigClientUpdateValidators(mode); | ||
174 | - } | ||
175 | - | ||
176 | - private securityConfigClientUpdateValidators = (mode: SECURITY_CONFIG_MODE): void => { | ||
177 | - switch (mode) { | ||
178 | - case SECURITY_CONFIG_MODE.NO_SEC: | ||
179 | - this.setValidatorsNoSecX509(); | ||
180 | - break; | ||
181 | - case SECURITY_CONFIG_MODE.PSK: | ||
182 | - this.lenMaxKeyClient = LEN_MAX_PSK; | ||
183 | - this.setValidatorsPskRpk(mode); | ||
184 | - break; | ||
185 | - case SECURITY_CONFIG_MODE.RPK: | ||
186 | - this.lenMaxKeyClient = LEN_MAX_PUBLIC_KEY_RPK; | ||
187 | - this.setValidatorsPskRpk(mode); | ||
188 | - break; | ||
189 | - case SECURITY_CONFIG_MODE.X509: | ||
190 | - this.lenMaxKeyClient = LEN_MAX_PUBLIC_KEY_RPK; | ||
191 | - this.setValidatorsNoSecX509(); | ||
192 | - break; | ||
193 | - } | ||
194 | - this.lwm2mConfigFormGroup.updateValueAndValidity(); | ||
195 | - } | ||
196 | - | ||
197 | - private setValidatorsNoSecX509 = (): void => { | ||
198 | - this.lwm2mConfigFormGroup.get('identityPSK').setValidators([]); | ||
199 | - this.lwm2mConfigFormGroup.get('clientKey').setValidators([]); | ||
200 | - } | ||
201 | - | ||
202 | - private setValidatorsPskRpk = (mode: SECURITY_CONFIG_MODE): void => { | ||
203 | - if (mode === SECURITY_CONFIG_MODE.PSK) { | ||
204 | - this.lwm2mConfigFormGroup.get('identityPSK').setValidators([Validators.required]); | ||
205 | - } else { | ||
206 | - this.lwm2mConfigFormGroup.get('identityPSK').setValidators([]); | ||
207 | - } | ||
208 | - this.lwm2mConfigFormGroup.get('clientKey').setValidators([Validators.required, | ||
209 | - Validators.pattern(KEY_REGEXP_HEX_DEC), | ||
210 | - Validators.maxLength(this.lenMaxKeyClient), Validators.minLength(this.lenMaxKeyClient)]); | ||
211 | - } | ||
212 | - | ||
213 | - tabChanged = (tabChangeEvent: MatTabChangeEvent): void => { | ||
214 | - if (this.tabIndexPrevious !== tabChangeEvent.index) { this.upDateValueToJson(); } | ||
215 | - this.tabIndexPrevious = tabChangeEvent.index; | ||
216 | - } | ||
217 | - | ||
218 | - private upDateValueToJson(): void { | ||
219 | - switch (this.tabIndexPrevious) { | ||
220 | - case 0: | ||
221 | - this.upDateValueToJsonTab0(); | ||
222 | - break; | ||
223 | - case 1: | ||
224 | - this.upDateValueToJsonTab1(); | ||
225 | - break; | ||
226 | - case 2: | ||
227 | - this.upDateValueToJsonTab2(); | ||
228 | - break; | ||
229 | - } | ||
230 | - } | ||
231 | - | ||
232 | - private upDateValueToJsonTab0 = (): void => { | ||
233 | - if (this.lwm2mConfigFormGroup !== null) { | ||
234 | - if (!this.lwm2mConfigFormGroup.get('endPoint').pristine && this.lwm2mConfigFormGroup.get('endPoint').valid) { | ||
235 | - this.data.endPoint = this.lwm2mConfigFormGroup.get('endPoint').value; | ||
236 | - /** Client mode == PSK */ | ||
237 | - if (this.lwm2mConfigFormGroup.get('securityConfigClientMode').value === SECURITY_CONFIG_MODE.PSK) { | ||
238 | - const endPoint = 'endpoint'; | ||
239 | - this.jsonAllConfig.client[endPoint] = this.data.endPoint; | ||
240 | - this.lwm2mConfigFormGroup.get('endPoint').markAsPristine({ | ||
241 | - onlySelf: true | ||
242 | - }); | ||
243 | - this.upDateJsonAllConfig(); | ||
244 | - } | ||
245 | - } | ||
246 | - /** only Client mode == PSK */ | ||
247 | - if (!this.lwm2mConfigFormGroup.get('identityPSK').pristine && this.lwm2mConfigFormGroup.get('identityPSK').valid) { | ||
248 | - this.lwm2mConfigFormGroup.get('identityPSK').markAsPristine({ | ||
249 | - onlySelf: true | ||
250 | - }); | ||
251 | - this.updateIdentityPSK(); | ||
252 | - } | ||
253 | - /** only Client mode == PSK (len = 64) || RPK (len = 182) */ | ||
254 | - if (!this.lwm2mConfigFormGroup.get('clientKey').pristine && this.lwm2mConfigFormGroup.get('clientKey').valid) { | ||
255 | - this.lwm2mConfigFormGroup.get('clientKey').markAsPristine({ | ||
256 | - onlySelf: true | ||
257 | - }); | ||
258 | - this.updateClientKey(); | ||
259 | - } | ||
260 | - } | ||
261 | - } | ||
262 | - | ||
263 | - private upDateValueToJsonTab1 = (): void => { | ||
264 | - if (this.lwm2mConfigFormGroup !== null) { | ||
265 | - if (this.bootstrapFormGroup !== null && !this.bootstrapFormGroup.pristine && this.bootstrapFormGroup.valid) { | ||
266 | - this.jsonAllConfig.bootstrap.bootstrapServer = this.bootstrapFormGroup.value; | ||
267 | - this.bootstrapFormGroup.markAsPristine({ | ||
268 | - onlySelf: true | ||
269 | - }); | ||
270 | - this.upDateJsonAllConfig(); | ||
271 | - } | ||
272 | - | ||
273 | - if (this.lwm2mServerFormGroup !== null && !this.lwm2mServerFormGroup.pristine && this.lwm2mServerFormGroup.valid) { | ||
274 | - this.jsonAllConfig.bootstrap.lwm2mServer = this.lwm2mServerFormGroup.value; | ||
275 | - this.lwm2mServerFormGroup.markAsPristine({ | ||
276 | - onlySelf: true | ||
277 | - }); | ||
278 | - this.upDateJsonAllConfig(); | ||
279 | - } | ||
280 | - } | ||
281 | - } | ||
282 | - | ||
283 | - private upDateValueToJsonTab2 = (): void => { | ||
284 | - if (!this.lwm2mConfigFormGroup.get(this.formControlNameJsonAllConfig).pristine && | ||
285 | - this.lwm2mConfigFormGroup.get(this.formControlNameJsonAllConfig).valid) { | ||
286 | - this.jsonAllConfig = this.lwm2mConfigFormGroup.get(this.formControlNameJsonAllConfig).value; | ||
287 | - this.lwm2mConfigFormGroup.get(this.formControlNameJsonAllConfig).markAsPristine({ | ||
288 | - onlySelf: true | ||
289 | - }); | ||
290 | - } | ||
291 | - } | ||
292 | - | ||
293 | - private updateIdentityPSK = (): void => { | ||
294 | - const securityMode = 'securityMode'; | ||
295 | - if (this.lwm2mConfigFormGroup.get('bootstrapServer').value[securityMode] === SECURITY_CONFIG_MODE.PSK) { | ||
296 | - this.lwm2mConfigFormGroup.get('bootstrapFormGroup').patchValue({ | ||
297 | - clientPublicKeyOrId: this.lwm2mConfigFormGroup.get('identityPSK').value | ||
298 | - }); | ||
299 | - const identity = 'identity'; | ||
300 | - this.jsonAllConfig.client[identity] = this.lwm2mConfigFormGroup.get('identityPSK').value; | ||
301 | - this.upDateJsonAllConfig(); | ||
302 | - } | ||
303 | - if (this.lwm2mConfigFormGroup.get('lwm2mServer').value[securityMode] === SECURITY_CONFIG_MODE.PSK) { | ||
304 | - this.lwm2mConfigFormGroup.get('lwm2mServerFormGroup').patchValue({ | ||
305 | - clientPublicKeyOrId: this.lwm2mConfigFormGroup.get('identityPSK').value | ||
306 | - }); | ||
307 | - this.jsonAllConfig.bootstrap.lwm2mServer.clientPublicKeyOrId = this.lwm2mConfigFormGroup.get('identityPSK').value; | ||
308 | - this.upDateJsonAllConfig(); | ||
309 | - } | ||
310 | - } | ||
311 | - | ||
312 | - private updateClientKey = (): void => { | ||
313 | - const key = 'key'; | ||
314 | - const securityMode = 'securityMode'; | ||
315 | - this.jsonAllConfig.client[key] = this.lwm2mConfigFormGroup.get('clientKey').value; | ||
316 | - if (this.lwm2mConfigFormGroup.get('bootstrapServer').value[securityMode] === SECURITY_CONFIG_MODE.PSK) { | ||
317 | - this.lwm2mConfigFormGroup.get('bootstrapServer').patchValue({ | ||
318 | - clientSecretKey: this.jsonAllConfig.client[key] | ||
319 | - }, {emitEvent: false}); | ||
320 | - this.jsonAllConfig.bootstrap.bootstrapServer.clientSecretKey = this.jsonAllConfig.client[key]; | ||
321 | - } | ||
322 | - if (this.lwm2mConfigFormGroup.get('lwm2mServer').value[securityMode] === SECURITY_CONFIG_MODE.PSK) { | ||
323 | - this.lwm2mConfigFormGroup.get('lwm2mServer').patchValue({ | ||
324 | - clientSecretKey: this.jsonAllConfig.client[key] | ||
325 | - }, {emitEvent: false}); | ||
326 | - this.jsonAllConfig.bootstrap.lwm2mServer.clientSecretKey = this.jsonAllConfig.client[key]; | ||
327 | - } | ||
328 | - this.upDateJsonAllConfig(); | ||
329 | - } | ||
330 | - | ||
331 | - private upDateJsonAllConfig = (): void => { | ||
332 | - this.data.jsonAllConfig = JSON.parse(JSON.stringify(this.jsonAllConfig)); | ||
333 | - this.lwm2mConfigFormGroup.patchValue({ | ||
334 | - jsonAllConfig: JSON.parse(JSON.stringify(this.jsonAllConfig)) | ||
335 | - }, {emitEvent: false}); | ||
336 | - this.lwm2mConfigFormGroup.markAsDirty(); | ||
337 | - } | ||
338 | - | ||
339 | - private initLwm2mConfigFormGroup = (): FormGroup => { | ||
340 | - if (SECURITY_CONFIG_MODE[this.jsonAllConfig.client.securityConfigClientMode.toString()] === SECURITY_CONFIG_MODE.PSK) { | ||
341 | - const endpoint = 'endpoint'; | ||
342 | - this.data.endPoint = this.jsonAllConfig.client[endpoint]; | ||
343 | - } | ||
344 | - return this.fb.group({ | ||
345 | - securityConfigClientMode: [SECURITY_CONFIG_MODE[this.jsonAllConfig.client.securityConfigClientMode.toString()], []], | ||
346 | - identityPSK: ['', []], | ||
347 | - clientKey: ['', []], | ||
348 | - clientCertificate: [false, []], | ||
349 | - bootstrapServer: [this.jsonAllConfig.bootstrap[this.bootstrapServer], []], | ||
350 | - lwm2mServer: [this.jsonAllConfig.bootstrap[this.lwm2mServer], []], | ||
351 | - bootstrapFormGroup: this.getServerGroup(), | ||
352 | - lwm2mServerFormGroup: this.getServerGroup(), | ||
353 | - endPoint: [this.data.endPoint, []], | ||
354 | - jsonAllConfig: [this.jsonAllConfig, []] | ||
355 | - }); | ||
356 | - } | ||
357 | - | ||
358 | - private getServerGroup = (): FormGroup => { | ||
359 | - return this.fb.group({ | ||
360 | - securityMode: [this.fb.control(SECURITY_CONFIG_MODE.NO_SEC), []], | ||
361 | - clientPublicKeyOrId: ['', []], | ||
362 | - clientSecretKey: ['', []] | ||
363 | - }); | ||
364 | - } | ||
365 | - | ||
366 | - save(): void { | ||
367 | - this.upDateValueToJson(); | ||
368 | - this.data.endPoint = this.lwm2mConfigFormGroup.get('endPoint').value.split('\'').join(''); | ||
369 | - this.data.jsonAllConfig = this.jsonAllConfig; | ||
370 | - if (this.lwm2mConfigFormGroup.get('securityConfigClientMode').value === SECURITY_CONFIG_MODE.PSK) { | ||
371 | - const identity = 'identity'; | ||
372 | - this.data.endPoint = this.data.jsonAllConfig.client[identity]; | ||
373 | - } | ||
374 | - this.dialogRef.close(this.data); | ||
375 | - } | ||
376 | - | ||
377 | - cancel(): void { | ||
378 | - this.dialogRef.close(undefined); | ||
379 | - } | ||
380 | -} | ||
381 | - | ||
382 | - |
ui-ngx/src/app/shared/models/lwm2m-security-config.models.ts
renamed from
ui-ngx/src/app/modules/home/pages/device/lwm2m/security-config.models.ts
@@ -17,9 +17,6 @@ | @@ -17,9 +17,6 @@ | ||
17 | export const JSON_ALL_CONFIG = 'jsonAllConfig'; | 17 | export const JSON_ALL_CONFIG = 'jsonAllConfig'; |
18 | export const END_POINT = 'endPoint'; | 18 | export const END_POINT = 'endPoint'; |
19 | export const DEFAULT_END_POINT = 'default_client_lwm2m_end_point_no_sec'; | 19 | export const DEFAULT_END_POINT = 'default_client_lwm2m_end_point_no_sec'; |
20 | -export const BOOTSTRAP_SERVERS = 'servers'; | ||
21 | -export const BOOTSTRAP_SERVER = 'bootstrapServer'; | ||
22 | -export const LWM2M_SERVER = 'lwm2mServer'; | ||
23 | export const LEN_MAX_PSK = 64; | 20 | export const LEN_MAX_PSK = 64; |
24 | export const LEN_MAX_PRIVATE_KEY = 134; | 21 | export const LEN_MAX_PRIVATE_KEY = 134; |
25 | export const LEN_MAX_PUBLIC_KEY_RPK = 182; | 22 | export const LEN_MAX_PUBLIC_KEY_RPK = 182; |
@@ -28,28 +25,28 @@ export const KEY_REGEXP_HEX_DEC = /^[-+]?[0-9A-Fa-f]+\.?[0-9A-Fa-f]*?$/; | @@ -28,28 +25,28 @@ export const KEY_REGEXP_HEX_DEC = /^[-+]?[0-9A-Fa-f]+\.?[0-9A-Fa-f]*?$/; | ||
28 | 25 | ||
29 | 26 | ||
30 | export interface DeviceCredentialsDialogLwm2mData { | 27 | export interface DeviceCredentialsDialogLwm2mData { |
31 | - jsonAllConfig?: SecurityConfigModels; | 28 | + jsonAllConfig?: Lwm2mSecurityConfigModels; |
32 | endPoint?: string; | 29 | endPoint?: string; |
33 | } | 30 | } |
34 | 31 | ||
35 | -export enum SECURITY_CONFIG_MODE { | 32 | +export enum Lwm2mSecurityType { |
36 | PSK = 'PSK', | 33 | PSK = 'PSK', |
37 | RPK = 'RPK', | 34 | RPK = 'RPK', |
38 | X509 = 'X509', | 35 | X509 = 'X509', |
39 | NO_SEC = 'NO_SEC' | 36 | NO_SEC = 'NO_SEC' |
40 | } | 37 | } |
41 | 38 | ||
42 | -export const SECURITY_CONFIG_MODE_NAMES = new Map<SECURITY_CONFIG_MODE, string>( | 39 | +export const Lwm2mSecurityTypeTranslationMap = new Map<Lwm2mSecurityType, string>( |
43 | [ | 40 | [ |
44 | - [SECURITY_CONFIG_MODE.PSK, 'Pre-Shared Key'], | ||
45 | - [SECURITY_CONFIG_MODE.RPK, 'Raw Public Key'], | ||
46 | - [SECURITY_CONFIG_MODE.X509, 'X.509 Certificate'], | ||
47 | - [SECURITY_CONFIG_MODE.NO_SEC, 'No Security'], | 41 | + [Lwm2mSecurityType.PSK, 'Pre-Shared Key'], |
42 | + [Lwm2mSecurityType.RPK, 'Raw Public Key'], | ||
43 | + [Lwm2mSecurityType.X509, 'X.509 Certificate'], | ||
44 | + [Lwm2mSecurityType.NO_SEC, 'No Security'], | ||
48 | ] | 45 | ] |
49 | ); | 46 | ); |
50 | 47 | ||
51 | export interface ClientSecurityConfig { | 48 | export interface ClientSecurityConfig { |
52 | - securityConfigClientMode: string; | 49 | + securityConfigClientMode: Lwm2mSecurityType; |
53 | endpoint: string; | 50 | endpoint: string; |
54 | identity: string; | 51 | identity: string; |
55 | key: string; | 52 | key: string; |
@@ -57,7 +54,7 @@ export interface ClientSecurityConfig { | @@ -57,7 +54,7 @@ export interface ClientSecurityConfig { | ||
57 | } | 54 | } |
58 | 55 | ||
59 | export interface ServerSecurityConfig { | 56 | export interface ServerSecurityConfig { |
60 | - securityMode: string; | 57 | + securityMode: Lwm2mSecurityType; |
61 | clientPublicKeyOrId?: string; | 58 | clientPublicKeyOrId?: string; |
62 | clientSecretKey?: string; | 59 | clientSecretKey?: string; |
63 | } | 60 | } |
@@ -67,20 +64,19 @@ interface BootstrapSecurityConfig { | @@ -67,20 +64,19 @@ interface BootstrapSecurityConfig { | ||
67 | lwm2mServer: ServerSecurityConfig; | 64 | lwm2mServer: ServerSecurityConfig; |
68 | } | 65 | } |
69 | 66 | ||
70 | -export interface SecurityConfigModels { | 67 | +export interface Lwm2mSecurityConfigModels { |
71 | client: ClientSecurityConfig; | 68 | client: ClientSecurityConfig; |
72 | bootstrap: BootstrapSecurityConfig; | 69 | bootstrap: BootstrapSecurityConfig; |
73 | } | 70 | } |
74 | 71 | ||
75 | -export function getClientSecurityConfig(securityConfigMode: SECURITY_CONFIG_MODE, endPoint?: string): ClientSecurityConfig { | ||
76 | - let security = getDefaultClientSecurityConfig(); | ||
77 | - security.securityConfigClientMode = securityConfigMode.toString(); | 72 | +export function getClientSecurityConfig(securityConfigMode: Lwm2mSecurityType, endPoint = ''): ClientSecurityConfig { |
73 | + const security = getDefaultClientSecurityConfig(securityConfigMode); | ||
78 | switch (securityConfigMode) { | 74 | switch (securityConfigMode) { |
79 | - case SECURITY_CONFIG_MODE.PSK: | 75 | + case Lwm2mSecurityType.PSK: |
80 | security.endpoint = endPoint; | 76 | security.endpoint = endPoint; |
81 | security.identity = endPoint; | 77 | security.identity = endPoint; |
82 | break; | 78 | break; |
83 | - case SECURITY_CONFIG_MODE.X509: | 79 | + case Lwm2mSecurityType.X509: |
84 | security.x509 = true; | 80 | security.x509 = true; |
85 | break; | 81 | break; |
86 | } | 82 | } |
@@ -88,9 +84,9 @@ export function getClientSecurityConfig(securityConfigMode: SECURITY_CONFIG_MODE | @@ -88,9 +84,9 @@ export function getClientSecurityConfig(securityConfigMode: SECURITY_CONFIG_MODE | ||
88 | return security; | 84 | return security; |
89 | } | 85 | } |
90 | 86 | ||
91 | -export function getDefaultClientSecurityConfig(): ClientSecurityConfig { | 87 | +export function getDefaultClientSecurityConfig(securityConfigMode: Lwm2mSecurityType): ClientSecurityConfig { |
92 | return { | 88 | return { |
93 | - securityConfigClientMode: SECURITY_CONFIG_MODE.NO_SEC.toString(), | 89 | + securityConfigClientMode: securityConfigMode, |
94 | endpoint: '', | 90 | endpoint: '', |
95 | identity: '', | 91 | identity: '', |
96 | key: '', | 92 | key: '', |
@@ -100,7 +96,7 @@ export function getDefaultClientSecurityConfig(): ClientSecurityConfig { | @@ -100,7 +96,7 @@ export function getDefaultClientSecurityConfig(): ClientSecurityConfig { | ||
100 | 96 | ||
101 | export function getDefaultServerSecurityConfig(): ServerSecurityConfig { | 97 | export function getDefaultServerSecurityConfig(): ServerSecurityConfig { |
102 | return { | 98 | return { |
103 | - securityMode: SECURITY_CONFIG_MODE.NO_SEC.toString(), | 99 | + securityMode: Lwm2mSecurityType.NO_SEC, |
104 | clientPublicKeyOrId: '', | 100 | clientPublicKeyOrId: '', |
105 | clientSecretKey: '' | 101 | clientSecretKey: '' |
106 | }; | 102 | }; |
@@ -113,46 +109,42 @@ function getDefaultBootstrapSecurityConfig(): BootstrapSecurityConfig { | @@ -113,46 +109,42 @@ function getDefaultBootstrapSecurityConfig(): BootstrapSecurityConfig { | ||
113 | }; | 109 | }; |
114 | } | 110 | } |
115 | 111 | ||
116 | -export function getDefaultSecurityConfig(): SecurityConfigModels { | 112 | +export function getDefaultSecurityConfig(): Lwm2mSecurityConfigModels { |
117 | const securityConfigModels = { | 113 | const securityConfigModels = { |
118 | - client: getClientSecurityConfig(SECURITY_CONFIG_MODE.NO_SEC), | 114 | + client: getClientSecurityConfig(Lwm2mSecurityType.NO_SEC), |
119 | bootstrap: getDefaultBootstrapSecurityConfig() | 115 | bootstrap: getDefaultBootstrapSecurityConfig() |
120 | }; | 116 | }; |
121 | return securityConfigModels; | 117 | return securityConfigModels; |
122 | } | 118 | } |
123 | 119 | ||
124 | -const isSecurityConfigModels = (p: any): p is SecurityConfigModels => | 120 | +const isSecurityConfigModels = (p: any): boolean => |
125 | p.hasOwnProperty('client') && | 121 | p.hasOwnProperty('client') && |
126 | - isClientSecurityConfigType(p['client']) && | 122 | + isClientSecurityConfigType(p.client) && |
127 | p.hasOwnProperty('bootstrap') && | 123 | p.hasOwnProperty('bootstrap') && |
128 | - isBootstrapSecurityConfig(p['bootstrap']); | 124 | + isBootstrapSecurityConfig(p.bootstrap); |
129 | 125 | ||
130 | -const isClientSecurityConfigType = (p: any): p is ClientSecurityConfig => | 126 | +const isClientSecurityConfigType = (p: any): boolean => |
131 | p.hasOwnProperty('securityConfigClientMode') && | 127 | p.hasOwnProperty('securityConfigClientMode') && |
132 | p.hasOwnProperty('endpoint') && | 128 | p.hasOwnProperty('endpoint') && |
133 | p.hasOwnProperty('identity') && | 129 | p.hasOwnProperty('identity') && |
134 | p.hasOwnProperty('key') && | 130 | p.hasOwnProperty('key') && |
135 | p.hasOwnProperty('x509'); | 131 | p.hasOwnProperty('x509'); |
136 | 132 | ||
137 | -const isBootstrapSecurityConfig = (p: any): p is BootstrapSecurityConfig => | 133 | +const isBootstrapSecurityConfig = (p: any): boolean => |
138 | p.hasOwnProperty('bootstrapServer') && | 134 | p.hasOwnProperty('bootstrapServer') && |
139 | - isServerSecurityConfig(p['bootstrapServer']) && | 135 | + isServerSecurityConfig(p.bootstrapServer) && |
140 | p.hasOwnProperty('lwm2mServer') && | 136 | p.hasOwnProperty('lwm2mServer') && |
141 | - isServerSecurityConfig(p['lwm2mServer']); | 137 | + isServerSecurityConfig(p.lwm2mServer); |
142 | 138 | ||
143 | -const isServerSecurityConfig = (p: any): p is ServerSecurityConfig => | 139 | +const isServerSecurityConfig = (p: any): boolean => |
144 | p.hasOwnProperty('securityMode') && | 140 | p.hasOwnProperty('securityMode') && |
145 | p.hasOwnProperty('clientPublicKeyOrId') && | 141 | p.hasOwnProperty('clientPublicKeyOrId') && |
146 | p.hasOwnProperty('clientSecretKey'); | 142 | p.hasOwnProperty('clientSecretKey'); |
147 | 143 | ||
148 | export function validateSecurityConfig(config: string): boolean { | 144 | export function validateSecurityConfig(config: string): boolean { |
149 | try { | 145 | try { |
150 | - const securityConfig= JSON.parse(config); | ||
151 | - if (isSecurityConfigModels(securityConfig)) { | ||
152 | - return true; | ||
153 | - } else { | ||
154 | - return false; | ||
155 | - } | 146 | + const securityConfig = JSON.parse(config); |
147 | + return isSecurityConfigModels(securityConfig); | ||
156 | } catch (e) { | 148 | } catch (e) { |
157 | return false; | 149 | return false; |
158 | } | 150 | } |
@@ -928,9 +928,13 @@ | @@ -928,9 +928,13 @@ | ||
928 | "lwm2m-credentials-value-tip": "Edit security config json editor", | 928 | "lwm2m-credentials-value-tip": "Edit security config json editor", |
929 | "lwm2m-security-config": { | 929 | "lwm2m-security-config": { |
930 | "identity": "Client Identity", | 930 | "identity": "Client Identity", |
931 | + "identity-required": "Client Identity is required.", | ||
931 | "client-key": "Client Key", | 932 | "client-key": "Client Key", |
932 | - "required": " value is required.", | 933 | + "client-key-required": "Client Key is required.", |
934 | + "client-key-pattern": "Client Key must be hexadecimal format.", | ||
935 | + "client-key-length": "Client Key must be {{ count }} characters.", | ||
933 | "endpoint": "Endpoint Client Name", | 936 | "endpoint": "Endpoint Client Name", |
937 | + "endpoint-required": "Endpoint Client Name is required.", | ||
934 | "mode": "Security config mode", | 938 | "mode": "Security config mode", |
935 | "client-tab": "Client Security Config", | 939 | "client-tab": "Client Security Config", |
936 | "client-certificate": "Client certificate", | 940 | "client-certificate": "Client certificate", |
@@ -938,9 +942,14 @@ | @@ -938,9 +942,14 @@ | ||
938 | "bootstrap-server": "Bootstrap Server", | 942 | "bootstrap-server": "Bootstrap Server", |
939 | "lwm2m-server": "LwM2M Server", | 943 | "lwm2m-server": "LwM2M Server", |
940 | "client-publicKey-or-id": "Client Public Key or Id", | 944 | "client-publicKey-or-id": "Client Public Key or Id", |
945 | + "client-publicKey-or-id-required": "Client Public Key or Id is required.", | ||
946 | + "client-publicKey-or-id-pattern": "Client Public Key or Id must be hexadecimal format.", | ||
947 | + "client-publicKey-or-id-length": "Client Public Key or Id must be {{ count }} characters.", | ||
941 | "client-secret-key": "Client Secret Key", | 948 | "client-secret-key": "Client Secret Key", |
942 | - "config-json-tab": "Json Client Security Config", | ||
943 | - "pattern_hex_dec": "{ count, plural, 0 {must be hex decimal format} other {must be # characters} }" | 949 | + "client-secret-key-required": "Client Secret Key is required.", |
950 | + "client-secret-key-pattern": "Client Secret Key must be hexadecimal format.", | ||
951 | + "client-secret-key-length": "Client Secret Key must be {{ count }} characters.", | ||
952 | + "config-json-tab": "Json Client Security Config" | ||
944 | }, | 953 | }, |
945 | "client-id": "Client ID", | 954 | "client-id": "Client ID", |
946 | "client-id-pattern": "Contains invalid character.", | 955 | "client-id-pattern": "Contains invalid character.", |