Skip to content
This repository has been archived by the owner on Sep 11, 2024. It is now read-only.

Don't handle identity server failure as fatal, and use the right message #3088

Merged
merged 3 commits into from
Jun 11, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions res/css/structures/auth/_Login.scss
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
5 changes: 3 additions & 2 deletions res/themes/light/css/_light.scss
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
12 changes: 10 additions & 2 deletions src/components/structures/auth/ForgotPassword.js
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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: "",
};
},
Expand All @@ -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"));
}
},

Expand Down Expand Up @@ -120,6 +122,7 @@ module.exports = React.createClass({
onSubmitForm: async function(ev) {
ev.preventDefault();

// refresh the server errors, just in case the server came back online
await this._checkServerLiveliness(this.props.serverConfig);

if (!this.state.email) {
Expand Down Expand Up @@ -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 = (
<div className="mx_Login_error mx_Login_serverError">
<div className={classes}>
{this.state.serverDeadError}
</div>
);
Expand Down
13 changes: 11 additions & 2 deletions src/components/structures/auth/Login.js
Original file line number Diff line number Diff line change
Expand Up @@ -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]*$/;
Expand Down Expand Up @@ -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: "",
};
},
Expand Down Expand Up @@ -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) => {
Expand Down Expand Up @@ -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 = (
<div className="mx_Login_error mx_Login_serverError">
<div className={classes}>
{this.state.serverDeadError}
</div>
);
Expand Down
17 changes: 13 additions & 4 deletions src/components/structures/auth/Registration.js
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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: "",
};
},
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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}
/>;
}
},
Expand All @@ -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 = (
<div className="mx_Login_error mx_Login_serverError">
<div className={classes}>
{this.state.serverDeadError}
</div>
);
Expand Down
4 changes: 4 additions & 0 deletions src/i18n/strings/en_EN.json
Original file line number Diff line number Diff line change
Expand Up @@ -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 <a>your config</a> for incorrect or duplicate entries.": "Ask your Riot admin to check <a>your config</a> 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",
Expand Down
41 changes: 36 additions & 5 deletions src/utils/AutoDiscoveryUtils.js
Original file line number Diff line number Diff line change
Expand Up @@ -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,
];
Expand All @@ -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)) {
Expand All @@ -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: (
<div>
<strong>{title}</strong>
Expand Down