diff --git a/application/src/main/java/org/thingsboard/server/service/mail/DefaultMailService.java b/application/src/main/java/org/thingsboard/server/service/mail/DefaultMailService.java index baa0d417a3..85b8f8ecb4 100644 --- a/application/src/main/java/org/thingsboard/server/service/mail/DefaultMailService.java +++ b/application/src/main/java/org/thingsboard/server/service/mail/DefaultMailService.java @@ -112,8 +112,11 @@ public class DefaultMailService implements MailService { } } javaMailProperties.put(MAIL_PROP + protocol + ".starttls.enable", enableTls); - if (enableTls && jsonConfig.has("tlsVersion") && StringUtils.isNoneEmpty(jsonConfig.get("tlsVersion").asText())) { - javaMailProperties.put(MAIL_PROP + protocol + ".ssl.protocols", jsonConfig.get("tlsVersion").asText()); + if (enableTls && jsonConfig.has("tlsVersion") && !jsonConfig.get("tlsVersion").isNull()) { + String tlsVersion = jsonConfig.get("tlsVersion").asText(); + if (StringUtils.isNoneEmpty(tlsVersion)) { + javaMailProperties.put(MAIL_PROP + protocol + ".ssl.protocols", tlsVersion); + } } return javaMailProperties; } diff --git a/ui-ngx/src/app/core/http/alarm.service.ts b/ui-ngx/src/app/core/http/alarm.service.ts index 03788534af..e06a303f5d 100644 --- a/ui-ngx/src/app/core/http/alarm.service.ts +++ b/ui-ngx/src/app/core/http/alarm.service.ts @@ -96,6 +96,10 @@ export class AlarmService { return this.http.post(`/api/alarm/${alarmId}/clear`, null, defaultHttpOptionsFromConfig(config)); } + public deleteAlarm(alarmId: string, config?: RequestConfig): Observable { + return this.http.delete(`/api/alarm/${alarmId}`, defaultHttpOptionsFromConfig(config)); + } + public getAlarms(query: AlarmQuery, config?: RequestConfig): Observable> { return this.http.get>(`/api/alarm${query.toQuery()}`, diff --git a/ui-ngx/src/app/core/http/user.service.ts b/ui-ngx/src/app/core/http/user.service.ts index fc8313a42f..5beb8017f9 100644 --- a/ui-ngx/src/app/core/http/user.service.ts +++ b/ui-ngx/src/app/core/http/user.service.ts @@ -21,6 +21,7 @@ import { Observable } from 'rxjs'; import { HttpClient } from '@angular/common/http'; import { PageLink } from '@shared/models/page/page-link'; import { PageData } from '@shared/models/page/page-data'; +import { isDefined } from '@core/utils'; @Injectable({ providedIn: 'root' @@ -67,4 +68,12 @@ export class UserService { return this.http.post(`/api/user/sendActivationMail?email=${email}`, null, defaultHttpOptionsFromConfig(config)); } + public setUserCredentialsEnabled(userId: string, userCredentialsEnabled?: boolean, config?: RequestConfig): Observable { + let url = `/api/user/${userId}/userCredentialsEnabled`; + if (isDefined(userCredentialsEnabled)) { + url += `?userCredentialsEnabled=${userCredentialsEnabled}`; + } + return this.http.post(url, null, defaultHttpOptionsFromConfig(config)); + } + } diff --git a/ui-ngx/src/app/modules/home/pages/admin/mail-server.component.html b/ui-ngx/src/app/modules/home/pages/admin/mail-server.component.html index 9dfc9767e6..32dcc0d22c 100644 --- a/ui-ngx/src/app/modules/home/pages/admin/mail-server.component.html +++ b/ui-ngx/src/app/modules/home/pages/admin/mail-server.component.html @@ -76,9 +76,17 @@ {{ 'admin.timeout-invalid' | translate }} - + {{ 'admin.enable-tls' | translate }} + + admin.tls-version + + + {{ tlsVersion }} + + + common.username diff --git a/ui-ngx/src/app/modules/home/pages/admin/mail-server.component.ts b/ui-ngx/src/app/modules/home/pages/admin/mail-server.component.ts index b6b46e4fa4..33561fab19 100644 --- a/ui-ngx/src/app/modules/home/pages/admin/mail-server.component.ts +++ b/ui-ngx/src/app/modules/home/pages/admin/mail-server.component.ts @@ -37,6 +37,8 @@ export class MailServerComponent extends PageComponent implements OnInit, HasCon adminSettings: AdminSettings; smtpProtocols = ['smtp', 'smtps']; + tlsVersions = ['TLSv1.0', 'TLSv1.1', 'TLSv1.2', 'TLSv1.3']; + constructor(protected store: Store, private router: Router, private adminService: AdminService, @@ -67,6 +69,7 @@ export class MailServerComponent extends PageComponent implements OnInit, HasCon Validators.pattern(/^[0-9]{1,6}$/), Validators.maxLength(6)]], enableTls: ['false'], + tlsVersion: [], username: [''], password: [''] }); diff --git a/ui-ngx/src/app/modules/home/pages/admin/security-settings.component.html b/ui-ngx/src/app/modules/home/pages/admin/security-settings.component.html index 14b94d3b63..b0b8b52dd7 100644 --- a/ui-ngx/src/app/modules/home/pages/admin/security-settings.component.html +++ b/ui-ngx/src/app/modules/home/pages/admin/security-settings.component.html @@ -30,6 +30,28 @@
+ + + +
admin.general-policy
+
+
+ + admin.max-failed-login-attempts + + + {{ 'admin.minimum-max-failed-login-attempts-range' | translate }} + + + + admin.user-lockout-notification-email + + +
@@ -105,6 +127,16 @@ {{ 'admin.password-expiration-period-days-range' | translate }} + + admin.password-reuse-frequency-days + + + {{ 'admin.password-reuse-frequency-days-range' | translate }} + +
diff --git a/ui-ngx/src/app/modules/home/pages/admin/security-settings.component.ts b/ui-ngx/src/app/modules/home/pages/admin/security-settings.component.ts index d8b7779b2e..b5616016bd 100644 --- a/ui-ngx/src/app/modules/home/pages/admin/security-settings.component.ts +++ b/ui-ngx/src/app/modules/home/pages/admin/security-settings.component.ts @@ -56,6 +56,8 @@ export class SecuritySettingsComponent extends PageComponent implements OnInit, buildSecuritySettingsForm() { this.securitySettingsFormGroup = this.fb.group({ + maxFailedLoginAttempts: [null, [Validators.min(0)]], + userLockoutNotificationEmail: ['', []], passwordPolicy: this.fb.group( { minimumLength: [null, [Validators.required, Validators.min(5), Validators.max(50)]], @@ -63,7 +65,8 @@ export class SecuritySettingsComponent extends PageComponent implements OnInit, minimumLowercaseLetters: [null, Validators.min(0)], minimumDigits: [null, Validators.min(0)], minimumSpecialCharacters: [null, Validators.min(0)], - passwordExpirationPeriodDays: [null, Validators.min(0)] + passwordExpirationPeriodDays: [null, Validators.min(0)], + passwordReuseFrequencyDays: [null, Validators.min(0)] } ) }); diff --git a/ui-ngx/src/app/modules/home/pages/profile/profile.component.html b/ui-ngx/src/app/modules/home/pages/profile/profile.component.html index 512486c02f..4871cb0e97 100644 --- a/ui-ngx/src/app/modules/home/pages/profile/profile.component.html +++ b/ui-ngx/src/app/modules/home/pages/profile/profile.component.html @@ -18,11 +18,19 @@
-
- profile.profile - {{ profile ? profile.get('email').value : '' }} +
+
+ profile.profile + {{ profile ? profile.get('email').value : '' }} +
+
+ profile.last-login-time + +
+ +
diff --git a/ui-ngx/src/app/modules/home/pages/profile/profile.component.scss b/ui-ngx/src/app/modules/home/pages/profile/profile.component.scss index 28579ba71c..0fd9ca02e6 100644 --- a/ui-ngx/src/app/modules/home/pages/profile/profile.component.scss +++ b/ui-ngx/src/app/modules/home/pages/profile/profile.component.scss @@ -28,5 +28,15 @@ font-size: 16px; font-weight: 400; } + .mat-subheader { + line-height: 24px; + color: rgba(0,0,0,0.54); + font-size: 14px; + font-weight: 400; + } + .profile-last-login-ts { + font-size: 16px; + font-weight: 400; + } } } diff --git a/ui-ngx/src/app/modules/home/pages/user/user.component.html b/ui-ngx/src/app/modules/home/pages/user/user.component.html index 76afd21470..ac286159e3 100644 --- a/ui-ngx/src/app/modules/home/pages/user/user.component.html +++ b/ui-ngx/src/app/modules/home/pages/user/user.component.html @@ -16,6 +16,18 @@ -->
+ +