Allow default_server_config as a fallback config (#25682)
This commit is contained in:
parent
9ec3f79198
commit
93c17104f1
5 changed files with 105 additions and 13 deletions
|
@ -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
|
||||
|
||||
|
|
|
@ -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.",
|
||||
|
|
|
@ -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) {
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
|
|
|
@ -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) {
|
||||
|
@ -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") {
|
||||
|
@ -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");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
79
test/app-tests/server-config-test.ts
Normal file
79
test/app-tests/server-config-test.ts
Normal file
|
@ -0,0 +1,79 @@
|
|||
/*
|
||||
Copyright 2023 Yorusaka Miyabi <shadowrz@disroot.org>
|
||||
|
||||
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");
|
||||
},
|
||||
);
|
||||
});
|
Loading…
Reference in a new issue