From aacb942d5713fc5021f5da0818c1b864a6804456 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Mon, 10 Jun 2019 19:28:32 -0600 Subject: [PATCH 1/3] Don't handle identity server failure as fatal, and use the right message Fixes https://github.com/vector-im/riot-web/issues/10002 --- res/css/structures/auth/_Login.scss | 4 ++ res/themes/light/css/_light.scss | 5 ++- .../structures/auth/ForgotPassword.js | 12 +++++- src/components/structures/auth/Login.js | 13 +++++- .../structures/auth/Registration.js | 17 ++++++-- src/i18n/strings/en_EN.json | 4 ++ src/utils/AutoDiscoveryUtils.js | 41 ++++++++++++++++--- 7 files changed, 81 insertions(+), 15 deletions(-) diff --git a/res/css/structures/auth/_Login.scss b/res/css/structures/auth/_Login.scss index 9ba46c09ab2..9bcd79a3575 100644 --- a/res/css/structures/auth/_Login.scss +++ b/res/css/structures/auth/_Login.scss @@ -67,6 +67,10 @@ limitations under the License. font-weight: normal; } +.mx_Login_error.mx_Login_serverError.mx_Login_serverErrorNonFatal { + color: $orange-warning-color; +} + .mx_Login_type_container { display: flex; align-items: center; diff --git a/res/themes/light/css/_light.scss b/res/themes/light/css/_light.scss index 712d905b433..8244485ee31 100644 --- a/res/themes/light/css/_light.scss +++ b/res/themes/light/css/_light.scss @@ -35,8 +35,9 @@ $selection-fg-color: $primary-bg-color; $focus-brightness: 105%; -// red warning colour -$warning-color: $notice-primary-color; +// warning colours +$warning-color: $notice-primary-color; // red +$orange-warning-color: #ff8d13; // used for true warnings // background colour for warnings $warning-bg-color: #DF2A8B; $info-bg-color: #2A9EDF; diff --git a/src/components/structures/auth/ForgotPassword.js b/src/components/structures/auth/ForgotPassword.js index 3380ea6dacf..8ab1da84c5e 100644 --- a/src/components/structures/auth/ForgotPassword.js +++ b/src/components/structures/auth/ForgotPassword.js @@ -23,6 +23,7 @@ import Modal from "../../../Modal"; import SdkConfig from "../../../SdkConfig"; import PasswordReset from "../../../PasswordReset"; import AutoDiscoveryUtils, {ValidatedServerConfig} from "../../../utils/AutoDiscoveryUtils"; +import classNames from 'classnames'; // Phases // Show controls to configure server details @@ -59,6 +60,7 @@ module.exports = React.createClass({ // that we can render it differently, and override any other error the user may // be seeing. serverIsAlive: true, + serverErrorIsFatal: false, serverDeadError: "", }; }, @@ -83,7 +85,7 @@ module.exports = React.createClass({ ); this.setState({serverIsAlive: true}); } catch (e) { - this.setState(AutoDiscoveryUtils.authComponentStateForError(e)); + this.setState(AutoDiscoveryUtils.authComponentStateForError(e, "forgot_password")); } }, @@ -120,6 +122,7 @@ module.exports = React.createClass({ onSubmitForm: async function(ev) { ev.preventDefault(); + // refresh the server errors, just in case the server cam back online await this._checkServerLiveliness(this.props.serverConfig); if (!this.state.email) { @@ -213,8 +216,13 @@ module.exports = React.createClass({ let serverDeadSection; if (!this.state.serverIsAlive) { + const classes = classNames({ + "mx_Login_error": true, + "mx_Login_serverError": true, + "mx_Login_serverErrorNonFatal": !this.state.serverErrorIsFatal, + }); serverDeadSection = ( -
+
{this.state.serverDeadError}
); diff --git a/src/components/structures/auth/Login.js b/src/components/structures/auth/Login.js index 9abf188ac32..b904e9bdff8 100644 --- a/src/components/structures/auth/Login.js +++ b/src/components/structures/auth/Login.js @@ -26,6 +26,7 @@ import Login from '../../../Login'; import SdkConfig from '../../../SdkConfig'; import { messageForResourceLimitError } from '../../../utils/ErrorUtils'; import AutoDiscoveryUtils, {ValidatedServerConfig} from "../../../utils/AutoDiscoveryUtils"; +import classNames from "classnames"; // For validating phone numbers without country codes const PHONE_NUMBER_REGEX = /^[0-9()\-\s]*$/; @@ -100,6 +101,7 @@ module.exports = React.createClass({ // that we can render it differently, and override any other error the user may // be seeing. serverIsAlive: true, + serverErrorIsFatal: false, serverDeadError: "", }; }, @@ -349,7 +351,9 @@ module.exports = React.createClass({ busy: false, ...AutoDiscoveryUtils.authComponentStateForError(e), }); - return; // Server is dead - do not continue. + if (this.state.serverErrorIsFatal) { + return; // Server is dead - do not continue. + } } loginLogic.getFlows().then((flows) => { @@ -561,8 +565,13 @@ module.exports = React.createClass({ let serverDeadSection; if (!this.state.serverIsAlive) { + const classes = classNames({ + "mx_Login_error": true, + "mx_Login_serverError": true, + "mx_Login_serverErrorNonFatal": !this.state.serverErrorIsFatal, + }); serverDeadSection = ( -
+
{this.state.serverDeadError}
); diff --git a/src/components/structures/auth/Registration.js b/src/components/structures/auth/Registration.js index cee809de133..de042550d05 100644 --- a/src/components/structures/auth/Registration.js +++ b/src/components/structures/auth/Registration.js @@ -27,6 +27,7 @@ import SdkConfig from '../../../SdkConfig'; import { messageForResourceLimitError } from '../../../utils/ErrorUtils'; import * as ServerType from '../../views/auth/ServerTypeSelector'; import AutoDiscoveryUtils, {ValidatedServerConfig} from "../../../utils/AutoDiscoveryUtils"; +import classNames from "classnames"; // Phases // Show controls to configure server details @@ -85,6 +86,7 @@ module.exports = React.createClass({ // that we can render it differently, and override any other error the user may // be seeing. serverIsAlive: true, + serverErrorIsFatal: false, serverDeadError: "", }; }, @@ -168,8 +170,10 @@ module.exports = React.createClass({ ); this.setState({serverIsAlive: true}); } catch (e) { - this.setState(AutoDiscoveryUtils.authComponentStateForError(e)); - return; // Server is dead - do not continue. + this.setState(AutoDiscoveryUtils.authComponentStateForError(e, "register")); + if (this.state.serverErrorIsFatal) { + return; // Server is dead - do not continue. + } } const {hsUrl, isUrl} = serverConfig; @@ -467,7 +471,7 @@ module.exports = React.createClass({ onEditServerDetailsClick={onEditServerDetailsClick} flows={this.state.flows} serverConfig={this.props.serverConfig} - canSubmit={this.state.serverIsAlive} + canSubmit={this.state.serverIsAlive && this.state.serverErrorIsFatal} />; } }, @@ -485,8 +489,13 @@ module.exports = React.createClass({ let serverDeadSection; if (!this.state.serverIsAlive) { + const classes = classNames({ + "mx_Login_error": true, + "mx_Login_serverError": true, + "mx_Login_serverErrorNonFatal": !this.state.serverErrorIsFatal, + }); serverDeadSection = ( -
+
{this.state.serverDeadError}
); diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index bd4f3820b04..69ac59f9846 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -253,6 +253,10 @@ "Ensure you have a stable internet connection, or get in touch with the server admin": "Ensure you have a stable internet connection, or get in touch with the server admin", "Your Riot is misconfigured": "Your Riot is misconfigured", "Ask your Riot admin to check your config for incorrect or duplicate entries.": "Ask your Riot admin to check your config for incorrect or duplicate entries.", + "Cannot reach identity server": "Cannot reach identity server", + "You can register, but some features will be unavailable until the identity server is back online. If you keep seeing this warning, check your configuration or contact a server admin.": "You can register, but some features will be unavailable until the identity server is back online. If you keep seeing this warning, check your configuration or contact a server admin.", + "You can reset your password, but some features will be unavailable until the identity server is back online. If you keep seeing this warning, check your configuration or contact a server admin.": "You can reset your password, but some features will be unavailable until the identity server is back online. If you keep seeing this warning, check your configuration or contact a server admin.", + "You can log in, but some features will be unavailable until the identity server is back online. If you keep seeing this warning, check your configuration or contact a server admin.": "You can log in, but some features will be unavailable until the identity server is back online. If you keep seeing this warning, check your configuration or contact a server admin.", "No homeserver URL provided": "No homeserver URL provided", "Unexpected error resolving homeserver configuration": "Unexpected error resolving homeserver configuration", "Unexpected error resolving identity server configuration": "Unexpected error resolving identity server configuration", diff --git a/src/utils/AutoDiscoveryUtils.js b/src/utils/AutoDiscoveryUtils.js index a01fd687d05..06823e5d2a9 100644 --- a/src/utils/AutoDiscoveryUtils.js +++ b/src/utils/AutoDiscoveryUtils.js @@ -20,7 +20,7 @@ import {_t, _td, newTranslatableError} from "../languageHandler"; import {makeType} from "./TypeUtils"; import SdkConfig from "../SdkConfig"; -const LIVLINESS_DISCOVERY_ERRORS = [ +const LIVELINESS_DISCOVERY_ERRORS = [ AutoDiscovery.ERROR_INVALID_HOMESERVER, AutoDiscovery.ERROR_INVALID_IDENTITY_SERVER, ]; @@ -46,17 +46,18 @@ export default class AutoDiscoveryUtils { */ static isLivelinessError(error: string|Error): boolean { if (!error) return false; - return !!LIVLINESS_DISCOVERY_ERRORS.find(e => e === error || e === error.message); + return !!LIVELINESS_DISCOVERY_ERRORS.find(e => e === error || e === error.message); } /** * Gets the common state for auth components (login, registration, forgot * password) for a given validation error. * @param {Error} err The error encountered. - * @returns {{serverDeadError: (string|*), serverIsAlive: boolean}} The state - * for the component, given the error. + * @param {string} pageName The page for which the error should be customized to. See + * implementation for known values. + * @returns {*} The state for the component, given the error. */ - static authComponentStateForError(err: Error): {serverIsAlive: boolean, serverDeadError: string} { + static authComponentStateForError(err: Error, pageName="login"): Object { let title = _t("Cannot reach homeserver"); let body = _t("Ensure you have a stable internet connection, or get in touch with the server admin"); if (!AutoDiscoveryUtils.isLivelinessError(err)) { @@ -75,8 +76,38 @@ export default class AutoDiscoveryUtils { ); } + let isFatalError = true; + const errorMessage = err.message ? err.message : err; + if (errorMessage === AutoDiscovery.ERROR_INVALID_IDENTITY_SERVER) { + isFatalError = false; + title = _t("Cannot reach identity server"); + + // It's annoying having a ladder for the third word in the same sentence, but our translations + // don't make this easy to avoid. + if (pageName === "register") { + body = _t( + "You can register, but some features will be unavailable until the identity server is " + + "back online. If you keep seeing this warning, check your configuration or contact a server " + + "admin.", + ); + } else if (pageName === "reset_password") { + body = _t( + "You can reset your password, but some features will be unavailable until the identity " + + "server is back online. If you keep seeing this warning, check your configuration or contact " + + "a server admin.", + ); + } else { + body = _t( + "You can log in, but some features will be unavailable until the identity server is " + + "back online. If you keep seeing this warning, check your configuration or contact a server " + + "admin.", + ); + } + } + return { serverIsAlive: false, + serverErrorIsFatal: isFatalError, serverDeadError: (
{title} From bd3237500f111bd533676d89c7ad03c190a810a8 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Mon, 10 Jun 2019 20:24:06 -0600 Subject: [PATCH 2/3] Fix submit disabled condition --- src/components/structures/auth/Registration.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/structures/auth/Registration.js b/src/components/structures/auth/Registration.js index de042550d05..7dd24b550bc 100644 --- a/src/components/structures/auth/Registration.js +++ b/src/components/structures/auth/Registration.js @@ -471,7 +471,7 @@ module.exports = React.createClass({ onEditServerDetailsClick={onEditServerDetailsClick} flows={this.state.flows} serverConfig={this.props.serverConfig} - canSubmit={this.state.serverIsAlive && this.state.serverErrorIsFatal} + canSubmit={this.state.serverIsAlive && !this.state.serverErrorIsFatal} />; } }, From 7b3d1ad08d912afeac7c6a3795760598315b59af Mon Sep 17 00:00:00 2001 From: David Baker Date: Tue, 11 Jun 2019 10:29:00 +0100 Subject: [PATCH 3/3] Typo --- src/components/structures/auth/ForgotPassword.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/structures/auth/ForgotPassword.js b/src/components/structures/auth/ForgotPassword.js index 8ab1da84c5e..a5ffc9f0085 100644 --- a/src/components/structures/auth/ForgotPassword.js +++ b/src/components/structures/auth/ForgotPassword.js @@ -122,7 +122,7 @@ module.exports = React.createClass({ onSubmitForm: async function(ev) { ev.preventDefault(); - // refresh the server errors, just in case the server cam back online + // refresh the server errors, just in case the server came back online await this._checkServerLiveliness(this.props.serverConfig); if (!this.state.email) {