From 6adc8cf0146c9616543d1da626e54e26883a36bd Mon Sep 17 00:00:00 2001 From: Niels Andriesse Date: Mon, 20 May 2019 12:31:21 +1000 Subject: [PATCH] Add isFriendRequestExpired flag --- Signal/src/Jobs/SessionResetJob.swift | 2 +- .../ConversationView/ConversationViewController.m | 4 ++-- SignalServiceKit/src/Contacts/TSThread.h | 2 +- SignalServiceKit/src/Contacts/TSThread.m | 13 ++++++------- .../src/Loki/Utilities/FriendRequestExpireJob.swift | 4 +++- .../src/Messages/Interactions/TSMessage.h | 4 +++- .../src/Messages/Interactions/TSMessage.m | 12 +++++++++++- SignalServiceKit/src/Messages/OWSMessageManager.m | 6 +++--- SignalServiceKit/src/Messages/OWSMessageSender.m | 6 +++--- 9 files changed, 33 insertions(+), 20 deletions(-) diff --git a/Signal/src/Jobs/SessionResetJob.swift b/Signal/src/Jobs/SessionResetJob.swift index 55ddce922..f23d723cb 100644 --- a/Signal/src/Jobs/SessionResetJob.swift +++ b/Signal/src/Jobs/SessionResetJob.swift @@ -143,7 +143,7 @@ public class SessionResetOperation: OWSOperation, DurableOperation { */ if (self.contactThread.sessionResetState != .requestReceived) { - let message = TSInfoMessage(timestamp: NSDate.ows_millisecondTimeStamp(), in: self.contactThread, messageType: .typeLokiSessionResetProgress) + let message = TSInfoMessage(timestamp: NSDate.ows_millisecondTimeStamp(), in: self.contactThread, messageType: .typeLokiSessionResetInProgress) message.save(with: transaction) // Loki: We have initiated a session reset diff --git a/Signal/src/ViewControllers/ConversationView/ConversationViewController.m b/Signal/src/ViewControllers/ConversationView/ConversationViewController.m index c07f79d14..903dfeda2 100644 --- a/Signal/src/ViewControllers/ConversationView/ConversationViewController.m +++ b/Signal/src/ViewControllers/ConversationView/ConversationViewController.m @@ -4315,7 +4315,7 @@ typedef enum : NSUInteger { - (void)acceptFriendRequest:(TSIncomingMessage *)friendRequest { // Update the thread's friend request state - [self.thread setFriendRequestStatus:TSThreadFriendRequestStatusFriends withTransaction:nil]; + [self.thread saveFriendRequestStatus:TSThreadFriendRequestStatusFriends withTransaction:nil]; // Send friend request accepted message [ThreadUtil enqueueAcceptFriendRequestMessageInThread:self.thread]; } @@ -4323,7 +4323,7 @@ typedef enum : NSUInteger { - (void)declineFriendRequest:(TSIncomingMessage *)friendRequest { // Reset friend request status - [self.thread setFriendRequestStatus:TSThreadFriendRequestStatusNone withTransaction:nil]; + [self.thread saveFriendRequestStatus:TSThreadFriendRequestStatusNone withTransaction:nil]; // Delete prekeys NSString *contactID = self.thread.recipientIdentifiers.firstObject; OWSPrimaryStorage *primaryStorage = SSKEnvironment.shared.primaryStorage; diff --git a/SignalServiceKit/src/Contacts/TSThread.h b/SignalServiceKit/src/Contacts/TSThread.h index b5f2741d2..31bf35534 100644 --- a/SignalServiceKit/src/Contacts/TSThread.h +++ b/SignalServiceKit/src/Contacts/TSThread.h @@ -198,7 +198,7 @@ typedef NS_ENUM(NSInteger, TSThreadFriendRequestStatus) { #pragma mark - Loki Friend Request Handling -- (void)setFriendRequestStatus:(TSThreadFriendRequestStatus)friendRequestStatus withTransaction:(YapDatabaseReadWriteTransaction *_Nullable)transaction; +- (void)saveFriendRequestStatus:(TSThreadFriendRequestStatus)friendRequestStatus withTransaction:(YapDatabaseReadWriteTransaction *_Nullable)transaction; @end diff --git a/SignalServiceKit/src/Contacts/TSThread.m b/SignalServiceKit/src/Contacts/TSThread.m index 6c99dcc9b..c4d958438 100644 --- a/SignalServiceKit/src/Contacts/TSThread.m +++ b/SignalServiceKit/src/Contacts/TSThread.m @@ -698,19 +698,18 @@ ConversationColorName const kConversationColorName_Default = ConversationColorNa #pragma mark - Loki Friend Request Handling -- (void)setFriendRequestStatus:(TSThreadFriendRequestStatus)friendRequestStatus withTransaction:(YapDatabaseReadWriteTransaction *_Nullable)transaction +- (void)saveFriendRequestStatus:(TSThreadFriendRequestStatus)friendRequestStatus withTransaction:(YapDatabaseReadWriteTransaction *_Nullable)transaction { self.friendRequestStatus = friendRequestStatus; + void (^postNotification)() = ^() { + [NSNotificationCenter.defaultCenter postNotificationName:NSNotification.threadFriendRequestStatusChanged object:self.uniqueId]; + }; if (transaction == nil) { [self save]; - [self.dbReadWriteConnection flushTransactionsWithCompletionQueue:dispatch_get_main_queue() completionBlock:^{ - [NSNotificationCenter.defaultCenter postNotificationName:NSNotification.threadFriendRequestStatusChanged object:self.uniqueId]; - }]; + [self.dbReadWriteConnection flushTransactionsWithCompletionQueue:dispatch_get_main_queue() completionBlock:^{ postNotification(); }]; } else { [self saveWithTransaction:transaction]; - [transaction.connection flushTransactionsWithCompletionQueue:dispatch_get_main_queue() completionBlock:^{ - [NSNotificationCenter.defaultCenter postNotificationName:NSNotification.threadFriendRequestStatusChanged object:self.uniqueId]; - }]; + [transaction.connection flushTransactionsWithCompletionQueue:dispatch_get_main_queue() completionBlock:^{ postNotification(); }]; } } diff --git a/SignalServiceKit/src/Loki/Utilities/FriendRequestExpireJob.swift b/SignalServiceKit/src/Loki/Utilities/FriendRequestExpireJob.swift index e97c2ca46..95944ddd2 100644 --- a/SignalServiceKit/src/Loki/Utilities/FriendRequestExpireJob.swift +++ b/SignalServiceKit/src/Loki/Utilities/FriendRequestExpireJob.swift @@ -150,12 +150,14 @@ public class FriendRequestExpireJob: NSObject { guard message.thread.friendRequestStatus == .requestSent else { // Set message to not expire, so our other logic works correctly message.saveFriendRequestExpires(at: 0, with: transaction) + message.saveIsFriendRequestExpired(true, with: transaction) return; } // Loki: Expire the friend request message - message.thread.setFriendRequestStatus(.requestExpired, with: transaction) + message.thread.saveFriendRequestStatus(.requestExpired, with: transaction) message.saveFriendRequestExpires(at: 0, with: transaction) + message.saveIsFriendRequestExpired(true, with: transaction) }, transaction: transaction) } }) diff --git a/SignalServiceKit/src/Messages/Interactions/TSMessage.h b/SignalServiceKit/src/Messages/Interactions/TSMessage.h index 15018046b..f143ada14 100644 --- a/SignalServiceKit/src/Messages/Interactions/TSMessage.h +++ b/SignalServiceKit/src/Messages/Interactions/TSMessage.h @@ -30,6 +30,7 @@ NS_ASSUME_NONNULL_BEGIN @property (nonatomic, readonly, nullable) OWSLinkPreview *linkPreview; @property (nonatomic) BOOL isFriendRequest; // Loki @property (nonatomic) uint64_t friendRequestExpiresAt; +@property (nonatomic) BOOL isFriendRequestExpired; - (instancetype)initInteractionWithTimestamp:(uint64_t)timestamp inThread:(TSThread *)thread NS_UNAVAILABLE; @@ -72,8 +73,9 @@ NS_ASSUME_NONNULL_BEGIN #pragma mark - Loki Friend Request Handling -- (void)setIsFriendRequest:(BOOL)isFriendRequest withTransaction:(YapDatabaseReadWriteTransaction *)transaction; +- (void)saveIsFriendRequest:(BOOL)isFriendRequest withTransaction:(YapDatabaseReadWriteTransaction *_Nullable)transaction; - (void)saveFriendRequestExpiresAt:(u_int64_t)expiresAt withTransaction:(YapDatabaseReadWriteTransaction *_Nullable)transaction; +- (void)saveIsFriendRequestExpired:(BOOL)isFriendRequestExpired withTransaction:(YapDatabaseReadWriteTransaction *_Nullable)transaction; @end diff --git a/SignalServiceKit/src/Messages/Interactions/TSMessage.m b/SignalServiceKit/src/Messages/Interactions/TSMessage.m index 82c9197b4..6003cfe71 100644 --- a/SignalServiceKit/src/Messages/Interactions/TSMessage.m +++ b/SignalServiceKit/src/Messages/Interactions/TSMessage.m @@ -441,7 +441,7 @@ static const NSUInteger OWSMessageSchemaVersion = 4; #pragma mark - Loki Friend Request Handling -- (void)setIsFriendRequest:(BOOL)isFriendRequest withTransaction:(YapDatabaseReadWriteTransaction *)transaction +- (void)saveIsFriendRequest:(BOOL)isFriendRequest withTransaction:(YapDatabaseReadWriteTransaction *_Nullable)transaction { self.isFriendRequest = isFriendRequest; if (transaction == nil) { @@ -461,6 +461,16 @@ static const NSUInteger OWSMessageSchemaVersion = 4; } } +- (void)saveIsFriendRequestExpired:(BOOL)isFriendRequestExpired withTransaction:(YapDatabaseReadWriteTransaction *_Nullable)transaction +{ + self.isFriendRequest = isFriendRequestExpired; + if (transaction == nil) { + [self save]; + } else { + [self saveWithTransaction:transaction]; + } +} + @end NS_ASSUME_NONNULL_END diff --git a/SignalServiceKit/src/Messages/OWSMessageManager.m b/SignalServiceKit/src/Messages/OWSMessageManager.m index 27fcd72e6..7f918a601 100644 --- a/SignalServiceKit/src/Messages/OWSMessageManager.m +++ b/SignalServiceKit/src/Messages/OWSMessageManager.m @@ -1474,7 +1474,7 @@ NS_ASSUME_NONNULL_BEGIN // before updating Alice's thread's friend request status to TSThreadFriendRequestStatusFriends, // we can end up in a deadlock where both users' threads' friend request statuses are // TSThreadFriendRequestStatusRequestSent. - [thread setFriendRequestStatus:TSThreadFriendRequestStatusFriends withTransaction:transaction]; + [thread saveFriendRequestStatus:TSThreadFriendRequestStatusFriends withTransaction:transaction]; // The two lines below are equivalent to calling [ThreadUtil enqueueAcceptFriendRequestMessageInThread:thread] OWSEphemeralMessage *emptyMessage = [OWSEphemeralMessage createEmptyOutgoingMessageInThread:thread]; @@ -1485,13 +1485,13 @@ NS_ASSUME_NONNULL_BEGIN // friend request status is reset to TSThreadFriendRequestStatusNone. Bob now sends Alice a friend // request. Alice's thread's friend request status is reset to // TSThreadFriendRequestStatusRequestReceived. - [thread setFriendRequestStatus:TSThreadFriendRequestStatusRequestReceived withTransaction:transaction]; + [thread saveFriendRequestStatus:TSThreadFriendRequestStatusRequestReceived withTransaction:transaction]; message.isFriendRequest = YES; } } else if (!thread.isContactFriend) { // 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. - [thread setFriendRequestStatus:TSThreadFriendRequestStatusFriends withTransaction:transaction]; + [thread saveFriendRequestStatus:TSThreadFriendRequestStatusFriends withTransaction:transaction]; } } diff --git a/SignalServiceKit/src/Messages/OWSMessageSender.m b/SignalServiceKit/src/Messages/OWSMessageSender.m index 3e86ee0be..d50a42322 100644 --- a/SignalServiceKit/src/Messages/OWSMessageSender.m +++ b/SignalServiceKit/src/Messages/OWSMessageSender.m @@ -1110,7 +1110,7 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException"; // Update the thread's friend request status if needed NSInteger *messageType = ((NSNumber *)signalMessage[@"type"]).integerValue; if (messageType == TSFriendRequestMessageType) { - [message.thread setFriendRequestStatus:TSThreadFriendRequestStatusRequestSending withTransaction:nil]; + [message.thread saveFriendRequestStatus:TSThreadFriendRequestStatusRequestSending withTransaction:nil]; } BOOL isPoWRequired = YES; // TODO: Base on message type [[LokiAPI objc_sendSignalMessage:signalMessage to:recipient.recipientId timestamp:message.timestamp requiringPoW:isPoWRequired] @@ -1118,7 +1118,7 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException"; // Loki // ======== if (messageType == TSFriendRequestMessageType) { - [message.thread setFriendRequestStatus:TSThreadFriendRequestStatusRequestSent withTransaction:nil]; + [message.thread saveFriendRequestStatus:TSThreadFriendRequestStatusRequestSent withTransaction:nil]; // We also want to expire the message after 72 hours NSTimeInterval expireTimeInterval = 72 * kHourInterval; @@ -1136,7 +1136,7 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException"; // Loki // ======== if (messageType == TSFriendRequestMessageType) { - [message.thread setFriendRequestStatus:TSThreadFriendRequestStatusNone withTransaction:nil]; + [message.thread saveFriendRequestStatus:TSThreadFriendRequestStatusNone withTransaction:nil]; } // ======== // Handle the error