-
-
Notifications
You must be signed in to change notification settings - Fork 609
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Enable key upload to backups where we have the decryption key #4677
base: develop
Are you sure you want to change the base?
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Putting this on hold while we try to understand what bug it is trying to fix, per #4676 (comment).
In any case, we'll need to see an integration test which demonstrates the problem.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ok, the fix looks like it makes sense, but the main thing this is missing is a regression test.
Please could you take a look at matrix-js-sdk/spec/integ/crypto/megolm-backup.spec.ts
. In there there are some existing tests for checkKeyBackupAndEnable
: please could you take a look at them and see if you can add another which covers your usecase.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
looks generally good to me, thanks.
A few minor requests.
src/crypto/backup.ts
Outdated
if ((trustInfo.usable || trustInfo.trusted_locally) && !this.backupInfo) { | ||
logger.log(`Found usable key backup v${backupInfo!.version}: enabling key backups`); | ||
await this.enableKeyBackup(backupInfo!); | ||
} else if (!trustInfo.usable && this.backupInfo) { | ||
} else if (!trustInfo.usable && !trustInfo.trusted_locally && this.backupInfo) { | ||
logger.log("No usable key backup: disabling key backup"); | ||
this.disableKeyBackup(); | ||
} else if (!trustInfo.usable && !this.backupInfo) { | ||
} else if (!trustInfo.usable && !trustInfo.trusted_locally && !this.backupInfo) { | ||
logger.log("No usable key backup: not enabling key backup"); | ||
} else if (trustInfo.usable && this.backupInfo) { | ||
} else if ((trustInfo.usable || trustInfo.trusted_locally) && this.backupInfo) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
this code is schedule for removal very soon so maybe not the most important thing, but it would be good to factor out a local variable for trustInfo.usable || trustInfo.trusted_locally
it("enables a backup signed by trusted devices and have decryption key", async () => { | ||
aliceClient = await initTestClient(); | ||
const aliceCrypto = aliceClient.getCrypto()!; | ||
|
||
await aliceClient.startClient(); | ||
await aliceCrypto.storeSessionBackupPrivateKey( | ||
Buffer.from(testData.BACKUP_DECRYPTION_KEY_BASE64, "base64"), | ||
testData.SIGNED_BACKUP_DATA.version!, | ||
); | ||
await waitForDeviceList(); | ||
await aliceCrypto.setDeviceVerified(testData.TEST_USER_ID, testData.TEST_DEVICE_ID); | ||
|
||
fetchMock.get("path:/_matrix/client/v3/room_keys/version", testData.SIGNED_BACKUP_DATA); | ||
|
||
const result = await aliceCrypto.checkKeyBackupAndEnable(); | ||
expect(result).toBeTruthy(); | ||
expect(result!.trustInfo).toEqual({ trusted: true, matchesDecryptionKey: true }); | ||
expect(await aliceCrypto.getActiveSessionBackupVersion()).toEqual(testData.SIGNED_BACKUP_DATA.version); | ||
}); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
this test feels a bit redundant to me. Is there a particular reason you feel it is important?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Not any particular reason, I added it as the trust is logical OR of verified signature and decryption key match, so i feel like it is a good idea to cover all 4 combination to stay safe.
await aliceClient.startClient(); | ||
await aliceCrypto.storeSessionBackupPrivateKey( | ||
Buffer.from(testData.BACKUP_DECRYPTION_KEY_BASE64, "base64"), | ||
testData.SIGNED_BACKUP_DATA.version!, | ||
); | ||
await waitForDeviceList(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
await aliceClient.startClient(); | |
await aliceCrypto.storeSessionBackupPrivateKey( | |
Buffer.from(testData.BACKUP_DECRYPTION_KEY_BASE64, "base64"), | |
testData.SIGNED_BACKUP_DATA.version!, | |
); | |
await waitForDeviceList(); | |
// download the device list, to match the trusted-device case | |
await aliceClient.startClient(); | |
await waitForDeviceList(); | |
// Alice does *not* trust the device that signed the backup, but *does* have the decryption key. | |
await aliceCrypto.storeSessionBackupPrivateKey( | |
Buffer.from(testData.BACKUP_DECRYPTION_KEY_BASE64, "base64"), | |
testData.SIGNED_BACKUP_DATA.version!, | |
); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I am not sure why test is failing after flipping the statements. Can you please help me with it
Co-authored-by: Richard van der Hoff <[email protected]>
Co-authored-by: Richard van der Hoff <[email protected]>
Co-authored-by: Richard van der Hoff <[email protected]>
Co-authored-by: Richard van der Hoff <[email protected]>
Fixes #4676
Signed-off-by: Ajay Bura [email protected]
Checklist
public
/exported
symbols have accurate TSDoc documentation.