Merge branch 'develop' into t3chguy/rageshake_xsign_debug

This commit is contained in:
Michael Telatynski 2020-05-12 09:44:49 +01:00 committed by GitHub
commit 03ad8a606a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
9 changed files with 75 additions and 50 deletions

View file

@ -236,12 +236,20 @@ export default class CreateSecretStorageDialog extends React.PureComponent {
try { try {
if (force) { if (force) {
console.log("Forcing secret storage reset"); // log something so we can debug this later
await cli.bootstrapSecretStorage({ await cli.bootstrapSecretStorage({
authUploadDeviceSigningKeys: this._doBootstrapUIAuth, authUploadDeviceSigningKeys: this._doBootstrapUIAuth,
createSecretStorageKey: async () => this._recoveryKey, createSecretStorageKey: async () => this._recoveryKey,
setupNewKeyBackup: true, setupNewKeyBackup: this.state.useKeyBackup,
setupNewSecretStorage: true, setupNewSecretStorage: true,
}); });
if (!this.state.useKeyBackup && this.state.backupInfo) {
// If the user is resetting their cross-signing keys and doesn't want
// key backup (but had it enabled before), delete the key backup as it's
// no longer valid.
console.log("Deleting invalid key backup (secrets have been reset; key backup not requested)");
await cli.deleteKeyBackupVersion(this.state.backupInfo.version);
}
} else { } else {
await cli.bootstrapSecretStorage({ await cli.bootstrapSecretStorage({
authUploadDeviceSigningKeys: this._doBootstrapUIAuth, authUploadDeviceSigningKeys: this._doBootstrapUIAuth,

View file

@ -1717,8 +1717,11 @@ export default createReactClass({
} else { } else {
const myUserId = this.context.credentials.userId; const myUserId = this.context.credentials.userId;
const myMember = this.state.room.getMember(myUserId); const myMember = this.state.room.getMember(myUserId);
const inviteEvent = myMember.events.member; const inviteEvent = myMember ? myMember.events.member : null;
var inviterName = inviteEvent.sender ? inviteEvent.sender.name : inviteEvent.getSender(); let inviterName = _t("Unknown");
if (inviteEvent) {
inviterName = inviteEvent.sender ? inviteEvent.sender.name : inviteEvent.getSender();
}
// We deliberately don't try to peek into invites, even if we have permission to peek // We deliberately don't try to peek into invites, even if we have permission to peek
// as they could be a spam vector. // as they could be a spam vector.

View file

@ -267,6 +267,7 @@ export default createReactClass({
dis.dispatch({action: 'start_login'}); dis.dispatch({action: 'start_login'});
} else { } else {
this.setState({ this.setState({
serverErrorIsFatal: true, // fatal because user cannot continue on this server
errorText: _t("Registration has been disabled on this homeserver."), errorText: _t("Registration has been disabled on this homeserver."),
// add empty flows array to get rid of spinner // add empty flows array to get rid of spinner
flows: [], flows: [],

View file

@ -130,22 +130,24 @@ export default createReactClass({
}, },
onViewSourceClick: function() { onViewSourceClick: function() {
const ev = this.props.mxEvent.replacingEvent() || this.props.mxEvent;
const ViewSource = sdk.getComponent('structures.ViewSource'); const ViewSource = sdk.getComponent('structures.ViewSource');
Modal.createTrackedDialog('View Event Source', '', ViewSource, { Modal.createTrackedDialog('View Event Source', '', ViewSource, {
roomId: this.props.mxEvent.getRoomId(), roomId: ev.getRoomId(),
eventId: this.props.mxEvent.getId(), eventId: ev.getId(),
content: this.props.mxEvent.event, content: ev.event,
}, 'mx_Dialog_viewsource'); }, 'mx_Dialog_viewsource');
this.closeMenu(); this.closeMenu();
}, },
onViewClearSourceClick: function() { onViewClearSourceClick: function() {
const ev = this.props.mxEvent.replacingEvent() || this.props.mxEvent;
const ViewSource = sdk.getComponent('structures.ViewSource'); const ViewSource = sdk.getComponent('structures.ViewSource');
Modal.createTrackedDialog('View Clear Event Source', '', ViewSource, { Modal.createTrackedDialog('View Clear Event Source', '', ViewSource, {
roomId: this.props.mxEvent.getRoomId(), roomId: ev.getRoomId(),
eventId: this.props.mxEvent.getId(), eventId: ev.getId(),
// FIXME: _clearEvent is private // FIXME: _clearEvent is private
content: this.props.mxEvent._clearEvent, content: ev._clearEvent,
}, 'mx_Dialog_viewsource'); }, 'mx_Dialog_viewsource');
this.closeMenu(); this.closeMenu();
}, },

View file

@ -23,6 +23,7 @@ import { MatrixClient } from 'matrix-js-sdk';
import Modal from '../../../../Modal'; import Modal from '../../../../Modal';
import { _t } from '../../../../languageHandler'; import { _t } from '../../../../languageHandler';
import { accessSecretStorage } from '../../../../CrossSigningManager'; import { accessSecretStorage } from '../../../../CrossSigningManager';
import SettingsStore from "../../../../settings/SettingsStore";
const RESTORE_TYPE_PASSPHRASE = 0; const RESTORE_TYPE_PASSPHRASE = 0;
const RESTORE_TYPE_RECOVERYKEY = 1; const RESTORE_TYPE_RECOVERYKEY = 1;
@ -89,14 +90,21 @@ export default class RestoreKeyBackupDialog extends React.PureComponent {
_onResetRecoveryClick = () => { _onResetRecoveryClick = () => {
this.props.onFinished(false); this.props.onFinished(false);
Modal.createTrackedDialogAsync('Key Backup', 'Key Backup',
import('../../../../async-components/views/dialogs/keybackup/CreateKeyBackupDialog'), if (SettingsStore.getValue("feature_cross_signing")) {
{ // If cross-signing is enabled, we reset the SSSS recovery passphrase (and cross-signing keys)
onFinished: () => { this.props.onFinished(false);
this._loadBackupStatus(); accessSecretStorage(() => {}, /* forceReset = */ true);
}, } else {
}, null, /* priority = */ false, /* static = */ true, Modal.createTrackedDialogAsync('Key Backup', 'Key Backup',
); import('../../../../async-components/views/dialogs/keybackup/CreateKeyBackupDialog'),
{
onFinished: () => {
this._loadBackupStatus();
},
}, null, /* priority = */ false, /* static = */ true,
);
}
} }
_onRecoveryKeyChange = (e) => { _onRecoveryKeyChange = (e) => {

View file

@ -557,7 +557,7 @@ const RedactMessagesButton = ({member}) => {
let eventsToRedact = []; let eventsToRedact = [];
while (timeline) { while (timeline) {
eventsToRedact = timeline.getEvents().reduce((events, event) => { eventsToRedact = timeline.getEvents().reduce((events, event) => {
if (event.getSender() === userId && !event.isRedacted()) { if (event.getSender() === userId && !event.isRedacted() && !event.isRedaction()) {
return events.concat(event); return events.concat(event);
} else { } else {
return events; return events;

View file

@ -364,7 +364,7 @@ export default createReactClass({
let eventsToRedact = []; let eventsToRedact = [];
for (const timeline of timelineSet.getTimelines()) { for (const timeline of timelineSet.getTimelines()) {
eventsToRedact = timeline.getEvents().reduce((events, event) => { eventsToRedact = timeline.getEvents().reduce((events, event) => {
if (event.getSender() === userId && !event.isRedacted()) { if (event.getSender() === userId && !event.isRedacted() && !event.isRedaction()) {
return events.concat(event); return events.concat(event);
} else { } else {
return events; return events;

View file

@ -131,8 +131,8 @@ export default class CrossSigningPanel extends React.PureComponent {
} }
_destroySecureSecretStorage = () => { _destroySecureSecretStorage = () => {
const ConfirmDestoryCrossSigningDialog = sdk.getComponent("dialogs.ConfirmDestroyCrossSigningDialog"); const ConfirmDestroyCrossSigningDialog = sdk.getComponent("dialogs.ConfirmDestroyCrossSigningDialog");
Modal.createDialog(ConfirmDestoryCrossSigningDialog, { Modal.createDialog(ConfirmDestroyCrossSigningDialog, {
onFinished: this.onDestroyStorage, onFinished: this.onDestroyStorage,
}); });
} }

View file

@ -101,37 +101,40 @@ export default async function sendBugReport(bugReportEndpoint: string, opts: IOp
if (client) { if (client) {
body.append('user_id', client.credentials.userId); body.append('user_id', client.credentials.userId);
body.append('device_id', client.deviceId); body.append('device_id', client.deviceId);
}
if (client.isCryptoEnabled()) { if (client.isCryptoEnabled()) {
const keys = [`ed25519:${client.getDeviceEd25519Key()}`]; const keys = [`ed25519:${client.getDeviceEd25519Key()}`];
if (client.getDeviceCurve25519Key) { if (client.getDeviceCurve25519Key) {
keys.push(`curve25519:${client.getDeviceCurve25519Key()}`); keys.push(`curve25519:${client.getDeviceCurve25519Key()}`);
}
body.append('device_keys', keys.join(', '));
body.append('cross_signing_key', client.getCrossSigningId());
body.append('device_keys', keys.join(', '));
// add cross-signing status information
const crossSigning = client._crypto._crossSigningInfo;
const secretStorage = client._crypto._secretStorage;
body.append("cross_signing_key", crossSigning.getId());
body.append("cross_signing_pk_in_ssss",
String(!!(await crossSigning.isStoredInSecretStorage(secretStorage))));
body.append("ssss_key_in_account", String(!!(await secretStorage.hasKey())));
const pkCache = client.getCrossSigningCacheCallbacks();
body.append("self_signing_pk_cached",
String(!!(pkCache && await pkCache.getCrossSigningKeyCache("self_signing"))));
body.append("user_signing_pk_cached",
String(!!(pkCache && await pkCache.getCrossSigningKeyCache("user_signing"))));
const sessionBackupKeyFromCache = await client._crypto.getSessionBackupPrivateKey();
body.append("session_backup_key_cached", String(!!sessionBackupKeyFromCache));
body.append("session_backup_key_well_formed", String(sessionBackupKeyFromCache instanceof Uint8Array));
body.append("cross_signing_supported_by_hs",
String(await client.doesServerSupportUnstableFeature("org.matrix.e2e_cross_signing")));
body.append("cross_signing_ready", String(await client.isCrossSigningReady()));
body.append("ssss_key_needs_upgrade", String(await client.secretStorageKeyNeedsUpgrade()));
} }
body.append('device_keys', keys.join(', '));
// add cross-signing status information
const crossSigning = client._crypto._crossSigningInfo;
const secretStorage = client._crypto._secretStorage;
body.append("cross_signing_key", crossSigning.getId());
body.append("cross_signing_pk_in_ssss",
String(!!(await crossSigning.isStoredInSecretStorage(secretStorage))));
body.append("ssss_key_in_account", String(!!(await secretStorage.hasKey())));
const pkCache = client.getCrossSigningCacheCallbacks();
body.append("self_signing_pk_cached",
String(!!(pkCache && await pkCache.getCrossSigningKeyCache("self_signing"))));
body.append("user_signing_pk_cached",
String(!!(pkCache && await pkCache.getCrossSigningKeyCache("user_signing"))));
const sessionBackupKeyFromCache = await client._crypto.getSessionBackupPrivateKey();
body.append("session_backup_key_cached", String(!!sessionBackupKeyFromCache));
body.append("session_backup_key_well_formed", String(sessionBackupKeyFromCache instanceof Uint8Array));
body.append("cross_signing_supported_by_hs",
String(await client.doesServerSupportUnstableFeature("org.matrix.e2e_cross_signing")));
body.append("cross_signing_ready", String(await client.isCrossSigningReady()));
body.append("ssss_key_needs_upgrade", String(await client.secretStorageKeyNeedsUpgrade()));
} }
if (opts.label) { if (opts.label) {