Add password strength meter. Fixes #388

This commit is contained in:
Dessalines 2021-09-18 19:11:06 -04:00
parent 3c9a87816b
commit b0f72c5ebd
4 changed files with 60 additions and 6 deletions

View file

@ -18,6 +18,7 @@
"dependencies": {
"@typescript-eslint/parser": "^4.31.1",
"autosize": "^5.0.1",
"check-password-strength": "^2.0.3",
"choices.js": "^9.0.1",
"emoji-short-name": "^1.0.0",
"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 { T } from "inferno-i18next-dess";
import {
@ -28,6 +30,33 @@ import {
import { HtmlTags } from "../common/html-tags";
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 {
loginForm: LoginForm;
registerForm: Register;
@ -227,10 +256,16 @@ export class Login extends Component<any, State> {
value={this.state.registerForm.password}
autoComplete="new-password"
onInput={linkEvent(this, this.handleRegisterPasswordChange)}
minLength={10}
maxLength={60}
class="form-control"
required
/>
{this.state.registerForm.password && (
<div class={this.passwordColorClass}>
{i18n.t(this.passwordStrength as I18nKeys)}
</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) {
event.preventDefault();
i.state.loginLoading = true;

View file

@ -1035,12 +1035,6 @@ export class Settings extends Component<any, SettingsState> {
i.setState(i.state);
}
handleLogoutClick(_i: Settings) {
UserService.Instance.logout();
window.location.href = "/";
location.reload();
}
handleDeleteAccount(i: Settings, event: any) {
event.preventDefault();
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"
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:
version "9.0.1"
resolved "https://registry.yarnpkg.com/choices.js/-/choices.js-9.0.1.tgz#745fb29af8670428fdc0bf1cc9dfaa404e9d0510"