From 96cb307e1a488a69530906a99fd7bc4237f31560 Mon Sep 17 00:00:00 2001 From: gmbnt Date: Fri, 27 Mar 2020 10:36:18 +1100 Subject: [PATCH 1/9] Fix log --- SignalServiceKit/src/Loki/API/LokiAPI+SwarmAPI.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SignalServiceKit/src/Loki/API/LokiAPI+SwarmAPI.swift b/SignalServiceKit/src/Loki/API/LokiAPI+SwarmAPI.swift index c922fbceb..69c8399e5 100644 --- a/SignalServiceKit/src/Loki/API/LokiAPI+SwarmAPI.swift +++ b/SignalServiceKit/src/Loki/API/LokiAPI+SwarmAPI.swift @@ -48,7 +48,7 @@ public extension LokiAPI { ] ] ]) - print("[Loki] Invoking get_n_service_nodes on \(target).") + print("[Loki] Invoking get_service_nodes on \(target).") return TSNetworkManager.shared().perform(request, withCompletionQueue: DispatchQueue.global()).map(on: DispatchQueue.global()) { intermediate in let rawResponse = intermediate.responseObject guard let json = rawResponse as? JSON, let intermediate = json["result"] as? JSON, let rawTargets = intermediate["service_node_states"] as? [JSON] else { throw LokiAPIError.randomSnodePoolUpdatingFailed } From 16a06f753550b9d9e0d00c9367928ad272882920 Mon Sep 17 00:00:00 2001 From: gmbnt Date: Fri, 27 Mar 2020 10:38:35 +1100 Subject: [PATCH 2/9] Update for Swift 5.2 --- SignalMessaging/contacts/SystemContactsFetcher.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SignalMessaging/contacts/SystemContactsFetcher.swift b/SignalMessaging/contacts/SystemContactsFetcher.swift index ef4d6d22d..fe1525402 100644 --- a/SignalMessaging/contacts/SystemContactsFetcher.swift +++ b/SignalMessaging/contacts/SystemContactsFetcher.swift @@ -352,7 +352,7 @@ public class SystemContactsFetcher: NSObject { guard let contacts = fetchedContacts else { owsFailDebug("contacts was unexpectedly not set.") - completion(nil) + return completion(nil) } Logger.info("fetched \(contacts.count) contacts.") From c74de9698c16d8b6d844e1e85cce4765f6718c6e Mon Sep 17 00:00:00 2001 From: gmbnt Date: Fri, 27 Mar 2020 10:49:53 +1100 Subject: [PATCH 3/9] Fix copy --- Signal/src/Loki/View Controllers/BaseVC.swift | 2 +- .../ConversationView/ConversationViewController.m | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Signal/src/Loki/View Controllers/BaseVC.swift b/Signal/src/Loki/View Controllers/BaseVC.swift index 19803f660..8bdf37ab0 100644 --- a/Signal/src/Loki/View Controllers/BaseVC.swift +++ b/Signal/src/Loki/View Controllers/BaseVC.swift @@ -15,7 +15,7 @@ class BaseVC : UIViewController { @objc private func handleUnexpectedDeviceLinkRequestReceivedNotification() { guard DeviceLinkingUtilities.shouldShowUnexpectedDeviceLinkRequestReceivedAlert else { return } DispatchQueue.main.async { - let alert = UIAlertController(title: "Device Link Request Received", message: "Open the device link screen by going to \"Settings\"> \"Devices\" > \"Link a Device\" to link your devices.", preferredStyle: .alert) + let alert = UIAlertController(title: "Device Link Request Received", message: "Open the device link screen by going to \"Settings\" > \"Devices\" > \"Link a Device\" to link your devices.", preferredStyle: .alert) alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil)) self.present(alert, animated: true, completion: nil) } diff --git a/Signal/src/ViewControllers/ConversationView/ConversationViewController.m b/Signal/src/ViewControllers/ConversationView/ConversationViewController.m index bdb42f243..58405b600 100644 --- a/Signal/src/ViewControllers/ConversationView/ConversationViewController.m +++ b/Signal/src/ViewControllers/ConversationView/ConversationViewController.m @@ -5488,7 +5488,7 @@ typedef enum : NSUInteger { { if (!LKDeviceLinkingUtilities.shouldShowUnexpectedDeviceLinkRequestReceivedAlert) { return; } dispatch_async(dispatch_get_main_queue(), ^{ - UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"Device Link Request Received" message:@"Open the device link screen by going to \"Settings\"> \"Devices\" > \"Link a Device\" to link your devices." preferredStyle:UIAlertControllerStyleAlert]; + UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"Device Link Request Received" message:@"Open the device link screen by going to \"Settings\" > \"Devices\" > \"Link a Device\" to link your devices." preferredStyle:UIAlertControllerStyleAlert]; [alert addAction:[UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:nil]]; [self presentViewController:alert animated:YES completion:nil]; }); From 452469d9981c4f336315e1ffc093b9ba57342511 Mon Sep 17 00:00:00 2001 From: gmbnt Date: Fri, 27 Mar 2020 11:52:42 +1100 Subject: [PATCH 4/9] Fix access modifier --- SignalServiceKit/src/Loki/API/LokiAPI.swift | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/SignalServiceKit/src/Loki/API/LokiAPI.swift b/SignalServiceKit/src/Loki/API/LokiAPI.swift index ea60e5440..d69c1abde 100644 --- a/SignalServiceKit/src/Loki/API/LokiAPI.swift +++ b/SignalServiceKit/src/Loki/API/LokiAPI.swift @@ -2,10 +2,12 @@ import PromiseKit @objc(LKAPI) public final class LokiAPI : NSObject { + private static let stateQueue = DispatchQueue(label: "stateQueue") + /// Only ever modified from the message processing queue (`OWSBatchMessageProcessor.processingQueue`). private static var syncMessageTimestamps: [String:Set] = [:] - public static var _lastDeviceLinkUpdate: [String:Date] = [:] + private static var _lastDeviceLinkUpdate: [String:Date] = [:] /// A mapping from hex encoded public key to date updated. public static var lastDeviceLinkUpdate: [String:Date] { get { stateQueue.sync { _lastDeviceLinkUpdate } } @@ -19,8 +21,6 @@ public final class LokiAPI : NSObject { set { stateQueue.sync { _userHexEncodedPublicKeyCache = newValue } } } - private static let stateQueue = DispatchQueue(label: "stateQueue") - /// All service node related errors must be handled on this queue to avoid race conditions maintaining e.g. failure counts. public static let errorHandlingQueue = DispatchQueue(label: "errorHandlingQueue") From 552c49dd5a0f44b22109bae7ef8f52547e415de0 Mon Sep 17 00:00:00 2001 From: gmbnt Date: Fri, 27 Mar 2020 14:33:55 +1100 Subject: [PATCH 5/9] Set -DDEBUG as needed --- Signal.xcodeproj/project.pbxproj | 1 + 1 file changed, 1 insertion(+) diff --git a/Signal.xcodeproj/project.pbxproj b/Signal.xcodeproj/project.pbxproj index 2713decda..e444ed8fd 100644 --- a/Signal.xcodeproj/project.pbxproj +++ b/Signal.xcodeproj/project.pbxproj @@ -4725,6 +4725,7 @@ LLVM_LTO = NO; MARKETING_VERSION = 1.0.8; OTHER_LDFLAGS = "$(inherited)"; + OTHER_SWIFT_FLAGS = "$(inherited) \"-D\" \"COCOAPODS\" \"-DDEBUG\""; PRODUCT_BUNDLE_IDENTIFIER = "com.loki-project.loki-messenger"; PRODUCT_NAME = Session; PROVISIONING_PROFILE = ""; From 25903554e93914d615cb6c38bfe6bfb4d22c4d84 Mon Sep 17 00:00:00 2001 From: gmbnt Date: Fri, 27 Mar 2020 15:08:26 +1100 Subject: [PATCH 6/9] Refactor LokiPushNotificationManager --- Signal/src/AppDelegate.m | 2 +- .../LokiPushNotificationManager.swift | 72 +++++++++---------- .../src/Loki/Utilities/LKUserDefaults.swift | 2 +- 3 files changed, 36 insertions(+), 40 deletions(-) diff --git a/Signal/src/AppDelegate.m b/Signal/src/AppDelegate.m index 0c52c7248..ed046fc18 100644 --- a/Signal/src/AppDelegate.m +++ b/Signal/src/AppDelegate.m @@ -588,7 +588,7 @@ static BOOL isInternalTestVersion = NO; OWSLogInfo(@"Registered for push notifications with token: %@.", deviceToken); //TODO: For normal push notification test - [LKPushNotificationManager.shared registerWithToken:deviceToken pubkey:self.tsAccountManager.localNumber]; + [LKPushNotificationManager registerWithToken:deviceToken hexEncodedPublicKey:self.tsAccountManager.localNumber]; // [LKPushNotificationManager.shared registerWithToken:deviceToken]; // [self.pushRegistrationManager didReceiveVanillaPushToken:deviceToken]; } diff --git a/Signal/src/Loki/Utilities/LokiPushNotificationManager.swift b/Signal/src/Loki/Utilities/LokiPushNotificationManager.swift index c5b65f8df..d37c71e7d 100644 --- a/Signal/src/Loki/Utilities/LokiPushNotificationManager.swift +++ b/Signal/src/Loki/Utilities/LokiPushNotificationManager.swift @@ -1,75 +1,71 @@ -import UIKit // Ideally this should be in SignalServiceKit, but somehow linking fails when it is. @objc(LKPushNotificationManager) final class LokiPushNotificationManager : NSObject { - - @objc static let shared = LokiPushNotificationManager() - - private override init() { super.init() } - + + // MARK: Settings + #if DEBUG + private static let url = URL(string: "https://dev.apns.getsession.org/register")! + #else + private static let url = URL(string: "https://live.apns.getsession.org/register")! + #endif + private static let tokenExpirationInterval: TimeInterval = 2 * 24 * 60 * 60 + + // MARK: Initialization + private override init() { } + + // MARK: Registration @objc(registerWithToken:) - func register(with token: Data) { - let hexEncodedToken = token.map { String(format: "%02.2hhx", $0) }.joined() + static func register(with token: Data) { + let hexEncodedToken = token.toHexString() let userDefaults = UserDefaults.standard let oldToken = userDefaults[.deviceToken] let lastUploadTime = userDefaults[.lastDeviceTokenUpload] - let applyNormalNotification = userDefaults[.applyNormalNotification] + let isUsingFullAPNs = userDefaults[.isUsingFullAPNs] let now = Date().timeIntervalSince1970 - if hexEncodedToken == oldToken && now - lastUploadTime < 2 * 24 * 60 * 60 { - print("[Loki] Device token hasn't changed; no need to upload.") - return + guard hexEncodedToken != oldToken || now - lastUploadTime < tokenExpirationInterval else { + return print("[Loki] Device token hasn't changed; no need to re-upload.") } - if applyNormalNotification { - print("[Loki] Using normal notification; no need to upload.") - return + guard !isUsingFullAPNs else { + return print("[Loki] Using full APNs; no need to upload device token.") } - // Send token to Loki server let parameters = [ "token" : hexEncodedToken ] - #if DEBUG - let url = URL(string: "https://dev.apns.getsession.org/register")! - #else - let url = URL(string: "https://live.apns.getsession.org/register")! - #endif let request = TSRequest(url: url, method: "POST", parameters: parameters) request.allHTTPHeaderFields = [ "Content-Type" : "application/json" ] TSNetworkManager.shared().makeRequest(request, success: { _, response in - guard let json = response as? JSON else { return } + guard let json = response as? JSON else { + return print("[Loki] Couldn't register device token.") + } guard json["code"] as? Int != 0 else { - return print("[Loki] An error occured during device token registration: \(json["message"] as? String ?? "nil").") + return print("[Loki] Couldn't register device token due to error: \(json["message"] as? String ?? "nil").") } userDefaults[.deviceToken] = hexEncodedToken userDefaults[.lastDeviceTokenUpload] = now - userDefaults[.applyNormalNotification] = false + userDefaults[.isUsingFullAPNs] = false }, failure: { _, error in print("[Loki] Couldn't register device token.") }) } - @objc(registerWithToken: pubkey:) - func register(with token: Data, pubkey: String) { - let hexEncodedToken = token.map { String(format: "%02.2hhx", $0) }.joined() + @objc(registerWithToken:hexEncodedPublicKey:) + static func register(with token: Data, hexEncodedPublicKey: String) { + let hexEncodedToken = token.toHexString() let userDefaults = UserDefaults.standard let now = Date().timeIntervalSince1970 - // Send token to Loki server - let parameters = [ "token" : hexEncodedToken, - "pubKey": pubkey] - #if DEBUG - let url = URL(string: "https://dev.apns.getsession.org/register")! - #else - let url = URL(string: "https://live.apns.getsession.org/register")! - #endif + let parameters = [ "token" : hexEncodedToken, "pubKey" : hexEncodedPublicKey] let request = TSRequest(url: url, method: "POST", parameters: parameters) request.allHTTPHeaderFields = [ "Content-Type" : "application/json" ] TSNetworkManager.shared().makeRequest(request, success: { _, response in - guard let json = response as? JSON else { return } + guard let json = response as? JSON else { + return print("[Loki] Couldn't register device token.") + } guard json["code"] as? Int != 0 else { - return print("[Loki] An error occured during device token registration: \(json["message"] as? String ?? "nil").") + return print("[Loki] Couldn't register device token due to error: \(json["message"] as? String ?? "nil").") } userDefaults[.deviceToken] = hexEncodedToken userDefaults[.lastDeviceTokenUpload] = now - userDefaults[.applyNormalNotification] = true + userDefaults[.isUsingFullAPNs] = true }, failure: { _, error in print("[Loki] Couldn't register device token.") }) diff --git a/SignalServiceKit/src/Loki/Utilities/LKUserDefaults.swift b/SignalServiceKit/src/Loki/Utilities/LKUserDefaults.swift index 4a21e975e..bcaefcdfb 100644 --- a/SignalServiceKit/src/Loki/Utilities/LKUserDefaults.swift +++ b/SignalServiceKit/src/Loki/Utilities/LKUserDefaults.swift @@ -8,7 +8,7 @@ public enum LKUserDefaults { case hasViewedSeed /// Whether the device was unlinked as a slave device (used to notify the user on the landing screen). case wasUnlinked - case applyNormalNotification + case isUsingFullAPNs } public enum Date : Swift.String { From 3c34112e30d54c2862bd2beee240c09d71b21a78 Mon Sep 17 00:00:00 2001 From: gmbnt Date: Fri, 27 Mar 2020 15:10:34 +1100 Subject: [PATCH 7/9] Use a feature flag for full APNs vs silent PNs --- Signal/src/AppDelegate.m | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/Signal/src/AppDelegate.m b/Signal/src/AppDelegate.m index ed046fc18..1b9dd8d1d 100644 --- a/Signal/src/AppDelegate.m +++ b/Signal/src/AppDelegate.m @@ -59,7 +59,9 @@ static NSString *const kURLHostVerifyPrefix = @"verify"; static NSTimeInterval launchStartedAt; +// Debug settings static BOOL isInternalTestVersion = NO; +static BOOL isUsingFullAPNs = YES; @interface AppDelegate () @@ -587,9 +589,11 @@ static BOOL isInternalTestVersion = NO; } OWSLogInfo(@"Registered for push notifications with token: %@.", deviceToken); - //TODO: For normal push notification test - [LKPushNotificationManager registerWithToken:deviceToken hexEncodedPublicKey:self.tsAccountManager.localNumber]; -// [LKPushNotificationManager.shared registerWithToken:deviceToken]; + if (isUsingFullAPNs) { + [LKPushNotificationManager registerWithToken:deviceToken hexEncodedPublicKey:self.tsAccountManager.localNumber]; + } else { + [LKPushNotificationManager registerWithToken:deviceToken]; + } // [self.pushRegistrationManager didReceiveVanillaPushToken:deviceToken]; } From c882381c9edc31c92e246f5385d9bd7f54be6cf5 Mon Sep 17 00:00:00 2001 From: gmbnt Date: Fri, 27 Mar 2020 15:11:41 +1100 Subject: [PATCH 8/9] Adjust message TTLs --- SignalServiceKit/src/Loki/Messaging/LKDeviceLinkMessage.m | 2 +- SignalServiceKit/src/Messages/TypingIndicatorMessage.swift | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/SignalServiceKit/src/Loki/Messaging/LKDeviceLinkMessage.m b/SignalServiceKit/src/Loki/Messaging/LKDeviceLinkMessage.m index ef4d7829d..034cf4134 100644 --- a/SignalServiceKit/src/Loki/Messaging/LKDeviceLinkMessage.m +++ b/SignalServiceKit/src/Loki/Messaging/LKDeviceLinkMessage.m @@ -79,7 +79,7 @@ } #pragma mark Settings -- (uint)ttl { return 2 * kMinuteInMs; } +- (uint)ttl { return 4 * kMinuteInMs; } - (BOOL)shouldSyncTranscript { return NO; } - (BOOL)shouldBeSaved { return NO; } diff --git a/SignalServiceKit/src/Messages/TypingIndicatorMessage.swift b/SignalServiceKit/src/Messages/TypingIndicatorMessage.swift index fc2d6af3d..db5eca916 100644 --- a/SignalServiceKit/src/Messages/TypingIndicatorMessage.swift +++ b/SignalServiceKit/src/Messages/TypingIndicatorMessage.swift @@ -101,9 +101,7 @@ public class TypingIndicatorMessage: TSOutgoingMessage { } @objc - public override var ttl: UInt32 { - return UInt32(5 * kMinuteInMs) - } + public override var ttl: UInt32 { return UInt32(2 * kMinuteInMs) } @objc public override var debugDescription: String { From a4ce20f87ea3cefb13d554bcc8346d014edc68b9 Mon Sep 17 00:00:00 2001 From: gmbnt Date: Fri, 27 Mar 2020 15:13:24 +1100 Subject: [PATCH 9/9] Clean --- Signal/src/AppDelegate.m | 2 +- .../src/UserInterface/Notifications/AppNotifications.swift | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/Signal/src/AppDelegate.m b/Signal/src/AppDelegate.m index 1b9dd8d1d..5dd5662ae 100644 --- a/Signal/src/AppDelegate.m +++ b/Signal/src/AppDelegate.m @@ -1559,7 +1559,7 @@ static BOOL isUsingFullAPNs = YES; { OWSLogInfo(@""); if (notification.request.content.userInfo[@"remote"]) { - OWSLogInfo(@"[Loki] Ignore remote notifications when app is foreground."); + OWSLogInfo(@"[Loki] Ignoring remote notifications while the app is in the foreground."); return; } [AppReadiness runNowOrWhenAppDidBecomeReady:^() { diff --git a/Signal/src/UserInterface/Notifications/AppNotifications.swift b/Signal/src/UserInterface/Notifications/AppNotifications.swift index 254720bc9..5572c7801 100644 --- a/Signal/src/UserInterface/Notifications/AppNotifications.swift +++ b/Signal/src/UserInterface/Notifications/AppNotifications.swift @@ -642,8 +642,7 @@ class NotificationActionHandler { func showThread(userInfo: [AnyHashable: Any]) throws -> Promise { guard let threadId = userInfo[AppNotificationUserInfoKey.threadId] as? String else { - return showHomePage() -// throw NotificationError.failDebug("threadId was unexpectedly nil") + return showHomeVC() } // If this happens when the the app is not, visible we skip the animation so the thread @@ -654,7 +653,7 @@ class NotificationActionHandler { return Promise.value(()) } - func showHomePage() -> Promise { + func showHomeVC() -> Promise { signalApp.showHomeView() return Promise.value(()) }