Update ConfigurationMessage for V2 open groups

pull/370/head
Niels Andriesse 3 years ago
parent 7558e0b32a
commit 44783ddfef

@ -129,29 +129,7 @@ final class JoinOpenGroupVC : BaseVC, UIPageViewControllerDataSource, UIPageView
// A V2 open group URL will look like: <optional scheme> + <host> + <optional port> + <room> + <public key>
// 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:

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

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

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

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

Loading…
Cancel
Save