diff --git a/Signal/src/ViewControllers/ConversationView/ConversationViewController.m b/Signal/src/ViewControllers/ConversationView/ConversationViewController.m index 0f6f822e4..d35269dd4 100644 --- a/Signal/src/ViewControllers/ConversationView/ConversationViewController.m +++ b/Signal/src/ViewControllers/ConversationView/ConversationViewController.m @@ -4430,8 +4430,27 @@ typedef enum : NSUInteger { { // Update the thread's friend request status [self.thread saveFriendRequestStatus:LKThreadFriendRequestStatusFriends withTransaction:nil]; - // Send a friend request accepted message - [ThreadUtil enqueueFriendRequestAcceptanceMessageInThread:self.thread]; + // Accept all outstanding friend requests associated with this user and try to establish sessions with the + // subset of their devices that haven't sent a friend request. + NSString *senderID = friendRequest.authorId; + NSMutableSet *threads = [NSMutableSet new]; + [OWSPrimaryStorage.sharedManager.dbReadWriteConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { + NSString *masterHexEncodedPublicKey = [LKDatabaseUtilities getMasterHexEncodedPublicKeyFor:senderID in:transaction] ?: senderID; + NSSet *deviceLinks = [LKDatabaseUtilities getDeviceLinksFor:masterHexEncodedPublicKey in:transaction]; + for (LKDeviceLink *deviceLink in deviceLinks) { + [threads addObject:[TSContactThread getThreadWithContactId:deviceLink.master.hexEncodedPublicKey transaction:transaction]]; + [threads addObject:[TSContactThread getThreadWithContactId:deviceLink.slave.hexEncodedPublicKey transaction:transaction]]; + } + }]; + for (TSContactThread *thread in threads) { + if (thread.hasPendingFriendRequest) { + [ThreadUtil enqueueFriendRequestAcceptanceMessageInThread:self.thread]; + } else { + OWSMessageSender *messageSender = SSKEnvironment.shared.messageSender; + OWSMessageSend *automatedFriendRequestMessage = [messageSender getMultiDeviceFriendRequestMessageForHexEncodedPublicKey:thread.contactIdentifier]; + [messageSender sendMessage:automatedFriendRequestMessage]; + } + } } - (void)declineFriendRequest:(TSIncomingMessage *)friendRequest diff --git a/SignalServiceKit/src/Loki/Messaging/LokiMessageWrapper.swift b/SignalServiceKit/src/Loki/Messaging/LokiMessageWrapper.swift index 107c902d6..86c3cfce2 100644 --- a/SignalServiceKit/src/Loki/Messaging/LokiMessageWrapper.swift +++ b/SignalServiceKit/src/Loki/Messaging/LokiMessageWrapper.swift @@ -1,7 +1,7 @@ public enum LokiMessageWrapper { - public enum WrappingError : LocalizedError { + public enum Error : LocalizedError { case failedToWrapData case failedToWrapMessageInEnvelope case failedToWrapEnvelopeInWebSocketMessage @@ -24,7 +24,7 @@ public enum LokiMessageWrapper { let webSocketMessage = try createWebSocketMessage(around: envelope) return try webSocketMessage.serializedData() } catch let error { - throw error as? WrappingError ?? WrappingError.failedToWrapData + throw error as? Error ?? Error.failedToWrapData } } @@ -36,12 +36,12 @@ public enum LokiMessageWrapper { if let content = try Data(base64Encoded: message.content) { builder.setContent(content) } else { - throw WrappingError.failedToWrapMessageInEnvelope + throw Error.failedToWrapMessageInEnvelope } return try builder.build() } catch let error { print("[Loki] Failed to wrap message in envelope: \(error).") - throw WrappingError.failedToWrapMessageInEnvelope + throw Error.failedToWrapMessageInEnvelope } } @@ -54,7 +54,7 @@ public enum LokiMessageWrapper { return try messageBuilder.build() } catch let error { print("[Loki] Failed to wrap envelope in web socket message: \(error).") - throw WrappingError.failedToWrapEnvelopeInWebSocketMessage + throw Error.failedToWrapEnvelopeInWebSocketMessage } } @@ -66,7 +66,7 @@ public enum LokiMessageWrapper { return try SSKProtoEnvelope.parseData(envelope) } catch let error { print("[Loki] Failed to unwrap data: \(error).") - throw WrappingError.failedToUnwrapData + throw Error.failedToUnwrapData } } } diff --git a/SignalServiceKit/src/Messages/OWSMessageSender.h b/SignalServiceKit/src/Messages/OWSMessageSender.h index e6c914bad..f5f2e1364 100644 --- a/SignalServiceKit/src/Messages/OWSMessageSender.h +++ b/SignalServiceKit/src/Messages/OWSMessageSender.h @@ -16,6 +16,7 @@ extern const NSUInteger kOversizeTextMessageSizeThreshold; @class TSOutgoingMessage; @class TSThread; @class YapDatabaseReadWriteTransaction; +@class OWSMessageSend; @protocol ContactsManagerProtocol; @@ -96,6 +97,9 @@ NS_SWIFT_NAME(MessageSender) success:(void (^)(void))successHandler failure:(void (^)(NSError *error))failureHandler; +- (OWSMessageSend *)getMultiDeviceFriendRequestMessageForHexEncodedPublicKey:(NSString *)hexEncodedPublicKey; +- (void)sendMessage:(OWSMessageSend *)messageSend; + @end #pragma mark -