Bug 1715815 - Show matrix conversation encryption state in UI. r=clokep
Differential Revision: https://phabricator.services.mozilla.com/D120633 --HG-- extra : moz-landing-system : lando
This commit is contained in:
Родитель
c52361f028
Коммит
34e1fce229
|
@ -207,3 +207,4 @@ message.alias.removed=%1$S removed %2$S as alternative address for this room.
|
||||||
# %3$S is a comma delmited list of added addresses.
|
# %3$S is a comma delmited list of added addresses.
|
||||||
message.alias.removedAndAdded=%1$S removed %2$S and added %3$S as address for this room.
|
message.alias.removedAndAdded=%1$S removed %2$S and added %3$S as address for this room.
|
||||||
message.spaceNotSupported=This room is a space, which is not supported.
|
message.spaceNotSupported=This room is a space, which is not supported.
|
||||||
|
message.encryptionStart=Messages in this conversation are now end-to-end encrypted.
|
||||||
|
|
|
@ -327,15 +327,9 @@ MatrixRoom.prototype = {
|
||||||
* @param {string} msg - Message to send.
|
* @param {string} msg - Message to send.
|
||||||
*/
|
*/
|
||||||
sendMsg(msg) {
|
sendMsg(msg) {
|
||||||
let content = {
|
this._account._client.sendTextMessage(this._roomId, msg).catch(error => {
|
||||||
body: msg,
|
this._account.ERROR("Failed to send message to: " + this._roomId);
|
||||||
msgtype: MsgType.Text,
|
});
|
||||||
};
|
|
||||||
this._account._client
|
|
||||||
.sendEvent(this._roomId, EventType.RoomMessage, content, "")
|
|
||||||
.catch(error => {
|
|
||||||
this._account.ERROR("Failed to send message to: " + this._roomId);
|
|
||||||
});
|
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -510,7 +504,17 @@ MatrixRoom.prototype = {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const eventType = event.getType();
|
const eventType = event.getType();
|
||||||
if (eventType === EventType.RoomMessage) {
|
if (
|
||||||
|
eventType === EventType.RoomMessage ||
|
||||||
|
eventType === EventType.RoomMessageEncrypted
|
||||||
|
) {
|
||||||
|
if (event.isEncrypted()) {
|
||||||
|
const clearContent = event.getClearContent();
|
||||||
|
if (!clearContent) {
|
||||||
|
this.ERROR("Missing decrypted event content for " + event.getId());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
const isOutgoing = event.getSender() == this._account.userId;
|
const isOutgoing = event.getSender() == this._account.userId;
|
||||||
const eventContent = event.getContent();
|
const eventContent = event.getContent();
|
||||||
// Only print server notices when we're in a server notice room.
|
// Only print server notices when we're in a server notice room.
|
||||||
|
@ -529,13 +533,24 @@ MatrixRoom.prototype = {
|
||||||
this.writeMessage(event.getSender(), message, {
|
this.writeMessage(event.getSender(), message, {
|
||||||
outgoing: isOutgoing,
|
outgoing: isOutgoing,
|
||||||
incoming: !isOutgoing,
|
incoming: !isOutgoing,
|
||||||
system: [MsgType.Notice, "m.server_notice"].includes(
|
system: [MsgType.Notice, "m.server_notice", "m.bad.encrypted"].includes(
|
||||||
eventContent.msgtype
|
eventContent.msgtype
|
||||||
),
|
),
|
||||||
time: Math.floor(event.getDate() / 1000),
|
time: Math.floor(event.getDate() / 1000),
|
||||||
_alias: event.sender.name,
|
_alias: event.sender.name,
|
||||||
delayed,
|
delayed,
|
||||||
event,
|
event,
|
||||||
|
isEncrypted: event.isEncrypted(),
|
||||||
|
});
|
||||||
|
} else if (eventType === EventType.RoomEncryption) {
|
||||||
|
this.notifyObservers(this, "update-conv-encryption");
|
||||||
|
this.writeMessage(event.getSender(), _("message.encryptionStart"), {
|
||||||
|
system: true,
|
||||||
|
time: Math.floor(event.getDate() / 1000),
|
||||||
|
_alias: event.sender.name,
|
||||||
|
delayed,
|
||||||
|
event,
|
||||||
|
isEncrypted: event.isEncrypted(),
|
||||||
});
|
});
|
||||||
} else if (eventType == EventType.RoomTopic) {
|
} else if (eventType == EventType.RoomTopic) {
|
||||||
this.setTopic(event.getContent().topic, event.getSender());
|
this.setTopic(event.getContent().topic, event.getSender());
|
||||||
|
@ -545,6 +560,8 @@ MatrixRoom.prototype = {
|
||||||
system: true,
|
system: true,
|
||||||
incoming: true,
|
incoming: true,
|
||||||
time: Math.floor(event.getDate() / 1000),
|
time: Math.floor(event.getDate() / 1000),
|
||||||
|
event,
|
||||||
|
isEncrypted: event.isEncrypted(),
|
||||||
});
|
});
|
||||||
let newConversation = this._account.getGroupConversation(
|
let newConversation = this._account.getGroupConversation(
|
||||||
event.getContent().replacement_room,
|
event.getContent().replacement_room,
|
||||||
|
@ -572,6 +589,7 @@ MatrixRoom.prototype = {
|
||||||
_alias: event.sender.name,
|
_alias: event.sender.name,
|
||||||
delayed,
|
delayed,
|
||||||
event,
|
event,
|
||||||
|
isEncrypted: event.isEncrypted(),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
this._mostRecentEventId = event.getId();
|
this._mostRecentEventId = event.getId();
|
||||||
|
@ -921,6 +939,35 @@ MatrixRoom.prototype = {
|
||||||
|
|
||||||
updateTyping: GenericConvIMPrototype.updateTyping,
|
updateTyping: GenericConvIMPrototype.updateTyping,
|
||||||
typingState: Ci.prplIConvIM.NOT_TYPING,
|
typingState: Ci.prplIConvIM.NOT_TYPING,
|
||||||
|
|
||||||
|
get encryptionState() {
|
||||||
|
if (
|
||||||
|
!this._account._client.isCryptoEnabled() ||
|
||||||
|
!this.room.currentState.mayClientSendStateEvent(
|
||||||
|
EventType.RoomEncryption,
|
||||||
|
this._account._client
|
||||||
|
)
|
||||||
|
) {
|
||||||
|
return Ci.prplIConversation.ENCRYPTION_NOT_SUPPORTED;
|
||||||
|
}
|
||||||
|
if (!this._account._client.isRoomEncrypted(this._roomId)) {
|
||||||
|
return Ci.prplIConversation.ENCRYPTION_AVAILABLE;
|
||||||
|
}
|
||||||
|
if (this.room.hasUnverifiedDevices()) {
|
||||||
|
return Ci.prplIConversation.ENCRYPTION_ENABLED;
|
||||||
|
}
|
||||||
|
return Ci.prplIConversation.ENCRYPTION_TRUSTED;
|
||||||
|
},
|
||||||
|
initializeEncryption() {
|
||||||
|
if (this._account._client.isRoomEncrypted(this._roomId)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this._account._client.sendStateEvent(
|
||||||
|
this._roomId,
|
||||||
|
EventType.RoomEncryption,
|
||||||
|
{ algorithm: "m.megolm.v1.aes-sha2" }
|
||||||
|
);
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1336,6 +1383,11 @@ MatrixAccount.prototype = {
|
||||||
if (toStartOfTimeline || this._catchingUp || room.isSpaceRoom()) {
|
if (toStartOfTimeline || this._catchingUp || room.isSpaceRoom()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
// Encrypted events are handled through separate SDK event to wait for
|
||||||
|
// decryption
|
||||||
|
if (event.isEncrypted()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
let conv = this.roomList.get(room.roomId);
|
let conv = this.roomList.get(room.roomId);
|
||||||
if (!conv) {
|
if (!conv) {
|
||||||
return;
|
return;
|
||||||
|
@ -1343,6 +1395,17 @@ MatrixAccount.prototype = {
|
||||||
conv.addEvent(event);
|
conv.addEvent(event);
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
this._client.on("Event.decrypted", (event, error) => {
|
||||||
|
if (error) {
|
||||||
|
this.ERROR(error);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
let conv = this.roomList.get(event.getRoomId());
|
||||||
|
if (!conv) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
conv.addEvent(event);
|
||||||
|
});
|
||||||
// Update the chat participant information.
|
// Update the chat participant information.
|
||||||
this._client.on("RoomMember.name", this.updateRoomMember.bind(this));
|
this._client.on("RoomMember.name", this.updateRoomMember.bind(this));
|
||||||
this._client.on("RoomMember.powerLevel", this.updateRoomMember.bind(this));
|
this._client.on("RoomMember.powerLevel", this.updateRoomMember.bind(this));
|
||||||
|
@ -2207,4 +2270,7 @@ MatrixProtocol.prototype = {
|
||||||
get passwordOptional() {
|
get passwordOptional() {
|
||||||
return true;
|
return true;
|
||||||
},
|
},
|
||||||
|
get canEncrypt() {
|
||||||
|
return true;
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
|
@ -7,9 +7,7 @@ this.EXPORTED_SYMBOLS = ["commands"];
|
||||||
var { XPCOMUtils, l10nHelper } = ChromeUtils.import(
|
var { XPCOMUtils, l10nHelper } = ChromeUtils.import(
|
||||||
"resource:///modules/imXPCOMUtils.jsm"
|
"resource:///modules/imXPCOMUtils.jsm"
|
||||||
);
|
);
|
||||||
var { EventType, MsgType } = ChromeUtils.import(
|
var { EventType } = ChromeUtils.import("resource:///modules/matrix-sdk.jsm");
|
||||||
"resource:///modules/matrix-sdk.jsm"
|
|
||||||
);
|
|
||||||
|
|
||||||
XPCOMUtils.defineLazyGetter(this, "_", () =>
|
XPCOMUtils.defineLazyGetter(this, "_", () =>
|
||||||
l10nHelper("chrome://chat/locale/matrix.properties")
|
l10nHelper("chrome://chat/locale/matrix.properties")
|
||||||
|
@ -433,13 +431,9 @@ var commands = [
|
||||||
get helpString() {
|
get helpString() {
|
||||||
return _("command.me", "me");
|
return _("command.me", "me");
|
||||||
},
|
},
|
||||||
run: clientCommand("sendEvent", 1, {
|
run: clientCommand("sendEmoteMessage", 1, {
|
||||||
formatParams(conv, [message]) {
|
formatParams(conv, [message]) {
|
||||||
const content = {
|
return [conv._roomId, message];
|
||||||
body: message,
|
|
||||||
msgtype: MsgType.Emote,
|
|
||||||
};
|
|
||||||
return [conv._roomId, EventType.RoomMessage, content];
|
|
||||||
},
|
},
|
||||||
}),
|
}),
|
||||||
},
|
},
|
||||||
|
|
|
@ -239,6 +239,9 @@ add_task(async function test_addEventTombstone() {
|
||||||
getDate() {
|
getDate() {
|
||||||
return new Date();
|
return new Date();
|
||||||
},
|
},
|
||||||
|
isEncrypted() {
|
||||||
|
return false;
|
||||||
|
},
|
||||||
};
|
};
|
||||||
const conversation = getRoom(true);
|
const conversation = getRoom(true);
|
||||||
const newText = waitForNotification(conversation, "new-text");
|
const newText = waitForNotification(conversation, "new-text");
|
||||||
|
@ -278,6 +281,9 @@ function makeEvent(sender, content = {}, redacted = false) {
|
||||||
getId() {
|
getId() {
|
||||||
return 0;
|
return 0;
|
||||||
},
|
},
|
||||||
|
isEncrypted() {
|
||||||
|
return false;
|
||||||
|
},
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче