From 383634c90e9817a627b6b59e863032796f4d74f0 Mon Sep 17 00:00:00 2001 From: 0x330a <92654767+0x330a@users.noreply.github.com> Date: Mon, 23 Oct 2023 17:57:40 +1100 Subject: [PATCH] feat: add set group invite completed, persist a group config individually --- .../thoughtcrime/securesms/database/Storage.kt | 15 +++++++++++++++ .../securesms/dependencies/ConfigFactory.kt | 10 ++++++++++ .../libsession/database/StorageProtocol.kt | 1 + .../messaging/jobs/BatchMessageReceiveJob.kt | 2 +- .../messaging/jobs/MessageReceiveJob.kt | 2 +- .../sending_receiving/ReceivedMessageHandler.kt | 12 ++++++------ 6 files changed, 34 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/Storage.kt b/app/src/main/java/org/thoughtcrime/securesms/database/Storage.kt index 84d268993..1d9532749 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/Storage.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/Storage.kt @@ -1225,6 +1225,21 @@ open class Storage( MessageSender.send(responseMessage, invitingAdminAddress) } + override fun setGroupInviteComplete(approved: Boolean, invitee: String, closedGroup: SessionId) { + val groupMembers = configFactory.getGroupMemberConfig(closedGroup) ?: return + val member = groupMembers.get(invitee) ?: run { + Log.e("ClosedGroup", "User wasn't in the group membership to add!") + return + } + if (approved) { + groupMembers.set(member.copy(invitePending = false)) + } else { + groupMembers.erase(member) + } + configFactory.persistGroupConfigDump(groupMembers, closedGroup, SnodeAPI.nowWithOffset) + groupMembers.close() + } + override fun setServerCapabilities(server: String, capabilities: List) { return DatabaseComponent.get(context).lokiAPIDatabase().setServerCapabilities(server, capabilities) } diff --git a/app/src/main/java/org/thoughtcrime/securesms/dependencies/ConfigFactory.kt b/app/src/main/java/org/thoughtcrime/securesms/dependencies/ConfigFactory.kt index a8e8c6abc..60373d9f7 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/dependencies/ConfigFactory.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/dependencies/ConfigFactory.kt @@ -293,6 +293,16 @@ class ConfigFactory( ) } + fun persistGroupConfigDump(forConfigObject: ConfigBase, groupSessionId: SessionId, timestamp: Long) = synchronized(userGroupsLock) { + val dumped = forConfigObject.dump() + configDatabase.storeConfig( + ConfigDatabase.KEYS_VARIANT, + groupSessionId.hexString(), + dumped, + timestamp + ) + } + override fun persist(forConfigObject: Config, timestamp: Long) { try { listeners.forEach { listener -> diff --git a/libsession/src/main/java/org/session/libsession/database/StorageProtocol.kt b/libsession/src/main/java/org/session/libsession/database/StorageProtocol.kt index 033e69c15..81c4d5c3f 100644 --- a/libsession/src/main/java/org/session/libsession/database/StorageProtocol.kt +++ b/libsession/src/main/java/org/session/libsession/database/StorageProtocol.kt @@ -160,6 +160,7 @@ interface StorageProtocol { fun createNewGroup(groupName: String, groupDescription: String, members: Set): Optional fun getMembers(groupPublicKey: String): List fun acceptClosedGroupInvite(groupId: SessionId, name: String, authData: ByteArray, invitingAdmin: SessionId) + fun setGroupInviteComplete(approved: Boolean, invitee: String, closedGroup: SessionId) // Groups fun getAllGroups(includeInactive: Boolean): List diff --git a/libsession/src/main/java/org/session/libsession/messaging/jobs/BatchMessageReceiveJob.kt b/libsession/src/main/java/org/session/libsession/messaging/jobs/BatchMessageReceiveJob.kt index 172e2837a..c199894c0 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/jobs/BatchMessageReceiveJob.kt +++ b/libsession/src/main/java/org/session/libsession/messaging/jobs/BatchMessageReceiveJob.kt @@ -209,7 +209,7 @@ class BatchMessageReceiveJob( } } - else -> MessageReceiver.handle(message, proto, threadId, openGroupID) + else -> MessageReceiver.handle(message, proto, threadId, openGroupID, parameters.closedGroup?.publicKey?.let(SessionId::from)) } } catch (e: Exception) { Log.e(TAG, "Couldn't process message (id: $id)", e) diff --git a/libsession/src/main/java/org/session/libsession/messaging/jobs/MessageReceiveJob.kt b/libsession/src/main/java/org/session/libsession/messaging/jobs/MessageReceiveJob.kt index 1ac482d5b..0897cd06c 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/jobs/MessageReceiveJob.kt +++ b/libsession/src/main/java/org/session/libsession/messaging/jobs/MessageReceiveJob.kt @@ -41,7 +41,7 @@ class MessageReceiveJob(val data: ByteArray, val serverHash: String? = null, val val (message, proto) = MessageReceiver.parse(this.data, this.openGroupMessageServerID, openGroupPublicKey = serverPublicKey, currentClosedGroups = currentClosedGroups) val threadId = Message.getThreadId(message, this.openGroupID, storage, false) message.serverHash = serverHash - MessageReceiver.handle(message, proto, threadId ?: -1, this.openGroupID) + MessageReceiver.handle(message, proto, threadId ?: -1, this.openGroupID, null) this.handleSuccess(dispatcherName) deferred.resolve(Unit) } catch (e: Exception) { diff --git a/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/ReceivedMessageHandler.kt b/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/ReceivedMessageHandler.kt index 0bf3cb620..b09713eb7 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/ReceivedMessageHandler.kt +++ b/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/ReceivedMessageHandler.kt @@ -62,7 +62,7 @@ internal fun MessageReceiver.isBlocked(publicKey: String): Boolean { return recipient.isBlocked } -fun MessageReceiver.handle(message: Message, proto: SignalServiceProtos.Content, threadId: Long, openGroupID: String?) { +fun MessageReceiver.handle(message: Message, proto: SignalServiceProtos.Content, threadId: Long, openGroupID: String?, closedGroup: SessionId?) { // Do nothing if the message was outdated if (MessageReceiver.messageIsOutdated(message, threadId, openGroupID)) { return } @@ -70,7 +70,7 @@ fun MessageReceiver.handle(message: Message, proto: SignalServiceProtos.Content, is ReadReceipt -> handleReadReceipt(message) is TypingIndicator -> handleTypingIndicator(message) is ClosedGroupControlMessage -> handleClosedGroupControlMessage(message) - is GroupUpdated -> handleNewLibSessionClosedGroupMessage(message) + is GroupUpdated -> handleNewLibSessionClosedGroupMessage(message, closedGroup) is ExpirationTimerUpdate -> handleExpirationTimerUpdate(message) is DataExtractionNotification -> handleDataExtractionNotification(message) is ConfigurationMessage -> handleConfigurationMessage(message) @@ -519,19 +519,19 @@ private fun ClosedGroupControlMessage.getPublicKey(): String = kind!!.let { when is ClosedGroupControlMessage.Kind.NameChange -> groupPublicKey!! }} -private fun MessageReceiver.handleGroupUpdated(message: GroupUpdated) { +private fun MessageReceiver.handleGroupUpdated(message: GroupUpdated, closedGroup: SessionId) { when { message.inner.hasInviteMessage() -> handleNewLibSessionClosedGroupMessage(message) - message.inner.hasInviteResponse() -> handleInviteResponse(message) + message.inner.hasInviteResponse() -> handleInviteResponse(message, closedGroup) } } -private fun MessageReceiver.handleInviteResponse(message: GroupUpdated) { +private fun MessageReceiver.handleInviteResponse(message: GroupUpdated, closedGroup: SessionId) { val sender = message.sender!! // val profile = message // maybe we do need data to be the inner so we can access profile val storage = MessagingModuleConfiguration.shared.storage val approved = message.inner.inviteResponse.isApproved - + storage.setGroupInviteComplete(approved, sender, closedGroup) } private fun MessageReceiver.handleNewLibSessionClosedGroupMessage(message: GroupUpdated) {