commit
b584bead50
@ -923,6 +923,7 @@ public abstract class BaseController {
|
|||||||
|
|
||||||
UserCredentials userCredentials = userService.findUserCredentialsByUserId(user.getTenantId(), user.getId());
|
UserCredentials userCredentials = userService.findUserCredentialsByUserId(user.getTenantId(), user.getId());
|
||||||
info.put("userCredentialsEnabled", userCredentials.isEnabled());
|
info.put("userCredentialsEnabled", userCredentials.isEnabled());
|
||||||
|
info.put("userActivated", userCredentials.getActivateToken() == null);
|
||||||
info.put("lastLoginTs", userCredentials.getLastLoginTs());
|
info.put("lastLoginTs", userCredentials.getLastLoginTs());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -83,6 +83,7 @@ public class AuthControllerTest extends AbstractControllerTest {
|
|||||||
assertThat(user.getEmail()).isEqualTo(CUSTOMER_USER_EMAIL);
|
assertThat(user.getEmail()).isEqualTo(CUSTOMER_USER_EMAIL);
|
||||||
user = getUser(customerUserId);
|
user = getUser(customerUserId);
|
||||||
assertThat(user.getAdditionalInfo().get("userCredentialsEnabled").asBoolean()).isTrue();
|
assertThat(user.getAdditionalInfo().get("userCredentialsEnabled").asBoolean()).isTrue();
|
||||||
|
assertThat(user.getAdditionalInfo().get("userActivated").asBoolean()).isTrue();
|
||||||
assertThat(user.getAdditionalInfo().get("lastLoginTs").asLong()).isCloseTo(System.currentTimeMillis(), within(10000L));
|
assertThat(user.getAdditionalInfo().get("lastLoginTs").asLong()).isCloseTo(System.currentTimeMillis(), within(10000L));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -243,6 +244,7 @@ public class AuthControllerTest extends AbstractControllerTest {
|
|||||||
user.setAuthority(Authority.TENANT_ADMIN);
|
user.setAuthority(Authority.TENANT_ADMIN);
|
||||||
user.setEmail("tenant-admin-2@thingsboard.org");
|
user.setEmail("tenant-admin-2@thingsboard.org");
|
||||||
user = doPost("/api/user", user, User.class);
|
user = doPost("/api/user", user, User.class);
|
||||||
|
assertThat(getUser(user.getId()).getAdditionalInfo().get("userActivated").asBoolean()).isFalse();
|
||||||
|
|
||||||
UserCredentials userCredentials = userCredentialsDao.findByUserId(tenantId, user.getUuidId());
|
UserCredentials userCredentials = userCredentialsDao.findByUserId(tenantId, user.getUuidId());
|
||||||
assertThat(userCredentials.getActivateTokenExpTime()).isCloseTo(System.currentTimeMillis() + TimeUnit.HOURS.toMillis(ttl), Offset.offset(120000L));
|
assertThat(userCredentials.getActivateTokenExpTime()).isCloseTo(System.currentTimeMillis() + TimeUnit.HOURS.toMillis(ttl), Offset.offset(120000L));
|
||||||
@ -289,6 +291,7 @@ public class AuthControllerTest extends AbstractControllerTest {
|
|||||||
doPost("/api/noauth/activate", JacksonUtil.newObjectNode()
|
doPost("/api/noauth/activate", JacksonUtil.newObjectNode()
|
||||||
.put("activateToken", newActivationToken)
|
.put("activateToken", newActivationToken)
|
||||||
.put("password", "wefewe")).andExpect(status().isOk());
|
.put("password", "wefewe")).andExpect(status().isOk());
|
||||||
|
assertThat(getUser(user.getId()).getAdditionalInfo().get("userActivated").asBoolean()).isTrue();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|||||||
@ -25,25 +25,25 @@
|
|||||||
<button mat-raised-button color="primary"
|
<button mat-raised-button color="primary"
|
||||||
[disabled]="(isLoading$ | async)"
|
[disabled]="(isLoading$ | async)"
|
||||||
(click)="onEntityAction($event, 'disableAccount')"
|
(click)="onEntityAction($event, 'disableAccount')"
|
||||||
[class.!hidden]="isEdit || !isUserCredentialPresent() || !isUserCredentialsEnabled()">
|
[class.!hidden]="isEdit || !isUserActivated() || !isUserCredentialsEnabled()">
|
||||||
{{'user.disable-account' | translate }}
|
{{'user.disable-account' | translate }}
|
||||||
</button>
|
</button>
|
||||||
<button mat-raised-button color="primary"
|
<button mat-raised-button color="primary"
|
||||||
[disabled]="(isLoading$ | async)"
|
[disabled]="(isLoading$ | async)"
|
||||||
(click)="onEntityAction($event, 'enableAccount')"
|
(click)="onEntityAction($event, 'enableAccount')"
|
||||||
[class.!hidden]="isEdit || !isUserCredentialPresent() || isUserCredentialsEnabled()">
|
[class.!hidden]="isEdit || !isUserActivated() || isUserCredentialsEnabled()">
|
||||||
{{'user.enable-account' | translate }}
|
{{'user.enable-account' | translate }}
|
||||||
</button>
|
</button>
|
||||||
<button mat-raised-button color="primary"
|
<button mat-raised-button color="primary"
|
||||||
[disabled]="(isLoading$ | async)"
|
[disabled]="(isLoading$ | async)"
|
||||||
(click)="onEntityAction($event, 'displayActivationLink')"
|
(click)="onEntityAction($event, 'displayActivationLink')"
|
||||||
[class.!hidden]="isEdit || isUserCredentialPresent()">
|
[class.!hidden]="isEdit || isUserActivated()">
|
||||||
{{'user.display-activation-link' | translate }}
|
{{'user.display-activation-link' | translate }}
|
||||||
</button>
|
</button>
|
||||||
<button mat-raised-button color="primary"
|
<button mat-raised-button color="primary"
|
||||||
[disabled]="(isLoading$ | async)"
|
[disabled]="(isLoading$ | async)"
|
||||||
(click)="onEntityAction($event, 'resendActivation')"
|
(click)="onEntityAction($event, 'resendActivation')"
|
||||||
[class.!hidden]="isEdit || isUserCredentialPresent()">
|
[class.!hidden]="isEdit || isUserActivated()">
|
||||||
{{'user.resend-activation' | translate }}
|
{{'user.resend-activation' | translate }}
|
||||||
</button>
|
</button>
|
||||||
<button mat-raised-button color="primary"
|
<button mat-raised-button color="primary"
|
||||||
|
|||||||
@ -60,11 +60,11 @@ export class UserComponent extends EntityComponent<User> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
isUserCredentialsEnabled(): boolean {
|
isUserCredentialsEnabled(): boolean {
|
||||||
return this.entity.additionalInfo.userCredentialsEnabled === true;
|
return this.entity?.additionalInfo?.userCredentialsEnabled === true;
|
||||||
}
|
}
|
||||||
|
|
||||||
isUserCredentialPresent(): boolean {
|
isUserActivated(): boolean {
|
||||||
return isDefinedAndNotNull(this.entity?.additionalInfo?.userCredentialsEnabled);
|
return this.entity?.additionalInfo?.userActivated === true;
|
||||||
}
|
}
|
||||||
|
|
||||||
buildForm(entity: User): UntypedFormGroup {
|
buildForm(entity: User): UntypedFormGroup {
|
||||||
|
|||||||
@ -29,7 +29,19 @@ export interface User extends BaseData<UserId>, HasTenantId {
|
|||||||
authority: Authority;
|
authority: Authority;
|
||||||
firstName: string;
|
firstName: string;
|
||||||
lastName: string;
|
lastName: string;
|
||||||
additionalInfo: any;
|
additionalInfo: Partial<UserAdditionalInfo>;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface UserAdditionalInfo {
|
||||||
|
userCredentialsEnabled: boolean;
|
||||||
|
userActivated: boolean;
|
||||||
|
description: string;
|
||||||
|
defaultDashboardId: string;
|
||||||
|
defaultDashboardFullscreen: boolean;
|
||||||
|
homeDashboardId: string;
|
||||||
|
homeDashboardHideToolbar: boolean;
|
||||||
|
lang: string;
|
||||||
|
[key: string]: any;
|
||||||
}
|
}
|
||||||
|
|
||||||
export enum ActivationMethod {
|
export enum ActivationMethod {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user