aboutsummaryrefslogtreecommitdiffstats
path: root/src/m_key_server_sync/VKSInterface.cpp
diff options
context:
space:
mode:
authorsaturneric <[email protected]>2026-08-01 15:28:15 +0200
committersaturneric <[email protected]>2026-08-01 15:28:15 +0200
commitc63a463418a49edc6f501bee97fd1d50914dd5ed (patch)
tree0740cabefcebe868080c077c3d83dbbe7962c078 /src/m_key_server_sync/VKSInterface.cpp
parenti18n(key-server-sync): update translations (diff)
downloadmodules-c63a463418a49edc6f501bee97fd1d50914dd5ed.tar.gz
modules-c63a463418a49edc6f501bee97fd1d50914dd5ed.zip
feat(key_server_sync): add key server settings
- add key server settings UI and settings page for managing servers - implement KeyServerList to load, store, and resolve default server - add KeyServerProber to probe HKP and VKS and classify replies - register settings page and expose it to host settings dialog - require VKSInterface to be constructed with target server - add shared request builder with user agent and transfer timeout - update callers to pass server and include used server in responses - adapt SearchKeyDialog to use configured server list and default - unregister settings page on module deactivate to avoid crashes
Diffstat (limited to 'src/m_key_server_sync/VKSInterface.cpp')
-rw-r--r--src/m_key_server_sync/VKSInterface.cpp37
1 files changed, 26 insertions, 11 deletions
diff --git a/src/m_key_server_sync/VKSInterface.cpp b/src/m_key_server_sync/VKSInterface.cpp
index cbd63ee..4d7936a 100644
--- a/src/m_key_server_sync/VKSInterface.cpp
+++ b/src/m_key_server_sync/VKSInterface.cpp
@@ -28,6 +28,8 @@
#include "VKSInterface.h"
+#include <GFSDKExtra.h>
+
#include <QByteArray>
#include <QDebug>
#include <QJsonArray>
@@ -42,6 +44,19 @@
#include "GFModuleCommonUtils.hpp"
+namespace {
+/// Matches the HKP side; without it a stalled server hangs the caller forever.
+constexpr int kTransferTimeoutMs = 15000;
+} // namespace
+
+auto VKSInterface::make_request(const QUrl& url) -> QNetworkRequest {
+ QNetworkRequest request(url);
+ request.setHeader(QNetworkRequest::UserAgentHeader,
+ UDUP(GFHttpRequestUserAgent()));
+ request.setTransferTimeout(kTransferTimeoutMs);
+ return request;
+}
+
VKSInterface::VKSInterface(QString key_server, QObject* parent)
: QObject(parent),
target_key_server_(std::move(key_server)),
@@ -52,8 +67,10 @@ VKSInterface::VKSInterface(QString key_server, QObject* parent)
void VKSInterface::GetByFingerprint(const QString& fingerprint) {
// search cache by first
- cache_key_ =
- QString("module:key-server-sync:key-data:fpr:%1").arg(fingerprint);
+ // Keyed by server too: which server answered is now the user's choice, and
+ // two of them can hold different versions of the same key.
+ cache_key_ = QString("module:key-server-sync:key-data:%1:fpr:%2")
+ .arg(QUrl(target_key_server_).host(), fingerprint);
auto value = UDUP(GFCacheGet(QDUP(cache_key_)));
if (!value.isEmpty()) {
emit SignalKeyRetrieved(value);
@@ -63,13 +80,13 @@ void VKSInterface::GetByFingerprint(const QString& fingerprint) {
QUrl url(QString("%1/vks/v1/by-fingerprint/%2")
.arg(target_key_server_)
.arg(fingerprint));
- QNetworkRequest request(url);
- network_manager_->get(request);
+ network_manager_->get(make_request(url));
}
void VKSInterface::GetByKeyId(const QString& key_id) {
// search cache by first
- cache_key_ = QString("module:key-server-sync:key-data:id:%1").arg(key_id);
+ cache_key_ = QString("module:key-server-sync:key-data:%1:id:%2")
+ .arg(QUrl(target_key_server_).host(), key_id);
auto value = UDUP(GFCacheGet(QDUP(cache_key_)));
if (!value.isEmpty()) {
emit SignalKeyRetrieved(value);
@@ -78,21 +95,19 @@ void VKSInterface::GetByKeyId(const QString& key_id) {
QUrl url(
QString("%1/vks/v1/by-keyid/%2").arg(target_key_server_).arg(key_id));
- QNetworkRequest request(url);
- network_manager_->get(request);
+ network_manager_->get(make_request(url));
}
void VKSInterface::GetByEmail(const QString& email) {
QUrl url(QString("%1/vks/v1/by-email/%2")
.arg(target_key_server_)
.arg(QUrl::toPercentEncoding(email)));
- QNetworkRequest request(url);
- network_manager_->get(request);
+ network_manager_->get(make_request(url));
}
void VKSInterface::UploadKey(const QString& key_text) {
QUrl url(QString("%1/vks/v1/upload").arg(target_key_server_));
- QNetworkRequest request(url);
+ auto request = make_request(url);
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
QJsonObject json;
@@ -105,7 +120,7 @@ void VKSInterface::RequestVerify(const QString& token,
const QStringList& addresses,
const QStringList& locale) {
QUrl url(QString("%1/vks/v1/request-verify").arg(target_key_server_));
- QNetworkRequest request(url);
+ auto request = make_request(url);
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
QJsonObject json;