diff --git a/SignalServiceKit/src/Loki/Protocol/Closed Groups/ClosedGroupsProtocol.swift b/SignalServiceKit/src/Loki/Protocol/Closed Groups/ClosedGroupsProtocol.swift index 2fb9aa316..9705c7da0 100644 --- a/SignalServiceKit/src/Loki/Protocol/Closed Groups/ClosedGroupsProtocol.swift +++ b/SignalServiceKit/src/Loki/Protocol/Closed Groups/ClosedGroupsProtocol.swift @@ -12,7 +12,7 @@ import PromiseKit /// See [the documentation](https://github.com/loki-project/session-protocol-docs/wiki/Medium-Size-Groups) for more information. @objc(LKClosedGroupsProtocol) public final class ClosedGroupsProtocol : NSObject { - public static let isSharedSenderKeysEnabled = false + public static let isSharedSenderKeysEnabled = true public static let groupSizeLimit = 10 // MARK: - Sending @@ -65,6 +65,8 @@ public final class ClosedGroupsProtocol : NSObject { } // Add the group to the user's set of public keys to poll for Storage.setClosedGroupPrivateKey(groupKeyPair.privateKey.toHexString(), for: groupPublicKey, using: transaction) + // Notify PN server + promises.append(LokiPushNotificationManager.operateClosedGroup(to: groupPublicKey, hexEncodedPublicKey: userPublicKey, operation: .subscribe)) // Notify the user let infoMessage = TSInfoMessage(timestamp: NSDate.ows_millisecondTimeStamp(), in: thread, messageType: .typeGroupUpdate) infoMessage.save(with: transaction) @@ -172,6 +174,8 @@ public final class ClosedGroupsProtocol : NSObject { // Remove the group from the user's set of public keys to poll for if isUserLeaving { Storage.removeClosedGroupPrivateKey(for: groupPublicKey, using: transaction) + // Notify PN server + LokiPushNotificationManager.operateClosedGroup(to: groupPublicKey, hexEncodedPublicKey: userPublicKey, operation: .unsubscribe) } } } @@ -265,6 +269,8 @@ public final class ClosedGroupsProtocol : NSObject { SSKEnvironment.shared.profileManager.addThread(toProfileWhitelist: thread) // Add the group to the user's set of public keys to poll for Storage.setClosedGroupPrivateKey(groupPrivateKey.toHexString(), for: groupPublicKey, using: transaction) + // Notify PN server + LokiPushNotificationManager.operateClosedGroup(to: groupPublicKey, hexEncodedPublicKey: getUserHexEncodedPublicKey(), operation: .subscribe) // Notify the user let infoMessage = TSInfoMessage(timestamp: NSDate.ows_millisecondTimeStamp(), in: thread, messageType: .typeGroupUpdate) infoMessage.save(with: transaction) diff --git a/SignalServiceKit/src/Loki/Push Notifications/LokiPushNotificationManager.swift b/SignalServiceKit/src/Loki/Push Notifications/LokiPushNotificationManager.swift index aed2ffee1..5f878730e 100644 --- a/SignalServiceKit/src/Loki/Push Notifications/LokiPushNotificationManager.swift +++ b/SignalServiceKit/src/Loki/Push Notifications/LokiPushNotificationManager.swift @@ -10,6 +10,10 @@ public final class LokiPushNotificationManager : NSObject { private static let server = "https://live.apns.getsession.org/" #endif private static let tokenExpirationInterval: TimeInterval = 12 * 60 * 60 + public enum ClosedGroupOpertion: String { + case subscribe = "subscribe_closed_group" + case unsubscribe = "unsubscribe_closed_group" + } // MARK: Initialization private override init() { } @@ -47,6 +51,11 @@ public final class LokiPushNotificationManager : NSObject { promise.catch2 { error in print("[Loki] Couldn't register device token.") } + //Unsubscribe all closed groups + let closedGroups = Storage.getUserClosedGroupPublicKeys() + for closedGroup in closedGroups { + operateClosedGroup(to: closedGroup, hexEncodedPublicKey: getUserHexEncodedPublicKey(), operation: .unsubscribe) + } return promise } @@ -88,6 +97,11 @@ public final class LokiPushNotificationManager : NSObject { promise.catch2 { error in print("[Loki] Couldn't register device token.") } + //Subscribe all closed groups + let closedGroups = Storage.getUserClosedGroupPublicKeys() + for closedGroup in closedGroups { + operateClosedGroup(to: closedGroup, hexEncodedPublicKey: hexEncodedPublicKey, operation: .subscribe) + } return promise } @@ -100,6 +114,7 @@ public final class LokiPushNotificationManager : NSObject { @objc(acknowledgeDeliveryForMessageWithHash:expiration:hexEncodedPublicKey:) static func acknowledgeDelivery(forMessageWithHash hash: String, expiration: UInt64, hexEncodedPublicKey: String) { + guard UserDefaults.standard[.isUsingFullAPNs] else { return } let parameters: JSON = [ "lastHash" : hash, "pubKey" : hexEncodedPublicKey, "expiration" : expiration] let url = URL(string: server + "acknowledge_message_delivery")! let request = TSRequest(url: url, method: "POST", parameters: parameters) @@ -115,4 +130,27 @@ public final class LokiPushNotificationManager : NSObject { print("[Loki] Couldn't acknowledge delivery for message with hash: \(hash) due to error: \(error).") }) } + + static func operateClosedGroup(to closedGroupPublicKey: String, hexEncodedPublicKey: String, operation: ClosedGroupOpertion) -> Promise { + let userDefaults = UserDefaults.standard + let isUsingFullAPNs = userDefaults[.isUsingFullAPNs] + guard isUsingFullAPNs else { return Promise { $0.fulfill(()) } } + let parameters = [ "closedGroupPublicKey" : closedGroupPublicKey, "pubKey" : hexEncodedPublicKey] + let url = URL(string: server + operation.rawValue)! + let request = TSRequest(url: url, method: "POST", parameters: parameters) + request.allHTTPHeaderFields = [ "Content-Type" : "application/json" ] + let promise = TSNetworkManager.shared().makePromise(request: request).map2 { _, response in + 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] Couldn't register device token due to error: \(json["message"] as? String ?? "nil").") + } + return + } + promise.catch2 { error in + print("[Loki] Couldn't register device token.") + } + return promise + } }