initial work on room history key sharing, take 2
This commit is contained in:
parent
588e94e813
commit
7f141276ff
3 changed files with 57 additions and 6 deletions
|
@ -42,6 +42,7 @@ import {UIFeature} from "../../../settings/UIFeature";
|
||||||
import CountlyAnalytics from "../../../CountlyAnalytics";
|
import CountlyAnalytics from "../../../CountlyAnalytics";
|
||||||
import {Room} from "matrix-js-sdk/src/models/room";
|
import {Room} from "matrix-js-sdk/src/models/room";
|
||||||
import { MatrixCall } from 'matrix-js-sdk/src/webrtc/call';
|
import { MatrixCall } from 'matrix-js-sdk/src/webrtc/call';
|
||||||
|
import {getAddressType} from "../../../UserAddress";
|
||||||
|
|
||||||
// we have a number of types defined from the Matrix spec which can't reasonably be altered here.
|
// we have a number of types defined from the Matrix spec which can't reasonably be altered here.
|
||||||
/* eslint-disable camelcase */
|
/* eslint-disable camelcase */
|
||||||
|
@ -676,14 +677,15 @@ export default class InviteDialog extends React.PureComponent<IInviteDialogProps
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
_inviteUsers = () => {
|
_inviteUsers = async () => {
|
||||||
const startTime = CountlyAnalytics.getTimestamp();
|
const startTime = CountlyAnalytics.getTimestamp();
|
||||||
this.setState({busy: true});
|
this.setState({busy: true});
|
||||||
this._convertFilter();
|
this._convertFilter();
|
||||||
const targets = this._convertFilter();
|
const targets = this._convertFilter();
|
||||||
const targetIds = targets.map(t => t.userId);
|
const targetIds = targets.map(t => t.userId);
|
||||||
|
|
||||||
const room = MatrixClientPeg.get().getRoom(this.props.roomId);
|
const cli = MatrixClientPeg.get();
|
||||||
|
const room = cli.getRoom(this.props.roomId);
|
||||||
if (!room) {
|
if (!room) {
|
||||||
console.error("Failed to find the room to invite users to");
|
console.error("Failed to find the room to invite users to");
|
||||||
this.setState({
|
this.setState({
|
||||||
|
@ -693,12 +695,34 @@ export default class InviteDialog extends React.PureComponent<IInviteDialogProps
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
inviteMultipleToRoom(this.props.roomId, targetIds).then(result => {
|
try {
|
||||||
|
const result = await inviteMultipleToRoom(this.props.roomId, targetIds)
|
||||||
CountlyAnalytics.instance.trackSendInvite(startTime, this.props.roomId, targetIds.length);
|
CountlyAnalytics.instance.trackSendInvite(startTime, this.props.roomId, targetIds.length);
|
||||||
if (!this._shouldAbortAfterInviteError(result)) { // handles setting error message too
|
if (!this._shouldAbortAfterInviteError(result)) { // handles setting error message too
|
||||||
this.props.onFinished();
|
this.props.onFinished();
|
||||||
}
|
}
|
||||||
}).catch(err => {
|
|
||||||
|
if (cli.isRoomEncrypted(this.props.roomId) &&
|
||||||
|
SettingsStore.getValue("feature_room_history_key_sharing")) {
|
||||||
|
const visibilityEvent = room.currentState.getStateEvents(
|
||||||
|
"m.room.history_visibility", "",
|
||||||
|
);
|
||||||
|
const visibility = visibilityEvent && visibilityEvent.getContent() &&
|
||||||
|
visibilityEvent.getContent().history_visibility;
|
||||||
|
if (visibility == "world_readable" || visibility == "shared") {
|
||||||
|
const invitedUsers = [];
|
||||||
|
for (const [addr, state] of Object.entries(result.states)) {
|
||||||
|
if (state === "invited" && getAddressType(addr) === "mx-user-id") {
|
||||||
|
invitedUsers.push(addr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
console.log("Sharing history with", invitedUsers);
|
||||||
|
cli.sendSharedHistoryKeys(
|
||||||
|
this.props.roomId, invitedUsers,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
console.error(err);
|
console.error(err);
|
||||||
this.setState({
|
this.setState({
|
||||||
busy: false,
|
busy: false,
|
||||||
|
@ -706,7 +730,7 @@ export default class InviteDialog extends React.PureComponent<IInviteDialogProps
|
||||||
"We couldn't invite those users. Please check the users you want to invite and try again.",
|
"We couldn't invite those users. Please check the users you want to invite and try again.",
|
||||||
),
|
),
|
||||||
});
|
});
|
||||||
});
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
_transferCall = async () => {
|
_transferCall = async () => {
|
||||||
|
@ -1187,10 +1211,12 @@ export default class InviteDialog extends React.PureComponent<IInviteDialogProps
|
||||||
let helpText;
|
let helpText;
|
||||||
let buttonText;
|
let buttonText;
|
||||||
let goButtonFn;
|
let goButtonFn;
|
||||||
|
let keySharingWarning = <span />;
|
||||||
|
|
||||||
const identityServersEnabled = SettingsStore.getValue(UIFeature.IdentityServer);
|
const identityServersEnabled = SettingsStore.getValue(UIFeature.IdentityServer);
|
||||||
|
|
||||||
const userId = MatrixClientPeg.get().getUserId();
|
const cli = MatrixClientPeg.get();
|
||||||
|
const userId = cli.getUserId();
|
||||||
if (this.props.kind === KIND_DM) {
|
if (this.props.kind === KIND_DM) {
|
||||||
title = _t("Direct Messages");
|
title = _t("Direct Messages");
|
||||||
|
|
||||||
|
@ -1281,6 +1307,22 @@ export default class InviteDialog extends React.PureComponent<IInviteDialogProps
|
||||||
|
|
||||||
buttonText = _t("Invite");
|
buttonText = _t("Invite");
|
||||||
goButtonFn = this._inviteUsers;
|
goButtonFn = this._inviteUsers;
|
||||||
|
|
||||||
|
if (SettingsStore.getValue("feature_room_history_key_sharing") &&
|
||||||
|
cli.isRoomEncrypted(this.props.roomId)) {
|
||||||
|
const room = cli.getRoom(this.props.roomId);
|
||||||
|
const visibilityEvent = room.currentState.getStateEvents(
|
||||||
|
"m.room.history_visibility", "",
|
||||||
|
);
|
||||||
|
const visibility = visibilityEvent && visibilityEvent.getContent() &&
|
||||||
|
visibilityEvent.getContent().history_visibility;
|
||||||
|
if (visibility == "world_readable" || visibility == "shared") {
|
||||||
|
keySharingWarning =
|
||||||
|
<div>
|
||||||
|
{_t("Note: Decryption keys for old messages will be shared with invited users.")}
|
||||||
|
</div>;
|
||||||
|
}
|
||||||
|
}
|
||||||
} else if (this.props.kind === KIND_CALL_TRANSFER) {
|
} else if (this.props.kind === KIND_CALL_TRANSFER) {
|
||||||
title = _t("Transfer");
|
title = _t("Transfer");
|
||||||
buttonText = _t("Transfer");
|
buttonText = _t("Transfer");
|
||||||
|
@ -1314,6 +1356,7 @@ export default class InviteDialog extends React.PureComponent<IInviteDialogProps
|
||||||
{spinner}
|
{spinner}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
{keySharingWarning}
|
||||||
{this._renderIdentityServerWarning()}
|
{this._renderIdentityServerWarning()}
|
||||||
<div className='error'>{this.state.errorText}</div>
|
<div className='error'>{this.state.errorText}</div>
|
||||||
<div className='mx_InviteDialog_userSections'>
|
<div className='mx_InviteDialog_userSections'>
|
||||||
|
|
|
@ -791,6 +791,7 @@
|
||||||
"Show message previews for reactions in DMs": "Show message previews for reactions in DMs",
|
"Show message previews for reactions in DMs": "Show message previews for reactions in DMs",
|
||||||
"Show message previews for reactions in all rooms": "Show message previews for reactions in all rooms",
|
"Show message previews for reactions in all rooms": "Show message previews for reactions in all rooms",
|
||||||
"Offline encrypted messaging using dehydrated devices": "Offline encrypted messaging using dehydrated devices",
|
"Offline encrypted messaging using dehydrated devices": "Offline encrypted messaging using dehydrated devices",
|
||||||
|
"Share decryption keys for room history when inviting users": "Share decryption keys for room history when inviting users",
|
||||||
"Enable advanced debugging for the room list": "Enable advanced debugging for the room list",
|
"Enable advanced debugging for the room list": "Enable advanced debugging for the room list",
|
||||||
"Show info about bridges in room settings": "Show info about bridges in room settings",
|
"Show info about bridges in room settings": "Show info about bridges in room settings",
|
||||||
"Font size": "Font size",
|
"Font size": "Font size",
|
||||||
|
@ -2153,6 +2154,7 @@
|
||||||
"Go": "Go",
|
"Go": "Go",
|
||||||
"Invite someone using their name, email address, username (like <userId/>) or <a>share this room</a>.": "Invite someone using their name, email address, username (like <userId/>) or <a>share this room</a>.",
|
"Invite someone using their name, email address, username (like <userId/>) or <a>share this room</a>.": "Invite someone using their name, email address, username (like <userId/>) or <a>share this room</a>.",
|
||||||
"Invite someone using their name, username (like <userId/>) or <a>share this room</a>.": "Invite someone using their name, username (like <userId/>) or <a>share this room</a>.",
|
"Invite someone using their name, username (like <userId/>) or <a>share this room</a>.": "Invite someone using their name, username (like <userId/>) or <a>share this room</a>.",
|
||||||
|
"Note: Decryption keys for old messages will be shared with invited users.": "Note: Decryption keys for old messages will be shared with invited users.",
|
||||||
"Transfer": "Transfer",
|
"Transfer": "Transfer",
|
||||||
"a new master key signature": "a new master key signature",
|
"a new master key signature": "a new master key signature",
|
||||||
"a new cross-signing key signature": "a new cross-signing key signature",
|
"a new cross-signing key signature": "a new cross-signing key signature",
|
||||||
|
|
|
@ -214,6 +214,12 @@ export const SETTINGS: {[setting: string]: ISetting} = {
|
||||||
supportedLevels: LEVELS_FEATURE,
|
supportedLevels: LEVELS_FEATURE,
|
||||||
default: false,
|
default: false,
|
||||||
},
|
},
|
||||||
|
"feature_room_history_key_sharing": {
|
||||||
|
isFeature: true,
|
||||||
|
displayName: _td("Share decryption keys for room history when inviting users"),
|
||||||
|
supportedLevels: LEVELS_FEATURE,
|
||||||
|
default: false,
|
||||||
|
},
|
||||||
"advancedRoomListLogging": {
|
"advancedRoomListLogging": {
|
||||||
// TODO: Remove flag before launch: https://github.com/vector-im/element-web/issues/14231
|
// TODO: Remove flag before launch: https://github.com/vector-im/element-web/issues/14231
|
||||||
displayName: _td("Enable advanced debugging for the room list"),
|
displayName: _td("Enable advanced debugging for the room list"),
|
||||||
|
|
Loading…
Reference in a new issue