From fc2ec87a8c4dcfbb91a1a62cf4c07a2a8e6a50fe Mon Sep 17 00:00:00 2001 From: Josh Morel Date: Wed, 21 Nov 2018 02:48:29 -0500 Subject: enable email verification by admin (#1348) * enable email verification by admin * rename/label to set email as verified to be more explicit that admin is not sending another email to confirm * add update user emailVerified check-params test * make user.model emailVerified property required --- .../user-moderation-dropdown.component.ts | 25 +++++++++++++++++++++- client/src/app/shared/users/user.model.ts | 2 ++ client/src/app/shared/users/user.service.ts | 9 ++++++++ 3 files changed, 35 insertions(+), 1 deletion(-) (limited to 'client/src/app/shared') diff --git a/client/src/app/shared/moderation/user-moderation-dropdown.component.ts b/client/src/app/shared/moderation/user-moderation-dropdown.component.ts index 908f0b8e0..460750740 100644 --- a/client/src/app/shared/moderation/user-moderation-dropdown.component.ts +++ b/client/src/app/shared/moderation/user-moderation-dropdown.component.ts @@ -4,7 +4,7 @@ import { I18n } from '@ngx-translate/i18n-polyfill' import { DropdownAction } from '@app/shared/buttons/action-dropdown.component' import { UserBanModalComponent } from '@app/shared/moderation/user-ban-modal.component' import { UserService } from '@app/shared/users' -import { AuthService, ConfirmService } from '@app/core' +import { AuthService, ConfirmService, ServerService } from '@app/core' import { User, UserRight } from '../../../../../shared/models/users' import { Account } from '@app/shared/account/account.model' import { BlocklistService } from '@app/shared/blocklist' @@ -32,11 +32,16 @@ export class UserModerationDropdownComponent implements OnChanges { private authService: AuthService, private notificationsService: NotificationsService, private confirmService: ConfirmService, + private serverService: ServerService, private userService: UserService, private blocklistService: BlocklistService, private i18n: I18n ) { } + get requiresEmailVerification () { + return this.serverService.getConfig().signup.requiresEmailVerification + } + ngOnChanges () { this.buildActions() } @@ -97,6 +102,19 @@ export class UserModerationDropdownComponent implements OnChanges { ) } + setEmailAsVerified (user: User) { + this.userService.updateUser(user.id, { emailVerified: true }).subscribe( + () => { + this.notificationsService.success( + this.i18n('Success'), + this.i18n('User {{username}} email set as verified', { username: user.username }) + ) + }, + + err => this.notificationsService.error(this.i18n('Error'), err.message) + ) + } + blockAccountByUser (account: Account) { this.blocklistService.blockAccountByUser(account) .subscribe( @@ -264,6 +282,11 @@ export class UserModerationDropdownComponent implements OnChanges { label: this.i18n('Unban'), handler: ({ user }: { user: User }) => this.unbanUser(user), isDisplayed: ({ user }: { user: User }) => user.blocked + }, + { + label: this.i18n('Set Email as Verified'), + handler: ({ user }: { user: User }) => this.setEmailAsVerified(user), + isDisplayed: ({ user }: { user: User }) => this.requiresEmailVerification && !user.blocked && user.emailVerified === false } ]) } diff --git a/client/src/app/shared/users/user.model.ts b/client/src/app/shared/users/user.model.ts index 7c840ffa7..9819829fd 100644 --- a/client/src/app/shared/users/user.model.ts +++ b/client/src/app/shared/users/user.model.ts @@ -15,6 +15,7 @@ export type UserConstructorHash = { username: string, email: string, role: UserRole, + emailVerified?: boolean, videoQuota?: number, videoQuotaDaily?: number, nsfwPolicy?: NSFWPolicyType, @@ -31,6 +32,7 @@ export class User implements UserServerModel { id: number username: string email: string + emailVerified: boolean role: UserRole nsfwPolicy: NSFWPolicyType webTorrentEnabled: boolean diff --git a/client/src/app/shared/users/user.service.ts b/client/src/app/shared/users/user.service.ts index 27a81f0a2..cc5c051f1 100644 --- a/client/src/app/shared/users/user.service.ts +++ b/client/src/app/shared/users/user.service.ts @@ -153,6 +153,15 @@ export class UserService { ) } + updateUsers (users: User[], userUpdate: UserUpdate) { + return from(users) + .pipe( + concatMap(u => this.authHttp.put(UserService.BASE_USERS_URL + u.id, userUpdate)), + toArray(), + catchError(err => this.restExtractor.handleError(err)) + ) + } + getUser (userId: number) { return this.authHttp.get(UserService.BASE_USERS_URL + userId) .pipe(catchError(err => this.restExtractor.handleError(err))) -- cgit v1.2.3