Skip to content

Commit

Permalink
Fix registration after clicking email link
Browse files Browse the repository at this point in the history
We weren't correctly jumping into the appropriate bit of the registration
flow when coming in from an email link.

 * If we have client secret / sessionId, go straight to registration phase
 * Don't reset server URLs when the server type component tells us its
   initial value
 * Confusingly, pass the custom server URL as 'default server URL' to
   the custom server type, as this is what we want the inital section
   to be based on.

Fixes element-hq/element-web#8490
  • Loading branch information
dbkr committed Feb 13, 2019
1 parent 737b85c commit 0f4092d
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 7 deletions.
30 changes: 24 additions & 6 deletions src/components/structures/auth/Registration.js
Expand Up @@ -64,6 +64,15 @@ module.exports = React.createClass({

getInitialState: function() {
const customURLsAllowed = !SdkConfig.get()['disable_custom_urls'];
let initialPhase = PHASE_SERVER_DETAILS;
if (
// if we have these two, skip to the good bit
(this.props.clientSecret && this.props.sessionId) ||
// or if custom URLs aren't allowed, skip them
!customURLsAllowed
) {
initialPhase = PHASE_REGISTRATION;
}

return {
busy: false,
Expand All @@ -87,7 +96,7 @@ module.exports = React.createClass({
hsUrl: this.props.customHsUrl,
isUrl: this.props.customIsUrl,
// Phase of the overall registration dialog.
phase: customURLsAllowed ? PHASE_SERVER_DETAILS : PHASE_REGISTRATION,
phase: initialPhase,
flows: null,
};
},
Expand All @@ -111,7 +120,7 @@ module.exports = React.createClass({
});
},

onServerTypeChange(type) {
onServerTypeChange(type, initial) {
this.setState({
serverType: type,
});
Expand All @@ -137,9 +146,15 @@ module.exports = React.createClass({
hsUrl: this.props.defaultHsUrl,
isUrl: this.props.defaultIsUrl,
});
this.setState({
phase: PHASE_SERVER_DETAILS,
});
// if this is the initial value from the control and we're
// already in the registration phase, don't go back to the
// server details phase (but do if it's actually a change resulting
// from user interaction).
if (!initial || !this.state.phase === PHASE_REGISTRATION) {
this.setState({
phase: PHASE_SERVER_DETAILS,
});
}
break;
}
},
Expand Down Expand Up @@ -372,9 +387,12 @@ module.exports = React.createClass({
// If we're on a different phase, we only show the server type selector,
// which is always shown if we allow custom URLs at all.
if (PHASES_ENABLED && this.state.phase !== PHASE_SERVER_DETAILS) {
// if we've been given a custom HS URL we should actually pass that, so
// that the appropriate section is selected at the start to match the
// homeserver URL we're using
return <div>
<ServerTypeSelector
defaultHsUrl={this.props.defaultHsUrl}
defaultHsUrl={this.props.customHsUrl || this.props.defaultHsUrl}
onChange={this.onServerTypeChange}
/>
</div>;
Expand Down
6 changes: 5 additions & 1 deletion src/components/views/auth/ServerTypeSelector.js
Expand Up @@ -90,7 +90,11 @@ export default class ServerTypeSelector extends React.PureComponent {
selected: type,
};
if (onChange) {
onChange(type);
// FIXME: Supply a second 'initial' param here to flag that this is
// initialising the value rather than from user interaction
// (which sometuimes we'll want to ignore). Must be a better way
// to do this.
onChange(type, true);
}
}

Expand Down

0 comments on commit 0f4092d

Please sign in to comment.