File indexing completed on 2024-04-28 15:51:59

0001 /*
0002     SPDX-FileCopyrightText: 2018 Chinmoy Ranjan Pradhan <chinmoyrp65@gmail.com>
0003     SPDX-FileCopyrightText: 2023 g10 Code GmbH
0004     SPDX-FileContributor: Sune Stolborg Vuorela <sune@vuorela.dk>
0005 
0006     SPDX-License-Identifier: GPL-2.0-or-later
0007 */
0008 
0009 #ifndef OKULAR_SIGNATUREPARTUTILS_H
0010 #define OKULAR_SIGNATUREPARTUTILS_H
0011 
0012 #include <QDialog>
0013 #include <QFileInfo>
0014 #include <QStyledItemDelegate>
0015 #include <memory>
0016 #include <optional>
0017 
0018 #include "gui/signatureguiutils.h"
0019 #include <KLocalizedString>
0020 
0021 class PageView;
0022 class Ui_SelectCertificateDialog;
0023 
0024 namespace SignaturePartUtils
0025 {
0026 struct SigningInformation {
0027     std::unique_ptr<Okular::CertificateInfo> certificate;
0028     QString certificatePassword;
0029     QString documentPassword;
0030     QString reason;
0031     QString location;
0032     QString backgroundImagePath;
0033 };
0034 
0035 enum class SigningInformationOption { None = 0x0, BackgroundImage = 0x1 };
0036 Q_DECLARE_FLAGS(SigningInformationOptions, SigningInformationOption);
0037 Q_DECLARE_OPERATORS_FOR_FLAGS(SigningInformationOptions);
0038 
0039 /** Retrieves signing information for this operation
0040     \return nullopt on failure, otherwise information
0041  */
0042 std::optional<SigningInformation> getCertificateAndPasswordForSigning(PageView *pageView, Okular::Document *doc, SigningInformationOptions opts);
0043 
0044 QString getFileNameForNewSignedFile(PageView *pageView, Okular::Document *doc);
0045 
0046 inline QString getSuggestedFileNameForSignedFile(const QString &orig, const QString &suffix)
0047 {
0048     QFileInfo info(orig);
0049     QString baseName;
0050     if (info.suffix() == suffix) {
0051         // we are in a basic plain situation with foo.pdf, or maybe foo-1.2.3.pdf
0052         baseName = info.completeBaseName();
0053     } else if (auto completeBaseName = info.completeBaseName(); completeBaseName.endsWith(suffix)) {
0054         // This could be a case of e.g. pdf.gz; we don't really write those
0055         // so chop it off.
0056         info = QFileInfo(completeBaseName);
0057         baseName = info.completeBaseName();
0058     } else {
0059         // Unsure what's going on here; maybe a pdf file with a weird or no extension.
0060         baseName = info.completeBaseName();
0061     }
0062 
0063     return i18nc("Used when suggesting a new name for a digitally signed file. %1 is the old file name and %2 it's extension", "%1_signed.%2", baseName, suffix);
0064 }
0065 void signUnsignedSignature(const Okular::FormFieldSignature *form, PageView *pageView, Okular::Document *doc);
0066 
0067 class KeyDelegate : public QStyledItemDelegate
0068 {
0069     Q_OBJECT
0070 public:
0071     using QStyledItemDelegate::QStyledItemDelegate;
0072     void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const final;
0073     QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const final;
0074     bool showIcon = false;
0075 };
0076 
0077 class SelectCertificateDialog : public QDialog
0078 {
0079     Q_OBJECT
0080 public:
0081     std::unique_ptr<Ui_SelectCertificateDialog> ui;
0082     ~SelectCertificateDialog() override;
0083 
0084     explicit SelectCertificateDialog(QWidget *parent);
0085 };
0086 }
0087 
0088 #endif