diff options
author | Chocobozzz <me@florianbigard.com> | 2019-02-11 09:30:29 +0100 |
---|---|---|
committer | Chocobozzz <me@florianbigard.com> | 2019-02-11 10:37:27 +0100 |
commit | b426edd4854adc6e65844d8c54b8998e792b5778 (patch) | |
tree | b9ef4da0cdb2ab14c0aa1d67a883303f3ed0de14 /client | |
parent | 67b1d3fed765278bdc876cce393ef56d56942df0 (diff) | |
download | PeerTube-b426edd4854adc6e65844d8c54b8998e792b5778.tar.gz PeerTube-b426edd4854adc6e65844d8c54b8998e792b5778.tar.zst PeerTube-b426edd4854adc6e65844d8c54b8998e792b5778.zip |
Cleanup reset user password by admin
And add some tests
Diffstat (limited to 'client')
9 files changed, 43 insertions, 56 deletions
diff --git a/client/package.json b/client/package.json index 9e5e87d4a..3eea661f1 100644 --- a/client/package.json +++ b/client/package.json | |||
@@ -164,7 +164,6 @@ | |||
164 | "webpack-cli": "^3.0.8", | 164 | "webpack-cli": "^3.0.8", |
165 | "webtorrent": "https://github.com/webtorrent/webtorrent#e9b209c7970816fc29e0cc871157a4918d66001d", | 165 | "webtorrent": "https://github.com/webtorrent/webtorrent#e9b209c7970816fc29e0cc871157a4918d66001d", |
166 | "whatwg-fetch": "^3.0.0", | 166 | "whatwg-fetch": "^3.0.0", |
167 | "zone.js": "~0.8.5", | 167 | "zone.js": "~0.8.5" |
168 | "generate-password-browser": "^1.0.2" | ||
169 | } | 168 | } |
170 | } | 169 | } |
diff --git a/client/src/app/+admin/users/user-edit/user-edit.component.html b/client/src/app/+admin/users/user-edit/user-edit.component.html index 3ce246771..c6566da24 100644 --- a/client/src/app/+admin/users/user-edit/user-edit.component.html +++ b/client/src/app/+admin/users/user-edit/user-edit.component.html | |||
@@ -82,12 +82,16 @@ | |||
82 | <input type="submit" value="{{ getFormButtonTitle() }}" [disabled]="!form.valid"> | 82 | <input type="submit" value="{{ getFormButtonTitle() }}" [disabled]="!form.valid"> |
83 | </form> | 83 | </form> |
84 | 84 | ||
85 | <div *ngIf="!isCreation()"> | 85 | <div *ngIf="!isCreation()" class="danger-zone"> |
86 | <div class="account-title" i18n>Danger Zone</div> | 86 | <div class="account-title" i18n>Danger Zone</div> |
87 | 87 | ||
88 | <p i18n>Send a link to reset the password by mail to the user.</p> | 88 | <div class="form-group reset-password-email"> |
89 | <button style="margin-top:0;" (click)="resetPassword()" i18n>Ask for new password</button> | 89 | <label i18n>Send a link to reset the password by email to the user</label> |
90 | <button (click)="resetPassword()" i18n>Ask for new password</button> | ||
91 | </div> | ||
90 | 92 | ||
91 | <p class="mt-4" i18n>Manually set the user password</p> | 93 | <div class="form-group"> |
92 | <my-user-password userId="userId"></my-user-password> | 94 | <label i18n>Manually set the user password</label> |
93 | </div> \ No newline at end of file | 95 | <my-user-password [userId]="userId"></my-user-password> |
96 | </div> | ||
97 | </div> | ||
diff --git a/client/src/app/+admin/users/user-edit/user-edit.component.scss b/client/src/app/+admin/users/user-edit/user-edit.component.scss index 2b4aae83c..c1cc4ca45 100644 --- a/client/src/app/+admin/users/user-edit/user-edit.component.scss +++ b/client/src/app/+admin/users/user-edit/user-edit.component.scss | |||
@@ -32,3 +32,16 @@ input[type=submit], button { | |||
32 | margin-top: 55px; | 32 | margin-top: 55px; |
33 | margin-bottom: 30px; | 33 | margin-bottom: 30px; |
34 | } | 34 | } |
35 | |||
36 | .danger-zone { | ||
37 | .reset-password-email { | ||
38 | margin-bottom: 30px; | ||
39 | padding-bottom: 30px; | ||
40 | border-bottom: 1px solid rgba(0, 0, 0, 0.1); | ||
41 | |||
42 | button { | ||
43 | display: block; | ||
44 | margin-top: 0; | ||
45 | } | ||
46 | } | ||
47 | } | ||
diff --git a/client/src/app/+admin/users/user-edit/user-edit.ts b/client/src/app/+admin/users/user-edit/user-edit.ts index 021b1feb4..649b35b0c 100644 --- a/client/src/app/+admin/users/user-edit/user-edit.ts +++ b/client/src/app/+admin/users/user-edit/user-edit.ts | |||
@@ -8,6 +8,7 @@ export abstract class UserEdit extends FormReactive { | |||
8 | videoQuotaDailyOptions: { value: string, label: string }[] = [] | 8 | videoQuotaDailyOptions: { value: string, label: string }[] = [] |
9 | roles = Object.keys(USER_ROLE_LABELS).map(key => ({ value: key.toString(), label: USER_ROLE_LABELS[key] })) | 9 | roles = Object.keys(USER_ROLE_LABELS).map(key => ({ value: key.toString(), label: USER_ROLE_LABELS[key] })) |
10 | username: string | 10 | username: string |
11 | userId: number | ||
11 | 12 | ||
12 | protected abstract serverService: ServerService | 13 | protected abstract serverService: ServerService |
13 | protected abstract configService: ConfigService | 14 | protected abstract configService: ConfigService |
@@ -37,6 +38,10 @@ export abstract class UserEdit extends FormReactive { | |||
37 | return multiplier * parseInt(this.form.value['videoQuota'], 10) | 38 | return multiplier * parseInt(this.form.value['videoQuota'], 10) |
38 | } | 39 | } |
39 | 40 | ||
41 | resetPassword () { | ||
42 | return | ||
43 | } | ||
44 | |||
40 | protected buildQuotaOptions () { | 45 | protected buildQuotaOptions () { |
41 | // These are used by a HTML select, so convert key into strings | 46 | // These are used by a HTML select, so convert key into strings |
42 | this.videoQuotaOptions = this.configService | 47 | this.videoQuotaOptions = this.configService |
diff --git a/client/src/app/+admin/users/user-edit/user-password.component.html b/client/src/app/+admin/users/user-edit/user-password.component.html index 822e4688e..a1e1f6216 100644 --- a/client/src/app/+admin/users/user-edit/user-password.component.html +++ b/client/src/app/+admin/users/user-edit/user-password.component.html | |||
@@ -1,19 +1,15 @@ | |||
1 | <form role="form" (ngSubmit)="formValidated()" [formGroup]="form"> | 1 | <form role="form" (ngSubmit)="formValidated()" [formGroup]="form"> |
2 | <div class="form-group"> | 2 | <div class="form-group"> |
3 | 3 | ||
4 | <div class="input-group mb-3"> | 4 | <div class="input-group"> |
5 | <div class="input-group-prepend"> | 5 | <input id="password" [attr.type]="showPassword ? 'text' : 'password'" |
6 | <div class="input-group-text"> | ||
7 | <input type="checkbox" aria-label="Show password" (change)="togglePasswordVisibility()"> | ||
8 | </div> | ||
9 | </div> | ||
10 | <input id="passwordField" #passwordField | ||
11 | [attr.type]="showPassword ? 'text' : 'password'" id="password" | ||
12 | formControlName="password" [ngClass]="{ 'input-error': formErrors['password'] }" | 6 | formControlName="password" [ngClass]="{ 'input-error': formErrors['password'] }" |
13 | > | 7 | > |
14 | <div class="input-group-append"> | 8 | <div class="input-group-append"> |
15 | <button class="btn btn-sm btn-outline-secondary" (click)="generatePassword() " | 9 | <button class="btn btn-sm btn-outline-secondary" (click)="togglePasswordVisibility()" type="button"> |
16 | type="button">Generate</button> | 10 | <ng-container *ngIf="!showPassword" i18n>Show</ng-container> |
11 | <ng-container *ngIf="!!showPassword" i18n>Hide</ng-container> | ||
12 | </button> | ||
17 | </div> | 13 | </div> |
18 | </div> | 14 | </div> |
19 | <div *ngIf="formErrors.password" class="form-error"> | 15 | <div *ngIf="formErrors.password" class="form-error"> |
diff --git a/client/src/app/+admin/users/user-edit/user-password.component.scss b/client/src/app/+admin/users/user-edit/user-password.component.scss index 9185e787c..217d585af 100644 --- a/client/src/app/+admin/users/user-edit/user-password.component.scss +++ b/client/src/app/+admin/users/user-edit/user-password.component.scss | |||
@@ -3,6 +3,7 @@ | |||
3 | 3 | ||
4 | input:not([type=submit]):not([type=checkbox]) { | 4 | input:not([type=submit]):not([type=checkbox]) { |
5 | @include peertube-input-text(340px); | 5 | @include peertube-input-text(340px); |
6 | |||
6 | display: block; | 7 | display: block; |
7 | border-top-right-radius: 0; | 8 | border-top-right-radius: 0; |
8 | border-bottom-right-radius: 0; | 9 | border-bottom-right-radius: 0; |
diff --git a/client/src/app/+admin/users/user-edit/user-password.component.ts b/client/src/app/+admin/users/user-edit/user-password.component.ts index 30cd21ccd..5b3040440 100644 --- a/client/src/app/+admin/users/user-edit/user-password.component.ts +++ b/client/src/app/+admin/users/user-edit/user-password.component.ts | |||
@@ -1,14 +1,11 @@ | |||
1 | import { Component, OnDestroy, OnInit, Input } from '@angular/core' | 1 | import { Component, Input, OnInit } from '@angular/core' |
2 | import { ActivatedRoute, Router } from '@angular/router' | 2 | import { ActivatedRoute, Router } from '@angular/router' |
3 | import * as generator from 'generate-password-browser' | ||
4 | import { NotificationsService } from 'angular2-notifications' | ||
5 | import { UserService } from '@app/shared/users/user.service' | 3 | import { UserService } from '@app/shared/users/user.service' |
6 | import { ServerService } from '../../../core' | 4 | import { Notifier } from '../../../core' |
7 | import { User, UserUpdate } from '../../../../../../shared' | 5 | import { User, UserUpdate } from '../../../../../../shared' |
8 | import { I18n } from '@ngx-translate/i18n-polyfill' | 6 | import { I18n } from '@ngx-translate/i18n-polyfill' |
9 | import { FormValidatorService } from '@app/shared/forms/form-validators/form-validator.service' | 7 | import { FormValidatorService } from '@app/shared/forms/form-validators/form-validator.service' |
10 | import { UserValidatorsService } from '@app/shared/forms/form-validators/user-validators.service' | 8 | import { UserValidatorsService } from '@app/shared/forms/form-validators/user-validators.service' |
11 | import { ConfigService } from '@app/+admin/config/shared/config.service' | ||
12 | import { FormReactive } from '../../../shared' | 9 | import { FormReactive } from '../../../shared' |
13 | 10 | ||
14 | @Component({ | 11 | @Component({ |
@@ -16,7 +13,7 @@ import { FormReactive } from '../../../shared' | |||
16 | templateUrl: './user-password.component.html', | 13 | templateUrl: './user-password.component.html', |
17 | styleUrls: [ './user-password.component.scss' ] | 14 | styleUrls: [ './user-password.component.scss' ] |
18 | }) | 15 | }) |
19 | export class UserPasswordComponent extends FormReactive implements OnInit, OnDestroy { | 16 | export class UserPasswordComponent extends FormReactive implements OnInit { |
20 | error: string | 17 | error: string |
21 | username: string | 18 | username: string |
22 | showPassword = false | 19 | showPassword = false |
@@ -25,12 +22,10 @@ export class UserPasswordComponent extends FormReactive implements OnInit, OnDes | |||
25 | 22 | ||
26 | constructor ( | 23 | constructor ( |
27 | protected formValidatorService: FormValidatorService, | 24 | protected formValidatorService: FormValidatorService, |
28 | protected serverService: ServerService, | ||
29 | protected configService: ConfigService, | ||
30 | private userValidatorsService: UserValidatorsService, | 25 | private userValidatorsService: UserValidatorsService, |
31 | private route: ActivatedRoute, | 26 | private route: ActivatedRoute, |
32 | private router: Router, | 27 | private router: Router, |
33 | private notificationsService: NotificationsService, | 28 | private notifier: Notifier, |
34 | private userService: UserService, | 29 | private userService: UserService, |
35 | private i18n: I18n | 30 | private i18n: I18n |
36 | ) { | 31 | ) { |
@@ -43,10 +38,6 @@ export class UserPasswordComponent extends FormReactive implements OnInit, OnDes | |||
43 | }) | 38 | }) |
44 | } | 39 | } |
45 | 40 | ||
46 | ngOnDestroy () { | ||
47 | // | ||
48 | } | ||
49 | |||
50 | formValidated () { | 41 | formValidated () { |
51 | this.error = undefined | 42 | this.error = undefined |
52 | 43 | ||
@@ -54,8 +45,7 @@ export class UserPasswordComponent extends FormReactive implements OnInit, OnDes | |||
54 | 45 | ||
55 | this.userService.updateUser(this.userId, userUpdate).subscribe( | 46 | this.userService.updateUser(this.userId, userUpdate).subscribe( |
56 | () => { | 47 | () => { |
57 | this.notificationsService.success( | 48 | this.notifier.success( |
58 | this.i18n('Success'), | ||
59 | this.i18n('Password changed for user {{username}}.', { username: this.username }) | 49 | this.i18n('Password changed for user {{username}}.', { username: this.username }) |
60 | ) | 50 | ) |
61 | }, | 51 | }, |
@@ -64,16 +54,6 @@ export class UserPasswordComponent extends FormReactive implements OnInit, OnDes | |||
64 | ) | 54 | ) |
65 | } | 55 | } |
66 | 56 | ||
67 | generatePassword () { | ||
68 | this.form.patchValue({ | ||
69 | password: generator.generate({ | ||
70 | length: 16, | ||
71 | excludeSimilarCharacters: true, | ||
72 | strict: true | ||
73 | }) | ||
74 | }) | ||
75 | } | ||
76 | |||
77 | togglePasswordVisibility () { | 57 | togglePasswordVisibility () { |
78 | this.showPassword = !this.showPassword | 58 | this.showPassword = !this.showPassword |
79 | } | 59 | } |
@@ -81,9 +61,4 @@ export class UserPasswordComponent extends FormReactive implements OnInit, OnDes | |||
81 | getFormButtonTitle () { | 61 | getFormButtonTitle () { |
82 | return this.i18n('Update user password') | 62 | return this.i18n('Update user password') |
83 | } | 63 | } |
84 | |||
85 | private onUserFetched (userJson: User) { | ||
86 | this.userId = userJson.id | ||
87 | this.username = userJson.username | ||
88 | } | ||
89 | } | 64 | } |
diff --git a/client/src/app/+admin/users/user-edit/user-update.component.ts b/client/src/app/+admin/users/user-edit/user-update.component.ts index 4e4002a73..94ef87b08 100644 --- a/client/src/app/+admin/users/user-edit/user-update.component.ts +++ b/client/src/app/+admin/users/user-edit/user-update.component.ts | |||
@@ -1,4 +1,4 @@ | |||
1 | import { Component, OnDestroy, OnInit, Input } from '@angular/core' | 1 | import { Component, OnDestroy, OnInit } from '@angular/core' |
2 | import { ActivatedRoute, Router } from '@angular/router' | 2 | import { ActivatedRoute, Router } from '@angular/router' |
3 | import { Subscription } from 'rxjs' | 3 | import { Subscription } from 'rxjs' |
4 | import { Notifier } from '@app/core' | 4 | import { Notifier } from '@app/core' |
@@ -93,8 +93,7 @@ export class UserUpdateComponent extends UserEdit implements OnInit, OnDestroy { | |||
93 | resetPassword () { | 93 | resetPassword () { |
94 | this.userService.askResetPassword(this.userEmail).subscribe( | 94 | this.userService.askResetPassword(this.userEmail).subscribe( |
95 | () => { | 95 | () => { |
96 | this.notificationsService.success( | 96 | this.notifier.success( |
97 | this.i18n('Success'), | ||
98 | this.i18n('An email asking for password reset has been sent to {{username}}.', { username: this.username }) | 97 | this.i18n('An email asking for password reset has been sent to {{username}}.', { username: this.username }) |
99 | ) | 98 | ) |
100 | }, | 99 | }, |
diff --git a/client/src/app/shared/users/user.service.ts b/client/src/app/shared/users/user.service.ts index d0abc7def..cc5c051f1 100644 --- a/client/src/app/shared/users/user.service.ts +++ b/client/src/app/shared/users/user.service.ts | |||
@@ -103,11 +103,6 @@ export class UserService { | |||
103 | ) | 103 | ) |
104 | } | 104 | } |
105 | 105 | ||
106 | resetUserPassword (userId: number) { | ||
107 | return this.authHttp.post(UserService.BASE_USERS_URL + userId + '/reset-password', {}) | ||
108 | .pipe(catchError(err => this.restExtractor.handleError(err))) | ||
109 | } | ||
110 | |||
111 | verifyEmail (userId: number, verificationString: string) { | 106 | verifyEmail (userId: number, verificationString: string) { |
112 | const url = `${UserService.BASE_USERS_URL}/${userId}/verify-email` | 107 | const url = `${UserService.BASE_USERS_URL}/${userId}/verify-email` |
113 | const body = { | 108 | const body = { |