Skip to content

Commit

Permalink
[Backport staging] Broaden spec version support (#4016)
Browse files Browse the repository at this point in the history
Co-authored-by: Richard van der Hoff <[email protected]>
Fixes #3915.
  • Loading branch information
RiotRobot committed Jan 18, 2024
1 parent b9a107f commit abd920f
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 12 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
This is the [Matrix](https://matrix.org) Client-Server SDK for JavaScript and TypeScript. This SDK can be run in a
browser or in Node.js.

#### Minimum Matrix server version: v1.5
#### Minimum Matrix server version: v1.1

The Matrix specification is constantly evolving - while this SDK aims for maximum backwards compatibility, it only
guarantees that a feature will be supported for at least 4 spec releases. For example, if a feature the js-sdk supports
Expand Down
30 changes: 23 additions & 7 deletions src/autodiscovery.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ import {
validateWellKnownAuthentication,
} from "./oidc/validate";
import { OidcError } from "./oidc/error";
import { MINIMUM_MATRIX_VERSION } from "./version-support";
import { SUPPORTED_MATRIX_VERSIONS } from "./version-support";

// Dev note: Auto discovery is part of the spec.
// See: https://matrix.org/docs/spec/client_server/r0.4.0.html#server-discovery
Expand All @@ -51,7 +51,10 @@ export enum AutoDiscoveryError {
InvalidIs = "Invalid identity server discovery response",
MissingWellknown = "No .well-known JSON file found",
InvalidJson = "Invalid JSON",
HomeserverTooOld = "The homeserver does not meet the minimum version requirements",
UnsupportedHomeserverSpecVersion = "The homeserver does not meet the version requirements",

/** @deprecated Replaced by `UnsupportedHomeserverSpecVersion` */
HomeserverTooOld = UnsupportedHomeserverSpecVersion,
// TODO: Implement when Sydent supports the `/versions` endpoint - https://github.com/matrix-org/sydent/issues/424
//IdentityServerTooOld = "The identity server does not meet the minimum version requirements",
}
Expand Down Expand Up @@ -112,7 +115,11 @@ export class AutoDiscovery {

public static readonly ERROR_INVALID_JSON = AutoDiscoveryError.InvalidJson;

public static readonly ERROR_HOMESERVER_TOO_OLD = AutoDiscoveryError.HomeserverTooOld;
public static readonly ERROR_UNSUPPORTED_HOMESERVER_SPEC_VERSION =
AutoDiscoveryError.UnsupportedHomeserverSpecVersion;

/** @deprecated Replaced by ERROR_UNSUPPORTED_HOMESERVER_SPEC_VERSION */
public static readonly ERROR_HOMESERVER_TOO_OLD = AutoDiscovery.ERROR_UNSUPPORTED_HOMESERVER_SPEC_VERSION;

public static readonly ALL_ERRORS = Object.keys(AutoDiscoveryError) as AutoDiscoveryError[];

Expand Down Expand Up @@ -216,10 +223,19 @@ export class AutoDiscovery {
return Promise.resolve(clientConfig);
}

// Step 3.1: Non-spec check to ensure the server will actually work for us
if (!hsVersions.raw!["versions"].includes(MINIMUM_MATRIX_VERSION)) {
logger.error("Homeserver does not meet minimum version requirements");
clientConfig["m.homeserver"].error = AutoDiscovery.ERROR_HOMESERVER_TOO_OLD;
// Step 3.1: Non-spec check to ensure the server will actually work for us. We need to check if
// any of the versions in `SUPPORTED_MATRIX_VERSIONS` are listed in the /versions response.
const hsVersionSet = new Set(hsVersions.raw!["versions"]);
let supportedVersionFound = false;
for (const version of SUPPORTED_MATRIX_VERSIONS) {
if (hsVersionSet.has(version)) {
supportedVersionFound = true;
break;
}
}
if (!supportedVersionFound) {
logger.error("Homeserver does not meet version requirements");
clientConfig["m.homeserver"].error = AutoDiscovery.ERROR_UNSUPPORTED_HOMESERVER_SPEC_VERSION;

// Supply the base_url to the caller because they may be ignoring liveliness
// errors, like this one.
Expand Down
21 changes: 17 additions & 4 deletions src/version-support.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,22 @@ limitations under the License.
*/

/**
* The minimum Matrix specification version the js-sdk supports.
* A list of the spec versions which the js-sdk is compatible with.
*
* (This means that we require any servers we connect to to declare support for this spec version, so it is important
* for it not to be too old, as well as not too new.)
* In practice, this means: when we connect to a server, it must declare support for one of the versions in this list.
*
* Note that it does not *necessarily* mean that the js-sdk has good support for all the features in the listed spec
* versions; only that we should be able to provide a base level of functionality with a server that offers support for
* any of the listed versions.
*/
export const SUPPORTED_MATRIX_VERSIONS = ["v1.1", "v1.2", "v1.3", "v1.4", "v1.5", "v1.6", "v1.7", "v1.8", "v1.9"];

/**
* The oldest Matrix specification version the js-sdk supports.
*/
export const MINIMUM_MATRIX_VERSION = SUPPORTED_MATRIX_VERSIONS[0];

/**
* The most recent Matrix specification version the js-sdk supports.
*/
export const MINIMUM_MATRIX_VERSION = "v1.5";
export const MAXIMUM_MATRIX_VERSION = SUPPORTED_MATRIX_VERSIONS[SUPPORTED_MATRIX_VERSIONS.length - 1];

0 comments on commit abd920f

Please sign in to comment.