From 3e043a6f3a2a4eebebd921e205481088de246a04 Mon Sep 17 00:00:00 2001 From: hayyaksi <193020925+hayaksi1@users.noreply.github.com> Date: Wed, 5 Aug 2026 12:51:32 +0300 Subject: [PATCH] Do not ask for a room address when the room already has one (#34499) --- .../tabs/room/SecurityRoomSettingsTab.tsx | 7 ++- .../room/SecurityRoomSettingsTab-test.tsx | 56 +++++++++++++++++++ 2 files changed, 62 insertions(+), 1 deletion(-) diff --git a/apps/web/src/components/views/settings/tabs/room/SecurityRoomSettingsTab.tsx b/apps/web/src/components/views/settings/tabs/room/SecurityRoomSettingsTab.tsx index 5bb8780b3c..65de4092fe 100644 --- a/apps/web/src/components/views/settings/tabs/room/SecurityRoomSettingsTab.tsx +++ b/apps/web/src/components/views/settings/tabs/room/SecurityRoomSettingsTab.tsx @@ -249,8 +249,13 @@ export default class SecurityRoomSettingsTab extends React.Component { + // The published addresses can live on any server, so a room can be linkable without this + // server holding a local alias for it. + const room = this.props.room; + if (room.getCanonicalAlias() || room.getAltAliases().length > 0) return true; + const cli = this.context; - const response = await cli.getLocalAliases(this.props.room.roomId); + const response = await cli.getLocalAliases(room.roomId); const localAliases = response.aliases; return Array.isArray(localAliases) && localAliases.length !== 0; } diff --git a/apps/web/test/unit-tests/components/views/settings/tabs/room/SecurityRoomSettingsTab-test.tsx b/apps/web/test/unit-tests/components/views/settings/tabs/room/SecurityRoomSettingsTab-test.tsx index 6eb3900468..f744cc1d33 100644 --- a/apps/web/test/unit-tests/components/views/settings/tabs/room/SecurityRoomSettingsTab-test.tsx +++ b/apps/web/test/unit-tests/components/views/settings/tabs/room/SecurityRoomSettingsTab-test.tsx @@ -581,4 +581,60 @@ describe("", () => { }); }); }); + + describe("public room address warning", () => { + const warning = "To link to this room, please add an address."; + + const setCanonicalAlias = (room: Room, content: object): void => { + room.currentState.setStateEvents([ + new MatrixEvent({ + type: EventType.RoomCanonicalAlias, + content, + sender: userId, + state_key: "", + room_id: room.roomId, + }), + ]); + }; + + const renderPublicRoom = async (configure?: (room: Room) => void): Promise => { + const room = new Room(roomId, client, userId); + setRoomStateEvents(room, JoinRule.Public); + configure?.(room); + getComponent(room); + await flushPromises(); + }; + + it("warns when the room has no address anywhere", async () => { + client.getLocalAliases.mockResolvedValue({ aliases: [] }); + + await renderPublicRoom(); + + expect(screen.getByText(warning)).toBeInTheDocument(); + }); + + it("does not warn when the room's main address is on another server", async () => { + client.getLocalAliases.mockResolvedValue({ aliases: [] }); + + await renderPublicRoom((room) => setCanonicalAlias(room, { alias: "#room:other.server.org" })); + + expect(screen.queryByText(warning)).not.toBeInTheDocument(); + }); + + it("does not warn when the room only has alternative addresses", async () => { + client.getLocalAliases.mockResolvedValue({ aliases: [] }); + + await renderPublicRoom((room) => setCanonicalAlias(room, { alt_aliases: ["#room:other.server.org"] })); + + expect(screen.queryByText(warning)).not.toBeInTheDocument(); + }); + + it("does not warn when the local server has an address for the room", async () => { + client.getLocalAliases.mockResolvedValue({ aliases: ["#room:server.org"] }); + + await renderPublicRoom(); + + expect(screen.queryByText(warning)).not.toBeInTheDocument(); + }); + }); });