KWallet

kwalletportalsecrets.cpp
1/*
2 This file is part of the KDE libraries
3 SPDX-FileCopyrightText: 2023 Nicolas Fella <nicolas.fella@gmx.de>
4
5 SPDX-License-Identifier: LGPL-2.0-or-later
6*/
7
8#include "kwalletportalsecrets.h"
9
10#include "kwalletportalsecretsadaptor.h"
11
12#include <QRandomGenerator>
13
14KWalletPortalSecrets::KWalletPortalSecrets(KWalletD *parent)
15 : QObject(parent)
16 , m_kwalletd(parent)
17{
18 (void)new KWalletPortalSecretsAdaptor(this);
19
20 QDBusConnection::sessionBus().registerService(QStringLiteral("org.freedesktop.impl.portal.desktop.kwallet"));
21 QDBusConnection::sessionBus().registerObject(QStringLiteral("/org/freedesktop/portal/desktop"), this, QDBusConnection::ExportAdaptors);
22
23 connect(m_kwalletd, &KWalletD::walletAsyncOpened, this, &KWalletPortalSecrets::walletOpened);
24}
25
26uint KWalletPortalSecrets::RetrieveSecret(const QDBusObjectPath &handle,
27 const QString &app_id,
29 const QVariantMap &options,
30 QVariantMap &results)
31{
32 Q_UNUSED(handle);
33 Q_UNUSED(options);
34 Q_UNUSED(results);
35
36 setDelayedReply(true);
37
38 const QString wallet = m_kwalletd->networkWallet();
39 const bool walletIsOpen = m_kwalletd->isOpen(m_kwalletd->networkWallet());
40
41 Request request{message(), fd.fileDescriptor(), app_id};
42
43 if (!walletIsOpen) {
44 m_pendingRequests.insert(app_id, request);
45 m_kwalletd->openAsync(wallet, 0, app_id, false, connection(), message());
46 } else {
47 Q_ASSERT(m_handle != -1);
48 handleRequest(request);
49 }
50
51 return 0;
52}
53
54void KWalletPortalSecrets::walletOpened(int id, int handle)
55{
56 Q_UNUSED(id);
57 Q_ASSERT(handle != -1);
58
59 m_handle = handle;
60
61 for (const Request &request : std::as_const(m_pendingRequests)) {
62 handleRequest(request);
63 }
64
65 m_pendingRequests.clear();
66}
67
68void KWalletPortalSecrets::handleRequest(const Request &request)
69{
70 bool exists = m_kwalletd->hasEntry(m_handle, "xdg-desktop-portal", request.appId, request.appId);
71
72 QByteArray secret;
73
74 if (exists) {
75 secret = m_kwalletd->readEntry(m_handle, "xdg-desktop-portal", request.appId, request.appId);
76 } else {
77 secret = generateSecret();
78 m_kwalletd->writeEntry(m_handle, "xdg-desktop-portal", request.appId, secret, request.appId);
79 m_kwalletd->sync(m_handle, request.appId);
80 }
81
82 QFile outFile;
83 outFile.open(request.fd, QIODevice::ReadWrite);
84
85 outFile.write(secret);
86
87 const auto replyList = QVariantList{{(uint)0}, {{QVariantMap{}}}};
88 auto reply = request.message.createReply(replyList);
90}
91
92QByteArray KWalletPortalSecrets::generateSecret() const
93{
94 const int secretSize = 64;
95 QByteArray secret;
96 secret.resize(secretSize);
98
99 return secret;
100}
iterator begin()
iterator end()
void resize(qsizetype newSize, char c)
bool registerObject(const QString &path, QObject *object, RegisterOptions options)
bool registerService(const QString &serviceName)
bool send(const QDBusMessage &message) const const
QDBusConnection sessionBus()
QDBusConnection connection() const const
const QDBusMessage & message() const const
void setDelayedReply(bool enable) const const
int fileDescriptor() const const
bool open(FILE *fh, OpenMode mode, FileHandleFlags handleFlags)
void clear()
iterator insert(const Key &key, const T &value)
qint64 write(const QByteArray &data)
quint32 generate()
QRandomGenerator securelySeeded()
QFuture< ArgsType< Signal > > connect(Sender *sender, Signal signal)
This file is part of the KDE documentation.
Documentation copyright © 1996-2024 The KDE developers.
Generated on Fri May 10 2024 11:47:59 by doxygen 1.10.0 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.