From 8c565c7c5a8e2447bd054d87a7a41147e4b204a6 Mon Sep 17 00:00:00 2001 From: Ryan ZHAO Date: Fri, 21 Aug 2020 12:26:21 +1000 Subject: [PATCH] prevent infinite loop if errors occur when automatically resetting the session --- .../Session Management/SessionManagementProtocol.swift | 7 ++++--- SignalServiceKit/src/Messages/OWSMessageDecrypter.m | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/SignalServiceKit/src/Loki/Protocol/Session Management/SessionManagementProtocol.swift b/SignalServiceKit/src/Loki/Protocol/Session Management/SessionManagementProtocol.swift index 728680200..b189ab16a 100644 --- a/SignalServiceKit/src/Loki/Protocol/Session Management/SessionManagementProtocol.swift +++ b/SignalServiceKit/src/Loki/Protocol/Session Management/SessionManagementProtocol.swift @@ -164,14 +164,15 @@ public final class SessionManagementProtocol : NSObject { // MARK: - Receiving @objc(handleDecryptionError:forPublicKey:transaction:) - public static func handleDecryptionError(_ rawValue: Int32, for publicKey: String, using transaction: YapDatabaseReadWriteTransaction) { - let type = TSErrorMessageType(rawValue: rawValue) + public static func handleDecryptionError(_ errorMessage: TSErrorMessage, for publicKey: String, using transaction: YapDatabaseReadWriteTransaction) { + let type = errorMessage.errorType let masterPublicKey = storage.getMasterHexEncodedPublicKey(for: publicKey, in: transaction) ?? publicKey let thread = TSContactThread.getOrCreateThread(withContactId: masterPublicKey, transaction: transaction) + let restorationTimeInMs = UInt64(storage.getRestorationTime() * 1000) // Show the session reset prompt upon certain errors switch type { case .noSession, .invalidMessage, .invalidKeyException: - if storage.getRestorationTime() > 0 { + if restorationTimeInMs > errorMessage.timestamp { // Automatically rebuild session after restoration sendSessionRequestIfNeeded(to: publicKey, using: transaction) } else { diff --git a/SignalServiceKit/src/Messages/OWSMessageDecrypter.m b/SignalServiceKit/src/Messages/OWSMessageDecrypter.m index 8c0be38f1..e62e7c258 100644 --- a/SignalServiceKit/src/Messages/OWSMessageDecrypter.m +++ b/SignalServiceKit/src/Messages/OWSMessageDecrypter.m @@ -690,7 +690,7 @@ NSError *EnsureDecryptError(NSError *_Nullable error, NSString *fallbackErrorDes OWSAssertDebug(errorMessage); if (errorMessage != nil) { - [LKSessionManagementProtocol handleDecryptionError:errorMessage.errorType forPublicKey:envelope.source transaction:transaction]; + [LKSessionManagementProtocol handleDecryptionError:errorMessage forPublicKey:envelope.source transaction:transaction]; if (![LKSessionMetaProtocol isErrorMessageBeforeRestoration:errorMessage]) { [errorMessage saveWithTransaction:transaction]; [self notifyUserForErrorMessage:errorMessage envelope:envelope transaction:transaction];