2021-06-18 15:13:55 +00:00
|
|
|
/*
|
|
|
|
Copyright 2021 The Matrix.org Foundation C.I.C.
|
2020-03-27 13:45:21 +00:00
|
|
|
|
2021-06-18 15:13:55 +00:00
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
you may not use this file except in compliance with the License.
|
|
|
|
You may obtain a copy of the License at
|
2020-03-27 13:45:21 +00:00
|
|
|
|
2021-06-18 15:13:55 +00:00
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
See the License for the specific language governing permissions and
|
|
|
|
limitations under the License.
|
|
|
|
*/
|
|
|
|
|
|
|
|
import { MatrixClient } from "matrix-js-sdk/src/client";
|
|
|
|
import { Room } from "matrix-js-sdk/src/models/room";
|
|
|
|
|
2022-12-12 11:24:14 +00:00
|
|
|
import DMRoomMap from "./DMRoomMap";
|
2020-03-27 13:50:03 +00:00
|
|
|
|
2020-09-07 16:32:03 +00:00
|
|
|
export enum E2EStatus {
|
|
|
|
Warning = "warning",
|
|
|
|
Verified = "verified",
|
2022-12-12 11:24:14 +00:00
|
|
|
Normal = "normal",
|
2020-09-07 16:32:03 +00:00
|
|
|
}
|
|
|
|
|
2021-06-18 15:13:55 +00:00
|
|
|
export async function shieldStatusForRoom(client: MatrixClient, room: Room): Promise<E2EStatus> {
|
2021-06-29 12:11:58 +00:00
|
|
|
const members = (await room.getEncryptionTargetMembers()).map(({ userId }) => userId);
|
2020-03-27 13:45:21 +00:00
|
|
|
const inDMMap = !!DMRoomMap.shared().getUserIdForRoomId(room.roomId);
|
|
|
|
|
2020-03-27 13:50:03 +00:00
|
|
|
const verified: string[] = [];
|
|
|
|
const unverified: string[] = [];
|
2022-12-12 11:24:14 +00:00
|
|
|
members
|
|
|
|
.filter((userId) => userId !== client.getUserId())
|
2020-03-27 13:45:21 +00:00
|
|
|
.forEach((userId) => {
|
2022-12-12 11:24:14 +00:00
|
|
|
(client.checkUserTrust(userId).isCrossSigningVerified() ? verified : unverified).push(userId);
|
2020-03-27 13:45:21 +00:00
|
|
|
});
|
|
|
|
|
2020-03-28 00:21:17 +00:00
|
|
|
/* Alarm if any unverified users were verified before. */
|
|
|
|
for (const userId of unverified) {
|
|
|
|
if (client.checkUserTrust(userId).wasCrossSigningVerified()) {
|
2020-09-07 16:32:03 +00:00
|
|
|
return E2EStatus.Warning;
|
2020-03-28 00:21:17 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-03-27 13:45:21 +00:00
|
|
|
/* Check all verified user devices. */
|
|
|
|
/* Don't alarm if no other users are verified */
|
2022-12-12 11:24:14 +00:00
|
|
|
const includeUser =
|
|
|
|
(verified.length > 0 && // Don't alarm for self in rooms where nobody else is verified
|
|
|
|
!inDMMap && // Don't alarm for self in DMs 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
|
2023-02-03 15:27:47 +00:00
|
|
|
const targets = includeUser ? [...verified, client.getUserId()!] : verified;
|
2020-03-27 13:45:21 +00:00
|
|
|
for (const userId of targets) {
|
2020-04-28 17:35:16 +00:00
|
|
|
const devices = client.getStoredDevicesForUser(userId);
|
2021-06-29 12:11:58 +00:00
|
|
|
const anyDeviceNotVerified = devices.some(({ deviceId }) => {
|
2020-03-27 13:45:21 +00:00
|
|
|
return !client.checkDeviceTrust(userId, deviceId).isVerified();
|
|
|
|
});
|
|
|
|
if (anyDeviceNotVerified) {
|
2020-09-07 16:32:03 +00:00
|
|
|
return E2EStatus.Warning;
|
2020-03-27 13:45:21 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-09-07 16:32:03 +00:00
|
|
|
return unverified.length === 0 ? E2EStatus.Verified : E2EStatus.Normal;
|
2020-03-27 13:45:21 +00:00
|
|
|
}
|