Make password resets use server config objects
Like registration, the idea is that the object is passed around between components so they can take details they need.pull/21833/head
parent
00ebb5e1fd
commit
b6e027f5cb
|
@ -21,8 +21,8 @@ import { _t } from '../../../languageHandler';
|
||||||
import sdk from '../../../index';
|
import sdk from '../../../index';
|
||||||
import Modal from "../../../Modal";
|
import Modal from "../../../Modal";
|
||||||
import SdkConfig from "../../../SdkConfig";
|
import SdkConfig from "../../../SdkConfig";
|
||||||
|
|
||||||
import PasswordReset from "../../../PasswordReset";
|
import PasswordReset from "../../../PasswordReset";
|
||||||
|
import {ValidatedServerConfig} from "../../../utils/AutoDiscoveryUtils";
|
||||||
|
|
||||||
// Phases
|
// Phases
|
||||||
// Show controls to configure server details
|
// Show controls to configure server details
|
||||||
|
@ -40,28 +40,14 @@ module.exports = React.createClass({
|
||||||
displayName: 'ForgotPassword',
|
displayName: 'ForgotPassword',
|
||||||
|
|
||||||
propTypes: {
|
propTypes: {
|
||||||
// The default server name to use when the user hasn't specified
|
serverConfig: PropTypes.instanceOf(ValidatedServerConfig).isRequired,
|
||||||
// one. If set, `defaultHsUrl` and `defaultHsUrl` were derived for this
|
onServerConfigChange: PropTypes.func.isRequired,
|
||||||
// via `.well-known` discovery. The server name is used instead of the
|
|
||||||
// HS URL when talking about "your account".
|
|
||||||
defaultServerName: PropTypes.string,
|
|
||||||
// An error passed along from higher up explaining that something
|
|
||||||
// went wrong when finding the defaultHsUrl.
|
|
||||||
defaultServerDiscoveryError: PropTypes.string,
|
|
||||||
|
|
||||||
defaultHsUrl: PropTypes.string,
|
|
||||||
defaultIsUrl: PropTypes.string,
|
|
||||||
customHsUrl: PropTypes.string,
|
|
||||||
customIsUrl: PropTypes.string,
|
|
||||||
|
|
||||||
onLoginClick: PropTypes.func,
|
onLoginClick: PropTypes.func,
|
||||||
onComplete: PropTypes.func.isRequired,
|
onComplete: PropTypes.func.isRequired,
|
||||||
},
|
},
|
||||||
|
|
||||||
getInitialState: function() {
|
getInitialState: function() {
|
||||||
return {
|
return {
|
||||||
enteredHsUrl: this.props.customHsUrl || this.props.defaultHsUrl,
|
|
||||||
enteredIsUrl: this.props.customIsUrl || this.props.defaultIsUrl,
|
|
||||||
phase: PHASE_FORGOT,
|
phase: PHASE_FORGOT,
|
||||||
email: "",
|
email: "",
|
||||||
password: "",
|
password: "",
|
||||||
|
@ -70,11 +56,11 @@ module.exports = React.createClass({
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
submitPasswordReset: function(hsUrl, identityUrl, email, password) {
|
submitPasswordReset: function(email, password) {
|
||||||
this.setState({
|
this.setState({
|
||||||
phase: PHASE_SENDING_EMAIL,
|
phase: PHASE_SENDING_EMAIL,
|
||||||
});
|
});
|
||||||
this.reset = new PasswordReset(hsUrl, identityUrl);
|
this.reset = new PasswordReset(this.props.serverConfig.hsUrl, this.props.serverConfig.isUrl);
|
||||||
this.reset.resetPassword(email, password).done(() => {
|
this.reset.resetPassword(email, password).done(() => {
|
||||||
this.setState({
|
this.setState({
|
||||||
phase: PHASE_EMAIL_SENT,
|
phase: PHASE_EMAIL_SENT,
|
||||||
|
@ -103,13 +89,6 @@ module.exports = React.createClass({
|
||||||
onSubmitForm: function(ev) {
|
onSubmitForm: function(ev) {
|
||||||
ev.preventDefault();
|
ev.preventDefault();
|
||||||
|
|
||||||
// Don't allow the user to register if there's a discovery error
|
|
||||||
// Without this, the user could end up registering on the wrong homeserver.
|
|
||||||
if (this.props.defaultServerDiscoveryError) {
|
|
||||||
this.setState({errorText: this.props.defaultServerDiscoveryError});
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
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.password || !this.state.password2) {
|
} else if (!this.state.password || !this.state.password2) {
|
||||||
|
@ -132,10 +111,7 @@ module.exports = React.createClass({
|
||||||
button: _t('Continue'),
|
button: _t('Continue'),
|
||||||
onFinished: (confirmed) => {
|
onFinished: (confirmed) => {
|
||||||
if (confirmed) {
|
if (confirmed) {
|
||||||
this.submitPasswordReset(
|
this.submitPasswordReset(this.state.email, this.state.password);
|
||||||
this.state.enteredHsUrl, this.state.enteredIsUrl,
|
|
||||||
this.state.email, this.state.password,
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
@ -148,19 +124,13 @@ module.exports = React.createClass({
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
onServerConfigChange: function(config) {
|
async onServerDetailsNextPhaseClick(ev) {
|
||||||
const newState = {};
|
|
||||||
if (config.hsUrl !== undefined) {
|
|
||||||
newState.enteredHsUrl = config.hsUrl;
|
|
||||||
}
|
|
||||||
if (config.isUrl !== undefined) {
|
|
||||||
newState.enteredIsUrl = config.isUrl;
|
|
||||||
}
|
|
||||||
this.setState(newState);
|
|
||||||
},
|
|
||||||
|
|
||||||
onServerDetailsNextPhaseClick(ev) {
|
|
||||||
ev.stopPropagation();
|
ev.stopPropagation();
|
||||||
|
// TODO: TravisR - Capture the user's input somehow else
|
||||||
|
if (this._serverConfigRef) {
|
||||||
|
// Just to make sure the user's input gets captured
|
||||||
|
await this._serverConfigRef.validateServer();
|
||||||
|
}
|
||||||
this.setState({
|
this.setState({
|
||||||
phase: PHASE_FORGOT,
|
phase: PHASE_FORGOT,
|
||||||
});
|
});
|
||||||
|
@ -196,13 +166,12 @@ module.exports = React.createClass({
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: TravisR - Pull out server discovery from ServerConfig to disable the next button?
|
||||||
return <div>
|
return <div>
|
||||||
<ServerConfig
|
<ServerConfig
|
||||||
defaultHsUrl={this.props.defaultHsUrl}
|
ref={r => this._serverConfigRef = r}
|
||||||
defaultIsUrl={this.props.defaultIsUrl}
|
serverConfig={this.props.serverConfig}
|
||||||
customHsUrl={this.state.enteredHsUrl}
|
onServerConfigChange={this.props.onServerConfigChange}
|
||||||
customIsUrl={this.state.enteredIsUrl}
|
|
||||||
onServerConfigChange={this.onServerConfigChange}
|
|
||||||
delayTimeMs={0} />
|
delayTimeMs={0} />
|
||||||
<AccessibleButton className="mx_Login_submit"
|
<AccessibleButton className="mx_Login_submit"
|
||||||
onClick={this.onServerDetailsNextPhaseClick}
|
onClick={this.onServerDetailsNextPhaseClick}
|
||||||
|
@ -221,25 +190,14 @@ module.exports = React.createClass({
|
||||||
errorText = <div className="mx_Login_error">{ err }</div>;
|
errorText = <div className="mx_Login_error">{ err }</div>;
|
||||||
}
|
}
|
||||||
|
|
||||||
let yourMatrixAccountText = _t('Your Matrix account');
|
let yourMatrixAccountText = _t('Your Matrix account on %(serverName)s', {
|
||||||
if (this.state.enteredHsUrl === this.props.defaultHsUrl && this.props.defaultServerName) {
|
serverName: this.props.serverConfig.hsName,
|
||||||
yourMatrixAccountText = _t('Your Matrix account on %(serverName)s', {
|
});
|
||||||
serverName: this.props.defaultServerName,
|
if (this.props.serverConfig.hsNameIsDifferent) {
|
||||||
|
// TODO: TravisR - Use tooltip to underline
|
||||||
|
yourMatrixAccountText = _t('Your Matrix account on <underlinedServerName />', {}, {
|
||||||
|
'underlinedServerName': () => <u>{this.props.serverConfig.hsName}</u>,
|
||||||
});
|
});
|
||||||
} else {
|
|
||||||
try {
|
|
||||||
const parsedHsUrl = new URL(this.state.enteredHsUrl);
|
|
||||||
yourMatrixAccountText = _t('Your Matrix account on %(serverName)s', {
|
|
||||||
serverName: parsedHsUrl.hostname,
|
|
||||||
});
|
|
||||||
} catch (e) {
|
|
||||||
errorText = <div className="mx_Login_error">{_t(
|
|
||||||
"The homeserver URL %(hsUrl)s doesn't seem to be valid URL. Please " +
|
|
||||||
"enter a valid URL including the protocol prefix.",
|
|
||||||
{
|
|
||||||
hsUrl: this.state.enteredHsUrl,
|
|
||||||
})}</div>;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// If custom URLs are allowed, wire up the server details edit link.
|
// If custom URLs are allowed, wire up the server details edit link.
|
||||||
|
|
Loading…
Reference in New Issue