diff --git a/CMakeLists.txt b/CMakeLists.txt index 5ec48af6c..e262ea348 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,473 +1,474 @@ cmake_minimum_required(VERSION 3.0) # 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(okular VERSION 1.4.${KDE_APPLICATIONS_VERSION_MICRO}) set(QT_REQUIRED_VERSION "5.8.0") set(KF5_REQUIRED_VERSION "5.33.0") find_package(ECM 5.33.0 CONFIG REQUIRED) set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${ECM_MODULE_PATH}) include(ECMInstallIcons) include(ECMSetupVersion) include(ECMOptionalAddSubdirectory) include(GenerateExportHeader) include(FeatureSummary) include(ECMAddAppIcon) include(KDECompilerSettings NO_POLICY_SCOPE) include(KDEInstallDirs) include(KDECMakeSettings) include(ECMAddTests) include(ECMAddAppIcon) include(CMakePackageConfigHelpers) ecm_setup_version(${PROJECT_VERSION} VARIABLE_PREFIX OKULAR VERSION_HEADER "${CMAKE_CURRENT_BINARY_DIR}/core/version.h" PACKAGE_VERSION_FILE "${CMAKE_CURRENT_BINARY_DIR}/Okular5ConfigVersion.cmake") find_package(Qt5 ${QT_REQUIRED_VERSION} CONFIG REQUIRED COMPONENTS Core DBus Test Widgets PrintSupport Svg Qml Quick) find_package(Qt5 ${QT_REQUIRED_VERSION} OPTIONAL_COMPONENTS TextToSpeech) if (NOT Qt5TextToSpeech_FOUND) message(STATUS "Qt5TextToSpeech not found, speech features will be disabled") else() add_definitions(-DHAVE_SPEECH) endif() if(NOT CMAKE_VERSION VERSION_LESS "3.10.0") # CMake 3.9+ warns about automoc on files without Q_OBJECT, and doesn't know about other macros. # 3.10+ lets us provide more macro names that require automoc. list(APPEND CMAKE_AUTOMOC_MACRO_NAMES "OKULAR_EXPORT_PLUGIN") endif() set(optionalComponents) if (ANDROID) # we want to make sure that generally all components are found set(optionalComponents "OPTIONAL_COMPONENTS") endif() find_package(KF5 ${KF5_REQUIRED_VERSION} REQUIRED COMPONENTS Archive Bookmarks Completion Config ConfigWidgets CoreAddons Crash IconThemes KIO Parts ThreadWeaver WindowSystem ${optionalComponents} DocTools JS Wallet ) if(KF5Wallet_FOUND) add_definitions(-DWITH_KWALLET=1) endif() if(KF5JS_FOUND) add_definitions(-DWITH_KJS=1) endif() if(NOT WIN32 AND NOT ANDROID) find_package(KF5 ${KF5_REQUIRED_VERSION} REQUIRED COMPONENTS Activities ) set_package_properties("KF5Activities" PROPERTIES DESCRIPTION "Activities interface library" URL "https://api.kde.org/frameworks/kactivities/html/" TYPE RECOMMENDED PURPOSE "Required for Activities integration.") endif() find_package(KF5Kirigami2) set_package_properties(KF5Kirigami2 PROPERTIES DESCRIPTION "A QtQuick based components set" PURPOSE "Required at runtime by the mobile app" TYPE RUNTIME ) find_package(Phonon4Qt5 CONFIG REQUIRED) find_package(KDEExperimentalPurpose) set_package_properties(KDEExperimentalPurpose PROPERTIES DESCRIPTION "A framework for services and actions integration" PURPOSE "Required for enabling the share menu in Okular" TYPE OPTIONAL ) if (KDEExperimentalPurpose_FOUND) set(PURPOSE_FOUND 1) else() set(PURPOSE_FOUND 0) endif() set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_SOURCE_DIR}/cmake/modules) find_package(ZLIB REQUIRED) # This is here instead of in generators since we use if(Poppler_Qt5_FOUND) in autotests/ find_package(Poppler "0.12.1" COMPONENTS Qt5) set_package_properties("Poppler" PROPERTIES TYPE RECOMMENDED PURPOSE "Support for PDF files in okular.") add_definitions(-DQT_USE_FAST_CONCATENATION -DQT_USE_FAST_OPERATOR_PLUS) add_definitions(-DTRANSLATION_DOMAIN="okular") add_definitions(-DQT_NO_URL_CAST_FROM_STRING) include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${PHONON_INCLUDES} core/synctex ${ZLIB_INCLUDE_DIR} ${CMAKE_BINARY_DIR}/core) option(BUILD_OKULARKIRIGAMI "Builds the touch-friendly frontend" ON) if (BUILD_OKULARKIRIGAMI) add_subdirectory( mobile ) endif() option(BUILD_COVERAGE "Build the project with gcov support" OFF) if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS "5.0.0") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wsuggest-override" ) endif() endif() if(BUILD_COVERAGE) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fprofile-arcs -ftest-coverage") set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lgcov") endif() add_subdirectory( ui ) add_subdirectory( shell ) add_subdirectory( generators ) add_subdirectory( autotests ) add_subdirectory( conf/autotests ) if(KF5DocTools_FOUND) add_subdirectory(doc) endif() include(OkularConfigureChecks.cmake) if(NOT WIN32) set(MATH_LIB m) else(NOT WIN32) set(MATH_LIB) endif(NOT WIN32) # okularcore set(okularcore_SRCS core/action.cpp core/annotations.cpp core/area.cpp core/audioplayer.cpp core/bookmarkmanager.cpp core/chooseenginedialog.cpp core/document.cpp core/documentcommands.cpp core/fontinfo.cpp core/form.cpp core/generator.cpp core/generator_p.cpp core/misc.cpp core/movie.cpp core/observer.cpp core/debug.cpp core/page.cpp core/pagecontroller.cpp core/pagesize.cpp core/pagetransition.cpp core/rotationjob.cpp core/scripter.cpp core/sound.cpp core/sourcereference.cpp core/textdocumentgenerator.cpp core/textdocumentsettings.cpp core/textpage.cpp core/tilesmanager.cpp core/utils.cpp core/view.cpp core/fileprinter.cpp core/signatureinfo.cpp core/script/event.cpp core/synctex/synctex_parser.c core/synctex/synctex_parser_utils.c ) qt5_add_resources(okularcore_SRCS core/script/builtin.qrc ) ki18n_wrap_ui(okularcore_SRCS conf/textdocumentsettings.ui ) install( FILES core/action.h core/annotations.h core/area.h core/document.h core/fontinfo.h core/form.h core/generator.h core/global.h core/page.h core/pagesize.h core/pagetransition.h core/signatureinfo.h core/sound.h core/sourcereference.h core/textdocumentgenerator.h core/textdocumentsettings.h core/textpage.h core/tile.h core/utils.h core/fileprinter.h core/observer.h ${CMAKE_CURRENT_BINARY_DIR}/core/version.h ${CMAKE_CURRENT_BINARY_DIR}/core/okularcore_export.h ${CMAKE_CURRENT_BINARY_DIR}/settings_core.h DESTINATION ${KDE_INSTALL_INCLUDEDIR}/okular/core COMPONENT Devel) install( FILES interfaces/configinterface.h interfaces/guiinterface.h interfaces/printinterface.h interfaces/saveinterface.h interfaces/viewerinterface.h DESTINATION ${KDE_INSTALL_INCLUDEDIR}/okular/interfaces COMPONENT Devel) ki18n_wrap_ui(okularcore_SRCS core/chooseenginewidget.ui ) kconfig_add_kcfg_files(okularcore_SRCS conf/settings_core.kcfgc) add_library(okularcore SHARED ${okularcore_SRCS}) generate_export_header(okularcore BASE_NAME okularcore EXPORT_FILE_NAME "${CMAKE_CURRENT_BINARY_DIR}/core/okularcore_export.h") if (ANDROID) set(fileName ${CMAKE_BINARY_DIR}/Okular5Core-android-dependencies.xml) file(WRITE "${fileName}" "\n" "\n" "\n") install(FILES ${fileName} DESTINATION ${KDE_INSTALL_LIBDIR}) endif() # Special handling for linking okularcore on OSX/Apple IF(APPLE) SET(OKULAR_IOKIT "-framework IOKit" CACHE STRING "Apple IOKit framework") ENDIF(APPLE) # Extra library needed by imported synctex code on Windows if(WIN32) set(SHLWAPI shlwapi) endif(WIN32) target_link_libraries(okularcore PRIVATE ${OKULAR_IOKIT} ${SHLWAPI} KF5::Archive KF5::KIOCore KF5::KIOWidgets KF5::I18n KF5::ThreadWeaver KF5::Bookmarks Phonon::phonon4qt5 ${MATH_LIB} ${ZLIB_LIBRARIES} PUBLIC # these are included from the installed headers KF5::CoreAddons KF5::XmlGui KF5::ConfigGui Qt5::PrintSupport Qt5::Widgets ) if (KF5Wallet_FOUND) target_link_libraries(okularcore PRIVATE KF5::Wallet) endif() if (KF5JS_FOUND) target_sources(okularcore PRIVATE core/script/executor_kjs.cpp core/script/kjs_app.cpp core/script/kjs_console.cpp core/script/kjs_data.cpp core/script/kjs_document.cpp core/script/kjs_field.cpp core/script/kjs_fullscreen.cpp core/script/kjs_field.cpp core/script/kjs_spell.cpp core/script/kjs_util.cpp core/script/kjs_event.cpp ) target_link_libraries(okularcore PRIVATE KF5::JS KF5::JSApi) endif() set_target_properties(okularcore PROPERTIES VERSION 9.0.0 SOVERSION 9 OUTPUT_NAME Okular5Core EXPORT_NAME Core) install(TARGETS okularcore EXPORT Okular5Targets ${KDE_INSTALL_TARGETS_DEFAULT_ARGS}) install(FILES conf/okular.kcfg DESTINATION ${KDE_INSTALL_KCFGDIR}) install(FILES conf/okular_core.kcfg DESTINATION ${KDE_INSTALL_KCFGDIR}) install(FILES core/okularGenerator.desktop DESTINATION ${KDE_INSTALL_KSERVICETYPES5DIR}) # okularpart set(okularpart_conf_SRCS conf/preferencesdialog.cpp conf/dlgaccessibility.cpp conf/dlgdebug.cpp conf/dlgeditor.cpp conf/dlggeneral.cpp conf/dlgannotations.cpp conf/dlgperformance.cpp conf/dlgpresentation.cpp conf/editannottooldialog.cpp conf/editdrawingtooldialog.cpp conf/widgetannottools.cpp conf/widgetconfigurationtoolsbase.cpp conf/widgetdrawingtools.cpp ) set(okularpart_SRCS ${okularpart_conf_SRCS} part.cpp extensions.cpp ui/embeddedfilesdialog.cpp ui/annotwindow.cpp ui/annotationmodel.cpp ui/annotationpopup.cpp ui/annotationpropertiesdialog.cpp ui/annotationproxymodels.cpp ui/annotationtools.cpp ui/annotationwidgets.cpp ui/bookmarklist.cpp ui/certificateviewer.cpp ui/debug_ui.cpp ui/drawingtoolactions.cpp ui/fileprinterpreview.cpp ui/findbar.cpp ui/formwidgets.cpp ui/guiutils.cpp ui/ktreeviewsearchline.cpp ui/latexrenderer.cpp ui/minibar.cpp ui/okmenutitle.cpp ui/pageitemdelegate.cpp ui/pagepainter.cpp ui/pagesizelabel.cpp ui/pageviewannotator.cpp ui/pageviewmouseannotation.cpp ui/pageview.cpp ui/magnifierview.cpp ui/pageviewutils.cpp ui/presentationsearchbar.cpp ui/presentationwidget.cpp ui/propertiesdialog.cpp ui/revisionviewer.cpp ui/searchlineedit.cpp ui/searchwidget.cpp ui/sidebar.cpp ui/side_reviews.cpp ui/snapshottaker.cpp ui/thumbnaillist.cpp ui/toc.cpp ui/tocmodel.cpp ui/toolaction.cpp ui/videowidget.cpp ui/layers.cpp ui/signatureguiutils.cpp + ui/signaturepropertiesdialog.cpp ) if (Qt5TextToSpeech_FOUND) set(okularpart_SRCS ${okularpart_SRCS} ui/tts.cpp) endif() ki18n_wrap_ui(okularpart_SRCS conf/dlgaccessibilitybase.ui conf/dlgeditorbase.ui conf/dlggeneralbase.ui conf/dlgannotationsbase.ui conf/dlgperformancebase.ui conf/dlgpresentationbase.ui ) kconfig_add_kcfg_files(okularpart_SRCS conf/settings.kcfgc) add_library(okularpart SHARED ${okularpart_SRCS}) generate_export_header(okularpart BASE_NAME okularpart) target_link_libraries(okularpart okularcore ${MATH_LIB} Qt5::Svg Phonon::phonon4qt5 KF5::Archive KF5::Bookmarks KF5::I18n KF5::IconThemes KF5::ItemViews KF5::KIOCore KF5::KIOFileWidgets KF5::KIOWidgets KF5::Parts KF5::Solid KF5::WindowSystem ) if(KF5Wallet_FOUND) target_link_libraries(okularpart KF5::Wallet) endif() if (KDEExperimentalPurpose_FOUND) target_link_libraries(okularpart KDEExperimental::PurposeWidgets) endif() set_target_properties(okularpart PROPERTIES PREFIX "") if (Qt5TextToSpeech_FOUND) target_link_libraries(okularpart Qt5::TextToSpeech) endif() install(TARGETS okularpart DESTINATION ${KDE_INSTALL_PLUGINDIR}) ########### install files ############### install(FILES okular.upd DESTINATION ${KDE_INSTALL_DATADIR}/kconf_update) install( FILES okular_part.desktop DESTINATION ${KDE_INSTALL_KSERVICES5DIR} ) install( FILES part.rc part-viewermode.rc DESTINATION ${KDE_INSTALL_KXMLGUI5DIR}/okular ) install( FILES okular.categories DESTINATION ${KDE_INSTALL_CONFDIR} ) ########### cmake files ################# set(CMAKECONFIG_INSTALL_DIR "${KDE_INSTALL_CMAKEPACKAGEDIR}/Okular5") configure_package_config_file( "${CMAKE_CURRENT_SOURCE_DIR}/Okular5Config.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/Okular5Config.cmake" INSTALL_DESTINATION ${CMAKECONFIG_INSTALL_DIR} PATH_VARS INCLUDE_INSTALL_DIR CMAKE_INSTALL_PREFIX ) install(FILES "${CMAKE_CURRENT_BINARY_DIR}/Okular5Config.cmake" "${CMAKE_CURRENT_BINARY_DIR}/Okular5ConfigVersion.cmake" DESTINATION "${CMAKECONFIG_INSTALL_DIR}" COMPONENT Devel ) install(EXPORT Okular5Targets DESTINATION "${CMAKECONFIG_INSTALL_DIR}" FILE Okular5Targets.cmake NAMESPACE Okular::) ########### summary ################# feature_summary(WHAT ALL FATAL_ON_MISSING_REQUIRED_PACKAGES) diff --git a/ui/signatureguiutils.cpp b/ui/signatureguiutils.cpp index 73e0e73dc..ab4babcf1 100644 --- a/ui/signatureguiutils.cpp +++ b/ui/signatureguiutils.cpp @@ -1,140 +1,140 @@ /*************************************************************************** * Copyright (C) 2018 by Chinmoy Ranjan Pradhan * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * ***************************************************************************/ #include "signatureguiutils.h" #include #include "core/form.h" #include "core/page.h" #include "core/document.h" namespace SignatureGuiUtils { QVector getSignatureFormFields( Okular::Document *doc, bool allPages, int pageNum ) { uint curPage = allPages ? 0 : pageNum; uint endPage = allPages ? doc->pages() - 1 : pageNum; QVector signatureFormFields; while ( curPage <= endPage ) { - foreach ( Okular::FormField *f, doc->page( curPage )->formFields() ) + foreach ( Okular::FormField *f, doc->page( curPage++ )->formFields() ) { if ( f->type() == Okular::FormField::FormSignature ) { signatureFormFields.append( static_cast( f ) ); } } } return signatureFormFields; } QString getReadableSignatureStatus( Okular::SignatureInfo::SignatureStatus sigStatus ) { switch ( sigStatus ) { case Okular::SignatureInfo::SignatureValid: return i18n("The signature is cryptographically valid."); case Okular::SignatureInfo::SignatureInvalid: return i18n("The signature is cryptographically invalid."); case Okular::SignatureInfo::SignatureDigestMismatch: return i18n("Digest Mismatch occurred."); case Okular::SignatureInfo::SignatureDecodingError: return i18n("The signature CMS/PKCS7 structure is malformed."); case Okular::SignatureInfo::SignatureNotFound: return i18n("The requested signature is not present in the document."); default: return i18n("The signature could not be verified."); } } QString getReadableCertStatus( Okular::SignatureInfo::CertificateStatus certStatus ) { switch ( certStatus ) { case Okular::SignatureInfo::CertificateTrusted: return i18n("Certificate is Trusted."); case Okular::SignatureInfo::CertificateUntrustedIssuer: return i18n("Certificate issuer isn't Trusted."); case Okular::SignatureInfo::CertificateUnknownIssuer: return i18n("Certificate issuer is unknown."); case Okular::SignatureInfo::CertificateRevoked: return i18n("Certificate has been Revoked."); case Okular::SignatureInfo::CertificateExpired: return i18n("Certificate has Expired."); case Okular::SignatureInfo::CertificateNotVerified: return i18n("Certificate has not yet been verified."); default: return i18n("Unknown issue with Certificate or corrupted data."); } } QString getReadableHashAlgorithm( Okular::SignatureInfo::HashAlgorithm hashAlg ) { switch ( hashAlg ) { case Okular::SignatureInfo::HashAlgorithmMd2: return i18n("MD2"); case Okular::SignatureInfo::HashAlgorithmMd5: return i18n("MD5"); case Okular::SignatureInfo::HashAlgorithmSha1: return i18n("SHA1"); case Okular::SignatureInfo::HashAlgorithmSha256: return i18n("SHA256"); case Okular::SignatureInfo::HashAlgorithmSha384: return i18n("SHA384"); case Okular::SignatureInfo::HashAlgorithmSha512: return i18n("SHA512"); case Okular::SignatureInfo::HashAlgorithmSha224: return i18n("SHA224"); default: return i18n("Unknown Algorithm"); } } QString getReadablePublicKeyType( Okular::CertificateInfo::PublicKeyType type ) { switch ( type ) { case Okular::CertificateInfo::RsaKey: return i18n("RSA"); case Okular::CertificateInfo::DsaKey: return i18n("DSA"); case Okular::CertificateInfo::EcKey: return i18n("EC"); case Okular::CertificateInfo::OtherKey: return i18n("Unknown Type"); } } QString getReadableKeyUsage( Okular::CertificateInfo::KeyUsageExtensions kuExtensions ) { QStringList ku; if ( kuExtensions.testFlag( Okular::CertificateInfo::KuDigitalSignature ) ) ku << i18n("Digital Signature"); if ( kuExtensions.testFlag( Okular::CertificateInfo::KuNonRepudiation ) ) ku << i18n("Non-Repudiation"); if ( kuExtensions.testFlag( Okular::CertificateInfo::KuKeyEncipherment ) ) ku << i18n("Encrypt Keys"); if ( kuExtensions.testFlag( Okular::CertificateInfo::KuDataEncipherment ) ) ku << i18n("Decrypt Keys"); if ( kuExtensions.testFlag( Okular::CertificateInfo::KuKeyAgreement ) ) ku << i18n("Key Agreement"); if ( kuExtensions.testFlag( Okular::CertificateInfo::KuKeyCertSign ) ) ku << i18n("Sign Certificate"); if ( kuExtensions.testFlag( Okular::CertificateInfo::KuClrSign ) ) ku << i18n("Sign CRL"); if ( kuExtensions.testFlag( Okular::CertificateInfo::KuEncipherOnly ) ) ku << i18n("Encrypt Only"); if ( ku.isEmpty() ) ku << i18n("No Usage Specified"); return ku.join(", "); } } diff --git a/ui/signaturepropertiesdialog.cpp b/ui/signaturepropertiesdialog.cpp new file mode 100644 index 000000000..3e0f96a01 --- /dev/null +++ b/ui/signaturepropertiesdialog.cpp @@ -0,0 +1,135 @@ +/*************************************************************************** + * Copyright (C) 2018 by Chinmoy Ranjan Pradhan * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + ***************************************************************************/ + +#include "signaturepropertiesdialog.h" + +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "core/form.h" +#include "core/document.h" + +#include "signatureguiutils.h" +#include "revisionviewer.h" +#include "certificateviewer.h" + +static QString getValidDisplayString( const QString &str ) +{ + return !str.isEmpty() ? str : i18n("Not Available"); +} + +SignaturePropertiesDialog::SignaturePropertiesDialog( Okular::Document *doc, Okular::FormFieldSignature *form, QWidget *parent ) + : QDialog( parent ), m_doc( doc ), m_signatureForm( form ) +{ + setModal( true ); + setWindowTitle( i18n("Signature Properties") ); + + m_signatureInfo = m_signatureForm->validate(); + const Okular::SignatureInfo::SignatureStatus signatureStatus = m_signatureInfo->signatureStatus(); + const QString readableSignatureStatus = SignatureGuiUtils::getReadableSignatureStatus( signatureStatus ); + const QString signerName = getValidDisplayString( m_signatureInfo->signerName() ); + const QString signingTime = getValidDisplayString( m_signatureInfo->signingTime().toString( QStringLiteral("MMM dd yyyy hh:mm:ss") ) ); + const QString signingLocation = getValidDisplayString( m_signatureInfo->location() ); + const QString signingReason = getValidDisplayString( m_signatureInfo->reason() ); + + // signature validation status + QString modificationSummary; + if ( signatureStatus == Okular::SignatureInfo::SignatureValid ) + { + if ( m_signatureInfo->signsTotalDocument() ) + { + modificationSummary = i18n("The document has not been modified since it was signed."); + } + else + { + modificationSummary = i18n("The revision of the document that was covered by this signature has not been modified;\n" + "however there have been subsequent changes to the document."); + } + } + else if ( signatureStatus == Okular::SignatureInfo::SignatureDigestMismatch ) + { + modificationSummary = i18n("The document has been modified in a way not permitted by a previous signer."); + } + else + { + modificationSummary = i18n("The document integrity verification could not be completed."); + } + + auto signatureStatusBox = new QGroupBox( i18n("Validity Status") ); + auto signatureStatusFormLayout = new QFormLayout( signatureStatusBox ); + signatureStatusFormLayout->setLabelAlignment( Qt::AlignLeft ); + signatureStatusFormLayout->addRow( i18n("Signature Validity:"), new QLabel( readableSignatureStatus ) ); + signatureStatusFormLayout->addRow( i18n("Document Modifications:"), new QLabel( modificationSummary ) ); + + // additional information + auto extraInfoBox = new QGroupBox( i18n("Additional Information") ); + auto extraInfoFormLayout = new QFormLayout( extraInfoBox ); + extraInfoFormLayout->setLabelAlignment( Qt::AlignLeft ); + extraInfoFormLayout->addRow( i18n("Signed By:"), new QLabel( signerName ) ); + extraInfoFormLayout->addRow( i18n("Signing Time:"), new QLabel( signingTime ) ); + extraInfoFormLayout->addRow( i18n("Reason:"), new QLabel( signingReason ) ); + extraInfoFormLayout->addRow( i18n("Location:"), new QLabel( signingLocation ) ); + + // keep width of column 1 same + auto resizer = new KColumnResizer( this ); + resizer->addWidgetsFromLayout( signatureStatusFormLayout->layout(), 0 ); + resizer->addWidgetsFromLayout( extraInfoFormLayout->layout(), 0 ); + + // document revision info + auto revisionBox = new QGroupBox( i18n("Document Version") ); + auto revisionLayout = new QHBoxLayout( revisionBox ); + QVector signatureFormFields = SignatureGuiUtils::getSignatureFormFields( m_doc, true, -1 ); + revisionLayout->addWidget( new QLabel( i18nc("Document Revision of ", "Document Revision %1 of %2", + signatureFormFields.indexOf( m_signatureForm ) + 1, signatureFormFields.size() ) ) ); + revisionLayout->addStretch(); + auto revisionBtn = new QPushButton( i18n("View Signed Version...") ); + revisionBtn->setEnabled( !m_signatureInfo->signsTotalDocument() ); + connect( revisionBtn, &QPushButton::clicked, this, &SignaturePropertiesDialog::viewSignedVersion ); + revisionLayout->addWidget( revisionBtn ); + + // button box + auto btnBox = new QDialogButtonBox( QDialogButtonBox::Close, this ); + auto certPropBtn = new QPushButton( i18n("Vew Certificate...") ); + certPropBtn->setEnabled( !m_signatureInfo->certificateInfo()->isNull() ); + btnBox->addButton( certPropBtn, QDialogButtonBox::ActionRole ); + connect( btnBox, &QDialogButtonBox::rejected, this, &SignaturePropertiesDialog::reject ); + connect( certPropBtn, &QPushButton::clicked, this, &SignaturePropertiesDialog::viewCertificateProperties ); + + auto mainLayout = new QVBoxLayout( this ); + mainLayout->addWidget( signatureStatusBox ); + mainLayout->addWidget( extraInfoBox ); + mainLayout->addWidget( revisionBox ); + mainLayout->addWidget( btnBox ); + + resize( mainLayout->sizeHint() ); +} + +void SignaturePropertiesDialog::viewCertificateProperties() +{ + CertificateViewer certViewer( m_signatureInfo->certificateInfo(), this ); + certViewer.exec(); +} + +void SignaturePropertiesDialog::viewSignedVersion() +{ + QByteArray data; + m_doc->requestSignedRevisionData( m_signatureInfo, &data ); + RevisionViewer revViewer( data, this ); + revViewer.viewRevision(); +} + +#include "moc_signaturepropertiesdialog.cpp" diff --git a/ui/signaturepropertiesdialog.h b/ui/signaturepropertiesdialog.h new file mode 100644 index 000000000..695210be1 --- /dev/null +++ b/ui/signaturepropertiesdialog.h @@ -0,0 +1,38 @@ +/*************************************************************************** + * Copyright (C) 2018 by Chinmoy Ranjan Pradhan * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + ***************************************************************************/ + +#ifndef OKULAR_SIGNATUREPROPERTIESDIALOG_H +#define OKULAR_SIGNATUREPROPERTIESDIALOG_H + +#include + +namespace Okular { + class Document; + class FormFieldSignature; + class SignatureInfo; +} + +class SignaturePropertiesDialog : public QDialog +{ + Q_OBJECT + + public: + SignaturePropertiesDialog( Okular::Document *doc, Okular::FormFieldSignature *form, QWidget *parent = nullptr ); + + public Q_SLOTS: + void viewSignedVersion(); + void viewCertificateProperties(); + + private: + Okular::Document *m_doc; + Okular::FormFieldSignature *m_signatureForm; + Okular::SignatureInfo *m_signatureInfo; +}; + +#endif