Implement third-party invite waiting room (#10229)
This commit is contained in:
parent
94950c6987
commit
db6ee53535
12 changed files with 388 additions and 40 deletions
|
@ -15,7 +15,6 @@ limitations under the License.
|
|||
*/
|
||||
|
||||
import { ClientEvent, MatrixClient } from "matrix-js-sdk/src/client";
|
||||
import { Room } from "matrix-js-sdk/src/models/room";
|
||||
import { logger } from "matrix-js-sdk/src/logger";
|
||||
|
||||
import { canEncryptToAllUsers } from "../createRoom";
|
||||
|
@ -30,7 +29,7 @@ import { createDmLocalRoom } from "./dm/createDmLocalRoom";
|
|||
import { startDm } from "./dm/startDm";
|
||||
import { resolveThreePids } from "./threepids";
|
||||
|
||||
export async function startDmOnFirstMessage(client: MatrixClient, targets: Member[]): Promise<Room> {
|
||||
export async function startDmOnFirstMessage(client: MatrixClient, targets: Member[]): Promise<string | null> {
|
||||
let resolvedTargets = targets;
|
||||
|
||||
try {
|
||||
|
@ -49,7 +48,13 @@ export async function startDmOnFirstMessage(client: MatrixClient, targets: Membe
|
|||
joining: false,
|
||||
metricsTrigger: "MessageUser",
|
||||
});
|
||||
return existingRoom;
|
||||
return existingRoom.roomId;
|
||||
}
|
||||
|
||||
if (targets.length === 1 && targets[0] instanceof ThreepidMember && privateShouldBeEncrypted()) {
|
||||
// Single 3rd-party invite and well-known promotes encryption:
|
||||
// Directly create a room and invite the other.
|
||||
return await startDm(client, targets);
|
||||
}
|
||||
|
||||
const room = await createDmLocalRoom(client, resolvedTargets);
|
||||
|
@ -59,7 +64,7 @@ export async function startDmOnFirstMessage(client: MatrixClient, targets: Membe
|
|||
joining: false,
|
||||
targets: resolvedTargets,
|
||||
});
|
||||
return room;
|
||||
return room.roomId;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -81,6 +86,8 @@ export async function createRoomFromLocalRoom(client: MatrixClient, localRoom: L
|
|||
|
||||
return startDm(client, localRoom.targets, false).then(
|
||||
(roomId) => {
|
||||
if (!roomId) throw new Error(`startDm for local room ${localRoom.roomId} didn't return a room Id`);
|
||||
|
||||
localRoom.actualRoomId = roomId;
|
||||
return waitForRoomReadyAndApplyAfterCreateCallbacks(client, localRoom);
|
||||
},
|
||||
|
@ -186,6 +193,9 @@ export interface IDMUserTileProps {
|
|||
*/
|
||||
export async function determineCreateRoomEncryptionOption(client: MatrixClient, targets: Member[]): Promise<boolean> {
|
||||
if (privateShouldBeEncrypted()) {
|
||||
// Enable encryption for a single 3rd party invite.
|
||||
if (targets.length === 1 && targets[0] instanceof ThreepidMember) return true;
|
||||
|
||||
// Check whether all users have uploaded device keys before.
|
||||
// If so, enable encryption in the new room.
|
||||
const has3PidMembers = targets.some((t) => t instanceof ThreepidMember);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue