Password strength meter (#427)

* Updating translations.

* Updating translations.

* Add password strength meter. Fixes #388
This commit is contained in:
Dessalines 2021-09-19 15:32:51 -04:00 committed by GitHub
parent bf93e29f4c
commit d66931e1c6
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 61 additions and 7 deletions

@ -1 +1 @@
Subproject commit a700edf2dc9c290050b036b6d33e0ea351c92274 Subproject commit 7dd7b98da76477222f9fd9720b4b25e14e3ddc97

View file

@ -18,6 +18,7 @@
"dependencies": { "dependencies": {
"@typescript-eslint/parser": "^4.31.1", "@typescript-eslint/parser": "^4.31.1",
"autosize": "^5.0.1", "autosize": "^5.0.1",
"check-password-strength": "^2.0.3",
"choices.js": "^9.0.1", "choices.js": "^9.0.1",
"emoji-short-name": "^1.0.0", "emoji-short-name": "^1.0.0",
"express": "~4.17.1", "express": "~4.17.1",

View file

@ -1,3 +1,5 @@
import { Options, passwordStrength } from "check-password-strength";
import { I18nKeys } from "i18next";
import { Component, linkEvent } from "inferno"; import { Component, linkEvent } from "inferno";
import { T } from "inferno-i18next-dess"; import { T } from "inferno-i18next-dess";
import { import {
@ -28,6 +30,33 @@ import {
import { HtmlTags } from "../common/html-tags"; import { HtmlTags } from "../common/html-tags";
import { Icon, Spinner } from "../common/icon"; import { Icon, Spinner } from "../common/icon";
const passwordStrengthOptions: Options<string> = [
{
id: 0,
value: "too_weak",
minDiversity: 0,
minLength: 0,
},
{
id: 1,
value: "weak",
minDiversity: 2,
minLength: 10,
},
{
id: 2,
value: "medium",
minDiversity: 3,
minLength: 12,
},
{
id: 3,
value: "strong",
minDiversity: 4,
minLength: 14,
},
];
interface State { interface State {
loginForm: LoginForm; loginForm: LoginForm;
registerForm: Register; registerForm: Register;
@ -227,10 +256,16 @@ export class Login extends Component<any, State> {
value={this.state.registerForm.password} value={this.state.registerForm.password}
autoComplete="new-password" autoComplete="new-password"
onInput={linkEvent(this, this.handleRegisterPasswordChange)} onInput={linkEvent(this, this.handleRegisterPasswordChange)}
minLength={10}
maxLength={60} maxLength={60}
class="form-control" class="form-control"
required required
/> />
{this.state.registerForm.password && (
<div class={this.passwordColorClass}>
{i18n.t(this.passwordStrength as I18nKeys)}
</div>
)}
</div> </div>
</div> </div>
@ -349,6 +384,25 @@ export class Login extends Component<any, State> {
); );
} }
get passwordStrength() {
return passwordStrength(
this.state.registerForm.password,
passwordStrengthOptions
).value;
}
get passwordColorClass(): string {
let strength = this.passwordStrength;
if (["weak", "medium"].includes(strength)) {
return "text-warning";
} else if (strength == "strong") {
return "text-success";
} else {
return "text-danger";
}
}
handleLoginSubmit(i: Login, event: any) { handleLoginSubmit(i: Login, event: any) {
event.preventDefault(); event.preventDefault();
i.state.loginLoading = true; i.state.loginLoading = true;

View file

@ -1035,12 +1035,6 @@ export class Settings extends Component<any, SettingsState> {
i.setState(i.state); i.setState(i.state);
} }
handleLogoutClick(_i: Settings) {
UserService.Instance.logout();
window.location.href = "/";
location.reload();
}
handleDeleteAccount(i: Settings, event: any) { handleDeleteAccount(i: Settings, event: any) {
event.preventDefault(); event.preventDefault();
i.state.deleteAccountLoading = true; i.state.deleteAccountLoading = true;

View file

@ -2062,6 +2062,11 @@ chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1:
ansi-styles "^4.1.0" ansi-styles "^4.1.0"
supports-color "^7.1.0" supports-color "^7.1.0"
check-password-strength@^2.0.3:
version "2.0.3"
resolved "https://registry.yarnpkg.com/check-password-strength/-/check-password-strength-2.0.3.tgz#fed038b1c457ac11a2999bd96f3185af34e88895"
integrity sha512-UW3YgMUne9QuejgnNWjWwYi4QhWArVj+1OXqDR1NkEQcmMKKO74O3P5ZvXr9JZNbTBfcwlK3yurYCMuJsck83A==
choices.js@^9.0.1: choices.js@^9.0.1:
version "9.0.1" version "9.0.1"
resolved "https://registry.yarnpkg.com/choices.js/-/choices.js-9.0.1.tgz#745fb29af8670428fdc0bf1cc9dfaa404e9d0510" resolved "https://registry.yarnpkg.com/choices.js/-/choices.js-9.0.1.tgz#745fb29af8670428fdc0bf1cc9dfaa404e9d0510"