diff --git a/CMakeLists.txt b/CMakeLists.txt index fb69f9a0..3c462d39 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,287 +1,288 @@ cmake_minimum_required(VERSION 3.0 FATAL_ERROR) # KDE Application Version, managed by release script set (KDE_APPLICATIONS_VERSION_MAJOR "18") set (KDE_APPLICATIONS_VERSION_MINOR "07") set (KDE_APPLICATIONS_VERSION_MICRO "70") set (KDE_APPLICATIONS_VERSION "${KDE_APPLICATIONS_VERSION_MAJOR}.${KDE_APPLICATIONS_VERSION_MINOR}.${KDE_APPLICATIONS_VERSION_MICRO}") project(kgpg VERSION ${KDE_APPLICATIONS_VERSION}) set(QT_MIN_VERSION "5.5.0") find_package(ECM 5.21 REQUIRED NO_MODULE) set(CMAKE_MODULE_PATH ${ECM_MODULE_PATH} ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake/") include(ECMAddAppIcon) include(ECMInstallIcons) include(KDEInstallDirs) include(KDECMakeSettings) include(KDECompilerSettings NO_POLICY_SCOPE) include(FeatureSummary) include(ECMSetupVersion) include(CMakeFindDependencyMacro) find_package(Qt5 ${QT_MIN_VERSION} CONFIG REQUIRED COMPONENTS Core DBus Gui PrintSupport Widgets ) # Load the frameworks we need find_package(KF5 5.28 REQUIRED Archive DocTools Codecs CoreAddons Crash DBusAddons I18n IconThemes JobWidgets KIO Notifications Service TextWidgets XmlGui WidgetsAddons WindowSystem ) # kdepimlibs find_package(KF5 REQUIRED AkonadiContact Contacts ) # only headers are used find_package(Gpgme REQUIRED) add_definitions(-DQT_NO_URL_CAST_FROM_STRING) add_subdirectory( icons ) add_subdirectory( doc ) include_directories( ${KDEPIMLIBS_INCLUDE_DIR} ${GPGME_INCLUDES} ) option(KGPG_DEBUG_TRANSACTIONS "show commands and results of gpg calls in debug log" Off) set(core_SRCS core/convert.cpp core/images.cpp core/emailvalidator.cpp core/kgpgkey.cpp core/KGpgExpandableNode.cpp core/KGpgKeyNode.cpp core/KGpgGroupMemberNode.cpp core/KGpgGroupNode.cpp core/KGpgNode.cpp core/KGpgOrphanNode.cpp core/KGpgRefNode.cpp core/KGpgRootNode.cpp core/KGpgSignableNode.cpp core/KGpgSignNode.cpp core/KGpgSubkeyNode.cpp core/KGpgUatNode.cpp core/KGpgUidNode.cpp ) set(kgpg_editor_SRCS editor/kgpgmd5widget.cpp editor/kgpgeditor.cpp editor/kgpgtextedit.cpp ) set(kgpg_model_SRCS model/gpgservermodel.cpp model/kgpgitemmodel.cpp model/groupeditproxymodel.cpp model/keylistproxymodel.cpp model/kgpgsearchresultmodel.cpp model/selectkeyproxymodel.cpp ) set(kgpg_transaction_SRCS transactions/kgpgtransaction.cpp transactions/kgpgtransactionjob.cpp transactions/kgpgtransactionprivate.cpp transactions/kgpguidtransaction.cpp transactions/kgpgeditkeytransaction.cpp transactions/kgpgsigntransactionhelper.cpp transactions/kgpgchangedisable.cpp transactions/kgpgchangeexpire.cpp transactions/kgpgchangepass.cpp transactions/kgpgchangetrust.cpp transactions/kgpgdelsign.cpp transactions/kgpgdeluid.cpp transactions/kgpgencrypt.cpp transactions/kgpgexport.cpp transactions/kgpgaddphoto.cpp transactions/kgpgadduid.cpp transactions/kgpggeneratekey.cpp transactions/kgpggeneraterevoke.cpp transactions/kgpgdecrypt.cpp transactions/kgpgdelkey.cpp transactions/kgpgimport.cpp transactions/kgpgkeyservertransaction.cpp transactions/kgpgkeyservergettransaction.cpp transactions/kgpgkeyserversearchtransaction.cpp transactions/kgpgprimaryuid.cpp transactions/kgpgsendkeys.cpp transactions/kgpgsignkey.cpp transactions/kgpgsigntext.cpp transactions/kgpgsignuid.cpp transactions/kgpgtextorfiletransaction.cpp transactions/kgpgverify.cpp ) set(kgpg_SRCS ${core_SRCS} ${kgpg_editor_SRCS} ${kgpg_model_SRCS} ${kgpg_transaction_SRCS} selectpublickeydialog.cpp selectsecretkey.cpp kgpgoptions.cpp keysmanager.cpp kgpg.cpp kgpg_debug.cpp kgpgkeygenerate.cpp kgpginterface.cpp kgpgtextinterface.cpp gpgproc.cpp klinebufferedprocess.cpp klinebufferedprocessprivate.cpp keyservers.cpp detailedconsole.cpp keyinfodialog.cpp newkey.cpp keyexport.cpp conf_encryption.cpp kgpgrevokewidget.cpp keytreeview.cpp groupedit.cpp sourceselect.cpp kgpgchangekey.cpp kgpgfirstassistant.cpp kgpgexternalactions.cpp selectexpirydate.cpp caff.cpp foldercompressjob.cpp ) set(kgpg_HDRS caff.h caff_p.h conf_encryption.h detailedconsole.h foldercompressjob.h gpgproc.h groupedit.h keyexport.h keyinfodialog.h keyservers.h keysmanager.h keytreeview.h kgpg.h kgpgchangekey.h kgpgexternalactions.h kgpgfirstassistant.h kgpginterface.h kgpgkeygenerate.h kgpgoptions.h kgpgrevokewidget.h kgpgtextinterface.h kgpg_debug.h klinebufferedprocess.h newkey.h selectexpirydate.h selectpublickeydialog.h selectsecretkey.h sourceselect.h ) qt5_add_dbus_adaptor( kgpg_SRCS org.kde.kgpg.Key.xml keysmanager.h KeysManager) qt5_add_dbus_interface(kgpg_SRCS org.kde.kgpg.Key.xml kgpg_interface ) ki18n_wrap_ui(kgpg_SRCS adduid.ui conf_gpg.ui searchres.ui groupedit.ui conf_ui2.ui conf_servers.ui conf_misc.ui newkey.ui keyexport.ui conf_encryption.ui kgpgKeyInfo.ui kgpgkeygenerate.ui kgpgrevokewidget.ui keyserver.ui conf_decryption.ui sourceselect.ui ) file(GLOB ICONS_SRCS "${CMAKE_CURRENT_SOURCE_DIR}/*-apps-kgpg.png") ecm_add_app_icon(kgpg_SRCS ICONS ${ICONS_SRCS}) kconfig_add_kcfg_files(kgpg_SRCS kgpgsettings.kcfgc ) add_library(kgpg_lib STATIC ${kgpg_SRCS} ${kgpg_HDRS}) add_executable(kgpg main.cpp) target_link_libraries(kgpg kgpg_lib) if (KGPG_DEBUG_TRANSACTIONS) set_property(SOURCE ${kgpg_transaction_SRCS} APPEND PROPERTY COMPILE_DEFINITIONS "KGPG_DEBUG_TRANSACTIONS") endif (KGPG_DEBUG_TRANSACTIONS) set_property(SOURCE main.cpp APPEND PROPERTY COMPILE_DEFINITIONS "KGPG_VERSION=\"${KDE_APPLICATIONS_VERSION}\"") target_link_libraries(kgpg_lib KF5::AkonadiContact KF5::Archive KF5::Codecs KF5::Contacts KF5::CoreAddons KF5::Crash KF5::DBusAddons KF5::I18n KF5::IconThemes KF5::JobWidgets KF5::KIOCore KF5::KIOFileWidgets KF5::KIOWidgets KF5::Notifications KF5::Service KF5::TextWidgets KF5::XmlGui KF5::WidgetsAddons KF5::WindowSystem Qt5::PrintSupport ) +add_subdirectory(tests) install(TARGETS kgpg ${INSTALL_TARGETS_DEFAULT_ARGS} ) ########### install files ############### install( FILES editor/kgpgeditor.rc keysmanager.rc DESTINATION ${KXMLGUI_INSTALL_DIR}/kgpg) install( FILES tips DESTINATION ${DATA_INSTALL_DIR}/kgpg) install( PROGRAMS org.kde.kgpg.desktop DESTINATION ${XDG_APPS_INSTALL_DIR}) install( FILES org.kde.kgpg.appdata.xml DESTINATION ${KDE_INSTALL_METAINFODIR}) install( FILES kgpg.kcfg DESTINATION ${KCFG_INSTALL_DIR}) install( FILES org.kde.kgpg.desktop DESTINATION ${AUTOSTART_INSTALL_DIR} ) install( FILES encryptfile.desktop encryptfolder.desktop viewdecrypted.desktop DESTINATION ${SERVICES_INSTALL_DIR}/ServiceMenus) install( FILES org.kde.kgpg.Key.xml DESTINATION ${DBUS_INTERFACES_INSTALL_DIR}) ecm_install_icons(ICONS 16-apps-kgpg.png 22-apps-kgpg.png 32-apps-kgpg.png 48-apps-kgpg.png 64-apps-kgpg.png 128-apps-kgpg.png sc-apps-kgpg.svg DESTINATION ${KDE_INSTALL_ICONDIR} THEME hicolor ) feature_summary(WHAT ALL INCLUDE_QUIET_PACKAGES FATAL_ON_MISSING_REQUIRED_PACKAGES) diff --git a/tests/.gnupg/gpg.conf b/tests/.gnupg/gpg.conf new file mode 100644 index 00000000..e6ff1e85 --- /dev/null +++ b/tests/.gnupg/gpg.conf @@ -0,0 +1,5 @@ +# Config file created by KGpg + + +keyserver hkp://pool.sks-keyservers.net + diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt new file mode 100644 index 00000000..15458cf5 --- /dev/null +++ b/tests/CMakeLists.txt @@ -0,0 +1,42 @@ +find_package(Qt5Test REQUIRED) +set(test_LIBS kgpg_lib Qt5::Test) + +set(COMMON common.h common.cpp) + +function(create_test name) + add_executable(${name} ${ARGN} ${COMMON}) + target_link_libraries(${name} ${test_LIBS}) + add_test(NAME ${name} COMMAND ${name}) + set_property(TEST ${name} PROPERTY ENVIRONMENT + "XDG_CONFIG_HOME=${CMAKE_BINARY_DIR}/tests") + set_property(TEST ${name} PROPERTY RUN_SERIAL TRUE) #since gpg config home is shared between each test + add_dependencies(${name} test-data) +endfunction() + +create_test(kgpg-import kgpgimport.h kgpgimport.cpp) + +set(GpgConf .gnupg/gpg.conf) +set(KgpgConf kgpgrc) +set(Keys + keys/kgpgtest_BA7695F3C550DF14.asc + keys/kgpgtest_BA7695F3C550DF14.pass + keys/kgpgtest_BA7695F3C550DF14_pub.asc + keys/signed_bad_sig + keys/signed_text + keys/encrypted_text.txt + keys/encrypted_text_hide_key_id.txt +) + +add_custom_target(test-data) +add_custom_command(TARGET test-data PRE_BUILD + COMMAND ${CMAKE_COMMAND} -E + copy_directory ${CMAKE_SOURCE_DIR}/tests/.gnupg ${CMAKE_BINARY_DIR}/tests/gnupg) + +add_custom_command(TARGET test-data PRE_BUILD + COMMAND ${CMAKE_COMMAND} -E + copy_directory ${CMAKE_SOURCE_DIR}/tests/keys ${CMAKE_BINARY_DIR}/tests/keys) + +add_custom_command(TARGET test-data PRE_BUILD + COMMAND ${CMAKE_COMMAND} -E + copy ${CMAKE_SOURCE_DIR}/tests/kgpgrc + ${CMAKE_BINARY_DIR}/tests/kgpgrc) diff --git a/tests/common.cpp b/tests/common.cpp new file mode 100644 index 00000000..4dd6ab96 --- /dev/null +++ b/tests/common.cpp @@ -0,0 +1,70 @@ +#include "common.h" +#include "../kgpginterface.h" +#include "../kgpgsettings.h" + +#include +#include +#include +#include +#include +#include +#include + +bool resetGpgConf() +{ + const QString dot_gpg(QLatin1String(".gnupg")); + QDir dir(dot_gpg); + dir.removeRecursively(); + if (!QDir::current().mkdir(dot_gpg)) + return false; + if (!QFile::setPermissions(QDir::currentPath() + QLatin1Char('/') + dot_gpg, + QFileDevice::ReadOwner | QFileDevice::WriteOwner | + QFileDevice::ExeOwner)) + return false; + return QFile::copy(QLatin1String("gnupg/gpg.conf"), QLatin1String(".gnupg/gpg.conf")); +} + +QString readFile(const QString &filename) +{ + QFile file(filename); + file.open(QIODevice::ReadOnly); + return QLatin1String(file.readAll()); +} + +void addGpgKey(const QString &file, const QString &password) +{ + QString conf = QLatin1String(".gnupg/gpg.conf"); + QString gpgHome = QLatin1String(".gnupg"); + QString command = QLatin1String("gpg"); + QStringList args; + args.push_back(QLatin1String("--no-secmem-warning")); + args.push_back(QLatin1String("--no-tty")); + args.push_back(QLatin1String("--batch")); + if (!password.isEmpty()) { + args.push_back(QLatin1String("--passphrase")); + args.push_back(password); + } + args.push_back(QLatin1String("--options")); + args.push_back(conf); + args.push_back(QLatin1String("--homedir")); + args.push_back(gpgHome); + args.push_back(QLatin1String("--debug-level")); + args.push_back(QLatin1String("none")); + args.push_back(QLatin1String("--status-fd=1")); + args.push_back(QLatin1String("--import")); + args.push_back(QLatin1String("--allow-secret-key-import")); + args.push_back(QLatin1String("--command-fd=0")); + args.push_back(file); + QProcess process; + process.execute(command, args); + qDebug() << "Added Gpg key: " << file; +} + +void addPasswordArguments(KGpgTransaction *transaction, QString passphrase) +{ + transaction->addArgument(QLatin1String("--batch")); + transaction->addArgument(QLatin1String("--passphrase")); + transaction->addArgument(passphrase); + transaction->addArgument(QLatin1String("--pinentry-mode")); + transaction->addArgument(QLatin1String("loopback")); +} diff --git a/tests/common.h b/tests/common.h new file mode 100644 index 00000000..d274a0fd --- /dev/null +++ b/tests/common.h @@ -0,0 +1,12 @@ +#ifndef COMMON_TEST_H +#define COMMON_TEST_H +#include "../transactions/kgpgtransaction.h" + +#include +#include + +bool resetGpgConf(); +QString readFile(const QString& filename); +void addGpgKey(const QString& file, const QString& password = QString()); +void addPasswordArguments(KGpgTransaction *transaction, QString passphrase); +#endif diff --git a/tests/keys/encrypt_text.txt b/tests/keys/encrypt_text.txt new file mode 100644 index 00000000..4290781d --- /dev/null +++ b/tests/keys/encrypt_text.txt @@ -0,0 +1,21 @@ +-----BEGIN PGP MESSAGE----- + +hQEMA3iCxhUhDxAiAQf/fRlqyVeN7KbMjQ78S6ZDKmq9sTli4//YOVwkEtb7Qd3P +GsFM1qCqc029eTdAj+PTtJNRIYAtrWoNi5OTVOAwctYvOpM+dlO9Tiuz/ZCHUNrH +OiCdI2SFg+Ga8q4geptahcPtFu4mxyeVbY73KE3R7aH1iDX8FMArIM1V5goldpaS +Jslmnx7z4tJy3DTteO7dbdHw9aN4f3GeT7Ql0Mbquc/dd2OnVbDnyHgNrHv4pxwp +0Wn8CszNPLFoQ8n/cg35PddqmqzvEKuurREG17LmS8XKC64LXbkvYanC/wAzrk0L +n+M5r78gh7NAy6JkB5gZjaDWoWbKI4ricaD9O62UbtLBPwGfPATn/viANrKYxKf3 +gcWmpQAKY2r7HztQRkGvK8ON5iqlF3neK9j4C9Um2vgPgXvY2nFdPK/WqnbDIF1E +up5yEsF4mVR/sOY2YuRvIDePjMfDGDi7mliDo8356441ahbQxHisqDyyzWeywRBK +O2+d7duJ8WPhl0IENtafGR31DYu/GscdrSFxoVuNsuJuTHLFHlV5LhtJXHfl4dv9 +TCM8JjrVyVD6ElppN+TqLoVgTQalZi9lh1F1u4M+5JZwsjqEwELj34TVWxVM9A8Z +IKdYKQ4vqfC2SAkDcbTOK2KKmS/edaaEs/Oe4QndvVzykzKTsk1XLJ0AwuV1pUSf +yK9Ge08JYfv7jFpj9aD2nBldtftwBLTIJ7amLAX0efhats0ToUFoiK0Dm4V/0CtA +ApFbBoKSR2npmhQznN2UxN2xDfryCNxCsvif5X8hMOLb9QskXIit5Q0jQhU1TueM +RSTS6dDnWoXpTiGAU+7APD3vfyc8tOuOmIS6WfVEusSPXzdDD37iWBW5bwoeZfkr ++8426MNjHBvMfCYFvAlTOkZL/VJC3kOk/DhDMwN3x4egIHjgolPNjy3BCsUN0Rht +rbqtl1nX5qP+XwNitgHNvJf4Gen5WbL9RUWGQnkqUVCyO4DkOrAWdWVC7bDFKLIS +qKelYnUBlgSlt9CIj/F3ON4= +=8OcA +-----END PGP MESSAGE----- diff --git a/tests/keys/encrypt_text_hide_key_id.txt b/tests/keys/encrypt_text_hide_key_id.txt new file mode 100644 index 00000000..6f5b476d --- /dev/null +++ b/tests/keys/encrypt_text_hide_key_id.txt @@ -0,0 +1,30 @@ +-----BEGIN PGP MESSAGE----- + +hQEMAwAAAAAAAAAAAQgAzcczjeNj2wW7O6bzDNCKsiFxBxQXiFmYZmb+0ejSj5OR +k9NIDE8bvB4O4vPLmHDfiv1oo0B+me16alhkU6ulVYDMLHzW7aMFGd/gATqeV+KZ +rI3YifZWf1DS7gTl8FJbeitH2glywgdMtxA6x5bEBBOf/68boqosI6aj4qh4qxSA +QyjNPqeux3eTJq2/XN//CMka71Qc2cWCh/A//To+KQ0kIFIOe+pSQSVAPrjiuBBB +3ZimPtHQeZEm3Otvmhy7tj1/EW6V0+szszXCc2B6va8eajimX7gAlX90QdqetkuX +1k6Hp5xagagXcZk+nhkfM+FGn70JfIZi7TtEb58kwtLpAdNL/OFm9zaBz0z2m9Dl +ktLAbudxLVKVqmPc3DaTLjLsULYE8/2XKU9dvYXsXCgn/RgosQGQRTfPCoSU4wgR +YzLkBlrOBiHZlGETtVwAHFCiUZEtCcBDWpejEtxiEQKa5AAfXlugwFEpt5g67MHk +kqEJ/gP2G1RWnAy4pEteuwxHfKKM46WWbsbWR6QmJuW5v7PEb0eYB0GWwhqAK9GD +sgZClQSyhdrvRd2BmZb+LNjZtaTJIabou3j+WFvWxswQLJkLK5O2Kziu+rxr2KNa +tay17PPiKttYR0B/97NXGyYgfDjIX/WF47qU2nCz6+v3d+NzrOgvzk0ar+Oco2EQ +ZxchaMEQqSC6+WM/AQsVL4t36l55pu1ur8UnejBrqeZzD0l4c3vCue9W8Ca7hee+ +AAkNMZzNih2rz858+LIbYqnbZ0PTtk4pI6PB7dDw2EaJpDGTy9XXyX3UPhcHf8ZY +wrGKrh0kBZmg55QcG2iXQntdd/CDcM2ctYiaRdp7idy656wDS5JFF1yei4jx8vuR +3tv36vfvkLgFligebIRwd8faKRW8yeF4zk/YfQdWl1FRfzpZOgbJPgbZb9Ijtafd +izPGJDHR0ZmCDNQGez8WFbqgF+FtYwEiUCoAa8q2g+EwJwiPmd1+ORFZplnCXFrr +JvwacxEuf8cscmLiFSEqvAbA6+A5J0U5K6aZSLrFXpCeYDhh3I8At/oq9oaIVRN1 +ZS+GaGQ3Ca78rsCmjiihKwCakt2zMidQeVZi9i6pPw/H6tB3ZF0hsBh1slJbsPjM +hdWFfxHJ+tVF0BXDddz5VzypBAOJaptRAf24UseRMuymhlpHfai3/DeGw+CUNeDZ +uo33UHnTwHLxFp/Xqj6DCb9OllItmvWq6THNxHxKd/r5Y2O95pHY7PalT2foeBzI +LMSZsZWI2FVXlRDO0ZLoOeREX3prbLu7upw+PLPnYL6X8YZ7q+TdHfltih3Qc/ZV +lefLPiUwv4AHREG1aEeSjMiFBVXXPbQvL/oY3MAB4ac45kjbcAXiqEmzJw0Am4bg +FkY4JACwzK1X3rwtPE4OBTGSQYjiXfepQx5i/JQvDVfM4PAnIZfjW+er8G2SNGHT +RjiWkdGQ/icE6PqBTJ1VeWFM8Km5DkFzyLQDqxK8T/Y0i4C0+U/CiaM+Kdb8+mXt +TgyNOk1fwbpPa3dIts7awiPNQ2Au3PEDVpkCm2FgC3gRjOBrIqp66/Fd3I2vf83J +trP7+jCtxBPnshPje9A= +=QhdL +-----END PGP MESSAGE----- diff --git a/tests/keys/kgpgtest_BA7695F3C550DF14.asc b/tests/keys/kgpgtest_BA7695F3C550DF14.asc new file mode 100644 index 00000000..835cfec9 --- /dev/null +++ b/tests/keys/kgpgtest_BA7695F3C550DF14.asc @@ -0,0 +1,65 @@ +-----BEGIN PGP PRIVATE KEY BLOCK----- + +lQPGBFr4YXABCAC0tfZ4ay6qv+PwPKi/I5lJvl6PkN7LIqf3ggEOQyTdp18I/iyc +8bzL7AKPFsqsnLai5D37GUcZSFVXcROlvZRD2L10bC9VA8MrfbOqONJITKHdTc5p +2QH27obb/FtPgrbU/5bXFxX8yI7WI6cFvqrhfElziUXgEtpUzrobpEdJ+T1dYFWd +pKWEpQ7nX3TCxb8ditz28dI/1xZux0Hav7XAEY7fBoqNQ5UKIYuXrEU5MDtG5ovU +KHSbUEqR1NxZPCfVCtf7faURlweEde/psnXj7ZlGmibRMD5zG5dh6JS53dvR+afo +PuRlmABWWNeMeZtoTTaNrnNMpcTsFmFduQrtABEBAAH+BwMCgw9YYs6aUon/M2pn +1W+mcBp+/vTWxDjZU5au2Q8IoanrHs7dGzYdZTDTHAbTALL7PfIGSEOZKJ8H/vKj +VtQxyDGPxFI7d1coC3mZ2YLEHjIsfl8hC4VW7MNsEmYAkvw2Kf4e1/UpgoAtdg6Y +yjgrSBNJVOSs4uL3husFm/1+iEhZJ0r2UhYrB3X/A0fal5L/LQe+jHxR739mfEIS +WKanNbyaeacK0NMEz5n9frbJ7aEtSmtuWACvqKIwvQAC3u+KblM/+KA20FBZVXeT +2aHHZAPgsnDflIXcTw+yGIjhASmBKsMXoF/fiQM/CeXycNPoccmxiVSPmo7ktUFI ++eNhfhb+UBfQ1OAQHPP0wPKrmJe/LdWqw1zLhEpw6bI18LwBNhIpYAHWxTiX9vDa +GZ1e121v5CB1rIPK3cM/GPUolsWcSKOdf9xDz2P2SPj5Py3aZrltafJpyUve45HW +NGvS+4otLQE4lGUzcQ8sy2778kVwOLoutVLdtcGLdx3+jh8fXy+Yd8/kkyF/aFcZ +9ssLewauTxnrx5U6Kdok9lPoEOEjaXy0d4lfq4l5L/EAdnBUJinzIYCFG7lFmrfm +SwWyzjziS+2z4tSLVfEANudu6Xfe2Y8Gb1CmApUywvr+FHFCk/EuMpI07wlg3Nod +3bBfJRvgBU2CK6/9fBrkiJm0tpeXoHlu1HldDOn/BNqf0/2wTV3gp3S3v70qiT8d +RDtm40tEJcitBAOIKL0G/Qj/RbqF7pQQgjuwhZvSk3k/nMSIQFN924fm1lmwL0HI +oZW1FCLuNFLEOJjUvLXRk2K67ZNiPyY8b3eHwrnk8ogYUp9Jmi1aD4ZiJJC5k81b +qmAqcF++JttCDqR9/+VIORuFyThZRyrpokNQ7tJT4gnBTqykMWlCgjgm5z9z34sD +pmktGpylgnRWtAlUZXN0IEtHcGeJAU4EEwEKADgWIQT7rwjdfZ0JIcFd2p+6dpXz +xVDfFAUCWvhhcAIbLwULCQgHAgYVCgkICwIEFgIDAQIeAQIXgAAKCRC6dpXzxVDf +FA1tCACcHRH5uyu+wO5elvpxVdkKnDj376x69BgO9MQY4fwdjr97Mb8jZHDJtGt3 +m/QiEgRT5o7npa9BL9XvCUhIS7WaphVoTE+HOJctuUjplorzFefNEef54twnB3JA +5K1QgPNCbAKEf7gC1bkkZE1rdy56+eErw5dsPInHO51rC2ze+Sh6ia5E8dLfm7kd +utbiORm6DUGYlveBlMnW72vp1f2TSWoiT0AiEy8COCC41T6P5kDa/ssWFw5h37DV +ehYNKSvaZItIFj7KxBwwpb4CiX9Y4I0SZdC/PIRbZ2UMU0OoPRXr4xTphpam3QO1 +3lUM7jbNNiQdnpxwKMLtYM+onnnpnQPGBFr4YXABCADSHuJe5gFUZvp5qCeGTts9 +BQCP3yy+AXsnvgH4C3hwijnOySKinEB6iVjTKHoWkbA31Lyt9R/mAPqDnEdqmBka +QuowRMop4xRdeYzpEqnXxAu8ayqqO7Dnjo/N75rLdpOIvVBGyw++lL8rt1zP1Y2e +ysEqChGfMM8RAzRhPzFHmyXSfA2pHLGwHJCAI29rdb0/7O/HgpGWUNAX79XxXjGz +oM17kdxOBOsLv/vRohMd3IczNCNCRcKMsQUbOhIPSeipbUfHOVeKmBgABeXpjL2A +maosRFJJEiWJ5Zt/+VSzdR2caVnMQEyHsJ9Y8Y2374Z/4YnazF5D7HsOGlnZA+Rb +ABEBAAH+BwMCpVMZ2BgxjN//E0JEdjpnmNKXGV/lihJmF29zba6yZ3KLpLvquMsv +dVsXjr1RZ4s1ADXdepptZD6L4RHsYKmHe9bz/WAT0ip0b/UI/xTLC842NS1xFemF +wU9LD3oVh1s0DW2DdNdLGAdsVf545k9zqASzLktvu9WzQ4cgAO1oZ1srj9z8SyyO +Q6axAftmlN9tiVkvI1s5jbygeDdor+93qNxOMIKYMjHpIFS0K5Xd8/oFKk7nNzp3 +UzxcYoisTnP9xF8WleVdJjca8jFnwEADNYEtaYpYu1y2gPxuxY1anuxjoJ0frvH7 +JmWftuMU38WMobiDqo4s3dM104gQ/BnlQ8R7kQDyav9prMOrxFC8sF8Aae/jKxCS +SkaGttp5zy0qjqEwAMetLAHsgpZDtFuMlsHlevg0kLOToudISp67ZCaWKZlrkAyo +HiN59imf/jkJpVLO9Eh1u6EVF4VMWzmPL9l4HAM5LuEJLb2ybyQWz+noJJhb1eav +Dp8jGqkFMDt/kgSScnEGIQUBSvBnm8SVt/MQSU1Y72vH7aVAwp1De02jQwNbt7y8 +xODJzyvLghtIHoizH71ssoI+7xY2VJpqEVQmkK/D+u3aCxIAlfeWTgD7sv1+E8GT +IR6bFCQZeBOo1zVNi79rKrIIldM5w/7Q9Oc9/+xxECnBwGpzMdxyYHj/GB1u5RMj +dyQEBiW8uQuAWaiCDpNIcQyYdAMWhGpQdKND2FxyPdh0AG5EgPVnRBNanXWttU8r +N+cc7ph8u1x/QR9jFyyPqPQaZ1wztzcuI9Bli/Ns6djwDSQMJTe4OGhbYU8JTLpX +JuCWKidq+O3+Yu2c7/qxi1gG6wj6TigkSrXngV1G2p3GCL9QmFpaVAAVfp7XJObB +Gd5YGWf0kqyf4q7sqJlEUYmG+PeTdS97s/sM09PViQJsBBgBCgAgFiEE+68I3X2d +CSHBXdqfunaV88VQ3xQFAlr4YXACGy4BQAkQunaV88VQ3xTAdCAEGQEKAB0WIQSW +IYw9SNNAPY6K7Bh4gsYVIQ8QIgUCWvhhcAAKCRB4gsYVIQ8QIg7OB/97Vl3rIpIB +nsYo+0pDt8Nm6zYC9RgV2i8oRsMUCucejKfhVxSmIFqAPztWhyNGWwahiLvhIWvx +UVh+DOkwmEGm5TEZOYHug0QBVPsAQ7N0Kkqz2QwtX5JtcDbuT9J4OxfJHYsUKQPn +GCQdh9e2j8DzK/sAn/iOaCSsiR+/ZyokScWM6IMRllx4LTHuiGwvFhgObZNvTl+M +lp/3TxtBEqrhHvEmmVno0yD2XDGNkq/CuX0x2jAiL5YEp3kSRjed0YfAjbqsDdxQ +OrIk/eARbviAcg/ryaqWJEecNakql4VXq+oS0LveCfswdd5+QwaRU6ikrcd/GmTV +LilodJPmu128Z2YIAJVnIxWQBVtd6McCrNQ5DVqBtnpzikUXe2XALELZIrJz8y+P +CvAlZ64OSpom2vLnFrSURxPkrhEol9P8YTPCmbGZiKcNmzWrcCWT4XySlKKDpJ2U +oQhIrnX91zV2GXe1FkOcJeA9U34Zzwkm6AfICosd4ILSdnfrS3a1KXhfNVZMb0KC +1d6DIyGCe0eyWT9VppvUyadqOFwpqqBvwuHrZOQgvkB15YBXZjTH/ngBlsCkrXel +tCEk4x0pH+BBWvtazJ3e5B2RWrivail9aFxnUt5SCrSIOiHNXdC9Cwk0v4ia7W78 +Mc1hx4DkddOIrOEegYsUgRimagJJWYjytPdkbR8= +=cAiw +-----END PGP PRIVATE KEY BLOCK----- diff --git a/tests/keys/kgpgtest_BA7695F3C550DF14.pass b/tests/keys/kgpgtest_BA7695F3C550DF14.pass new file mode 100644 index 00000000..30d74d25 --- /dev/null +++ b/tests/keys/kgpgtest_BA7695F3C550DF14.pass @@ -0,0 +1 @@ +test \ No newline at end of file diff --git a/tests/keys/kgpgtest_BA7695F3C550DF14_pub.asc b/tests/keys/kgpgtest_BA7695F3C550DF14_pub.asc new file mode 100644 index 00000000..9b9ece84 --- /dev/null +++ b/tests/keys/kgpgtest_BA7695F3C550DF14_pub.asc @@ -0,0 +1,36 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +YceA5HXTiKzhHoGLFIEYpmoCSVmI8rT3ZG0f +=6klv +-----END PGP PUBLIC KEY BLOCK----- diff --git a/tests/keys/sample_text b/tests/keys/sample_text new file mode 100644 index 00000000..28d6b473 --- /dev/null +++ b/tests/keys/sample_text @@ -0,0 +1,9 @@ +KGpg is a simple interface for GnuPG, a powerful encryption utility. + +The latest stable release is version 18.04, included in KDE Applications 18.04. KGpg is a free and open source software, available for Linux and similar operating systems under the GNU General Public License (GPL), Version 2. + +GnuPG (also known as gpg) is included in most distributions and should be installed on your system. You can get the latest version on http://gnupg.org/. + +With KGpg you will be able to encrypt and decrypt your files and emails, allowing much more secure communications. A mini howto on encryption with gpg is available on gnupg's web site. + +With KGpg, you don't need to remember gpg's command lines and options. Almost everything can be done with a few mouse clicks. diff --git a/tests/keys/signed_bad_sig b/tests/keys/signed_bad_sig new file mode 100644 index 00000000..4e919b89 --- /dev/null +++ b/tests/keys/signed_bad_sig @@ -0,0 +1,15 @@ +-----BEGIN PGP SIGNED MESSAGE----- +Hash: SHA512 + +Bad Signed +-----BEGIN PGP SIGNATURE----- + +iQEzBAEBCgAdFiEEliGMPUjTQD2OiuwYeILGFSEPECIFAlr4iG0ACgkQeILGFSEP +ECJ4oAf/YyUA1QbPqhzGvbJCamHY20jFcdpDOsdMazqRFAmq2kaBuHCBTwKRE6NP +gY5h9FmADxxSQbX2fFv2So/PHjC/gnvIg6yzztwOAByNl0qnj1fLtLWrlpOMdedC +CSZpB4XDDfgA8F2jVG5dx13YjgTtw9tASgBsb6C6RqsXMXoICF5SyOrklgDtdj/C +PEPDoYM3vuryNuGENsNHJ12Nq1rNpLloaCYN175RMz+zxh8yJsWsfPAPjoTUza6r +olfZzG549vSXNgxsnu1sYHyC3OQClqobQyg5C9zfj/y7k1VdgCYGrRSN+3P9sP41 +bhQDWZzRvMtIpUtaWcevZ/E7JOH7aQ== +=Rj7d +-----END PGP SIGNATURE----- diff --git a/tests/keys/signed_text b/tests/keys/signed_text new file mode 100644 index 00000000..6612f7f5 --- /dev/null +++ b/tests/keys/signed_text @@ -0,0 +1,15 @@ +-----BEGIN PGP SIGNED MESSAGE----- +Hash: SHA512 + +SOURCE +-----BEGIN PGP SIGNATURE----- + +iQEzBAEBCgAdFiEEliGMPUjTQD2OiuwYeILGFSEPECIFAlr4YcwACgkQeILGFSEP +ECIEjwf+OWcPWvYEcIqRD+48sC/72nYVM23WvjLnnU48T6Ale5f2wg9OAxwJ3YxC +lSpTwuGUa+L1rp1NWeOF3MalwJ147sw7BDoFb2OJsAsF7iANFZ37GtC8gECsgZmi +Ul+BNO1wkMD+TorxpH+VyTYHqG0hmFXKzjIOyyNVIaIHH3f5Bk1B7rPPPi4vM2Uo +KZ5HuiJ5eQr4lsNCpqi+c2xiI00LT9gS5Ly8dUHIOVaWHb1i+9vQwyx1f7rjtZrJ +DQGfGyJff4hEGHvAymvfPYITOQl8gw/4p9ReW2Es2gU4EYqBU2aH7gGQyuohvZOH +YbX8WCUorbDCCoptdkmvw/q0G9xYgg== +=FigO +-----END PGP SIGNATURE----- diff --git a/tests/kgpgimport.cpp b/tests/kgpgimport.cpp new file mode 100644 index 00000000..c71a7092 --- /dev/null +++ b/tests/kgpgimport.cpp @@ -0,0 +1,149 @@ +#include "kgpgimport.h" +#include "../transactions/kgpgimport.h" +#include "common.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +void KGpgImportTest::init() +{ + QVERIFY(resetGpgConf()); +} + +void KGpgImportTest::testImportTextKey() +{ + QString key = readFile(QLatin1String("keys/kgpgtest_BA7695F3C550DF14_pub.asc")); + KGpgImport *transaction = new KGpgImport(this, key); + QSignalSpy spy(transaction, &KGpgImport::done); + transaction->start(); + QObject::connect(transaction, &KGpgImport::done, [transaction, key](int result) { + QCOMPARE(transaction->getImportedKeys().size(), 1); + QString keyID = QLatin1String("BA7695F3C550DF14"); + QVERIFY(transaction->getImportedKeys().first().startsWith(keyID)); + QCOMPARE(result, KGpgTransaction::TS_OK); + }); + QVERIFY(spy.wait()); +} + +void KGpgImportTest::testImportKeyFromFile() +{ + QList list; + list.append( + QUrl::fromLocalFile(QLatin1String("keys/kgpgtest_BA7695F3C550DF14_pub.asc"))); + + KGpgImport *transaction = new KGpgImport(this, list); + QSignalSpy spy(transaction, &KGpgImport::done); + transaction->start(); + QObject::connect(transaction, &KGpgImport::done, [transaction](int result) { + QCOMPARE(transaction->getImportedKeys().size(), 1); + QString keyID = QLatin1String("BA7695F3C550DF14"); + QVERIFY(transaction->getImportedKeys().first().startsWith(keyID)); + QCOMPARE(result, KGpgTransaction::TS_OK); + }); + QVERIFY(spy.wait()); +} + +void KGpgImportTest::testImportSameKeyTwice() +{ + QList list; + list.append( + QUrl::fromLocalFile(QLatin1String("keys/kgpgtest_BA7695F3C550DF14_pub.asc"))); + KGpgImport *transaction = new KGpgImport(this, list); + QSignalSpy spy(transaction, &KGpgImport::done); + transaction->start(); + QVERIFY(spy.wait()); + transaction->start(); + QObject::connect(transaction, &KGpgImport::done, [transaction](int result) { + QCOMPARE(transaction->getImportedKeys().size(), 1); + QString keyID = QLatin1String("BA7695F3C550DF14"); + QString duplicateMsg = + QLatin1String("IMPORT_OK 0 FBAF08DD7D9D0921C15DDA9FBA7695F3C550DF14"); + qDebug() << "MESSAGES: " << transaction->getMessages(); + QVERIFY(transaction->getImportedKeys().first().startsWith(keyID)); + QVERIFY(transaction->getMessages() + .join(QLatin1Char(' ')) + .contains(duplicateMsg)); + QEXPECT_FAIL("", "Test is broken. Possible bug!", Continue); + QCOMPARE(result, KGpgTransaction::TS_OK); + }); + QVERIFY(spy.wait()); +} + +void KGpgImportTest::testImportIdsAll() +{ + QList list; + list.append( + QUrl::fromLocalFile(QLatin1String("keys/kgpgtest_BA7695F3C550DF14_pub.asc"))); + KGpgImport *transaction = new KGpgImport(this, list); + QSignalSpy spy(transaction, &KGpgImport::done); + transaction->start(); + QObject::connect(transaction, &KGpgImport::done, [transaction](int result) { + QCOMPARE(transaction->getImportedIds(-1).size(), 1); + QString fingerprint = QLatin1String("FBAF08DD7D9D0921C15DDA9FBA7695F3C550DF14"); + QVERIFY(transaction->getImportedIds(-1).first().compare(fingerprint) == 0); + QCOMPARE(result, KGpgTransaction::TS_OK); + }); + QVERIFY(spy.wait()); +} + +void KGpgImportTest::testImportIdsUnchanged() +{ + addGpgKey(QLatin1String("keys/kgpgtest_BA7695F3C550DF14_pub.asc")); + QList list; + list.append( + QUrl::fromLocalFile(QLatin1String("keys/kgpgtest_BA7695F3C550DF14_pub.asc"))); + KGpgImport *transaction = new KGpgImport(this, list); + QSignalSpy spy(transaction, &KGpgImport::done); + transaction->start(); + QObject::connect(transaction, &KGpgImport::done, [transaction](int result) { + QCOMPARE(transaction->getImportedIds(0).size(), 1); + QString fingerprint = QLatin1String("FBAF08DD7D9D0921C15DDA9FBA7695F3C550DF14"); + QVERIFY(transaction->getImportedIds(0).first().compare(fingerprint) == 0); + QCOMPARE(result, KGpgTransaction::TS_OK); + }); + QVERIFY(spy.wait()); +} + +void KGpgImportTest::testLogMessage() +{ + QList list; + list.append( + QUrl::fromLocalFile(QLatin1String("keys/kgpgtest_BA7695F3C550DF14_pub.asc"))); + KGpgImport *transaction = new KGpgImport(this, list); + QSignalSpy spy(transaction, &KGpgImport::done); + transaction->start(); + QObject::connect(transaction, &KGpgImport::done, [transaction](int result) { + QString msg = + QLatin1String("IMPORT_OK 1 FBAF08DD7D9D0921C15DDA9FBA7695F3C550DF14"); + QVERIFY(transaction->getMessages().join(QLatin1Char(' ')).contains(msg)); + QCOMPARE(result, KGpgTransaction::TS_OK); + }); + QVERIFY(spy.wait()); +} + +void KGpgImportTest::testImportSecretKey() +{ + QList list; + list.append(QUrl::fromLocalFile(QLatin1String("keys/kgpgtest_BA7695F3C550DF14.asc"))); + KGpgImport *transaction = new KGpgImport(this, list); + addPasswordArguments(transaction, + readFile(QLatin1String("keys/kgpgtest_BA7695F3C550DF14.pass"))); + QSignalSpy spy(transaction, &KGpgImport::done); + transaction->start(); + QObject::connect(transaction, &KGpgImport::done, [transaction]() { + QVERIFY(transaction->getImportedKeys().size() == 1); + QString keyID = QLatin1String("BA7695F3C550DF14"); + QVERIFY(transaction->getImportedKeys().first().startsWith(keyID)); + }); + QVERIFY(spy.wait()); +} + +QTEST_MAIN(KGpgImportTest) diff --git a/tests/kgpgimport.h b/tests/kgpgimport.h new file mode 100644 index 00000000..8260650f --- /dev/null +++ b/tests/kgpgimport.h @@ -0,0 +1,20 @@ +#ifndef KGPGIMPORT_TEST_H +#define KGPGIMPORT_TEST_H + +#include + +class KGpgImportTest: public QObject +{ + Q_OBJECT +private slots: + void init(); + void testImportTextKey(); + void testImportIdsAll(); + void testImportIdsUnchanged(); + void testImportKeyFromFile(); + void testImportSameKeyTwice(); + void testLogMessage(); + void testImportSecretKey(); +}; + +#endif diff --git a/tests/kgpgrc b/tests/kgpgrc new file mode 100644 index 00000000..1e9742dc --- /dev/null +++ b/tests/kgpgrc @@ -0,0 +1,5 @@ +[GPG Settings] +gpg_config_path[$e]=$XDG_CONFIG_HOME/.gnupg/gpg.conf + +[General Options] +First run=false