From 7cbdca672edd190dfd0bce81d184f990807c53f2 Mon Sep 17 00:00:00 2001 From: Morgan Pretty Date: Wed, 9 Nov 2022 11:07:13 +1100 Subject: [PATCH] Fixed a bug where copying the open group url wasn't working correctly --- .../ConversationVC+Interaction.swift | 5 ++ .../Settings/ThreadSettingsViewModel.swift | 43 ++++++++++++--- .../Database/Models/OpenGroup.swift | 52 ++----------------- .../ConfigurationMessage+Convenience.swift | 8 ++- .../SessionThreadViewModel.swift | 9 ++++ .../Open Groups/Models/OpenGroupSpec.swift | 26 ++++++++++ 6 files changed, 86 insertions(+), 57 deletions(-) diff --git a/Session/Conversations/ConversationVC+Interaction.swift b/Session/Conversations/ConversationVC+Interaction.swift index bb70bea7f..afd586d78 100644 --- a/Session/Conversations/ConversationVC+Interaction.swift +++ b/Session/Conversations/ConversationVC+Interaction.swift @@ -1578,6 +1578,11 @@ extension ConversationVC: case .typingIndicator, .dateHeader: break case .textOnlyMessage: + if cellViewModel.body == nil, let linkPreview: LinkPreview = cellViewModel.linkPreview { + UIPasteboard.general.string = linkPreview.url + return + } + UIPasteboard.general.string = cellViewModel.body case .audio, .genericAttachment, .mediaMessage: diff --git a/Session/Conversations/Settings/ThreadSettingsViewModel.swift b/Session/Conversations/Settings/ThreadSettingsViewModel.swift index e771e26fb..fe23f06f8 100644 --- a/Session/Conversations/Settings/ThreadSettingsViewModel.swift +++ b/Session/Conversations/Settings/ThreadSettingsViewModel.swift @@ -241,7 +241,24 @@ class ThreadSettingsViewModel: SessionTableViewModel) { - let threadId: String = self.threadId + private func addUsersToOpenGoup(threadViewModel: SessionThreadViewModel, selectedUsers: Set) { + guard + let name: String = threadViewModel.openGroupName, + let server: String = threadViewModel.openGroupServer, + let roomToken: String = threadViewModel.openGroupRoomToken, + let publicKey: String = threadViewModel.openGroupPublicKey + else { return } dependencies.storage.writeAsync { db in - guard let openGroup: OpenGroup = try OpenGroup.fetchOne(db, id: threadId) else { return } - - let urlString: String = "\(openGroup.server)/\(openGroup.roomToken)?public_key=\(openGroup.publicKey)" + let urlString: String = OpenGroup.urlFor( + server: server, + roomToken: roomToken, + publicKey: publicKey + ) try selectedUsers.forEach { userId in let thread: SessionThread = try SessionThread.fetchOrCreate(db, id: userId, variant: .contact) @@ -575,7 +602,7 @@ class ThreadSettingsViewModel: SessionTableViewModel String { + return "\(server)/\(roomToken)?public_key=\(publicKey)" + } } extension OpenGroup: CustomStringConvertible, CustomDebugStringConvertible { @@ -243,51 +247,3 @@ extension OpenGroup: CustomStringConvertible, CustomDebugStringConvertible { ].joined(separator: ", ") } } - -// MARK: - Objective-C Support - -// TODO: Remove this when possible - -@objc(SMKOpenGroup) -public class SMKOpenGroup: NSObject { - @objc(inviteUsers:toOpenGroupFor:) - public static func invite(selectedUsers: Set, openGroupThreadId: String) { - Storage.shared.write { db in - guard let openGroup: OpenGroup = try OpenGroup.fetchOne(db, id: openGroupThreadId) else { return } - - let urlString: String = "\(openGroup.server)/\(openGroup.roomToken)?public_key=\(openGroup.publicKey)" - - try selectedUsers.forEach { userId in - let thread: SessionThread = try SessionThread.fetchOrCreate(db, id: userId, variant: .contact) - - try LinkPreview( - url: urlString, - variant: .openGroupInvitation, - title: openGroup.name - ) - .save(db) - - let interaction: Interaction = try Interaction( - threadId: thread.id, - authorId: userId, - variant: .standardOutgoing, - timestampMs: Int64(floor(Date().timeIntervalSince1970 * 1000)), - expiresInSeconds: try? DisappearingMessagesConfiguration - .select(.durationSeconds) - .filter(id: userId) - .filter(DisappearingMessagesConfiguration.Columns.isEnabled == true) - .asRequest(of: TimeInterval.self) - .fetchOne(db), - linkPreviewUrl: urlString - ) - .inserted(db) - - try MessageSender.send( - db, - interaction: interaction, - in: thread - ) - } - } - } -} diff --git a/SessionMessagingKit/Messages/Control Messages/ConfigurationMessage+Convenience.swift b/SessionMessagingKit/Messages/Control Messages/ConfigurationMessage+Convenience.swift index a2d7bf096..72289c200 100644 --- a/SessionMessagingKit/Messages/Control Messages/ConfigurationMessage+Convenience.swift +++ b/SessionMessagingKit/Messages/Control Messages/ConfigurationMessage+Convenience.swift @@ -42,7 +42,13 @@ extension ConfigurationMessage { .filter(OpenGroup.Columns.roomToken != "") .filter(OpenGroup.Columns.isActive) .fetchAll(db) - .map { "\($0.server)/\($0.roomToken)?public_key=\($0.publicKey)" } + .map { openGroup in + OpenGroup.urlFor( + server: openGroup.server, + roomToken: openGroup.roomToken, + publicKey: openGroup.publicKey + ) + } .asSet() let contacts: Set = try Contact .filter(Contact.Columns.id != currentUserProfile.id) diff --git a/SessionMessagingKit/Shared Models/SessionThreadViewModel.swift b/SessionMessagingKit/Shared Models/SessionThreadViewModel.swift index 2280a8542..616b7c15a 100644 --- a/SessionMessagingKit/Shared Models/SessionThreadViewModel.swift +++ b/SessionMessagingKit/Shared Models/SessionThreadViewModel.swift @@ -43,6 +43,7 @@ public struct SessionThreadViewModel: FetchableRecordWithRowId, Decodable, Equat public static let openGroupNameKey: SQL = SQL(stringLiteral: CodingKeys.openGroupName.stringValue) public static let openGroupServerKey: SQL = SQL(stringLiteral: CodingKeys.openGroupServer.stringValue) public static let openGroupRoomTokenKey: SQL = SQL(stringLiteral: CodingKeys.openGroupRoomToken.stringValue) + public static let openGroupPublicKeyKey: SQL = SQL(stringLiteral: CodingKeys.openGroupPublicKey.stringValue) public static let openGroupProfilePictureDataKey: SQL = SQL(stringLiteral: CodingKeys.openGroupProfilePictureData.stringValue) public static let openGroupUserCountKey: SQL = SQL(stringLiteral: CodingKeys.openGroupUserCount.stringValue) public static let openGroupPermissionsKey: SQL = SQL(stringLiteral: CodingKeys.openGroupPermissions.stringValue) @@ -117,6 +118,7 @@ public struct SessionThreadViewModel: FetchableRecordWithRowId, Decodable, Equat public let openGroupName: String? public let openGroupServer: String? public let openGroupRoomToken: String? + public let openGroupPublicKey: String? public let openGroupProfilePictureData: Data? private let openGroupUserCount: Int? private let openGroupPermissions: OpenGroup.Permissions? @@ -274,6 +276,7 @@ public extension SessionThreadViewModel { self.openGroupName = nil self.openGroupServer = nil self.openGroupRoomToken = nil + self.openGroupPublicKey = nil self.openGroupProfilePictureData = nil self.openGroupUserCount = nil self.openGroupPermissions = nil @@ -334,6 +337,7 @@ public extension SessionThreadViewModel { openGroupName: self.openGroupName, openGroupServer: self.openGroupServer, openGroupRoomToken: self.openGroupRoomToken, + openGroupPublicKey: self.openGroupPublicKey, openGroupProfilePictureData: self.openGroupProfilePictureData, openGroupUserCount: self.openGroupUserCount, openGroupPermissions: self.openGroupPermissions, @@ -387,6 +391,7 @@ public extension SessionThreadViewModel { openGroupName: self.openGroupName, openGroupServer: self.openGroupServer, openGroupRoomToken: self.openGroupRoomToken, + openGroupPublicKey: self.openGroupPublicKey, openGroupProfilePictureData: self.openGroupProfilePictureData, openGroupUserCount: self.openGroupUserCount, openGroupPermissions: self.openGroupPermissions, @@ -753,6 +758,7 @@ public extension SessionThreadViewModel { \(openGroup[.name]) AS \(ViewModel.openGroupNameKey), \(openGroup[.server]) AS \(ViewModel.openGroupServerKey), \(openGroup[.roomToken]) AS \(ViewModel.openGroupRoomTokenKey), + \(openGroup[.publicKey]) AS \(ViewModel.openGroupPublicKeyKey), \(openGroup[.userCount]) AS \(ViewModel.openGroupUserCountKey), \(openGroup[.permissions]) AS \(ViewModel.openGroupPermissionsKey), @@ -847,6 +853,9 @@ public extension SessionThreadViewModel { \(closedGroup[.name]) AS \(ViewModel.closedGroupNameKey), (\(groupMember[.profileId]) IS NOT NULL) AS \(ViewModel.currentUserIsClosedGroupMemberKey), \(openGroup[.name]) AS \(ViewModel.openGroupNameKey), + \(openGroup[.server]) AS \(ViewModel.openGroupServerKey), + \(openGroup[.roomToken]) AS \(ViewModel.openGroupRoomTokenKey), + \(openGroup[.publicKey]) AS \(ViewModel.openGroupPublicKeyKey), \(openGroup[.imageData]) AS \(ViewModel.openGroupProfilePictureDataKey), \(SQL("\(userPublicKey)")) AS \(ViewModel.currentUserPublicKeyKey) diff --git a/SessionMessagingKitTests/Open Groups/Models/OpenGroupSpec.swift b/SessionMessagingKitTests/Open Groups/Models/OpenGroupSpec.swift index b6083b47a..5225a130a 100644 --- a/SessionMessagingKitTests/Open Groups/Models/OpenGroupSpec.swift +++ b/SessionMessagingKitTests/Open Groups/Models/OpenGroupSpec.swift @@ -79,6 +79,32 @@ class OpenGroupSpec: QuickSpec { .to(equal("OpenGroup(server: \"server\", roomToken: \"room\", id: \"server.room\", publicKey: \"1234\", isActive: true, name: \"name\", roomDescription: null, imageId: null, userCount: 0, infoUpdates: 0, sequenceNumber: 0, inboxLatestMessageId: 0, outboxLatestMessageId: 0, pollFailureCount: 0, permissions: ---)")) } } + + context("when generating an id") { + it("generates correctly") { + expect(OpenGroup.idFor(roomToken: "room", server: "server")).to(equal("server.room")) + } + + it("converts the server to lowercase") { + expect(OpenGroup.idFor(roomToken: "room", server: "SeRVeR")).to(equal("server.room")) + } + + it("maintains the casing of the roomToken") { + expect(OpenGroup.idFor(roomToken: "RoOM", server: "server")).to(equal("server.RoOM")) + } + } + + context("when generating a url") { + it("generates the url correctly") { + expect(OpenGroup.urlFor(server: "server", roomToken: "room", publicKey: "key")) + .to(equal("server/room?public_key=key")) + } + + it("maintains the casing provided") { + expect(OpenGroup.urlFor(server: "SeRVer", roomToken: "RoOM", publicKey: "KEy")) + .to(equal("SeRVer/RoOM?public_key=KEy")) + } + } } } }