Skip to content

Commit

Permalink
Allow default_server_config as a fallback config (#25682)
Browse files Browse the repository at this point in the history
  • Loading branch information
ShadowRZ authored Jul 10, 2023
1 parent 9ec3f79 commit 93c1710
Show file tree
Hide file tree
Showing 5 changed files with 105 additions and 13 deletions.
5 changes: 3 additions & 2 deletions docs/config.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,8 +45,9 @@ One of the following options **must** be supplied:
information. These are the same values seen as `base_url` in the `default_server_config` example, with `default_is_url`
being optional.

If a combination of these three methods is used then Element will fail to load. This is because it is unclear which
should be considered "first".
If both `default_server_config` and `default_server_name` are used, Element will try to look up the connection
infomation using `.well-known`, and if that fails, take `default_server_config` as the homeserver connection
infomation.

## Labs flags

Expand Down
2 changes: 1 addition & 1 deletion src/i18n/strings/en_EN.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"Invalid configuration: can only specify one of default_server_config, default_server_name, or default_hs_url.": "Invalid configuration: can only specify one of default_server_config, default_server_name, or default_hs_url.",
"Invalid configuration: a default_hs_url can't be specified along with default_server_name or default_server_config": "Invalid configuration: a default_hs_url can't be specified along with default_server_name or default_server_config",
"Invalid configuration: no default server specified.": "Invalid configuration: no default server specified.",
"Your Element is misconfigured": "Your Element is misconfigured",
"Your Element configuration contains invalid JSON. Please correct the problem and reload the page.": "Your Element configuration contains invalid JSON. Please correct the problem and reload the page.",
Expand Down
12 changes: 8 additions & 4 deletions src/vector/app.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -169,11 +169,11 @@ async function verifyServerConfig(): Promise<IConfigOptions> {
const isUrl = config["default_is_url"];

const incompatibleOptions = [wkConfig, serverName, hsUrl].filter((i) => !!i);
if (incompatibleOptions.length > 1) {
if (hsUrl && (wkConfig || serverName)) {
// noinspection ExceptionCaughtLocallyJS
throw new UserFriendlyError(
"Invalid configuration: can only specify one of default_server_config, default_server_name, " +
"or default_hs_url.",
"Invalid configuration: a default_hs_url can't be specified along with default_server_name " +
"or default_server_config",
);
}
if (incompatibleOptions.length < 1) {
Expand Down Expand Up @@ -201,7 +201,7 @@ async function verifyServerConfig(): Promise<IConfigOptions> {
}

let discoveryResult: ClientConfig | undefined;
if (wkConfig) {
if (!serverName && wkConfig) {
logger.log("Config uses a default_server_config - validating object");
discoveryResult = await AutoDiscovery.fromDiscoveryConfig(wkConfig);
}
Expand All @@ -213,6 +213,10 @@ async function verifyServerConfig(): Promise<IConfigOptions> {
"use default_server_config instead.",
);
discoveryResult = await AutoDiscovery.findClientConfig(serverName);
if (discoveryResult["m.homeserver"].base_url === null && wkConfig) {
logger.log("Finding base_url failed but a default_server_config was found - using it as a fallback");
discoveryResult = await AutoDiscovery.fromDiscoveryConfig(wkConfig);
}
}

validatedConfig = AutoDiscoveryUtils.buildValidatedConfigFromDiscovery(serverName, discoveryResult, true);
Expand Down
20 changes: 14 additions & 6 deletions src/vector/mobile_guide/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -44,10 +44,10 @@ async function initPage(): Promise<void> {
const defaultIsUrl = config?.["default_is_url"];

const incompatibleOptions = [wkConfig, serverName, defaultHsUrl].filter((i) => !!i);
if (incompatibleOptions.length > 1) {
if (defaultHsUrl && (wkConfig || serverName)) {
return renderConfigError(
"Invalid configuration: can only specify one of default_server_config, default_server_name, " +
"or default_hs_url.",
"Invalid configuration: a default_hs_url can't be specified along with default_server_name " +
"or default_server_config",
);
}
if (incompatibleOptions.length < 1) {
Expand All @@ -57,7 +57,7 @@ async function initPage(): Promise<void> {
let hsUrl: string | undefined;
let isUrl: string | undefined;

if (typeof wkConfig?.["m.homeserver"]?.["base_url"] === "string") {
if (!serverName && typeof wkConfig?.["m.homeserver"]?.["base_url"] === "string") {
hsUrl = wkConfig["m.homeserver"]["base_url"];

if (typeof wkConfig["m.identity_server"]?.["base_url"] === "string") {
Expand All @@ -78,8 +78,16 @@ async function initPage(): Promise<void> {
}
}
} catch (e) {
logger.error(e);
return renderConfigError("Unable to fetch homeserver configuration");
if (wkConfig && wkConfig["m.homeserver"]) {
hsUrl = wkConfig["m.homeserver"]["base_url"] || undefined;

if (wkConfig["m.identity_server"]) {
isUrl = wkConfig["m.identity_server"]["base_url"] || undefined;
}
} else {
logger.error(e);
return renderConfigError("Unable to fetch homeserver configuration");
}
}
}

Expand Down
79 changes: 79 additions & 0 deletions test/app-tests/server-config-test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
/*
Copyright 2023 Yorusaka Miyabi <[email protected]>
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

import SdkConfig from "matrix-react-sdk/src/SdkConfig";
import PlatformPeg from "matrix-react-sdk/src/PlatformPeg";
import fetchMock from "fetch-mock-jest";

import { loadApp } from "../../src/vector/app";
import WebPlatform from "../../src/vector/platform/WebPlatform";

fetchMock.config.overwriteRoutes = true;

describe("Loading server config", function () {
beforeEach(async () => {
SdkConfig.reset();
PlatformPeg.set(new WebPlatform());
fetchMock.get("https://matrix-client.matrix.org/_matrix/client/versions", {
unstable_features: {},
versions: [],
});
fetchMock.get("https://matrix.org/.well-known/matrix/client", {
"m.homeserver": {
base_url: "https://matrix-client.matrix.org",
},
});
fetchMock.get("/version", "1.10.13");
});

it("should use the default_server_config", async function () {
SdkConfig.put({
default_server_config: {
"m.homeserver": {
base_url: "https://matrix-client.matrix.org",
},
},
});
await loadApp({});
expect((SdkConfig.get("validated_server_config") || {}).hsUrl).toBe("https://matrix-client.matrix.org");
});

it("should use the default_server_name when resolveable", async function () {
SdkConfig.put({
default_server_name: "matrix.org",
});
await loadApp({});
expect((SdkConfig.get("validated_server_config") || {}).hsUrl).toBe("https://matrix-client.matrix.org");
});

it(
"should not throw when both default_server_name and default_server_config is specified " +
"and default_server_name isn't resolvable",
async function () {
fetchMock.get("https://matrix.org/.well-known/matrix/client", 500);
SdkConfig.put({
default_server_name: "matrix.org",
default_server_config: {
"m.homeserver": {
base_url: "https://matrix-client.matrix.org",
},
},
});
await loadApp({});
expect((SdkConfig.get("validated_server_config") || {}).hsUrl).toBe("https://matrix-client.matrix.org");
},
);
});

0 comments on commit 93c1710

Please sign in to comment.