diff --git a/src/jamidht/conversationrepository.cpp b/src/jamidht/conversationrepository.cpp index e265ef3c961ca50c5834ef89f563d6f428debbf5..b67b06f70220ab4277780f1cb7957f8d4ec3516d 100644 --- a/src/jamidht/conversationrepository.cpp +++ b/src/jamidht/conversationrepository.cpp @@ -194,22 +194,31 @@ public: if (!repo or !acc) return {}; std::map<std::string, std::vector<DeviceId>> memberDevices; - std::string deviceDir = fmt::format("{}devices/", - git_repository_workdir(repo.get())); + std::string deviceDir = fmt::format("{}devices/", git_repository_workdir(repo.get())); for (const auto& file : fileutils::readDirectory(deviceDir)) { std::shared_ptr<dht::crypto::Certificate> cert; try { cert = std::make_shared<dht::crypto::Certificate>( fileutils::loadFile(deviceDir + file)); + if (!cert) + continue; + if (ignoreExpired && cert->getExpiration() < std::chrono::system_clock::now()) + continue; + auto issuerUid = cert->getIssuerUID(); + if (!acc->certStore().getCertificate(issuerUid)) { + // Check that parentCert + auto memberFile = fmt::format("{}members/{}.crt", git_repository_workdir(repo.get()), issuerUid); + auto adminFile = fmt::format("{}admins/{}.crt", git_repository_workdir(repo.get()), issuerUid); + auto parentCert = std::make_shared<dht::crypto::Certificate>(fileutils::loadFile(fileutils::isFile(memberFile) ? memberFile : adminFile)); + if (parentCert && (ignoreExpired || parentCert->getExpiration() < std::chrono::system_clock::now())) + acc->certStore().pinCertificate(parentCert, true); // Pin certificate to local store if not already done + } + if (!acc->certStore().getCertificate(cert->getPublicKey().getLongId().toString())) { + acc->certStore().pinCertificate(cert, true); // Pin certificate to local store if not already done + } + memberDevices[cert->getIssuerUID()].emplace_back(cert->getPublicKey().getLongId()); + } catch (const std::exception&) {} - if (!cert) - continue; - if (ignoreExpired && cert->getExpiration() < std::chrono::system_clock::now()) - continue; - if (!acc->certStore().getCertificate(cert->getPublicKey().getLongId().toString())) { - acc->certStore().pinCertificate(cert, true); // Pin certificate to local store if not already done - } - memberDevices[cert->getIssuerUID()].emplace_back(cert->getPublicKey().getLongId()); } return memberDevices; }