From d7e16efaa6787e5c7c255d134fd439371230e854 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20Blin?=
 <sebastien.blin@savoirfairelinux.com>
Date: Tue, 24 Oct 2023 16:03:33 -0400
Subject: [PATCH] conversation_module: correctly remove conversations that we
 left

Fix members detection & path in leave

Change-Id: I5ab4131b34ba561797ed5eb84f3736faf5e101b3
---
 src/jamidht/conversation.cpp           |  2 +-
 src/jamidht/conversation_module.cpp    | 14 +++++++++-----
 src/jamidht/conversationrepository.cpp |  2 +-
 3 files changed, 11 insertions(+), 7 deletions(-)

diff --git a/src/jamidht/conversation.cpp b/src/jamidht/conversation.cpp
index 2b02d579c1..460165f5ad 100644
--- a/src/jamidht/conversation.cpp
+++ b/src/jamidht/conversation.cpp
@@ -176,7 +176,7 @@ public:
             accountId_ = shared->getAccountID();
             transferManager_ = std::make_shared<TransferManager>(shared->getAccountID(),
                                                                  repository_->id());
-            conversationDataPath_ = fileutils::get_data_dir() / shared->getAccountID() 
+            conversationDataPath_ = fileutils::get_data_dir() / shared->getAccountID()
                                         / "conversation_data" / repository_->id();
             fetchedPath_ = conversationDataPath_ / "fetched";
             sendingPath_ = conversationDataPath_ / "sending";
diff --git a/src/jamidht/conversation_module.cpp b/src/jamidht/conversation_module.cpp
index cf9b219af6..04d907e4c5 100644
--- a/src/jamidht/conversation_module.cpp
+++ b/src/jamidht/conversation_module.cpp
@@ -95,11 +95,11 @@ struct SyncedConversation
             pending.reset();
     }
 
-    std::vector<std::map<std::string, std::string>> getMembers(bool includeBanned = false) const
+    std::vector<std::map<std::string, std::string>> getMembers(bool includeLeft, bool includeBanned) const
     {
         // conversation mtx must be locked
         if (conversation)
-            return conversation->getMembers(true, true, includeBanned);
+            return conversation->getMembers(true, includeLeft, includeBanned);
         // If we're cloning, we can return the initial members
         std::vector<std::map<std::string, std::string>> result;
         result.reserve(info.members.size());
@@ -830,7 +830,7 @@ ConversationModule::Impl::getConversationMembers(const std::string& conversation
                                                  bool includeBanned) const
 {
     return withConv(conversationId,
-                    [&](const auto& conv) { return conv.getMembers(includeBanned); });
+                    [&](const auto& conv) { return conv.getMembers(true, includeBanned); });
 }
 
 void
@@ -885,9 +885,13 @@ ConversationModule::Impl::removeConversation(const std::string& conversationId)
 bool
 ConversationModule::Impl::removeConversationImpl(SyncedConversation& conv)
 {
-    auto members = conv.getMembers();
+    auto members = conv.getMembers(false, false);
     auto isSyncing = !conv.conversation;
-    auto hasMembers = !isSyncing && !(members.size() == 1 && username_ == members[0]["uri"]);
+    auto hasMembers = !isSyncing // If syncing there is no member to inform
+        && std::find_if(members.begin(), members.end(), [&](const auto& member) {
+            return member.at("uri") == username_;
+        }) != members.end()      // We must be still a member
+        && members.size() != 1;  // If there is only ourself
     conv.info.removed = std::time(nullptr);
     if (isSyncing)
         conv.info.erased = std::time(nullptr);
diff --git a/src/jamidht/conversationrepository.cpp b/src/jamidht/conversationrepository.cpp
index 59d3ce2e5b..f749854128 100644
--- a/src/jamidht/conversationrepository.cpp
+++ b/src/jamidht/conversationrepository.cpp
@@ -3382,7 +3382,7 @@ ConversationRepository::leave()
     // Remove related files
     std::filesystem::path repoPath = git_repository_workdir(repo.get());
     auto crt = fmt::format("{}.crt", uri);
-    auto adminFile = repoPath / "admin" / crt;
+    auto adminFile = repoPath / "admins" / crt;
     auto memberFile = repoPath / "members" / crt;
     auto crlsPath = repoPath / "CRLs";
 
-- 
GitLab