From 90eb3ce9ec3dacdcd16e0346a88cfc81b8c4a9e7 Mon Sep 17 00:00:00 2001 From: David Baker Date: Wed, 22 May 2019 11:51:26 +0100 Subject: [PATCH] js-sdk interactive auth now sends email token We previously sent it in componentWillMount of the email token auth component which definitely gets us on react's naughtly list. We now pass the js-sdk a callback it can call at the appropriate time to send the token (https://github.com/matrix-org/matrix-js-sdk/pull/926). We should make password reset and adding email addresses work the same way, but currently they don't even use the interactive-auth helpers(!) so they're unaffected. https://github.com/vector-im/riot-web/issues/9586 --- src/components/structures/InteractiveAuth.js | 5 +-- .../structures/auth/Registration.js | 17 ++++++++- .../auth/InteractiveAuthEntryComponents.js | 35 +------------------ 3 files changed, 20 insertions(+), 37 deletions(-) diff --git a/src/components/structures/InteractiveAuth.js b/src/components/structures/InteractiveAuth.js index 89ff4d43a3..c893057022 100644 --- a/src/components/structures/InteractiveAuth.js +++ b/src/components/structures/InteractiveAuth.js @@ -1,5 +1,6 @@ /* Copyright 2017 Vector Creations Ltd. +Copyright 2019 The Matrix.org Foundation C.I.C. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -60,7 +61,7 @@ export default React.createClass({ inputs: PropTypes.object, // As js-sdk interactive-auth - makeRegistrationUrl: PropTypes.func, + requestEmailToken: PropTypes.func, sessionId: PropTypes.string, clientSecret: PropTypes.string, emailSid: PropTypes.string, @@ -96,6 +97,7 @@ export default React.createClass({ sessionId: this.props.sessionId, clientSecret: this.props.clientSecret, emailSid: this.props.emailSid, + requestEmailToken: this.props.requestEmailToken, }); this._authLogic.attemptAuth().then((result) => { @@ -202,7 +204,6 @@ export default React.createClass({ stageState={this.state.stageState} fail={this._onAuthStageFailed} setEmailSid={this._setEmailSid} - makeRegistrationUrl={this.props.makeRegistrationUrl} showContinue={!this.props.continueIsManaged} /> ); diff --git a/src/components/structures/auth/Registration.js b/src/components/structures/auth/Registration.js index 708118bb22..04ae90c394 100644 --- a/src/components/structures/auth/Registration.js +++ b/src/components/structures/auth/Registration.js @@ -2,6 +2,7 @@ Copyright 2015, 2016 OpenMarket Ltd Copyright 2017 Vector Creations Ltd Copyright 2018, 2019 New Vector Ltd +Copyright 2019 The Matrix.org Foundation C.I.C. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -203,6 +204,20 @@ module.exports = React.createClass({ }); }, + _requestEmailToken: function(emailAddress, clientSecret, sendAttempt, sessionId) { + return this._matrixClient.requestRegisterEmailToken( + emailAddress, + clientSecret, + sendAttempt, + this.props.makeRegistrationUrl({ + client_secret: clientSecret, + hs_url: this._matrixClient.getHomeserverUrl(), + is_url: this._matrixClient.getIdentityServerUrl(), + session_id: sessionId, + }), + ); + }, + _onUIAuthFinished: async function(success, response, extra) { if (!success) { let msg = response.message || response.toString(); @@ -424,7 +439,7 @@ module.exports = React.createClass({ makeRequest={this._makeRegisterRequest} onAuthFinished={this._onUIAuthFinished} inputs={this._getUIAuthInputs()} - makeRegistrationUrl={this.props.makeRegistrationUrl} + requestEmailToken={this._requestEmailToken} sessionId={this.props.sessionId} clientSecret={this.props.clientSecret} emailSid={this.props.idSid} diff --git a/src/components/views/auth/InteractiveAuthEntryComponents.js b/src/components/views/auth/InteractiveAuthEntryComponents.js index 4851222e49..b3687db2bd 100644 --- a/src/components/views/auth/InteractiveAuthEntryComponents.js +++ b/src/components/views/auth/InteractiveAuthEntryComponents.js @@ -1,6 +1,7 @@ /* Copyright 2016 OpenMarket Ltd Copyright 2017 Vector Creations Ltd +Copyright 2019 The Matrix.org Foundation C.I.C. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -57,7 +58,6 @@ import SettingsStore from "../../../settings/SettingsStore"; * session to be failed and the process to go back to the start. * setEmailSid: m.login.email.identity only: a function to be called with the * email sid after a token is requested. - * makeRegistrationUrl A function that makes a registration URL * * Each component may also provide the following functions (beyond the standard React ones): * focus: set the input focus appropriately in the form. @@ -365,7 +365,6 @@ export const EmailIdentityAuthEntry = React.createClass({ stageState: PropTypes.object.isRequired, fail: PropTypes.func.isRequired, setEmailSid: PropTypes.func.isRequired, - makeRegistrationUrl: PropTypes.func.isRequired, }, getInitialState: function() { @@ -374,38 +373,6 @@ export const EmailIdentityAuthEntry = React.createClass({ }; }, - componentWillMount: function() { - if (this.props.stageState.emailSid === null) { - this.setState({requestingToken: true}); - this._requestEmailToken().catch((e) => { - this.props.fail(e); - }).finally(() => { - this.setState({requestingToken: false}); - }).done(); - } - }, - - /* - * Requests a verification token by email. - */ - _requestEmailToken: function() { - const nextLink = this.props.makeRegistrationUrl({ - client_secret: this.props.clientSecret, - hs_url: this.props.matrixClient.getHomeserverUrl(), - is_url: this.props.matrixClient.getIdentityServerUrl(), - session_id: this.props.authSessionId, - }); - - return this.props.matrixClient.requestRegisterEmailToken( - this.props.inputs.emailAddress, - this.props.clientSecret, - 1, // TODO: Multiple send attempts? - nextLink, - ).then((result) => { - this.props.setEmailSid(result.sid); - }); - }, - render: function() { if (this.state.requestingToken) { const Loader = sdk.getComponent("elements.Spinner");