diff --git a/CHANGELOG.md b/CHANGELOG.md index 9c0ea57a57..ef6d180616 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +Changes in [0.11.2](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.11.2) (2017-11-28) +===================================================================================================== +[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.11.1...v0.11.2) + + * Ignore unrecognised login flows + [\#1633](https://github.com/matrix-org/matrix-react-sdk/pull/1633) + Changes in [0.11.1](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.11.1) (2017-11-17) ===================================================================================================== [Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.11.0...v0.11.1) diff --git a/package.json b/package.json index 2970beb6b3..b443b4c72a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "matrix-react-sdk", - "version": "0.11.1", + "version": "0.11.2", "description": "SDK for matrix.org using React", "author": "matrix.org", "repository": { diff --git a/src/components/structures/login/Login.js b/src/components/structures/login/Login.js index baa2064277..9ed710534b 100644 --- a/src/components/structures/login/Login.js +++ b/src/components/structures/login/Login.js @@ -77,6 +77,14 @@ module.exports = React.createClass({ componentWillMount: function() { this._unmounted = false; + + // map from login step type to a function which will render a control + // letting you do that login type + this._stepRendererMap = { + 'm.login.password': this._renderPasswordStep, + 'm.login.cas': this._renderCasStep, + }; + this._initLoginLogic(); }, @@ -233,13 +241,29 @@ module.exports = React.createClass({ loginIncorrect: false, }); - loginLogic.getFlows().then(function(flows) { - // old behaviour was to always use the first flow without presenting - // options. This works in most cases (we don't have a UI for multiple - // logins so let's skip that for now). - loginLogic.chooseFlow(0); - self.setState({ - currentFlow: self._getCurrentFlowStep(), + loginLogic.getFlows().then((flows) => { + // look for a flow where we understand all of the steps. + for (let i = 0; i < flows.length; i++ ) { + if (!this._isSupportedFlow(flows[i])) { + continue; + } + + // we just pick the first flow where we support all the + // steps. (we don't have a UI for multiple logins so let's skip + // that for now). + loginLogic.chooseFlow(i); + this.setState({ + currentFlow: this._getCurrentFlowStep(), + }); + return; + } + // we got to the end of the list without finding a suitable + // flow. + this.setState({ + errorText: _t( + "This homeserver doesn't offer any login flows which are " + + "supported by this client.", + ), }); }, function(err) { self.setState({ @@ -253,6 +277,16 @@ module.exports = React.createClass({ }).done(); }, + _isSupportedFlow: function(flow) { + // technically the flow can have multiple steps, but no one does this + // for login and loginLogic doesn't support it so we can ignore it. + if (!this._stepRendererMap[flow.type]) { + console.log("Skipping flow", flow, "due to unsupported login type", flow.type); + return false; + } + return true; + }, + _getCurrentFlowStep: function() { return this._loginLogic ? this._loginLogic.getCurrentFlowStep() : null; }, @@ -294,41 +328,42 @@ module.exports = React.createClass({ }, componentForStep: function(step) { - switch (step) { - case 'm.login.password': { - const PasswordLogin = sdk.getComponent('login.PasswordLogin'); - return ( - - ); - } - case 'm.login.cas': { - const CasLogin = sdk.getComponent('login.CasLogin'); - return ( - - ); - } - default: { - if (!step) { - return; - } - return ( -
- { _t('Sorry, this homeserver is using a login which is not recognised ') }({ step }) -
- ); - } + if (!step) { + return null; } + + const stepRenderer = this._stepRendererMap[step]; + + if (stepRenderer) { + return stepRenderer(); + } + + return null; + }, + + _renderPasswordStep: function() { + const PasswordLogin = sdk.getComponent('login.PasswordLogin'); + return ( + + ); + }, + + _renderCasStep: function() { + const CasLogin = sdk.getComponent('login.CasLogin'); + return ( + + ); }, _onLanguageChange: function(newLang) { diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 3ca9b49ec6..06ad6ea15d 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -870,7 +870,7 @@ "Error: Problem communicating with the given homeserver.": "Error: Problem communicating with the given homeserver.", "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or enable unsafe scripts.": "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or enable unsafe scripts.", "Can't connect to homeserver - please check your connectivity, ensure your homeserver's SSL certificate is trusted, and that a browser extension is not blocking requests.": "Can't connect to homeserver - please check your connectivity, ensure your homeserver's SSL certificate is trusted, and that a browser extension is not blocking requests.", - "Sorry, this homeserver is using a login which is not recognised ": "Sorry, this homeserver is using a login which is not recognised ", + "This homeserver doesn't offer any login flows which are supported by this client.": "This homeserver doesn't offer any login flows which are supported by this client.", "Login as guest": "Login as guest", "Sign in to get started": "Sign in to get started", "Failed to fetch avatar URL": "Failed to fetch avatar URL",