From 6f2f70dcdc5b753c1101b8f0e24550babc6db775 Mon Sep 17 00:00:00 2001 From: manuroe Date: Thu, 8 Oct 2020 09:24:40 +0200 Subject: [PATCH] MXCrypto: Reset OTKs in case some IDs are already used. This is a mitigation for https://github.com/vector-im/element-ios/issues/3721. But it does not fix the root issue. --- CHANGES.rst | 2 +- MatrixSDK/Crypto/MXCrypto.m | 23 +++++++++++++++++++---- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index 93f99d0fb4..6b1035e145 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -8,7 +8,7 @@ Changes to be released in next version * MXCrypto: Add hasKeysToDecryptEvent method. 🐛 Bugfix - * + * MXCrypto: Reset OTKs in case some IDs are already used (https://github.com/vector-im/element-ios/issues/3721). ⚠️ API Changes * diff --git a/MatrixSDK/Crypto/MXCrypto.m b/MatrixSDK/Crypto/MXCrypto.m index d2a9ffc865..91ec3e3c55 100644 --- a/MatrixSDK/Crypto/MXCrypto.m +++ b/MatrixSDK/Crypto/MXCrypto.m @@ -2641,7 +2641,7 @@ - (void)maybeUploadOneTimeKeys:(void (^)(void))success failure:(void (^)(NSError NSLog(@"[MXCrypto] maybeUploadOneTimeKeys: there are %tu one-time keys on the homeserver", oneTimeKeyCount); MXWeakify(self); - uploadOneTimeKeysOperation = [self generateAndUploadOneTimeKeys:oneTimeKeyCount success:^{ + uploadOneTimeKeysOperation = [self generateAndUploadOneTimeKeys:oneTimeKeyCount retry:YES success:^{ MXStrongifyAndReturnIfNil(self); self->uploadOneTimeKeysOperation = nil; @@ -2695,7 +2695,7 @@ - (void)maybeUploadOneTimeKeys:(void (^)(void))success failure:(void (^)(NSError NSLog(@"[MXCrypto] maybeUploadOneTimeKeys: %@ one-time keys on the homeserver", @(keyCount)); MXWeakify(self); - MXHTTPOperation *operation2 = [self generateAndUploadOneTimeKeys:keyCount success:^{ + MXHTTPOperation *operation2 = [self generateAndUploadOneTimeKeys:keyCount retry:YES success:^{ MXStrongifyAndReturnIfNil(self); self->uploadOneTimeKeysOperation = nil; @@ -2743,7 +2743,7 @@ - (void)maybeUploadOneTimeKeys:(void (^)(void))success failure:(void (^)(NSError } } -- (MXHTTPOperation *)generateAndUploadOneTimeKeys:(NSUInteger)keyCount success:(void (^)(void))success failure:(void (^)(NSError *))failure +- (MXHTTPOperation *)generateAndUploadOneTimeKeys:(NSUInteger)keyCount retry:(BOOL)retry success:(void (^)(void))success failure:(void (^)(NSError *))failure { MXHTTPOperation *operation; @@ -2753,7 +2753,22 @@ - (MXHTTPOperation *)generateAndUploadOneTimeKeys:(NSUInteger)keyCount success:( success(); } failure:^(NSError *error) { NSLog(@"[MXCrypto] generateAndUploadOneTimeKeys: Failed to publish one-time keys. Error: %@", error); - failure(error); + + if ([MXError isMXError:error] && retry) + { + // The homeserver explicitly rejected the request. + // Reset local OTKs we tried to push and retry + // There is no matrix specific error but we really want to detect the error described at + // https://github.com/vector-im/element-ios/issues/3721 + NSLog(@"[MXCrypto] uploadOneTimeKeys: Reset local OTKs because the server does not like them"); + [self.olmDevice markOneTimeKeysAsPublished]; + + [self generateAndUploadOneTimeKeys:keyCount retry:NO success:success failure:failure]; + } + else + { + failure(error); + } }]; }