From d3b54b84d0f4c83b75cfac48af9f705dd8ee0a9f Mon Sep 17 00:00:00 2001 From: Morgan Pretty Date: Mon, 21 Mar 2022 13:52:18 +1100 Subject: [PATCH] Prevent the user from joining duplicate open groups due to url differences Updated the OpenGroupManagerV2 to handle HTTP scheme variants and official host variants when checking if the user is already in an open group --- .../Open Groups/OpenGroupAPIV2.swift | 1 + .../Open Groups/OpenGroupManagerV2.swift | 45 +++++++++++++++++-- 2 files changed, 43 insertions(+), 3 deletions(-) diff --git a/SessionMessagingKit/Open Groups/OpenGroupAPIV2.swift b/SessionMessagingKit/Open Groups/OpenGroupAPIV2.swift index 481fcdfd0..d8206b604 100644 --- a/SessionMessagingKit/Open Groups/OpenGroupAPIV2.swift +++ b/SessionMessagingKit/Open Groups/OpenGroupAPIV2.swift @@ -18,6 +18,7 @@ public final class OpenGroupAPIV2 : NSObject { }() // MARK: Settings + public static let legacyDefaultServerDNS = "open.getsession.org" public static let defaultServer = "http://116.203.70.33" public static let defaultServerPublicKey = "a03c383cf63c3c4efe67acc52112a6dd734b3a946b9545f488aaa93da7991238" diff --git a/SessionMessagingKit/Open Groups/OpenGroupManagerV2.swift b/SessionMessagingKit/Open Groups/OpenGroupManagerV2.swift index 1e57471bf..04d36c875 100644 --- a/SessionMessagingKit/Open Groups/OpenGroupManagerV2.swift +++ b/SessionMessagingKit/Open Groups/OpenGroupManagerV2.swift @@ -29,12 +29,51 @@ public final class OpenGroupManagerV2 : NSObject { } // MARK: Adding & Removing + + public func hasExistingOpenGroup(room: String, server: String, publicKey: String, using transaction: YapDatabaseReadWriteTransaction) -> Bool { + let schemeFreeServer: String = (server.starts(with: "https://") ? server.substring(from: "https://".count) : server.substring(from: "http://".count)) + let schemeFreeDefaultServer: String = OpenGroupAPIV2.defaultServer.substring(from: "http://".count) + var serverOptions: Set = Set([ + schemeFreeServer, + "http://\(schemeFreeServer)", + "https://\(schemeFreeServer)" + ]) + + if schemeFreeServer == OpenGroupAPIV2.legacyDefaultServerDNS { + let defaultServerOptions: Set = Set([ + schemeFreeDefaultServer, + OpenGroupAPIV2.defaultServer, + "https://\(schemeFreeDefaultServer)" + ]) + serverOptions = serverOptions.union(defaultServerOptions) + } + else if schemeFreeServer == schemeFreeDefaultServer { + let legacyServerOptions: Set = Set([ + OpenGroupAPIV2.legacyDefaultServerDNS, + "http://\(OpenGroupAPIV2.legacyDefaultServerDNS)", + "https://\(OpenGroupAPIV2.legacyDefaultServerDNS)" + ]) + serverOptions = serverOptions.union(legacyServerOptions) + } + + // First check if there is an existing poller for the given server options + guard serverOptions.first(where: { OpenGroupManagerV2.shared.pollers[$0] != nil }) == nil else { return true } + + // Then check if there is an existing open group thread + let hasExistingThread: Bool = serverOptions.contains(where: { serverName in + let groupId: Data = LKGroupUtilities.getEncodedOpenGroupIDAsData("\(serverName).\(room)") + + return (TSGroupThread.fetch(groupId: groupId, transaction: transaction) != nil) + }) + + return hasExistingThread + } + public func add(room: String, server: String, publicKey: String, using transaction: Any) -> Promise { // If we are currently polling for this server and already have a TSGroupThread for this room the do nothing let transaction = transaction as! YapDatabaseReadWriteTransaction - let groupId: Data = LKGroupUtilities.getEncodedOpenGroupIDAsData("\(server).\(room)") - - if OpenGroupManagerV2.shared.pollers[server] != nil && TSGroupThread.fetch(groupId: groupId, transaction: transaction) != nil { + + if hasExistingOpenGroup(room: room, server: server, publicKey: publicKey, using: transaction) { SNLog("Ignoring join open group attempt (already joined)") return Promise.value(()) }