diff --git a/CMakeLists.txt b/CMakeLists.txt index 0b7535001..e29adabd3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -9,7 +9,7 @@ include( GNUInstallDirs ) include( VersionInfo ) find_package( PKCS11 ) -find_package(LibDigiDocpp 3.15.0 REQUIRED) +find_package(LibDigiDocpp 3.17.0 REQUIRED) find_package( LDAP REQUIRED ) find_package(QT NAMES Qt6 Qt5 COMPONENTS Core REQUIRED) find_package(Qt${QT_VERSION_MAJOR} 5.12.0 REQUIRED COMPONENTS Core Widgets Network PrintSupport Svg LinguistTools) diff --git a/client/DigiDoc.cpp b/client/DigiDoc.cpp index 4cb4f683f..93671cef1 100644 --- a/client/DigiDoc.cpp +++ b/client/DigiDoc.cpp @@ -46,6 +46,27 @@ using namespace ria::qdigidoc4; static std::string to(const QString &str) { return str.toStdString(); } static QString from(const std::string &str) { return FileDialog::normalized(QString::fromStdString(str)); } +struct ServiceConfirmation final: public ContainerOpenCB +{ + QWidget *parent = nullptr; + ServiceConfirmation(QWidget *_parent): parent(_parent) {} + bool validateOnline() final { + if(!CheckConnection().check()) + return false; + return dispatchToMain([this] { + auto *dlg = new WarningDialog(DigiDoc::tr("Signed document in PDF and DDOC format will be transmitted to " + "the Digital Signature Validation Service SiVa to verify the validity of the digital signature. " + "Read more information about transmitted data to Digital Signature Validation service from " + "here.
" + "Do you want to continue?"), parent); + dlg->setCancelText(WarningDialog::Cancel); + dlg->addButton(WarningDialog::YES, ContainerSave); + return dlg->exec() == ContainerSave; + }); + } + Q_DISABLE_COPY(ServiceConfirmation) +}; + DigiDocSignature::DigiDocSignature(const digidoc::Signature *signature, const DigiDoc *parent, bool isTimeStamped) @@ -106,8 +127,9 @@ QDateTime DigiDocSignature::ocspTime() const const DigiDoc* DigiDocSignature::parent() const { return m_parent; } -void DigiDocSignature::parseException(DigiDocSignature::SignatureStatus &result, const digidoc::Exception &e) +DigiDocSignature::SignatureStatus DigiDocSignature::status(const digidoc::Exception &e) { + DigiDocSignature::SignatureStatus result = Valid; for(const Exception &child: e.causes()) { switch( child.code() ) @@ -135,8 +157,9 @@ void DigiDocSignature::parseException(DigiDocSignature::SignatureStatus &result, default: result = std::max( result, Invalid ); } - parseException( result, child ); + result = std::max(result, status(child)); } + return result; } QString DigiDocSignature::policy() const @@ -164,15 +187,6 @@ QStringList DigiDocSignature::roles() const return list; } -void DigiDocSignature::setLastError(const Exception &e) -{ - Exception::ExceptionCode code = Exception::General; - QStringList causes = DigiDoc::parseException(e, code); - m_lastError = code == Exception::OCSPBeforeTimeStamp ? - DigiDoc::tr("The timestamp added to the signature must be taken before validity confirmation.") : - causes.join('\n'); -} - QString DigiDocSignature::signatureMethod() const { return from( s->signatureMethod() ); } @@ -230,33 +244,25 @@ QDateTime DigiDocSignature::tsaTime() const return toTime(s->ArchiveTimeStampTime()); } -DigiDocSignature::SignatureStatus DigiDocSignature::validate() +DigiDocSignature::SignatureStatus DigiDocSignature::validate(bool qscd) { if(!s) return Invalid; - DigiDocSignature::SignatureStatus result = Valid; try { - s->validate(); - return Valid; + s->validate(qscd ? digidoc::Signature::POLv2 : digidoc::Signature::POLv1); + return qscd ? Valid : NonQSCD; } catch(const Exception &e) { - parseException(result, e); - setLastError(e); - } - if(result != Unknown) - return result; - try - { - s->validate(digidoc::Signature::POLv1); - return NonQSCD; - } - catch(const Exception &e) - { - parseException(result, e); + Exception::ExceptionCode code = Exception::General; + QStringList causes = DigiDoc::parseException(e, code); + m_lastError = code == Exception::OCSPBeforeTimeStamp ? + DigiDoc::tr("The timestamp added to the signature must be taken before validity confirmation.") : + causes.join('\n'); + auto result = status(e); + return qscd && result == Unknown ? validate(false) : result; } - return result; } int DigiDocSignature::warning() const @@ -497,32 +503,19 @@ bool DigiDoc::open( const QString &file ) QWidget *parent = qobject_cast(QObject::parent()); if(parent == nullptr) parent = Application::activeWindow(); + ServiceConfirmation cb(parent); qApp->waitForTSL( file ); clear(); - auto serviceConfirmation = [parent] { - auto *dlg = new WarningDialog(tr("Signed document in PDF and DDOC format will be transmitted to the Digital Signature Validation Service SiVa to verify the validity of the digital signature. " - "Read more information about transmitted data to Digital Signature Validation service from here.
" - "Do you want to continue?"), parent); - dlg->setCancelText(WarningDialog::Cancel); - dlg->addButton(WarningDialog::YES, ContainerSave); - return dlg->exec() == ContainerSave; - }; - if((file.endsWith(QLatin1String(".pdf"), Qt::CaseInsensitive) || - file.endsWith(QLatin1String(".ddoc"), Qt::CaseInsensitive)) && !serviceConfirmation()) - return false; - try { WaitDialogHolder waitDialog(parent, tr("Opening"), false); return waitFor([&] { - b = Container::openPtr(to(file)); + b = Container::openPtr(to(file), &cb); if(b && b->mediaType() == "application/vnd.etsi.asic-s+zip" && b->dataFiles().size() == 1 && b->signatures().size() == 1) { const DataFile *f = b->dataFiles().at(0); - if(from(f->fileName()).endsWith(QStringLiteral(".ddoc"), Qt::CaseInsensitive) && - CheckConnection().check() && - dispatchToMain(serviceConfirmation)) + if(from(f->fileName()).endsWith(QStringLiteral(".ddoc"), Qt::CaseInsensitive)) { const QString tmppath = FileDialog::tempPath(FileDialog::safeName(from(f->fileName()))); f->saveAs(to(tmppath)); @@ -530,7 +523,7 @@ bool DigiDoc::open( const QString &file ) { m_tempFiles.append(tmppath); try { - parentContainer = std::exchange(b, Container::openPtr(to(tmppath))); + parentContainer = std::exchange(b, Container::openPtr(to(tmppath), &cb)); } catch(const Exception &) {} } } diff --git a/client/DigiDoc.h b/client/DigiDoc.h index fa4ba4ab3..10f756856 100644 --- a/client/DigiDoc.h +++ b/client/DigiDoc.h @@ -73,9 +73,8 @@ class DigiDocSignature int warning() const; private: - void setLastError(const digidoc::Exception &e); - void parseException(SignatureStatus &result, const digidoc::Exception &e); - SignatureStatus validate(); + SignatureStatus status(const digidoc::Exception &e); + SignatureStatus validate(bool qscd = true); static QSslCertificate toCertificate(const std::vector &der) ; static QDateTime toTime(const std::string &time) ;