diff --git a/Pdf4QtDiff/main.cpp b/Pdf4QtDiff/main.cpp index 4e505fd..1eb8053 100644 --- a/Pdf4QtDiff/main.cpp +++ b/Pdf4QtDiff/main.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2021 Jakub Melka +// Copyright (C) 2021-2024 Jakub Melka // // This file is part of PDF4QT. // @@ -17,6 +17,7 @@ #include "pdfconstants.h" #include "pdfdocumentreader.h" +#include "pdfsecurityhandler.h" #include "mainwindow.h" #include @@ -31,14 +32,23 @@ int main(int argc, char *argv[]) QCoreApplication::setApplicationName("PDF4QT Diff"); QCoreApplication::setApplicationVersion(pdf::PDF_LIBRARY_VERSION); QApplication::setApplicationDisplayName(QApplication::translate("Application", "PDF4QT Diff")); + + QCommandLineOption noDrm("no-drm", "Disable DRM settings of documents."); + QCommandLineParser parser; parser.setApplicationDescription(QCoreApplication::applicationName()); + parser.addOption(noDrm); parser.addHelpOption(); parser.addVersionOption(); parser.addPositionalArgument("file1", "The PDF file to be compared."); parser.addPositionalArgument("file2", "The PDF file to be compared."); parser.process(application); + if (parser.isSet(noDrm)) + { + pdf::PDFSecurityHandler::setNoDRMMode(); + } + QIcon appIcon(":/app-icon.svg"); QApplication::setWindowIcon(appIcon); diff --git a/Pdf4QtEditor/main.cpp b/Pdf4QtEditor/main.cpp index 140c5ce..55f2c40 100644 --- a/Pdf4QtEditor/main.cpp +++ b/Pdf4QtEditor/main.cpp @@ -17,6 +17,7 @@ #include "pdfeditormainwindow.h" #include "pdfconstants.h" +#include "pdfsecurityhandler.h" #include #include @@ -36,23 +37,32 @@ int main(int argc, char *argv[]) QCoreApplication::setApplicationName("PDF4QT Editor"); QCoreApplication::setApplicationVersion(pdf::PDF_LIBRARY_VERSION); QApplication::setApplicationDisplayName(QApplication::translate("Application", "PDF4QT Editor")); + + QCommandLineOption noDrm("no-drm", "Disable DRM settings of documents."); + QCommandLineParser parser; parser.setApplicationDescription(QCoreApplication::applicationName()); + parser.addOption(noDrm); parser.addHelpOption(); parser.addVersionOption(); parser.addPositionalArgument("file", "The PDF file to open."); parser.process(application); + if (parser.isSet(noDrm)) + { + pdf::PDFSecurityHandler::setNoDRMMode(); + } + QIcon appIcon(":/app-icon.svg"); QApplication::setWindowIcon(appIcon); pdfviewer::PDFEditorMainWindow mainWindow; mainWindow.show(); - QStringList arguments = application.arguments(); - if (arguments.size() > 1) + QStringList arguments = parser.positionalArguments(); + if (!arguments.isEmpty()) { - mainWindow.getProgramController()->openDocument(arguments[1]); + mainWindow.getProgramController()->openDocument(arguments.front()); } return application.exec(); diff --git a/Pdf4QtLibCore/sources/pdfsecurityhandler.cpp b/Pdf4QtLibCore/sources/pdfsecurityhandler.cpp index 4af48cf..97d8d93 100644 --- a/Pdf4QtLibCore/sources/pdfsecurityhandler.cpp +++ b/Pdf4QtLibCore/sources/pdfsecurityhandler.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2019-2022 Jakub Melka +// Copyright (C) 2019-2024 Jakub Melka // // This file is part of PDF4QT. // @@ -52,6 +52,8 @@ namespace pdf { +static bool s_noDrmMode = false; + template using openssl_ptr = std::unique_ptr; @@ -514,6 +516,16 @@ PDFSecurityHandlerPointer PDFSecurityHandler::createSecurityHandler(const PDFObj return handler; } +void PDFSecurityHandler::setNoDRMMode() +{ + s_noDrmMode = true; +} + +bool PDFSecurityHandler::isNoDRM() +{ + return s_noDrmMode; +} + void PDFSecurityHandler::fillEncryptionDictionary(PDFObjectFactory& factory, bool publicKeyHandler) const { factory.beginDictionaryItem("V"); @@ -1306,9 +1318,10 @@ PDFSecurityHandler::AuthorizationResult PDFStandardSecurityHandler::authenticate if (U == m_U) { // We have authorized user access - m_authorizationData.authorizationResult = AuthorizationResult::UserAuthorized; + const AuthorizationResult authorizationResult = isNoDRM() ? AuthorizationResult::OwnerAuthorized : AuthorizationResult::UserAuthorized; + m_authorizationData.authorizationResult = authorizationResult; m_authorizationData.fileEncryptionKey = fileEncryptionKey; - return AuthorizationResult::UserAuthorized; + return authorizationResult; } } @@ -1375,7 +1388,8 @@ PDFSecurityHandler::AuthorizationResult PDFStandardSecurityHandler::authenticate AES_cbc_encrypt(convertByteArrayToUcharPtr(m_UE), convertByteArrayToUcharPtr(m_authorizationData.fileEncryptionKey), m_UE.size(), &key, aesInitializationVector, AES_DECRYPT); // We have authorized user access - m_authorizationData.authorizationResult = AuthorizationResult::UserAuthorized; + const AuthorizationResult authorizationResult = isNoDRM() ? AuthorizationResult::OwnerAuthorized : AuthorizationResult::UserAuthorized; + m_authorizationData.authorizationResult = authorizationResult; } } @@ -2524,9 +2538,10 @@ PDFSecurityHandler::AuthorizationResult PDFPublicKeySecurityHandler::authenticat m_permissions = qFromLittleEndian(decryptedData.data() + 20); } + const AuthorizationResult authorizationResult = isNoDRM() ? AuthorizationResult::OwnerAuthorized : AuthorizationResult::UserAuthorized; m_authorizationData.fileEncryptionKey = digestBuffer.left(m_keyLength / 8); - m_authorizationData.authorizationResult = AuthorizationResult::UserAuthorized; - return AuthorizationResult::UserAuthorized; + m_authorizationData.authorizationResult = authorizationResult; + return authorizationResult; } } } diff --git a/Pdf4QtLibCore/sources/pdfsecurityhandler.h b/Pdf4QtLibCore/sources/pdfsecurityhandler.h index 14895d0..f6e990d 100644 --- a/Pdf4QtLibCore/sources/pdfsecurityhandler.h +++ b/Pdf4QtLibCore/sources/pdfsecurityhandler.h @@ -81,7 +81,7 @@ using PDFSecurityHandlerPointer = QSharedPointer; class PDFStandardSecurityHandler; -class PDFSecurityHandler +class PDF4QTLIBCORESHARED_EXPORT PDFSecurityHandler { public: explicit PDFSecurityHandler() = default; @@ -203,6 +203,12 @@ public: /// \param id First part of the id of the document static PDFSecurityHandlerPointer createSecurityHandler(const PDFObject& encryptionDictionaryObject, const QByteArray& id); + /// Disable DRM mode of documents. + static void setNoDRMMode(); + + /// Returns true, if no DRM mode is enabled + static bool isNoDRM(); + protected: friend class PDFSecurityHandlerFactory; diff --git a/Pdf4QtPageMaster/main.cpp b/Pdf4QtPageMaster/main.cpp index 48f2848..5f6a04a 100644 --- a/Pdf4QtPageMaster/main.cpp +++ b/Pdf4QtPageMaster/main.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2021 Jakub Melka +// Copyright (C) 2021-2024 Jakub Melka // // This file is part of PDF4QT. // @@ -16,6 +16,7 @@ // along with PDF4QT. If not, see . #include "pdfconstants.h" +#include "pdfsecurityhandler.h" #include "mainwindow.h" #include @@ -30,13 +31,22 @@ int main(int argc, char *argv[]) QCoreApplication::setApplicationName("PDF4QT PageMaster"); QCoreApplication::setApplicationVersion(pdf::PDF_LIBRARY_VERSION); QApplication::setApplicationDisplayName(QApplication::translate("Application", "PDF4QT PageMaster")); + + QCommandLineOption noDrm("no-drm", "Disable DRM settings of documents."); + QCommandLineParser parser; parser.setApplicationDescription(QCoreApplication::applicationName()); + parser.addOption(noDrm); parser.addHelpOption(); parser.addVersionOption(); parser.addPositionalArgument("file", "The PDF file to open."); parser.process(application); + if (parser.isSet(noDrm)) + { + pdf::PDFSecurityHandler::setNoDRMMode(); + } + QIcon appIcon(":/app-icon.svg"); QApplication::setWindowIcon(appIcon); diff --git a/Pdf4QtViewer/main.cpp b/Pdf4QtViewer/main.cpp index 6ac90cb..62a7cbe 100644 --- a/Pdf4QtViewer/main.cpp +++ b/Pdf4QtViewer/main.cpp @@ -17,6 +17,7 @@ #include "pdfviewermainwindow.h" #include "pdfconstants.h" +#include "pdfsecurityhandler.h" #include #include @@ -30,23 +31,32 @@ int main(int argc, char *argv[]) QCoreApplication::setApplicationName("PDF4QT Viewer"); QCoreApplication::setApplicationVersion(pdf::PDF_LIBRARY_VERSION); QApplication::setApplicationDisplayName(QApplication::translate("Application", "PDF4QT Viewer")); + + QCommandLineOption noDrm("no-drm", "Disable DRM settings of documents."); + QCommandLineParser parser; parser.setApplicationDescription(QCoreApplication::applicationName()); + parser.addOption(noDrm); parser.addHelpOption(); parser.addVersionOption(); parser.addPositionalArgument("file", "The PDF file to open."); parser.process(application); + if (parser.isSet(noDrm)) + { + pdf::PDFSecurityHandler::setNoDRMMode(); + } + QIcon appIcon(":/app-icon.svg"); QApplication::setWindowIcon(appIcon); pdfviewer::PDFViewerMainWindow mainWindow; mainWindow.show(); - QStringList arguments = application.arguments(); - if (arguments.size() > 1) + QStringList arguments = parser.positionalArguments(); + if (arguments.size() > 0) { - mainWindow.getProgramController()->openDocument(arguments[1]); + mainWindow.getProgramController()->openDocument(arguments.front()); } return application.exec(); diff --git a/RELEASES.txt b/RELEASES.txt index 890f68d..0d62f0c 100644 --- a/RELEASES.txt +++ b/RELEASES.txt @@ -1,5 +1,7 @@ CURRENT: + - Issue #183: Option to ignore PDF security settings - Issue #182: PDF4QT Document Diff command line cmd line arguments ignored + - Issue #181: where is the dark mode? - Issue #173: errors loading file Echoplex.pdf - Issue #172: access keys are missing from most menu items/action text strings - Issue #168: When opening a PDF file or merging some PDF files, stamp will disappear.