Skip to content
Draft
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
11 changes: 7 additions & 4 deletions src/models/room.ts
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ import { compareEventOrdering } from "./compare-event-ordering.ts";
import { KnownMembership, type Membership } from "../@types/membership.ts";
import { type Capabilities, type IRoomVersionsCapability, RoomVersionStability } from "../serverCapabilities.ts";
import { type MSC4186Hero } from "../sliding-sync.ts";
import { RoomStickyEventsStore, RoomStickyEventsEvent, type RoomStickyEventsMap } from "./room-sticky-events.ts";
import { RoomStickyEventsEvent, type RoomStickyEventsMap, RoomStickyEventsStore } from "./room-sticky-events.ts";

// These constants are used as sane defaults when the homeserver doesn't support
// the m.room_versions capability. In practice, KNOWN_SAFE_ROOM_VERSION should be
Expand Down Expand Up @@ -108,6 +108,7 @@ export interface IRecommendedVersion {
version: string;
needsUpgrade: boolean;
urgent: boolean;
deprecated: boolean;
}

// When inserting a visibility event affecting event `eventId`, we
Expand Down Expand Up @@ -685,20 +686,22 @@ export class Room extends ReadReceipt<RoomEmittedEvents, RoomEventHandlerMap> {
version: currentVersion,
needsUpgrade: false,
urgent: false,
deprecated: false,
};

// If the room is on the default version then nothing needs to change
if (currentVersion === versionCap.default) return result;

const stableVersions = Object.keys(versionCap.available).filter((v) => versionCap.available[v] === "stable");
const currentStability = versionCap.available[currentVersion] ?? RoomVersionStability.Unstable;

// Check if the room is on an unstable version. We determine urgency based
// off the version being in the Matrix spec namespace or not (if the version
// is in the current namespace and unstable, the room is probably vulnerable).
if (!stableVersions.includes(currentVersion)) {
if (currentStability !== RoomVersionStability.Stable) {
result.version = versionCap.default;
result.deprecated = currentStability === RoomVersionStability.Deprecated;
result.needsUpgrade = true;
result.urgent = !!this.getVersion().match(/^[0-9]+[0-9.]*$/g);
result.urgent = result.deprecated || !!this.getVersion().match(/^[0-9]+[0-9.]*$/g);
if (result.urgent) {
logger.warn(`URGENT upgrade required on ${this.roomId}`);
} else {
Expand Down
1 change: 1 addition & 0 deletions src/serverCapabilities.ts
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ export interface IProfileFieldsCapability extends ICapability {}
export enum RoomVersionStability {
Stable = "stable",
Unstable = "unstable",
Deprecated = "uk.timedout.msc4472.deprecated",
}

export interface IRoomVersionsCapability {
Expand Down
Loading