1
0
mirror of https://github.com/QRouland/UTPass.git synced 2025-02-11 23:17:15 +00:00
UTPass/plugins/Pass/jobs/rnpjob.cpp

103 lines
3.3 KiB
C++
Raw Normal View History

2025-01-29 16:42:37 +01:00
#include <QDebug>
#include <QJsonDocument>
#include <QJsonObject>
#include <QSet>
#include "qjsonarray.h"
2025-01-29 16:42:37 +01:00
#include "rnpjob.h"
extern "C" {
#include <rnp/rnp.h>
#include <rnp/rnp_err.h>
}
RnpJob::RnpJob(QDir rnp_homedir):
m_rnp_homedir(rnp_homedir)
{
qRegisterMetaType<rnp_result_t>("rnp_result_t");
2025-02-01 13:45:55 +01:00
qRegisterMetaType<QList<QJsonDocument >> ("QList<QJsonDocument>");
qRegisterMetaType<QString *>("QString*");
2025-01-29 16:42:37 +01:00
auto ret = rnp_ffi_create(&this->m_ffi,
RNP_KEYSTORE_GPG,
RNP_KEYSTORE_GPG);
2025-02-01 13:45:55 +01:00
if (ret != RNP_SUCCESS) {
qDebug() << "[RnpJob] Err : " << ret;
2025-01-29 16:42:37 +01:00
qFatal("Error on rnp ffi init!");
}
}
RnpJob::~RnpJob()
{
2025-01-29 16:42:37 +01:00
auto ret = rnp_ffi_destroy(this->m_ffi);
2025-02-01 13:45:55 +01:00
if (ret != RNP_SUCCESS) {
qDebug() << "[RnpJob] Err : " << ret;
2025-01-29 16:42:37 +01:00
qFatal("Something go wrong on rnp ffi detroy");
}
}
bool RnpJob::passProvider(rnp_ffi_t ffi,
void *app_ctx,
rnp_key_handle_t key,
const char *pgp_context,
char buf[],
size_t buf_len)
2025-01-29 16:42:37 +01:00
{
if (strcmp(pgp_context, "protect")) {
return false;
}
strncpy(buf, "password", buf_len);
return true;
}
2025-02-01 13:45:55 +01:00
void RnpJob::load_key_file(QSet<QString> *result_fingerprints, const QString path, const uint32_t flags)
{
qDebug() << "[RnpJob] load keyring at" << path;
rnp_input_t input = NULL;
if (QFileInfo::exists(this->pubringPath())) {
auto ret = rnp_input_from_path(&input, path.toLocal8Bit().constData());
char *json = NULL;
if (ret == RNP_SUCCESS) {
ret = rnp_import_keys(this->m_ffi,
input,
flags,
&json);
}
QJsonDocument json_document = QJsonDocument::fromJson(json);
qDebug() << "[RnpJob] json" << json_document;
2025-02-01 13:45:55 +01:00
if(result_fingerprints) {
foreach (const QJsonValue fingerprint, json_document.object()["keys"].toArray()) {
qDebug() << "[RnpJob] Add fingerprint" << fingerprint["fingerprint"].toString();
result_fingerprints->insert(fingerprint["fingerprint"].toString());
}
}
rnp_input_destroy(input);
rnp_buffer_destroy(json);
terminateOnError(ret);
qDebug() << "[RnpJob] keyring loaded successfully";
} else {
qDebug() << "[RnpJob] No keyring" << path << "not found";
}
}
2025-02-01 13:45:55 +01:00
void RnpJob::load_pub_keyring(QSet<QString> *result_fingerprints = NULL)
{
2025-02-01 13:45:55 +01:00
this->load_key_file(result_fingerprints, this->pubringPath(), RNP_LOAD_SAVE_PUBLIC_KEYS);
qDebug() << "[RnpJob] pub fingerprints" << *result_fingerprints;
}
2025-02-01 13:45:55 +01:00
void RnpJob::load_sec_keyring(QSet<QString> *result_fingerprints = NULL)
{
2025-02-01 13:45:55 +01:00
this->load_key_file(result_fingerprints, this->secringPath(), RNP_LOAD_SAVE_SECRET_KEYS);
qDebug() << "[RnpJob] sec fingerprints" << *result_fingerprints;
}
2025-02-01 13:45:55 +01:00
void RnpJob::load_full_keyring(QSet<QString> *result_fingerprints = NULL)
{
2025-02-01 13:45:55 +01:00
this->load_pub_keyring(result_fingerprints);
this->load_sec_keyring(result_fingerprints);
qDebug() << "[RnpJob] full fingerprints" << *result_fingerprints;
}