diff --git a/Pods b/Pods index 7753c413d..6d307f510 160000 --- a/Pods +++ b/Pods @@ -1 +1 @@ -Subproject commit 7753c413dc4efcfdab0e5f41e3245dd547dada7c +Subproject commit 6d307f51039509e814d70c48527f69f7b850e6da diff --git a/Signal/src/ViewControllers/ConversationView/ConversationViewController.m b/Signal/src/ViewControllers/ConversationView/ConversationViewController.m index 2e3b7a141..ca91b9a16 100644 --- a/Signal/src/ViewControllers/ConversationView/ConversationViewController.m +++ b/Signal/src/ViewControllers/ConversationView/ConversationViewController.m @@ -3922,6 +3922,12 @@ typedef enum : NSUInteger { BOOL didAddToProfileWhitelist = [ThreadUtil addThreadToProfileWhitelistIfEmptyContactThread:self.thread]; + if ([self.thread isKindOfClass:TSContactThread.class]) { + [LKStorage writeSyncWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { + [LKSessionManagementProtocol sendSessionRequestIfNeededToPublicKey:self.thread.contactIdentifier transaction:transaction]; + } error:nil]; + } + __block TSOutgoingMessage *message; [self.uiDatabaseConnection readWithBlock:^(YapDatabaseReadTransaction *_Nonnull transaction) { message = [ThreadUtil enqueueMessageWithText:messageText @@ -4507,6 +4513,12 @@ typedef enum : NSUInteger { return; } + if ([self.thread isKindOfClass:TSContactThread.class]) { + [LKStorage writeSyncWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { + [LKSessionManagementProtocol sendSessionRequestIfNeededToPublicKey:self.thread.contactIdentifier transaction:transaction]; + } error:nil]; + } + // Limit outgoing text messages to 16kb. // // We convert large text messages to attachments diff --git a/SignalServiceKit/src/Loki/Protocol/Session Management/SessionManagementProtocol.swift b/SignalServiceKit/src/Loki/Protocol/Session Management/SessionManagementProtocol.swift index 0d6fd1d98..7bd5f5560 100644 --- a/SignalServiceKit/src/Loki/Protocol/Session Management/SessionManagementProtocol.swift +++ b/SignalServiceKit/src/Loki/Protocol/Session Management/SessionManagementProtocol.swift @@ -60,9 +60,11 @@ public final class SessionManagementProtocol : NSObject { // MARK: - Sending - @objc(shouldUseFallbackEncryptionForMessage:) - public static func shouldUseFallbackEncryption(for message: TSOutgoingMessage) -> Bool { - return true + @objc(shouldUseFallbackEncryptionForMessage:recipientID:transaction:) + public static func shouldUseFallbackEncryption(for message: TSOutgoingMessage, recipientID: String, transaction: YapDatabaseReadWriteTransaction) -> Bool { + if message is SessionRequestMessage { return true } + else if let message = message as? DeviceLinkMessage, message.kind == .request { return true } + return !storage.containsSession(recipientID, deviceId: Int32(OWSDevicePrimaryDeviceId), protocolContext: transaction) } private static func hasSentSessionRequestExpired(for publicKey: String) -> Bool { @@ -71,6 +73,7 @@ public final class SessionManagementProtocol : NSObject { return NSDate.ows_millisecondTimeStamp() > expiration } + @objc(sendSessionRequestIfNeededToPublicKey:transaction:) public static func sendSessionRequestIfNeeded(to publicKey: String, using transaction: YapDatabaseReadWriteTransaction) { // It's never necessary to establish a session with self guard publicKey != getUserHexEncodedPublicKey() else { return } @@ -93,9 +96,6 @@ public final class SessionManagementProtocol : NSObject { let sessionRequestMessage = SessionRequestMessage(thread: thread) let messageSenderJobQueue = SSKEnvironment.shared.messageSenderJobQueue messageSenderJobQueue.add(message: sessionRequestMessage, transaction: transaction) - -// aushfiuasfhiujoasf - // TODO: Handle failure } @objc(sendNullMessageToPublicKey:transaction:) diff --git a/SignalServiceKit/src/Messages/OWSMessageSender.m b/SignalServiceKit/src/Messages/OWSMessageSender.m index 0cf86f314..8911a2354 100644 --- a/SignalServiceKit/src/Messages/OWSMessageSender.m +++ b/SignalServiceKit/src/Messages/OWSMessageSender.m @@ -1433,7 +1433,10 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException"; messageSend.isUDSend); @try { - BOOL isSessionRequired = ![LKSessionManagementProtocol shouldUseFallbackEncryptionForMessage:messageSend.message]; + __block BOOL isSessionRequired; + [LKStorage writeSyncWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { + isSessionRequired = ![LKSessionManagementProtocol shouldUseFallbackEncryptionForMessage:messageSend.message recipientID:recipientID transaction:transaction]; + } error:nil]; if (isSessionRequired) { BOOL hasSession = [self throws_ensureRecipientHasSessionForMessageSend:messageSend recipientID:recipientID deviceId:@(OWSDevicePrimaryDeviceId)]; @@ -1634,7 +1637,7 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException"; // • Alice receives this, sets up her Signal cipher session locally, and sends any subsequent messages // using Signal encryption. - BOOL shouldUseFallbackEncryption = [LKSessionManagementProtocol shouldUseFallbackEncryptionForMessage:message]; + BOOL shouldUseFallbackEncryption = [LKSessionManagementProtocol shouldUseFallbackEncryptionForMessage:message recipientID:recipientID transaction:transaction]; serializedMessage = [secretCipher throwswrapped_encryptMessageWithRecipientPublicKey:recipientID deviceID:@(OWSDevicePrimaryDeviceId).intValue diff --git a/SignalServiceKit/src/Network/MessageSenderJobQueue.swift b/SignalServiceKit/src/Network/MessageSenderJobQueue.swift index 324e8390c..9a875cb07 100644 --- a/SignalServiceKit/src/Network/MessageSenderJobQueue.swift +++ b/SignalServiceKit/src/Network/MessageSenderJobQueue.swift @@ -203,7 +203,16 @@ public class MessageSenderOperation: OWSOperation, DurableOperation { } override public func didReportError(_ error: Error) { + let message = self.message + var isFailedSessionRequest = false + if message is SessionRequestMessage, let publicKey = message.thread.contactIdentifier() { + isFailedSessionRequest = (Storage.getSessionRequestSentTimestamp(for: publicKey) == message.timestamp) + } try! Storage.writeSync { transaction in + if isFailedSessionRequest, let publicKey = message.thread.contactIdentifier() { + Storage.setSessionRequestSentTimestamp(for: publicKey, to: 0, using: transaction) + } + self.durableOperationDelegate?.durableOperation(self, didReportError: error, transaction: transaction) } } @@ -225,7 +234,16 @@ public class MessageSenderOperation: OWSOperation, DurableOperation { } override public func didFail(error: Error) { + let message = self.message + var isFailedSessionRequest = false + if message is SessionRequestMessage, let publicKey = message.thread.contactIdentifier() { + isFailedSessionRequest = (Storage.getSessionRequestSentTimestamp(for: publicKey) == message.timestamp) + } try! Storage.writeSync { transaction in + if isFailedSessionRequest, let publicKey = message.thread.contactIdentifier() { + Storage.setSessionRequestSentTimestamp(for: publicKey, to: 0, using: transaction) + } + self.durableOperationDelegate?.durableOperation(self, didFailWithError: error, transaction: transaction) self.message.update(sendingError: error, transaction: transaction)