Merge pull request #4303 from matrix-org/jryans/id-change-red
Show red shield for users that become unverified
This commit is contained in:
commit
2455c5a850
4 changed files with 30 additions and 7 deletions
|
@ -68,8 +68,10 @@ export const getE2EStatus = (cli, userId, devices) => {
|
||||||
return hasUnverifiedDevice ? "warning" : "verified";
|
return hasUnverifiedDevice ? "warning" : "verified";
|
||||||
}
|
}
|
||||||
const isMe = userId === cli.getUserId();
|
const isMe = userId === cli.getUserId();
|
||||||
const userVerified = cli.checkUserTrust(userId).isCrossSigningVerified();
|
const userTrust = cli.checkUserTrust(userId);
|
||||||
if (!userVerified) return "normal";
|
if (!userTrust.isCrossSigningVerified()) {
|
||||||
|
return userTrust.wasCrossSigningVerified() ? "warning" : "normal";
|
||||||
|
}
|
||||||
|
|
||||||
const anyDeviceUnverified = devices.some(device => {
|
const anyDeviceUnverified = devices.some(device => {
|
||||||
const { deviceId } = device;
|
const { deviceId } = device;
|
||||||
|
|
|
@ -121,10 +121,10 @@ export default createReactClass({
|
||||||
const cli = MatrixClientPeg.get();
|
const cli = MatrixClientPeg.get();
|
||||||
const { userId } = this.props.member;
|
const { userId } = this.props.member;
|
||||||
const isMe = userId === cli.getUserId();
|
const isMe = userId === cli.getUserId();
|
||||||
const userVerified = cli.checkUserTrust(userId).isCrossSigningVerified();
|
const userTrust = cli.checkUserTrust(userId);
|
||||||
if (!userVerified) {
|
if (!userTrust.isCrossSigningVerified()) {
|
||||||
this.setState({
|
this.setState({
|
||||||
e2eStatus: "normal",
|
e2eStatus: userTrust.wasCrossSigningVerified() ? "warning" : "normal",
|
||||||
});
|
});
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,6 +5,7 @@ interface Client {
|
||||||
getUserId: () => string;
|
getUserId: () => string;
|
||||||
checkUserTrust: (userId: string) => {
|
checkUserTrust: (userId: string) => {
|
||||||
isCrossSigningVerified: () => boolean
|
isCrossSigningVerified: () => boolean
|
||||||
|
wasCrossSigningVerified: () => boolean
|
||||||
};
|
};
|
||||||
getStoredDevicesForUser: (userId: string) => Promise<[{ deviceId: string }]>;
|
getStoredDevicesForUser: (userId: string) => Promise<[{ deviceId: string }]>;
|
||||||
checkDeviceTrust: (userId: string, deviceId: string) => {
|
checkDeviceTrust: (userId: string, deviceId: string) => {
|
||||||
|
@ -29,6 +30,13 @@ export async function shieldStatusForRoom(client: Client, room: Room): Promise<s
|
||||||
verified : unverified).push(userId);
|
verified : unverified).push(userId);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
/* Alarm if any unverified users were verified before. */
|
||||||
|
for (const userId of unverified) {
|
||||||
|
if (client.checkUserTrust(userId).wasCrossSigningVerified()) {
|
||||||
|
return "warning";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Check all verified user devices. */
|
/* Check all verified user devices. */
|
||||||
/* Don't alarm if no other users are verified */
|
/* Don't alarm if no other users are verified */
|
||||||
const includeUser = (verified.length > 0) && // Don't alarm for self in rooms where nobody else is verified
|
const includeUser = (verified.length > 0) && // Don't alarm for self in rooms where nobody else is verified
|
||||||
|
|
|
@ -6,6 +6,7 @@ function mkClient(selfTrust) {
|
||||||
getUserId: () => "@self:localhost",
|
getUserId: () => "@self:localhost",
|
||||||
checkUserTrust: (userId) => ({
|
checkUserTrust: (userId) => ({
|
||||||
isCrossSigningVerified: () => userId[1] == "T",
|
isCrossSigningVerified: () => userId[1] == "T",
|
||||||
|
wasCrossSigningVerified: () => userId[1] == "T" || userId[1] == "W",
|
||||||
}),
|
}),
|
||||||
checkDeviceTrust: (userId, deviceId) => ({
|
checkDeviceTrust: (userId, deviceId) => ({
|
||||||
isVerified: () => userId === "@self:localhost" ? selfTrust : userId[2] == "T",
|
isVerified: () => userId === "@self:localhost" ? selfTrust : userId[2] == "T",
|
||||||
|
@ -150,7 +151,7 @@ describe("shieldStatusForMembership other-trust behaviour", function() {
|
||||||
const client = mkClient(true);
|
const client = mkClient(true);
|
||||||
const room = {
|
const room = {
|
||||||
roomId: dm ? "DM" : "other",
|
roomId: dm ? "DM" : "other",
|
||||||
getEncryptionTargetMembers: () => ["@self:localhost", "@TF:h", "@TT: h"].map((userId) => ({userId})),
|
getEncryptionTargetMembers: () => ["@self:localhost", "@TF:h", "@TT:h"].map((userId) => ({userId})),
|
||||||
};
|
};
|
||||||
const status = await shieldStatusForRoom(client, room);
|
const status = await shieldStatusForRoom(client, room);
|
||||||
expect(status).toEqual(result);
|
expect(status).toEqual(result);
|
||||||
|
@ -162,7 +163,19 @@ describe("shieldStatusForMembership other-trust behaviour", function() {
|
||||||
const client = mkClient(true);
|
const client = mkClient(true);
|
||||||
const room = {
|
const room = {
|
||||||
roomId: dm ? "DM" : "other",
|
roomId: dm ? "DM" : "other",
|
||||||
getEncryptionTargetMembers: () => ["@self:localhost", "@FF:h", "@FT: h"].map((userId) => ({userId})),
|
getEncryptionTargetMembers: () => ["@self:localhost", "@FF:h", "@FT:h"].map((userId) => ({userId})),
|
||||||
|
};
|
||||||
|
const status = await shieldStatusForRoom(client, room);
|
||||||
|
expect(status).toEqual(result);
|
||||||
|
});
|
||||||
|
|
||||||
|
it.each(
|
||||||
|
[["warning", true], ["warning", false]],
|
||||||
|
)("2 was verified: returns '%s', DM = %s", async (result, dm) => {
|
||||||
|
const client = mkClient(true);
|
||||||
|
const room = {
|
||||||
|
roomId: dm ? "DM" : "other",
|
||||||
|
getEncryptionTargetMembers: () => ["@self:localhost", "@WF:h", "@FT:h"].map((userId) => ({userId})),
|
||||||
};
|
};
|
||||||
const status = await shieldStatusForRoom(client, room);
|
const status = await shieldStatusForRoom(client, room);
|
||||||
expect(status).toEqual(result);
|
expect(status).toEqual(result);
|
||||||
|
|
Loading…
Reference in a new issue