milestone: 22 KF6 enabled, blake3 placeholders removed, text-login fixed

- kf6-knewstuff/kwallet: removed all-zero blake3 placeholders
- CONSOLE-TO-KDE-DESKTOP-PLAN.md: 20→22 KF6 enabled count
- BOOT-PROCESS-IMPROVEMENT-PLAN.md: text-login→graphical greeter path
- D-Bus session/kwin compositor/sessiond enhancements from Wave tasks
- Only kirigami remains suppressed (QML-dependent, environmental gate)

Zero warnings. 24 commits total.
This commit is contained in:
2026-04-29 14:48:47 +01:00
parent cb2e75e640
commit edb68153e3
621 changed files with 1034826 additions and 223 deletions
@@ -0,0 +1,6 @@
add_subdirectory(KWallet)
if(BUILD_KWALLETD)
add_subdirectory(kwalletd)
endif()
@@ -0,0 +1,18 @@
remove_definitions(-DQT_NO_CAST_FROM_ASCII)
remove_definitions(-DQT_NO_CAST_TO_ASCII)
include(ECMMarkAsTest)
find_package(Qt6 ${REQUIRED_QT_VERSION} CONFIG REQUIRED Test)
macro(kwallet_executable_tests)
foreach(_testname ${ARGN})
add_executable(${_testname} ${_testname}.cpp)
ecm_mark_as_test(${_testname})
target_link_libraries(${_testname} Qt6::Test Qt6::Widgets KF6::Wallet)
endforeach(_testname)
endmacro()
kwallet_executable_tests(
kwallettest
)
@@ -0,0 +1,105 @@
/*
This file is part of the KDE Libraries
SPDX-FileCopyrightText: 2007 Thomas McGuire <thomas.mcguire@gmx.net>
SPDX-License-Identifier: LGPL-2.0-or-later
*/
#include "kwallettest.h"
#include <QTest>
#include <qglobal.h>
#include <kwallet.h>
using namespace KWallet;
void KWalletTest::init()
{
if (!qEnvironmentVariableIsSet("DISPLAY")) {
QSKIP("$DISPLAY is not set. These tests cannot be done without a graphical system.");
}
}
void KWalletTest::testWallet()
{
QString testWallet = QStringLiteral("kdewallet");
QString testFolder = QStringLiteral("wallettestfolder");
QString testKeys[] = {QStringLiteral("testKey"), QStringLiteral("account-302948"), QStringLiteral("\\"), QStringLiteral("/abc"), QStringLiteral("a@b.c")};
QByteArray testValues[] = {"test", "@(!§\"%&", "", ".test", "\\"};
int numTests = 5;
// open
Wallet *wallet = Wallet::openWallet(testWallet, 0, Wallet::Synchronous);
if (wallet == nullptr) {
qDebug() << "Couldn't open the wallet. Maybe the wallet daemon is not running?";
}
QVERIFY2(wallet != nullptr, "openWallet failed!");
QVERIFY2(Wallet::isOpen(testWallet), "opwnWallet succeeded but the wallet !isOpen");
// create folder
wallet->createFolder(testFolder);
QVERIFY2(wallet->hasFolder(testFolder), "Failed to create testFolder");
wallet->setFolder(testFolder);
QVERIFY2(wallet->currentFolder() == testFolder, "Failed to set current testFolder");
QVERIFY2(wallet->folderList().contains(testFolder), "The wallet does not contain freshly created testFolder");
// write & read many entries
for (int i = 0; i < numTests; i++) {
wallet->writeEntry(testKeys[i], testValues[i]);
QVERIFY2(wallet->hasEntry(testKeys[i]), "hasEntry failed!");
QByteArray readEntry;
wallet->readEntry(testKeys[i], readEntry);
QVERIFY2(readEntry == testValues[i], "readEntry failed!");
}
// close
wallet->sync();
Wallet::closeWallet(QStringLiteral("kdewallet"), true);
QVERIFY2(!Wallet::isOpen("kdewallet"), "wallet is still opened after close call!");
// test for key - closed wallet
for (int i = 0; i < 5; i++) {
QVERIFY2(!Wallet::keyDoesNotExist(testWallet, testFolder, testKeys[i]), "keyDoesNotExist(1) failed");
QVERIFY2(Wallet::keyDoesNotExist(testWallet, testFolder, "madeUpKey"), "keyDoesNotExist(2) failed");
QVERIFY2(Wallet::keyDoesNotExist(testWallet, "madeUpFolderName", "madeUpKey"), "keyDoesNotExist(3) failed");
QVERIFY2(Wallet::keyDoesNotExist(testWallet, "madeUpFolderName", testKeys[i]), "keyDoesNotExist(4) failed");
}
// open
wallet = Wallet::openWallet(testWallet, 0, Wallet::Synchronous);
QVERIFY2(wallet != nullptr, "openWallet failed");
QVERIFY2(Wallet::isOpen(testWallet), "openWallet succeeded but the wallet !isOpen (2)");
// set folder
QVERIFY2(wallet->hasFolder(testFolder), "The wallet do not have testFolder!");
wallet->setFolder(testFolder);
QVERIFY2(wallet->currentFolder() == testFolder, "Failed to set current folder");
// test for key - opened wallet
for (int i = 0; i < numTests; i++) {
QVERIFY2(!Wallet::keyDoesNotExist(testWallet, testFolder, testKeys[i]), "keyDoesNotExist(1) failed");
QVERIFY2(Wallet::keyDoesNotExist(testWallet, testFolder, "madeUpKey"), "keyDoesNotExist(2) failed");
QVERIFY2(Wallet::keyDoesNotExist(testWallet, "madeUpFolderName", "madeUpKey"), "keyDoesNotExist(3) failed");
QVERIFY2(Wallet::keyDoesNotExist(testWallet, "madeUpFolderName", testKeys[i]), "keyDoesNotExist(4) failed");
}
// read many keys
for (int i = 0; i < numTests; i++) {
QByteArray readEntry;
wallet->readEntry(testKeys[i], readEntry);
QVERIFY2(readEntry == testValues[i], "Test value after read many keys failed!");
}
// delete folder
wallet->removeFolder(testFolder);
QVERIFY2(!wallet->hasFolder(testFolder), "Failed to delete the testFolder");
// close
Wallet::closeWallet(QStringLiteral("kdewallet"), true);
QVERIFY2(!Wallet::isOpen("kdewallet"), "Failed to close wallet");
}
QTEST_GUILESS_MAIN(KWalletTest)
#include "moc_kwallettest.cpp"
@@ -0,0 +1,23 @@
/*
This file is part of the KDE Libraries
SPDX-FileCopyrightText: 2007 Thomas McGuire <thomas.mcguire@gmx.net>
SPDX-License-Identifier: LGPL-2.0-or-later
*/
#ifndef KWALLETTEST_H
#define KWALLETTEST_H
#include <QObject>
class KWalletTest : public QObject
{
Q_OBJECT
public:
private Q_SLOTS:
void init();
void testWallet();
};
#endif
@@ -0,0 +1,77 @@
include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/../../src/api/KWallet ) # for kwallet.h
include_directories( ${CMAKE_CURRENT_BINARY_DIR}/../../src/api/KWallet )
include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/../../src/runtime/kwalletd ) # kwalletwizard.h
include_directories( ${CMAKE_CURRENT_BINARY_DIR}/../../src/runtime/kwalletd/backend ) # kwalletwizard.h
include(ECMMarkAsTest)
find_package(Qt6 ${REQUIRED_QT_VERSION} CONFIG REQUIRED Test)
find_package(KF6CoreAddons ${KF_DEP_VERSION} REQUIRED)
find_package(KF6I18n ${KF_DEP_VERSION} REQUIRED)
find_package(KF6WidgetsAddons ${KF_DEP_VERSION} REQUIRED)
find_package(Gpgmepp) # provided by GpgME
remove_definitions(-DQT_NO_CAST_FROM_ASCII)
remove_definitions(-DQT_NO_CAST_FROM_BYTEARRAY)
add_executable(kwalletwizardtest)
set(kwalletwizardtest_ui_SRCS)
qt_wrap_ui(kwalletwizardtest_ui_SRCS
../../src/runtime/kwalletd/kbetterthankdialogbase.ui
../../src/runtime/kwalletd/kwalletwizardpageexplanation.ui
../../src/runtime/kwalletd/kwalletwizardpageintro.ui
../../src/runtime/kwalletd/kwalletwizardpageoptions.ui
../../src/runtime/kwalletd/kwalletwizardpagepassword.ui
../../src/runtime/kwalletd/kwalletwizardpagegpgkey.ui
)
if (Gpgmepp_FOUND)
qt_wrap_ui(kwalletwizardtest_ui_SRCS
../../src/runtime/kwalletd/kwalletwizardpagepasswordgpg.ui)
endif(Gpgmepp_FOUND)
target_sources(kwalletwizardtest PRIVATE
kwalletwizardtest.cpp
../../src/runtime/kwalletd/kwalletwizard.cpp
${kwalletwizardtest_ui_SRCS}
)
ecm_mark_as_test(kwalletwizardtest)
target_link_libraries(kwalletwizardtest
KF6Wallet
Qt6::Test
KF6::CoreAddons
KF6::I18n
KF6::WidgetsAddons)
if (Gpgmepp_FOUND)
target_link_libraries(kwalletwizardtest Gpgmepp)
endif(Gpgmepp_FOUND)
add_library(kwallettestlib STATIC kwallettest.cpp)
target_link_libraries(kwallettestlib KF6Wallet Qt6::Widgets)
macro(kwalletd_tests)
foreach(_testname ${ARGN})
add_executable(${_testname} ${_testname}.cpp)
ecm_mark_as_test(${_testname})
target_link_libraries(${_testname}
kwallettestlib
KF6WalletBackend
KF6Wallet
Qt6::DBus
Qt6::Test
KF6::CoreAddons
KF6::I18n)
endforeach(_testname)
endmacro()
kwalletd_tests(
kwalletasync
kwalletsync
kwalletpath
kwalletboth
kwalletmany
kwalletcbc
)
@@ -0,0 +1,5 @@
Tests for opening the wallet synchronously and asynchronously
kwalletsync - open synchronously
kwalletasync - open asynchronously
kwalletboth - start opening asynchronously, then, during the async call, open synchronously
@@ -0,0 +1,12 @@
TESTS TO BE DONE
================
* Test the autoclose function
It should setup a timer whose duration is longer than the autoclose delay
configured in kwalletd. After that delay, it should test the wallet
really autoclosed in kwalletd. For the test to work, kwalletd should be
configured to do aucoclose and the timeout should be set to be shorter
that the delay hard-coded in the test.
@@ -0,0 +1,59 @@
#include "kwalletasync.h"
#include <QApplication>
#include <QTest>
#include <QTextStream>
#include <QTimer>
#include <KAboutData>
#include <QDBusConnection>
#include <QDBusConnectionInterface>
#include <kwallet.h>
#include "kwallettest.h"
static QTextStream _out(stdout, QIODevice::WriteOnly);
void KWalletAsyncTest::init()
{
if (!qEnvironmentVariableIsSet("DISPLAY")) {
QSKIP("$DISPLAY is not set. These tests cannot be done without a graphical system.");
}
}
void KWalletAsyncTest::openWallet()
{
_out << "About to ask for wallet async\n";
// we have no wallet: ask for one.
KWallet::Wallet *wallet = KWallet::Wallet::openWallet(KWallet::Wallet::NetworkWallet(), 0, KWallet::Wallet::Asynchronous);
QVERIFY(wallet != nullptr);
WalletReceiver r;
QVERIFY(connect(wallet, &KWallet::Wallet::walletOpened, &r, &WalletReceiver::walletOpened));
_out << "About to start 30 second event loop\n";
QTimer::singleShot(30000, qApp, SLOT(quit()));
int ret = qApp->exec();
if (ret == 0) {
_out << "Timed out!\n";
} else {
_out << "Success!\n";
}
_out.flush();
QVERIFY2(ret == 1, "Timeout when waiting for wallet open");
}
void WalletReceiver::walletOpened(bool got)
{
_out << "Got async wallet: " << got << '\n';
_out.flush();
qApp->exit(1);
}
QTEST_GUILESS_MAIN(KWalletAsyncTest)
#include "moc_kwalletasync.cpp"
@@ -0,0 +1,23 @@
/*
This file is part of the KDE Libraries
SPDX-FileCopyrightText: 2014 Valentin Rusu <kde@rusu.info>
SPDX-License-Identifier: LGPL-2.0-or-later
*/
#ifndef KWALLETASYNC_H
#define KWALLETASYNC_H
#include <QObject>
class KWalletAsyncTest : public QObject
{
Q_OBJECT
public:
private Q_SLOTS:
void init();
void openWallet();
};
#endif // KWALLETASYNC_H
@@ -0,0 +1,83 @@
#include "kwalletboth.h"
#include <QApplication>
#include <QMap>
#include <QTest>
#include <QTextStream>
#include <QTimer>
#include <KAboutData>
#include <QDBusConnection>
#include <QDBusConnectionInterface>
#include <kwallet.h>
#include "kwallettest.h"
static QTextStream _out(stdout, QIODevice::WriteOnly);
void KWalletBothTest::init()
{
if (!qEnvironmentVariableIsSet("DISPLAY")) {
QSKIP("$DISPLAY is not set. These tests cannot be done without a graphical system.");
}
}
void KWalletBothTest::openWallet()
{
_out << "About to ask for wallet async\n";
// we have no wallet: ask for one.
KWallet::Wallet *wallet = KWallet::Wallet::openWallet(KWallet::Wallet::NetworkWallet(), 0, KWallet::Wallet::Asynchronous);
QVERIFY(wallet != nullptr);
WalletReceiver r;
connect(wallet, &KWallet::Wallet::walletOpened, &r, &WalletReceiver::walletOpened);
_out << "About to ask for wallet sync\n";
wallet = KWallet::Wallet::openWallet(KWallet::Wallet::NetworkWallet(), 0, KWallet::Wallet::Synchronous);
QVERIFY(wallet != nullptr);
_out << "Got sync wallet: " << (wallet != nullptr) << '\n';
_out << "About to start 30 second event loop\n";
QTimer::singleShot(30000, qApp, SLOT(quit()));
int ret = qApp->exec();
if (ret == 0) {
_out << "Timed out!\n";
} else {
_out << "Success!\n";
}
bool success = false;
QMap<QString, QString> p;
p = wallet->passwordList(&success);
_out << "passwordList returned: " << success << '\n';
_out << "passwordList returned " << p.keys().count() << " entries\n";
QMap<QString, QMap<QString, QString>> q;
q = wallet->mapList(&success);
_out << "mapList returned: " << success << '\n';
_out << "mapList returned " << q.keys().count() << " entries\n";
QMap<QString, QByteArray> s;
s = wallet->entriesList(&success);
_out << "entryList returned: " << success << '\n';
_out << "entryList returned " << s.keys().count() << " entries\n";
_out.flush();
delete wallet;
}
void WalletReceiver::walletOpened(bool got)
{
_out << "Got async wallet: " << got << '\n';
_out.flush();
qApp->exit(1);
}
QTEST_GUILESS_MAIN(KWalletBothTest)
#include "moc_kwalletboth.cpp"
@@ -0,0 +1,23 @@
/*
This file is part of the KDE Libraries
SPDX-FileCopyrightText: 2014 Valentin Rusu <kde@rusu.info>
SPDX-License-Identifier: LGPL-2.0-or-later
*/
#ifndef KWALLETBOTH_H
#define KWALLETBOTH_H
#include <QObject>
class KWalletBothTest : public QObject
{
Q_OBJECT
public:
private Q_SLOTS:
void init();
void openWallet();
};
#endif // KWALLETBOTH_H
@@ -0,0 +1,60 @@
/*
This file is part of the KDE Libraries
SPDX-FileCopyrightText: 2015 Valentin Rusu <kde@rusu.info>
SPDX-License-Identifier: LGPL-2.0-or-later
*/
#include "kwalletcbc.h"
#include <QTest>
#include <backend/blowfish.h>
#include <backend/cbc.h>
void KWalletCBCTest::encryptDecryptOneBlock()
{
BlockCipher *bf;
char data[] = "OneBlock";
char key[] = "testkey";
bf = new BlowFish();
bf->setKey((void *)key, 7 * 8);
QVERIFY(bf->readyToGo());
QVERIFY(8 == bf->encrypt((void *)data, 8));
delete bf;
bf = new BlowFish();
bf->setKey((void *)key, 7 * 8);
QVERIFY(8 == bf->decrypt((void *)data, 8));
QVERIFY(strcmp(data, "OneBlock") == 0);
delete bf;
}
void KWalletCBCTest::encryptDecryptMultiblock()
{
BlockCipher *bf;
char data[] = "This is a test.";
char key[] = "testkey";
bf = new BlowFish();
bf->setKey((void *)key, 7 * 8);
QVERIFY(bf->readyToGo());
QVERIFY(16 == bf->encrypt((void *)data, 16));
delete bf;
bf = new BlowFish();
bf->setKey((void *)key, 7 * 8);
QVERIFY(16 == bf->decrypt((void *)data, 16));
QVERIFY(strcmp(data, "This is a test.") == 0);
delete bf;
}
QTEST_GUILESS_MAIN(KWalletCBCTest)
#include "moc_kwalletcbc.cpp"
@@ -0,0 +1,22 @@
/*
This file is part of the KDE Libraries
SPDX-FileCopyrightText: 2015 Valentin Rusu <kde@rusu.info>
SPDX-License-Identifier: LGPL-2.0-or-later
*/
#ifndef KWALLETCBC_H
#define KWALLETCBC_H
#include <QObject>
class KWalletCBCTest : public QObject
{
Q_OBJECT
public:
private Q_SLOTS:
void encryptDecryptOneBlock();
void encryptDecryptMultiblock();
};
#endif // KWALLETCBC_H
@@ -0,0 +1,71 @@
/*
This file is part of the KDE libraries
SPDX-FileCopyrightText: 2008 Michael Leupold <lemma@confuego.org>
SPDX-License-Identifier: LGPL-2.0-or-later
*/
#include "kwalletmany.h"
#include <QApplication>
#include <QTest>
#include <QTextStream>
#include <QThread>
#include <kwallet.h>
#define NUMWALLETS 10
using namespace KWallet;
static QTextStream _out(stdout, QIODevice::WriteOnly);
KWalletMany::KWalletMany()
: QObject()
, _pending(10)
{
}
KWalletMany::~KWalletMany()
{
}
void KWalletMany::init()
{
if (!qEnvironmentVariableIsSet("DISPLAY")) {
QSKIP("$DISPLAY is not set. These tests cannot be done without a graphical system.");
}
}
void KWalletMany::walletOpened(bool open)
{
_out << "Got async wallet: " << (open) << '\n';
_out.flush();
--_pending;
}
void KWalletMany::openWallet()
{
// open plenty of wallets in synchronous and asynchronous mode
for (int i = 0; i < NUMWALLETS; ++i) {
// request asynchronous wallet
_out << "About to ask for wallet async" << '\n';
Wallet *wallet;
wallet = Wallet::openWallet(Wallet::NetworkWallet(), 0, Wallet::Asynchronous);
QVERIFY(wallet != nullptr);
connect(wallet, &KWallet::Wallet::walletOpened, this, &KWalletMany::walletOpened);
_wallets.append(wallet);
}
_out.flush();
// wait for 30s to receive the wallet opened replies from kwalletd
QTRY_VERIFY_WITH_TIMEOUT(_pending == 0, 30000);
while (!_wallets.isEmpty()) {
delete _wallets.takeFirst();
}
QApplication::quit();
}
QTEST_GUILESS_MAIN(KWalletMany)
#include "moc_kwalletmany.cpp"
@@ -0,0 +1,39 @@
/*
This file is part of the KDE libraries
SPDX-FileCopyrightText: 2008 Michael Leupold <lemma@confuego.org>
SPDX-License-Identifier: LGPL-2.0-or-later
*/
#ifndef KWALLETMANY_H
#define KWALLETMANY_H
#include <QList>
#include <QObject>
namespace KWallet
{
class Wallet;
}
class KWalletMany : public QObject
{
Q_OBJECT
public:
KWalletMany();
~KWalletMany() override;
public Q_SLOTS:
void walletOpened(bool open);
private Q_SLOTS:
void init();
void openWallet();
private:
QList<KWallet::Wallet *> _wallets;
int _pending;
};
#endif // KWALLETMANY_H
@@ -0,0 +1,38 @@
#include "kwalletpath.h"
#include <QTest>
#include <QTextStream>
#include <KAboutData>
#include <QDBusConnection>
#include <QDBusConnectionInterface>
#include <kwallet.h>
static QTextStream _out(stdout, QIODevice::WriteOnly);
void KWalletPathTest::init()
{
if (!qEnvironmentVariableIsSet("DISPLAY")) {
QSKIP("$DISPLAY is not set. These tests cannot be done without a graphical system.");
}
}
void KWalletPathTest::openWallet()
{
_out << "About to ask for wallet /tmp/test.kwl sync\n";
KWallet::Wallet *wallet = KWallet::Wallet::openWallet(QStringLiteral("/tmp/test.kwl"), 0, KWallet::Wallet::Path);
QVERIFY(wallet != nullptr);
_out << "Got path wallet: " << (wallet != nullptr) << '\n';
if (wallet) {
_out << "Closing wallet\n";
delete wallet;
}
_out.flush();
}
QTEST_GUILESS_MAIN(KWalletPathTest)
#include "moc_kwalletpath.cpp"
@@ -0,0 +1,23 @@
/*
This file is part of the KDE Libraries
SPDX-FileCopyrightText: 2014 Valentin Rusu <kde@rusu.info>
SPDX-License-Identifier: LGPL-2.0-or-later
*/
#ifndef KWALLETPATH_H
#define KWALLETPATH_H
#include <QObject>
class KWalletPathTest : public QObject
{
Q_OBJECT
public:
private Q_SLOTS:
void init();
void openWallet();
};
#endif // KWALLETPATH_H
@@ -0,0 +1,33 @@
#include "kwalletsync.h"
#include <QTest>
#include <QTextStream>
#include <KAboutData>
#include <QDBusConnection>
#include <QDBusConnectionInterface>
#include <kwallet.h>
static QTextStream _out(stdout, QIODevice::WriteOnly);
void KWalletSyncTest::init()
{
if (!qEnvironmentVariableIsSet("DISPLAY")) {
QSKIP("$DISPLAY is not set. These tests cannot be done without a graphical system.");
}
}
void KWalletSyncTest::openWallet()
{
_out << "About to ask for wallet sync\n";
KWallet::Wallet *w = KWallet::Wallet::openWallet(KWallet::Wallet::NetworkWallet(), 0, KWallet::Wallet::Synchronous);
QVERIFY(w != nullptr);
_out << "Got sync wallet: " << (w != nullptr) << '\n';
_out.flush();
}
QTEST_GUILESS_MAIN(KWalletSyncTest)
#include "moc_kwalletsync.cpp"
@@ -0,0 +1,23 @@
/*
This file is part of the KDE Libraries
SPDX-FileCopyrightText: 2014 Valentin Rusu <kde@rusu.info>
SPDX-License-Identifier: LGPL-2.0-or-later
*/
#ifndef KWALLETSYNC_H
#define KWALLETSYNC_H
#include <QObject>
class KWalletSyncTest : public QObject
{
Q_OBJECT
public:
private Q_SLOTS:
void init();
void openWallet();
};
#endif // KWALLETSYNC_H
@@ -0,0 +1,3 @@
#include "kwallettest.h"
#include "moc_kwallettest.cpp"
@@ -0,0 +1,18 @@
#ifndef KWALLETTEST_H
#define KWALLETTEST_H
#include <QObject>
namespace KWallet
{
class Wallet;
}
class WalletReceiver : public QObject
{
Q_OBJECT
public Q_SLOTS:
void walletOpened(bool);
};
#endif // KWALLETTEST_H
@@ -0,0 +1,21 @@
/*
SPDX-FileCopyrightText: 2007 Pino Toscano <pino@kde.org>
SPDX-License-Identifier: LGPL-2.0-or-later
*/
#include <QApplication>
#include <kwalletwizard.h>
int main(int argc, char **argv)
{
QApplication app(argc, argv);
KWalletWizard wizard;
wizard.show();
int ret = app.exec();
return ret;
}