You've already forked matrix-js-sdk
mirror of
https://github.com/matrix-org/matrix-js-sdk.git
synced 2025-11-23 17:02:25 +03:00
Element-R: reduce log spam when checking server key backup (#3826)
* Element-R: reduce log spam when checking server key backup Fixes a lot of spam in the logs about "uncaught in promise: No room_keys found". * Improve integ tests for backup query after UTD * Yield in the backup decryption loop * Fix another broken test
This commit is contained in:
committed by
GitHub
parent
f8f22a3edd
commit
07a9eb3c96
@@ -160,43 +160,72 @@ export class RustCrypto extends TypedEventEmitter<RustCryptoEvents, RustCryptoEv
|
||||
}
|
||||
|
||||
/**
|
||||
* Attempts to retrieve a session from a key backup, if enough time
|
||||
* Starts an attempt to retrieve a session from a key backup, if enough time
|
||||
* has elapsed since the last check for this session id.
|
||||
*
|
||||
* If a backup is found, it is decrypted and imported.
|
||||
*
|
||||
* @param targetRoomId - ID of the room that the session is used in.
|
||||
* @param targetSessionId - ID of the session for which to check backup.
|
||||
*/
|
||||
public async queryKeyBackupRateLimited(targetRoomId: string, targetSessionId: string): Promise<void> {
|
||||
const backupKeys: RustSdkCryptoJs.BackupKeys = await this.olmMachine.getBackupKeys();
|
||||
if (!backupKeys.decryptionKey) return;
|
||||
const version = backupKeys.backupVersion;
|
||||
|
||||
public startQueryKeyBackupRateLimited(targetRoomId: string, targetSessionId: string): void {
|
||||
const now = new Date().getTime();
|
||||
if (
|
||||
!this.sessionLastCheckAttemptedTime[targetSessionId!] ||
|
||||
now - this.sessionLastCheckAttemptedTime[targetSessionId!] > KEY_BACKUP_CHECK_RATE_LIMIT
|
||||
) {
|
||||
const lastCheck = this.sessionLastCheckAttemptedTime[targetSessionId];
|
||||
if (!lastCheck || now - lastCheck > KEY_BACKUP_CHECK_RATE_LIMIT) {
|
||||
this.sessionLastCheckAttemptedTime[targetSessionId!] = now;
|
||||
|
||||
const path = encodeUri("/room_keys/keys/$roomId/$sessionId", {
|
||||
$roomId: targetRoomId,
|
||||
$sessionId: targetSessionId,
|
||||
this.queryKeyBackup(targetRoomId, targetSessionId).catch((e) => {
|
||||
this.logger.error(`Unhandled error while checking key backup for session ${targetSessionId}`, e);
|
||||
});
|
||||
} else {
|
||||
const lastCheckStr = new Date(lastCheck).toISOString();
|
||||
this.logger.debug(
|
||||
`Not checking key backup for session ${targetSessionId} (last checked at ${lastCheckStr})`,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
const res = await this.http.authedRequest<KeyBackupSession>(Method.Get, path, { version }, undefined, {
|
||||
/**
|
||||
* Helper for {@link RustCrypto#startQueryKeyBackupRateLimited}.
|
||||
*
|
||||
* Requests the backup and imports it. Doesn't do any rate-limiting.
|
||||
*
|
||||
* @param targetRoomId - ID of the room that the session is used in.
|
||||
* @param targetSessionId - ID of the session for which to check backup.
|
||||
*/
|
||||
private async queryKeyBackup(targetRoomId: string, targetSessionId: string): Promise<void> {
|
||||
const backupKeys: RustSdkCryptoJs.BackupKeys = await this.olmMachine.getBackupKeys();
|
||||
if (!backupKeys.decryptionKey) {
|
||||
this.logger.debug(`Not checking key backup for session ${targetSessionId} (no decryption key)`);
|
||||
return;
|
||||
}
|
||||
|
||||
this.logger.debug(`Checking key backup for session ${targetSessionId}`);
|
||||
|
||||
const version = backupKeys.backupVersion;
|
||||
const path = encodeUri("/room_keys/keys/$roomId/$sessionId", {
|
||||
$roomId: targetRoomId,
|
||||
$sessionId: targetSessionId,
|
||||
});
|
||||
|
||||
let res: KeyBackupSession;
|
||||
try {
|
||||
res = await this.http.authedRequest<KeyBackupSession>(Method.Get, path, { version }, undefined, {
|
||||
prefix: ClientPrefix.V3,
|
||||
});
|
||||
|
||||
if (this.stopped) return;
|
||||
|
||||
const backupDecryptor = new RustBackupDecryptor(backupKeys.decryptionKey);
|
||||
if (res) {
|
||||
const sessionsToImport: Record<string, KeyBackupSession> = {};
|
||||
sessionsToImport[targetSessionId] = res;
|
||||
const keys = await backupDecryptor.decryptSessions(sessionsToImport);
|
||||
for (const k of keys) {
|
||||
k.room_id = targetRoomId!;
|
||||
}
|
||||
await this.importRoomKeys(keys);
|
||||
}
|
||||
} catch (e) {
|
||||
this.logger.info(`No luck requesting key backup for session ${targetSessionId}: ${e}`);
|
||||
return;
|
||||
}
|
||||
|
||||
if (this.stopped) return;
|
||||
|
||||
const backupDecryptor = new RustBackupDecryptor(backupKeys.decryptionKey);
|
||||
const sessionsToImport: Record<string, KeyBackupSession> = { [targetSessionId]: res };
|
||||
const keys = await backupDecryptor.decryptSessions(sessionsToImport);
|
||||
for (const k of keys) {
|
||||
k.room_id = targetRoomId;
|
||||
}
|
||||
await this.importRoomKeys(keys);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1633,7 +1662,10 @@ class EventDecryptor {
|
||||
session: content.sender_key + "|" + content.session_id,
|
||||
},
|
||||
);
|
||||
this.crypto.queryKeyBackupRateLimited(event.getRoomId()!, event.getWireContent().session_id!);
|
||||
this.crypto.startQueryKeyBackupRateLimited(
|
||||
event.getRoomId()!,
|
||||
event.getWireContent().session_id!,
|
||||
);
|
||||
break;
|
||||
}
|
||||
case RustSdkCryptoJs.DecryptionErrorCode.UnknownMessageIndex: {
|
||||
@@ -1644,7 +1676,10 @@ class EventDecryptor {
|
||||
session: content.sender_key + "|" + content.session_id,
|
||||
},
|
||||
);
|
||||
this.crypto.queryKeyBackupRateLimited(event.getRoomId()!, event.getWireContent().session_id!);
|
||||
this.crypto.startQueryKeyBackupRateLimited(
|
||||
event.getRoomId()!,
|
||||
event.getWireContent().session_id!,
|
||||
);
|
||||
break;
|
||||
}
|
||||
// We don't map MismatchedIdentityKeys for now, as there is no equivalent in legacy.
|
||||
|
||||
Reference in New Issue
Block a user