migrate to new api

This commit is contained in:
Iuri Matias
2026-04-13 13:35:40 -04:00
parent b0401c0058
commit eb501f5528
12 changed files with 355 additions and 504 deletions
+93 -125
View File
@@ -1,16 +1,13 @@
#include "package_manager_impl.h"
#include <package_manager_lib.h>
#include <lgx.h>
#include <QDebug>
#include <QDateTime>
#include <QJsonDocument>
#include <QJsonArray>
#include <QFileInfo>
#include <algorithm>
#include <filesystem>
#include <iostream>
PackageManagerImpl::PackageManagerImpl()
: m_lib(nullptr)
{
qDebug() << "PackageManagerImpl created (new provider API)";
m_lib = new PackageManagerLib();
}
@@ -20,228 +17,199 @@ PackageManagerImpl::~PackageManagerImpl()
m_lib = nullptr;
}
void PackageManagerImpl::onInit(LogosAPI* api)
{
qDebug() << "PackageManagerImpl: LogosAPI initialized (new provider API)";
}
QVariantMap PackageManagerImpl::installPlugin(const QString& pluginPath, bool skipIfNotNewerVersion)
LogosMap PackageManagerImpl::installPlugin(const std::string& pluginPath, bool skipIfNotNewerVersion)
{
std::string errorMsg;
std::string installedPluginPath;
bool isCoreModule = false;
std::string result = m_lib->installPluginFile(
pluginPath.toStdString(), errorMsg, skipIfNotNewerVersion,
pluginPath, errorMsg, skipIfNotNewerVersion,
&installedPluginPath, &isCoreModule
);
bool success = !result.empty();
if (success && !installedPluginPath.empty()) {
onPluginFileInstalled(QString::fromStdString(installedPluginPath), isCoreModule);
if (success && !installedPluginPath.empty() && emitEvent) {
if (isCoreModule) {
emitEvent("corePluginFileInstalled", installedPluginPath);
} else {
emitEvent("uiPluginFileInstalled", installedPluginPath);
}
}
// Get signature info for the response
auto sigResult = m_lib->verifyPackageSignature(pluginPath.toStdString());
auto sigResult = m_lib->verifyPackageSignature(pluginPath);
QFileInfo fi(pluginPath);
QVariantMap response;
response["name"] = fi.completeBaseName();
response["path"] = success ? QString::fromStdString(installedPluginPath) : QString();
std::string stem = std::filesystem::path(pluginPath).stem().string();
LogosMap response;
response["name"] = stem;
response["path"] = success ? installedPluginPath : std::string();
response["isCoreModule"] = isCoreModule;
if (!success) {
response["error"] = QString::fromStdString(errorMsg);
response["error"] = errorMsg;
}
// Add signature info
if (sigResult.is_signed) {
response["signatureStatus"] = sigResult.signature_valid && sigResult.package_valid
? QString("signed") : QString("invalid");
response["signerDid"] = QString::fromStdString(sigResult.signer_did);
if (!sigResult.signer_name.empty()) {
response["signerName"] = QString::fromStdString(sigResult.signer_name);
}
if (!sigResult.signer_url.empty()) {
response["signerUrl"] = QString::fromStdString(sigResult.signer_url);
}
if (!sigResult.trusted_as.empty()) {
response["trustedAs"] = QString::fromStdString(sigResult.trusted_as);
}
bool valid = sigResult.signature_valid && sigResult.package_valid;
response["signatureStatus"] = valid ? std::string("signed") : std::string("invalid");
response["signerDid"] = sigResult.signer_did;
if (!sigResult.signer_name.empty())
response["signerName"] = sigResult.signer_name;
if (!sigResult.signer_url.empty())
response["signerUrl"] = sigResult.signer_url;
if (!sigResult.trusted_as.empty())
response["trustedAs"] = sigResult.trusted_as;
} else if (!sigResult.error.empty()) {
response["signatureStatus"] = QString("error");
response["signatureError"] = QString::fromStdString(sigResult.error);
response["signatureStatus"] = std::string("error");
response["signatureError"] = sigResult.error;
} else {
response["signatureStatus"] = QString("unsigned");
response["signatureStatus"] = std::string("unsigned");
}
return response;
}
void PackageManagerImpl::onPluginFileInstalled(const QString& pluginPath, bool isCoreModule)
LogosList PackageManagerImpl::getInstalledPackages()
{
QVariantList eventData;
eventData << pluginPath;
if (isCoreModule) {
qDebug() << "Emitting corePluginFileInstalled event for:" << pluginPath;
emitEvent("corePluginFileInstalled", eventData);
} else {
qDebug() << "Emitting uiPluginFileInstalled event for:" << pluginPath;
emitEvent("uiPluginFileInstalled", eventData);
}
return LogosList::parse(m_lib->getInstalledPackages());
}
static QVariantList jsonStringToVariantList(const std::string& jsonStr)
LogosList PackageManagerImpl::getInstalledModules()
{
QJsonDocument doc = QJsonDocument::fromJson(QByteArray::fromStdString(jsonStr));
return doc.array().toVariantList();
return LogosList::parse(m_lib->getInstalledModules());
}
QVariantList PackageManagerImpl::getInstalledPackages()
LogosList PackageManagerImpl::getInstalledUiPlugins()
{
return jsonStringToVariantList(m_lib->getInstalledPackages());
return LogosList::parse(m_lib->getInstalledUiPlugins());
}
QVariantList PackageManagerImpl::getInstalledModules()
std::vector<std::string> PackageManagerImpl::getValidVariants()
{
return jsonStringToVariantList(m_lib->getInstalledModules());
return PackageManagerLib::platformVariantsToTry();
}
QVariantList PackageManagerImpl::getInstalledUiPlugins()
void PackageManagerImpl::setEmbeddedModulesDirectory(const std::string& dir)
{
return jsonStringToVariantList(m_lib->getInstalledUiPlugins());
m_lib->setEmbeddedModulesDirectory(dir);
}
QStringList PackageManagerImpl::getValidVariants()
void PackageManagerImpl::addEmbeddedModulesDirectory(const std::string& dir)
{
QStringList result;
for (const auto& v : PackageManagerLib::platformVariantsToTry()) {
result << QString::fromStdString(v);
}
return result;
m_lib->addEmbeddedModulesDirectory(dir);
}
void PackageManagerImpl::setEmbeddedModulesDirectory(const QString& dir)
void PackageManagerImpl::setEmbeddedUiPluginsDirectory(const std::string& dir)
{
m_lib->setEmbeddedModulesDirectory(dir.toStdString());
m_lib->setEmbeddedUiPluginsDirectory(dir);
}
void PackageManagerImpl::addEmbeddedModulesDirectory(const QString& dir)
void PackageManagerImpl::addEmbeddedUiPluginsDirectory(const std::string& dir)
{
m_lib->addEmbeddedModulesDirectory(dir.toStdString());
m_lib->addEmbeddedUiPluginsDirectory(dir);
}
void PackageManagerImpl::setEmbeddedUiPluginsDirectory(const QString& dir)
void PackageManagerImpl::setUserModulesDirectory(const std::string& dir)
{
m_lib->setEmbeddedUiPluginsDirectory(dir.toStdString());
m_lib->setUserModulesDirectory(dir);
}
void PackageManagerImpl::addEmbeddedUiPluginsDirectory(const QString& dir)
void PackageManagerImpl::setUserUiPluginsDirectory(const std::string& dir)
{
m_lib->addEmbeddedUiPluginsDirectory(dir.toStdString());
m_lib->setUserUiPluginsDirectory(dir);
}
void PackageManagerImpl::setUserModulesDirectory(const QString& dir)
void PackageManagerImpl::setSignaturePolicy(const std::string& policy)
{
m_lib->setUserModulesDirectory(dir.toStdString());
}
void PackageManagerImpl::setUserUiPluginsDirectory(const QString& dir)
{
m_lib->setUserUiPluginsDirectory(dir.toStdString());
}
void PackageManagerImpl::setSignaturePolicy(const QString& policy)
{
std::string p = policy.toLower().toStdString();
std::string p = policy;
std::transform(p.begin(), p.end(), p.begin(), ::tolower);
if (p == "none") m_lib->setSignaturePolicy(SignaturePolicy::NONE);
else if (p == "warn") m_lib->setSignaturePolicy(SignaturePolicy::WARN);
else if (p == "require") m_lib->setSignaturePolicy(SignaturePolicy::REQUIRE);
else {
qWarning() << "PackageManagerImpl::setSignaturePolicy: invalid policy"
<< policy << "- expected one of: none, warn, require";
std::cerr << "PackageManagerImpl::setSignaturePolicy: invalid policy '"
<< policy << "' - expected one of: none, warn, require\n";
}
}
void PackageManagerImpl::setKeyringDirectory(const QString& dir)
void PackageManagerImpl::setKeyringDirectory(const std::string& dir)
{
m_lib->setKeyringDirectory(dir.toStdString());
m_lib->setKeyringDirectory(dir);
}
QVariantMap PackageManagerImpl::verifyPackage(const QString& lgxPath)
LogosMap PackageManagerImpl::verifyPackage(const std::string& lgxPath)
{
auto result = m_lib->verifyPackageSignature(lgxPath.toStdString());
auto result = m_lib->verifyPackageSignature(lgxPath);
QVariantMap response;
LogosMap response;
response["isSigned"] = result.is_signed;
response["signatureValid"] = result.signature_valid;
response["packageValid"] = result.package_valid;
response["signerDid"] = QString::fromStdString(result.signer_did);
response["signerName"] = QString::fromStdString(result.signer_name);
response["signerUrl"] = QString::fromStdString(result.signer_url);
response["trustedAs"] = QString::fromStdString(result.trusted_as);
if (!result.error.empty()) {
response["error"] = QString::fromStdString(result.error);
}
response["signerDid"] = result.signer_did;
response["signerName"] = result.signer_name;
response["signerUrl"] = result.signer_url;
response["trustedAs"] = result.trusted_as;
if (!result.error.empty())
response["error"] = result.error;
return response;
}
QVariantMap PackageManagerImpl::addTrustedKey(const QString& name, const QString& did,
const QString& displayName, const QString& url)
LogosMap PackageManagerImpl::addTrustedKey(const std::string& name, const std::string& did,
const std::string& displayName, const std::string& url)
{
std::string keyringDir = m_lib->keyringDirectory();
const char* keyringDirPtr = keyringDir.empty() ? nullptr : keyringDir.c_str();
lgx_result_t result = lgx_keyring_add(
lgx_result_t res = lgx_keyring_add(
keyringDirPtr,
name.toStdString().c_str(),
did.toStdString().c_str(),
displayName.isEmpty() ? nullptr : displayName.toStdString().c_str(),
url.isEmpty() ? nullptr : url.toStdString().c_str()
name.c_str(),
did.c_str(),
displayName.empty() ? nullptr : displayName.c_str(),
url.empty() ? nullptr : url.c_str()
);
QVariantMap response;
response["success"] = result.success;
if (!result.success && result.error) {
response["error"] = QString::fromUtf8(result.error);
}
LogosMap response;
response["success"] = static_cast<bool>(res.success);
if (!res.success && res.error)
response["error"] = std::string(res.error);
return response;
}
QVariantMap PackageManagerImpl::removeTrustedKey(const QString& name)
LogosMap PackageManagerImpl::removeTrustedKey(const std::string& name)
{
std::string keyringDir = m_lib->keyringDirectory();
const char* keyringDirPtr = keyringDir.empty() ? nullptr : keyringDir.c_str();
lgx_result_t result = lgx_keyring_remove(
lgx_result_t res = lgx_keyring_remove(
keyringDirPtr,
name.toStdString().c_str()
name.c_str()
);
QVariantMap response;
response["success"] = result.success;
if (!result.success && result.error) {
response["error"] = QString::fromUtf8(result.error);
}
LogosMap response;
response["success"] = static_cast<bool>(res.success);
if (!res.success && res.error)
response["error"] = std::string(res.error);
return response;
}
QVariantList PackageManagerImpl::listTrustedKeys()
LogosList PackageManagerImpl::listTrustedKeys()
{
std::string keyringDir = m_lib->keyringDirectory();
const char* keyringDirPtr = keyringDir.empty() ? nullptr : keyringDir.c_str();
lgx_keyring_list_t list = lgx_keyring_list(keyringDirPtr);
QVariantList result;
LogosList result = LogosList::array();
for (size_t i = 0; i < list.count; ++i) {
QVariantMap entry;
if (list.keys[i].name) entry["name"] = QString::fromUtf8(list.keys[i].name);
if (list.keys[i].did) entry["did"] = QString::fromUtf8(list.keys[i].did);
if (list.keys[i].display_name) entry["displayName"] = QString::fromUtf8(list.keys[i].display_name);
if (list.keys[i].url) entry["url"] = QString::fromUtf8(list.keys[i].url);
if (list.keys[i].added_at) entry["addedAt"] = QString::fromUtf8(list.keys[i].added_at);
result.append(entry);
LogosMap entry;
if (list.keys[i].name) entry["name"] = std::string(list.keys[i].name);
if (list.keys[i].did) entry["did"] = std::string(list.keys[i].did);
if (list.keys[i].display_name) entry["displayName"] = std::string(list.keys[i].display_name);
if (list.keys[i].url) entry["url"] = std::string(list.keys[i].url);
if (list.keys[i].added_at) entry["addedAt"] = std::string(list.keys[i].added_at);
result.push_back(entry);
}
lgx_free_keyring_list(list);