Validate email address in forgot password dialog (#6983)

This commit is contained in:
Paulo Pinto 2021-10-19 16:22:27 +01:00 committed by GitHub
parent 9becc392dd
commit 9c786717b8
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 36 additions and 2 deletions

View file

@ -29,8 +29,8 @@ import ServerPicker from "../../views/elements/ServerPicker";
import PassphraseField from '../../views/auth/PassphraseField'; import PassphraseField from '../../views/auth/PassphraseField';
import { replaceableComponent } from "../../../utils/replaceableComponent"; import { replaceableComponent } from "../../../utils/replaceableComponent";
import { PASSWORD_MIN_SCORE } from '../../views/auth/RegistrationForm'; import { PASSWORD_MIN_SCORE } from '../../views/auth/RegistrationForm';
import withValidation, { IValidationResult } from "../../views/elements/Validation";
import { IValidationResult } from "../../views/elements/Validation"; import * as Email from "../../../email";
import InlineSpinner from '../../views/elements/InlineSpinner'; import InlineSpinner from '../../views/elements/InlineSpinner';
import { logger } from "matrix-js-sdk/src/logger"; import { logger } from "matrix-js-sdk/src/logger";
@ -68,6 +68,7 @@ interface IState {
serverErrorIsFatal: boolean; serverErrorIsFatal: boolean;
serverDeadError: string; serverDeadError: string;
emailFieldValid: boolean;
passwordFieldValid: boolean; passwordFieldValid: boolean;
currentHttpRequest?: Promise<any>; currentHttpRequest?: Promise<any>;
} }
@ -90,6 +91,7 @@ export default class ForgotPassword extends React.Component<IProps, IState> {
serverIsAlive: true, serverIsAlive: true,
serverErrorIsFatal: false, serverErrorIsFatal: false,
serverDeadError: "", serverDeadError: "",
emailFieldValid: false,
passwordFieldValid: false, passwordFieldValid: false,
}; };
@ -169,10 +171,13 @@ export default class ForgotPassword extends React.Component<IProps, IState> {
// refresh the server errors, just in case the server came back online // refresh the server errors, just in case the server came back online
await this.handleHttpRequest(this.checkServerLiveliness(this.props.serverConfig)); await this.handleHttpRequest(this.checkServerLiveliness(this.props.serverConfig));
await this['email_field'].validate({ allowEmpty: false });
await this['password_field'].validate({ allowEmpty: false }); await this['password_field'].validate({ allowEmpty: false });
if (!this.state.email) { if (!this.state.email) {
this.showErrorDialog(_t('The email address linked to your account must be entered.')); this.showErrorDialog(_t('The email address linked to your account must be entered.'));
} else if (!this.state.emailFieldValid) {
this.showErrorDialog(_t("The email address doesn't appear to be valid."));
} else if (!this.state.password || !this.state.password2) { } else if (!this.state.password || !this.state.password2) {
this.showErrorDialog(_t('A new password must be entered.')); this.showErrorDialog(_t('A new password must be entered.'));
} else if (!this.state.passwordFieldValid) { } else if (!this.state.passwordFieldValid) {
@ -222,6 +227,32 @@ export default class ForgotPassword extends React.Component<IProps, IState> {
}); });
} }
private validateEmailRules = withValidation({
rules: [
{
key: "required",
test({ value, allowEmpty }) {
return allowEmpty || !!value;
},
invalid: () => _t("Enter email address"),
}, {
key: "email",
test: ({ value }) => !value || Email.looksValid(value),
invalid: () => _t("Doesn't look like a valid email address"),
},
],
});
private onEmailValidate = async (fieldState) => {
const result = await this.validateEmailRules(fieldState);
this.setState({
emailFieldValid: result.valid,
});
return result;
};
private onPasswordValidate(result: IValidationResult) { private onPasswordValidate(result: IValidationResult) {
this.setState({ this.setState({
passwordFieldValid: result.valid, passwordFieldValid: result.valid,
@ -277,7 +308,9 @@ export default class ForgotPassword extends React.Component<IProps, IState> {
label={_t('Email')} label={_t('Email')}
value={this.state.email} value={this.state.email}
onChange={this.onInputChanged.bind(this, "email")} onChange={this.onInputChanged.bind(this, "email")}
ref={field => this['email_field'] = field}
autoFocus autoFocus
onValidate={this.onEmailValidate}
onFocus={() => CountlyAnalytics.instance.track("onboarding_forgot_password_email_focus")} onFocus={() => CountlyAnalytics.instance.track("onboarding_forgot_password_email_focus")}
onBlur={() => CountlyAnalytics.instance.track("onboarding_forgot_password_email_blur")} onBlur={() => CountlyAnalytics.instance.track("onboarding_forgot_password_email_blur")}
/> />

View file

@ -3015,6 +3015,7 @@
"Skip verification for now": "Skip verification for now", "Skip verification for now": "Skip verification for now",
"Failed to send email": "Failed to send email", "Failed to send email": "Failed to send email",
"The email address linked to your account must be entered.": "The email address linked to your account must be entered.", "The email address linked to your account must be entered.": "The email address linked to your account must be entered.",
"The email address doesn't appear to be valid.": "The email address doesn't appear to be valid.",
"A new password must be entered.": "A new password must be entered.", "A new password must be entered.": "A new password must be entered.",
"Please choose a strong password": "Please choose a strong password", "Please choose a strong password": "Please choose a strong password",
"New passwords must match each other.": "New passwords must match each other.", "New passwords must match each other.": "New passwords must match each other.",