From 30c60d728e4483f6a78be7d89c48f82759b8a3b8 Mon Sep 17 00:00:00 2001 From: Niels Andriesse Date: Fri, 4 Oct 2019 11:21:20 +1000 Subject: [PATCH] Fix message sending logic --- .../src/Loki/Utilities/NSArray+Functional.h | 1 + .../src/Loki/Utilities/NSArray+Functional.m | 8 ++++ .../src/Loki/Utilities/NSSet+Functional.m | 2 +- .../src/Messages/OWSMessageSender.m | 42 ++++++++++--------- 4 files changed, 32 insertions(+), 21 deletions(-) diff --git a/SignalServiceKit/src/Loki/Utilities/NSArray+Functional.h b/SignalServiceKit/src/Loki/Utilities/NSArray+Functional.h index bffdfe76a..cc8be8482 100644 --- a/SignalServiceKit/src/Loki/Utilities/NSArray+Functional.h +++ b/SignalServiceKit/src/Loki/Utilities/NSArray+Functional.h @@ -1,6 +1,7 @@ @interface NSArray (Functional) +- (BOOL)contains:(BOOL (^)(NSObject *))predicate; - (NSArray *)filtered:(BOOL (^)(NSObject *))isIncluded; - (NSArray *)map:(NSObject *(^)(NSObject *))transform; diff --git a/SignalServiceKit/src/Loki/Utilities/NSArray+Functional.m b/SignalServiceKit/src/Loki/Utilities/NSArray+Functional.m index 309e33914..5011bcff0 100644 --- a/SignalServiceKit/src/Loki/Utilities/NSArray+Functional.m +++ b/SignalServiceKit/src/Loki/Utilities/NSArray+Functional.m @@ -2,6 +2,14 @@ @implementation NSArray (Functional) +- (BOOL)contains:(BOOL (^)(NSObject *))predicate { + for (NSObject *object in self) { + BOOL isPredicateSatisfied = predicate(object); + if (isPredicateSatisfied) { return YES; } + } + return NO; +} + - (NSArray *)filtered:(BOOL (^)(NSObject *))isIncluded { NSMutableArray *result = [NSMutableArray new]; for (NSObject *object in self) { diff --git a/SignalServiceKit/src/Loki/Utilities/NSSet+Functional.m b/SignalServiceKit/src/Loki/Utilities/NSSet+Functional.m index 8d45bc498..c2ad2098b 100644 --- a/SignalServiceKit/src/Loki/Utilities/NSSet+Functional.m +++ b/SignalServiceKit/src/Loki/Utilities/NSSet+Functional.m @@ -2,7 +2,7 @@ @implementation NSSet (Functional) --(BOOL)contains:(BOOL (^)(NSObject *))predicate { +- (BOOL)contains:(BOOL (^)(NSObject *))predicate { for (NSObject *object in self) { BOOL isPredicateSatisfied = predicate(object); if (isPredicateSatisfied) { return YES; } diff --git a/SignalServiceKit/src/Messages/OWSMessageSender.m b/SignalServiceKit/src/Messages/OWSMessageSender.m index cd3698f46..c4ec3fdb7 100644 --- a/SignalServiceKit/src/Messages/OWSMessageSender.m +++ b/SignalServiceKit/src/Messages/OWSMessageSender.m @@ -901,28 +901,30 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException"; return deviceMessages; } -- (LKFriendRequestMessage *)getMultiDeviceFriendRequestMessageForHexEncodedPublicKey:(NSString *)hexEncodedPublicKey +- (OWSMessageSend *)getMultiDeviceFriendRequestMessageForHexEncodedPublicKey:(NSString *)hexEncodedPublicKey { TSContactThread *thread = [TSContactThread getOrCreateThreadWithContactId:hexEncodedPublicKey]; - return [[LKFriendRequestMessage alloc] initOutgoingMessageWithTimestamp:NSDate.ows_millisecondTimeStamp - inThread:thread - messageBody:@"Test" - attachmentIds:[NSMutableArray new] - expiresInSeconds:0 - expireStartedAt:0 - isVoiceMessage:NO - groupMetaMessage:TSGroupMetaMessageUnspecified - quotedMessage:nil - contactShare:nil - linkPreview:nil]; + LKFriendRequestMessage *message = [[LKFriendRequestMessage alloc] initOutgoingMessageWithTimestamp:NSDate.ows_millisecondTimeStamp inThread:thread messageBody:@"Please accept this friend request to enable multi device messaging" attachmentIds:[NSMutableArray new] + expiresInSeconds:0 expireStartedAt:0 isVoiceMessage:NO groupMetaMessage:TSGroupMetaMessageUnspecified quotedMessage:nil contactShare:nil linkPreview:nil]; + SignalRecipient *recipient = [[SignalRecipient alloc] initWithUniqueId:hexEncodedPublicKey]; + NSString *userHexEncodedPublicKey = OWSIdentityManager.sharedManager.identityKeyPair.hexEncodedPublicKey; + return [[OWSMessageSend alloc] initWithMessage:message thread:thread recipient:recipient senderCertificate:nil udAccess:nil localNumber:userHexEncodedPublicKey success:^{ } failure:^(NSError *error) { }]; } - (void)sendMessageToRecipient:(OWSMessageSend *)messageSend { - if (messageSend.thread.isGroupThread) { + TSOutgoingMessage *message = messageSend.message; + NSString *contactID = messageSend.recipient.recipientId; + BOOL isGroupMessage = messageSend.thread.isGroupThread; + BOOL isDeviceLinkMessage = [message isKindOfClass:LKDeviceLinkMessage.class]; + BOOL isMessageToSelf = (contactID == OWSIdentityManager.sharedManager.identityKeyPair.hexEncodedPublicKey); + BOOL isSyncMessage = [message isKindOfClass:OWSOutgoingSyncMessage.class]; + if (isGroupMessage || isDeviceLinkMessage || isMessageToSelf || isSyncMessage) { [self sendMessage:messageSend]; } else { - [[LKAPI getDestinationsFor:messageSend.recipient.recipientId] + BOOL isSilentMessage = message.isSilent; + BOOL isFriendRequestMessage = [message isKindOfClass:LKFriendRequestMessage.class]; + [[LKAPI getDestinationsFor:contactID] .thenOn(OWSDispatch.sendingQueue, ^(NSArray *destinations) { // Use a best attempt approach for multi device for now NSArray *slaveDestinations = [destinations filtered:^BOOL(NSObject *object) { @@ -931,12 +933,12 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException"; }]; for (LKDestination *slaveDestination in slaveDestinations) { TSContactThread *thread = [TSContactThread getOrCreateThreadWithContactId:slaveDestination.hexEncodedPublicKey]; - if (thread.isContactFriend) { + if (thread.isContactFriend || isSilentMessage || (isFriendRequestMessage && contactID == slaveDestination.hexEncodedPublicKey)) { OWSMessageSend *messageSendCopy = [messageSend copyWithDestination:slaveDestination]; [self sendMessage:messageSendCopy]; } else { - LKFriendRequestMessage *friendRequestMessage = [self getMultiDeviceFriendRequestMessageForHexEncodedPublicKey:slaveDestination.hexEncodedPublicKey]; - [self sendMessage:friendRequestMessage success:^{ } failure:^(NSError *error) { }]; + OWSMessageSend *friendRequestMessage = [self getMultiDeviceFriendRequestMessageForHexEncodedPublicKey:slaveDestination.hexEncodedPublicKey]; + [self sendMessage:friendRequestMessage]; } } LKDestination *masterDestination = [destinations filtered:^BOOL(NSObject *object) { @@ -945,12 +947,12 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException"; }].firstObject; if (masterDestination != nil) { TSContactThread *thread = [TSContactThread getOrCreateThreadWithContactId:masterDestination.hexEncodedPublicKey]; - if (thread.isContactFriend) { + if (thread.isContactFriend || isSilentMessage || (isFriendRequestMessage && contactID == masterDestination.hexEncodedPublicKey)) { OWSMessageSend *messageSendCopy = [messageSend copyWithDestination:masterDestination]; [self sendMessage:messageSendCopy]; } else { - LKFriendRequestMessage *friendRequestMessage = [self getMultiDeviceFriendRequestMessageForHexEncodedPublicKey:masterDestination.hexEncodedPublicKey]; - [self sendMessage:friendRequestMessage success:messageSend.success failure:messageSend.failure]; + OWSMessageSend *friendRequestMessage = [self getMultiDeviceFriendRequestMessageForHexEncodedPublicKey:masterDestination.hexEncodedPublicKey]; + [self sendMessage:friendRequestMessage]; } } })