From 881e4c1f4bd25ba53d6d718bab2470731524548b Mon Sep 17 00:00:00 2001 From: Calugar George Date: Tue, 23 May 2023 11:41:03 +0300 Subject: [PATCH 01/15] Test add of qml module suport --- CMakeLists.txt | 24 +++- keychain.h | 16 ++- translations/qtkeychain_de.ts | 237 ++++++++++++++++++++++++++------- translations/qtkeychain_fr.ts | 155 +++++++++++++++------- translations/qtkeychain_ro.ts | 241 +++++++++++++++++++++++++++------- translations/qtkeychain_ru.ts | 87 ++++++++++-- translations/qtkeychain_zh.ts | 241 +++++++++++++++++++++++++++------- 7 files changed, 812 insertions(+), 189 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index c25a968..09e770f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,7 +7,7 @@ project(qtkeychain VERSION ${QTKEYCHAIN_VERSION} LANGUAGES CXX) # Enable C++11 SET(CMAKE_CXX_STANDARD 11) - +SET(CMAKE_AUTOMOC ON) include(FindPkgConfig) ### @@ -21,6 +21,7 @@ include(ECMGeneratePriFile) include(CMakeDependentOption) option(BUILD_WITH_QT6 "Build qtkeychain with Qt 6" OFF) +option(QTKEYCHAIN_BUILD_WITH_QML "Build qtkeychain with Qt 6 and QML module support" OFF) option(BUILD_TEST_APPLICATION "Build test application" OFF) option(BUILD_TRANSLATIONS "Build translations" ON) option(BUILD_SHARED_LIBS "Build dynamic library" ON) @@ -92,6 +93,9 @@ if (Qt5Core_FOUND AND NOT BUILD_WITH_QT6) include_directories(${Qt5Core_INCLUDE_DIRS}) else() find_package(Qt6 COMPONENTS Core REQUIRED) + if(QTKEYCHAIN_BUILD_WITH_QML) + find_package(Qt6 COMPONENTS QML REQUIRED) + endif() set(QTKEYCHAIN_VERSION_INFIX 6) @@ -201,7 +205,23 @@ set(qtkeychain_TR_FILES ) set(QTKEYCHAIN_TARGET_NAME qt${QTKEYCHAIN_VERSION_INFIX}keychain) -add_library(${QTKEYCHAIN_TARGET_NAME} ${qtkeychain_SOURCES} ${qtkeychain_MOC_OUTFILES} ${qtkeychain_QM_FILES}) + +add_library(${QTKEYCHAIN_TARGET_NAME}) + +if (QTKEYCHAIN_BUILD_WITH_QML) + qt_policy(SET QTP0001 OLD) + qt_add_qml_module(${QTKEYCHAIN_TARGET_NAME} + URI "QtKeychain" + VERSION ${QTKEYCHAIN_VERSION} + OUTPUT_DIRECTORY QtKeychain + ) + target_compile_definitions(${QTKEYCHAIN_TARGET_NAME} PRIVATE BUILD_WITH_QML=ON) + target_link_libraries(${QTKEYCHAIN_TARGET_NAME} PUBLIC + Qt6::Qml + ) +else() +endif() +target_sources(${QTKEYCHAIN_TARGET_NAME} PRIVATE ${qtkeychain_SOURCES} ${qtkeychain_MOC_OUTFILES} ${qtkeychain_QM_FILES}) if(WIN32) set_target_properties( ${QTKEYCHAIN_TARGET_NAME} PROPERTIES DEBUG_POSTFIX "d" ) endif() diff --git a/keychain.h b/keychain.h index 47dbece..e1eb672 100644 --- a/keychain.h +++ b/keychain.h @@ -18,6 +18,10 @@ #include #include +//#ifdef BUILD_WITH_QML +#include +//#endif + class QSettings; #define QTKEYCHAIN_VERSION 0x000100 @@ -46,6 +50,8 @@ class JobPrivate; */ class QKEYCHAIN_EXPORT Job : public QObject { Q_OBJECT + Q_PROPERTY(QString key READ key WRITE setKey) + Q_PROPERTY(Error error READ error) public: ~Job() override; @@ -179,6 +185,9 @@ class ReadPasswordJobPrivate; */ class QKEYCHAIN_EXPORT ReadPasswordJob : public Job { Q_OBJECT +// #ifdef BUILD_WITH_QML + QML_NAMED_ELEMENT(ReadPasswordJob) +// #endif public: /** * Create a new ReadPasswordJob. @@ -192,7 +201,7 @@ class QKEYCHAIN_EXPORT ReadPasswordJob : public Job { * @return The binary data stored as value of this job's key(). * @see Job::key() */ - QByteArray binaryData() const; + Q_INVOKABLE QByteArray binaryData() const; /** * @return The string stored as value of this job's key(). @@ -200,7 +209,7 @@ class QKEYCHAIN_EXPORT ReadPasswordJob : public Job { * @warning Returns meaningless data if the data was stored as binary data. * @see WritePasswordJob::setTextData() */ - QString textData() const; + Q_INVOKABLE QString textData() const; private: friend class QKeychain::ReadPasswordJobPrivate; @@ -216,6 +225,9 @@ class WritePasswordJobPrivate; */ class QKEYCHAIN_EXPORT WritePasswordJob : public Job { Q_OBJECT + #ifdef BUILD_WITH_QML + QML_NAMED_ELEMENT(WritePasswordJob) + #endif public: /** * Create a new WritePasswordJob. diff --git a/translations/qtkeychain_de.ts b/translations/qtkeychain_de.ts index 6610c0a..53e0981 100644 --- a/translations/qtkeychain_de.ts +++ b/translations/qtkeychain_de.ts @@ -1,176 +1,325 @@ - + + + QKeychain::DeletePasswordJobPrivate + + + Password entry not found + + + + + Could not decrypt data + Kann Daten nicht entschlüsseln + + + + + Unknown error + Unbekannter Fehler + + + + Could not open wallet: %1; %2 + Konnte Brieftasche nicht öffnen: %1; %2 + + + + Password not found + Passwort nicht gefunden + + + + Could not open keystore + + + + + Could not remove private key from keystore + + + + + QKeychain::JobPrivate + + + Unknown error + Unbekannter Fehler + + + + Access to keychain denied + Zugriff auf Schlüsselbund verweigert + + + + QKeychain::PlainTextStore + + + Could not store data in settings: access error + + + + + Could not store data in settings: format error + + + + + Could not delete data from settings: access error + + + + + Could not delete data from settings: format error + + + + + Entry not found + Eintrag nicht gefunden + + QKeychain::ReadPasswordJobPrivate - + + Unknown error Unbekannter Fehler - + D-Bus is not running - + No keychain service available Kein Schlüsselbund-Dienst verfügbar - + Could not open wallet: %1; %2 Konnte Brieftasche nicht öffnen: %1; %2 - + Access to keychain denied Zugriff auf Schlüsselbund verweigert - + Could not determine data type: %1; %2 Datentyp kann nicht ermittelt werden: %1: %2 - + Unsupported entry type 'Map' - + Unknown kwallet entry type '%1' - Could not read password: %1; %2 - Passwort konnte nicht ausgelesen werden: %1; %2 + Passwort konnte nicht ausgelesen werden: %1; %2 - + Password not found Passwort nicht gefunden - - + + Entry not found Eintrag nicht gefunden - + + Password entry not found + + + + + Could not decrypt data Kann Daten nicht entschlüsseln + + + Could not open keystore + + + + + Could not retrieve private key from keystore + + + + + Could not create decryption cipher + + QKeychain::WritePasswordJobPrivate - - + + Unknown error Unbekannter Fehler - + D-Bus is not running - - + Could not open wallet: %1; %2 Konnte Brieftasche nicht öffnen: %1; %2 - Access to keychain denied - Zugriff auf Schlüsselbund verweigert + Zugriff auf Schlüsselbund verweigert - Could not delete encrypted data from settings: access error - Kann verschlüsselte Daten nicht aus den Einstellungen entfernen: Zugriffsfehler + Kann verschlüsselte Daten nicht aus den Einstellungen entfernen: Zugriffsfehler - Could not delete encrypted data from settings: format error - Kann verschlüsselte Daten nicht aus den Einstellungen entfernen: Formatfehler + Kann verschlüsselte Daten nicht aus den Einstellungen entfernen: Formatfehler + + + + Credential size exceeds maximum size of %1 + + + + + Credential key exceeds maximum size of %1 + + + + + Writing credentials failed: Win32 error code %1 + - + Encryption failed Verschlüsselung fehlgeschlagen - Could not store encrypted data in settings: access error - Kann verschlüsselte Daten nicht in den Einstellungen speichern: Zugriffsfehler + Kann verschlüsselte Daten nicht in den Einstellungen speichern: Zugriffsfehler - Could not store encrypted data in settings: format error - Kann verschlüsselte Daten nicht in den Einstellungen speichern: Formatfehler + Kann verschlüsselte Daten nicht in den Einstellungen speichern: Formatfehler + + + + Password not found + Passwort nicht gefunden + + + + Could not open keystore + + + + + Could not create private key generator + + + + + Could not generate new private key + + + + + Could not retrieve private key from keystore + + + + + Could not create encryption cipher + + + + + Could not encrypt data + QObject - + Access to keychain denied Zugriff auf Schlüsselbund verweigert - + No keyring daemon Kein Schlüsselbund-Dienst - + Already unlocked Bereits entsperrt - + No such keyring Kein solcher Schlüsselbund - + Bad arguments Ungültige Argumente - + I/O error Ein-/Ausgabe-Fehler - + Cancelled Abgebrochen - + Keyring already exists Schlüsselbund existiert bereits - + No match Kein Treffer - + Unknown error Unbekannter Fehler - - - %1 (OSStatus %2) + + Entry not found + Eintrag nicht gefunden + + + + error 0x%1: %2 diff --git a/translations/qtkeychain_fr.ts b/translations/qtkeychain_fr.ts index 35c60b9..5829a8f 100644 --- a/translations/qtkeychain_fr.ts +++ b/translations/qtkeychain_fr.ts @@ -4,41 +4,51 @@ QKeychain::DeletePasswordJobPrivate - + Password entry not found Mot de passe introuvable - + Could not decrypt data Impossible de déchiffrer les données - - + + Unknown error Erreur inconnue - + Could not open wallet: %1; %2 Impossible d'ouvrir le portefeuille : %1; %2 - + Password not found Mot de passe introuvable + + + Could not open keystore + + + + + Could not remove private key from keystore + + QKeychain::JobPrivate - + Unknown error Erreur inconnue - + Access to keychain denied Accès au trousseau refusé @@ -74,43 +84,43 @@ QKeychain::ReadPasswordJobPrivate - - + + Unknown error Erreur inconnue - + D-Bus is not running D-Bus n'est pas en cours d'exécution - + No keychain service available Aucun service de trousseau disponible - + Could not open wallet: %1; %2 Impossible d'ouvrir le trousseau : %1; %2 - + Access to keychain denied Accès au trousseau refusé - + Could not determine data type: %1; %2 Impossible de déterminer le type de données : %1: %2 - + Unsupported entry type 'Map' Type d'entrée non supporté 'Map' - + Unknown kwallet entry type '%1' Type de trousseau inconnu '%1' @@ -119,13 +129,13 @@ Impossible de lire le mot de passe : %1; %2 - - + Password not found Mot de passe introuvable - + + Entry not found Entrée introuvable @@ -136,26 +146,41 @@ - + Could not decrypt data Impossible de déchiffrer les données + + + Could not open keystore + + + + + Could not retrieve private key from keystore + + + + + Could not create decryption cipher + + QKeychain::WritePasswordJobPrivate - - + + Unknown error Erreur inconnue - + D-Bus is not running D-Bus n'est pas en cours d'exécution - + Could not open wallet: %1; %2 Impossible d'ouvrir le trousseau : %1; %2 @@ -172,8 +197,22 @@ Impossible de supprimer des données chiffrées dans les paramètres : Erreur de format - - + + Credential size exceeds maximum size of %1 + + + + + Credential key exceeds maximum size of %1 + + + + + Writing credentials failed: Win32 error code %1 + + + + Encryption failed Le chiffrement a échoué @@ -186,80 +225,108 @@ Impossible de stocker des données chiffrées dans les paramètres : Erreur de format - + Password not found Mot de passe introuvable + + + Could not open keystore + + + + + Could not create private key generator + + + + + Could not generate new private key + + + + + Could not retrieve private key from keystore + + + + + Could not create encryption cipher + + + + + Could not encrypt data + + QObject - + Access to keychain denied Accès au trousseau refusé - + No keyring daemon Aucun démon de trousseau - + Already unlocked Déjà déverrouillé - + No such keyring Aucun trousseau - + Bad arguments Mauvais arguments - + I/O error Erreur d'E/S - + Cancelled Annulé - + Keyring already exists Trousseau déjà existant - + No match Aucune correspondance - + Unknown error Erreur inconnue - OS X Keychain error (OSStatus %1) - OS X Keychain error (OSStatus %1) + OS X Keychain error (OSStatus %1) - %1 (OSStatus %2) - %1 (OSStatus %2) + %1 (OSStatus %2) - + Entry not found Entrée introuvable - + error 0x%1: %2 Erreur 0x%1 : %2 diff --git a/translations/qtkeychain_ro.ts b/translations/qtkeychain_ro.ts index 337f1aa..872f8da 100644 --- a/translations/qtkeychain_ro.ts +++ b/translations/qtkeychain_ro.ts @@ -1,178 +1,331 @@ - + + + QKeychain::DeletePasswordJobPrivate + + + Password entry not found + + + + + Could not decrypt data + Nu se poate decripta data + + + + + Unknown error + Eroare necunoscută + + + + Could not open wallet: %1; %2 + Nu se poate deschide portofelul: %1; %2 + + + + Password not found + Parola nu a fost găsită + + + + Could not open keystore + + + + + Could not remove private key from keystore + + + + + QKeychain::JobPrivate + + + Unknown error + Eroare necunoscută + + + + Access to keychain denied + Acces interzis la serviciul de chei + + + + QKeychain::PlainTextStore + + + Could not store data in settings: access error + + + + + Could not store data in settings: format error + + + + + Could not delete data from settings: access error + + + + + Could not delete data from settings: format error + + + + + Entry not found + Înregistrarea nu a fost găsită + + QKeychain::ReadPasswordJobPrivate - + + Unknown error Eroare necunoscută - + D-Bus is not running D-Bus nu rulează - + No keychain service available Nu există niciun serviciu de chei disponibil Kein Schlüsselbund-Dienst verfügbar - + Could not open wallet: %1; %2 Nu se poate deschide portofelul: %1; %2 - + Access to keychain denied Acces interzis la serviciul de chei - + Could not determine data type: %1; %2 Nu se poate stabili tipul de date: %1: %2 - + Unsupported entry type 'Map' Tip de înregistrare nesuportat 'Map' - + Unknown kwallet entry type '%1' Tip de înregistrare kwallet necunoscut '%1' - Could not read password: %1; %2 - Nu se poate citi parola: %1; %2 + Nu se poate citi parola: %1; %2 - + Password not found Parola nu a fost găsită - - + + Entry not found Înregistrarea nu a fost găsită - + + Password entry not found + + + + + Could not decrypt data Nu se poate decripta data + + + Could not open keystore + + + + + Could not retrieve private key from keystore + + + + + Could not create decryption cipher + + QKeychain::WritePasswordJobPrivate - - + + Unknown error Eroare necunoscută - + D-Bus is not running D-Bus nu rulează - - + Could not open wallet: %1; %2 Nu se poate deschide portofelul: %1; %2 - Access to keychain denied - Acces interzis la serviciul de chei + Acces interzis la serviciul de chei - Could not delete encrypted data from settings: access error - Nu se pot șterge datele criptate din setări: eroare de acces + Nu se pot șterge datele criptate din setări: eroare de acces - Could not delete encrypted data from settings: format error - Nu se pot șterge datele criptate din setări: eroare de format + Nu se pot șterge datele criptate din setări: eroare de format + + + + Credential size exceeds maximum size of %1 + - + + Credential key exceeds maximum size of %1 + + + + + Writing credentials failed: Win32 error code %1 + + + + Encryption failed Criptarea a eșuat - Could not store encrypted data in settings: access error - Nu se pot stoca datele criptate în setări: eroare de acces + Nu se pot stoca datele criptate în setări: eroare de acces - Could not store encrypted data in settings: format error - Nu se pot stoca datele criptate în setări: eroare de format + Nu se pot stoca datele criptate în setări: eroare de format + + + + Password not found + Parola nu a fost găsită + + + + Could not open keystore + + + + + Could not create private key generator + + + + + Could not generate new private key + + + + + Could not retrieve private key from keystore + + + + + Could not create encryption cipher + + + + + Could not encrypt data + QObject - + Access to keychain denied Acces interzis la serviciul de chei - + No keyring daemon Niciun demon pentru inelul de chei - + Already unlocked Deja deblocat - + No such keyring Nu există astfel de inel de chei - + Bad arguments Argumente greșite - + I/O error Eroare de I/E - + Cancelled Anulat - + Keyring already exists Inelul de chei deja există - + No match Nicio potrivire - + Unknown error Eroare necunoscută - - %1 (OSStatus %2) - %1 (OSStatus %2) + %1 (OSStatus %2) + + + + Entry not found + Înregistrarea nu a fost găsită + + + + error 0x%1: %2 + diff --git a/translations/qtkeychain_ru.ts b/translations/qtkeychain_ru.ts index 1d61129..e17f659 100644 --- a/translations/qtkeychain_ru.ts +++ b/translations/qtkeychain_ru.ts @@ -4,13 +4,13 @@ QKeychain::DeletePasswordJobPrivate - - + + Unknown error Неизвестная ошибка - + Could not open wallet: %1; %2 Не удалось открыть бумажник: %1; %2 @@ -24,6 +24,21 @@ Could not decrypt data Не удалось расшифровать данные + + + Password not found + Пароль не найден + + + + Could not open keystore + + + + + Could not remove private key from keystore + + QKeychain::JobPrivate @@ -69,7 +84,7 @@ QKeychain::ReadPasswordJobPrivate - + Password not found Пароль не найден @@ -106,6 +121,7 @@ + Entry not found Запись не найдена @@ -130,6 +146,21 @@ Could not decrypt data Не удалось расшифровать данные + + + Could not open keystore + + + + + Could not retrieve private key from keystore + + + + + Could not create decryption cipher + + QKeychain::WritePasswordJobPrivate @@ -169,18 +200,51 @@ Encryption failed Шифрование не удалось + + + Password not found + Пароль не найден + + + + Could not open keystore + + + + + Could not create private key generator + + + + + Could not generate new private key + + + + + Could not retrieve private key from keystore + + + + + Could not create encryption cipher + + + + + Could not encrypt data + + QObject - OS X Keychain error (OSStatus %1) - Ошибка связки ключей OS X (OSStatus %1) + Ошибка связки ключей OS X (OSStatus %1) - %1 (OSStatus %2) - %1 (OSStatus %2) + %1 (OSStatus %2) @@ -233,9 +297,14 @@ Неизвестная ошибка - + Entry not found Запись не найдена + + + error 0x%1: %2 + + diff --git a/translations/qtkeychain_zh.ts b/translations/qtkeychain_zh.ts index 1e22eca..742c1ad 100644 --- a/translations/qtkeychain_zh.ts +++ b/translations/qtkeychain_zh.ts @@ -1,177 +1,330 @@ - + + + QKeychain::DeletePasswordJobPrivate + + + Password entry not found + + + + + Could not decrypt data + 無法解密資料 + + + + + Unknown error + 未知的錯誤 + + + + Could not open wallet: %1; %2 + 無法開啟錢包:%1; %2 + + + + Password not found + 找不到密碼 + + + + Could not open keystore + + + + + Could not remove private key from keystore + + + + + QKeychain::JobPrivate + + + Unknown error + 未知的錯誤 + + + + Access to keychain denied + 鑰匙圈存取被拒絕 + + + + QKeychain::PlainTextStore + + + Could not store data in settings: access error + + + + + Could not store data in settings: format error + + + + + Could not delete data from settings: access error + + + + + Could not delete data from settings: format error + + + + + Entry not found + 找不到項目 + + QKeychain::ReadPasswordJobPrivate - + + Unknown error 未知的錯誤 - + D-Bus is not running D-Bus 不在執行中 - + No keychain service available 沒有可用的鑰匙圈服務 - + Could not open wallet: %1; %2 無法開啟錢包:%1; %2 - + Access to keychain denied 鑰匙圈存取被拒絕 - + Could not determine data type: %1; %2 無法判斷資料型別:%1; %2 - + Unsupported entry type 'Map' 不支援的項目類型 'Map' - + Unknown kwallet entry type '%1' 未知的 kwallet 項目類型 '%1' - Could not read password: %1; %2 - 無法讀取密碼:%1; %2 + 無法讀取密碼:%1; %2 - + Password not found 找不到密碼 - - + + Entry not found 找不到項目 - + + Password entry not found + + + + + Could not decrypt data 無法解密資料 + + + Could not open keystore + + + + + Could not retrieve private key from keystore + + + + + Could not create decryption cipher + + QKeychain::WritePasswordJobPrivate - - + + Unknown error 未知的錯誤 - + D-Bus is not running D-Bus 不在執行中 - - + Could not open wallet: %1; %2 無法開啟錢包:%1; %2 - Access to keychain denied - 鑰匙圈存取被拒絕 + 鑰匙圈存取被拒絕 - Could not delete encrypted data from settings: access error - 無法從設定刪除加密資料:存取錯誤 + 無法從設定刪除加密資料:存取錯誤 - Could not delete encrypted data from settings: format error - 無法從設定刪除加密資料:格式錯誤 + 無法從設定刪除加密資料:格式錯誤 + + + + Credential size exceeds maximum size of %1 + - + + Credential key exceeds maximum size of %1 + + + + + Writing credentials failed: Win32 error code %1 + + + + Encryption failed 加密失敗 - Could not store encrypted data in settings: access error - 無法將加密資料儲存至設定:存取錯誤 + 無法將加密資料儲存至設定:存取錯誤 - Could not store encrypted data in settings: format error - 無法將加密資料儲存至設定:格式錯誤 + 無法將加密資料儲存至設定:格式錯誤 + + + + Password not found + 找不到密碼 + + + + Could not open keystore + + + + + Could not create private key generator + + + + + Could not generate new private key + + + + + Could not retrieve private key from keystore + + + + + Could not create encryption cipher + + + + + Could not encrypt data + QObject - + Access to keychain denied 鑰匙圈存取被拒絕 - + No keyring daemon 沒有可用的鑰匙圈背景程式 - + Already unlocked 已解鎖 - + No such keyring 鑰匙圈不存在 - + Bad arguments 引數錯誤 - + I/O error I/O 錯誤 - + Cancelled 已取消 - + Keyring already exists 鑰匙圈已存在 - + No match 無相符項目 - + Unknown error 未知的錯誤 - - %1 (OSStatus %2) - %1 (OSStatus %2) + %1 (OSStatus %2) + + + + Entry not found + 找不到項目 + + + + error 0x%1: %2 + From a840d649a6e7c23ab791f14ade7fed3276e6781c Mon Sep 17 00:00:00 2001 From: Calugar George Date: Tue, 23 May 2023 12:00:05 +0300 Subject: [PATCH 02/15] Add automoc and remove manual cpp moc directive from cmake --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 09e770f..e81edf3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -194,7 +194,7 @@ if(ANDROID) list(APPEND qtkeychain_LIBRARIES_PRIVATE ${QTANDROIDEXTRAS_LIBRARIES} ) endif() -QT_WRAP_CPP(qtkeychain_MOC_OUTFILES keychain.h keychain_p.h gnomekeyring_p.h) +#QT_WRAP_CPP(qtkeychain_MOC_OUTFILES keychain.h keychain_p.h gnomekeyring_p.h) set(qtkeychain_TR_FILES translations/qtkeychain_de.ts From ab559299c4ee8a14ae9b6262bae0ce1cf029eb4f Mon Sep 17 00:00:00 2001 From: Calugar George Date: Tue, 23 May 2023 12:19:54 +0300 Subject: [PATCH 03/15] Make readn and write password creatable from QML --- keychain.h | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/keychain.h b/keychain.h index e1eb672..efe115e 100644 --- a/keychain.h +++ b/keychain.h @@ -194,7 +194,12 @@ class QKEYCHAIN_EXPORT ReadPasswordJob : public Job { * @param service The service string used by this job (can be empty). * @param parent The parent of this job. */ - explicit ReadPasswordJob( const QString& service, QObject* parent=nullptr ); + #ifdef BUILD_WITH_QML + //make objecte creatabble from QML - Just to make sure original code will not broke + explicit ReadPasswordJob( const QString& service="", QObject* parent=nullptr ); + #else + explicit ReadPasswordJob( const QString& service, QObject* parent=nullptr ); + #endif ~ReadPasswordJob() override; /** @@ -234,7 +239,12 @@ class QKEYCHAIN_EXPORT WritePasswordJob : public Job { * @param service The service string used by this job (can be empty). * @param parent The parent of this job. */ - explicit WritePasswordJob( const QString& service, QObject* parent=nullptr ); + #ifdef BUILD_WITH_QML + //make objecte creatabble from QML - Just to make sure original code will not broke + explicit WritePasswordJob(const QString& service="", QObject* parent=nullptr ); + #else + explicit WritePasswordJob( const QString& service, QObject* parent=nullptr ); + #endif ~WritePasswordJob() override; /** From 0429e70e370d6ab1b574bc9bf932234a27760b2b Mon Sep 17 00:00:00 2001 From: Calugar George Date: Tue, 23 May 2023 13:21:34 +0300 Subject: [PATCH 04/15] Improve qml support allowing adding service name --- keychain.cpp | 5 +++++ keychain.h | 6 +++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/keychain.cpp b/keychain.cpp index 90ee4eb..86f3af5 100644 --- a/keychain.cpp +++ b/keychain.cpp @@ -233,3 +233,8 @@ WritePasswordJobPrivate::WritePasswordJobPrivate(const QString &service_, WriteP JobPrivate(service_, qq) { } + +void Job::setService(const QString &newService) +{ + d->service = newService; +} diff --git a/keychain.h b/keychain.h index efe115e..a07dc6d 100644 --- a/keychain.h +++ b/keychain.h @@ -50,8 +50,10 @@ class JobPrivate; */ class QKEYCHAIN_EXPORT Job : public QObject { Q_OBJECT + Q_PROPERTY(QString service READ service WRITE setService) Q_PROPERTY(QString key READ key WRITE setKey) Q_PROPERTY(Error error READ error) + public: ~Job() override; @@ -92,7 +94,7 @@ class QKEYCHAIN_EXPORT Job : public QObject { * * @see finished() */ - void start(); + Q_INVOKABLE void start(); QString service() const; @@ -147,6 +149,8 @@ class QKEYCHAIN_EXPORT Job : public QObject { void emitFinished(); void emitFinishedWithError(Error, const QString& errorString); + void setService(const QString &newService); + Q_SIGNALS: /** * Emitted when this job is finished. From 5a89b4b4ea79d2b7b1063517e6b377fdb489dbfb Mon Sep 17 00:00:00 2001 From: Calugar George Date: Tue, 23 May 2023 13:52:42 +0300 Subject: [PATCH 05/15] Add also setTextData setBinaryData as invokable to allow qml access --- keychain.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/keychain.h b/keychain.h index a07dc6d..e4269f4 100644 --- a/keychain.h +++ b/keychain.h @@ -107,7 +107,7 @@ class QKEYCHAIN_EXPORT Job : public QObject { /** * @return An error message that might provide details if error() returns OtherError. */ - QString errorString() const; + Q_INVOKABLE QString errorString() const; /** * @return Whether this job autodeletes itself once finished() has been emitted. Default is true. @@ -255,14 +255,14 @@ class QKEYCHAIN_EXPORT WritePasswordJob : public Job { * Set the @p data that the job will store in the keychain as binary data. * @warning setBinaryData() and setTextData() are mutually exclusive. */ - void setBinaryData( const QByteArray& data ); + Q_INVOKABLE void setBinaryData( const QByteArray& data ); /** * Set the @p data that the job will store in the keychain as string. * Typically @p data is a password. * @warning setBinaryData() and setTextData() are mutually exclusive. */ - void setTextData( const QString& data ); + Q_INVOKABLE void setTextData( const QString& data ); private: From 8da8c3fb28467760a40d4572db21c7852751ee98 Mon Sep 17 00:00:00 2001 From: Calugar George Date: Tue, 23 May 2023 13:58:59 +0300 Subject: [PATCH 06/15] Update readme --- ReadMe.md | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/ReadMe.md b/ReadMe.md index cf0a2e1..28f5d4a 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -27,3 +27,45 @@ License ------- QtKeychain is available under the [Modified BSD License](http://www.gnu.org/licenses/license-list.html#ModifiedBSD). See the file COPYING for details. + + +**New:** +========== +Added QML support on Qt6 using cmake +To activate set the qt6 and qml flags + +```CMAKE +-DBUILD_WITH_QT6=ON -DQTKEYCHAIN_BUILD_WITH_QML=ON +``` + +```QML +import QtKeychain 1.0 +``` + +```QML +WritePasswordJob{ + id: storeJobObject + service: "" + onFinished: { + console.debug("Store password complete") + } + } + ReadPasswordJob{ + id: readJobObject + service: "" + + } +``` + +```javascript +storeJobObject.key = "username"; +storeJobObject.setTextData("password"); +storeJobObject.start(); + +readJobObject.key = "username" +readJobObject.finished.connect(function (returnedPassword){ + console.debug("Password is: "+returnedPassword.textData()) +}) +readJobObject.start(); + +``` \ No newline at end of file From 20952955496ae9154e86307979263cc37e9114f0 Mon Sep 17 00:00:00 2001 From: Volker Krause Date: Fri, 26 May 2023 16:23:19 +0200 Subject: [PATCH 07/15] Protect against creating the QtKeychain::QtKeychain alias target twice This can happen if a dependency CMake config module is itself also looking for QtKeychain, which then results in a fatal CMake error. Observed between NeoChat and libQuotient. --- QtKeychainConfig.cmake.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/QtKeychainConfig.cmake.in b/QtKeychainConfig.cmake.in index 7addba9..ead0005 100644 --- a/QtKeychainConfig.cmake.in +++ b/QtKeychainConfig.cmake.in @@ -21,7 +21,7 @@ endif() set(QTKEYCHAIN_LIBRARIES "@QTKEYCHAIN_TARGET_NAME@") get_target_property(QTKEYCHAIN_INCLUDE_DIRS "@QTKEYCHAIN_TARGET_NAME@" INTERFACE_INCLUDE_DIRECTORIES) -if (CMAKE_VERSION VERSION_GREATER_EQUAL 3.18.0) +if (CMAKE_VERSION VERSION_GREATER_EQUAL 3.18.0 AND NOT TARGET Qt@QTKEYCHAIN_VERSION_INFIX@Keychain::Qt@QTKEYCHAIN_VERSION_INFIX@Keychain) add_library(Qt@QTKEYCHAIN_VERSION_INFIX@Keychain::Qt@QTKEYCHAIN_VERSION_INFIX@Keychain ALIAS qt@QTKEYCHAIN_VERSION_INFIX@keychain) endif() From 269eacf1074d13eb2a4124beab8d754938e7db02 Mon Sep 17 00:00:00 2001 From: Volker Krause Date: Fri, 26 May 2023 17:13:06 +0200 Subject: [PATCH 08/15] Export QKeychain::isAvailable() to make it usable in a shared build Also, the definitions needs to be fully qualified, otherwise this is producing symbols in the top-level namespace instead. --- keychain.h | 2 +- keychain_android.cpp | 2 +- keychain_apple.mm | 2 +- keychain_haiku.cpp | 2 +- keychain_unix.cpp | 2 +- keychain_win.cpp | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/keychain.h b/keychain.h index 47dbece..8c006cb 100644 --- a/keychain.h +++ b/keychain.h @@ -275,7 +275,7 @@ class QKEYCHAIN_EXPORT DeletePasswordJob : public Job { * * @since 0.14.0 */ -bool isAvailable(); +QKEYCHAIN_EXPORT bool isAvailable(); } // namespace QtKeychain diff --git a/keychain_android.cpp b/keychain_android.cpp index 903c73e..8cea484 100644 --- a/keychain_android.cpp +++ b/keychain_android.cpp @@ -189,7 +189,7 @@ void DeletePasswordJobPrivate::scheduledStart() q->emitFinished(); } -bool isAvailable() +bool QKeychain::isAvailable() { return true; } diff --git a/keychain_apple.mm b/keychain_apple.mm index 4830110..f9a8266 100644 --- a/keychain_apple.mm +++ b/keychain_apple.mm @@ -257,7 +257,7 @@ static void StartDeletePassword(const QString &service, const QString &key, Appl StartDeletePassword(service, key, interface); } -bool isAvailable() +bool QKeychain::isAvailable() { return true; } diff --git a/keychain_haiku.cpp b/keychain_haiku.cpp index 58f15e6..16abe1c 100644 --- a/keychain_haiku.cpp +++ b/keychain_haiku.cpp @@ -186,7 +186,7 @@ void DeletePasswordJobPrivate::scheduledStart() q->emitFinishedWithError( error, errorString ); } -bool isAvailable() +bool QKeychain::isAvailable() { return true; } diff --git a/keychain_unix.cpp b/keychain_unix.cpp index 0a9a8ad..d60cb77 100644 --- a/keychain_unix.cpp +++ b/keychain_unix.cpp @@ -589,7 +589,7 @@ void DeletePasswordJobPrivate::fallbackOnError(const QDBusError &err) { q->emitFinished(); } -bool isAvailable() +bool QKeychain::isAvailable() { return LibSecretKeyring::isAvailable() || GnomeKeyring::isAvailable() || isKwallet5Available(); } diff --git a/keychain_win.cpp b/keychain_win.cpp index b967c08..98dd34c 100644 --- a/keychain_win.cpp +++ b/keychain_win.cpp @@ -187,7 +187,7 @@ void DeletePasswordJobPrivate::scheduledStart() { } #endif -bool isAvailable() +bool QKeychain::isAvailable() { return true; } From 69f993c47efed7e557d79a30a367014d9a27d809 Mon Sep 17 00:00:00 2001 From: Frank Osterfeld Date: Thu, 1 Jun 2023 13:38:35 +0200 Subject: [PATCH 09/15] Prepare 0.14.1 --- CMakeLists.txt | 2 +- ChangeLog | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index c25a968..1ab9f88 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 3.16) -set(QTKEYCHAIN_VERSION 0.14.0) +set(QTKEYCHAIN_VERSION 0.14.1) set(QTKEYCHAIN_SOVERSION 1) project(qtkeychain VERSION ${QTKEYCHAIN_VERSION} LANGUAGES CXX) diff --git a/ChangeLog b/ChangeLog index 7852f2a..cb383c5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,11 @@ ChangeLog ========= +version 0.14.1 (release 2023-06-01) + + - Export QKeychain::isAvailable() to make it usable in a shared build (Volker Krause ) + - Protect against creating the QtKeychain::QtKeychain alias target twice (Volker Krause ) + version 0.14.0 (release 2023-05-12) - Add Qt 6 Android support (Igor Bugaev ) From bcefcf839f27f8cf797a50234b9af7ae81e4fd1e Mon Sep 17 00:00:00 2001 From: Calugar George Date: Wed, 27 Sep 2023 18:59:21 +0300 Subject: [PATCH 10/15] Mino t changes --- CMakeLists.txt | 4 +- keychain.cpp | 10 +++ keychain.h | 124 +++++++++++++++++++--------------- translations/qtkeychain_ru.ts | 87 +++--------------------- 4 files changed, 89 insertions(+), 136 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e81edf3..a0e99ef 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -194,8 +194,6 @@ if(ANDROID) list(APPEND qtkeychain_LIBRARIES_PRIVATE ${QTANDROIDEXTRAS_LIBRARIES} ) endif() -#QT_WRAP_CPP(qtkeychain_MOC_OUTFILES keychain.h keychain_p.h gnomekeyring_p.h) - set(qtkeychain_TR_FILES translations/qtkeychain_de.ts translations/qtkeychain_fr.ts @@ -212,7 +210,7 @@ if (QTKEYCHAIN_BUILD_WITH_QML) qt_policy(SET QTP0001 OLD) qt_add_qml_module(${QTKEYCHAIN_TARGET_NAME} URI "QtKeychain" - VERSION ${QTKEYCHAIN_VERSION} + VERSION "${CMAKE_PROJECT_VERSION_MAJOR}.${CMAKE_PROJECT_VERSION_MINOR}" OUTPUT_DIRECTORY QtKeychain ) target_compile_definitions(${QTKEYCHAIN_TARGET_NAME} PRIVATE BUILD_WITH_QML=ON) diff --git a/keychain.cpp b/keychain.cpp index 86f3af5..c51b954 100644 --- a/keychain.cpp +++ b/keychain.cpp @@ -238,3 +238,13 @@ void Job::setService(const QString &newService) { d->service = newService; } + +const QByteArray &WritePasswordJob::binaryData() const +{ + return d->data; +} + +const QString &WritePasswordJob::textData() const +{ + return QString(d->data); +} diff --git a/keychain.h b/keychain.h index e4269f4..56764fb 100644 --- a/keychain.h +++ b/keychain.h @@ -18,9 +18,9 @@ #include #include -//#ifdef BUILD_WITH_QML +#ifdef BUILD_WITH_QML #include -//#endif +#endif class QSettings; @@ -71,30 +71,6 @@ class QKEYCHAIN_EXPORT Job : public QObject { */ void setSettings( QSettings* settings ); - /** - * Call this method to start the job. - * Typically you want to connect some slot to the finished() signal first: - * - * \code - * SomeClass::startJob() - * { - * connect(job, &Job::finished, this, &SomeClass::slotJobFinished); - * job->start(); - * } - * - * SomeClass::slotJobFinished(Job *job) - * { - * if (job->error()) { - * // handle error - * } else { - * // do job-specific stuff - * } - * } - * \endcode - * - * @see finished() - */ - Q_INVOKABLE void start(); QString service() const; @@ -104,10 +80,7 @@ class QKEYCHAIN_EXPORT Job : public QObject { */ Error error() const; - /** - * @return An error message that might provide details if error() returns OtherError. - */ - Q_INVOKABLE QString errorString() const; + /** * @return Whether this job autodeletes itself once finished() has been emitted. Default is true. @@ -151,6 +124,37 @@ class QKEYCHAIN_EXPORT Job : public QObject { void setService(const QString &newService); +public Q_SLOTS: + /** + * @return An error message that might provide details if error() returns OtherError. + */ + QString errorString() const; + + /** + * Call this method to start the job. + * Typically you want to connect some slot to the finished() signal first: + * + * \code + * SomeClass::startJob() + * { + * connect(job, &Job::finished, this, &SomeClass::slotJobFinished); + * job->start(); + * } + * + * SomeClass::slotJobFinished(Job *job) + * { + * if (job->error()) { + * // handle error + * } else { + * // do job-specific stuff + * } + * } + * \endcode + * + * @see finished() + */ + void start(); + Q_SIGNALS: /** * Emitted when this job is finished. @@ -161,7 +165,9 @@ class QKEYCHAIN_EXPORT Job : public QObject { protected: explicit Job( JobPrivate *q, QObject* parent=nullptr ); - Q_INVOKABLE void doStart(); + +public Q_SLOTS: + void doStart(); private: void setError( Error error ); @@ -172,11 +178,11 @@ class QKEYCHAIN_EXPORT Job : public QObject { protected: JobPrivate* const d; -friend class JobExecutor; -friend class JobPrivate; -friend class ReadPasswordJobPrivate; -friend class WritePasswordJobPrivate; -friend class DeletePasswordJobPrivate; + friend class JobExecutor; + friend class JobPrivate; + friend class ReadPasswordJobPrivate; + friend class WritePasswordJobPrivate; + friend class DeletePasswordJobPrivate; }; class ReadPasswordJobPrivate; @@ -189,23 +195,24 @@ class ReadPasswordJobPrivate; */ class QKEYCHAIN_EXPORT ReadPasswordJob : public Job { Q_OBJECT -// #ifdef BUILD_WITH_QML +#ifdef BUILD_WITH_QML QML_NAMED_ELEMENT(ReadPasswordJob) -// #endif +#endif public: - /** +/** * Create a new ReadPasswordJob. * @param service The service string used by this job (can be empty). * @param parent The parent of this job. */ - #ifdef BUILD_WITH_QML +#ifdef BUILD_WITH_QML //make objecte creatabble from QML - Just to make sure original code will not broke - explicit ReadPasswordJob( const QString& service="", QObject* parent=nullptr ); - #else - explicit ReadPasswordJob( const QString& service, QObject* parent=nullptr ); - #endif + explicit ReadPasswordJob( const QString& service="", QObject* parent=nullptr ); +#else + explicit ReadPasswordJob( const QString& service, QObject* parent=nullptr ); +#endif ~ReadPasswordJob() override; +public Q_SLOTS: /** * @return The binary data stored as value of this job's key(). * @see Job::key() @@ -234,35 +241,42 @@ class WritePasswordJobPrivate; */ class QKEYCHAIN_EXPORT WritePasswordJob : public Job { Q_OBJECT - #ifdef BUILD_WITH_QML - QML_NAMED_ELEMENT(WritePasswordJob) - #endif +#ifdef BUILD_WITH_QML + QML_NAMED_ELEMENT(WritePasswordJob) +#endif + Q_PROPERTY(const QByteArray& binaryData READ binaryData WRITE setBinaryData NOTIFY binaryDataChanged) + Q_PROPERTY(const QString& textData READ textData WRITE setTextData NOTIFY textDataChanged) public: /** * Create a new WritePasswordJob. * @param service The service string used by this job (can be empty). * @param parent The parent of this job. */ - #ifdef BUILD_WITH_QML - //make objecte creatabble from QML - Just to make sure original code will not broke - explicit WritePasswordJob(const QString& service="", QObject* parent=nullptr ); - #else - explicit WritePasswordJob( const QString& service, QObject* parent=nullptr ); - #endif + + explicit WritePasswordJob( const QString& service="", QObject* parent=nullptr ); + ~WritePasswordJob() override; /** * Set the @p data that the job will store in the keychain as binary data. * @warning setBinaryData() and setTextData() are mutually exclusive. */ - Q_INVOKABLE void setBinaryData( const QByteArray& data ); + void setBinaryData( const QByteArray& data ); /** * Set the @p data that the job will store in the keychain as string. * Typically @p data is a password. * @warning setBinaryData() and setTextData() are mutually exclusive. */ - Q_INVOKABLE void setTextData( const QString& data ); + void setTextData( const QString& data ); + + const QByteArray &binaryData() const; + + const QString &textData() const; + +signals: + void binaryDataChanged(); + void textDataChanged(); private: diff --git a/translations/qtkeychain_ru.ts b/translations/qtkeychain_ru.ts index e17f659..1d61129 100644 --- a/translations/qtkeychain_ru.ts +++ b/translations/qtkeychain_ru.ts @@ -4,13 +4,13 @@ QKeychain::DeletePasswordJobPrivate - - + + Unknown error Неизвестная ошибка - + Could not open wallet: %1; %2 Не удалось открыть бумажник: %1; %2 @@ -24,21 +24,6 @@ Could not decrypt data Не удалось расшифровать данные - - - Password not found - Пароль не найден - - - - Could not open keystore - - - - - Could not remove private key from keystore - - QKeychain::JobPrivate @@ -84,7 +69,7 @@ QKeychain::ReadPasswordJobPrivate - + Password not found Пароль не найден @@ -121,7 +106,6 @@ - Entry not found Запись не найдена @@ -146,21 +130,6 @@ Could not decrypt data Не удалось расшифровать данные - - - Could not open keystore - - - - - Could not retrieve private key from keystore - - - - - Could not create decryption cipher - - QKeychain::WritePasswordJobPrivate @@ -200,51 +169,18 @@ Encryption failed Шифрование не удалось - - - Password not found - Пароль не найден - - - - Could not open keystore - - - - - Could not create private key generator - - - - - Could not generate new private key - - - - - Could not retrieve private key from keystore - - - - - Could not create encryption cipher - - - - - Could not encrypt data - - QObject + OS X Keychain error (OSStatus %1) - Ошибка связки ключей OS X (OSStatus %1) + Ошибка связки ключей OS X (OSStatus %1) + %1 (OSStatus %2) - %1 (OSStatus %2) + %1 (OSStatus %2) @@ -297,14 +233,9 @@ Неизвестная ошибка - + Entry not found Запись не найдена - - - error 0x%1: %2 - - From 8c094de77b206980d8a34f06a9ab17ce033ffa40 Mon Sep 17 00:00:00 2001 From: Calugar George Date: Wed, 27 Sep 2023 19:09:34 +0300 Subject: [PATCH 11/15] Minor build fix at import --- CMakeLists.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f6a033c..458af3b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -334,10 +334,10 @@ ecm_generate_pri_file(BASE_NAME Qt${QTKEYCHAIN_VERSION_INFIX}Keychain install(FILES ${pri_filename} DESTINATION ${ECM_MKSPECS_INSTALL_DIR}) - -install(EXPORT Qt${QTKEYCHAIN_VERSION_INFIX}KeychainLibraryDepends - DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/Qt${QTKEYCHAIN_VERSION_INFIX}Keychain" -) +#INFO Removed to build on mac.... +#install(EXPORT Qt${QTKEYCHAIN_VERSION_INFIX}KeychainLibraryDepends +# DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/Qt${QTKEYCHAIN_VERSION_INFIX}Keychain" +#) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/Qt${QTKEYCHAIN_VERSION_INFIX}KeychainConfig.cmake ${CMAKE_CURRENT_BINARY_DIR}/Qt${QTKEYCHAIN_VERSION_INFIX}KeychainConfigVersion.cmake From a4cb3713ef2e36b1905cf5900ab8d2b5bcf6f369 Mon Sep 17 00:00:00 2001 From: Calugar George Date: Wed, 24 Jul 2024 23:16:24 +0300 Subject: [PATCH 12/15] Merge with iniitial library implementation --- CMakeLists.txt | 127 ++---------------- ChangeLog | 8 ++ qtkeychain.pri | 4 +- qtkeychain/CMakeLists.txt | 118 ++++++++++++++++ .../androidkeystore.cpp | 0 .../androidkeystore_p.h | 0 .../gnomekeyring.cpp | 0 .../gnomekeyring_p.h | 0 keychain.cpp => qtkeychain/keychain.cpp | 0 keychain.h => qtkeychain/keychain.h | 0 .../keychain_android.cpp | 4 +- .../keychain_apple.mm | 0 .../keychain_haiku.cpp | 0 keychain_p.h => qtkeychain/keychain_p.h | 0 .../keychain_unix.cpp | 66 +++++++-- .../keychain_win.cpp | 21 +-- libsecret.cpp => qtkeychain/libsecret.cpp | 0 libsecret_p.h => qtkeychain/libsecret_p.h | 0 .../org.kde.KWallet.xml | 0 .../plaintextstore.cpp | 0 .../plaintextstore_p.h | 0 testclient.cpp | 2 +- translations/qtkeychain_ru.ts | 87 ++++++++++-- 23 files changed, 280 insertions(+), 157 deletions(-) create mode 100644 qtkeychain/CMakeLists.txt rename androidkeystore.cpp => qtkeychain/androidkeystore.cpp (100%) rename androidkeystore_p.h => qtkeychain/androidkeystore_p.h (100%) rename gnomekeyring.cpp => qtkeychain/gnomekeyring.cpp (100%) rename gnomekeyring_p.h => qtkeychain/gnomekeyring_p.h (100%) rename keychain.cpp => qtkeychain/keychain.cpp (100%) rename keychain.h => qtkeychain/keychain.h (100%) rename keychain_android.cpp => qtkeychain/keychain_android.cpp (97%) rename keychain_apple.mm => qtkeychain/keychain_apple.mm (100%) rename keychain_haiku.cpp => qtkeychain/keychain_haiku.cpp (100%) rename keychain_p.h => qtkeychain/keychain_p.h (100%) rename keychain_unix.cpp => qtkeychain/keychain_unix.cpp (89%) rename keychain_win.cpp => qtkeychain/keychain_win.cpp (91%) rename libsecret.cpp => qtkeychain/libsecret.cpp (100%) rename libsecret_p.h => qtkeychain/libsecret_p.h (100%) rename org.kde.KWallet.xml => qtkeychain/org.kde.KWallet.xml (100%) rename plaintextstore.cpp => qtkeychain/plaintextstore.cpp (100%) rename plaintextstore_p.h => qtkeychain/plaintextstore_p.h (100%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 458af3b..14941cc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 3.16) -set(QTKEYCHAIN_VERSION 0.14.1) +set(QTKEYCHAIN_VERSION 0.14.99) set(QTKEYCHAIN_SOVERSION 1) project(qtkeychain VERSION ${QTKEYCHAIN_VERSION} LANGUAGES CXX) @@ -12,7 +12,7 @@ include(FindPkgConfig) ### -set(CMAKE_MODULE_PATH "${CMAKE_MODULE_PATH}" "${PROJECT_SOURCE_DIR}/cmake/Modules") +list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake/Modules") include(GNUInstallDirs) include(GenerateExportHeader) include(CMakePackageConfigHelpers) @@ -125,86 +125,13 @@ else() set(QTCORE_LIBRARIES ${Qt6Core_LIBRARIES}) endif() - -include_directories(${CMAKE_CURRENT_BINARY_DIR}) - -list(APPEND qtkeychain_LIBRARIES ${QTCORE_LIBRARIES}) -set(qtkeychain_SOURCES - keychain.cpp - qkeychain_export.h - keychain.h -) - -if(CMAKE_CXX_COMPILER_ID MATCHES "MSVC") - # CMake < 3.15 sneaks in /W# flags for us, so we need a replacement, - # or we'll get a warning (cf. CMP0092) - if (CMAKE_CXX_FLAGS MATCHES "/W[0-4]") - string(REGEX REPLACE "/W[0-4]" "/W4" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") - else() - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4") - endif() -else() - # MSVC's STL / Qt headers are not MSVC -Wall clean, so don't enable it there - add_definitions( -Wall -Werror=return-type ) -endif() - -if(WIN32) - list(APPEND qtkeychain_SOURCES keychain_win.cpp) - if (NOT USE_CREDENTIAL_STORE) - list(APPEND qtkeychain_LIBRARIES crypt32) - list(APPEND qtkeychain_SOURCES plaintextstore.cpp) - endif() - #FIXME: mingw bug; otherwise getting undefined refs to RtlSecureZeroMemory there - if(MINGW) - add_definitions( -O2 ) - endif() -endif() - -if(APPLE) - list(APPEND qtkeychain_SOURCES keychain_apple.mm) - list(APPEND qtkeychain_LIBRARIES "-framework Foundation" "-framework Security") -endif() - -if(HAIKU) - list(APPEND qtkeychain_SOURCES keychain_haiku.cpp) - - find_library(BE_LIBRARY be REQUIRED) - list(APPEND qtkeychain_LIBRARIES ${BE_LIBRARY}) -endif() - -if(UNIX AND NOT APPLE AND NOT ANDROID AND NOT HAIKU) - option(LIBSECRET_SUPPORT "Build with libsecret support" ON) - - if(LIBSECRET_SUPPORT) - pkg_check_modules(LIBSECRET REQUIRED libsecret-1) - add_definitions(-DHAVE_LIBSECRET=1) - INCLUDE_DIRECTORIES(${LIBSECRET_INCLUDE_DIRS}) - LINK_DIRECTORIES(${LIBSECRET_LIBRARY_DIRS}) - list(APPEND qtkeychain_LIBRARIES_PRIVATE ${LIBSECRET_LIBRARIES}) - endif() - - add_definitions(-DKEYCHAIN_DBUS=1) - list(APPEND qtkeychain_SOURCES keychain_unix.cpp gnomekeyring.cpp libsecret.cpp plaintextstore.cpp) - qt_add_dbus_interface(qtkeychain_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/org.kde.KWallet.xml kwallet_interface KWalletInterface) - list(APPEND qtkeychain_LIBRARIES ${QTDBUS_LIBRARIES} ) -endif() - -if(ANDROID) - list(APPEND qtkeychain_SOURCES keychain_android.cpp androidkeystore.cpp plaintextstore.cpp) - list(APPEND qtkeychain_LIBRARIES_PRIVATE ${QTANDROIDEXTRAS_LIBRARIES} ) -endif() - -set(qtkeychain_TR_FILES - translations/qtkeychain_de.ts - translations/qtkeychain_fr.ts - translations/qtkeychain_ro.ts - translations/qtkeychain_ru.ts - translations/qtkeychain_zh.ts -) - set(QTKEYCHAIN_TARGET_NAME qt${QTKEYCHAIN_VERSION_INFIX}keychain) -add_library(${QTKEYCHAIN_TARGET_NAME}) +add_subdirectory(qtkeychain) + +### +### Translations +### if (QTKEYCHAIN_BUILD_WITH_QML) qt_policy(SET QTP0001 OLD) @@ -220,11 +147,8 @@ if (QTKEYCHAIN_BUILD_WITH_QML) else() endif() target_sources(${QTKEYCHAIN_TARGET_NAME} PRIVATE ${qtkeychain_SOURCES} ${qtkeychain_MOC_OUTFILES} ${qtkeychain_QM_FILES}) -if(WIN32) - set_target_properties( ${QTKEYCHAIN_TARGET_NAME} PROPERTIES DEBUG_POSTFIX "d" ) -endif() -file(GLOB qtkeychain_TR_SOURCES *.cpp *.h *.ui) +file(GLOB qtkeychain_TR_SOURCES qtkeychain/*.cpp qtkeychain/*.h qtkeychain/*.ui) if ( BUILD_TRANSLATIONS ) qt_create_translation(qtkeychain_MESSAGES ${qtkeychain_TR_SOURCES} ${qtkeychain_TR_FILES}) qt_add_translation(qtkeychain_QM_FILES ${qtkeychain_TR_FILES}) @@ -257,39 +181,10 @@ if ( BUILD_TRANSLATIONS ) endif() endif( BUILD_TRANSLATIONS ) -target_link_libraries(${QTKEYCHAIN_TARGET_NAME} PUBLIC ${qtkeychain_LIBRARIES} PRIVATE ${qtkeychain_LIBRARIES_PRIVATE}) -if(NOT INTERFACE_INCLUDE_SUFFIX) - set(INTERFACE_INCLUDE_SUFFIX include) -endif() -target_include_directories(${QTKEYCHAIN_TARGET_NAME} PUBLIC $) -generate_export_header(${QTKEYCHAIN_TARGET_NAME} - EXPORT_FILE_NAME qkeychain_export.h - EXPORT_MACRO_NAME QKEYCHAIN_EXPORT -) - -set_target_properties(${QTKEYCHAIN_TARGET_NAME} PROPERTIES - VERSION ${QTKEYCHAIN_VERSION} - SOVERSION ${QTKEYCHAIN_SOVERSION} - INSTALL_RPATH_USE_LINK_PATH TRUE -) - -if (NOT APPLE) - set_target_properties(${QTKEYCHAIN_TARGET_NAME} PROPERTIES - INSTALL_NAME_DIR "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}" - ) -endif() - -install(FILES keychain.h ${CMAKE_CURRENT_BINARY_DIR}/qkeychain_export.h - DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/qt${QTKEYCHAIN_VERSION_INFIX}keychain/ -) - -install(TARGETS ${QTKEYCHAIN_TARGET_NAME} - EXPORT Qt${QTKEYCHAIN_VERSION_INFIX}KeychainLibraryDepends - RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} - ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} -) +### +### Test application ("testclient") +### if(BUILD_TEST_APPLICATION) set( testclient_LIBRARIES ${QTKEYCHAIN_TARGET_NAME} ) diff --git a/ChangeLog b/ChangeLog index cb383c5..cf294c3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,14 @@ ChangeLog ========= +version 0.14.3 (release 2024-05-03) + + - Fix Android build for Qt 6.7 (Volker Krause ) + +version 0.14.2 (release 2023-12-17) + + - Add support for KWallet 6 (Volker Krause ) + version 0.14.1 (release 2023-06-01) - Export QKeychain::isAvailable() to make it usable in a shared build (Volker Krause ) diff --git a/qtkeychain.pri b/qtkeychain.pri index 5877641..4dc56d1 100644 --- a/qtkeychain.pri +++ b/qtkeychain.pri @@ -6,7 +6,7 @@ lessThan(QT_MAJOR_VERSION, 5) { error("qtkeychain requires Qt 5 or later") } -QTKEYCHAIN_PWD = $$PWD +QTKEYCHAIN_PWD = $$PWD/qtkeychain CONFIG += depend_includepath DEFINES += QTKEYCHAIN_NO_EXPORT @@ -43,7 +43,7 @@ unix:!android:!macx:!ios { # Generate D-Bus interface: DEFINES += KEYCHAIN_DBUS QT += dbus - kwallet_interface.files = $$PWD/org.kde.KWallet.xml + kwallet_interface.files = $$QTKEYCHAIN_PWD/org.kde.KWallet.xml DBUS_INTERFACES += kwallet_interface HEADERS += \ diff --git a/qtkeychain/CMakeLists.txt b/qtkeychain/CMakeLists.txt new file mode 100644 index 0000000..f9e28ce --- /dev/null +++ b/qtkeychain/CMakeLists.txt @@ -0,0 +1,118 @@ + +list(APPEND qtkeychain_LIBRARIES ${QTCORE_LIBRARIES}) +set(qtkeychain_SOURCES + keychain.cpp + qkeychain_export.h + keychain.h +) + +if(CMAKE_CXX_COMPILER_ID MATCHES "MSVC") + # CMake < 3.15 sneaks in /W# flags for us, so we need a replacement, + # or we'll get a warning (cf. CMP0092) + if (CMAKE_CXX_FLAGS MATCHES "/W[0-4]") + string(REGEX REPLACE "/W[0-4]" "/W4" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") + else() + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4") + endif() +else() + # MSVC's STL / Qt headers are not MSVC -Wall clean, so don't enable it there + add_definitions( -Wall -Werror=return-type ) +endif() + +if(WIN32) + list(APPEND qtkeychain_SOURCES keychain_win.cpp) + if (NOT USE_CREDENTIAL_STORE) + list(APPEND qtkeychain_LIBRARIES crypt32) + list(APPEND qtkeychain_SOURCES plaintextstore.cpp) + endif() + #FIXME: mingw bug; otherwise getting undefined refs to RtlSecureZeroMemory there + if(MINGW) + add_definitions( -O2 ) + endif() +endif() + +if(APPLE) + list(APPEND qtkeychain_SOURCES keychain_apple.mm) + list(APPEND qtkeychain_LIBRARIES "-framework Foundation" "-framework Security") +endif() + +if(HAIKU) + list(APPEND qtkeychain_SOURCES keychain_haiku.cpp) + + find_library(BE_LIBRARY be REQUIRED) + list(APPEND qtkeychain_LIBRARIES ${BE_LIBRARY}) +endif() + +if(UNIX AND NOT APPLE AND NOT ANDROID AND NOT HAIKU) + option(LIBSECRET_SUPPORT "Build with libsecret support" ON) + + if(LIBSECRET_SUPPORT) + pkg_check_modules(LIBSECRET REQUIRED libsecret-1) + add_definitions(-DHAVE_LIBSECRET=1) + INCLUDE_DIRECTORIES(${LIBSECRET_INCLUDE_DIRS}) + LINK_DIRECTORIES(${LIBSECRET_LIBRARY_DIRS}) + list(APPEND qtkeychain_LIBRARIES_PRIVATE ${LIBSECRET_LIBRARIES}) + endif() + + add_definitions(-DKEYCHAIN_DBUS=1) + list(APPEND qtkeychain_SOURCES keychain_unix.cpp gnomekeyring.cpp libsecret.cpp plaintextstore.cpp) + qt_add_dbus_interface(qtkeychain_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/org.kde.KWallet.xml kwallet_interface KWalletInterface) + list(APPEND qtkeychain_LIBRARIES ${QTDBUS_LIBRARIES} ) +endif() + +if(ANDROID) + list(APPEND qtkeychain_SOURCES keychain_android.cpp androidkeystore.cpp plaintextstore.cpp) + list(APPEND qtkeychain_LIBRARIES_PRIVATE ${QTANDROIDEXTRAS_LIBRARIES} ) +endif() + +QT_WRAP_CPP(qtkeychain_MOC_OUTFILES keychain.h keychain_p.h gnomekeyring_p.h) + +set(qtkeychain_TR_FILES + translations/qtkeychain_de.ts + translations/qtkeychain_fr.ts + translations/qtkeychain_ro.ts + translations/qtkeychain_ru.ts + translations/qtkeychain_zh.ts +) + +add_library(${QTKEYCHAIN_TARGET_NAME} ${qtkeychain_SOURCES} ${qtkeychain_MOC_OUTFILES} ${qtkeychain_QM_FILES}) +if(WIN32) + set_target_properties( ${QTKEYCHAIN_TARGET_NAME} PROPERTIES DEBUG_POSTFIX "d" ) +endif() + +target_link_libraries(${QTKEYCHAIN_TARGET_NAME} PUBLIC ${qtkeychain_LIBRARIES} PRIVATE ${qtkeychain_LIBRARIES_PRIVATE}) +if(NOT INTERFACE_INCLUDE_SUFFIX) + set(INTERFACE_INCLUDE_SUFFIX include) +endif() +# Where to find includes when building the library and using it uninstalled: in the parent dir, so that the code has to use +target_include_directories(${QTKEYCHAIN_TARGET_NAME} PUBLIC $ $) +# Where to find includes when using the installed qtkeychain +target_include_directories(${QTKEYCHAIN_TARGET_NAME} INTERFACE $) + +generate_export_header(${QTKEYCHAIN_TARGET_NAME} + EXPORT_FILE_NAME qkeychain_export.h + EXPORT_MACRO_NAME QKEYCHAIN_EXPORT +) + +set_target_properties(${QTKEYCHAIN_TARGET_NAME} PROPERTIES + VERSION ${QTKEYCHAIN_VERSION} + SOVERSION ${QTKEYCHAIN_SOVERSION} + INSTALL_RPATH_USE_LINK_PATH TRUE +) + +if (NOT APPLE) + set_target_properties(${QTKEYCHAIN_TARGET_NAME} PROPERTIES + INSTALL_NAME_DIR "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}" + ) +endif() + +install(FILES keychain.h ${CMAKE_CURRENT_BINARY_DIR}/qkeychain_export.h + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/qt${QTKEYCHAIN_VERSION_INFIX}keychain/ +) + +install(TARGETS ${QTKEYCHAIN_TARGET_NAME} + EXPORT Qt${QTKEYCHAIN_VERSION_INFIX}KeychainLibraryDepends + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} +) diff --git a/androidkeystore.cpp b/qtkeychain/androidkeystore.cpp similarity index 100% rename from androidkeystore.cpp rename to qtkeychain/androidkeystore.cpp diff --git a/androidkeystore_p.h b/qtkeychain/androidkeystore_p.h similarity index 100% rename from androidkeystore_p.h rename to qtkeychain/androidkeystore_p.h diff --git a/gnomekeyring.cpp b/qtkeychain/gnomekeyring.cpp similarity index 100% rename from gnomekeyring.cpp rename to qtkeychain/gnomekeyring.cpp diff --git a/gnomekeyring_p.h b/qtkeychain/gnomekeyring_p.h similarity index 100% rename from gnomekeyring_p.h rename to qtkeychain/gnomekeyring_p.h diff --git a/keychain.cpp b/qtkeychain/keychain.cpp similarity index 100% rename from keychain.cpp rename to qtkeychain/keychain.cpp diff --git a/keychain.h b/qtkeychain/keychain.h similarity index 100% rename from keychain.h rename to qtkeychain/keychain.h diff --git a/keychain_android.cpp b/qtkeychain/keychain_android.cpp similarity index 97% rename from keychain_android.cpp rename to qtkeychain/keychain_android.cpp index 8cea484..8efecf9 100644 --- a/keychain_android.cpp +++ b/qtkeychain/keychain_android.cpp @@ -107,8 +107,10 @@ void WritePasswordJobPrivate::scheduledStart() KeyPairGeneratorSpec::Builder(Context(QtAndroid::androidActivity())). #elif QT_VERSION < QT_VERSION_CHECK(6, 4, 0) KeyPairGeneratorSpec::Builder(Context(QNativeInterface::QAndroidApplication::context())). - #else + #elif QT_VERSION < QT_VERSION_CHECK(6, 7, 0) KeyPairGeneratorSpec::Builder(Context((jobject)QNativeInterface::QAndroidApplication::context())). + #else + KeyPairGeneratorSpec::Builder(Context(QNativeInterface::QAndroidApplication::context().object())). #endif setAlias(alias). setSubject(X500Principal(QStringLiteral("CN=QtKeychain, O=Android Authority"))). diff --git a/keychain_apple.mm b/qtkeychain/keychain_apple.mm similarity index 100% rename from keychain_apple.mm rename to qtkeychain/keychain_apple.mm diff --git a/keychain_haiku.cpp b/qtkeychain/keychain_haiku.cpp similarity index 100% rename from keychain_haiku.cpp rename to qtkeychain/keychain_haiku.cpp diff --git a/keychain_p.h b/qtkeychain/keychain_p.h similarity index 100% rename from keychain_p.h rename to qtkeychain/keychain_p.h diff --git a/keychain_unix.cpp b/qtkeychain/keychain_unix.cpp similarity index 89% rename from keychain_unix.cpp rename to qtkeychain/keychain_unix.cpp index d60cb77..a3e83a9 100644 --- a/keychain_unix.cpp +++ b/qtkeychain/keychain_unix.cpp @@ -19,24 +19,35 @@ enum KeyringBackend { Backend_LibSecretKeyring, Backend_GnomeKeyring, Backend_Kwallet4, - Backend_Kwallet5 + Backend_Kwallet5, + Backend_Kwallet6, }; enum DesktopEnvironment { DesktopEnv_Gnome, DesktopEnv_Kde4, DesktopEnv_Plasma5, + DesktopEnv_Plasma6, DesktopEnv_Unity, DesktopEnv_Xfce, DesktopEnv_Other }; +static constexpr const char KWALLET6_DBUS_IFACE[] = "org.kde.kwalletd6"; +static constexpr const char KWALLET6_DBUS_PATH[] = "/modules/kwalletd6"; +static constexpr const char KWALLET5_DBUS_IFACE[] = "org.kde.kwalletd5"; +static constexpr const char KWALLET5_DBUS_PATH[] = "/modules/kwalletd5"; +static constexpr const char KWALLET4_DBUS_IFACE[] = "org.kde.kwalletd"; +static constexpr const char KWALLET4_DBUS_PATH[] = "/modules/kwalletd"; + // the following detection algorithm is derived from chromium, // licensed under BSD, see base/nix/xdg_util.cc static DesktopEnvironment getKdeVersion() { QByteArray value = qgetenv("KDE_SESSION_VERSION"); - if ( value == "5" ) { + if ( value == "6" ) { + return DesktopEnv_Plasma6; + } else if ( value == "5" ) { return DesktopEnv_Plasma5; } else if (value == "4" ) { return DesktopEnv_Kde4; @@ -78,14 +89,14 @@ static DesktopEnvironment detectDesktopEnvironment() { return DesktopEnv_Other; } -static bool isKwallet5Available() +static bool isKwalletAvailable(const char *dbusIface, const char *dbusPath) { if (!QDBusConnection::sessionBus().isConnected()) return false; org::kde::KWallet iface( - QLatin1String("org.kde.kwalletd5"), - QLatin1String("/modules/kwalletd5"), + QLatin1String(dbusIface), + QLatin1String(dbusPath), QDBusConnection::sessionBus()); // At this point iface.isValid() can return false even though the @@ -118,7 +129,7 @@ static KeyringBackend detectKeyringBackend() return Backend_Kwallet4; case DesktopEnv_Plasma5: - if (isKwallet5Available()) { + if (isKwalletAvailable(KWALLET5_DBUS_IFACE, KWALLET5_DBUS_PATH)) { return Backend_Kwallet5; } if (LibSecretKeyring::isAvailable()) { @@ -130,6 +141,19 @@ static KeyringBackend detectKeyringBackend() // During startup the keychain backend might just not have started yet return Backend_Kwallet5; + case DesktopEnv_Plasma6: + if (isKwalletAvailable(KWALLET6_DBUS_IFACE, KWALLET6_DBUS_PATH)) { + return Backend_Kwallet6; + } + if (LibSecretKeyring::isAvailable()) { + return Backend_LibSecretKeyring; + } + if (GnomeKeyring::isAvailable()) { + return Backend_GnomeKeyring; + } + // During startup the keychain backend might just not have started yet + return Backend_Kwallet6; + case DesktopEnv_Gnome: case DesktopEnv_Unity: case DesktopEnv_Xfce: @@ -141,7 +165,10 @@ static KeyringBackend detectKeyringBackend() if (GnomeKeyring::isAvailable()) { return Backend_GnomeKeyring; } - if (isKwallet5Available()) { + if (isKwalletAvailable(KWALLET6_DBUS_IFACE, KWALLET6_DBUS_PATH)) { + return Backend_Kwallet6; + } + if (isKwalletAvailable(KWALLET5_DBUS_IFACE, KWALLET5_DBUS_PATH)) { return Backend_Kwallet5; } // During startup the keychain backend might just not have started yet @@ -198,10 +225,13 @@ void ReadPasswordJobPrivate::scheduledStart() { break; case Backend_Kwallet4: - kwalletReadPasswordScheduledStartImpl("org.kde.kwalletd", "/modules/kwalletd", this); + kwalletReadPasswordScheduledStartImpl(KWALLET4_DBUS_IFACE, KWALLET4_DBUS_PATH, this); break; case Backend_Kwallet5: - kwalletReadPasswordScheduledStartImpl("org.kde.kwalletd5", "/modules/kwalletd5", this); + kwalletReadPasswordScheduledStartImpl(KWALLET5_DBUS_IFACE, KWALLET5_DBUS_PATH, this); + break; + case Backend_Kwallet6: + kwalletReadPasswordScheduledStartImpl(KWALLET6_DBUS_IFACE, KWALLET6_DBUS_PATH, this); break; } } @@ -454,10 +484,13 @@ void WritePasswordJobPrivate::scheduledStart() { break; case Backend_Kwallet4: - kwalletWritePasswordScheduledStart("org.kde.kwalletd", "/modules/kwalletd", this); + kwalletWritePasswordScheduledStart(KWALLET4_DBUS_IFACE, KWALLET4_DBUS_PATH, this); break; case Backend_Kwallet5: - kwalletWritePasswordScheduledStart("org.kde.kwalletd5", "/modules/kwalletd5", this); + kwalletWritePasswordScheduledStart(KWALLET5_DBUS_IFACE, KWALLET5_DBUS_PATH, this); + break; + case Backend_Kwallet6: + kwalletWritePasswordScheduledStart(KWALLET6_DBUS_IFACE, KWALLET6_DBUS_PATH, this); break; } } @@ -562,10 +595,13 @@ void DeletePasswordJobPrivate::scheduledStart() { break; case Backend_Kwallet4: - kwalletWritePasswordScheduledStart("org.kde.kwalletd", "/modules/kwalletd", this); + kwalletWritePasswordScheduledStart(KWALLET4_DBUS_IFACE, KWALLET4_DBUS_PATH, this); break; case Backend_Kwallet5: - kwalletWritePasswordScheduledStart("org.kde.kwalletd5", "/modules/kwalletd5", this); + kwalletWritePasswordScheduledStart(KWALLET5_DBUS_IFACE, KWALLET5_DBUS_PATH, this); + break; + case Backend_Kwallet6: + kwalletWritePasswordScheduledStart(KWALLET6_DBUS_IFACE, KWALLET6_DBUS_PATH, this); break; } } @@ -591,5 +627,7 @@ void DeletePasswordJobPrivate::fallbackOnError(const QDBusError &err) { bool QKeychain::isAvailable() { - return LibSecretKeyring::isAvailable() || GnomeKeyring::isAvailable() || isKwallet5Available(); + return LibSecretKeyring::isAvailable() || GnomeKeyring::isAvailable() + || isKwalletAvailable(KWALLET6_DBUS_IFACE, KWALLET6_DBUS_PATH) + || isKwalletAvailable(KWALLET5_DBUS_IFACE, KWALLET5_DBUS_PATH); } diff --git a/keychain_win.cpp b/qtkeychain/keychain_win.cpp similarity index 91% rename from keychain_win.cpp rename to qtkeychain/keychain_win.cpp index 98dd34c..509d2a4 100644 --- a/keychain_win.cpp +++ b/qtkeychain/keychain_win.cpp @@ -20,10 +20,9 @@ using namespace QKeychain; #include void ReadPasswordJobPrivate::scheduledStart() { - LPCWSTR name = (LPCWSTR)key.utf16(); PCREDENTIALW cred; - if (!CredReadW(name, CRED_TYPE_GENERIC, 0, &cred)) { + if (!CredReadW(reinterpret_cast(key.utf16()), CRED_TYPE_GENERIC, 0, &cred)) { Error err; QString msg; switch(GetLastError()) { @@ -41,23 +40,19 @@ void ReadPasswordJobPrivate::scheduledStart() { return; } - data = QByteArray((char*)cred->CredentialBlob, cred->CredentialBlobSize); + data = QByteArray(reinterpret_cast(cred->CredentialBlob), cred->CredentialBlobSize); CredFree(cred); q->emitFinished(); } void WritePasswordJobPrivate::scheduledStart() { - CREDENTIALW cred; - char *pwd = data.data(); - LPWSTR name = (LPWSTR)key.utf16(); - - memset(&cred, 0, sizeof(cred)); + CREDENTIALW cred = {}; cred.Comment = const_cast(L"QtKeychain"); cred.Type = CRED_TYPE_GENERIC; - cred.TargetName = name; + cred.TargetName = const_cast(reinterpret_cast(key.utf16())); cred.CredentialBlobSize = data.size(); - cred.CredentialBlob = (LPBYTE)pwd; + cred.CredentialBlob = reinterpret_cast(data.data()); cred.Persist = CRED_PERSIST_ENTERPRISE; if (CredWriteW(&cred, 0)) { @@ -65,7 +60,7 @@ void WritePasswordJobPrivate::scheduledStart() { return; } - DWORD err = GetLastError(); + const DWORD err = GetLastError(); // Detect size-exceeded errors and provide nicer messages. // Unfortunately these error codes aren't documented. @@ -93,9 +88,7 @@ void WritePasswordJobPrivate::scheduledStart() { } void DeletePasswordJobPrivate::scheduledStart() { - LPCWSTR name = (LPCWSTR)key.utf16(); - - if (!CredDeleteW(name, CRED_TYPE_GENERIC, 0)) { + if (!CredDeleteW(reinterpret_cast(key.utf16()), CRED_TYPE_GENERIC, 0)) { Error err; QString msg; switch(GetLastError()) { diff --git a/libsecret.cpp b/qtkeychain/libsecret.cpp similarity index 100% rename from libsecret.cpp rename to qtkeychain/libsecret.cpp diff --git a/libsecret_p.h b/qtkeychain/libsecret_p.h similarity index 100% rename from libsecret_p.h rename to qtkeychain/libsecret_p.h diff --git a/org.kde.KWallet.xml b/qtkeychain/org.kde.KWallet.xml similarity index 100% rename from org.kde.KWallet.xml rename to qtkeychain/org.kde.KWallet.xml diff --git a/plaintextstore.cpp b/qtkeychain/plaintextstore.cpp similarity index 100% rename from plaintextstore.cpp rename to qtkeychain/plaintextstore.cpp diff --git a/plaintextstore_p.h b/qtkeychain/plaintextstore_p.h similarity index 100% rename from plaintextstore_p.h rename to qtkeychain/plaintextstore_p.h diff --git a/testclient.cpp b/testclient.cpp index f745bd3..9aed138 100644 --- a/testclient.cpp +++ b/testclient.cpp @@ -16,7 +16,7 @@ #include -#include "keychain.h" +#include "qtkeychain/keychain.h" #include using namespace QKeychain; diff --git a/translations/qtkeychain_ru.ts b/translations/qtkeychain_ru.ts index 1d61129..e17f659 100644 --- a/translations/qtkeychain_ru.ts +++ b/translations/qtkeychain_ru.ts @@ -4,13 +4,13 @@ QKeychain::DeletePasswordJobPrivate - - + + Unknown error Неизвестная ошибка - + Could not open wallet: %1; %2 Не удалось открыть бумажник: %1; %2 @@ -24,6 +24,21 @@ Could not decrypt data Не удалось расшифровать данные + + + Password not found + Пароль не найден + + + + Could not open keystore + + + + + Could not remove private key from keystore + + QKeychain::JobPrivate @@ -69,7 +84,7 @@ QKeychain::ReadPasswordJobPrivate - + Password not found Пароль не найден @@ -106,6 +121,7 @@ + Entry not found Запись не найдена @@ -130,6 +146,21 @@ Could not decrypt data Не удалось расшифровать данные + + + Could not open keystore + + + + + Could not retrieve private key from keystore + + + + + Could not create decryption cipher + + QKeychain::WritePasswordJobPrivate @@ -169,18 +200,51 @@ Encryption failed Шифрование не удалось + + + Password not found + Пароль не найден + + + + Could not open keystore + + + + + Could not create private key generator + + + + + Could not generate new private key + + + + + Could not retrieve private key from keystore + + + + + Could not create encryption cipher + + + + + Could not encrypt data + + QObject - OS X Keychain error (OSStatus %1) - Ошибка связки ключей OS X (OSStatus %1) + Ошибка связки ключей OS X (OSStatus %1) - %1 (OSStatus %2) - %1 (OSStatus %2) + %1 (OSStatus %2) @@ -233,9 +297,14 @@ Неизвестная ошибка - + Entry not found Запись не найдена + + + error 0x%1: %2 + + From 599b3f1e69aa25dab8f6b22fead5bf3f75b8400a Mon Sep 17 00:00:00 2001 From: Calugar George Date: Thu, 25 Jul 2024 00:28:04 +0300 Subject: [PATCH 13/15] cmake cleanup --- CMakeLists.txt | 30 +++++------------------------- 1 file changed, 5 insertions(+), 25 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 14941cc..f1905d4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,7 +7,7 @@ project(qtkeychain VERSION ${QTKEYCHAIN_VERSION} LANGUAGES CXX) # Enable C++11 SET(CMAKE_CXX_STANDARD 11) -SET(CMAKE_AUTOMOC ON) + include(FindPkgConfig) ### @@ -21,7 +21,6 @@ include(ECMGeneratePriFile) include(CMakeDependentOption) option(BUILD_WITH_QT6 "Build qtkeychain with Qt 6" OFF) -option(QTKEYCHAIN_BUILD_WITH_QML "Build qtkeychain with Qt 6 and QML module support" OFF) option(BUILD_TEST_APPLICATION "Build test application" OFF) option(BUILD_TRANSLATIONS "Build translations" ON) option(BUILD_SHARED_LIBS "Build dynamic library" ON) @@ -93,9 +92,6 @@ if (Qt5Core_FOUND AND NOT BUILD_WITH_QT6) include_directories(${Qt5Core_INCLUDE_DIRS}) else() find_package(Qt6 COMPONENTS Core REQUIRED) - if(QTKEYCHAIN_BUILD_WITH_QML) - find_package(Qt6 COMPONENTS QML REQUIRED) - endif() set(QTKEYCHAIN_VERSION_INFIX 6) @@ -133,21 +129,6 @@ add_subdirectory(qtkeychain) ### Translations ### -if (QTKEYCHAIN_BUILD_WITH_QML) - qt_policy(SET QTP0001 OLD) - qt_add_qml_module(${QTKEYCHAIN_TARGET_NAME} - URI "QtKeychain" - VERSION "${CMAKE_PROJECT_VERSION_MAJOR}.${CMAKE_PROJECT_VERSION_MINOR}" - OUTPUT_DIRECTORY QtKeychain - ) - target_compile_definitions(${QTKEYCHAIN_TARGET_NAME} PRIVATE BUILD_WITH_QML=ON) - target_link_libraries(${QTKEYCHAIN_TARGET_NAME} PUBLIC - Qt6::Qml - ) -else() -endif() -target_sources(${QTKEYCHAIN_TARGET_NAME} PRIVATE ${qtkeychain_SOURCES} ${qtkeychain_MOC_OUTFILES} ${qtkeychain_QM_FILES}) - file(GLOB qtkeychain_TR_SOURCES qtkeychain/*.cpp qtkeychain/*.h qtkeychain/*.ui) if ( BUILD_TRANSLATIONS ) qt_create_translation(qtkeychain_MESSAGES ${qtkeychain_TR_SOURCES} ${qtkeychain_TR_FILES}) @@ -229,13 +210,12 @@ ecm_generate_pri_file(BASE_NAME Qt${QTKEYCHAIN_VERSION_INFIX}Keychain install(FILES ${pri_filename} DESTINATION ${ECM_MKSPECS_INSTALL_DIR}) -#INFO Removed to build on mac.... -#install(EXPORT Qt${QTKEYCHAIN_VERSION_INFIX}KeychainLibraryDepends -# DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/Qt${QTKEYCHAIN_VERSION_INFIX}Keychain" -#) + +install(EXPORT Qt${QTKEYCHAIN_VERSION_INFIX}KeychainLibraryDepends + DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/Qt${QTKEYCHAIN_VERSION_INFIX}Keychain" +) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/Qt${QTKEYCHAIN_VERSION_INFIX}KeychainConfig.cmake ${CMAKE_CURRENT_BINARY_DIR}/Qt${QTKEYCHAIN_VERSION_INFIX}KeychainConfigVersion.cmake DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/Qt${QTKEYCHAIN_VERSION_INFIX}Keychain ) - From 4e98b293fa335cd80e506c62093a6187d0d81980 Mon Sep 17 00:00:00 2001 From: Calugar George Date: Thu, 25 Jul 2024 01:27:12 +0300 Subject: [PATCH 14/15] Try restore the qml support --- CMakeLists.txt | 6 +++++- qtkeychain/CMakeLists.txt | 16 ++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f1905d4..00e86de 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,7 +7,7 @@ project(qtkeychain VERSION ${QTKEYCHAIN_VERSION} LANGUAGES CXX) # Enable C++11 SET(CMAKE_CXX_STANDARD 11) - +SET(CMAKE_AUTOMOC ON) include(FindPkgConfig) ### @@ -21,6 +21,7 @@ include(ECMGeneratePriFile) include(CMakeDependentOption) option(BUILD_WITH_QT6 "Build qtkeychain with Qt 6" OFF) +option(QTKEYCHAIN_BUILD_WITH_QML "Build qtkeychain with Qt 6 and QML module support" OFF) option(BUILD_TEST_APPLICATION "Build test application" OFF) option(BUILD_TRANSLATIONS "Build translations" ON) option(BUILD_SHARED_LIBS "Build dynamic library" ON) @@ -92,6 +93,9 @@ if (Qt5Core_FOUND AND NOT BUILD_WITH_QT6) include_directories(${Qt5Core_INCLUDE_DIRS}) else() find_package(Qt6 COMPONENTS Core REQUIRED) + if(QTKEYCHAIN_BUILD_WITH_QML) + find_package(Qt6 COMPONENTS QML REQUIRED) + endif() set(QTKEYCHAIN_VERSION_INFIX 6) diff --git a/qtkeychain/CMakeLists.txt b/qtkeychain/CMakeLists.txt index f9e28ce..e1be4dd 100644 --- a/qtkeychain/CMakeLists.txt +++ b/qtkeychain/CMakeLists.txt @@ -1,4 +1,5 @@ + list(APPEND qtkeychain_LIBRARIES ${QTCORE_LIBRARIES}) set(qtkeychain_SOURCES keychain.cpp @@ -99,6 +100,21 @@ set_target_properties(${QTKEYCHAIN_TARGET_NAME} PROPERTIES SOVERSION ${QTKEYCHAIN_SOVERSION} INSTALL_RPATH_USE_LINK_PATH TRUE ) +if (QTKEYCHAIN_BUILD_WITH_QML) + qt_policy(SET QTP0001 OLD) + qt_add_qml_module(${QTKEYCHAIN_TARGET_NAME} + URI "QtKeychain" + VERSION "${CMAKE_PROJECT_VERSION_MAJOR}.${CMAKE_PROJECT_VERSION_MINOR}" + OUTPUT_DIRECTORY QtKeychain + ) + target_compile_definitions(${QTKEYCHAIN_TARGET_NAME} PRIVATE BUILD_WITH_QML=ON) + target_link_libraries(${QTKEYCHAIN_TARGET_NAME} PUBLIC + Qt6::Qml + ) +else() +endif() +target_sources(${QTKEYCHAIN_TARGET_NAME} PRIVATE ${qtkeychain_SOURCES} ${qtkeychain_MOC_OUTFILES} ${qtkeychain_QM_FILES}) + if (NOT APPLE) set_target_properties(${QTKEYCHAIN_TARGET_NAME} PROPERTIES From 0442e180a34b5cb52c1d49b0ffdfca82a6759425 Mon Sep 17 00:00:00 2001 From: Calugar George Date: Thu, 25 Jul 2024 02:04:52 +0300 Subject: [PATCH 15/15] Small fix using the old code --- keychain_android.cpp | 16 ++++--- translations/qtkeychain_de.ts | 14 +++--- translations/qtkeychain_fr.ts | 14 +++--- translations/qtkeychain_ro.ts | 14 +++--- translations/qtkeychain_ru.ts | 87 +++++++++++++++++++++++++++++++---- translations/qtkeychain_zh.ts | 14 +++--- 6 files changed, 115 insertions(+), 44 deletions(-) diff --git a/keychain_android.cpp b/keychain_android.cpp index 8cea484..74ef92d 100644 --- a/keychain_android.cpp +++ b/keychain_android.cpp @@ -103,13 +103,15 @@ void WritePasswordJobPrivate::scheduledStart() end.add(Calendar::YEAR, 99); const KeyPairGeneratorSpec spec = - #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) - KeyPairGeneratorSpec::Builder(Context(QtAndroid::androidActivity())). - #elif QT_VERSION < QT_VERSION_CHECK(6, 4, 0) - KeyPairGeneratorSpec::Builder(Context(QNativeInterface::QAndroidApplication::context())). - #else - KeyPairGeneratorSpec::Builder(Context((jobject)QNativeInterface::QAndroidApplication::context())). - #endif +#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) + KeyPairGeneratorSpec::Builder(Context(QtAndroid::androidActivity())). +#elif QT_VERSION < QT_VERSION_CHECK(6, 4, 0) + KeyPairGeneratorSpec::Builder(Context(QNativeInterface::QAndroidApplication::context())). +#elif QT_VERSION < QT_VERSION_CHECK(6, 7, 0) + KeyPairGeneratorSpec::Builder(Context((jobject)QNativeInterface::QAndroidApplication::context())). +#else + KeyPairGeneratorSpec::Builder(Context(QNativeInterface::QAndroidApplication::context().object())). +#endif setAlias(alias). setSubject(X500Principal(QStringLiteral("CN=QtKeychain, O=Android Authority"))). setSerialNumber(java::math::BigInteger::ONE). diff --git a/translations/qtkeychain_de.ts b/translations/qtkeychain_de.ts index 53e0981..014c421 100644 --- a/translations/qtkeychain_de.ts +++ b/translations/qtkeychain_de.ts @@ -30,12 +30,12 @@ Passwort nicht gefunden - + Could not open keystore - + Could not remove private key from keystore @@ -235,27 +235,27 @@ - + Could not create private key generator - + Could not generate new private key - + Could not retrieve private key from keystore - + Could not create encryption cipher - + Could not encrypt data diff --git a/translations/qtkeychain_fr.ts b/translations/qtkeychain_fr.ts index 5829a8f..c5e3108 100644 --- a/translations/qtkeychain_fr.ts +++ b/translations/qtkeychain_fr.ts @@ -30,12 +30,12 @@ Mot de passe introuvable - + Could not open keystore - + Could not remove private key from keystore @@ -235,27 +235,27 @@ - + Could not create private key generator - + Could not generate new private key - + Could not retrieve private key from keystore - + Could not create encryption cipher - + Could not encrypt data diff --git a/translations/qtkeychain_ro.ts b/translations/qtkeychain_ro.ts index 872f8da..815d23e 100644 --- a/translations/qtkeychain_ro.ts +++ b/translations/qtkeychain_ro.ts @@ -30,12 +30,12 @@ Parola nu a fost găsită - + Could not open keystore - + Could not remove private key from keystore @@ -236,27 +236,27 @@ - + Could not create private key generator - + Could not generate new private key - + Could not retrieve private key from keystore - + Could not create encryption cipher - + Could not encrypt data diff --git a/translations/qtkeychain_ru.ts b/translations/qtkeychain_ru.ts index 1d61129..304cd3f 100644 --- a/translations/qtkeychain_ru.ts +++ b/translations/qtkeychain_ru.ts @@ -4,13 +4,13 @@ QKeychain::DeletePasswordJobPrivate - - + + Unknown error Неизвестная ошибка - + Could not open wallet: %1; %2 Не удалось открыть бумажник: %1; %2 @@ -24,6 +24,21 @@ Could not decrypt data Не удалось расшифровать данные + + + Password not found + Пароль не найден + + + + Could not open keystore + + + + + Could not remove private key from keystore + + QKeychain::JobPrivate @@ -69,7 +84,7 @@ QKeychain::ReadPasswordJobPrivate - + Password not found Пароль не найден @@ -106,6 +121,7 @@ + Entry not found Запись не найдена @@ -130,6 +146,21 @@ Could not decrypt data Не удалось расшифровать данные + + + Could not open keystore + + + + + Could not retrieve private key from keystore + + + + + Could not create decryption cipher + + QKeychain::WritePasswordJobPrivate @@ -169,18 +200,51 @@ Encryption failed Шифрование не удалось + + + Password not found + Пароль не найден + + + + Could not open keystore + + + + + Could not create private key generator + + + + + Could not generate new private key + + + + + Could not retrieve private key from keystore + + + + + Could not create encryption cipher + + + + + Could not encrypt data + + QObject - OS X Keychain error (OSStatus %1) - Ошибка связки ключей OS X (OSStatus %1) + Ошибка связки ключей OS X (OSStatus %1) - %1 (OSStatus %2) - %1 (OSStatus %2) + %1 (OSStatus %2) @@ -233,9 +297,14 @@ Неизвестная ошибка - + Entry not found Запись не найдена + + + error 0x%1: %2 + + diff --git a/translations/qtkeychain_zh.ts b/translations/qtkeychain_zh.ts index 742c1ad..f651491 100644 --- a/translations/qtkeychain_zh.ts +++ b/translations/qtkeychain_zh.ts @@ -30,12 +30,12 @@ 找不到密碼 - + Could not open keystore - + Could not remove private key from keystore @@ -235,27 +235,27 @@ - + Could not create private key generator - + Could not generate new private key - + Could not retrieve private key from keystore - + Could not create encryption cipher - + Could not encrypt data