File indexing completed on 2024-05-12 16:06:45

0001 /*
0002     SPDX-FileCopyrightText: 2007 Pino Toscano <pino@kde.org>
0003     SPDX-FileCopyrightText: 2018 Intevation GmbH <intevation@intevation.de>
0004     SPDX-FileCopyrightText: 2019 Oliver Sander <oliver.sander@tu-dresden.de>
0005 
0006     SPDX-License-Identifier: GPL-2.0-or-later
0007 */
0008 
0009 #include "formfields.h"
0010 
0011 #include "core/action.h"
0012 
0013 #include "generator_pdf.h"
0014 #include "pdfsettings.h"
0015 #include "pdfsignatureutils.h"
0016 
0017 #include <poppler-qt6.h>
0018 
0019 extern Okular::Action *createLinkFromPopplerLink(const Poppler::Link *popplerLink, bool deletePopplerLink);
0020 #define SET_ANNOT_ACTIONS                                                                                                                                                                                                                      \
0021     setAdditionalAction(Okular::Annotation::CursorEntering, createLinkFromPopplerLink(m_field->additionalAction(Poppler::Annotation::CursorEnteringAction).get(), false));                                                                     \
0022     setAdditionalAction(Okular::Annotation::CursorLeaving, createLinkFromPopplerLink(m_field->additionalAction(Poppler::Annotation::CursorLeavingAction).get(), false));                                                                       \
0023     setAdditionalAction(Okular::Annotation::MousePressed, createLinkFromPopplerLink(m_field->additionalAction(Poppler::Annotation::MousePressedAction).get(), false));                                                                         \
0024     setAdditionalAction(Okular::Annotation::MouseReleased, createLinkFromPopplerLink(m_field->additionalAction(Poppler::Annotation::MouseReleasedAction).get(), false));                                                                       \
0025     setAdditionalAction(Okular::Annotation::FocusIn, createLinkFromPopplerLink(m_field->additionalAction(Poppler::Annotation::FocusInAction).get(), false));                                                                                   \
0026     setAdditionalAction(Okular::Annotation::FocusOut, createLinkFromPopplerLink(m_field->additionalAction(Poppler::Annotation::FocusOutAction).get(), false));
0027 
0028 #define SET_ACTIONS                                                                                                                                                                                                                            \
0029     setActivationAction(createLinkFromPopplerLink(m_field->activationAction().get(), false));                                                                                                                                                  \
0030     setAdditionalAction(Okular::FormField::FieldModified, createLinkFromPopplerLink(m_field->additionalAction(Poppler::FormField::FieldModified).get(), false));                                                                               \
0031     setAdditionalAction(Okular::FormField::FormatField, createLinkFromPopplerLink(m_field->additionalAction(Poppler::FormField::FormatField).get(), false));                                                                                   \
0032     setAdditionalAction(Okular::FormField::ValidateField, createLinkFromPopplerLink(m_field->additionalAction(Poppler::FormField::ValidateField).get(), false));                                                                               \
0033     setAdditionalAction(Okular::FormField::CalculateField, createLinkFromPopplerLink(m_field->additionalAction(Poppler::FormField::CalculateField).get(), false));                                                                             \
0034     SET_ANNOT_ACTIONS
0035 
0036 PopplerFormFieldButton::PopplerFormFieldButton(std::unique_ptr<Poppler::FormFieldButton> field)
0037     : Okular::FormFieldButton()
0038     , m_field(std::move(field))
0039 {
0040     m_rect = Okular::NormalizedRect::fromQRectF(m_field->rect());
0041     m_id = m_field->id();
0042     SET_ACTIONS
0043 }
0044 
0045 Okular::NormalizedRect PopplerFormFieldButton::rect() const
0046 {
0047     return m_rect;
0048 }
0049 
0050 int PopplerFormFieldButton::id() const
0051 {
0052     return m_id;
0053 }
0054 
0055 QString PopplerFormFieldButton::name() const
0056 {
0057     return m_field->name();
0058 }
0059 
0060 QString PopplerFormFieldButton::uiName() const
0061 {
0062     return m_field->uiName();
0063 }
0064 
0065 QString PopplerFormFieldButton::fullyQualifiedName() const
0066 {
0067     return m_field->fullyQualifiedName();
0068 }
0069 
0070 bool PopplerFormFieldButton::isReadOnly() const
0071 {
0072     return m_field->isReadOnly();
0073 }
0074 
0075 void PopplerFormFieldButton::setReadOnly(bool value)
0076 {
0077     m_field->setReadOnly(value);
0078 }
0079 
0080 bool PopplerFormFieldButton::isVisible() const
0081 {
0082     return m_field->isVisible();
0083 }
0084 
0085 void PopplerFormFieldButton::setVisible(bool value)
0086 {
0087     m_field->setVisible(value);
0088 }
0089 
0090 bool PopplerFormFieldButton::isPrintable() const
0091 {
0092     return m_field->isPrintable();
0093 }
0094 
0095 void PopplerFormFieldButton::setPrintable(bool value)
0096 {
0097     m_field->setPrintable(value);
0098 }
0099 
0100 Okular::FormFieldButton::ButtonType PopplerFormFieldButton::buttonType() const
0101 {
0102     switch (m_field->buttonType()) {
0103     case Poppler::FormFieldButton::Push:
0104         return Okular::FormFieldButton::Push;
0105     case Poppler::FormFieldButton::CheckBox:
0106         return Okular::FormFieldButton::CheckBox;
0107     case Poppler::FormFieldButton::Radio:
0108         return Okular::FormFieldButton::Radio;
0109     }
0110     return Okular::FormFieldButton::Push;
0111 }
0112 
0113 QString PopplerFormFieldButton::caption() const
0114 {
0115     return m_field->caption();
0116 }
0117 
0118 bool PopplerFormFieldButton::state() const
0119 {
0120     return m_field->state();
0121 }
0122 
0123 void PopplerFormFieldButton::setState(bool state)
0124 {
0125     m_field->setState(state);
0126 }
0127 
0128 QList<int> PopplerFormFieldButton::siblings() const
0129 {
0130     return m_field->siblings();
0131 }
0132 
0133 Poppler::FormFieldIcon PopplerFormFieldButton::icon() const
0134 {
0135     return m_field->icon();
0136 }
0137 
0138 void PopplerFormFieldButton::setIcon(Okular::FormField *field)
0139 {
0140     if (field->type() == Okular::FormField::FormButton) {
0141         PopplerFormFieldButton *button = static_cast<PopplerFormFieldButton *>(field);
0142         m_field->setIcon(button->icon());
0143     }
0144 }
0145 
0146 PopplerFormFieldText::PopplerFormFieldText(std::unique_ptr<Poppler::FormFieldText> field)
0147     : Okular::FormFieldText()
0148     , m_field(std::move(field))
0149 {
0150     m_rect = Okular::NormalizedRect::fromQRectF(m_field->rect());
0151     m_id = m_field->id();
0152     SET_ACTIONS
0153 }
0154 
0155 Okular::NormalizedRect PopplerFormFieldText::rect() const
0156 {
0157     return m_rect;
0158 }
0159 
0160 int PopplerFormFieldText::id() const
0161 {
0162     return m_id;
0163 }
0164 
0165 QString PopplerFormFieldText::name() const
0166 {
0167     return m_field->name();
0168 }
0169 
0170 QString PopplerFormFieldText::uiName() const
0171 {
0172     return m_field->uiName();
0173 }
0174 
0175 QString PopplerFormFieldText::fullyQualifiedName() const
0176 {
0177     return m_field->fullyQualifiedName();
0178 }
0179 
0180 bool PopplerFormFieldText::isReadOnly() const
0181 {
0182     return m_field->isReadOnly();
0183 }
0184 
0185 void PopplerFormFieldText::setReadOnly(bool value)
0186 {
0187     m_field->setReadOnly(value);
0188 }
0189 
0190 bool PopplerFormFieldText::isVisible() const
0191 {
0192     return m_field->isVisible();
0193 }
0194 
0195 void PopplerFormFieldText::setVisible(bool value)
0196 {
0197     m_field->setVisible(value);
0198 }
0199 
0200 bool PopplerFormFieldText::isPrintable() const
0201 {
0202     return m_field->isPrintable();
0203 }
0204 
0205 void PopplerFormFieldText::setPrintable(bool value)
0206 {
0207     m_field->setPrintable(value);
0208 }
0209 
0210 Okular::FormFieldText::TextType PopplerFormFieldText::textType() const
0211 {
0212     switch (m_field->textType()) {
0213     case Poppler::FormFieldText::Normal:
0214         return Okular::FormFieldText::Normal;
0215     case Poppler::FormFieldText::Multiline:
0216         return Okular::FormFieldText::Multiline;
0217     case Poppler::FormFieldText::FileSelect:
0218         return Okular::FormFieldText::FileSelect;
0219     }
0220     return Okular::FormFieldText::Normal;
0221 }
0222 
0223 QString PopplerFormFieldText::text() const
0224 {
0225     return m_field->text();
0226 }
0227 
0228 void PopplerFormFieldText::setText(const QString &text)
0229 {
0230     m_field->setText(text);
0231 }
0232 
0233 void PopplerFormFieldText::setAppearanceText(const QString &text)
0234 {
0235     m_field->setAppearanceText(text);
0236 }
0237 
0238 bool PopplerFormFieldText::isPassword() const
0239 {
0240     return m_field->isPassword();
0241 }
0242 
0243 bool PopplerFormFieldText::isRichText() const
0244 {
0245     return m_field->isRichText();
0246 }
0247 
0248 int PopplerFormFieldText::maximumLength() const
0249 {
0250     return m_field->maximumLength();
0251 }
0252 
0253 Qt::Alignment PopplerFormFieldText::textAlignment() const
0254 {
0255     return Qt::AlignTop | m_field->textAlignment();
0256 }
0257 
0258 bool PopplerFormFieldText::canBeSpellChecked() const
0259 {
0260     return m_field->canBeSpellChecked();
0261 }
0262 
0263 PopplerFormFieldChoice::PopplerFormFieldChoice(std::unique_ptr<Poppler::FormFieldChoice> field)
0264     : Okular::FormFieldChoice()
0265     , m_field(std::move(field))
0266 {
0267     m_rect = Okular::NormalizedRect::fromQRectF(m_field->rect());
0268     m_id = m_field->id();
0269     SET_ACTIONS
0270 
0271     QMap<QString, QString> values;
0272     const auto fieldChoicesWithExportValues = m_field->choicesWithExportValues();
0273     for (const QPair<QString, QString> &value : fieldChoicesWithExportValues) {
0274         values.insert(value.first, value.second);
0275     }
0276     setExportValues(values);
0277 }
0278 
0279 Okular::NormalizedRect PopplerFormFieldChoice::rect() const
0280 {
0281     return m_rect;
0282 }
0283 
0284 int PopplerFormFieldChoice::id() const
0285 {
0286     return m_id;
0287 }
0288 
0289 QString PopplerFormFieldChoice::name() const
0290 {
0291     return m_field->name();
0292 }
0293 
0294 QString PopplerFormFieldChoice::uiName() const
0295 {
0296     return m_field->uiName();
0297 }
0298 
0299 QString PopplerFormFieldChoice::fullyQualifiedName() const
0300 {
0301     return m_field->fullyQualifiedName();
0302 }
0303 
0304 bool PopplerFormFieldChoice::isReadOnly() const
0305 {
0306     return m_field->isReadOnly();
0307 }
0308 
0309 void PopplerFormFieldChoice::setReadOnly(bool value)
0310 {
0311     m_field->setReadOnly(value);
0312 }
0313 
0314 bool PopplerFormFieldChoice::isVisible() const
0315 {
0316     return m_field->isVisible();
0317 }
0318 
0319 void PopplerFormFieldChoice::setVisible(bool value)
0320 {
0321     m_field->setVisible(value);
0322 }
0323 
0324 bool PopplerFormFieldChoice::isPrintable() const
0325 {
0326     return m_field->isPrintable();
0327 }
0328 
0329 void PopplerFormFieldChoice::setPrintable(bool value)
0330 {
0331     m_field->setPrintable(value);
0332 }
0333 
0334 Okular::FormFieldChoice::ChoiceType PopplerFormFieldChoice::choiceType() const
0335 {
0336     switch (m_field->choiceType()) {
0337     case Poppler::FormFieldChoice::ComboBox:
0338         return Okular::FormFieldChoice::ComboBox;
0339     case Poppler::FormFieldChoice::ListBox:
0340         return Okular::FormFieldChoice::ListBox;
0341     }
0342     return Okular::FormFieldChoice::ListBox;
0343 }
0344 
0345 QStringList PopplerFormFieldChoice::choices() const
0346 {
0347     return m_field->choices();
0348 }
0349 
0350 bool PopplerFormFieldChoice::isEditable() const
0351 {
0352     return m_field->isEditable();
0353 }
0354 
0355 bool PopplerFormFieldChoice::multiSelect() const
0356 {
0357     return m_field->multiSelect();
0358 }
0359 
0360 QList<int> PopplerFormFieldChoice::currentChoices() const
0361 {
0362     return m_field->currentChoices();
0363 }
0364 
0365 void PopplerFormFieldChoice::setCurrentChoices(const QList<int> &choices)
0366 {
0367     m_field->setCurrentChoices(choices);
0368 }
0369 
0370 QString PopplerFormFieldChoice::editChoice() const
0371 {
0372     return m_field->editChoice();
0373 }
0374 
0375 void PopplerFormFieldChoice::setEditChoice(const QString &text)
0376 {
0377     m_field->setEditChoice(text);
0378 }
0379 
0380 Qt::Alignment PopplerFormFieldChoice::textAlignment() const
0381 {
0382     return Qt::AlignTop | m_field->textAlignment();
0383 }
0384 
0385 bool PopplerFormFieldChoice::canBeSpellChecked() const
0386 {
0387     return m_field->canBeSpellChecked();
0388 }
0389 
0390 PopplerFormFieldSignature::PopplerFormFieldSignature(std::unique_ptr<Poppler::FormFieldSignature> field)
0391     : Okular::FormFieldSignature()
0392     , m_field(std::move(field))
0393 {
0394     m_rect = Okular::NormalizedRect::fromQRectF(m_field->rect());
0395     m_id = m_field->id();
0396     int validateOptions = Poppler::FormFieldSignature::ValidateVerifyCertificate;
0397     if (!PDFSettings::checkOCSPServers()) {
0398         validateOptions = validateOptions | Poppler::FormFieldSignature::ValidateWithoutOCSPRevocationCheck;
0399     }
0400     m_info = fromPoppler(m_field->validate(static_cast<Poppler::FormFieldSignature::ValidateOptions>(validateOptions)));
0401     SET_ACTIONS
0402 }
0403 
0404 PopplerFormFieldSignature::~PopplerFormFieldSignature() = default;
0405 
0406 Okular::NormalizedRect PopplerFormFieldSignature::rect() const
0407 {
0408     return m_rect;
0409 }
0410 
0411 int PopplerFormFieldSignature::id() const
0412 {
0413     return m_id;
0414 }
0415 
0416 QString PopplerFormFieldSignature::name() const
0417 {
0418     return m_field->name();
0419 }
0420 
0421 QString PopplerFormFieldSignature::uiName() const
0422 {
0423     return m_field->uiName();
0424 }
0425 
0426 QString PopplerFormFieldSignature::fullyQualifiedName() const
0427 {
0428     return m_field->fullyQualifiedName();
0429 }
0430 
0431 bool PopplerFormFieldSignature::isReadOnly() const
0432 {
0433     return m_field->isReadOnly();
0434 }
0435 
0436 bool PopplerFormFieldSignature::isVisible() const
0437 {
0438     return m_field->isVisible();
0439 }
0440 
0441 PopplerFormFieldSignature::SignatureType PopplerFormFieldSignature::signatureType() const
0442 {
0443     switch (m_field->signatureType()) {
0444     case Poppler::FormFieldSignature::AdbePkcs7sha1:
0445         return Okular::FormFieldSignature::AdbePkcs7sha1;
0446     case Poppler::FormFieldSignature::AdbePkcs7detached:
0447         return Okular::FormFieldSignature::AdbePkcs7detached;
0448     case Poppler::FormFieldSignature::EtsiCAdESdetached:
0449         return Okular::FormFieldSignature::EtsiCAdESdetached;
0450     case Poppler::FormFieldSignature::UnsignedSignature:
0451         return Okular::FormFieldSignature::UnsignedSignature;
0452     default:
0453         return Okular::FormFieldSignature::UnknownType;
0454     }
0455 }
0456 
0457 Okular::SignatureInfo PopplerFormFieldSignature::signatureInfo() const
0458 {
0459     return m_info;
0460 }
0461 
0462 bool PopplerFormFieldSignature::sign(const Okular::NewSignatureData &oData, const QString &newPath) const
0463 {
0464     Poppler::PDFConverter::NewSignatureData pData;
0465     PDFGenerator::okularToPoppler(oData, &pData);
0466     return m_field->sign(newPath, pData) == Poppler::FormFieldSignature::SigningSuccess;
0467 }