diff --git a/messageviewer/src/CMakeLists.txt b/messageviewer/src/CMakeLists.txt index 3a145faa..7924fb7e 100644 --- a/messageviewer/src/CMakeLists.txt +++ b/messageviewer/src/CMakeLists.txt @@ -1,567 +1,568 @@ add_definitions(-DTRANSLATION_DOMAIN=\"libmessageviewer\") add_subdirectory(messagepartthemes/grantlee) # KCFG files: # The main messageviewer.kcfg is configured by CMake and put in the build directory. if(KDEPIM_ENTERPRISE_BUILD) set(LEGACY_MANGLE_FROM_TO_HEADERS true) set(LEGACY_BODY_INVITES true) set(EXCHANGE_COMPATIBLE_INVITATIONS true) else() set(LEGACY_MANGLE_FROM_TO_HEADERS false) set(LEGACY_BODY_INVITES false) set(EXCHANGE_COMPATIBLE_INVITATIONS false) endif() configure_file(settings/messageviewer.kcfg.cmake ${CMAKE_CURRENT_BINARY_DIR}/messageviewer.kcfg) include(CheckIncludeFiles) find_package(Inotify) set_package_properties(Inotify PROPERTIES PURPOSE "Filesystem alteration notifications using inotify") if(Inotify_FOUND) set(HAVE_SYS_INOTIFY_H 1) else() set(HAVE_SYS_INOTIFY_H 0) endif() find_package(Qca-qt5 2.1.0) set_package_properties(Qca-qt5 PROPERTIES DESCRIPTION "Qt Cryptographic Architecture" URL "https:/download.kde.org/stable/qca-qt5" TYPE OPTIONAL PURPOSE "Needed for dkim support.") if (${Qca-qt5_FOUND}) set(USE_DKIM_CHECKER 1) endif() configure_file(config-messageviewer.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config-messageviewer.h) # target_include_directories does not handle empty include paths include_directories(${GPGME_INCLUDES}) if(BUILD_TESTING) add_subdirectory(header/autotests) add_subdirectory(scamdetection/autotests) add_subdirectory(scamdetection/tests) add_subdirectory(viewerplugins/tests/) add_subdirectory(htmlwriter/autotests) add_subdirectory(viewer/webengine/tests) add_subdirectory(messagepartthemes/default/autotests) add_subdirectory(widgets/autotests/) add_subdirectory(utils/autotests) endif() add_subdirectory(pics) add_subdirectory(kconf_update) add_subdirectory(about) add_subdirectory(messageviewerheaderplugins) if (${Qca-qt5_FOUND}) if (BUILD_TESTING) add_subdirectory(dkim-verify/autotests) add_subdirectory(dkim-verify/tests) endif() set(dkim_verify_SRCS dkim-verify/dkiminfo.cpp dkim-verify/dkimmanagerkey.cpp dkim-verify/dkimmanagerkeywidget.cpp dkim-verify/dkimmanagerkeydialog.cpp dkim-verify/dkimdownloadkeyjob.cpp dkim-verify/dkimchecksignaturejob.cpp dkim-verify/dkimcheckauthenticationstatusjob.cpp dkim-verify/dkimauthenticationstatusinfo.cpp dkim-verify/dkimutil.cpp dkim-verify/dkimkeyrecord.cpp dkim-verify/dkimmanager.cpp dkim-verify/dkimresultattribute.cpp dkim-verify/dkimwidgetinfo.cpp dkim-verify/dkimstoreresultjob.cpp dkim-verify/dkimheaderparser.cpp dkim-verify/dkimcheckpolicy.cpp dkim-verify/dmarcrecordjob.cpp dkim-verify/dmarcinfo.cpp dkim-verify/dmarcpolicyjob.cpp dkim-verify/dkimcheckpolicyjob.cpp dkim-verify/dkimrule.cpp dkim-verify/dkimmanagerrules.cpp dkim-verify/dkimgeneraterulejob.cpp + dkim-verify/dkimauthenticationstatusinfoutil.cpp ) endif() if(DEBUG_SIGNATURE) add_definitions(-DDEBUG_SIGNATURE) endif() set(libmessageviewer_mailviewer_SRCS viewer/webengine/mailwebengineview.cpp viewer/webengine/mailwebenginepage.cpp viewer/webengine/loadexternalreferencesurlinterceptor/loadexternalreferencesurlinterceptor.cpp viewer/webengine/cidreferencesurlinterceptor/cidreferencesurlinterceptor.cpp viewer/webengine/blockexternalresourcesurlinterceptor/blockexternalresourcesurlinterceptor.cpp viewer/webengine/blockmailtrackingurlinterceptor/blockmailtrackingurlinterceptor.cpp ) set(libmessageviewer_viewer_SRCS viewer/attachmentstrategy.cpp viewer/csshelper.cpp viewer/csshelperbase.cpp viewer/editorwatcher.cpp viewer/objecttreeemptysource.cpp viewer/objecttreeviewersource.cpp viewer/viewer.cpp viewer/viewer_p.cpp viewer/messagedisplayformatattribute.cpp viewer/urlhandlermanager.cpp viewer/mimeparttree/mimeparttreeview.cpp viewer/mimeparttree/mimetreemodel.cpp ) set(libmessageviewer_widgets_SRCS widgets/attachmentdialog.cpp widgets/configurewidget.cpp widgets/printingsettings.cpp widgets/htmlstatusbar.cpp widgets/vcardviewer.cpp widgets/invitationsettings.cpp widgets/openattachmentfolderwidget.cpp widgets/mailsourceviewtextbrowserwidget.cpp widgets/submittedformwarningwidget.cpp widgets/mailtrackingwarningwidget.cpp widgets/mailtrackingdetailsdialog.cpp widgets/shownextmessagewidget.cpp ) set(libmessageviewer_widgets_webengine_SRCS widgets/mailsourcewebengineviewer.cpp ) set(libmessageviewer_header_SRCS header/contactdisplaymessagememento.cpp header/headerstrategy.cpp header/richheaderstrategy.cpp header/headerstyle.cpp header/grantleeheaderstyle.cpp header/plainheaderstyle.cpp header/headerstyle_util.cpp header/grantleeheaderformatter.cpp header/grantleeheaderteststyle.cpp header/kxface.cpp header/headerstyleplugin.cpp header/headerstylepluginmanager.cpp header/headerstyleinterface.cpp header/headerstylemenumanager.cpp ) set(libmessageviewer_scamdetection_SRCS scamdetection/scamdetectionwarningwidget.cpp scamdetection/scamdetectiondetailsdialog.cpp scamdetection/scamattribute.cpp scamdetection/scamcheckshorturl.cpp scamdetection/scamexpandurljob.cpp scamdetection/scamcheckshorturlmanager.cpp ) set(libmessageviewer_scamdetection_webengine_SRCS scamdetection/scamdetectionwebengine.cpp ) set(libmessageviewer_findbar_SRCS findbar/findbarsourceview.cpp ) set(libmessageviewer_utils_SRCS utils/iconnamecache.cpp utils/markmessagereadhandler.cpp utils/messageviewerutil.cpp utils/mimetype.cpp ) set(libmessageviewer_htmlwriter_webengine_SRCS htmlwriter/webengineparthtmlwriter.cpp htmlwriter/webengineembedpart.cpp ) set(libmessageviewer_htmlwriter_SRCS ${libmessageviewer_htmlwriter_webengine_SRCS} htmlwriter/bufferedhtmlwriter.cpp htmlwriter/filehtmlwriter.cpp ) set(libmessageviewer_antispam_SRCS antispam/spamheaderanalyzer.cpp antispam/antispamconfig.cpp ) set(libmessageviewer_job_SRCS job/modifymessagedisplayformatjob.cpp ) set(libmessageviewer_viewerplugins_SRCS viewerplugins/viewerpluginmanager.cpp viewerplugins/viewerplugin.cpp viewerplugins/viewerplugininterface.cpp viewerplugins/viewerplugintoolmanager.cpp ) set(libmessageviewer_configureplugins_SRCS messageviewerconfigureplugins/messageviewerconfiguresettingsplugin.cpp messageviewerconfigureplugins/messageviewerconfiguresettingspluginmanager.cpp messageviewerconfigureplugins/messageviewerconfiguresettingspluginwidget.cpp ) set(libmessageviewer_messagepartthemes_default_SRCS messagepartthemes/default/converthtmltoplaintext.cpp messagepartthemes/default/defaultrenderer.cpp messagepartthemes/default/htmlblock.cpp messagepartthemes/default/messagepartrenderermanager.cpp messagepartthemes/default/plugins/attachmentmessagepartrenderer.cpp messagepartthemes/default/plugins/messagepartrenderer.cpp messagepartthemes/default/plugins/textmessagepartrenderer.cpp messagepartthemes/default/plugins/quotehtml.cpp messagepartthemes/default/messagepartrenderbase.cpp messagepartthemes/default/messagepartrenderplugin.cpp messagepartthemes/default/messagepartrendererfactory.cpp ) set(libmessageviewer_interfaces_SRCS interfaces/htmlwriter.cpp ) set(libmessageviewer_SRCS ${dkim_verify_SRCS} ${libmessageviewer_messagepartthemes_default_SRCS} ${libmessageviewer_htmlwriter_SRCS} ${libmessageviewer_messagepartthemes_SRCS} ${libmessageviewer_scamdetection_webengine_SRCS} ${libmessageviewer_widgets_webengine_SRCS} ${libmessageviewer_viewer_SRCS} ${libmessageviewer_widgets_SRCS} ${libmessageviewer_header_SRCS} ${libmessageviewer_scamdetection_SRCS} ${libmessageviewer_findbar_SRCS} ${libmessageviewer_utils_SRCS} ${libmessageviewer_antispam_SRCS} ${libmessageviewer_job_SRCS} ${libmessageviewer_viewerplugins_SRCS} settings/messageviewersettings.cpp ${libmessageviewer_mailviewer_SRCS} ${libmessageviewer_interfaces_SRCS} ${libmessageviewer_configureplugins_SRCS} ) qt5_add_resources(libmessageviewer_SRCS messagepartthemes.qrc) ecm_qt_declare_logging_category(libmessageviewer_SRCS HEADER messageviewer_debug.h IDENTIFIER MESSAGEVIEWER_LOG CATEGORY_NAME org.kde.pim.messageviewer) ecm_qt_declare_logging_category(libmessageviewer_SRCS HEADER messageviewer_dkimcheckerdebug.h IDENTIFIER MESSAGEVIEWER_DKIMCHECKER_LOG CATEGORY_NAME org.kde.pim.messageviewer_dkimchecker) kconfig_add_kcfg_files(libmessageviewer_SRCS settings/globalsettings_messageviewer.kcfgc ) ki18n_wrap_ui(libmessageviewer_SRCS ui/settings.ui ui/invitationsettings.ui ui/printingsettings.ui ) add_library(KF5MessageViewer ${libmessageviewer_SRCS}) generate_export_header(KF5MessageViewer BASE_NAME messageviewer) add_library(KF5::MessageViewer ALIAS KF5MessageViewer) target_include_directories(KF5MessageViewer INTERFACE "$;${Inotify_INCLUDE_DIRS}") if (${Qca-qt5_FOUND}) set(OPTIONAL_PRIVATE qca-qt5) endif() target_link_libraries(KF5MessageViewer PUBLIC KF5::MessageCore KF5::PimCommon KF5::AkonadiCore KF5::AkonadiMime KF5::Contacts KF5::Libkleo KF5::MimeTreeParser PRIVATE KF5::SyntaxHighlighting KF5::ItemViews Qt5::Network KF5::WebEngineViewer KF5::LibkdepimAkonadi KF5::GrantleeTheme KF5::KaddressbookGrantlee KF5::MailTransportAkonadi KF5::Mime KF5::Mbox KF5::PimTextEdit KF5::Gravatar KF5::IconThemes KF5::I18n KF5::KIOFileWidgets KF5::KIOWidgets KF5::XmlGui Grantlee5::TextDocument Grantlee5::Templates Qt5::PrintSupport QGpgme ${Inotify_LIBRARIES} ${OPTIONAL_PRIVATE} ) set_target_properties(KF5MessageViewer PROPERTIES VERSION ${MESSAGEVIEWER_VERSION_STRING} SOVERSION ${MESSAGEVIEWER_SOVERSION} EXPORT_NAME MessageViewer ) install(TARGETS KF5MessageViewer EXPORT KF5MessageViewerTargets ${KF5_INSTALL_TARGETS_DEFAULT_ARGS} ${LIBRARY_NAMELINK} ) ecm_generate_headers(MessageViewer_Camelblockmailtrackingurlinterceptor_HEADERS HEADER_NAMES BlockMailTrackingUrlInterceptor REQUIRED_HEADERS MessageViewer_blockmailtrackingurlinterceptor_HEADERS PREFIX MessageViewer RELATIVE viewer/webengine/blockmailtrackingurlinterceptor ) ecm_generate_headers(MessageViewer_Camelcasewebengine_HEADERS HEADER_NAMES MailWebEnginePage MailWebEngineView REQUIRED_HEADERS MessageViewer_webengine_HEADERS PREFIX MessageViewer RELATIVE viewer/webengine ) ecm_generate_headers(MessageViewer_Camelcasescam_HEADERS HEADER_NAMES ScamExpandUrlJob ScamCheckShortUrlManager ScamCheckShortUrl REQUIRED_HEADERS MessageViewer_scam_HEADERS PREFIX MessageViewer RELATIVE scamdetection ) if (${Qca-qt5_FOUND}) ecm_generate_headers(MessageViewer_Cameldkimverify_HEADERS HEADER_NAMES DKIMManagerKey DKIMCheckSignatureJob DKIMManager DKIMManagerKeyWidget DKIMManagerKeyDialog DKIMKeyRecord DKIMInfo DKIMWidgetInfo DKIMCheckPolicy DKIMManagerRules DKIMRule REQUIRED_HEADERS MessageViewer_dkimverify_HEADERS PREFIX MessageViewer RELATIVE dkim-verify ) endif() ecm_generate_headers(MessageViewer_Camelcaseviewer_HEADERS HEADER_NAMES AttachmentStrategy Viewer CSSHelperBase CSSHelper ObjectTreeEmptySource EditorWatcher Stl_Util REQUIRED_HEADERS MessageViewer_viewer_HEADERS PREFIX MessageViewer RELATIVE viewer ) ecm_generate_headers(MessageViewer_Camelcasewidgets_HEADERS HEADER_NAMES InvitationSettings PrintingSettings ConfigureWidget REQUIRED_HEADERS MessageViewer_widgets_HEADERS PREFIX MessageViewer RELATIVE widgets ) ecm_generate_headers(MessageViewer_Camelcaseutils_HEADERS HEADER_NAMES IconNameCache MarkMessageReadHandler MessageViewerUtil MimeType REQUIRED_HEADERS MessageViewer_utils_HEADERS PREFIX MessageViewer RELATIVE utils ) ecm_generate_headers(MessageViewer_Camelcaseantispam_HEADERS HEADER_NAMES SpamHeaderAnalyzer REQUIRED_HEADERS MessageViewer_antispam_HEADERS PREFIX MessageViewer RELATIVE antispam ) ecm_generate_headers(MessageViewer_Camelcaseinterfaces_HEADERS HEADER_NAMES HtmlWriter BodyPartURLHandler URLHandler REQUIRED_HEADERS MessageViewer_interfaces_HEADERS PREFIX MessageViewer RELATIVE interfaces ) ecm_generate_headers(MessageViewer_Camelcasehtmlwriter_HEADERS HEADER_NAMES BufferedHtmlWriter FileHtmlWriter REQUIRED_HEADERS MessageViewer_htmlwriter_HEADERS PREFIX MessageViewer RELATIVE htmlwriter ) ecm_generate_headers(MessageViewer_Camelcasesettings_HEADERS HEADER_NAMES MessageViewerSettings REQUIRED_HEADERS MessageViewer_settings_HEADERS PREFIX MessageViewer RELATIVE settings ) ecm_generate_headers(MessageViewer_CamelcaseConfigurePlugins_HEADERS HEADER_NAMES MessageViewerConfigureSettingsPluginManager MessageViewerConfigureSettingsPlugin MessageViewerConfigureSettingsPluginWidget REQUIRED_HEADERS MessageViewer_ConfigurePlugins_HEADERS PREFIX MessageViewer RELATIVE messageviewerconfigureplugins ) ecm_generate_headers(MessageViewer_Camelcaseheader_HEADERS HEADER_NAMES HeaderStrategy GrantleeHeaderTestStyle GrantleeHeaderStyle HeaderStyle KXFace HeaderStyle_Util HeaderStylePlugin HeaderStyleInterface PlainHeaderStyle RichHeaderStrategy HeaderStylePluginManager HeaderStyleMenuManager REQUIRED_HEADERS MessageViewer_header_HEADERS PREFIX MessageViewer RELATIVE header ) ecm_generate_headers(MessageViewer_Camelcaseviewerplugin_HEADERS HEADER_NAMES ViewerPluginManager ViewerPlugin ViewerPluginInterface ViewerPluginToolManager REQUIRED_HEADERS MessageViewer_viewerplugin_HEADERS PREFIX MessageViewer RELATIVE viewerplugins ) ecm_generate_headers(MessageViewer_Camelcaserenderer_HEADERS HEADER_NAMES HtmlBlock MessagePartRendererBase MessagePartRendererManager MessagePartRenderPlugin REQUIRED_HEADERS MessageViewer_renderer_HEADERS PREFIX MessageViewer RELATIVE messagepartthemes/default ) ecm_generate_pri_file(BASE_NAME MessageViewer LIB_NAME KF5MessageViewer DEPS "PimCommon MessageCore AkonadiCore AkonadiMime Contacts Libkleo MimeTreeParser" FILENAME_VAR PRI_FILENAME INCLUDE_INSTALL_DIR ${KDE_INSTALL_INCLUDEDIR_KF5}/MessageViewer ) if (${Qca-qt5_FOUND}) install(FILES ${MessageViewer_Cameldkimverify_HEADERS} DESTINATION ${KDE_INSTALL_INCLUDEDIR_KF5}/MessageViewer COMPONENT Devel ) install(FILES ${MessageViewer_dkimverify_HEADERS} DESTINATION ${KDE_INSTALL_INCLUDEDIR_KF5}/messageviewer COMPONENT Devel ) endif() install(FILES ${MessageViewer_CamelcaseConfigurePlugins_HEADERS} ${MessageViewer_Camelcasewebengine_HEADERS} ${MessageViewer_Camelcaseheader_HEADERS} ${MessageViewer_Camelcaseviewerplugin_HEADERS} ${MessageViewer_Camelcasesettings_HEADERS} ${MessageViewer_Camelcaseutils_HEADERS} ${MessageViewer_Camelcaseinterfaces_HEADERS} ${MessageViewer_Camelcasehtmlwriter_HEADERS} ${MessageViewer_Camelcaseviewer_HEADERS} ${MessageViewer_Camelcasewidgets_HEADERS} ${MessageViewer_Camelcaseantispam_HEADERS} ${MessageViewer_Camelfindbar_HEADERS} ${MessageViewer_Camelcasescam_HEADERS} ${MessageViewer_Camelcaserenderer_HEADERS} ${MessageViewer_Camelblockmailtrackingurlinterceptor_HEADERS} DESTINATION ${KDE_INSTALL_INCLUDEDIR_KF5}/MessageViewer COMPONENT Devel ) install(FILES ${MessageViewer_ConfigurePlugins_HEADERS} ${MessageViewer_webengine_HEADERS} ${MessageViewer_scam_HEADERS} ${MessageViewer_viewerplugin_HEADERS} ${MessageViewer_settings_HEADERS} ${MessageViewer_header_HEADERS} ${MessageViewer_utils_HEADERS} ${MessageViewer_interfaces_HEADERS} ${MessageViewer_htmlwriter_HEADERS} ${MessageViewer_HEADERS} ${MessageViewer_viewer_HEADERS} ${MessageViewer_widgets_HEADERS} ${MessageViewer_antispam_HEADERS} ${MessageViewer_findbar_HEADERS} ${MessageViewer_renderer_HEADERS} ${MessageViewer_blockmailtrackingurlinterceptor_HEADERS} ${CMAKE_CURRENT_BINARY_DIR}/messageviewer_export.h ${CMAKE_CURRENT_BINARY_DIR}/globalsettings_messageviewer.h ${CMAKE_CURRENT_BINARY_DIR}/messageviewer_debug.h ${CMAKE_CURRENT_BINARY_DIR}/config-messageviewer.h DESTINATION ${KDE_INSTALL_INCLUDEDIR_KF5}/messageviewer COMPONENT Devel ) install(FILES ${PRI_FILENAME} DESTINATION ${ECM_MKSPECS_INSTALL_DIR}) install(FILES header/data/messageviewer_header_themes.knsrc DESTINATION ${KDE_INSTALL_KNSRCDIR} ) install(FILES notify/messageviewer.notifyrc DESTINATION ${KDE_INSTALL_KNOTIFY5RCDIR} ) install(FILES scamdetection/data/longurlServices.json DESTINATION ${KDE_INSTALL_DATADIR}/messageviewer ) diff --git a/messageviewer/src/dkim-verify/autotests/CMakeLists.txt b/messageviewer/src/dkim-verify/autotests/CMakeLists.txt index 7208400a..6f813dfe 100644 --- a/messageviewer/src/dkim-verify/autotests/CMakeLists.txt +++ b/messageviewer/src/dkim-verify/autotests/CMakeLists.txt @@ -1,32 +1,33 @@ add_definitions( -DDKIM_DATA_DIR="${CMAKE_CURRENT_SOURCE_DIR}/data" ) macro(add_messageviewer_dkim_verify_unittest _source) get_filename_component(_name ${_source} NAME_WE) ecm_add_test(${_source} TEST_NAME ${_name} NAME_PREFIX "messageviewer-" LINK_LIBRARIES KF5::MessageViewer KF5::WebEngineViewer KF5::Libkleo QGpgme Qt5::Test qca-qt5 KF5::ItemViews ) endmacro () add_messageviewer_dkim_verify_unittest(dkiminfotest.cpp) add_messageviewer_dkim_verify_unittest(dkimmanagerkeytest.cpp) add_messageviewer_dkim_verify_unittest(dkimmanagerkeywidgettest.cpp) add_messageviewer_dkim_verify_unittest(dkimmanagerkeydialogtest.cpp) add_messageviewer_dkim_verify_unittest(dkimdownloadkeyjobtest.cpp) add_messageviewer_dkim_verify_unittest(dkimchecksignaturejobtest.cpp) add_messageviewer_dkim_verify_unittest(dkimcheckauthenticationstatusjobtest.cpp) add_messageviewer_dkim_verify_unittest(dkimauthenticationstatusinfotest.cpp) add_messageviewer_dkim_verify_unittest(dkimkeyrecordtest.cpp) add_messageviewer_dkim_verify_unittest(dkimmanagertest.cpp) add_messageviewer_dkim_verify_unittest(dkimutiltest.cpp) add_messageviewer_dkim_verify_unittest(dkimstoreresultjobtest.cpp) add_messageviewer_dkim_verify_unittest(dkimresultattributetest.cpp) add_messageviewer_dkim_verify_unittest(dkimheaderparsertest.cpp) add_messageviewer_dkim_verify_unittest(dkimcheckpolicytest.cpp) add_messageviewer_dkim_verify_unittest(dmarcinfotest.cpp) add_messageviewer_dkim_verify_unittest(dmarcpolicyjobtest.cpp) add_messageviewer_dkim_verify_unittest(dkimcheckpolicyjobtest.cpp) add_messageviewer_dkim_verify_unittest(dkimruletest.cpp) add_messageviewer_dkim_verify_unittest(dkimmanagerrulestest.cpp) add_messageviewer_dkim_verify_unittest(dkimwidgetinfotest.cpp) add_messageviewer_dkim_verify_unittest(dkimgeneraterulejobtest.cpp) +add_messageviewer_dkim_verify_unittest(dkimauthenticationstatusinfoutiltest.cpp) diff --git a/messageviewer/src/dkim-verify/autotests/dkimauthenticationstatusinfoutiltest.cpp b/messageviewer/src/dkim-verify/autotests/dkimauthenticationstatusinfoutiltest.cpp new file mode 100644 index 00000000..244d97df --- /dev/null +++ b/messageviewer/src/dkim-verify/autotests/dkimauthenticationstatusinfoutiltest.cpp @@ -0,0 +1,28 @@ +/* + Copyright (C) 2019 Laurent Montel + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#include "dkimauthenticationstatusinfoutiltest.h" +#include "dkim-verify/dkimauthenticationstatusinfoutil.h" +#include +QTEST_GUILESS_MAIN(DKIMAuthenticationStatusInfoUtilTest) +DKIMAuthenticationStatusInfoUtilTest::DKIMAuthenticationStatusInfoUtilTest(QObject *parent) + : QObject(parent) +{ + +} diff --git a/messageviewer/src/dkim-verify/autotests/dkimauthenticationstatusinfoutiltest.h b/messageviewer/src/dkim-verify/autotests/dkimauthenticationstatusinfoutiltest.h new file mode 100644 index 00000000..17b693f4 --- /dev/null +++ b/messageviewer/src/dkim-verify/autotests/dkimauthenticationstatusinfoutiltest.h @@ -0,0 +1,33 @@ +/* + Copyright (C) 2019 Laurent Montel + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#ifndef DKIMAUTHENTICATIONSTATUSINFOUTILTEST_H +#define DKIMAUTHENTICATIONSTATUSINFOUTILTEST_H + +#include + +class DKIMAuthenticationStatusInfoUtilTest : public QObject +{ + Q_OBJECT +public: + explicit DKIMAuthenticationStatusInfoUtilTest(QObject *parent = nullptr); + ~DKIMAuthenticationStatusInfoUtilTest() = default; +}; + +#endif // DKIMAUTHENTICATIONSTATUSINFOUTILTEST_H diff --git a/messageviewer/src/dkim-verify/dkimauthenticationstatusinfoutil.cpp b/messageviewer/src/dkim-verify/dkimauthenticationstatusinfoutil.cpp new file mode 100644 index 00000000..c0f8ba9b --- /dev/null +++ b/messageviewer/src/dkim-verify/dkimauthenticationstatusinfoutil.cpp @@ -0,0 +1,191 @@ +/* + Copyright (C) 2019 Laurent Montel + + Code based on ARHParser.jsm from dkim_verifier (Copyright (c) Philippe Lieser) + (This software is licensed under the terms of the MIT License.) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#include "dkimauthenticationstatusinfoutil.h" + +/* +// domain-name as specified in Section 3.5 of RFC 6376 [DKIM]. +let domain_name_p = "(?:" + sub_domain_p + "(?:\\." + sub_domain_p + ")+)"; +*/ +QString MessageViewer::DKIMAuthenticationStatusInfoUtil::wsp_p() +{ + // WSP as specified in Appendix B.1 of RFC 5234 + return QStringLiteral("[ \t]"); +} + +QString MessageViewer::DKIMAuthenticationStatusInfoUtil::vchar_p() +{ + // VCHAR as specified in Appendix B.1 of RFC 5234 + return QStringLiteral("[!-~]"); +} + +QString MessageViewer::DKIMAuthenticationStatusInfoUtil::letDig_p() +{ + // Let-dig as specified in Section 4.1.2 of RFC 5321 [SMTP]. + return QStringLiteral("[A-Za-z0-9]"); +} + +QString MessageViewer::DKIMAuthenticationStatusInfoUtil::ldhStr_p() +{ + // Ldh-str as specified in Section 4.1.2 of RFC 5321 [SMTP]. + return QStringLiteral("(?:[A-Za-z0-9-]*%1)").arg(DKIMAuthenticationStatusInfoUtil::letDig_p()); +} + +QString MessageViewer::DKIMAuthenticationStatusInfoUtil::keyword_p() +{ + // "Keyword" as specified in Section 4.1.2 of RFC 5321 [SMTP]. + return DKIMAuthenticationStatusInfoUtil::ldhStr_p(); + +} + +QString MessageViewer::DKIMAuthenticationStatusInfoUtil::subDomain_p() +{ + // sub-domain as specified in Section 4.1.2 of RFC 5321 [SMTP]. + return QStringLiteral("(?:%1%2?)").arg(DKIMAuthenticationStatusInfoUtil::letDig_p()).arg(DKIMAuthenticationStatusInfoUtil::ldhStr_p()); +} + +QString MessageViewer::DKIMAuthenticationStatusInfoUtil::obsFws_p() +{ + // obs-FWS as specified in Section 4.2 of RFC 5322 + return QStringLiteral("(?:%1+(?:\r\n%1+)*)").arg(DKIMAuthenticationStatusInfoUtil::wsp_p()); +} + +QString MessageViewer::DKIMAuthenticationStatusInfoUtil::quotedPair_p() +{ + // quoted-pair as specified in Section 3.2.1 of RFC 5322 + // Note: obs-qp is not included, so this pattern matches less then specified! + return QStringLiteral("(?:\\\\(?:%1|%2))").arg(vchar_p()).arg(wsp_p()); +} + +QString MessageViewer::DKIMAuthenticationStatusInfoUtil::fws_p() +{ + // FWS as specified in Section 3.2.2 of RFC 5322 + return QStringLiteral("(?:(?:(?:%1*\r\n)?%1+)|%2)").arg(wsp_p()).arg(obsFws_p()); +} + +QString MessageViewer::DKIMAuthenticationStatusInfoUtil::fws_op() +{ + return QStringLiteral("%1?").arg(fws_p()); +} + +QString MessageViewer::DKIMAuthenticationStatusInfoUtil::ctext_p() +{ + // ctext as specified in Section 3.2.2 of RFC 5322 + return QStringLiteral("[!-'*-[\\]-~]"); +} + +QString MessageViewer::DKIMAuthenticationStatusInfoUtil::ccontent_p() +{ + // ccontent as specified in Section 3.2.2 of RFC 5322 + // Note: comment is not included, so this pattern matches less then specified! + return QStringLiteral("(?:%1|%2)").arg(ctext_p()).arg(quotedPair_p()); +} + +QString MessageViewer::DKIMAuthenticationStatusInfoUtil::comment_p() +{ + // comment as specified in Section 3.2.2 of RFC 5322 + return QStringLiteral("\\((?:%1%2)*%1\\)").arg(fws_op()).arg(ccontent_p()); +} + +QString MessageViewer::DKIMAuthenticationStatusInfoUtil::cfws_p() +{ + // CFWS as specified in Section 3.2.2 of RFC 5322 [MAIL] + return QStringLiteral("(?:(?:(?:%1%2)+%1)|%3)").arg(fws_op()).arg(comment_p()).arg(fws_p()); +} + +QString MessageViewer::DKIMAuthenticationStatusInfoUtil::cfws_op() +{ + return QStringLiteral("%1?").arg(cfws_p()); +} + +QString MessageViewer::DKIMAuthenticationStatusInfoUtil::atext() +{ + // atext as specified in Section 3.2.3 of RFC 5322 + return QStringLiteral("[!#-'*-+/-9=?A-Z^-~-]"); +} + +QString MessageViewer::DKIMAuthenticationStatusInfoUtil::dotAtomText_p() +{ + // dot-atom-text as specified in Section 3.2.3 of RFC 5322 + return QStringLiteral("(?:%1+(?:\\.%1+)*)").arg(atext()); +} + +QString MessageViewer::DKIMAuthenticationStatusInfoUtil::dotAtom_p() +{ + // dot-atom as specified in Section 3.2.3 of RFC 5322 + // dot-atom = [CFWS] dot-atom-text [CFWS] + return QStringLiteral("(?:%1%2%1)").arg(cfws_op()).arg(dotAtomText_p()); +} + +QString MessageViewer::DKIMAuthenticationStatusInfoUtil::qtext_p() +{ + // qtext as specified in Section 3.2.4 of RFC 5322 + // Note: obs-qtext is not included, so this pattern matches less then specified! + return QStringLiteral("[!#-[\\]-~]"); +} + +QString MessageViewer::DKIMAuthenticationStatusInfoUtil::qcontent_p() +{ + // qcontent as specified in Section 3.2.4 of RFC 5322 + return QStringLiteral("(?:%1|%2)").arg(qtext_p()).arg(quotedPair_p()); +} + +QString MessageViewer::DKIMAuthenticationStatusInfoUtil::quotedString_p() +{ + // quoted-string as specified in Section 3.2.4 of RFC 5322 + return QStringLiteral("(?:%1\"(?:%2%3)*%2\"%1)").arg(cfws_op()).arg(fws_op()).arg(qcontent_p()); +} + +QString MessageViewer::DKIMAuthenticationStatusInfoUtil::quotedString_cp() +{ + return QStringLiteral("(?:%1\"((?:%2%3)*)%2\"%1)").arg(cfws_op()).arg(fws_op()).arg(qcontent_p()); +} + +QString MessageViewer::DKIMAuthenticationStatusInfoUtil::localPart_p() +{ + // local-part as specified in Section 3.4.1 of RFC 5322 + // Note: obs-local-part is not included, so this pattern matches less then specified! + return QStringLiteral("(?:%1|%2))").arg(dotAtom_p()).arg(quotedString_p()); +} + +QString MessageViewer::DKIMAuthenticationStatusInfoUtil::token_p() +{ + // token as specified in Section 5.1 of RFC 2045. + return QStringLiteral("[^ \\x00-\\x1F\\x7F()<>@,;:\\\\\"/[\\]?=]+"); +} + +QString MessageViewer::DKIMAuthenticationStatusInfoUtil::value_p() +{ + // "value" as specified in Section 5.1 of RFC 2045. + return QStringLiteral("(?:%1|%2)").arg(token_p()).arg(quotedString_p()); +} + +QString MessageViewer::DKIMAuthenticationStatusInfoUtil::value_cp() +{ + return QStringLiteral("(?:(%1)|%2)").arg(token_p()).arg(quotedString_cp()); +} + +QString MessageViewer::DKIMAuthenticationStatusInfoUtil::domainName_p() +{ + // domain-name as specified in Section 3.5 of RFC 6376 [DKIM]. + return QStringLiteral("(?:%1(?:\\.%1)+)").arg(subDomain_p()); +} diff --git a/messageviewer/src/dkim-verify/dkimauthenticationstatusinfoutil.h b/messageviewer/src/dkim-verify/dkimauthenticationstatusinfoutil.h new file mode 100644 index 00000000..ac68da97 --- /dev/null +++ b/messageviewer/src/dkim-verify/dkimauthenticationstatusinfoutil.h @@ -0,0 +1,58 @@ +/* + Copyright (C) 2019 Laurent Montel + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#ifndef DKIMAUTHENTICATIONSTATUSINFOUTIL_H +#define DKIMAUTHENTICATIONSTATUSINFOUTIL_H + +#include "messageviewer_private_export.h" +#include + +namespace MessageViewer { +namespace DKIMAuthenticationStatusInfoUtil { +MESSAGEVIEWER_TESTS_EXPORT QString wsp_p(); +MESSAGEVIEWER_TESTS_EXPORT QString vchar_p(); +MESSAGEVIEWER_TESTS_EXPORT QString letDig_p(); +MESSAGEVIEWER_TESTS_EXPORT QString ldhStr_p(); +MESSAGEVIEWER_TESTS_EXPORT QString keyword_p(); +MESSAGEVIEWER_TESTS_EXPORT QString subDomain_p(); +MESSAGEVIEWER_TESTS_EXPORT QString obsFws_p(); +MESSAGEVIEWER_TESTS_EXPORT QString quotedPair_p(); +MESSAGEVIEWER_TESTS_EXPORT QString fws_p(); +MESSAGEVIEWER_TESTS_EXPORT QString fws_op(); +MESSAGEVIEWER_TESTS_EXPORT QString ctext_p(); +MESSAGEVIEWER_TESTS_EXPORT QString ccontent_p(); +MESSAGEVIEWER_TESTS_EXPORT QString comment_p(); +MESSAGEVIEWER_TESTS_EXPORT QString cfws_p(); +MESSAGEVIEWER_TESTS_EXPORT QString cfws_op(); +MESSAGEVIEWER_TESTS_EXPORT QString atext(); +MESSAGEVIEWER_TESTS_EXPORT QString dotAtomText_p(); +MESSAGEVIEWER_TESTS_EXPORT QString dotAtom_p(); +MESSAGEVIEWER_TESTS_EXPORT QString qtext_p(); +MESSAGEVIEWER_TESTS_EXPORT QString qcontent_p(); +MESSAGEVIEWER_TESTS_EXPORT QString quotedString_p(); +MESSAGEVIEWER_TESTS_EXPORT QString quotedString_cp(); +MESSAGEVIEWER_TESTS_EXPORT QString localPart_p(); +MESSAGEVIEWER_TESTS_EXPORT QString token_p(); +MESSAGEVIEWER_TESTS_EXPORT QString value_p(); +MESSAGEVIEWER_TESTS_EXPORT QString value_cp(); +MESSAGEVIEWER_TESTS_EXPORT QString domainName_p(); +} +} + +#endif // DKIMAUTHENTICATIONSTATUSINFOUTIL_H diff --git a/messageviewer/src/dkim-verify/dkimcheckpolicyjob.cpp b/messageviewer/src/dkim-verify/dkimcheckpolicyjob.cpp index e4b8f5d7..57e1a9b4 100644 --- a/messageviewer/src/dkim-verify/dkimcheckpolicyjob.cpp +++ b/messageviewer/src/dkim-verify/dkimcheckpolicyjob.cpp @@ -1,142 +1,143 @@ /* Copyright (C) 2019 Laurent Montel This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "dkimcheckpolicyjob.h" #include "dmarcpolicyjob.h" #include "dkim-verify/dkimmanagerrules.h" #include "settings/messageviewersettings.h" #include "messageviewer_dkimcheckerdebug.h" using namespace MessageViewer; DKIMCheckPolicyJob::DKIMCheckPolicyJob(QObject *parent) : QObject(parent) { } DKIMCheckPolicyJob::~DKIMCheckPolicyJob() { } bool DKIMCheckPolicyJob::canStart() const { return !mEmailAddress.isEmpty(); } bool DKIMCheckPolicyJob::start() { if (!canStart()) { qCWarning(MESSAGEVIEWER_DKIMCHECKER_LOG) << "Impossible to start DKIMCheckPolicyJob" << mEmailAddress; Q_EMIT result(mCheckResult); deleteLater(); return false; } if (mPolicy.useDMarc()) { DMARCPolicyJob *job = new DMARCPolicyJob(this); job->setEmailAddress(mEmailAddress); connect(job, &DMARCPolicyJob::result, this, &DKIMCheckPolicyJob::dmarcPolicyResult); if (!job->start()) { qCWarning(MESSAGEVIEWER_DKIMCHECKER_LOG) << "Impossible to start DKIMCheckPolicyJob" << mEmailAddress; Q_EMIT result(mCheckResult); deleteLater(); return false; } } else { if (mPolicy.useDefaultRules()) { compareWithDefaultRules(); } else { Q_EMIT result(mCheckResult); deleteLater(); } } return true; } void DKIMCheckPolicyJob::compareWithDefaultRules() { const QVector rules = DKIMManagerRules::self()->rules(); for (const DKIMRule &rule : rules) { if (rule.enabled()) { if (rule.from() == mEmailAddress || rule.from() == QLatin1Char('*')) { //Check SDID if (mCheckResult.signedBy == rule.domain()) { switch (rule.ruleType()) { case DKIMRule::RuleType::Unknown: // Invalid rule ! + qCWarning(MESSAGEVIEWER_DKIMCHECKER_LOG) << "Invalid rule found " << rule; break; case DKIMRule::RuleType::MustBeSigned: mCheckResult.status = DKIMCheckSignatureJob::DKIMStatus::NeedToBeSigned; break; case DKIMRule::RuleType::CanBeSigned: //Show a warning ? break; case DKIMRule::RuleType::IgnoreEmailNotSigned: //Nothing ! break; } break; } } } } Q_EMIT result(mCheckResult); deleteLater(); } void DKIMCheckPolicyJob::dmarcPolicyResult(const MessageViewer::DMARCPolicyJob::DMARCResult &value) { if (value.isValid()) { if (mCheckResult.status == DKIMCheckSignatureJob::DKIMStatus::EmailNotSigned) { mCheckResult.status = DKIMCheckSignatureJob::DKIMStatus::NeedToBeSigned; //qDebug() << " void DKIMCheckPolicyJob::dmarcPolicyResult(const MessageViewer::DMARCPolicyJob::DMARCResult &value)"<