diff --git a/Session/Open Groups/JoinOpenGroupVC.swift b/Session/Open Groups/JoinOpenGroupVC.swift index b8a340ccb..5e0b94657 100644 --- a/Session/Open Groups/JoinOpenGroupVC.swift +++ b/Session/Open Groups/JoinOpenGroupVC.swift @@ -129,29 +129,7 @@ final class JoinOpenGroupVC : BaseVC, UIPageViewControllerDataSource, UIPageView // A V2 open group URL will look like: + + + + // The host doesn't parse if no explicit scheme is provided if let url = URL(string: string), let host = url.host ?? given(string.split(separator: "/").first, { String($0) }) { - if let query = url.query { - // Inputs that should work: - // https://sessionopengroup.co/main?public_key=658d29b91892a2389505596b135e76a53db6e11d613a51dbd3d0816adffb231c - // http://sessionopengroup.co/main?public_key=658d29b91892a2389505596b135e76a53db6e11d613a51dbd3d0816adffb231c - // sessionopengroup.co/main?public_key=658d29b91892a2389505596b135e76a53db6e11d613a51dbd3d0816adffb231c (does NOT go to HTTPS) - // https://143.198.213.225:443/main?public_key=658d29b91892a2389505596b135e76a53db6e11d613a51dbd3d0816adffb231c - // 143.198.213.255:80/main?public_key=658d29b91892a2389505596b135e76a53db6e11d613a51dbd3d0816adffb231c - let useTLS = (url.scheme == "https") - let room = String(url.path.dropFirst()) // Drop the leading slash - let queryParts = query.split(separator: "=") - guard !room.isEmpty && !room.contains("/"), queryParts.count == 2, queryParts[0] == "public_key" else { - let title = NSLocalizedString("invalid_url", comment: "") - let message = "Please check the URL you entered and try again." - return showError(title: title, message: message) - } - let publicKey = String(queryParts[1]) - guard publicKey.count == 64 && Hex.isValid(publicKey) else { - let title = NSLocalizedString("invalid_url", comment: "") - let message = "Please check the URL you entered and try again." - return showError(title: title, message: message) - } - var server = (useTLS ? "https://" : "http://") + host - if let port = url.port { server += ":\(port)" } + if let (room, server, publicKey) = OpenGroupManagerV2.parseV2OpenGroup(from: string) { joinV2OpenGroup(room: room, server: server, publicKey: publicKey) } else { // Inputs that should work: diff --git a/SessionMessagingKit/Open Groups/V2/OpenGroupManagerV2.swift b/SessionMessagingKit/Open Groups/V2/OpenGroupManagerV2.swift index e491a4ae1..579d62ff3 100644 --- a/SessionMessagingKit/Open Groups/V2/OpenGroupManagerV2.swift +++ b/SessionMessagingKit/Open Groups/V2/OpenGroupManagerV2.swift @@ -39,7 +39,7 @@ public final class OpenGroupManagerV2 : NSObject { let transaction = transaction as! YapDatabaseReadWriteTransaction transaction.addCompletionQueue(DispatchQueue.global(qos: .default)) { OpenGroupAPIV2.getInfo(for: room, on: server).done(on: DispatchQueue.global(qos: .default)) { info in - let openGroup = OpenGroupV2(server: server, room: room, name: info.name, imageID: info.imageID) + let openGroup = OpenGroupV2(server: server, room: room, name: info.name, publicKey: publicKey, imageID: info.imageID) let groupID = LKGroupUtilities.getEncodedOpenGroupIDAsData(openGroup.id) let model = TSGroupModel(title: openGroup.name, memberIds: [ getUserHexEncodedPublicKey() ], image: nil, groupId: groupID, groupType: .openGroup, adminIds: []) storage.write(with: { transaction in @@ -86,4 +86,24 @@ public final class OpenGroupManagerV2 : NSObject { thread.remove(with: transaction) Storage.shared.removeV2OpenGroup(for: thread.uniqueId!, using: transaction) } + + // MARK: Convenience + public static func parseV2OpenGroup(from string: String) -> (room: String, server: String, publicKey: String)? { + guard let url = URL(string: string), let host = url.host ?? given(string.split(separator: "/").first, { String($0) }), let query = url.query else { return nil } + // Inputs that should work: + // https://sessionopengroup.co/main?public_key=658d29b91892a2389505596b135e76a53db6e11d613a51dbd3d0816adffb231c + // http://sessionopengroup.co/main?public_key=658d29b91892a2389505596b135e76a53db6e11d613a51dbd3d0816adffb231c + // sessionopengroup.co/main?public_key=658d29b91892a2389505596b135e76a53db6e11d613a51dbd3d0816adffb231c (does NOT go to HTTPS) + // https://143.198.213.225:443/main?public_key=658d29b91892a2389505596b135e76a53db6e11d613a51dbd3d0816adffb231c + // 143.198.213.255:80/main?public_key=658d29b91892a2389505596b135e76a53db6e11d613a51dbd3d0816adffb231c + let useTLS = (url.scheme == "https") + let room = String(url.path.dropFirst()) // Drop the leading slash + let queryParts = query.split(separator: "=") + guard !room.isEmpty && !room.contains("/"), queryParts.count == 2, queryParts[0] == "public_key" else { return nil } + let publicKey = String(queryParts[1]) + guard publicKey.count == 64 && Hex.isValid(publicKey) else { return nil } + var server = (useTLS ? "https://" : "http://") + host + if let port = url.port { server += ":\(port)" } + return (room: room, server: server, publicKey: publicKey) + } } diff --git a/SessionMessagingKit/Open Groups/V2/OpenGroupV2.swift b/SessionMessagingKit/Open Groups/V2/OpenGroupV2.swift index ced6aa588..bd62c31f7 100644 --- a/SessionMessagingKit/Open Groups/V2/OpenGroupV2.swift +++ b/SessionMessagingKit/Open Groups/V2/OpenGroupV2.swift @@ -5,14 +5,16 @@ public final class OpenGroupV2 : NSObject, NSCoding { // NSObject/NSCoding confo @objc public let room: String public let id: String public let name: String + public let publicKey: String /// The ID with which the image can be retrieved from the server. public let imageID: String? - public init(server: String, room: String, name: String, imageID: String?) { + public init(server: String, room: String, name: String, publicKey: String, imageID: String?) { self.server = server.lowercased() self.room = room self.id = "\(server).\(room)" self.name = name + self.publicKey = publicKey self.imageID = imageID } @@ -22,6 +24,7 @@ public final class OpenGroupV2 : NSObject, NSCoding { // NSObject/NSCoding confo room = coder.decodeObject(forKey: "room") as! String self.id = "\(server).\(room)" name = coder.decodeObject(forKey: "name") as! String + publicKey = coder.decodeObject(forKey: "publicKey") as! String imageID = coder.decodeObject(forKey: "imageID") as! String? super.init() } @@ -30,6 +33,7 @@ public final class OpenGroupV2 : NSObject, NSCoding { // NSObject/NSCoding confo coder.encode(server, forKey: "server") coder.encode(room, forKey: "room") coder.encode(name, forKey: "name") + coder.encode(publicKey, forKey: "publicKey") if let imageID = imageID { coder.encode(imageID, forKey: "imageID") } } diff --git a/SessionMessagingKit/Sending & Receiving/MessageReceiver+Handling.swift b/SessionMessagingKit/Sending & Receiving/MessageReceiver+Handling.swift index ee30b81b5..e1ed075c1 100644 --- a/SessionMessagingKit/Sending & Receiving/MessageReceiver+Handling.swift +++ b/SessionMessagingKit/Sending & Receiving/MessageReceiver+Handling.swift @@ -213,10 +213,12 @@ extension MessageReceiver { members: [String](closedGroup.members), admins: [String](closedGroup.admins), messageSentTimestamp: message.sentTimestamp!, using: transaction) } // Open groups - let allOpenGroups = Set(storage.getAllUserOpenGroups().keys) for openGroupURL in message.openGroups { - guard !allOpenGroups.contains(openGroupURL) else { continue } - OpenGroupManager.shared.add(with: openGroupURL, using: transaction).retainUntilComplete() + if let (room, server, publicKey) = OpenGroupManagerV2.parseV2OpenGroup(from: openGroupURL) { + OpenGroupManagerV2.shared.add(room: room, server: server, publicKey: publicKey, using: transaction).retainUntilComplete() + } else { + OpenGroupManager.shared.add(with: openGroupURL, using: transaction).retainUntilComplete() + } } } } diff --git a/SignalUtilitiesKit/Messaging/ConfigurationMessage+Convenience.swift b/SignalUtilitiesKit/Messaging/ConfigurationMessage+Convenience.swift index 234ae89b0..101e68fbc 100644 --- a/SignalUtilitiesKit/Messaging/ConfigurationMessage+Convenience.swift +++ b/SignalUtilitiesKit/Messaging/ConfigurationMessage+Convenience.swift @@ -25,9 +25,11 @@ extension ConfigurationMessage { members: Set(thread.groupModel.groupMemberIds), admins: Set(thread.groupModel.groupAdminIds)) closedGroups.insert(closedGroup) case .openGroup: - guard let openGroup = storage.getOpenGroup(for: thread.uniqueId!) else { return } - openGroups.insert(openGroup.server) - // TODO: V2 open groups + if let v2OpenGroup = storage.getV2OpenGroup(for: thread.uniqueId!) { + openGroups.insert("\(v2OpenGroup.server)/\(v2OpenGroup.room)?public_key=\(v2OpenGroup.publicKey)") + } else if let openGroup = storage.getOpenGroup(for: thread.uniqueId!) { + openGroups.insert(openGroup.server) + } default: break } }