From f8804225e5e016d74175cc87fe53d6c579cc9e61 Mon Sep 17 00:00:00 2001 From: Yorusaka Miyabi Date: Thu, 29 Jun 2023 15:16:34 +0800 Subject: [PATCH 1/7] Allow default_server_config as a fallback config The configuration provided with default_server_config can be used as a suitable fallback in case the well-known discovery failed. Using either of `default_server_config` or `default_server_name` is still supported and works like before. Signed-off-by: Yorusaka Miyabi --- src/vector/app.tsx | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/src/vector/app.tsx b/src/vector/app.tsx index 7371ccf0f01..831d64cb19d 100644 --- a/src/vector/app.tsx +++ b/src/vector/app.tsx @@ -169,13 +169,6 @@ async function verifyServerConfig(): Promise { const isUrl = config["default_is_url"]; const incompatibleOptions = [wkConfig, serverName, hsUrl].filter((i) => !!i); - if (incompatibleOptions.length > 1) { - // noinspection ExceptionCaughtLocallyJS - throw new UserFriendlyError( - "Invalid configuration: can only specify one of default_server_config, default_server_name, " + - "or default_hs_url.", - ); - } if (incompatibleOptions.length < 1) { // noinspection ExceptionCaughtLocallyJS throw new UserFriendlyError("Invalid configuration: no default server specified."); @@ -201,7 +194,7 @@ async function verifyServerConfig(): Promise { } let discoveryResult: ClientConfig | undefined; - if (wkConfig) { + if (!serverName && wkConfig) { logger.log("Config uses a default_server_config - validating object"); discoveryResult = await AutoDiscovery.fromDiscoveryConfig(wkConfig); } @@ -213,6 +206,10 @@ async function verifyServerConfig(): Promise { "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); From b8b89b1a84765a95117797d8212728ced6778878 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=9C=E5=9D=82=E9=9B=85?= <23130178+ShadowRZ@users.noreply.github.com> Date: Thu, 29 Jun 2023 18:03:40 +0800 Subject: [PATCH 2/7] Doucment the fallback behavior Also doucment the fallback behavior that would be used when both `default_server_config` and `default_server_name` are put inside config.json. Signed-off-by: Yorusaka Miyabi --- docs/config.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/config.md b/docs/config.md index a3f470fe6e5..b651781d03f 100644 --- a/docs/config.md +++ b/docs/config.md @@ -46,7 +46,9 @@ One of the following options **must** be supplied: 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". +should be considered "first". However, 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 From 8a4927620ef8017569ae607fda8fd5bc5fcb20eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=9C=E5=9D=82=E9=9B=85?= <23130178+ShadowRZ@users.noreply.github.com> Date: Thu, 29 Jun 2023 18:58:02 +0800 Subject: [PATCH 3/7] Update docs/config.md Signed-off-by: Yorusaka Miyabi --- docs/config.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/docs/config.md b/docs/config.md index b651781d03f..0666f03ccd1 100644 --- a/docs/config.md +++ b/docs/config.md @@ -45,10 +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". However, 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. +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 From d9fb27d7b98d5a6c52a7e462b9d65875da914fb6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=9C=E5=9D=82=E9=9B=85?= <23130178+ShadowRZ@users.noreply.github.com> Date: Thu, 29 Jun 2023 19:47:10 +0800 Subject: [PATCH 4/7] Update Signed-off-by: Yorusaka Miyabi --- src/i18n/strings/en_EN.json | 2 +- src/vector/app.tsx | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 0a0634199e6..b51d8cc19f7 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -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.", diff --git a/src/vector/app.tsx b/src/vector/app.tsx index 831d64cb19d..05f1cd5b85b 100644 --- a/src/vector/app.tsx +++ b/src/vector/app.tsx @@ -169,6 +169,13 @@ async function verifyServerConfig(): Promise { const isUrl = config["default_is_url"]; const incompatibleOptions = [wkConfig, serverName, hsUrl].filter((i) => !!i); + if (hsUrl && (wkConfig || serverName)) { + // noinspection ExceptionCaughtLocallyJS + throw new UserFriendlyError( + "Invalid configuration: a default_hs_url can't be specified along with default_server_name " + + "or default_server_config", + ); + } if (incompatibleOptions.length < 1) { // noinspection ExceptionCaughtLocallyJS throw new UserFriendlyError("Invalid configuration: no default server specified."); From 8561f6f23409d9b8f249c34f0ecec6aaca8be812 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=9C=E5=9D=82=E9=9B=85?= <23130178+ShadowRZ@users.noreply.github.com> Date: Fri, 30 Jun 2023 10:03:08 +0800 Subject: [PATCH 5/7] Add tests Signed-off-by: Yorusaka Miyabi --- test/app-tests/server-config-test.ts | 79 ++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 test/app-tests/server-config-test.ts diff --git a/test/app-tests/server-config-test.ts b/test/app-tests/server-config-test.ts new file mode 100644 index 00000000000..c58f55e4616 --- /dev/null +++ b/test/app-tests/server-config-test.ts @@ -0,0 +1,79 @@ +/* +Copyright 2023 Yorusaka Miyabi + +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"); + }, + ); +}); From 7d79218eb00f8cce6651d207130c0c47cee484c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=9C=E5=9D=82=E9=9B=85?= <23130178+ShadowRZ@users.noreply.github.com> Date: Fri, 30 Jun 2023 10:20:39 +0800 Subject: [PATCH 6/7] Add fallback code to mobile guide Signed-off-by: Yorusaka Miyabi --- src/vector/mobile_guide/index.ts | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/src/vector/mobile_guide/index.ts b/src/vector/mobile_guide/index.ts index 5f934407481..bf01349dca1 100644 --- a/src/vector/mobile_guide/index.ts +++ b/src/vector/mobile_guide/index.ts @@ -44,10 +44,10 @@ async function initPage(): Promise { 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) { @@ -57,7 +57,7 @@ async function initPage(): Promise { 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") { @@ -78,8 +78,16 @@ async function initPage(): Promise { } } } catch (e) { - logger.error(e); - return renderConfigError("Unable to fetch homeserver configuration"); + if (wkConfig && wkConfig["m.homeserver"]) { + hsUrl = wkConfig["m.homeserver"]["base_url"]; + + if (wkConfig["m.identity_server"]) { + isUrl = wkConfig["m.identity_server"]["base_url"]; + } + } else { + logger.error(e); + return renderConfigError("Unable to fetch homeserver configuration"); + } } } From 45421cb24c85c630652c66e123e20a98b0ac8f87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=9C=E5=9D=82=E9=9B=85?= <23130178+ShadowRZ@users.noreply.github.com> Date: Sat, 8 Jul 2023 15:20:55 +0800 Subject: [PATCH 7/7] Fix TypeScript lint errors Signed-off-by: Yorusaka Miyabi --- src/vector/mobile_guide/index.ts | 4 ++-- test/app-tests/server-config-test.ts | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/vector/mobile_guide/index.ts b/src/vector/mobile_guide/index.ts index bf01349dca1..7c14a258674 100644 --- a/src/vector/mobile_guide/index.ts +++ b/src/vector/mobile_guide/index.ts @@ -79,10 +79,10 @@ async function initPage(): Promise { } } catch (e) { if (wkConfig && wkConfig["m.homeserver"]) { - hsUrl = wkConfig["m.homeserver"]["base_url"]; + hsUrl = wkConfig["m.homeserver"]["base_url"] || undefined; if (wkConfig["m.identity_server"]) { - isUrl = wkConfig["m.identity_server"]["base_url"]; + isUrl = wkConfig["m.identity_server"]["base_url"] || undefined; } } else { logger.error(e); diff --git a/test/app-tests/server-config-test.ts b/test/app-tests/server-config-test.ts index c58f55e4616..22b83044581 100644 --- a/test/app-tests/server-config-test.ts +++ b/test/app-tests/server-config-test.ts @@ -47,16 +47,16 @@ describe("Loading server config", function () { }, }, }); - await loadApp(); - expect(SdkConfig.get("validated_server_config").hsUrl).toBe("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"); + await loadApp({}); + expect((SdkConfig.get("validated_server_config") || {}).hsUrl).toBe("https://matrix-client.matrix.org"); }); it( @@ -72,8 +72,8 @@ describe("Loading server config", function () { }, }, }); - await loadApp(); - expect(SdkConfig.get("validated_server_config").hsUrl).toBe("https://matrix-client.matrix.org"); + await loadApp({}); + expect((SdkConfig.get("validated_server_config") || {}).hsUrl).toBe("https://matrix-client.matrix.org"); }, ); });