shieldStatusForRoom: avoid deprecated MatrixClient methods (#10944)
Update this method to use modern crypto methods
This commit is contained in:
parent
606eaa5274
commit
cc842aac8a
3 changed files with 22 additions and 6 deletions
|
@ -16,6 +16,7 @@ limitations under the License.
|
||||||
|
|
||||||
import { MatrixClient } from "matrix-js-sdk/src/client";
|
import { MatrixClient } from "matrix-js-sdk/src/client";
|
||||||
import { Room } from "matrix-js-sdk/src/models/room";
|
import { Room } from "matrix-js-sdk/src/models/room";
|
||||||
|
import { logger } from "matrix-js-sdk/src/logger";
|
||||||
|
|
||||||
import DMRoomMap from "./DMRoomMap";
|
import DMRoomMap from "./DMRoomMap";
|
||||||
import { asyncSome } from "./arrays";
|
import { asyncSome } from "./arrays";
|
||||||
|
@ -27,6 +28,11 @@ export enum E2EStatus {
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function shieldStatusForRoom(client: MatrixClient, room: Room): Promise<E2EStatus> {
|
export async function shieldStatusForRoom(client: MatrixClient, room: Room): Promise<E2EStatus> {
|
||||||
|
const crypto = client.getCrypto();
|
||||||
|
if (!crypto) {
|
||||||
|
return E2EStatus.Warning;
|
||||||
|
}
|
||||||
|
|
||||||
const members = (await room.getEncryptionTargetMembers()).map(({ userId }) => userId);
|
const members = (await room.getEncryptionTargetMembers()).map(({ userId }) => userId);
|
||||||
const inDMMap = !!DMRoomMap.shared().getUserIdForRoomId(room.roomId);
|
const inDMMap = !!DMRoomMap.shared().getUserIdForRoomId(room.roomId);
|
||||||
|
|
||||||
|
@ -53,10 +59,18 @@ export async function shieldStatusForRoom(client: MatrixClient, room: Room): Pro
|
||||||
members.length !== 2) || // Don't alarm for self in 1:1 chats with other users
|
members.length !== 2) || // Don't alarm for self in 1:1 chats with other users
|
||||||
members.length === 1; // Do alarm for self if we're alone in a room
|
members.length === 1; // Do alarm for self if we're alone in a room
|
||||||
const targets = includeUser ? [...verified, client.getUserId()!] : verified;
|
const targets = includeUser ? [...verified, client.getUserId()!] : verified;
|
||||||
|
const devicesByUser = await crypto.getUserDeviceInfo(targets);
|
||||||
for (const userId of targets) {
|
for (const userId of targets) {
|
||||||
const devices = client.getStoredDevicesForUser(userId);
|
const devices = devicesByUser.get(userId);
|
||||||
const anyDeviceNotVerified = await asyncSome(devices, async ({ deviceId }) => {
|
if (!devices) {
|
||||||
const verificationStatus = await client.getCrypto()?.getDeviceVerificationStatus(userId, deviceId);
|
// getUserDeviceInfo returned nothing about this user, which means we know nothing about their device list.
|
||||||
|
// That seems odd, so treat it as a warning.
|
||||||
|
logger.warn(`No device info for user ${userId}`);
|
||||||
|
return E2EStatus.Warning;
|
||||||
|
}
|
||||||
|
|
||||||
|
const anyDeviceNotVerified = await asyncSome(devices.keys(), async (deviceId) => {
|
||||||
|
const verificationStatus = await crypto.getDeviceVerificationStatus(userId, deviceId);
|
||||||
return !verificationStatus?.isVerified();
|
return !verificationStatus?.isVerified();
|
||||||
});
|
});
|
||||||
if (anyDeviceNotVerified) {
|
if (anyDeviceNotVerified) {
|
||||||
|
|
|
@ -319,7 +319,7 @@ export const concat = (...arrays: Uint8Array[]): Uint8Array => {
|
||||||
/**
|
/**
|
||||||
* Async version of Array.every.
|
* Async version of Array.every.
|
||||||
*/
|
*/
|
||||||
export async function asyncEvery<T>(values: T[], predicate: (value: T) => Promise<boolean>): Promise<boolean> {
|
export async function asyncEvery<T>(values: Iterable<T>, predicate: (value: T) => Promise<boolean>): Promise<boolean> {
|
||||||
for (const value of values) {
|
for (const value of values) {
|
||||||
if (!(await predicate(value))) return false;
|
if (!(await predicate(value))) return false;
|
||||||
}
|
}
|
||||||
|
@ -329,7 +329,7 @@ export async function asyncEvery<T>(values: T[], predicate: (value: T) => Promis
|
||||||
/**
|
/**
|
||||||
* Async version of Array.some.
|
* Async version of Array.some.
|
||||||
*/
|
*/
|
||||||
export async function asyncSome<T>(values: T[], predicate: (value: T) => Promise<boolean>): Promise<boolean> {
|
export async function asyncSome<T>(values: Iterable<T>, predicate: (value: T) => Promise<boolean>): Promise<boolean> {
|
||||||
for (const value of values) {
|
for (const value of values) {
|
||||||
if (await predicate(value)) return true;
|
if (await predicate(value)) return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,12 +27,14 @@ function mkClient(selfTrust = false) {
|
||||||
Promise.resolve({
|
Promise.resolve({
|
||||||
isVerified: () => (userId === "@self:localhost" ? selfTrust : userId[2] == "T"),
|
isVerified: () => (userId === "@self:localhost" ? selfTrust : userId[2] == "T"),
|
||||||
}),
|
}),
|
||||||
|
getUserDeviceInfo: async (userIds: string[]) => {
|
||||||
|
return new Map(userIds.map((u) => [u, new Map([["DEVICE", {}]])]));
|
||||||
|
},
|
||||||
}),
|
}),
|
||||||
checkUserTrust: (userId: string) => ({
|
checkUserTrust: (userId: string) => ({
|
||||||
isCrossSigningVerified: () => userId[1] == "T",
|
isCrossSigningVerified: () => userId[1] == "T",
|
||||||
wasCrossSigningVerified: () => userId[1] == "T" || userId[1] == "W",
|
wasCrossSigningVerified: () => userId[1] == "T" || userId[1] == "W",
|
||||||
}),
|
}),
|
||||||
getStoredDevicesForUser: (userId: string) => ["DEVICE"],
|
|
||||||
} as unknown as MatrixClient;
|
} as unknown as MatrixClient;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue