Add isFriendRequestExpired flag

This commit is contained in:
Niels Andriesse 2019-05-20 12:31:21 +10:00
parent 201b8095ee
commit 6adc8cf014
9 changed files with 33 additions and 20 deletions

View File

@ -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

View File

@ -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;

View File

@ -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

View File

@ -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(); }];
}
}

View File

@ -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)
}
})

View File

@ -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

View File

@ -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

View File

@ -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];
}
}

View File

@ -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