Fix incorrect logic in OWSMessageManager

pull/19/head
Niels Andriesse 7 years ago
parent 20adddbac1
commit 4c33fa257a

@ -53,6 +53,7 @@ typedef NS_ENUM(NSInteger, TSThreadFriendRequestStatus) {
@property (nonatomic) BOOL shouldThreadBeVisible; @property (nonatomic) BOOL shouldThreadBeVisible;
@property (nonatomic, readonly) NSDate *creationDate; @property (nonatomic, readonly) NSDate *creationDate;
@property (nonatomic, readonly) BOOL isArchivedByLegacyTimestampForSorting; @property (nonatomic, readonly) BOOL isArchivedByLegacyTimestampForSorting;
@property (nonatomic, readonly) TSInteraction *lastInteraction;
// Loki friend request handling // Loki friend request handling
// ======== // ========
@property (nonatomic) TSThreadFriendRequestStatus friendRequestStatus; @property (nonatomic) TSThreadFriendRequestStatus friendRequestStatus;

@ -281,6 +281,16 @@ ConversationColorName const kConversationColorName_Default = ConversationColorNa
}]; }];
} }
- (TSInteraction *)lastInteraction
{
__block TSInteraction *interaction;
[self.dbReadConnection readWithBlock:^(YapDatabaseReadTransaction *transaction) {
YapDatabaseViewTransaction *interactions = [transaction ext:TSMessageDatabaseViewExtensionName];
interaction = [interactions lastObjectInGroup:self.uniqueId];
}];
return interaction;
}
/** /**
* Useful for tests and debugging. In production use an enumeration method. * Useful for tests and debugging. In production use an enumeration method.
*/ */

@ -51,6 +51,7 @@
#import "TSQuotedMessage.h" #import "TSQuotedMessage.h"
#import <SignalCoreKit/Cryptography.h> #import <SignalCoreKit/Cryptography.h>
#import <SignalCoreKit/NSDate+OWS.h> #import <SignalCoreKit/NSDate+OWS.h>
#import <SignalServiceKit/NSObject.h>
#import <SignalServiceKit/SignalRecipient.h> #import <SignalServiceKit/SignalRecipient.h>
#import <SignalServiceKit/SignalServiceKit-Swift.h> #import <SignalServiceKit/SignalServiceKit-Swift.h>
#import <YapDatabase/YapDatabase.h> #import <YapDatabase/YapDatabase.h>
@ -1475,7 +1476,10 @@ NS_ASSUME_NONNULL_BEGIN
// we can end up in a deadlock where both users' threads' friend request statuses are // we can end up in a deadlock where both users' threads' friend request statuses are
// TSThreadFriendRequestStatusRequestSent. // TSThreadFriendRequestStatusRequestSent.
[thread saveFriendRequestStatus:TSThreadFriendRequestStatusFriends withTransaction:transaction]; [thread saveFriendRequestStatus:TSThreadFriendRequestStatusFriends withTransaction:transaction];
[message saveFriendRequestStatus:TSMessageFriendRequestStatusAccepted withTransaction:transaction]; TSOutgoingMessage *existingFriendRequestMessage = (TSOutgoingMessage *)[thread.lastInteraction as:TSOutgoingMessage.class];
if (existingFriendRequestMessage != nil && existingFriendRequestMessage.isFriendRequest) {
[existingFriendRequestMessage saveFriendRequestStatus:TSMessageFriendRequestStatusAccepted withTransaction:transaction];
}
// The two lines below are equivalent to calling [ThreadUtil enqueueAcceptFriendRequestMessageInThread:thread] // The two lines below are equivalent to calling [ThreadUtil enqueueAcceptFriendRequestMessageInThread:thread]
OWSEphemeralMessage *emptyMessage = [OWSEphemeralMessage createEmptyOutgoingMessageInThread:thread]; OWSEphemeralMessage *emptyMessage = [OWSEphemeralMessage createEmptyOutgoingMessageInThread:thread];
[self.messageSenderJobQueue addMessage:emptyMessage transaction:transaction]; [self.messageSenderJobQueue addMessage:emptyMessage transaction:transaction];
@ -1486,13 +1490,16 @@ NS_ASSUME_NONNULL_BEGIN
// request. Alice's thread's friend request status is reset to // request. Alice's thread's friend request status is reset to
// TSThreadFriendRequestStatusRequestReceived. // TSThreadFriendRequestStatusRequestReceived.
[thread saveFriendRequestStatus:TSThreadFriendRequestStatusRequestReceived withTransaction:transaction]; [thread saveFriendRequestStatus:TSThreadFriendRequestStatusRequestReceived withTransaction:transaction];
[message saveFriendRequestStatus:TSMessageFriendRequestStatusPending withTransaction:transaction]; message.friendRequestStatus = TSMessageFriendRequestStatusPending; // Don't save yet. This is done in finalizeIncomingMessage:thread:envelope:transaction.
} }
} else if (!thread.isContactFriend) { } else if (!thread.isContactFriend) {
// If the thread's friend request status is not TSThreadFriendRequestStatusFriends, but we're receiving a message, // If the thread's friend request status is not TSThreadFriendRequestStatusFriends, but we're receiving a message,
// it must be a friend request accepted message. Declining a friend request doesn't send a message. // it must be a friend request accepted message. Declining a friend request doesn't send a message.
[thread saveFriendRequestStatus:TSThreadFriendRequestStatusFriends withTransaction:transaction]; [thread saveFriendRequestStatus:TSThreadFriendRequestStatusFriends withTransaction:transaction];
[message saveFriendRequestStatus:TSMessageFriendRequestStatusAccepted withTransaction:transaction]; TSOutgoingMessage *existingFriendRequestMessage = (TSOutgoingMessage *)[thread.lastInteraction as:TSOutgoingMessage.class];
if (existingFriendRequestMessage != nil && existingFriendRequestMessage.isFriendRequest) {
[existingFriendRequestMessage saveFriendRequestStatus:TSMessageFriendRequestStatusAccepted withTransaction:transaction];
}
} }
} }

@ -1122,7 +1122,6 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException";
[self.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { [self.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) {
[message.thread saveFriendRequestStatus:TSThreadFriendRequestStatusRequestSent withTransaction:transaction]; [message.thread saveFriendRequestStatus:TSThreadFriendRequestStatusRequestSent withTransaction:transaction];
[message.thread removeOutgoingFriendRequestMessagesWithTransaction:transaction]; [message.thread removeOutgoingFriendRequestMessagesWithTransaction:transaction];
[message saveFriendRequestStatus:TSMessageFriendRequestStatusPending withTransaction:transaction];
// Set the expiration date // Set the expiration date
NSTimeInterval expirationInterval = 72 * kHourInterval; NSTimeInterval expirationInterval = 72 * kHourInterval;
NSDate *expireDate = [[NSDate new] dateByAddingTimeInterval:expirationInterval]; NSDate *expireDate = [[NSDate new] dateByAddingTimeInterval:expirationInterval];
@ -1141,7 +1140,6 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException";
// ======== // ========
if (messageType == TSFriendRequestMessageType) { if (messageType == TSFriendRequestMessageType) {
[message.thread saveFriendRequestStatus:TSThreadFriendRequestStatusNone withTransaction:nil]; [message.thread saveFriendRequestStatus:TSThreadFriendRequestStatusNone withTransaction:nil];
[message saveFriendRequestStatus:TSMessageFriendRequestStatusPending withTransaction:nil];
} }
// ======== // ========
// Handle the error // Handle the error

Loading…
Cancel
Save