password reset seems to work correctly

This commit is contained in:
or-else
2023-02-01 14:38:57 -08:00
parent aa5e9ef5c7
commit 99c9a698a0
48 changed files with 360 additions and 235 deletions
+131 -82
View File
@@ -4043,13 +4043,6 @@ class AccountSettingsView extends (react__WEBPACK_IMPORTED_MODULE_0___default().
credentials: me.getCredentials() || [],
credEdit: undefined
};
this.handleEditCred = this.handleEditCred.bind(this);
}
handleEditCred(cred) {
console.log("Start editing cred", cred);
this.setState({
credEdit: cred
});
}
render() {
if (this.state.credEdit) {
@@ -4058,15 +4051,11 @@ class AccountSettingsView extends (react__WEBPACK_IMPORTED_MODULE_0___default().
val: this.state.credEdit.val,
done: this.state.credEdit.done,
onShowCountrySelector: this.props.onShowCountrySelector,
onSubmit: cred => {
this.setState({
credEdit: undefined
});
console.log("Credential editing done", cred);
},
onSubmit: this.props.onCredAdd,
onCancel: _ => this.setState({
credEdit: undefined
})
}),
onError: this.props.onError
});
}
const credentials = [];
@@ -4086,7 +4075,9 @@ class AccountSettingsView extends (react__WEBPACK_IMPORTED_MODULE_0___default().
className: "clickable",
onClick: e => {
e.preventDefault();
this.handleEditCred(cred);
this.setState({
credEdit: cred
});
}
}, val), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null, " ", cred.done ? null : react__WEBPACK_IMPORTED_MODULE_0___default().createElement("i", {
className: "material-icons"
@@ -4588,7 +4579,7 @@ class CreateAccountView extends (react__WEBPACK_IMPORTED_MODULE_0___default().Pu
value: this.state.fn,
onChange: this.handleFnChange,
required: true
}))), props.reqCredMethod == 'email' ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
}))), this.props.reqCredMethod == 'email' ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
className: "panel-form-row"
}, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
id: "email_prompt",
@@ -4603,7 +4594,7 @@ class CreateAccountView extends (react__WEBPACK_IMPORTED_MODULE_0___default().Pu
value: this.state.email,
onChange: this.handleEmailChange,
required: true
}))) : props.reqCredMethod == 'tel' ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
}))) : this.props.reqCredMethod == 'tel' ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
className: "panel-form-row"
}, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("label", {
className: "small gray"
@@ -7227,7 +7218,7 @@ class NewTopicView extends (react__WEBPACK_IMPORTED_MODULE_0___default().Compone
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "default": () => (/* binding */ PasswordResetView)
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
/* harmony export */ });
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react");
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
@@ -7240,6 +7231,22 @@ __webpack_require__.r(__webpack_exports__);
const PhoneEdit = react__WEBPACK_IMPORTED_MODULE_0___default().lazy(_ => Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../widgets/phone-edit.jsx */ "./src/widgets/phone-edit.jsx")));
const messages = (0,react_intl__WEBPACK_IMPORTED_MODULE_1__.defineMessages)({
password_reset_email_sent: {
id: "password_reset_email_sent",
defaultMessage: [{
"type": 0,
"value": "An email with security code has been sent."
}]
},
password_reset_sms_sent: {
id: "password_reset_sms_sent",
defaultMessage: [{
"type": 0,
"value": "A text message with security code has been sent."
}]
}
});
class PasswordResetView extends (react__WEBPACK_IMPORTED_MODULE_0___default().PureComponent) {
constructor(props) {
super(props);
@@ -7278,7 +7285,7 @@ class PasswordResetView extends (react__WEBPACK_IMPORTED_MODULE_0___default().Pu
const cred = this.state.email.trim() || this.state.tel.trim();
this.props.onReset(this.state.password.trim(), {
scheme: 'code',
secret: `${this.state.code}:${this.props.reqCredMethod}:${cred}`
secret: btoa(`${this.state.code}:${this.props.reqCredMethod}:${cred}`)
});
} else {
const email = this.state.email.trim();
@@ -7287,9 +7294,15 @@ class PasswordResetView extends (react__WEBPACK_IMPORTED_MODULE_0___default().Pu
email: email,
tel: tel
});
this.props.onRequest(this.props.reqCredMethod, email || tel).then(_ => this.setState({
sent: true
}));
this.props.onRequest(this.props.reqCredMethod, email || tel).then(_ => {
this.setState({
sent: true
});
const msg = this.props.reqCredMethod == 'email' ? messages.password_reset_email_sent : this.props.reqCredMethod == 'tel' ? messages.password_reset_sms_sent : null;
if (msg) {
this.props.onError(this.props.intl.formatMessage(msg), 'info');
}
});
}
}
handleEmailChange(e) {
@@ -7397,37 +7410,6 @@ class PasswordResetView extends (react__WEBPACK_IMPORTED_MODULE_0___default().Pu
tel: number
})
}))));
const sentNotification = react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, this.props.reqCredMethod == 'email' ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
id: "password_reset_email_sent",
defaultMessage: [{
"type": 0,
"value": "An email with security code has been sent to "
}, {
"type": 1,
"value": "email"
}, {
"type": 0,
"value": ". Enter the code below."
}],
values: {
email: react__WEBPACK_IMPORTED_MODULE_0___default().createElement("tt", null, this.state.email)
}
}) : this.props.reqCredMethod == 'tel' ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
id: "password_reset_sms_sent",
defaultMessage: [{
"type": 0,
"value": "A text message with security code has been sent to "
}, {
"type": 1,
"value": "phone"
}, {
"type": 0,
"value": ". Enter the code below."
}],
values: {
phone: react__WEBPACK_IMPORTED_MODULE_0___default().createElement("tt", null, this.state.tel)
}
}) : null);
const codeInput = react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("label", {
className: "small gray",
htmlFor: "enter-confirmation-code"
@@ -7456,7 +7438,7 @@ class PasswordResetView extends (react__WEBPACK_IMPORTED_MODULE_0___default().Pu
return react__WEBPACK_IMPORTED_MODULE_0___default().createElement("form", {
id: "password-reset-form",
onSubmit: this.handleSubmit
}, this.state.sent ? sentNotification : showCredentialInput ? credentialInput : null, this.state.haveCode || this.state.sent ? codeInput : null, showPasswordInput ? passwordInput : null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
}, !this.state.sent && showCredentialInput ? credentialInput : null, this.state.haveCode || this.state.sent ? codeInput : null, showPasswordInput ? passwordInput : null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
className: "dialog-buttons"
}, this.state.haveCode || this.state.sent ? null : react__WEBPACK_IMPORTED_MODULE_0___default().createElement("a", {
href: "#",
@@ -7488,6 +7470,7 @@ class PasswordResetView extends (react__WEBPACK_IMPORTED_MODULE_0___default().Pu
}))));
}
}
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ((0,react_intl__WEBPACK_IMPORTED_MODULE_1__.injectIntl)(PasswordResetView));
/***/ }),
@@ -7854,7 +7837,11 @@ class SidepanelView extends (react__WEBPACK_IMPORTED_MODULE_0___default().PureCo
myUserId: this.props.myUserId,
trustedBadges: this.props.trustedBadges,
onShowCountrySelector: this.props.onShowCountrySelector,
onNavigate: this.props.onNavigate
onNavigate: this.props.onNavigate,
onCredAdd: this.props.onCredAdd,
onCredDelete: this.props.onCredDelete,
onCredConfirm: this.props.onCredConfirm,
onError: this.props.onError
}) : view === 'general' || view === 'crop' ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_topic_common_view_jsx__WEBPACK_IMPORTED_MODULE_5__["default"], {
topic: "me",
tinode: this.props.tinode,
@@ -7862,9 +7849,6 @@ class SidepanelView extends (react__WEBPACK_IMPORTED_MODULE_0___default().PureCo
reqCredMethod: this.props.reqCredMethod,
onUpdateTopicDesc: this.props.onUpdateAccountDesc,
onUpdateTagsRequest: this.props.onUpdateAccountTags,
onCredAdd: this.props.onCredAdd,
onCredDelete: this.props.onCredDelete,
onCredConfirm: this.props.onCredConfirm,
onError: this.props.onError
}) : view === 'notif' ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_acc_notifications_view_jsx__WEBPACK_IMPORTED_MODULE_9__["default"], {
messageSounds: this.props.messageSounds,
@@ -7915,7 +7899,8 @@ class SidepanelView extends (react__WEBPACK_IMPORTED_MODULE_0___default().PureCo
onShowCountrySelector: this.props.onShowCountrySelector,
onRequest: this.props.onPasswordResetRequest,
onReset: this.props.onResetPassword,
onCancel: this.props.onCancel
onCancel: this.props.onCancel,
onError: this.props.onError
}) : null);
}
}
@@ -9978,7 +9963,7 @@ class ValidationView extends (react__WEBPACK_IMPORTED_MODULE_0___default().PureC
code: props.credCode || '',
codeReceived: props.credCode
};
this.handleChange = this.handleChange.bind(this);
this.handleCodeChange = this.handleCodeChange.bind(this);
this.handleKeyPress = this.handleKeyPress.bind(this);
this.handleSubmit = this.handleSubmit.bind(this);
this.handleCancel = this.handleCancel.bind(this);
@@ -10002,9 +9987,9 @@ class ValidationView extends (react__WEBPACK_IMPORTED_MODULE_0___default().PureC
this.props.onSubmit(this.props.credMethod, this.state.code, this.props.credToken);
}
}
handleChange(e) {
handleCodeChange(e) {
this.setState({
code: e.target.value.trim()
code: e.target.value.replace(/[^\d]/g, '')
});
}
handleKeyPress(e) {
@@ -10062,7 +10047,7 @@ class ValidationView extends (react__WEBPACK_IMPORTED_MODULE_0___default().PureC
id: "enter-confirmation-code",
placeholder: numbers_only,
value: this.state.code,
onChange: this.handleChange,
onChange: this.handleCodeChange,
onKeyPress: this.handleKeyPress,
required: true
}))), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
@@ -13127,7 +13112,7 @@ class ContextMenu extends (react__WEBPACK_IMPORTED_MODULE_0___default().Componen
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "default": () => (/* binding */ CredentialEdit)
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
/* harmony export */ });
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react");
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
@@ -13139,19 +13124,41 @@ __webpack_require__.r(__webpack_exports__);
const messages = (0,react_intl__WEBPACK_IMPORTED_MODULE_1__.defineMessages)({
password_reset_email_sent: {
id: "password_reset_email_sent",
defaultMessage: [{
"type": 0,
"value": "An email with security code has been sent."
}]
},
password_reset_sms_sent: {
id: "password_reset_sms_sent",
defaultMessage: [{
"type": 0,
"value": "A text message with security code has been sent."
}]
}
});
class CredentialEdit extends (react__WEBPACK_IMPORTED_MODULE_0___default().PureComponent) {
constructor(props) {
super(props);
this.state = {
code: '',
tel: '',
email: ''
email: '',
sent: false
};
this.handleSubmit = this.handleSubmit.bind(this);
this.handleEmailChange = this.handleEmailChange.bind(this);
this.handlePhoneChange = this.handlePhoneChange.bind(this);
this.handleCodeChange = this.handleCodeChange.bind(this);
}
formatPhoneNumber(raw) {
const number = (0,libphonenumber_js_mobile__WEBPACK_IMPORTED_MODULE_3__.parsePhoneNumberWithError)(raw);
static formatPhoneNumber(raw) {
let number;
try {
number = (0,libphonenumber_js_mobile__WEBPACK_IMPORTED_MODULE_3__.parsePhoneNumberWithError)(raw);
} catch (err) {}
return number ? number.formatInternational() : raw;
}
handleEmailChange(e) {
@@ -13160,24 +13167,31 @@ class CredentialEdit extends (react__WEBPACK_IMPORTED_MODULE_0___default().PureC
});
}
handlePhoneChange(number) {
console.log("handlePhoneChange", number);
this.setState({
tel: number
});
}
handleCodeChange(e) {
this.setState({
code: e.target.value.replace(/[^\d]/g, '')
});
}
handleSubmit(e) {
e.preventDefault();
const value = this.props.method == 'email' ? this.state.email : this.state.tel;
console.log("handleSubmit", value);
if (value) {
this.props.onSubmit(value);
this.props.onSubmit(this.props.method, value);
this.setState({
sent: true
});
const msg = this.props.method == 'email' ? messages.password_reset_email_sent : messages.password_reset_sms_sent;
this.props.onError(this.props.intl.formatMessage(msg), 'info');
}
}
render() {
return react__WEBPACK_IMPORTED_MODULE_0___default().createElement("form", {
className: "panel-form-column",
onSubmit: this.handleSubmit
}, this.props.method == 'email' ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
const readyForCode = this.state.sent || !this.props.done;
const currentValue = CredentialEdit.formatPhoneNumber(readyForCode ? this.state.tel || this.state.email : this.props.val);
const currentEmail = react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
className: "panel-form-row"
}, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("label", {
className: "large"
@@ -13197,7 +13211,8 @@ class CredentialEdit extends (react__WEBPACK_IMPORTED_MODULE_0___default().PureC
"type": 0,
"value": "Current email"
}]
})))) : this.props.method == 'tel' ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
}))));
const currentPhone = react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
className: "panel-form-row"
}, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("label", {
className: "large"
@@ -13217,11 +13232,8 @@ class CredentialEdit extends (react__WEBPACK_IMPORTED_MODULE_0___default().PureC
"type": 0,
"value": "Current phone number"
}]
})))) : null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
className: "panel-form-row"
}, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("tt", {
className: "quoted"
}, this.formatPhoneNumber(this.props.val))), this.props.method == 'email' ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
}))));
const newEmailInput = react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
className: "group"
}, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("label", {
className: "small gray"
@@ -13246,7 +13258,8 @@ class CredentialEdit extends (react__WEBPACK_IMPORTED_MODULE_0___default().PureC
value: this.state.email,
onChange: this.handleEmailChange,
required: true
})))) : this.props.method == 'tel' ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
}))));
const newPhoneInput = react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
className: "group"
}, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("label", {
className: "small gray"
@@ -13262,7 +13275,41 @@ class CredentialEdit extends (react__WEBPACK_IMPORTED_MODULE_0___default().PureC
autoFocus: true,
onShowCountrySelector: this.props.onShowCountrySelector,
onSubmit: this.handlePhoneChange
}))) : null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
})));
const codeInput = react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
className: "group"
}, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("label", {
className: "small gray"
}, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
id: "enter_confirmation_code_prompt",
defaultMessage: [{
"type": 0,
"value": "Confirmation code"
}]
}))), react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
className: "group"
}, react__WEBPACK_IMPORTED_MODULE_0___default().createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__.FormattedMessage, {
id: "numeric_confirmation_code_prompt",
defaultMessage: [{
"type": 0,
"value": "Numbers only"
}]
}, numbers_only => react__WEBPACK_IMPORTED_MODULE_0___default().createElement("input", {
type: "text",
placeholder: numbers_only,
maxLength: 10,
value: this.state.code,
onChange: this.handleCodeChange,
required: true
}))));
return react__WEBPACK_IMPORTED_MODULE_0___default().createElement("form", {
className: "panel-form-column",
onSubmit: this.handleSubmit
}, readyForCode ? null : this.props.method == 'email' ? currentEmail : this.props.method == 'tel' ? currentPhone : null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
className: "panel-form-row"
}, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("tt", {
className: "quoted"
}, currentValue)), readyForCode ? null : this.props.method == 'email' ? newEmailInput : this.props.method == 'tel' ? newPhoneInput : null, readyForCode ? codeInput : null, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
className: "dialog-buttons"
}, react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", {
className: "secondary",
@@ -13285,6 +13332,7 @@ class CredentialEdit extends (react__WEBPACK_IMPORTED_MODULE_0___default().PureC
}))));
}
}
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ((0,react_intl__WEBPACK_IMPORTED_MODULE_1__.injectIntl)(CredentialEdit));
/***/ }),
@@ -15627,6 +15675,7 @@ class PhoneEdit extends (react__WEBPACK_IMPORTED_MODULE_0___default().PureCompon
this.inputField.setCustomValidity(this.props.intl.formatMessage(messages.mobile_number_required));
return;
}
this.inputField.setCustomValidity('');
this.props.onSubmit(number.format('E.164'));
}
handleKeyDown(e) {