diff --git a/src/jamidht/conversationrepository.cpp b/src/jamidht/conversationrepository.cpp index 0682b0ba22e4254f44f0fe1a75435b9722789306..e8c58c664d15a5f1585a92205c5bdc54394d2818 100644 --- a/src/jamidht/conversationrepository.cpp +++ b/src/jamidht/conversationrepository.cpp @@ -220,11 +220,11 @@ public: return {}; std::map<std::string, std::vector<DeviceId>> memberDevices; std::string deviceDir = fmt::format("{}devices/", git_repository_workdir(repo.get())); - for (const auto& file : dhtnet::fileutils::readDirectory(deviceDir)) { - std::shared_ptr<dht::crypto::Certificate> cert; + std::error_code ec; + for (const auto& fileIt : std::filesystem::directory_iterator(deviceDir, ec)) { try { - cert = std::make_shared<dht::crypto::Certificate>( - fileutils::loadFile(deviceDir + file)); + auto cert = std::make_shared<dht::crypto::Certificate>( + fileutils::loadFile(fileIt.path())); if (!cert) continue; if (ignoreExpired && cert->getExpiration() < std::chrono::system_clock::now()) @@ -240,7 +240,7 @@ public: issuerUid); auto parentCert = std::make_shared<dht::crypto::Certificate>( dhtnet::fileutils::loadFile( - std::filesystem::is_regular_file(memberFile) ? memberFile : adminFile)); + std::filesystem::is_regular_file(memberFile, ec) ? memberFile : adminFile)); if (parentCert && (ignoreExpired || parentCert->getExpiration() < std::chrono::system_clock::now())) @@ -3416,13 +3416,14 @@ ConversationRepository::leave() auto adminFile = repoPath / "admins" / crt; auto memberFile = repoPath / "members" / crt; auto crlsPath = repoPath / "CRLs"; + std::error_code ec; - if (std::filesystem::is_regular_file(adminFile)) { - dhtnet::fileutils::removeAll(adminFile, true); + if (std::filesystem::is_regular_file(adminFile, ec)) { + std::filesystem::remove(adminFile, ec); } - if (std::filesystem::is_regular_file(memberFile)) { - dhtnet::fileutils::removeAll(memberFile, true); + if (std::filesystem::is_regular_file(memberFile, ec)) { + std::filesystem::remove(memberFile, ec); } // /CRLs @@ -3430,16 +3431,21 @@ ConversationRepository::leave() if (!crl) continue; auto crlPath = crlsPath / pimpl_->deviceId_ / fmt::format("{}.crl", dht::toHex(crl->getNumber())); - if (std::filesystem::is_regular_file(crlPath)) { - dhtnet::fileutils::removeAll(crlPath, true); + if (std::filesystem::is_regular_file(crlPath, ec)) { + std::filesystem::remove(crlPath, ec); } } // Devices - for (const auto& d : account->getKnownDevices()) { - auto deviceFile = repoPath / "devices" / fmt::format("{}.crt", d.first); - if (std::filesystem::is_regular_file(deviceFile)) { - dhtnet::fileutils::removeAll(deviceFile, true); + for (const auto& certificate : std::filesystem::directory_iterator(repoPath / "devices", ec)) { + if (certificate.is_regular_file(ec)) { + try { + crypto::Certificate cert(fileutils::loadFile(certificate.path())); + if (cert.getIssuerUID() == pimpl_->userId_) + std::filesystem::remove(certificate.path(), ec); + } catch (...) { + continue; + } } } @@ -3556,7 +3562,7 @@ ConversationRepository::voteUnban(const std::string& uri, const std::string_view JAMI_ERROR("Error when creating {}. Abort vote", voteDirectory); return {}; } - auto votePath = fileutils::getFullPath(voteDirectory, adminUri); + auto votePath = voteDirectory / adminUri; std::ofstream voteFile(votePath, std::ios::trunc | std::ios::binary); if (!voteFile.is_open()) { JAMI_ERROR("Could not write data to {}", votePath); @@ -3604,12 +3610,13 @@ ConversationRepository::Impl::resolveBan(const std::string_view type, const std: // If members, remove related devices and mark as banned if (type != "devices") { - for (const auto& certificate : dhtnet::fileutils::readDirectory(devicesPath)) { - auto certPath = fileutils::getFullPath(devicesPath, certificate); + std::error_code ec; + for (const auto& certificate : std::filesystem::directory_iterator(devicesPath, ec)) { + auto certPath = certificate.path(); try { crypto::Certificate cert(fileutils::loadFile(certPath)); if (auto issuer = cert.issuer) - if (issuer->toString() == uri) + if (issuer->getPublicKey().getId().to_view() == uri) dhtnet::fileutils::remove(certPath, true); } catch (...) { continue; @@ -3933,7 +3940,8 @@ ConversationRepository::infos() const std::filesystem::path repoPath = git_repository_workdir(repo.get()); auto profilePath = repoPath / "profile.vcf"; std::map<std::string, std::string> result; - if (std::filesystem::is_regular_file(profilePath)) { + std::error_code ec; + if (std::filesystem::is_regular_file(profilePath, ec)) { auto content = fileutils::loadFile(profilePath); result = ConversationRepository::infosFromVCard(vCard::utils::toMap( std::string_view {(const char*) content.data(), content.size()}));