From b2f114cd94abc716a2fbe702ccb13a05e6ed4ea9 Mon Sep 17 00:00:00 2001 From: Niels Andriesse Date: Fri, 24 May 2019 09:49:49 +1000 Subject: [PATCH 1/9] Fix typo --- SignalServiceKit/src/Loki/API/LokiAPI+Message.swift | 3 +-- SignalServiceKit/src/Loki/Crypto/ProofOfWork.swift | 5 +++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/SignalServiceKit/src/Loki/API/LokiAPI+Message.swift b/SignalServiceKit/src/Loki/API/LokiAPI+Message.swift index 188a965bc..2d280d2d2 100644 --- a/SignalServiceKit/src/Loki/API/LokiAPI+Message.swift +++ b/SignalServiceKit/src/Loki/API/LokiAPI+Message.swift @@ -40,8 +40,7 @@ public extension LokiAPI { if isPoWRequired { // The storage server takes a time interval in milliseconds let now = NSDate.ows_millisecondTimeStamp() - let ttlInSeconds = ttl / 1000 - if let nonce = ProofOfWork.calculate(data: data, pubKey: destination, timestamp: now, ttl: ttlInSeconds) { + if let nonce = ProofOfWork.calculate(data: data, pubKey: destination, timestamp: now, ttl: ttl) { let result = Message(destination: destination, data: data, ttl: ttl, timestamp: now, nonce: nonce) seal.fulfill(result) } else { diff --git a/SignalServiceKit/src/Loki/Crypto/ProofOfWork.swift b/SignalServiceKit/src/Loki/Crypto/ProofOfWork.swift index ccebf790e..4e69db3f7 100644 --- a/SignalServiceKit/src/Loki/Crypto/ProofOfWork.swift +++ b/SignalServiceKit/src/Loki/Crypto/ProofOfWork.swift @@ -63,7 +63,7 @@ public enum ProofOfWork { /// - data: The message data /// - pubKey: The message recipient /// - timestamp: The timestamp - /// - ttl: The message time to live, in **seconds** + /// - ttl: The message time to live /// - Returns: A nonce string or `nil` if it failed public static func calculate(data: String, pubKey: String, timestamp: UInt64, ttl: UInt64) -> String? { let payload = createPayload(pubKey: pubKey, data: data, timestamp: timestamp, ttl: ttl) @@ -103,7 +103,8 @@ public enum ProofOfWork { // Do all the calculations let totalLength = UInt64(payloadLength + nonceLength) - let ttlMult = ttl * totalLength + let ttlInSeconds = ttl / 1000 + let ttlMult = ttlInSeconds * totalLength // UInt64 values let innerFrac = ttlMult / two16 From f83fdcbf70c8e5a0ba74180cbb3e0dcb8ab33f44 Mon Sep 17 00:00:00 2001 From: Niels Andriesse Date: Fri, 24 May 2019 09:55:34 +1000 Subject: [PATCH 2/9] Update mock server IP --- SignalServiceKit/src/Loki/API/LokiAPI+SwarmAPI.swift | 4 ++-- SignalServiceKit/src/TSConstants.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/SignalServiceKit/src/Loki/API/LokiAPI+SwarmAPI.swift b/SignalServiceKit/src/Loki/API/LokiAPI+SwarmAPI.swift index 6c09db7ad..a7738bc47 100644 --- a/SignalServiceKit/src/Loki/API/LokiAPI+SwarmAPI.swift +++ b/SignalServiceKit/src/Loki/API/LokiAPI+SwarmAPI.swift @@ -31,7 +31,7 @@ public extension LokiAPI { // MARK: Internal API private static func getRandomSnode() -> Promise { return Promise { seal in - seal.fulfill(Target(address: "http://13.238.53.205", port: 8080)) // TODO: For debugging purposes + seal.fulfill(Target(address: "http://13.236.173.190", port: 8080)) // TODO: For debugging purposes } } @@ -53,7 +53,7 @@ public extension LokiAPI { private static func parseTargets(from rawResponse: Any) -> [Target] { // TODO: For debugging purposes // ======== - let target = Target(address: "http://13.238.53.205", port: defaultSnodePort) + let target = Target(address: "http://13.236.173.190", port: defaultSnodePort) return Array(repeating: target, count: 3) // ======== // guard let json = rawResponse as? JSON, let addresses = json["snodes"] as? [String] else { diff --git a/SignalServiceKit/src/TSConstants.h b/SignalServiceKit/src/TSConstants.h index 10ae5d78f..e2a5b10c5 100644 --- a/SignalServiceKit/src/TSConstants.h +++ b/SignalServiceKit/src/TSConstants.h @@ -27,7 +27,7 @@ typedef NS_ENUM(NSInteger, TSWhisperMessageType) { // Production #define textSecureWebSocketAPI @"wss://textsecure-service.whispersystems.org/v1/websocket/" -#define textSecureServerURL @"http://13.238.53.205" // TODO: Temporary +#define textSecureServerURL @"http://13.236.173.190" // TODO: Temporary #define textSecureCDNServerURL @"https://cdn.signal.org" // Use same reflector for service and CDN #define textSecureServiceReflectorHost @"europe-west1-signal-cdn-reflector.cloudfunctions.net" From 1fafa550f044ed5751146a5a5a0781a1c1a1f9f2 Mon Sep 17 00:00:00 2001 From: Niels Andriesse Date: Fri, 24 May 2019 11:24:27 +1000 Subject: [PATCH 3/9] Fix message sending error handling --- Signal/src/AppDelegate.m | 2 +- SignalServiceKit/src/Contacts/TSThread.m | 1 + .../src/Loki/API/LokiAPI+Convenience.swift | 12 +++ .../src/Loki/API/LokiAPI+SwarmAPI.swift | 5 +- SignalServiceKit/src/Loki/API/LokiAPI.swift | 3 +- .../src/Messages/Interactions/TSMessage.m | 1 + .../src/Messages/OWSMessageSend.swift | 2 +- .../src/Messages/OWSMessageSender.m | 78 +++++++++++-------- .../src/Network/MessageSenderJobQueue.swift | 2 +- 9 files changed, 67 insertions(+), 39 deletions(-) diff --git a/Signal/src/AppDelegate.m b/Signal/src/AppDelegate.m index 5f9be61a3..942aa93ef 100644 --- a/Signal/src/AppDelegate.m +++ b/Signal/src/AppDelegate.m @@ -320,7 +320,7 @@ static NSTimeInterval launchStartedAt; if (self.lokiP2PServer.isRunning) { break; } BOOL isStarted = [self.lokiP2PServer startOnPort:port.unsignedIntegerValue]; if (isStarted) { - OWSLogInfo(@"[Loki] Started server at %@.", self.lokiP2PServer.serverURL); + OWSLogInfo(@"[Loki] Started server at \"%@\".", self.lokiP2PServer.serverURL); break; } } diff --git a/SignalServiceKit/src/Contacts/TSThread.m b/SignalServiceKit/src/Contacts/TSThread.m index e266e6f50..e9e16f252 100644 --- a/SignalServiceKit/src/Contacts/TSThread.m +++ b/SignalServiceKit/src/Contacts/TSThread.m @@ -767,6 +767,7 @@ ConversationColorName const kConversationColorName_Default = ConversationColorNa - (void)saveFriendRequestStatus:(TSThreadFriendRequestStatus)friendRequestStatus withTransaction:(YapDatabaseReadWriteTransaction *_Nullable)transaction { + OWSLogInfo(@"[Loki] Setting thread friend request status to %d.", friendRequestStatus); self.friendRequestStatus = friendRequestStatus; void (^postNotification)() = ^() { [NSNotificationCenter.defaultCenter postNotificationName:NSNotification.threadFriendRequestStatusChanged object:self.uniqueId]; diff --git a/SignalServiceKit/src/Loki/API/LokiAPI+Convenience.swift b/SignalServiceKit/src/Loki/API/LokiAPI+Convenience.swift index 16e489b24..94b68a0be 100644 --- a/SignalServiceKit/src/Loki/API/LokiAPI+Convenience.swift +++ b/SignalServiceKit/src/Loki/API/LokiAPI+Convenience.swift @@ -35,6 +35,18 @@ internal extension LokiAPI { } } +internal extension Promise { + + internal func recoveringNetworkErrorsIfNeeded() -> Promise { + return recover() { error -> Promise in + switch error { + case NetworkManagerError.taskError(_, let underlyingError): throw underlyingError + default: throw error + } + } + } +} + internal extension AnyPromise { internal static func from(_ promise: Promise) -> AnyPromise { diff --git a/SignalServiceKit/src/Loki/API/LokiAPI+SwarmAPI.swift b/SignalServiceKit/src/Loki/API/LokiAPI+SwarmAPI.swift index a7738bc47..a6cdfc897 100644 --- a/SignalServiceKit/src/Loki/API/LokiAPI+SwarmAPI.swift +++ b/SignalServiceKit/src/Loki/API/LokiAPI+SwarmAPI.swift @@ -31,7 +31,7 @@ public extension LokiAPI { // MARK: Internal API private static func getRandomSnode() -> Promise { return Promise { seal in - seal.fulfill(Target(address: "http://13.236.173.190", port: 8080)) // TODO: For debugging purposes + seal.fulfill(Target(address: "http://13.236.173.191", port: 8080)) // TODO: For debugging purposes } } @@ -53,7 +53,7 @@ public extension LokiAPI { private static func parseTargets(from rawResponse: Any) -> [Target] { // TODO: For debugging purposes // ======== - let target = Target(address: "http://13.236.173.190", port: defaultSnodePort) + let target = Target(address: "http://13.236.173.191", port: defaultSnodePort) return Array(repeating: target, count: 3) // ======== // guard let json = rawResponse as? JSON, let addresses = json["snodes"] as? [String] else { @@ -76,6 +76,7 @@ internal extension Promise { Logger.warn("[Loki] There appears to be a problem with LokiNet.") case 421: // The snode isn't associated with the given public key anymore + Logger.warn("[Loki] Invalidating swarm for: \(hexEncodedPublicKey).") let swarm = LokiAPI.swarmCache[hexEncodedPublicKey] if var swarm = swarm, let index = swarm.firstIndex(of: target) { swarm.remove(at: index) diff --git a/SignalServiceKit/src/Loki/API/LokiAPI.swift b/SignalServiceKit/src/Loki/API/LokiAPI.swift index b7b62a9df..760f67127 100644 --- a/SignalServiceKit/src/Loki/API/LokiAPI.swift +++ b/SignalServiceKit/src/Loki/API/LokiAPI.swift @@ -28,7 +28,8 @@ import PromiseKit internal static func invoke(_ method: Target.Method, on target: Target, associatedWith hexEncodedPublicKey: String, parameters: [String:Any] = [:]) -> Promise { let url = URL(string: "\(target.address):\(target.port)/\(version)/storage_rpc")! let request = TSRequest(url: url, method: "POST", parameters: [ "method" : method.rawValue, "params" : parameters ]) - return TSNetworkManager.shared().makePromise(request: request).map { $0.responseObject }.handlingSwarmSpecificErrorsIfNeeded(for: target, associatedWith: hexEncodedPublicKey) + return TSNetworkManager.shared().makePromise(request: request).map { $0.responseObject } + .handlingSwarmSpecificErrorsIfNeeded(for: target, associatedWith: hexEncodedPublicKey).recoveringNetworkErrorsIfNeeded() } // MARK: Public API diff --git a/SignalServiceKit/src/Messages/Interactions/TSMessage.m b/SignalServiceKit/src/Messages/Interactions/TSMessage.m index 4df337e48..01f906e70 100644 --- a/SignalServiceKit/src/Messages/Interactions/TSMessage.m +++ b/SignalServiceKit/src/Messages/Interactions/TSMessage.m @@ -443,6 +443,7 @@ static const NSUInteger OWSMessageSchemaVersion = 4; - (void)saveFriendRequestStatus:(TSMessageFriendRequestStatus)friendRequestStatus withTransaction:(YapDatabaseReadWriteTransaction *_Nullable)transaction { + OWSLogInfo(@"[Loki] Setting message friend request status to %d.", friendRequestStatus); self.friendRequestStatus = friendRequestStatus; void (^postNotification)() = ^() { [NSNotificationCenter.defaultCenter postNotificationName:NSNotification.messageFriendRequestStatusChanged object:self.uniqueId]; diff --git a/SignalServiceKit/src/Messages/OWSMessageSend.swift b/SignalServiceKit/src/Messages/OWSMessageSend.swift index 366e5b99c..bb9b0fefb 100644 --- a/SignalServiceKit/src/Messages/OWSMessageSend.swift +++ b/SignalServiceKit/src/Messages/OWSMessageSend.swift @@ -21,7 +21,7 @@ public class OWSMessageSend: NSObject { @objc public let recipient: SignalRecipient - private static let kMaxRetriesPerRecipient: Int = 3 + private static let kMaxRetriesPerRecipient: Int = 1 @objc public var remainingAttempts = OWSMessageSend.kMaxRetriesPerRecipient diff --git a/SignalServiceKit/src/Messages/OWSMessageSender.m b/SignalServiceKit/src/Messages/OWSMessageSender.m index c6c66f788..eb16f703f 100644 --- a/SignalServiceKit/src/Messages/OWSMessageSender.m +++ b/SignalServiceKit/src/Messages/OWSMessageSender.m @@ -1066,10 +1066,10 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException"; hasValidMessageType = [validMessageTypes containsObject:messageType]; /* Loki: Original code - hasValidMessageType = ([messageType isEqualToNumber:@(TSEncryptedWhisperMessageType)] || - [messageType isEqualToNumber:@(TSPreKeyWhisperMessageType)]); + * ======== + hasValidMessageType = ([messageType isEqualToNumber:@(TSEncryptedWhisperMessageType)] || [messageType isEqualToNumber:@(TSPreKeyWhisperMessageType)]); + * ======== */ - } if (!hasValidMessageType) { @@ -1103,16 +1103,45 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException"; return messageSend.failure(error); } - // Update the state to show that the proof of work is being calculated - [self saveIsCalculatingProofOfWork:YES forMessage:messageSend]; - // Convert the message to a Loki message and send it using the Loki messaging API + // Get the message parameters and type NSDictionary *signalMessage = deviceMessages.firstObject; - // Update the message and thread if needed - NSInteger *messageType = ((NSNumber *)signalMessage[@"type"]).integerValue; - if (messageType == TSFriendRequestMessageType) { - [message.thread saveFriendRequestStatus:TSThreadFriendRequestStatusRequestSending withTransaction:nil]; - [message saveFriendRequestStatus:TSMessageFriendRequestStatusPending withTransaction:nil]; - } + TSWhisperMessageType messageType = ((NSNumber *)signalMessage[@"type"]).integerValue; + [self.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { + // Update the PoW calculation status + [message saveIsCalculatingProofOfWork:YES withTransaction:transaction]; + // Update the message and thread if needed + if (messageType == TSFriendRequestMessageType) { + [message.thread saveFriendRequestStatus:TSThreadFriendRequestStatusRequestSending withTransaction:transaction]; + [message saveFriendRequestStatus:TSMessageFriendRequestStatusPending withTransaction:transaction]; + } + }]; + // Convenience + void (^handleError)(NSError *error) = ^(NSError *error) { + [self.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { + // Update the thread if needed + if (messageType == TSFriendRequestMessageType) { + [message.thread saveFriendRequestStatus:TSThreadFriendRequestStatusNone withTransaction:transaction]; + } + // Update the PoW calculation status + [message saveIsCalculatingProofOfWork:NO withTransaction:transaction]; + }]; + // Handle the error + NSUInteger statusCode = 0; + NSData *_Nullable responseData = nil; + if ([error.domain isEqualToString:TSNetworkManagerErrorDomain]) { + statusCode = error.code; + NSError *_Nullable underlyingError = error.userInfo[NSUnderlyingErrorKey]; + if (underlyingError) { + responseData = underlyingError.userInfo[AFNetworkingOperationFailingURLResponseDataErrorKey]; + } else { + OWSFailDebug(@"Missing underlying error: %@.", error); + } + } else { + OWSFailDebug(@"Unexpected error: %@.", error); + } + [self messageSendDidFail:messageSend deviceMessages:deviceMessages statusCode:statusCode error:error responseData:responseData]; + }; + // Convert the message to a Loki message and send it using the Loki API [[LokiAPI objc_sendSignalMessage:signalMessage to:recipient.recipientId with:message.timestamp] .thenOn(OWSDispatch.sendingQueue, ^(id result) { NSSet *promises = (NSSet *)result; @@ -1140,29 +1169,12 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException"; .catchOn(OWSDispatch.sendingQueue, ^(NSError *error) { errorCount += 1; if (errorCount != promiseCount) { return; } // Only error out if all promises failed - // Update the thread if needed - if (messageType == TSFriendRequestMessageType) { - [message.thread saveFriendRequestStatus:TSThreadFriendRequestStatusNone withTransaction:nil]; - } - // Update the PoW calculation status - [self saveIsCalculatingProofOfWork:NO forMessage:messageSend]; - // Handle the error - NSUInteger statusCode = 0; - NSData *_Nullable responseData = nil; - if ([error.domain isEqualToString:TSNetworkManagerErrorDomain]) { - statusCode = error.code; - NSError *_Nullable underlyingError = error.userInfo[NSUnderlyingErrorKey]; - if (underlyingError) { - responseData = underlyingError.userInfo[AFNetworkingOperationFailingURLResponseDataErrorKey]; - } else { - OWSFailDebug(@"Missing underlying error: %@.", error); - } - } else { - OWSFailDebug(@"Unexpected error: %@.", error); - } - [self messageSendDidFail:messageSend deviceMessages:deviceMessages statusCode:statusCode error:error responseData:responseData]; + handleError(error); }) retainUntilComplete]; } + }) + .catchOn(OWSDispatch.sendingQueue, ^(NSError *error) { // Unreachable snode; usually a problem with LokiNet + handleError(error); }) retainUntilComplete]; // Loki: Original code diff --git a/SignalServiceKit/src/Network/MessageSenderJobQueue.swift b/SignalServiceKit/src/Network/MessageSenderJobQueue.swift index e2891998d..b989691d6 100644 --- a/SignalServiceKit/src/Network/MessageSenderJobQueue.swift +++ b/SignalServiceKit/src/Network/MessageSenderJobQueue.swift @@ -81,7 +81,7 @@ public class MessageSenderJobQueue: NSObject, JobQueue { public typealias DurableOperationType = MessageSenderOperation public static let jobRecordLabel: String = "MessageSender" - public static let maxRetries: UInt = 30 + public static let maxRetries: UInt = 1 public let requiresInternet: Bool = true public var runningOperations: [MessageSenderOperation] = [] From 96c02864c8dd520bb059393fd731e041a7ffb4c0 Mon Sep 17 00:00:00 2001 From: Niels Andriesse Date: Fri, 24 May 2019 11:36:26 +1000 Subject: [PATCH 4/9] Improve logging --- SignalServiceKit/src/Contacts/TSThread.h | 1 + SignalServiceKit/src/Contacts/TSThread.m | 14 +++++++++++++- .../src/Loki/API/LokiAPI+SwarmAPI.swift | 4 ++-- .../src/Messages/Interactions/TSMessage.h | 1 + .../src/Messages/Interactions/TSMessage.m | 13 ++++++++++++- 5 files changed, 29 insertions(+), 4 deletions(-) diff --git a/SignalServiceKit/src/Contacts/TSThread.h b/SignalServiceKit/src/Contacts/TSThread.h index 204540600..2f13af5e7 100644 --- a/SignalServiceKit/src/Contacts/TSThread.h +++ b/SignalServiceKit/src/Contacts/TSThread.h @@ -57,6 +57,7 @@ typedef NS_ENUM(NSInteger, TSThreadFriendRequestStatus) { // Loki friend request handling // ======== @property (nonatomic) TSThreadFriendRequestStatus friendRequestStatus; +@property (nonatomic, readonly) NSString *friendRequestStatusDescription; /// Shorthand for checking that `friendRequestStatus` is `TSThreadFriendRequestStatusRequestSending`, `TSThreadFriendRequestStatusRequestSent` /// or `TSThreadFriendRequestStatusRequestReceived`. @property (nonatomic, readonly) BOOL hasPendingFriendRequest; diff --git a/SignalServiceKit/src/Contacts/TSThread.m b/SignalServiceKit/src/Contacts/TSThread.m index e9e16f252..78f68e62c 100644 --- a/SignalServiceKit/src/Contacts/TSThread.m +++ b/SignalServiceKit/src/Contacts/TSThread.m @@ -767,8 +767,8 @@ ConversationColorName const kConversationColorName_Default = ConversationColorNa - (void)saveFriendRequestStatus:(TSThreadFriendRequestStatus)friendRequestStatus withTransaction:(YapDatabaseReadWriteTransaction *_Nullable)transaction { - OWSLogInfo(@"[Loki] Setting thread friend request status to %d.", friendRequestStatus); self.friendRequestStatus = friendRequestStatus; + OWSLogInfo(@"[Loki] Setting thread friend request status to %@.", self.friendRequestStatusDescription); void (^postNotification)() = ^() { [NSNotificationCenter.defaultCenter postNotificationName:NSNotification.threadFriendRequestStatusChanged object:self.uniqueId]; }; @@ -781,6 +781,18 @@ ConversationColorName const kConversationColorName_Default = ConversationColorNa } } +- (NSString *)friendRequestStatusDescription +{ + switch (self.friendRequestStatus) { + case TSThreadFriendRequestStatusNone: return @"none"; + case TSThreadFriendRequestStatusRequestSending: return @"sending"; + case TSThreadFriendRequestStatusRequestSent: return @"sent"; + case TSThreadFriendRequestStatusRequestReceived: return @"received"; + case TSThreadFriendRequestStatusFriends: return @"friends"; + case TSThreadFriendRequestStatusRequestExpired: return @"expired"; + } +} + - (BOOL)hasPendingFriendRequest { return self.friendRequestStatus == TSThreadFriendRequestStatusRequestSending || self.friendRequestStatus == TSThreadFriendRequestStatusRequestSent diff --git a/SignalServiceKit/src/Loki/API/LokiAPI+SwarmAPI.swift b/SignalServiceKit/src/Loki/API/LokiAPI+SwarmAPI.swift index a6cdfc897..e091b50b8 100644 --- a/SignalServiceKit/src/Loki/API/LokiAPI+SwarmAPI.swift +++ b/SignalServiceKit/src/Loki/API/LokiAPI+SwarmAPI.swift @@ -31,7 +31,7 @@ public extension LokiAPI { // MARK: Internal API private static func getRandomSnode() -> Promise { return Promise { seal in - seal.fulfill(Target(address: "http://13.236.173.191", port: 8080)) // TODO: For debugging purposes + seal.fulfill(Target(address: "http://13.236.173.190", port: 8080)) // TODO: For debugging purposes } } @@ -53,7 +53,7 @@ public extension LokiAPI { private static func parseTargets(from rawResponse: Any) -> [Target] { // TODO: For debugging purposes // ======== - let target = Target(address: "http://13.236.173.191", port: defaultSnodePort) + let target = Target(address: "http://13.236.173.190", port: defaultSnodePort) return Array(repeating: target, count: 3) // ======== // guard let json = rawResponse as? JSON, let addresses = json["snodes"] as? [String] else { diff --git a/SignalServiceKit/src/Messages/Interactions/TSMessage.h b/SignalServiceKit/src/Messages/Interactions/TSMessage.h index 455cce3d2..f837645cc 100644 --- a/SignalServiceKit/src/Messages/Interactions/TSMessage.h +++ b/SignalServiceKit/src/Messages/Interactions/TSMessage.h @@ -45,6 +45,7 @@ typedef NS_ENUM(NSInteger, TSMessageFriendRequestStatus) { // Loki friend request handling // ======== @property (nonatomic) TSMessageFriendRequestStatus friendRequestStatus; +@property (nonatomic, readonly) NSString *friendRequestStatusDescription; @property (nonatomic) uint64_t friendRequestExpiresAt; @property (nonatomic, readonly) BOOL isFriendRequest; // ======== diff --git a/SignalServiceKit/src/Messages/Interactions/TSMessage.m b/SignalServiceKit/src/Messages/Interactions/TSMessage.m index 01f906e70..31b83881a 100644 --- a/SignalServiceKit/src/Messages/Interactions/TSMessage.m +++ b/SignalServiceKit/src/Messages/Interactions/TSMessage.m @@ -443,8 +443,8 @@ static const NSUInteger OWSMessageSchemaVersion = 4; - (void)saveFriendRequestStatus:(TSMessageFriendRequestStatus)friendRequestStatus withTransaction:(YapDatabaseReadWriteTransaction *_Nullable)transaction { - OWSLogInfo(@"[Loki] Setting message friend request status to %d.", friendRequestStatus); self.friendRequestStatus = friendRequestStatus; + OWSLogInfo(@"[Loki] Setting message friend request status to %@.", self.friendRequestStatusDescription); void (^postNotification)() = ^() { [NSNotificationCenter.defaultCenter postNotificationName:NSNotification.messageFriendRequestStatusChanged object:self.uniqueId]; }; @@ -457,6 +457,17 @@ static const NSUInteger OWSMessageSchemaVersion = 4; } } +- (NSString *)friendRequestStatusDescription +{ + switch (self.friendRequestStatus) { + case TSMessageFriendRequestStatusNone: return @"none"; + case TSMessageFriendRequestStatusPending: return @"pending"; + case TSMessageFriendRequestStatusAccepted: return @"accepted"; + case TSMessageFriendRequestStatusDeclined: return @"declined"; + case TSMessageFriendRequestStatusExpired: return @"expired"; + } +} + - (void)saveFriendRequestExpiresAt:(u_int64_t)expiresAt withTransaction:(YapDatabaseReadWriteTransaction *_Nullable)transaction { self.friendRequestExpiresAt = expiresAt; From 33a5e59415e9354b3e06b07e7a196ea09cf31011 Mon Sep 17 00:00:00 2001 From: Niels Andriesse Date: Fri, 24 May 2019 12:15:31 +1000 Subject: [PATCH 5/9] Clean --- Signal/src/AppDelegate.m | 6 +++++- SignalServiceKit/src/Loki/API/LokiAPI+SwarmAPI.swift | 4 ++-- SignalServiceKit/src/Loki/API/LokiMessageWrapper.swift | 2 +- .../src/Loki/Messages/FriendRequestExpirationJob.swift | 2 +- SignalServiceKit/src/Messages/OWSMessageSender.m | 1 + 5 files changed, 10 insertions(+), 5 deletions(-) diff --git a/Signal/src/AppDelegate.m b/Signal/src/AppDelegate.m index 942aa93ef..933952dd7 100644 --- a/Signal/src/AppDelegate.m +++ b/Signal/src/AppDelegate.m @@ -320,7 +320,11 @@ static NSTimeInterval launchStartedAt; if (self.lokiP2PServer.isRunning) { break; } BOOL isStarted = [self.lokiP2PServer startOnPort:port.unsignedIntegerValue]; if (isStarted) { - OWSLogInfo(@"[Loki] Started server at \"%@\".", self.lokiP2PServer.serverURL); + NSString *serverURL = self.lokiP2PServer.serverURL.absoluteString; + if ([serverURL hasSuffix:@"/"]) { + serverURL = [serverURL substringToIndex:serverURL.length - 1]; + } + OWSLogInfo(@"[Loki] Started server at %@.", serverURL); break; } } diff --git a/SignalServiceKit/src/Loki/API/LokiAPI+SwarmAPI.swift b/SignalServiceKit/src/Loki/API/LokiAPI+SwarmAPI.swift index e091b50b8..516d6f925 100644 --- a/SignalServiceKit/src/Loki/API/LokiAPI+SwarmAPI.swift +++ b/SignalServiceKit/src/Loki/API/LokiAPI+SwarmAPI.swift @@ -31,7 +31,7 @@ public extension LokiAPI { // MARK: Internal API private static func getRandomSnode() -> Promise { return Promise { seal in - seal.fulfill(Target(address: "http://13.236.173.190", port: 8080)) // TODO: For debugging purposes + seal.fulfill(Target(address: "http://13.236.173.190", port: defaultSnodePort)) // TODO: For debugging purposes } } @@ -73,7 +73,7 @@ internal extension Promise { switch error.statusCode { case 0: // The snode is unreachable; usually a problem with LokiNet - Logger.warn("[Loki] There appears to be a problem with LokiNet.") + Logger.warn("[Loki] Couldn't reach snode at: \(target.address):\(target.port).") case 421: // The snode isn't associated with the given public key anymore Logger.warn("[Loki] Invalidating swarm for: \(hexEncodedPublicKey).") diff --git a/SignalServiceKit/src/Loki/API/LokiMessageWrapper.swift b/SignalServiceKit/src/Loki/API/LokiMessageWrapper.swift index 03ae7dc70..e0a5e0356 100644 --- a/SignalServiceKit/src/Loki/API/LokiMessageWrapper.swift +++ b/SignalServiceKit/src/Loki/API/LokiMessageWrapper.swift @@ -52,7 +52,7 @@ public enum LokiMessageWrapper { /// Wrap a `SignalMessage` in an `SSKProtoEnvelope`. private static func createEnvelope(around signalMessage: SignalMessage, timestamp: UInt64) throws -> SSKProtoEnvelope { guard let keyPair = SSKEnvironment.shared.identityManager.identityKeyPair() else { - owsFailDebug("[Loki] Failed to wrap message in envelope: identityManager.identityKeyPair() is invalid.") + owsFailDebug("[Loki] Failed to wrap message in envelope: SSKEnvironment.shared.identityManager.identityKeyPair() is invalid.") throw WrappingError.failedToWrapMessageInEnvelope } do { diff --git a/SignalServiceKit/src/Loki/Messages/FriendRequestExpirationJob.swift b/SignalServiceKit/src/Loki/Messages/FriendRequestExpirationJob.swift index 07e65544b..0ca56d09a 100644 --- a/SignalServiceKit/src/Loki/Messages/FriendRequestExpirationJob.swift +++ b/SignalServiceKit/src/Loki/Messages/FriendRequestExpirationJob.swift @@ -140,7 +140,7 @@ public final class FriendRequestExpirationJob : NSObject { private func timerDidFire(isMainTimer: Bool) { guard CurrentAppContext().isMainAppAndActive else { let infoString = isMainTimer ? "Main timer fired while main app is inactive." : "Ignoring fallback timer for app which is not main and active." - Logger.info("[Loki] Friend request expiration job: \(infoString)") + Logger.info("[Loki] Friend request expiration job running: \(infoString).") return } diff --git a/SignalServiceKit/src/Messages/OWSMessageSender.m b/SignalServiceKit/src/Messages/OWSMessageSender.m index eb16f703f..7262b8ae8 100644 --- a/SignalServiceKit/src/Messages/OWSMessageSender.m +++ b/SignalServiceKit/src/Messages/OWSMessageSender.m @@ -1342,6 +1342,7 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException"; }; switch (statusCode) { + case 0: return messageSend.failure(responseError); // Loki case 401: { OWSLogWarn(@"Unable to send due to invalid credentials. Did the user's client get de-authed by " @"registering elsewhere?"); From cbac37a95f39ebf11921088f22920ca531d7b227 Mon Sep 17 00:00:00 2001 From: Niels Andriesse Date: Fri, 24 May 2019 16:23:27 +1000 Subject: [PATCH 6/9] Fix friend request UI bugs --- Signal/src/Loki/FriendRequestView.swift | 31 +++++++++++++++---- .../ConversationView/Cells/OWSMessageCell.m | 2 +- .../ConversationView/ConversationViewItem.m | 2 +- SignalServiceKit/src/Contacts/TSThread.h | 12 +++---- SignalServiceKit/src/Contacts/TSThread.m | 12 +++---- .../Loki/Messages/LKFriendRequestMessage.m | 2 -- .../src/Messages/Interactions/TSMessage.h | 9 ++---- .../src/Messages/Interactions/TSMessage.m | 7 +++++ .../src/Messages/OWSMessageManager.m | 2 +- .../src/Messages/OWSMessageSender.m | 25 +++++++-------- 10 files changed, 61 insertions(+), 43 deletions(-) diff --git a/Signal/src/Loki/FriendRequestView.swift b/Signal/src/Loki/FriendRequestView.swift index faa89a84f..6c1950765 100644 --- a/Signal/src/Loki/FriendRequestView.swift +++ b/Signal/src/Loki/FriendRequestView.swift @@ -12,6 +12,12 @@ enum Kind : String { case incoming, outgoing } // MARK: Components + private lazy var topSpacer: UIView = { + let result = UIView() + result.autoSetDimension(.height, toSize: 12) + return result + }() + private lazy var label: UILabel = { let result = UILabel() result.textColor = Theme.secondaryColor @@ -47,6 +53,7 @@ let mainStackView = UIStackView() mainStackView.axis = .vertical mainStackView.distribution = .fill + mainStackView.addArrangedSubview(topSpacer) mainStackView.addArrangedSubview(label) switch kind { case .incoming: @@ -85,23 +92,33 @@ buttonStackView.isHidden = message.friendRequestStatus != .pending let format: String = { switch (message.friendRequestStatus) { + case .none, .sendingOrFailed: preconditionFailure() + case .pending: return NSLocalizedString("%@ sent you a friend request", comment: "") case .accepted: return NSLocalizedString("You've accepted %@'s friend request", comment: "") case .declined: return NSLocalizedString("You've declined %@'s friend request", comment: "") case .expired: return NSLocalizedString("%@'s friend request has expired", comment: "") - default: return NSLocalizedString("%@ sent you a friend request", comment: "") + default: preconditionFailure() } }() label.text = String(format: format, message.authorId) case .outgoing: guard let message = message as? TSOutgoingMessage else { preconditionFailure() } - let format: String = { + let format: String? = { switch (message.friendRequestStatus) { + case .none: preconditionFailure() + case .sendingOrFailed: return nil + case .pending: return NSLocalizedString("You've sent %@ a friend request", comment: "") case .accepted: return NSLocalizedString("%@ accepted your friend request", comment: "") + case .declined: preconditionFailure() case .expired: return NSLocalizedString("Your friend request to %@ has expired", comment: "") - default: return NSLocalizedString("You've sent %@ a friend request", comment: "") + default: preconditionFailure() } }() - label.text = String(format: format, message.thread.contactIdentifier()!) + if let format = format { + label.text = String(format: format, message.thread.contactIdentifier()!) + } + label.isHidden = (format == nil) + topSpacer.isHidden = (label.isHidden) } } @@ -121,9 +138,11 @@ // MARK: Measuring @objc static func calculateHeight(message: TSMessage, conversationStyle: ConversationStyle) -> CGFloat { let width = conversationStyle.contentWidth - let topSpacing: CGFloat = 12 let dummyFriendRequestView = FriendRequestView(message: message) - let labelHeight = dummyFriendRequestView.label.sizeThatFits(CGSize(width: width, height: CGFloat.greatestFiniteMagnitude)).height + let hasTopSpacer = !dummyFriendRequestView.topSpacer.isHidden + let topSpacing: CGFloat = hasTopSpacer ? 12 : 0 + let hasLabel = !dummyFriendRequestView.label.isHidden + let labelHeight = hasLabel ? dummyFriendRequestView.label.sizeThatFits(CGSize(width: width, height: CGFloat.greatestFiniteMagnitude)).height : 0 let hasButtonStackView = dummyFriendRequestView.buttonStackView.superview != nil && !dummyFriendRequestView.buttonStackView.isHidden let buttonHeight = hasButtonStackView ? dummyFriendRequestView.buttonHeight : 0 let totalHeight = topSpacing + labelHeight + buttonHeight diff --git a/Signal/src/ViewControllers/ConversationView/Cells/OWSMessageCell.m b/Signal/src/ViewControllers/ConversationView/Cells/OWSMessageCell.m index 3c7da4c60..1dec55af3 100644 --- a/Signal/src/ViewControllers/ConversationView/Cells/OWSMessageCell.m +++ b/Signal/src/ViewControllers/ConversationView/Cells/OWSMessageCell.m @@ -214,7 +214,7 @@ NS_ASSUME_NONNULL_BEGIN [self.viewConstraints addObjectsFromArray:@[ [self.friendRequestView autoPinEdgeToSuperviewEdge:ALEdgeLeading withInset:self.conversationStyle.gutterLeading], [self.friendRequestView autoPinEdgeToSuperviewEdge:ALEdgeTrailing withInset:self.conversationStyle.gutterTrailing], - [self.friendRequestView autoPinEdge:ALEdgeTop toEdge:ALEdgeBottom ofView:self.messageBubbleView withOffset:12.f], + [self.friendRequestView autoPinEdge:ALEdgeTop toEdge:ALEdgeBottom ofView:self.messageBubbleView], [self.friendRequestView autoPinEdgeToSuperviewEdge:ALEdgeBottom] ]]; } diff --git a/Signal/src/ViewControllers/ConversationView/ConversationViewItem.m b/Signal/src/ViewControllers/ConversationView/ConversationViewItem.m index 318e73153..9c7c25297 100644 --- a/Signal/src/ViewControllers/ConversationView/ConversationViewItem.m +++ b/Signal/src/ViewControllers/ConversationView/ConversationViewItem.m @@ -407,7 +407,7 @@ NSString *NSStringForOWSMessageCellType(OWSMessageCellType cellType) } } else if (self.interaction.interactionType == OWSInteractionType_OutgoingMessage && previousLayoutItem.interaction.interactionType == OWSInteractionType_OutgoingMessage - && !([previousLayoutItem.interaction isKindOfClass:TSOutgoingMessage.class] && ((TSOutgoingMessage *)previousLayoutItem.interaction).isFriendRequest)) { + && !((TSOutgoingMessage *)previousLayoutItem.interaction).hasFriendRequestStatusMessage) { return 2.f; } diff --git a/SignalServiceKit/src/Contacts/TSThread.h b/SignalServiceKit/src/Contacts/TSThread.h index 2f13af5e7..30b86ddb5 100644 --- a/SignalServiceKit/src/Contacts/TSThread.h +++ b/SignalServiceKit/src/Contacts/TSThread.h @@ -31,17 +31,17 @@ extern ConversationColorName const kConversationColorName_Default; // Loki: Friend request status typedef NS_ENUM(NSInteger, TSThreadFriendRequestStatus) { - /// New conversation, no messages sent or received. + /// New conversation; no messages sent or received. TSThreadFriendRequestStatusNone, /// This state is used to lock the input early while sending. TSThreadFriendRequestStatusRequestSending, - /// Friend request sent, awaiting response. + /// Friend request sent; awaiting response. TSThreadFriendRequestStatusRequestSent, - /// Friend request received, awaiting user input. + /// Friend request received; awaiting user input. TSThreadFriendRequestStatusRequestReceived, /// We are friends with the other user in this thread. TSThreadFriendRequestStatusFriends, - /// Friend request sent but it timed out (i.e. the other user didn't accept within the allocated time). + /// A friend request was sent, but it timed out (i.e. the other user didn't accept within the allocated time). TSThreadFriendRequestStatusRequestExpired }; @@ -205,12 +205,12 @@ typedef NS_ENUM(NSInteger, TSThreadFriendRequestStatus) { /** Remove any outgoing friend request message which failed to send */ -- (void)removeOldOutgoingFriendRequestMessagesWithTransaction:(YapDatabaseReadWriteTransaction *)transaction; +- (void)removeOldOutgoingFriendRequestMessagesIfNeededWithTransaction:(YapDatabaseReadWriteTransaction *)transaction; /** Remove any old incoming friend request message that is still pending */ -- (void)removeOldIncomingFriendRequestMessagesWithTransaction:(YapDatabaseReadWriteTransaction *)transaction; +- (void)removeOldIncomingFriendRequestMessagesIfNeededWithTransaction:(YapDatabaseReadWriteTransaction *)transaction; @end diff --git a/SignalServiceKit/src/Contacts/TSThread.m b/SignalServiceKit/src/Contacts/TSThread.m index 78f68e62c..225eed83a 100644 --- a/SignalServiceKit/src/Contacts/TSThread.m +++ b/SignalServiceKit/src/Contacts/TSThread.m @@ -708,17 +708,17 @@ ConversationColorName const kConversationColorName_Default = ConversationColorNa #pragma mark - Loki Friend Request Handling -- (void)removeOldOutgoingFriendRequestMessagesWithTransaction:(YapDatabaseReadWriteTransaction *)transaction +- (void)removeOldOutgoingFriendRequestMessagesIfNeededWithTransaction:(YapDatabaseReadWriteTransaction *)transaction { - [self removeOldFriendRequestMessages:OWSInteractionType_OutgoingMessage withTransaction:transaction]; + [self removeOldFriendRequestMessagesIfNeeded:OWSInteractionType_OutgoingMessage withTransaction:transaction]; } -- (void)removeOldIncomingFriendRequestMessagesWithTransaction:(YapDatabaseReadWriteTransaction *)transaction +- (void)removeOldIncomingFriendRequestMessagesIfNeededWithTransaction:(YapDatabaseReadWriteTransaction *)transaction { - [self removeOldFriendRequestMessages:OWSInteractionType_IncomingMessage withTransaction:transaction]; + [self removeOldFriendRequestMessagesIfNeeded:OWSInteractionType_IncomingMessage withTransaction:transaction]; } -- (void)removeOldFriendRequestMessages:(OWSInteractionType)interactionType withTransaction:(YapDatabaseReadWriteTransaction *)transaction +- (void)removeOldFriendRequestMessagesIfNeeded:(OWSInteractionType)interactionType withTransaction:(YapDatabaseReadWriteTransaction *)transaction { // If we're friends with the person then we don't need to remove any friend request messages if (self.friendRequestStatus == TSThreadFriendRequestStatusFriends) { return; } @@ -743,7 +743,7 @@ ConversationColorName const kConversationColorName_Default = ConversationColorNa } else { // Or if we're sending then remove any failed friend request messages TSOutgoingMessage *outgoingMessage = (TSOutgoingMessage *)message; - removeMessage = outgoingMessage.isFriendRequest && outgoingMessage.messageState == TSOutgoingMessageStateFailed; + removeMessage = outgoingMessage.friendRequestStatus == TSMessageFriendRequestStatusSendingOrFailed; } if (removeMessage) { diff --git a/SignalServiceKit/src/Loki/Messages/LKFriendRequestMessage.m b/SignalServiceKit/src/Loki/Messages/LKFriendRequestMessage.m index 9897e988e..2f60b7774 100644 --- a/SignalServiceKit/src/Loki/Messages/LKFriendRequestMessage.m +++ b/SignalServiceKit/src/Loki/Messages/LKFriendRequestMessage.m @@ -6,8 +6,6 @@ @implementation LKFriendRequestMessage -- (BOOL)isFriendRequest { return YES; } - - (uint)ttl { return 4 * kDayInMs; } // Friend requests should stay for the longest on the storage server - (SSKProtoContentBuilder *)contentBuilder:(SignalRecipient *)recipient { diff --git a/SignalServiceKit/src/Messages/Interactions/TSMessage.h b/SignalServiceKit/src/Messages/Interactions/TSMessage.h index f837645cc..fabcb67cb 100644 --- a/SignalServiceKit/src/Messages/Interactions/TSMessage.h +++ b/SignalServiceKit/src/Messages/Interactions/TSMessage.h @@ -17,17 +17,13 @@ NS_ASSUME_NONNULL_BEGIN @class TSQuotedMessage; @class YapDatabaseReadWriteTransaction; -// Loki: Friend request status typedef NS_ENUM(NSInteger, TSMessageFriendRequestStatus) { - /// Not a friend request message. TSMessageFriendRequestStatusNone, - /// A pending friend request. + TSMessageFriendRequestStatusSendingOrFailed, + /// Either sent or received. TSMessageFriendRequestStatusPending, - /// A friend request that has been accepted. TSMessageFriendRequestStatusAccepted, - /// A friend request that has been declined. TSMessageFriendRequestStatusDeclined, - /// A friend request that has expired. TSMessageFriendRequestStatusExpired }; @@ -48,6 +44,7 @@ typedef NS_ENUM(NSInteger, TSMessageFriendRequestStatus) { @property (nonatomic, readonly) NSString *friendRequestStatusDescription; @property (nonatomic) uint64_t friendRequestExpiresAt; @property (nonatomic, readonly) BOOL isFriendRequest; +@property (nonatomic, readonly) BOOL hasFriendRequestStatusMessage; // ======== - (instancetype)initInteractionWithTimestamp:(uint64_t)timestamp inThread:(TSThread *)thread NS_UNAVAILABLE; diff --git a/SignalServiceKit/src/Messages/Interactions/TSMessage.m b/SignalServiceKit/src/Messages/Interactions/TSMessage.m index 31b83881a..8eebcdf9a 100644 --- a/SignalServiceKit/src/Messages/Interactions/TSMessage.m +++ b/SignalServiceKit/src/Messages/Interactions/TSMessage.m @@ -82,6 +82,7 @@ static const NSUInteger OWSMessageSchemaVersion = 4; _quotedMessage = quotedMessage; _contactShare = contactShare; _linkPreview = linkPreview; + _friendRequestStatus = TSMessageFriendRequestStatusNone; _friendRequestExpiresAt = 0; return self; @@ -461,6 +462,7 @@ static const NSUInteger OWSMessageSchemaVersion = 4; { switch (self.friendRequestStatus) { case TSMessageFriendRequestStatusNone: return @"none"; + case TSMessageFriendRequestStatusSendingOrFailed: return @"sending or failed"; case TSMessageFriendRequestStatusPending: return @"pending"; case TSMessageFriendRequestStatusAccepted: return @"accepted"; case TSMessageFriendRequestStatusDeclined: return @"declined"; @@ -483,6 +485,11 @@ static const NSUInteger OWSMessageSchemaVersion = 4; return self.friendRequestStatus != TSMessageFriendRequestStatusNone; } +- (BOOL)hasFriendRequestStatusMessage +{ + return self.isFriendRequest && self.friendRequestStatus != TSMessageFriendRequestStatusSendingOrFailed; +} + @end NS_ASSUME_NONNULL_END diff --git a/SignalServiceKit/src/Messages/OWSMessageManager.m b/SignalServiceKit/src/Messages/OWSMessageManager.m index 3e85b5a64..646b2d97e 100644 --- a/SignalServiceKit/src/Messages/OWSMessageManager.m +++ b/SignalServiceKit/src/Messages/OWSMessageManager.m @@ -1529,7 +1529,7 @@ NS_ASSUME_NONNULL_BEGIN // Remove any old incoming messages if (incomingMessage.isFriendRequest) { - [thread removeOldIncomingFriendRequestMessagesWithTransaction:transaction]; + [thread removeOldIncomingFriendRequestMessagesIfNeededWithTransaction:transaction]; } // Any messages sent from the current user - from this device or another - should be automatically marked as read. diff --git a/SignalServiceKit/src/Messages/OWSMessageSender.m b/SignalServiceKit/src/Messages/OWSMessageSender.m index 7262b8ae8..2a4b6cdf1 100644 --- a/SignalServiceKit/src/Messages/OWSMessageSender.m +++ b/SignalServiceKit/src/Messages/OWSMessageSender.m @@ -1112,7 +1112,7 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException"; // Update the message and thread if needed if (messageType == TSFriendRequestMessageType) { [message.thread saveFriendRequestStatus:TSThreadFriendRequestStatusRequestSending withTransaction:transaction]; - [message saveFriendRequestStatus:TSMessageFriendRequestStatusPending withTransaction:transaction]; + [message saveFriendRequestStatus:TSMessageFriendRequestStatusSendingOrFailed withTransaction:transaction]; } }]; // Convenience @@ -1121,6 +1121,7 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException"; // Update the thread if needed if (messageType == TSFriendRequestMessageType) { [message.thread saveFriendRequestStatus:TSThreadFriendRequestStatusNone withTransaction:transaction]; + [message saveFriendRequestStatus:TSMessageFriendRequestStatusSendingOrFailed withTransaction:transaction]; } // Update the PoW calculation status [message saveIsCalculatingProofOfWork:NO withTransaction:transaction]; @@ -1153,11 +1154,13 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException"; .thenOn(OWSDispatch.sendingQueue, ^(id result) { if (isSuccess) { return; } // Succeed as soon as the first promise succeeds isSuccess = YES; - // Update the message and thread if needed if (messageType == TSFriendRequestMessageType) { [self.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { + // Update the thread [message.thread saveFriendRequestStatus:TSThreadFriendRequestStatusRequestSent withTransaction:transaction]; - [message.thread removeOldOutgoingFriendRequestMessagesWithTransaction:transaction]; + [message.thread removeOldOutgoingFriendRequestMessagesIfNeededWithTransaction:transaction]; + // Update the message + [message saveFriendRequestStatus:TSMessageFriendRequestStatusPending withTransaction:transaction]; NSTimeInterval expirationInterval = 72 * kHourInterval; NSDate *expirationDate = [[NSDate new] dateByAddingTimeInterval:expirationInterval]; [message saveFriendRequestExpiresAt:[NSDate ows_millisecondsSince1970ForDate:expirationDate] withTransaction:transaction]; @@ -1240,16 +1243,6 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException"; */ } -- (void)saveIsCalculatingProofOfWork:(BOOL)isCalculatingPoW forMessage:(OWSMessageSend *)messageSend -{ - OWSAssertDebug(messageSend); - dispatch_async(OWSDispatch.sendingQueue, ^{ - [self.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { - [messageSend.message saveIsCalculatingProofOfWork:isCalculatingPoW withTransaction:transaction]; - }]; - }); -} - - (void)messageSendDidSucceed:(OWSMessageSend *)messageSend deviceMessages:(NSArray *)deviceMessages wasSentByUD:(BOOL)wasSentByUD @@ -1342,7 +1335,11 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException"; }; switch (statusCode) { - case 0: return messageSend.failure(responseError); // Loki + case 0: { // Loki + NSError *error = OWSErrorMakeFailedToSendOutgoingMessageError(); + [error setIsRetryable:NO]; + return messageSend.failure(error); + } case 401: { OWSLogWarn(@"Unable to send due to invalid credentials. Did the user's client get de-authed by " @"registering elsewhere?"); From 22623815bb27d5f68fb485fa5a1ca98cae25b246 Mon Sep 17 00:00:00 2001 From: Niels Andriesse Date: Fri, 24 May 2019 16:25:25 +1000 Subject: [PATCH 7/9] Enforce naming convention --- .../ConversationViewController.m | 4 +-- SignalServiceKit/src/Contacts/TSThread.h | 23 +++++++------ SignalServiceKit/src/Contacts/TSThread.m | 32 +++++++++---------- .../src/Messages/Interactions/TSMessage.h | 18 +++++------ .../src/Messages/Interactions/TSMessage.m | 20 ++++++------ .../src/Messages/OWSMessageManager.m | 26 +++++++-------- .../src/Messages/OWSMessageSender.m | 12 +++---- 7 files changed, 67 insertions(+), 68 deletions(-) diff --git a/Signal/src/ViewControllers/ConversationView/ConversationViewController.m b/Signal/src/ViewControllers/ConversationView/ConversationViewController.m index a825db204..a4b4e03e4 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 status - [self.thread saveFriendRequestStatus:TSThreadFriendRequestStatusFriends withTransaction:nil]; + [self.thread saveFriendRequestStatus:LKThreadFriendRequestStatusFriends withTransaction:nil]; // Send a friend request accepted message [ThreadUtil enqueueAcceptFriendRequestMessageInThread:self.thread]; } @@ -4323,7 +4323,7 @@ typedef enum : NSUInteger { - (void)declineFriendRequest:(TSIncomingMessage *)friendRequest { // Reset the thread's friend request status - [self.thread saveFriendRequestStatus:TSThreadFriendRequestStatusNone withTransaction:nil]; + [self.thread saveFriendRequestStatus:LKThreadFriendRequestStatusNone withTransaction:nil]; // Delete prekeys NSString *contactID = friendRequest.authorId; OWSPrimaryStorage *primaryStorage = SSKEnvironment.shared.primaryStorage; diff --git a/SignalServiceKit/src/Contacts/TSThread.h b/SignalServiceKit/src/Contacts/TSThread.h index 30b86ddb5..8e5a8f50f 100644 --- a/SignalServiceKit/src/Contacts/TSThread.h +++ b/SignalServiceKit/src/Contacts/TSThread.h @@ -29,20 +29,19 @@ extern ConversationColorName const ConversationColorNameSteel; extern ConversationColorName const kConversationColorName_Default; -// Loki: Friend request status -typedef NS_ENUM(NSInteger, TSThreadFriendRequestStatus) { +typedef NS_ENUM(NSInteger, LKThreadFriendRequestStatus) { /// New conversation; no messages sent or received. - TSThreadFriendRequestStatusNone, + LKThreadFriendRequestStatusNone, /// This state is used to lock the input early while sending. - TSThreadFriendRequestStatusRequestSending, + LKThreadFriendRequestStatusRequestSending, /// Friend request sent; awaiting response. - TSThreadFriendRequestStatusRequestSent, + LKThreadFriendRequestStatusRequestSent, /// Friend request received; awaiting user input. - TSThreadFriendRequestStatusRequestReceived, + LKThreadFriendRequestStatusRequestReceived, /// We are friends with the other user in this thread. - TSThreadFriendRequestStatusFriends, + LKThreadFriendRequestStatusFriends, /// A friend request was sent, but it timed out (i.e. the other user didn't accept within the allocated time). - TSThreadFriendRequestStatusRequestExpired + LKThreadFriendRequestStatusRequestExpired }; /** @@ -56,10 +55,10 @@ typedef NS_ENUM(NSInteger, TSThreadFriendRequestStatus) { @property (nonatomic, readonly) TSInteraction *lastInteraction; // Loki friend request handling // ======== -@property (nonatomic) TSThreadFriendRequestStatus friendRequestStatus; +@property (nonatomic) LKThreadFriendRequestStatus friendRequestStatus; @property (nonatomic, readonly) NSString *friendRequestStatusDescription; -/// Shorthand for checking that `friendRequestStatus` is `TSThreadFriendRequestStatusRequestSending`, `TSThreadFriendRequestStatusRequestSent` -/// or `TSThreadFriendRequestStatusRequestReceived`. +/// Shorthand for checking that `friendRequestStatus` is `LKThreadFriendRequestStatusRequestSending`, `LKThreadFriendRequestStatusRequestSent` +/// or `LKThreadFriendRequestStatusRequestReceived`. @property (nonatomic, readonly) BOOL hasPendingFriendRequest; @property (nonatomic, readonly) BOOL isContactFriend; @property (nonatomic, readonly) BOOL hasCurrentUserSentFriendRequest; @@ -200,7 +199,7 @@ typedef NS_ENUM(NSInteger, TSThreadFriendRequestStatus) { #pragma mark - Loki Friend Request Handling -- (void)saveFriendRequestStatus:(TSThreadFriendRequestStatus)friendRequestStatus withTransaction:(YapDatabaseReadWriteTransaction *_Nullable)transaction; +- (void)saveFriendRequestStatus:(LKThreadFriendRequestStatus)friendRequestStatus withTransaction:(YapDatabaseReadWriteTransaction *_Nullable)transaction; /** Remove any outgoing friend request message which failed to send diff --git a/SignalServiceKit/src/Contacts/TSThread.m b/SignalServiceKit/src/Contacts/TSThread.m index 225eed83a..3b10a7c37 100644 --- a/SignalServiceKit/src/Contacts/TSThread.m +++ b/SignalServiceKit/src/Contacts/TSThread.m @@ -93,7 +93,7 @@ ConversationColorName const kConversationColorName_Default = ConversationColorNa _conversationColorName = [self.class stableColorNameForNewConversationWithString:self.uniqueId]; } - _friendRequestStatus = TSThreadFriendRequestStatusNone; + _friendRequestStatus = LKThreadFriendRequestStatusNone; } return self; @@ -721,7 +721,7 @@ ConversationColorName const kConversationColorName_Default = ConversationColorNa - (void)removeOldFriendRequestMessagesIfNeeded:(OWSInteractionType)interactionType withTransaction:(YapDatabaseReadWriteTransaction *)transaction { // If we're friends with the person then we don't need to remove any friend request messages - if (self.friendRequestStatus == TSThreadFriendRequestStatusFriends) { return; } + if (self.friendRequestStatus == LKThreadFriendRequestStatusFriends) { return; } NSMutableArray *idsToRemove = [NSMutableArray new]; __block TSMessage *_Nullable messageToKeep = nil; // We want to keep this interaction and not remove it @@ -739,11 +739,11 @@ ConversationColorName const kConversationColorName_Default = ConversationColorNa // We want to remove any old incoming friend request messages which are pending if (interactionType == OWSInteractionType_IncomingMessage) { - removeMessage = message.friendRequestStatus == TSMessageFriendRequestStatusPending; + removeMessage = message.friendRequestStatus == LKMessageFriendRequestStatusPending; } else { // Or if we're sending then remove any failed friend request messages TSOutgoingMessage *outgoingMessage = (TSOutgoingMessage *)message; - removeMessage = outgoingMessage.friendRequestStatus == TSMessageFriendRequestStatusSendingOrFailed; + removeMessage = outgoingMessage.friendRequestStatus == LKMessageFriendRequestStatusSendingOrFailed; } if (removeMessage) { @@ -765,7 +765,7 @@ ConversationColorName const kConversationColorName_Default = ConversationColorNa } } -- (void)saveFriendRequestStatus:(TSThreadFriendRequestStatus)friendRequestStatus withTransaction:(YapDatabaseReadWriteTransaction *_Nullable)transaction +- (void)saveFriendRequestStatus:(LKThreadFriendRequestStatus)friendRequestStatus withTransaction:(YapDatabaseReadWriteTransaction *_Nullable)transaction { self.friendRequestStatus = friendRequestStatus; OWSLogInfo(@"[Loki] Setting thread friend request status to %@.", self.friendRequestStatusDescription); @@ -784,34 +784,34 @@ ConversationColorName const kConversationColorName_Default = ConversationColorNa - (NSString *)friendRequestStatusDescription { switch (self.friendRequestStatus) { - case TSThreadFriendRequestStatusNone: return @"none"; - case TSThreadFriendRequestStatusRequestSending: return @"sending"; - case TSThreadFriendRequestStatusRequestSent: return @"sent"; - case TSThreadFriendRequestStatusRequestReceived: return @"received"; - case TSThreadFriendRequestStatusFriends: return @"friends"; - case TSThreadFriendRequestStatusRequestExpired: return @"expired"; + case LKThreadFriendRequestStatusNone: return @"none"; + case LKThreadFriendRequestStatusRequestSending: return @"sending"; + case LKThreadFriendRequestStatusRequestSent: return @"sent"; + case LKThreadFriendRequestStatusRequestReceived: return @"received"; + case LKThreadFriendRequestStatusFriends: return @"friends"; + case LKThreadFriendRequestStatusRequestExpired: return @"expired"; } } - (BOOL)hasPendingFriendRequest { - return self.friendRequestStatus == TSThreadFriendRequestStatusRequestSending || self.friendRequestStatus == TSThreadFriendRequestStatusRequestSent - || self.friendRequestStatus == TSThreadFriendRequestStatusRequestReceived; + return self.friendRequestStatus == LKThreadFriendRequestStatusRequestSending || self.friendRequestStatus == LKThreadFriendRequestStatusRequestSent + || self.friendRequestStatus == LKThreadFriendRequestStatusRequestReceived; } - (BOOL)isContactFriend { - return self.friendRequestStatus == TSThreadFriendRequestStatusFriends; + return self.friendRequestStatus == LKThreadFriendRequestStatusFriends; } - (BOOL)hasCurrentUserSentFriendRequest { - return self.friendRequestStatus == TSThreadFriendRequestStatusRequestSent; + return self.friendRequestStatus == LKThreadFriendRequestStatusRequestSent; } - (BOOL)hasCurrentUserReceivedFriendRequest { - return self.friendRequestStatus == TSThreadFriendRequestStatusRequestReceived; + return self.friendRequestStatus == LKThreadFriendRequestStatusRequestReceived; } @end diff --git a/SignalServiceKit/src/Messages/Interactions/TSMessage.h b/SignalServiceKit/src/Messages/Interactions/TSMessage.h index fabcb67cb..b6d98f64b 100644 --- a/SignalServiceKit/src/Messages/Interactions/TSMessage.h +++ b/SignalServiceKit/src/Messages/Interactions/TSMessage.h @@ -17,14 +17,14 @@ NS_ASSUME_NONNULL_BEGIN @class TSQuotedMessage; @class YapDatabaseReadWriteTransaction; -typedef NS_ENUM(NSInteger, TSMessageFriendRequestStatus) { - TSMessageFriendRequestStatusNone, - TSMessageFriendRequestStatusSendingOrFailed, +typedef NS_ENUM(NSInteger, LKMessageFriendRequestStatus) { + LKMessageFriendRequestStatusNone, + LKMessageFriendRequestStatusSendingOrFailed, /// Either sent or received. - TSMessageFriendRequestStatusPending, - TSMessageFriendRequestStatusAccepted, - TSMessageFriendRequestStatusDeclined, - TSMessageFriendRequestStatusExpired + LKMessageFriendRequestStatusPending, + LKMessageFriendRequestStatusAccepted, + LKMessageFriendRequestStatusDeclined, + LKMessageFriendRequestStatusExpired }; @interface TSMessage : TSInteraction @@ -40,7 +40,7 @@ typedef NS_ENUM(NSInteger, TSMessageFriendRequestStatus) { @property (nonatomic, readonly, nullable) OWSLinkPreview *linkPreview; // Loki friend request handling // ======== -@property (nonatomic) TSMessageFriendRequestStatus friendRequestStatus; +@property (nonatomic) LKMessageFriendRequestStatus friendRequestStatus; @property (nonatomic, readonly) NSString *friendRequestStatusDescription; @property (nonatomic) uint64_t friendRequestExpiresAt; @property (nonatomic, readonly) BOOL isFriendRequest; @@ -88,7 +88,7 @@ typedef NS_ENUM(NSInteger, TSMessageFriendRequestStatus) { #pragma mark - Loki Friend Request Handling -- (void)saveFriendRequestStatus:(TSMessageFriendRequestStatus)friendRequestStatus withTransaction:(YapDatabaseReadWriteTransaction *_Nullable)transaction; +- (void)saveFriendRequestStatus:(LKMessageFriendRequestStatus)friendRequestStatus withTransaction:(YapDatabaseReadWriteTransaction *_Nullable)transaction; - (void)saveFriendRequestExpiresAt:(u_int64_t)expiresAt withTransaction:(YapDatabaseReadWriteTransaction *_Nullable)transaction; @end diff --git a/SignalServiceKit/src/Messages/Interactions/TSMessage.m b/SignalServiceKit/src/Messages/Interactions/TSMessage.m index 8eebcdf9a..b059da306 100644 --- a/SignalServiceKit/src/Messages/Interactions/TSMessage.m +++ b/SignalServiceKit/src/Messages/Interactions/TSMessage.m @@ -82,7 +82,7 @@ static const NSUInteger OWSMessageSchemaVersion = 4; _quotedMessage = quotedMessage; _contactShare = contactShare; _linkPreview = linkPreview; - _friendRequestStatus = TSMessageFriendRequestStatusNone; + _friendRequestStatus = LKMessageFriendRequestStatusNone; _friendRequestExpiresAt = 0; return self; @@ -442,7 +442,7 @@ static const NSUInteger OWSMessageSchemaVersion = 4; #pragma mark - Loki Friend Request Handling -- (void)saveFriendRequestStatus:(TSMessageFriendRequestStatus)friendRequestStatus withTransaction:(YapDatabaseReadWriteTransaction *_Nullable)transaction +- (void)saveFriendRequestStatus:(LKMessageFriendRequestStatus)friendRequestStatus withTransaction:(YapDatabaseReadWriteTransaction *_Nullable)transaction { self.friendRequestStatus = friendRequestStatus; OWSLogInfo(@"[Loki] Setting message friend request status to %@.", self.friendRequestStatusDescription); @@ -461,12 +461,12 @@ static const NSUInteger OWSMessageSchemaVersion = 4; - (NSString *)friendRequestStatusDescription { switch (self.friendRequestStatus) { - case TSMessageFriendRequestStatusNone: return @"none"; - case TSMessageFriendRequestStatusSendingOrFailed: return @"sending or failed"; - case TSMessageFriendRequestStatusPending: return @"pending"; - case TSMessageFriendRequestStatusAccepted: return @"accepted"; - case TSMessageFriendRequestStatusDeclined: return @"declined"; - case TSMessageFriendRequestStatusExpired: return @"expired"; + case LKMessageFriendRequestStatusNone: return @"none"; + case LKMessageFriendRequestStatusSendingOrFailed: return @"sending or failed"; + case LKMessageFriendRequestStatusPending: return @"pending"; + case LKMessageFriendRequestStatusAccepted: return @"accepted"; + case LKMessageFriendRequestStatusDeclined: return @"declined"; + case LKMessageFriendRequestStatusExpired: return @"expired"; } } @@ -482,12 +482,12 @@ static const NSUInteger OWSMessageSchemaVersion = 4; - (BOOL)isFriendRequest { - return self.friendRequestStatus != TSMessageFriendRequestStatusNone; + return self.friendRequestStatus != LKMessageFriendRequestStatusNone; } - (BOOL)hasFriendRequestStatusMessage { - return self.isFriendRequest && self.friendRequestStatus != TSMessageFriendRequestStatusSendingOrFailed; + return self.isFriendRequest && self.friendRequestStatus != LKMessageFriendRequestStatusSendingOrFailed; } @end diff --git a/SignalServiceKit/src/Messages/OWSMessageManager.m b/SignalServiceKit/src/Messages/OWSMessageManager.m index 646b2d97e..647ce456d 100644 --- a/SignalServiceKit/src/Messages/OWSMessageManager.m +++ b/SignalServiceKit/src/Messages/OWSMessageManager.m @@ -1469,16 +1469,16 @@ NS_ASSUME_NONNULL_BEGIN // mind and sent a friend request to Alice. In this case we want Alice to auto-accept the request // and send a friend request accepted message back to Bob. We don't check that sending the // friend request accepted message succeeded. Even if it doesn't, the thread's current friend - // request status will be set to TSThreadFriendRequestStatusFriends for Alice making it possible + // request status will be set to LKThreadFriendRequestStatusFriends for Alice making it possible // for Alice to send messages to Bob. When Bob receives a message, his thread's friend request status - // will then be set to TSThreadFriendRequestStatusFriends. If we do check for a successful send - // before updating Alice's thread's friend request status to TSThreadFriendRequestStatusFriends, + // will then be set to LKThreadFriendRequestStatusFriends. If we do check for a successful send + // before updating Alice's thread's friend request status to LKThreadFriendRequestStatusFriends, // we can end up in a deadlock where both users' threads' friend request statuses are - // TSThreadFriendRequestStatusRequestSent. - [thread saveFriendRequestStatus:TSThreadFriendRequestStatusFriends withTransaction:transaction]; + // LKThreadFriendRequestStatusRequestSent. + [thread saveFriendRequestStatus:LKThreadFriendRequestStatusFriends withTransaction:transaction]; TSOutgoingMessage *existingFriendRequestMessage = (TSOutgoingMessage *)[thread.lastInteraction as:TSOutgoingMessage.class]; if (existingFriendRequestMessage != nil && existingFriendRequestMessage.isFriendRequest) { - [existingFriendRequestMessage saveFriendRequestStatus:TSMessageFriendRequestStatusAccepted withTransaction:transaction]; + [existingFriendRequestMessage saveFriendRequestStatus:LKMessageFriendRequestStatusAccepted withTransaction:transaction]; } // The two lines below are equivalent to calling [ThreadUtil enqueueAcceptFriendRequestMessageInThread:thread] LKEphemeralMessage *emptyMessage = [LKEphemeralMessage createEmptyOutgoingMessageInThread:thread]; @@ -1486,19 +1486,19 @@ NS_ASSUME_NONNULL_BEGIN } else if (!thread.isContactFriend) { // Checking that the sender of the message isn't already a friend is necessary because otherwise // the following situation can occur: Alice and Bob are friends. Bob loses his database and his - // friend request status is reset to TSThreadFriendRequestStatusNone. Bob now sends Alice a friend + // friend request status is reset to LKThreadFriendRequestStatusNone. Bob now sends Alice a friend // request. Alice's thread's friend request status is reset to - // TSThreadFriendRequestStatusRequestReceived. - [thread saveFriendRequestStatus:TSThreadFriendRequestStatusRequestReceived withTransaction:transaction]; - message.friendRequestStatus = TSMessageFriendRequestStatusPending; // Don't save yet. This is done in finalizeIncomingMessage:thread:envelope:transaction. + // LKThreadFriendRequestStatusRequestReceived. + [thread saveFriendRequestStatus:LKThreadFriendRequestStatusRequestReceived withTransaction:transaction]; + message.friendRequestStatus = LKMessageFriendRequestStatusPending; // Don't save yet. This is done in finalizeIncomingMessage:thread:envelope:transaction. } } 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 LKThreadFriendRequestStatusFriends, but we're receiving 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:LKThreadFriendRequestStatusFriends withTransaction:transaction]; TSOutgoingMessage *existingFriendRequestMessage = (TSOutgoingMessage *)[thread.lastInteraction as:TSOutgoingMessage.class]; if (existingFriendRequestMessage != nil && existingFriendRequestMessage.isFriendRequest) { - [existingFriendRequestMessage saveFriendRequestStatus:TSMessageFriendRequestStatusAccepted withTransaction:transaction]; + [existingFriendRequestMessage saveFriendRequestStatus:LKMessageFriendRequestStatusAccepted withTransaction:transaction]; } } } diff --git a/SignalServiceKit/src/Messages/OWSMessageSender.m b/SignalServiceKit/src/Messages/OWSMessageSender.m index 2a4b6cdf1..99b47ca01 100644 --- a/SignalServiceKit/src/Messages/OWSMessageSender.m +++ b/SignalServiceKit/src/Messages/OWSMessageSender.m @@ -1111,8 +1111,8 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException"; [message saveIsCalculatingProofOfWork:YES withTransaction:transaction]; // Update the message and thread if needed if (messageType == TSFriendRequestMessageType) { - [message.thread saveFriendRequestStatus:TSThreadFriendRequestStatusRequestSending withTransaction:transaction]; - [message saveFriendRequestStatus:TSMessageFriendRequestStatusSendingOrFailed withTransaction:transaction]; + [message.thread saveFriendRequestStatus:LKThreadFriendRequestStatusRequestSending withTransaction:transaction]; + [message saveFriendRequestStatus:LKMessageFriendRequestStatusSendingOrFailed withTransaction:transaction]; } }]; // Convenience @@ -1120,8 +1120,8 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException"; [self.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { // Update the thread if needed if (messageType == TSFriendRequestMessageType) { - [message.thread saveFriendRequestStatus:TSThreadFriendRequestStatusNone withTransaction:transaction]; - [message saveFriendRequestStatus:TSMessageFriendRequestStatusSendingOrFailed withTransaction:transaction]; + [message.thread saveFriendRequestStatus:LKThreadFriendRequestStatusNone withTransaction:transaction]; + [message saveFriendRequestStatus:LKMessageFriendRequestStatusSendingOrFailed withTransaction:transaction]; } // Update the PoW calculation status [message saveIsCalculatingProofOfWork:NO withTransaction:transaction]; @@ -1157,10 +1157,10 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException"; if (messageType == TSFriendRequestMessageType) { [self.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { // Update the thread - [message.thread saveFriendRequestStatus:TSThreadFriendRequestStatusRequestSent withTransaction:transaction]; + [message.thread saveFriendRequestStatus:LKThreadFriendRequestStatusRequestSent withTransaction:transaction]; [message.thread removeOldOutgoingFriendRequestMessagesIfNeededWithTransaction:transaction]; // Update the message - [message saveFriendRequestStatus:TSMessageFriendRequestStatusPending withTransaction:transaction]; + [message saveFriendRequestStatus:LKMessageFriendRequestStatusPending withTransaction:transaction]; NSTimeInterval expirationInterval = 72 * kHourInterval; NSDate *expirationDate = [[NSDate new] dateByAddingTimeInterval:expirationInterval]; [message saveFriendRequestExpiresAt:[NSDate ows_millisecondsSince1970ForDate:expirationDate] withTransaction:transaction]; From a440a08a040728ed1597ee672ac4298854421708 Mon Sep 17 00:00:00 2001 From: Niels Andriesse Date: Mon, 27 May 2019 09:58:34 +1000 Subject: [PATCH 8/9] Implement retrying --- .../src/Loki/API/LokiAPI+Convenience.swift | 9 --------- SignalServiceKit/src/Loki/API/LokiAPI.swift | 9 ++++++--- .../Loki/Utilities/AnyPromise+Conversion.swift | 10 ++++++++++ .../src/Loki/Utilities/Promise+Retrying.swift | 16 ++++++++++++++++ 4 files changed, 32 insertions(+), 12 deletions(-) create mode 100644 SignalServiceKit/src/Loki/Utilities/AnyPromise+Conversion.swift create mode 100644 SignalServiceKit/src/Loki/Utilities/Promise+Retrying.swift diff --git a/SignalServiceKit/src/Loki/API/LokiAPI+Convenience.swift b/SignalServiceKit/src/Loki/API/LokiAPI+Convenience.swift index 94b68a0be..c829f5a0f 100644 --- a/SignalServiceKit/src/Loki/API/LokiAPI+Convenience.swift +++ b/SignalServiceKit/src/Loki/API/LokiAPI+Convenience.swift @@ -46,12 +46,3 @@ internal extension Promise { } } } - -internal extension AnyPromise { - - internal static func from(_ promise: Promise) -> AnyPromise { - let result = AnyPromise(promise) - result.retainUntilComplete() - return result - } -} diff --git a/SignalServiceKit/src/Loki/API/LokiAPI.swift b/SignalServiceKit/src/Loki/API/LokiAPI.swift index 760f67127..182409db0 100644 --- a/SignalServiceKit/src/Loki/API/LokiAPI.swift +++ b/SignalServiceKit/src/Loki/API/LokiAPI.swift @@ -6,6 +6,7 @@ import PromiseKit // MARK: Settings private static let version = "v1" public static let defaultMessageTTL: UInt64 = 1 * 24 * 60 * 60 * 1000 + private static let maxRetryCount: UInt = 3 // MARK: Types public typealias RawResponse = Any @@ -44,7 +45,7 @@ import PromiseKit let newRawMessages = removeDuplicates(from: rawMessages) return parseProtoEnvelopes(from: newRawMessages) } - }.map { Set($0) } + }.retryingIfNeeded(maxRetryCount: maxRetryCount).map { Set($0) } } public static func sendSignalMessage(_ signalMessage: SignalMessage, to destination: String, timestamp: UInt64) -> Promise>> { @@ -58,7 +59,8 @@ import PromiseKit // TODO: Send using P2P protocol } else { let parameters = lokiMessage.toJSON() - return getTargetSnodes(for: lokiMessage.destination).mapValues { invoke(.sendMessage, on: $0, associatedWith: lokiMessage.destination, parameters: parameters) }.map { Set($0) } + return getTargetSnodes(for: lokiMessage.destination).mapValues { invoke(.sendMessage, on: $0, associatedWith: lokiMessage.destination, parameters: parameters) } + .retryingIfNeeded(maxRetryCount: maxRetryCount).map { Set($0) } } } @@ -68,7 +70,8 @@ import PromiseKit // TODO: Send using P2P protocol } else { let parameters: [String:Any] = [ "pubKey" : hexEncodedPublicKey ] // TODO: Figure out correct parameters - return getTargetSnodes(for: hexEncodedPublicKey).mapValues { invoke(.sendMessage, on: $0, associatedWith: hexEncodedPublicKey, parameters: parameters) }.map { Set($0) } + return getTargetSnodes(for: hexEncodedPublicKey).mapValues { invoke(.sendMessage, on: $0, associatedWith: hexEncodedPublicKey, parameters: parameters) } + .retryingIfNeeded(maxRetryCount: maxRetryCount).map { Set($0) } } } diff --git a/SignalServiceKit/src/Loki/Utilities/AnyPromise+Conversion.swift b/SignalServiceKit/src/Loki/Utilities/AnyPromise+Conversion.swift new file mode 100644 index 000000000..25480fd6b --- /dev/null +++ b/SignalServiceKit/src/Loki/Utilities/AnyPromise+Conversion.swift @@ -0,0 +1,10 @@ +import PromiseKit + +internal extension AnyPromise { + + internal static func from(_ promise: Promise) -> AnyPromise { + let result = AnyPromise(promise) + result.retainUntilComplete() + return result + } +} diff --git a/SignalServiceKit/src/Loki/Utilities/Promise+Retrying.swift b/SignalServiceKit/src/Loki/Utilities/Promise+Retrying.swift new file mode 100644 index 000000000..eb340081e --- /dev/null +++ b/SignalServiceKit/src/Loki/Utilities/Promise+Retrying.swift @@ -0,0 +1,16 @@ +import PromiseKit + +internal extension Promise { + + internal func retryingIfNeeded(maxRetryCount: UInt) -> Promise { + var retryCount = 0 + func retryIfNeeded() -> Promise { + return recover { error -> Promise in + guard retryCount != maxRetryCount else { throw error } + retryCount += 1 + return retryIfNeeded() + } + } + return retryIfNeeded() + } +} From 8f25f963016e12cfc3ff3e5df5a3a0dabb9e2416 Mon Sep 17 00:00:00 2001 From: Niels Andriesse Date: Mon, 27 May 2019 10:03:22 +1000 Subject: [PATCH 9/9] Update Pods --- Pods | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Pods b/Pods index a3aec3701..c8f9b28f5 160000 --- a/Pods +++ b/Pods @@ -1 +1 @@ -Subproject commit a3aec37016db3844567b4274c5a3c07d76382407 +Subproject commit c8f9b28f577a03f9f03a0b2e38e125811785ee29