pull/63/head
Niels Andriesse 6 years ago
parent 5c3064fb87
commit 3491539ce5

@ -541,16 +541,25 @@ NS_ASSUME_NONNULL_BEGIN
return message.isFriendRequest;
} else {
if (message.isFriendRequest) {
// Only show an incoming friend request if the user isn't yet friends with any of the other user's devices
// Only show the first friend request that was received
NSString *senderID = ((TSIncomingMessage *)message).authorId;
__block NSSet<TSContactThread *> *linkedDeviceThreads;
__block NSMutableSet<TSContactThread *> *linkedDeviceThreads;
[OWSPrimaryStorage.sharedManager.dbReadWriteConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) {
linkedDeviceThreads = [LKDatabaseUtilities getLinkedDeviceThreadsFor:senderID in:transaction];
linkedDeviceThreads = [LKDatabaseUtilities getLinkedDeviceThreadsFor:senderID in:transaction].mutableCopy;
}];
BOOL isFriend = [linkedDeviceThreads contains:^BOOL(TSContactThread *thread) {
return thread.isContactFriend;
NSMutableArray<TSIncomingMessage *> *allFriendRequestMessages = @[].mutableCopy;
for (TSContactThread *thread in linkedDeviceThreads) {
[thread enumerateInteractionsUsingBlock:^(TSInteraction *interaction) {
TSIncomingMessage *message = [interaction as:TSIncomingMessage.class];
if (message != nil && message.isFriendRequest) {
[allFriendRequestMessages addObject:message];
}
}];
}
[allFriendRequestMessages sortUsingComparator:^NSComparisonResult(TSIncomingMessage *lhs, TSIncomingMessage *rhs) {
return [@(lhs.timestamp) compare:@(rhs.timestamp)] == NSOrderedDescending;
}];
return !isFriend;
return [message.uniqueId isEqual:allFriendRequestMessages.firstObject.uniqueId];
} else {
return NO;
}

@ -4451,8 +4451,6 @@ typedef enum : NSUInteger {
- (void)acceptFriendRequest:(TSIncomingMessage *)friendRequest
{
// Update the thread's friend request status
[self.thread saveFriendRequestStatus:LKThreadFriendRequestStatusFriends withTransaction:nil];
// 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;
@ -4466,9 +4464,13 @@ typedef enum : NSUInteger {
} else {
OWSMessageSender *messageSender = SSKEnvironment.shared.messageSender;
OWSMessageSend *automatedFriendRequestMessage = [messageSender getMultiDeviceFriendRequestMessageForHexEncodedPublicKey:thread.contactIdentifier];
dispatch_async(OWSDispatch.sendingQueue, ^{
[messageSender sendMessage:automatedFriendRequestMessage];
});
}
}
// Update the thread's friend request status
[self.thread saveFriendRequestStatus:LKThreadFriendRequestStatusFriends withTransaction:nil];
}
- (void)declineFriendRequest:(TSIncomingMessage *)friendRequest

@ -24,12 +24,13 @@ public final class LokiDatabaseUtilities : NSObject {
// MARK: Device Links
@objc(getLinkedDeviceHexEncodedPublicKeysFor:in:)
public static func getLinkedDeviceHexEncodedPublicKeys(for hexEncodedPublicKey: String, in transaction: YapDatabaseReadWriteTransaction) -> Set<String> {
var result = Set<TSContactThread>()
let storage = OWSPrimaryStorage.shared()
let masterHexEncodedPublicKey = storage.getMasterHexEncodedPublicKey(for: hexEncodedPublicKey, in: transaction) ?? hexEncodedPublicKey
return Set(storage.getDeviceLinks(for: masterHexEncodedPublicKey, in: transaction).flatMap { deviceLink in
var result = Set(storage.getDeviceLinks(for: masterHexEncodedPublicKey, in: transaction).flatMap { deviceLink in
return [ deviceLink.master.hexEncodedPublicKey, deviceLink.slave.hexEncodedPublicKey ]
})
result.insert(hexEncodedPublicKey)
return result
}
@objc(getLinkedDeviceThreadsFor:in:)

@ -498,9 +498,15 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException";
OWSAssertDebug(message);
OWSAssertDebug(errorHandle);
NSMutableSet<NSString *> *recipientIds = [NSMutableSet new];
__block NSMutableSet<NSString *> *recipientIds = [NSMutableSet new];
if ([message isKindOfClass:[OWSOutgoingSyncMessage class]]) {
[recipientIds addObject:self.tsAccountManager.localNumber];
NSString *userHexEncodedPublicKey = OWSIdentityManager.sharedManager.identityKeyPair.hexEncodedPublicKey;
[OWSPrimaryStorage.sharedManager.dbReadWriteConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) {
NSString *masterHexEncodedPublicKey = [LKDatabaseUtilities getMasterHexEncodedPublicKeyFor:userHexEncodedPublicKey in:transaction] ?: userHexEncodedPublicKey;
NSMutableSet<NSString *> *linkedDeviceHexEncodedPublicKeys = [LKDatabaseUtilities getLinkedDeviceHexEncodedPublicKeysFor:userHexEncodedPublicKey in:transaction].mutableCopy;
[linkedDeviceHexEncodedPublicKeys removeObject:userHexEncodedPublicKey];
recipientIds = [recipientIds setByAddingObjectsFromSet:linkedDeviceHexEncodedPublicKeys].mutableCopy;
}];
} else if (thread.isGroupThread) {
[self.primaryStorage.dbReadConnection readWithBlock:^(YapDatabaseReadTransaction *transaction) {
LKPublicChat *publicChat = [LKDatabaseUtilities getPublicChatForThreadID:thread.uniqueId transaction:transaction];
@ -935,7 +941,7 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException";
if (isGroupMessage || isDeviceLinkMessage) {
[self sendMessage:messageSend];
} else {
BOOL isSilentMessage = message.isSilent || [message isKindOfClass:LKEphemeralMessage.class];
BOOL isSilentMessage = message.isSilent || [message isKindOfClass:LKEphemeralMessage.class] || [message isKindOfClass:OWSOutgoingSyncMessage.class];
BOOL isFriendRequestMessage = [message isKindOfClass:LKFriendRequestMessage.class];
[[LKAPI getDestinationsFor:contactID]
.thenOn(OWSDispatch.sendingQueue, ^(NSArray<LKDestination *> *destinations) {

Loading…
Cancel
Save