diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index a3f661a10..a8c1b4f75 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,641 +1,639 @@ # SPDX-FileCopyrightText: none # SPDX-License-Identifier: BSD-3-Clause add_subdirectory(icons) add_subdirectory(mimetypes) include_directories(${CMAKE_CURRENT_BINARY_DIR}) include_directories(${CMAKE_CURRENT_SOURCE_DIR}) if (NOT DISABLE_KWATCHGNUPG) add_subdirectory(kwatchgnupg) endif() add_subdirectory(libkleopatraclient) add_subdirectory(conf) if(WIN32) set(_kleopatra_extra_uiserver_SRCS uiserver/uiserver_win.cpp) set(_kleopatra_extra_SRCS selftest/registrycheck.cpp selftest/registrycheck.h utils/gnupg-registry.c utils/userinfo_win.cpp utils/winapi-helpers.cpp utils/winapi-helpers.h utils/windowsprocessdevice.cpp utils/windowsprocessdevice.h versioninfo.rc kleopatra.w32-manifest ) else() set(_kleopatra_extra_uiserver_SRCS uiserver/uiserver_unix.cpp) set(_kleopatra_extra_SRCS) endif() set(_kleopatra_uiserver_SRCS ${_kleopatra_extra_uiserver_SRCS} selftest/uiservercheck.cpp selftest/uiservercheck.h uiserver/assuanserverconnection.cpp uiserver/assuanserverconnection.h uiserver/createchecksumscommand.cpp uiserver/createchecksumscommand.h uiserver/decryptverifycommandemailbase.cpp uiserver/decryptverifycommandemailbase.h uiserver/decryptverifycommandfilesbase.cpp uiserver/decryptverifycommandfilesbase.h uiserver/echocommand.cpp uiserver/echocommand.h uiserver/encryptcommand.cpp uiserver/encryptcommand.h uiserver/importfilescommand.cpp uiserver/importfilescommand.h uiserver/prepencryptcommand.cpp uiserver/prepencryptcommand.h uiserver/prepsigncommand.cpp uiserver/prepsigncommand.h uiserver/selectcertificatecommand.cpp uiserver/sessiondata.cpp uiserver/sessiondata.h uiserver/signcommand.cpp uiserver/signcommand.h uiserver/signencryptfilescommand.cpp uiserver/uiserver.cpp uiserver/verifychecksumscommand.cpp uiserver/verifychecksumscommand.h ) set(_kleopatra_uiserver_extra_libs LibAssuan::LibAssuan LibGpgError::LibGpgError) if(HAVE_GPG_ERR_SOURCE_KLEO) add_definitions(-DGPG_ERR_SOURCE_DEFAULT=GPG_ERR_SOURCE_KLEO) add_definitions(-DGPGMEPP_ERR_SOURCE_DEFAULT=GPG_ERR_SOURCE_KLEO) else() add_definitions(-DGPG_ERR_SOURCE_DEFAULT=GPG_ERR_SOURCE_USER_1) add_definitions(-DGPGMEPP_ERR_SOURCE_DEFAULT=GPG_ERR_SOURCE_USER_1) endif() if(KPim6IdentityManagementCore_FOUND AND KPim6MailTransport_FOUND AND KPim6AkonadiMime_FOUND) set(_kleopatra_mail_libs KPim6::IdentityManagementCore # Export OpenPGP keys using WKS KPim6::MailTransport KPim6::AkonadiMime ) add_definitions(-DMAILAKONADI_ENABLED) endif() ki18n_wrap_ui(_kleopatra_uiserver_SRCS crypto/gui/signingcertificateselectionwidget.ui) set(_kleopatra_SRCS ${_kleopatra_extra_SRCS} accessibility/accessiblelink.cpp accessibility/accessiblelink_p.h accessibility/accessiblerichtextlabel.cpp accessibility/accessiblerichtextlabel_p.h accessibility/accessiblevaluelabel.cpp accessibility/accessiblevaluelabel_p.h accessibility/accessiblewidgetfactory.cpp accessibility/accessiblewidgetfactory.h commands/addadskcommand.cpp commands/addadskcommand.h commands/addsubkeycommand.cpp commands/addsubkeycommand.h commands/adduseridcommand.cpp commands/adduseridcommand.h commands/authenticatepivcardapplicationcommand.cpp commands/authenticatepivcardapplicationcommand.h commands/cardcommand.cpp commands/cardcommand.h commands/certificatetocardcommand.cpp commands/certificatetocardcommand.h commands/certificatetopivcardcommand.cpp commands/certificatetopivcardcommand.h commands/certifycertificatecommand.cpp commands/certifycertificatecommand.h commands/certifygroupcommand.cpp commands/certifygroupcommand.h commands/changeexpirycommand.cpp commands/changeexpirycommand.h commands/changeownertrustcommand.cpp commands/changeownertrustcommand.h commands/changepassphrasecommand.cpp commands/changepassphrasecommand.h commands/changepincommand.cpp commands/changepincommand.h commands/changeroottrustcommand.cpp commands/changeroottrustcommand.h commands/checksumcreatefilescommand.cpp commands/checksumcreatefilescommand.h commands/checksumverifyfilescommand.cpp commands/checksumverifyfilescommand.h commands/clearcrlcachecommand.cpp commands/clearcrlcachecommand.h commands/command.cpp commands/command.h commands/createcsrforcardkeycommand.cpp commands/createcsrforcardkeycommand.h commands/creategroupcommand.cpp commands/creategroupcommand.h commands/createopenpgpkeyfromcardkeyscommand.cpp commands/createopenpgpkeyfromcardkeyscommand.h commands/decryptverifyclipboardcommand.cpp commands/decryptverifyclipboardcommand.h commands/decryptverifyfilescommand.cpp commands/decryptverifyfilescommand.h commands/deletecertificatescommand.cpp commands/deletecertificatescommand.h commands/detailscommand.cpp commands/detailscommand.h commands/dumpcertificatecommand.cpp commands/dumpcertificatecommand.h commands/dumpcrlcachecommand.cpp commands/dumpcrlcachecommand.h commands/encryptclipboardcommand.cpp commands/encryptclipboardcommand.h commands/exportcertificatecommand.cpp commands/exportcertificatecommand.h commands/exportgroupscommand.cpp commands/exportgroupscommand.h commands/exportopenpgpcertstoservercommand.cpp commands/exportopenpgpcertstoservercommand.h commands/exportopenpgpcerttoprovidercommand.cpp commands/exportopenpgpcerttoprovidercommand.h commands/exportpaperkeycommand.cpp commands/exportpaperkeycommand.h commands/exportsecretkeycommand.cpp commands/exportsecretkeycommand.h commands/exportsecretsubkeycommand.cpp commands/exportsecretsubkeycommand.h commands/genrevokecommand.cpp commands/genrevokecommand.h commands/gnupgprocesscommand.cpp commands/gnupgprocesscommand.h commands/importcertificatefromclipboardcommand.cpp commands/importcertificatefromclipboardcommand.h commands/importcertificatefromdatacommand.cpp commands/importcertificatefromdatacommand.h commands/importcertificatefromfilecommand.cpp commands/importcertificatefromfilecommand.h commands/importcertificatefromkeyservercommand.cpp commands/importcertificatefromkeyservercommand.h commands/importcertificatefrompivcardcommand.cpp commands/importcertificatefrompivcardcommand.h commands/importcertificatescommand.cpp commands/importcertificatescommand.h commands/importcrlcommand.cpp commands/importcrlcommand.h commands/importpaperkeycommand.cpp commands/importpaperkeycommand.h commands/keytocardcommand.cpp commands/keytocardcommand.h commands/lookupcertificatescommand.cpp commands/lookupcertificatescommand.h commands/newcertificatesigningrequestcommand.cpp commands/newcertificatesigningrequestcommand.h commands/newopenpgpcertificatecommand.cpp commands/newopenpgpcertificatecommand.h commands/openpgpgeneratecardkeycommand.cpp commands/openpgpgeneratecardkeycommand.h commands/pivgeneratecardkeycommand.cpp commands/pivgeneratecardkeycommand.h commands/refreshcertificatescommand.cpp commands/refreshcertificatescommand.h commands/refreshopenpgpcertscommand.cpp commands/refreshopenpgpcertscommand.h commands/refreshx509certscommand.cpp commands/refreshx509certscommand.h commands/reloadkeyscommand.cpp commands/reloadkeyscommand.h commands/revokecertificationcommand.cpp commands/revokecertificationcommand.h commands/revokekeycommand.cpp commands/revokekeycommand.h commands/revokeuseridcommand.cpp commands/revokeuseridcommand.h commands/selftestcommand.cpp commands/selftestcommand.h commands/setinitialpincommand.cpp commands/setinitialpincommand.h commands/setpivcardapplicationadministrationkeycommand.cpp commands/setpivcardapplicationadministrationkeycommand.h commands/setprimaryuseridcommand.cpp commands/setprimaryuseridcommand.h commands/signclipboardcommand.cpp commands/signclipboardcommand.h commands/signencryptfilescommand.cpp commands/signencryptfilescommand.h commands/signencryptfoldercommand.cpp commands/signencryptfoldercommand.h commands/viewemailfilescommand.cpp commands/viewemailfilescommand.h conf/configuredialog.cpp conf/configuredialog.h conf/groupsconfigdialog.cpp conf/groupsconfigdialog.h conf/groupsconfigwidget.cpp conf/groupsconfigwidget.h crypto/autodecryptverifyfilescontroller.cpp crypto/autodecryptverifyfilescontroller.h crypto/certificateresolver.cpp crypto/certificateresolver.h crypto/checksumsutils_p.cpp crypto/checksumsutils_p.h crypto/controller.cpp crypto/controller.h crypto/createchecksumscontroller.cpp crypto/createchecksumscontroller.h crypto/decryptverifyemailcontroller.cpp crypto/decryptverifyemailcontroller.h crypto/decryptverifyfilescontroller.cpp crypto/decryptverifyfilescontroller.h crypto/decryptverifytask.cpp crypto/decryptverifytask.h crypto/encryptemailcontroller.cpp crypto/encryptemailcontroller.h crypto/encryptemailtask.cpp crypto/encryptemailtask.h crypto/gui/certificatelineedit.cpp crypto/gui/certificatelineedit.h crypto/gui/certificateselectionline.cpp crypto/gui/certificateselectionline.h crypto/gui/decryptverifyfilesdialog.cpp crypto/gui/decryptverifyfilesdialog.h crypto/gui/decryptverifyfileswizard.cpp crypto/gui/decryptverifyfileswizard.h crypto/gui/decryptverifyoperationwidget.cpp crypto/gui/decryptverifyoperationwidget.h crypto/gui/encryptemailwizard.cpp crypto/gui/encryptemailwizard.h crypto/gui/newresultpage.cpp crypto/gui/newresultpage.h crypto/gui/objectspage.cpp crypto/gui/objectspage.h crypto/gui/resolverecipientspage.cpp crypto/gui/resolverecipientspage.h crypto/gui/resultitemwidget.cpp crypto/gui/resultitemwidget.h crypto/gui/resultlistwidget.cpp crypto/gui/resultlistwidget.h crypto/gui/resultpage.cpp crypto/gui/resultpage.h crypto/gui/signemailwizard.cpp crypto/gui/signemailwizard.h crypto/gui/signencryptemailconflictdialog.cpp crypto/gui/signencryptemailconflictdialog.h crypto/gui/signencryptfileswizard.cpp crypto/gui/signencryptfileswizard.h crypto/gui/signencryptwidget.cpp crypto/gui/signencryptwidget.h crypto/gui/signencryptwizard.cpp crypto/gui/signencryptwizard.h crypto/gui/signerresolvepage.cpp crypto/gui/signerresolvepage.h crypto/gui/signingcertificateselectiondialog.cpp crypto/gui/signingcertificateselectiondialog.h crypto/gui/signingcertificateselectionwidget.cpp crypto/gui/signingcertificateselectionwidget.h crypto/gui/unknownrecipientwidget.cpp crypto/gui/unknownrecipientwidget.h crypto/gui/verifychecksumsdialog.cpp crypto/gui/verifychecksumsdialog.h crypto/gui/wizard.cpp crypto/gui/wizard.h crypto/gui/wizardpage.cpp crypto/gui/wizardpage.h crypto/newsignencryptemailcontroller.cpp crypto/newsignencryptemailcontroller.h crypto/recipient.cpp crypto/recipient.h crypto/sender.cpp crypto/sender.h crypto/signemailcontroller.cpp crypto/signemailcontroller.h crypto/signemailtask.cpp crypto/signemailtask.h crypto/signencryptfilescontroller.cpp crypto/signencryptfilescontroller.h crypto/signencrypttask.cpp crypto/signencrypttask.h crypto/task.cpp crypto/task.h crypto/taskcollection.cpp crypto/taskcollection.h crypto/verifychecksumscontroller.cpp crypto/verifychecksumscontroller.h dialogs/addsubkeydialog.cpp dialogs/addsubkeydialog.h dialogs/adduseriddialog.cpp dialogs/adduseriddialog.h dialogs/animatedexpander.cpp dialogs/animatedexpander.h dialogs/cardinfotab.cpp dialogs/cardinfotab.h dialogs/certificatedetailsdialog.cpp dialogs/certificatedetailsdialog.h dialogs/certificatedetailsinputwidget.cpp dialogs/certificatedetailsinputwidget.h dialogs/certificatedetailswidget.cpp dialogs/certificatedetailswidget.h dialogs/certificatedumpwidget.cpp dialogs/certificatedumpwidget.h dialogs/certificateselectiondialog.cpp dialogs/certificateselectiondialog.h dialogs/certifycertificatedialog.cpp dialogs/certifycertificatedialog.h dialogs/certifywidget.cpp dialogs/certifywidget.h dialogs/createcsrforcardkeydialog.cpp dialogs/createcsrforcardkeydialog.h dialogs/copytosmartcarddialog.cpp dialogs/copytosmartcarddialog.h dialogs/debugdialog.cpp dialogs/debugdialog.h dialogs/deletecertificatesdialog.cpp dialogs/deletecertificatesdialog.h dialogs/editgroupdialog.cpp dialogs/editgroupdialog.h dialogs/expirydialog.cpp dialogs/expirydialog.h dialogs/exportdialog.cpp dialogs/exportdialog.h dialogs/gencardkeydialog.cpp dialogs/gencardkeydialog.h dialogs/groupdetailsdialog.cpp dialogs/groupdetailsdialog.h dialogs/lookupcertificatesdialog.cpp dialogs/lookupcertificatesdialog.h dialogs/pivcardapplicationadministrationkeyinputdialog.cpp dialogs/pivcardapplicationadministrationkeyinputdialog.h dialogs/revokekeydialog.cpp dialogs/revokekeydialog.h dialogs/revokerswidget.cpp dialogs/revokerswidget.h dialogs/selftestdialog.cpp dialogs/selftestdialog.h dialogs/setinitialpindialog.cpp dialogs/setinitialpindialog.h dialogs/smartcardwindow.cpp dialogs/smartcardwindow.h dialogs/subkeyswidget.cpp dialogs/subkeyswidget.h dialogs/trustchainwidget.cpp dialogs/trustchainwidget.h dialogs/updatenotification.cpp dialogs/updatenotification.h dialogs/useridswidget.cpp dialogs/useridswidget.h dialogs/weboftrustwidget.cpp dialogs/weboftrustwidget.h interfaces/anchorprovider.h interfaces/focusfirstchild.h newcertificatewizard/advancedsettingsdialog.cpp newcertificatewizard/advancedsettingsdialog_p.h newcertificatewizard/enterdetailspage.cpp newcertificatewizard/enterdetailspage_p.h newcertificatewizard/keycreationpage.cpp newcertificatewizard/keycreationpage_p.h newcertificatewizard/listwidget.cpp newcertificatewizard/listwidget.h newcertificatewizard/newcertificatewizard.cpp newcertificatewizard/newcertificatewizard.h newcertificatewizard/resultpage.cpp newcertificatewizard/resultpage_p.h newcertificatewizard/wizardpage.cpp newcertificatewizard/wizardpage_p.h selftest/compliancecheck.cpp selftest/compliancecheck.h selftest/enginecheck.cpp selftest/enginecheck.h selftest/gpgagentcheck.cpp selftest/gpgagentcheck.h selftest/gpgconfcheck.cpp selftest/gpgconfcheck.h selftest/libkleopatrarccheck.cpp selftest/libkleopatrarccheck.h selftest/selftest.cpp selftest/selftest.h smartcard/algorithminfo.h smartcard/card.cpp smartcard/card.h smartcard/deviceinfowatcher.cpp smartcard/deviceinfowatcher.h smartcard/keypairinfo.cpp smartcard/keypairinfo.h smartcard/netkeycard.cpp smartcard/netkeycard.h smartcard/openpgpcard.cpp smartcard/openpgpcard.h smartcard/p15card.cpp smartcard/p15card.h smartcard/pivcard.cpp smartcard/pivcard.h smartcard/readerstatus.cpp smartcard/readerstatus.h smartcard/utils.cpp smartcard/utils.h utils/accessibility.cpp utils/accessibility.h utils/action_data.cpp utils/action_data.h utils/applicationstate.cpp utils/applicationstate.h utils/archivedefinition.cpp utils/archivedefinition.h utils/certificatepair.h utils/clipboardmenu.cpp utils/clipboardmenu.h utils/debug-helpers.cpp utils/debug-helpers.h utils/dragqueen.cpp utils/dragqueen.h utils/email.cpp utils/email.h utils/emptypassphraseprovider.cpp utils/emptypassphraseprovider.h utils/filedialog.cpp utils/filedialog.h utils/gui-helper.cpp utils/gui-helper.h utils/headerview.cpp utils/headerview.h utils/input.cpp utils/input.h utils/iodevicelogger.cpp utils/iodevicelogger.h utils/kdpipeiodevice.cpp utils/kdpipeiodevice.h utils/keyexportdraghandler.cpp utils/keyexportdraghandler.h utils/kuniqueservice.cpp utils/kuniqueservice.h utils/log.cpp utils/log.h utils/memory-helpers.h utils/migration.cpp utils/migration.h utils/output.cpp utils/output.h utils/overwritedialog.cpp utils/overwritedialog.h utils/path-helper.cpp utils/path-helper.h utils/scrollarea.cpp utils/scrollarea.h utils/systemtrayicon.cpp utils/systemtrayicon.h utils/tags.cpp utils/tags.h utils/types.cpp utils/types.h utils/userinfo.cpp utils/userinfo.h utils/writecertassuantransaction.cpp utils/writecertassuantransaction.h utils/wsastarter.cpp utils/wsastarter.h view/anchorcache.cpp view/anchorcache_p.h view/cardkeysview.cpp view/cardkeysview.h view/htmllabel.cpp view/htmllabel.h view/infofield.cpp view/infofield.h view/keycacheoverlay.cpp view/keycacheoverlay.h view/keylistcontroller.cpp view/keylistcontroller.h view/keytreeview.cpp view/keytreeview.h view/netkeywidget.cpp view/netkeywidget.h view/nullpinwidget.cpp view/nullpinwidget.h - view/openpgpkeycardwidget.cpp - view/openpgpkeycardwidget.h view/overlaywidget.cpp view/overlaywidget.h view/p15cardwidget.cpp view/p15cardwidget.h view/padwidget.cpp view/padwidget.h view/pgpcardwidget.cpp view/pgpcardwidget.h view/pivcardwidget.cpp view/pivcardwidget.h view/progressoverlay.cpp view/progressoverlay.h view/searchbar.cpp view/searchbar.h view/smartcardactions.cpp view/smartcardactions.h view/smartcardswidget.cpp view/smartcardswidget.h view/smartcardwidget.cpp view/smartcardwidget.h view/tabwidget.cpp view/tabwidget.h view/textoverlay.cpp view/textoverlay.h view/urllabel.cpp view/urllabel.h view/waitwidget.cpp view/waitwidget.h view/welcomewidget.cpp view/welcomewidget.h aboutdata.cpp aboutdata.h kleopatra.qrc kleopatraapplication.cpp kleopatraapplication.h main.cpp mainwindow.cpp mainwindow.h systrayicon.cpp systrayicon.h kleopatra_options.h ) if(WIN32) configure_file (versioninfo.rc.in versioninfo.rc) configure_file (kleopatra.w32-manifest.in kleopatra.w32-manifest) set(_kleopatra_SRCS ${CMAKE_CURRENT_BINARY_DIR}/kleopatra.w32-manifest ${CMAKE_CURRENT_BINARY_DIR}/versioninfo.rc conf/kmessageboxdontaskagainstorage.cpp conf/kmessageboxdontaskagainstorage.h ${_kleopatra_SRCS} ) endif() set (_kleopatra_SRCS conf/kleopageconfigdialog.cpp conf/kleopageconfigdialog.h ${_kleopatra_SRCS}) ecm_qt_declare_logging_category(_kleopatra_SRCS HEADER kleopatra_debug.h IDENTIFIER KLEOPATRA_LOG CATEGORY_NAME org.kde.pim.kleopatra DESCRIPTION "kleopatra (kleopatra)" OLD_CATEGORY_NAMES log_kleopatra EXPORT KLEOPATRA ) if(KLEO_MODEL_TEST) add_definitions(-DKLEO_MODEL_TEST) set(_kleopatra_SRCS ${_kleopatra_SRCS} models/modeltest.cpp) endif() ki18n_wrap_ui(_kleopatra_SRCS dialogs/setinitialpindialog.ui newcertificatewizard/listwidget.ui ) kconfig_add_kcfg_files(_kleopatra_SRCS kcfg/emailoperationspreferences.kcfgc kcfg/fileoperationspreferences.kcfgc kcfg/settings.kcfgc kcfg/smimevalidationpreferences.kcfgc kcfg/tooltippreferences.kcfgc ) file(GLOB ICONS_SRCS "${CMAKE_CURRENT_SOURCE_DIR}/icons/*-apps-kleopatra.png") ecm_add_app_icon(_kleopatra_SRCS ICONS ${ICONS_SRCS}) add_executable(kleopatra_bin ${_kleopatra_SRCS} ${_kleopatra_uiserver_SRCS}) # For the ConfigureDialog & KCMs target_link_libraries(kleopatra_bin kcm_kleopatra_static) #if (COMPILE_WITH_UNITY_CMAKE_SUPPORT) # set_target_properties(kleopatra_bin PROPERTIES UNITY_BUILD ON) #endif() set_target_properties(kleopatra_bin PROPERTIES OUTPUT_NAME kleopatra) if (WIN32) set(_kleopatra_platform_libs "secur32") endif () target_link_libraries(kleopatra_bin Gpgmepp KPim6::Libkleo KPim6::Mime KPim6::MimeTreeParserWidgets KF6::Codecs KF6::CoreAddons KF6::Crash KF6::I18n KF6::IconThemes KF6::ItemModels KF6::KIOCore KF6::KIOWidgets KF6::WindowSystem KF6::XmlGui Qt::Network Qt::PrintSupport # Printing secret keys kleopatraclientcore ${_kleopatra_extra_libs} ${_kleopatra_mail_libs} ${_kleopatra_uiserver_extra_libs} ${_kleopatra_dbusaddons_libs} ${_kleopatra_platform_libs} ) target_link_libraries(kleopatra_bin QGpgmeQt6) install(TARGETS kleopatra_bin ${KDE_INSTALL_TARGETS_DEFAULT_ARGS}) install( PROGRAMS data/org.kde.kleopatra.desktop data/kleopatra_import.desktop DESTINATION ${KDE_INSTALL_APPDIR} ) install(FILES data/org.kde.kleopatra.appdata.xml DESTINATION ${KDE_INSTALL_METAINFODIR}) install(FILES data/kleopatra-mime.xml DESTINATION ${KDE_INSTALL_MIMEDIR}) install( PROGRAMS data/kleopatra_signencryptfiles.desktop data/kleopatra_signencryptfolders.desktop data/kleopatra_decryptverifyfiles.desktop data/kleopatra_decryptverifyfolders.desktop DESTINATION ${KDE_INSTALL_DATADIR}/kio/servicemenus ) diff --git a/src/view/openpgpkeycardwidget.cpp b/src/view/openpgpkeycardwidget.cpp deleted file mode 100644 index bcdaaa2c5..000000000 --- a/src/view/openpgpkeycardwidget.cpp +++ /dev/null @@ -1,266 +0,0 @@ -/* view/openpgpkeycardwidget.cpp - - This file is part of Kleopatra, the KDE keymanager - SPDX-FileCopyrightText: 2021, 2022 g10 Code GmbH - SPDX-FileContributor: Ingo Klöcker <dev@ingo-kloecker.de> - - SPDX-License-Identifier: GPL-2.0-or-later -*/ - -#include "openpgpkeycardwidget.h" - -#include "commands/detailscommand.h" - -#include "smartcard/card.h" -#include "smartcard/keypairinfo.h" -#include "smartcard/openpgpcard.h" - -#include <Libkleo/Compliance> -#include <Libkleo/Formatting> -#include <Libkleo/KeyCache> - -#include <KLocalizedString> -#include <KMessageBox> - -#include <QGridLayout> -#include <QLabel> -#include <QPushButton> - -#include <gpgme++/key.h> - -using namespace Kleo; -using namespace SmartCard; - -namespace -{ -struct KeyWidgets { - std::string cardKeyRef; - std::string keyFingerprint; - KeyPairInfo keyInfo; - QLabel *keyTitleLabel = nullptr; - QLabel *keyInfoLabel = nullptr; - QPushButton *showCertificateDetailsButton = nullptr; - QPushButton *generateButton = nullptr; - QPushButton *createCSRButton = nullptr; -}; - -KeyWidgets createKeyWidgets(const KeyPairInfo &keyInfo, QWidget *parent) -{ - KeyWidgets keyWidgets; - keyWidgets.keyTitleLabel = new QLabel{OpenPGPCard::keyDisplayName(keyInfo.keyRef), parent}; - keyWidgets.keyInfoLabel = new QLabel{parent}; - keyWidgets.keyInfoLabel->setTextInteractionFlags(Qt::TextBrowserInteraction | Qt::TextSelectableByKeyboard); - keyWidgets.showCertificateDetailsButton = new QPushButton{i18nc("@action:button", "Show Details"), parent}; - keyWidgets.showCertificateDetailsButton->setToolTip(i18nc("@action:tooltip", "Show detailed information about this key")); - keyWidgets.showCertificateDetailsButton->setEnabled(false); - keyWidgets.generateButton = new QPushButton{i18nc("@action:button", "Generate Key"), parent}; - keyWidgets.generateButton->setEnabled(false); - if (keyInfo.canCertify() || keyInfo.canSign() || keyInfo.canAuthenticate()) { - keyWidgets.createCSRButton = new QPushButton{i18nc("@action:button", "Create CSR"), parent}; - keyWidgets.createCSRButton->setToolTip(i18nc("@info:tooltip", "Create a certificate signing request for this key")); - keyWidgets.createCSRButton->setEnabled(false); - } - - return keyWidgets; -} -} - -class OpenPGPKeyCardWidget::Private -{ -public: - explicit Private(OpenPGPKeyCardWidget *q); - ~Private() = default; - - void setAllowedActions(Actions actions); - void update(const Card *card = nullptr); - -private: - void updateCachedValues(const std::string &openPGPKeyRef, const std::string &cardKeyRef, const Card *card); - void updateKeyWidgets(const std::string &openPGPKeyRef); - - void showCertificateDetails(const std::string &openPGPKeyRef); - -private: - OpenPGPKeyCardWidget *const q; - Actions mAllowedActions = AllActions; - std::map<std::string, KeyWidgets> mKeyWidgets; -}; - -OpenPGPKeyCardWidget::Private::Private(OpenPGPKeyCardWidget *q) - : q{q} -{ - auto grid = new QGridLayout{q}; - grid->setContentsMargins(0, 0, 0, 0); - for (const auto &keyInfo : OpenPGPCard::supportedKeys()) { - const KeyWidgets keyWidgets = createKeyWidgets(keyInfo, q); - - const std::string keyRef = keyInfo.keyRef; - connect(keyWidgets.showCertificateDetailsButton, &QPushButton::clicked, q, [this, keyRef]() { - showCertificateDetails(keyRef); - }); - connect(keyWidgets.generateButton, &QPushButton::clicked, q, [q, keyRef]() { - Q_EMIT q->generateKeyRequested(keyRef); - }); - if (keyWidgets.createCSRButton) { - connect(keyWidgets.createCSRButton, &QPushButton::clicked, q, [q, keyRef]() { - Q_EMIT q->createCSRRequested(keyRef); - }); - } - - const int row = grid->rowCount(); - grid->addWidget(keyWidgets.keyTitleLabel, row, 0, Qt::AlignTop); - grid->addWidget(keyWidgets.keyInfoLabel, row, 1, Qt::AlignTop); - - auto buttons = new QHBoxLayout; - buttons->addWidget(keyWidgets.showCertificateDetailsButton); - buttons->addWidget(keyWidgets.generateButton); - if (keyWidgets.createCSRButton) { - buttons->addWidget(keyWidgets.createCSRButton); - } - buttons->addStretch(1); - grid->addLayout(buttons, row, 2, Qt::AlignTop); - - mKeyWidgets.insert({keyInfo.keyRef, keyWidgets}); - } - grid->setColumnStretch(grid->columnCount(), 1); -} - -void OpenPGPKeyCardWidget::Private::setAllowedActions(Actions actions) -{ - mAllowedActions = actions; - update(); -} - -void OpenPGPKeyCardWidget::Private::update(const Card *card) -{ - if (card) { - updateCachedValues(OpenPGPCard::pgpSigKeyRef(), card->signingKeyRef(), card); - updateCachedValues(OpenPGPCard::pgpEncKeyRef(), card->encryptionKeyRef(), card); - updateCachedValues(OpenPGPCard::pgpAuthKeyRef(), card->authenticationKeyRef(), card); - } - updateKeyWidgets(OpenPGPCard::pgpSigKeyRef()); - updateKeyWidgets(OpenPGPCard::pgpEncKeyRef()); - updateKeyWidgets(OpenPGPCard::pgpAuthKeyRef()); -} - -void OpenPGPKeyCardWidget::Private::updateCachedValues(const std::string &openPGPKeyRef, const std::string &cardKeyRef, const Card *card) -{ - KeyWidgets &widgets = mKeyWidgets.at(openPGPKeyRef); - widgets.cardKeyRef = cardKeyRef; - widgets.keyFingerprint = card->keyFingerprint(openPGPKeyRef); - widgets.keyInfo = card->keyInfo(cardKeyRef); -} - -void OpenPGPKeyCardWidget::Private::updateKeyWidgets(const std::string &openPGPKeyRef) -{ - const KeyWidgets &widgets = mKeyWidgets.at(openPGPKeyRef); - - const auto cardSupportsKey = !widgets.cardKeyRef.empty(); - widgets.keyTitleLabel->setVisible(cardSupportsKey); - widgets.keyInfoLabel->setVisible(cardSupportsKey); - widgets.showCertificateDetailsButton->setVisible(cardSupportsKey); - widgets.generateButton->setVisible(cardSupportsKey && (mAllowedActions & Action::GenerateKey) && !DeVSCompliance::isActive()); - if (widgets.createCSRButton) { - widgets.createCSRButton->setVisible(cardSupportsKey && (mAllowedActions & Action::CreateCSR)); - } - if (!cardSupportsKey) { - return; - } - - widgets.showCertificateDetailsButton->setEnabled(false); - - if (widgets.keyFingerprint.empty()) { - widgets.keyInfoLabel->setTextFormat(Qt::RichText); - widgets.keyInfoLabel->setText(i18nc("@info", "<em>No key</em>")); - widgets.generateButton->setText(i18nc("@action:button", "Generate Key")); - widgets.generateButton->setToolTip(i18nc("@info:tooltip", "Generate a key for this card slot")); - if (widgets.createCSRButton) { - widgets.createCSRButton->setEnabled(false); - } - } else { - QStringList lines; - if (widgets.keyFingerprint.size() >= 16) { - const std::string keyid = widgets.keyFingerprint.substr(widgets.keyFingerprint.size() - 16); - const auto subkeys = KeyCache::instance()->findSubkeysByKeyID({keyid}); - if (subkeys.empty() || subkeys[0].isNull()) { - widgets.keyInfoLabel->setTextFormat(Qt::RichText); - lines.push_back(i18nc("@info", "<em>Public key not found locally</em>")); - widgets.keyInfoLabel->setToolTip({}); - } else { - // force interpretation of text as plain text to avoid problems with HTML in user IDs - widgets.keyInfoLabel->setTextFormat(Qt::PlainText); - QStringList toolTips; - toolTips.reserve(subkeys.size()); - for (const auto &sub : subkeys) { - // Yep you can have one subkey associated with multiple primary keys. - const GpgME::Key key = sub.parent(); - toolTips << Formatting::toolTip(key, Formatting::Validity | Formatting::ExpiryDates | Formatting::UserIDs | Formatting::Fingerprint); - const auto uids = key.userIDs(); - for (const auto &uid : uids) { - lines.push_back(Formatting::prettyUserID(uid)); - } - } - widgets.keyInfoLabel->setToolTip(toolTips.join(QLatin1StringView("<br/>"))); - widgets.showCertificateDetailsButton->setEnabled(true); - } - } else { - widgets.keyInfoLabel->setTextFormat(Qt::RichText); - lines.push_back(i18nc("@info", "<em>Invalid fingerprint</em>")); - } - - const QString fingerprint = widgets.keyInfoLabel->textFormat() == Qt::RichText - ? Formatting::prettyID(widgets.keyFingerprint.c_str()).replace(QLatin1Char(' '), QLatin1StringView(" ")) - : Formatting::prettyID(widgets.keyFingerprint.c_str()); - lines.insert(0, fingerprint); - const auto lineSeparator = widgets.keyInfoLabel->textFormat() == Qt::PlainText ? QLatin1StringView("\n") : QLatin1String("<br>"); - widgets.keyInfoLabel->setText(lines.join(lineSeparator)); - - widgets.generateButton->setText(i18nc("@action:button", "Regenerate Key")); - widgets.generateButton->setToolTip(i18nc("@info:tooltip", "Generate a new key for this card slot replacing the existing key")); - if (widgets.createCSRButton) { - widgets.createCSRButton->setEnabled(DeVSCompliance::algorithmIsCompliant(widgets.keyInfo.algorithm)); - } - } - - widgets.generateButton->setEnabled(!widgets.generateButton->isHidden()); -} - -void OpenPGPKeyCardWidget::Private::showCertificateDetails(const std::string &openPGPKeyRef) -{ - const KeyWidgets &widgets = mKeyWidgets.at(openPGPKeyRef); - - if (widgets.keyFingerprint.size() >= 16) { - const std::string keyid = widgets.keyFingerprint.substr(widgets.keyFingerprint.size() - 16); - const auto subkeys = KeyCache::instance()->findSubkeysByKeyID({keyid}); - if (!subkeys.empty() && !subkeys[0].isNull()) { - auto cmd = new Commands::DetailsCommand(subkeys[0].parent()); - cmd->setParentWidget(q); - cmd->start(); - return; - } - } - KMessageBox::error(q, i18nc("@info", "Sorry, I cannot find the key with fingerprint %1.", Formatting::prettyID(widgets.keyFingerprint.c_str()))); -} - -OpenPGPKeyCardWidget::OpenPGPKeyCardWidget(QWidget *parent) - : QWidget{parent} - , d{std::make_unique<Private>(this)} -{ - connect(KeyCache::instance().get(), &KeyCache::keysMayHaveChanged, this, [this]() { - d->update(); - }); -} - -OpenPGPKeyCardWidget::~OpenPGPKeyCardWidget() = default; - -void OpenPGPKeyCardWidget::setAllowedActions(Actions actions) -{ - d->setAllowedActions(actions); -} - -void OpenPGPKeyCardWidget::update(const Card *card) -{ - d->update(card); -} - -#include "moc_openpgpkeycardwidget.cpp" diff --git a/src/view/openpgpkeycardwidget.h b/src/view/openpgpkeycardwidget.h deleted file mode 100644 index cb20577ea..000000000 --- a/src/view/openpgpkeycardwidget.h +++ /dev/null @@ -1,53 +0,0 @@ -/* view/openpgpkeycardwidget.h - - This file is part of Kleopatra, the KDE keymanager - SPDX-FileCopyrightText: 2021, 2022 g10 Code GmbH - SPDX-FileContributor: Ingo Klöcker <dev@ingo-kloecker.de> - - SPDX-License-Identifier: GPL-2.0-or-later -*/ -#pragma once - -#include <QWidget> - -#include <memory> - -namespace Kleo -{ - -namespace SmartCard -{ -class Card; -} - -class OpenPGPKeyCardWidget : public QWidget -{ - Q_OBJECT -public: - enum Action { - NoAction = 0x00, - CreateCSR = 0x01, - GenerateKey = 0x02, - AllActions = CreateCSR | GenerateKey, - }; - Q_DECLARE_FLAGS(Actions, Action) - - explicit OpenPGPKeyCardWidget(QWidget *parent = nullptr); - ~OpenPGPKeyCardWidget() override; - - void setAllowedActions(Actions actions); - -public Q_SLOTS: - void update(const SmartCard::Card *card); - -Q_SIGNALS: - void createCSRRequested(const std::string &keyRef); - void generateKeyRequested(const std::string &keyRef); - -private: - class Private; - std::unique_ptr<Private> d; -}; -} - -Q_DECLARE_OPERATORS_FOR_FLAGS(Kleo::OpenPGPKeyCardWidget::Actions)