Skip to content

Commit 13f107a

Browse files
authored
Use callback to ask online validation confirmation (#1227)
IB-7865 Signed-off-by: Raul Metsma <[email protected]>
1 parent 822ed79 commit 13f107a

File tree

9 files changed

+60
-64
lines changed

9 files changed

+60
-64
lines changed

CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ include( GNUInstallDirs )
99
include( VersionInfo )
1010

1111
find_package( PKCS11 )
12-
find_package(LibDigiDocpp 3.15.0 REQUIRED)
12+
find_package(LibDigiDocpp 3.17.0 REQUIRED)
1313
find_package( LDAP REQUIRED )
1414
find_package(QT NAMES Qt6 Qt5 COMPONENTS Core REQUIRED)
1515
find_package(Qt${QT_VERSION_MAJOR} 5.12.0 REQUIRED COMPONENTS Core Widgets Network PrintSupport Svg LinguistTools)

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
* Install
2525

2626
# Ubuntu
27-
sudo apt install cmake qt6-tools-dev libqt6core5compat6-dev libqt6svg6-dev libpcsclite-dev libssl-dev libdigidocpp-dev libldap2-dev gettext pkg-config
27+
sudo apt install cmake qt6-tools-dev libqt6core5compat6-dev libqt6svg6-dev libpcsclite-dev libssl-dev libdigidocpp-dev libldap2-dev gettext pkg-config libflatbuffers-dev zlib1g-dev
2828
# Fedora
2929
sudo dnf install qt6-qtsvg-devel qt6-qttools-devel qt6-qt5compat-devel pcsc-lite-devel openssl-devel libdigidocpp openldap-devel gettext pkg-config flatbuffers-devel flatbuffers-compiler
3030

client/DigiDoc.cpp

Lines changed: 46 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,27 @@ using namespace ria::qdigidoc4;
4646
static std::string to(const QString &str) { return str.toStdString(); }
4747
static QString from(const std::string &str) { return FileDialog::normalized(QString::fromStdString(str)); }
4848

49+
struct ServiceConfirmation final: public ContainerOpenCB
50+
{
51+
QWidget *parent = nullptr;
52+
ServiceConfirmation(QWidget *_parent): parent(_parent) {}
53+
bool validateOnline() const final {
54+
if(!CheckConnection().check())
55+
return false;
56+
return dispatchToMain([this] {
57+
auto *dlg = new WarningDialog(DigiDoc::tr("This type of signed document will be transmitted to the "
58+
"Digital Signature Validation Service SiVa to verify the validity of the digital signature. "
59+
"Read more information about transmitted data to Digital Signature Validation service from "
60+
"<a href=\"https://www.id.ee/en/article/data-protection-conditions-for-the-id-software-of-the-national-information-system-authority/\">here</a>.<br />"
61+
"Do you want to continue?"), parent);
62+
dlg->setCancelText(WarningDialog::Cancel);
63+
dlg->addButton(WarningDialog::YES, ContainerSave);
64+
return dlg->exec() == ContainerSave;
65+
});
66+
}
67+
Q_DISABLE_COPY(ServiceConfirmation)
68+
};
69+
4970

5071

5172
DigiDocSignature::DigiDocSignature(const digidoc::Signature *signature, const DigiDoc *parent, bool isTimeStamped)
@@ -65,6 +86,11 @@ QDateTime DigiDocSignature::claimedTime() const
6586
return toTime(s->claimedSigningTime());
6687
}
6788

89+
const DigiDoc* DigiDocSignature::container() const
90+
{
91+
return m_parent;
92+
}
93+
6894
bool DigiDocSignature::isInvalid() const
6995
{
7096
return m_status >= Invalid;
@@ -104,10 +130,9 @@ QDateTime DigiDocSignature::ocspTime() const
104130
return toTime(s->OCSPProducedAt());
105131
}
106132

107-
const DigiDoc* DigiDocSignature::parent() const { return m_parent; }
108-
109-
void DigiDocSignature::parseException(DigiDocSignature::SignatureStatus &result, const digidoc::Exception &e)
133+
DigiDocSignature::SignatureStatus DigiDocSignature::status(const digidoc::Exception &e)
110134
{
135+
DigiDocSignature::SignatureStatus result = Valid;
111136
for(const Exception &child: e.causes())
112137
{
113138
switch( child.code() )
@@ -135,8 +160,9 @@ void DigiDocSignature::parseException(DigiDocSignature::SignatureStatus &result,
135160
default:
136161
result = std::max( result, Invalid );
137162
}
138-
parseException( result, child );
163+
result = std::max(result, status(child));
139164
}
165+
return result;
140166
}
141167

142168
QString DigiDocSignature::policy() const
@@ -164,15 +190,6 @@ QStringList DigiDocSignature::roles() const
164190
return list;
165191
}
166192

167-
void DigiDocSignature::setLastError(const Exception &e)
168-
{
169-
Exception::ExceptionCode code = Exception::General;
170-
QStringList causes = DigiDoc::parseException(e, code);
171-
m_lastError = code == Exception::OCSPBeforeTimeStamp ?
172-
DigiDoc::tr("The timestamp added to the signature must be taken before validity confirmation.") :
173-
causes.join('\n');
174-
}
175-
176193
QString DigiDocSignature::signatureMethod() const
177194
{ return from( s->signatureMethod() ); }
178195

@@ -230,33 +247,25 @@ QDateTime DigiDocSignature::tsaTime() const
230247
return toTime(s->ArchiveTimeStampTime());
231248
}
232249

233-
DigiDocSignature::SignatureStatus DigiDocSignature::validate()
250+
DigiDocSignature::SignatureStatus DigiDocSignature::validate(bool qscd)
234251
{
235252
if(!s)
236253
return Invalid;
237-
DigiDocSignature::SignatureStatus result = Valid;
238254
try
239255
{
240-
s->validate();
241-
return Valid;
256+
s->validate(qscd ? digidoc::Signature::POLv2 : digidoc::Signature::POLv1);
257+
return qscd ? Valid : NonQSCD;
242258
}
243259
catch(const Exception &e)
244260
{
245-
parseException(result, e);
246-
setLastError(e);
247-
}
248-
if(result != Unknown)
249-
return result;
250-
try
251-
{
252-
s->validate(digidoc::Signature::POLv1);
253-
return NonQSCD;
254-
}
255-
catch(const Exception &e)
256-
{
257-
parseException(result, e);
261+
Exception::ExceptionCode code = Exception::General;
262+
QStringList causes = DigiDoc::parseException(e, code);
263+
m_lastError = code == Exception::OCSPBeforeTimeStamp ?
264+
DigiDoc::tr("The timestamp added to the signature must be taken before validity confirmation.") :
265+
causes.join('\n');
266+
auto result = status(e);
267+
return qscd && result == Unknown ? validate(false) : result;
258268
}
259-
return result;
260269
}
261270

262271
int DigiDocSignature::warning() const
@@ -497,40 +506,27 @@ bool DigiDoc::open( const QString &file )
497506
QWidget *parent = qobject_cast<QWidget *>(QObject::parent());
498507
if(parent == nullptr)
499508
parent = Application::activeWindow();
509+
ServiceConfirmation cb(parent);
500510
qApp->waitForTSL( file );
501511
clear();
502-
auto serviceConfirmation = [parent] {
503-
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. "
504-
"Read more information about transmitted data to Digital Signature Validation service from <a href=\"https://www.id.ee/en/article/data-protection-conditions-for-the-id-software-of-the-national-information-system-authority/\">here</a>.<br />"
505-
"Do you want to continue?"), parent);
506-
dlg->setCancelText(WarningDialog::Cancel);
507-
dlg->addButton(WarningDialog::YES, ContainerSave);
508-
return dlg->exec() == ContainerSave;
509-
};
510-
if((file.endsWith(QLatin1String(".pdf"), Qt::CaseInsensitive) ||
511-
file.endsWith(QLatin1String(".ddoc"), Qt::CaseInsensitive)) && !serviceConfirmation())
512-
return false;
513-
514512
try {
515513
WaitDialogHolder waitDialog(parent, tr("Opening"), false);
516514
return waitFor([&] {
517-
b = Container::openPtr(to(file));
515+
b = Container::openPtr(to(file), &cb);
518516
if(b && b->mediaType() == "application/vnd.etsi.asic-s+zip" &&
519517
b->dataFiles().size() == 1 &&
520518
b->signatures().size() == 1)
521519
{
522520
const DataFile *f = b->dataFiles().at(0);
523-
if(from(f->fileName()).endsWith(QStringLiteral(".ddoc"), Qt::CaseInsensitive) &&
524-
CheckConnection().check() &&
525-
dispatchToMain(serviceConfirmation))
521+
if(from(f->fileName()).endsWith(QStringLiteral(".ddoc"), Qt::CaseInsensitive))
526522
{
527523
const QString tmppath = FileDialog::tempPath(FileDialog::safeName(from(f->fileName())));
528524
f->saveAs(to(tmppath));
529525
if(QFileInfo::exists(tmppath))
530526
{
531527
m_tempFiles.append(tmppath);
532528
try {
533-
parentContainer = std::exchange(b, Container::openPtr(to(tmppath)));
529+
parentContainer = std::exchange(b, Container::openPtr(to(tmppath), &cb));
534530
} catch(const Exception &) {}
535531
}
536532
}
@@ -559,7 +555,8 @@ bool DigiDoc::open( const QString &file )
559555
setLastError(tr("Connecting to SiVa server failed! Please check your internet connection and network settings."), e);
560556
break;
561557
default:
562-
setLastError(tr("An error occurred while opening the document."), e);
558+
if(e.msg().find("Online validation disabled") == std::string::npos)
559+
setLastError(tr("An error occurred while opening the document."), e);
563560
break;
564561
}
565562
}

client/DigiDoc.h

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,14 +49,14 @@ class DigiDocSignature
4949

5050
QSslCertificate cert() const;
5151
QDateTime claimedTime() const;
52+
const DigiDoc *container() const;
5253
bool isInvalid() const;
5354
QString lastError() const;
5455
QString location() const;
5556
QStringList locations() const;
5657
QByteArray messageImprint() const;
5758
QSslCertificate ocspCert() const;
5859
QDateTime ocspTime() const;
59-
const DigiDoc *parent() const;
6060
QString policy() const;
6161
QString profile() const;
6262
QString role() const;
@@ -73,9 +73,8 @@ class DigiDocSignature
7373
int warning() const;
7474

7575
private:
76-
void setLastError(const digidoc::Exception &e);
77-
void parseException(SignatureStatus &result, const digidoc::Exception &e);
78-
SignatureStatus validate();
76+
SignatureStatus status(const digidoc::Exception &e);
77+
SignatureStatus validate(bool qscd = true);
7978
static QSslCertificate toCertificate(const std::vector<unsigned char> &der) ;
8079
static QDateTime toTime(const std::string &time) ;
8180

client/dialogs/SignatureDialog.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@ SignatureDialog::SignatureDialog(const DigiDocSignature &signature, QWidget *par
173173

174174
addCert(t, tr("Signer's Certificate"), tr("Signer's Certificate issuer"), c);
175175
addItem(t, tr("Signature method"), QUrl(s.signatureMethod()));
176-
addItem(t, tr("Container format"), s.parent()->mediaType());
176+
addItem(t, tr("Container format"), s.container()->mediaType());
177177
addItem(t, tr("Signature format"), s.profile());
178178
if( !s.policy().isEmpty() )
179179
{
@@ -184,7 +184,7 @@ SignatureDialog::SignatureDialog(const DigiDocSignature &signature, QWidget *par
184184
else
185185
addItem( t, tr("Signature policy"), s.policy() );
186186
}
187-
addItem(t, tr("Signed file count"), QString::number(s.parent()->documentModel()->rowCount()));
187+
addItem(t, tr("Signed file count"), QString::number(s.container()->documentModel()->rowCount()));
188188
addItem(t, QStringLiteral("SPUri"), QUrl(s.spuri()));
189189
addTime(t, tr("Archive Timestamp"), s.tsaTime());
190190
addCert(t, tr("Archive TS Certificate"), tr("Archive TS Certificate issuer"), s.tsaCert());

client/translations/en.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -859,8 +859,8 @@
859859
<translation>Failed to sign container.</translation>
860860
</message>
861861
<message>
862-
<source>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 &lt;a href=&quot;https://www.id.ee/en/article/data-protection-conditions-for-the-id-software-of-the-national-information-system-authority/&quot;&gt;here&lt;/a&gt;.&lt;br /&gt;Do you want to continue?</source>
863-
<translation>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 &lt;a href=&quot;https://www.id.ee/en/article/data-protection-conditions-for-the-id-software-of-the-national-information-system-authority/&quot;&gt;here&lt;/a&gt;.&lt;br /&gt;Do you want to continue?</translation>
862+
<source>This type of signed document 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 &lt;a href=&quot;https://www.id.ee/en/article/data-protection-conditions-for-the-id-software-of-the-national-information-system-authority/&quot;&gt;here&lt;/a&gt;.&lt;br /&gt;Do you want to continue?</source>
863+
<translation>This type of signed document 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 &lt;a href=&quot;https://www.id.ee/en/article/data-protection-conditions-for-the-id-software-of-the-national-information-system-authority/&quot;&gt;here&lt;/a&gt;.&lt;br /&gt;Do you want to continue?</translation>
864864
</message>
865865
<message>
866866
<source>Connecting to SiVa server failed! Please check your internet connection and network settings.</source>

client/translations/et.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -859,8 +859,8 @@
859859
<translation>Ümbriku allkirjastamine ebaõnnestus.</translation>
860860
</message>
861861
<message>
862-
<source>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 &lt;a href=&quot;https://www.id.ee/en/article/data-protection-conditions-for-the-id-software-of-the-national-information-system-authority/&quot;&gt;here&lt;/a&gt;.&lt;br /&gt;Do you want to continue?</source>
863-
<translation>PDF ja DDOC formaadis digitaalallkirjade kehtivuse kontrollimiseks edastatakse fail valideerimisteenusele SiVa. Digitaalallkirjade kehtivuse kontrollimisel edastatud andmete kohta loe lähemalt &lt;a href=&quot;https://www.id.ee/artikkel/riigi-infosusteemi-ameti-id-tarkvara-andmekaitsetingimused/&quot;&gt;siit&lt;/a&gt;.&lt;br /&gt;Kas soovid jätkata?</translation>
862+
<source>This type of signed document 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 &lt;a href=&quot;https://www.id.ee/en/article/data-protection-conditions-for-the-id-software-of-the-national-information-system-authority/&quot;&gt;here&lt;/a&gt;.&lt;br /&gt;Do you want to continue?</source>
863+
<translation>Seda tüüpi allkirjastatud dokument edastatakse digitaalallkirjade kehtivuse kontrollimiseks valideerimisteenusele SiVa. Digitaalallkirjade kehtivuse kontrollimisel edastatud andmete kohta loe lähemalt &lt;a href=&quot;https://www.id.ee/artikkel/riigi-infosusteemi-ameti-id-tarkvara-andmekaitsetingimused/&quot;&gt;siit&lt;/a&gt;.&lt;br /&gt;Kas soovid jätkata?</translation>
864864
</message>
865865
<message>
866866
<source>Connecting to SiVa server failed! Please check your internet connection and network settings.</source>

client/translations/ru.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -859,8 +859,8 @@
859859
<translation>Не удалось подписать контейнер.</translation>
860860
</message>
861861
<message>
862-
<source>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 &lt;a href=&quot;https://www.id.ee/en/article/data-protection-conditions-for-the-id-software-of-the-national-information-system-authority/&quot;&gt;here&lt;/a&gt;.&lt;br /&gt;Do you want to continue?</source>
863-
<translation>Для проверки действительности электронно-цифровых подписей в форматах PDF и DDOC файл пересылается в службу проверки цифровых подписей SiVa. Подробнее о данных, переданных для проверки действительности электронно-цифровых подписей, можно прочитать &lt;a href=&quot;https://www.id.ee/ru/artikkel/usloviya-zashhity-dannyh-programmnogo-obespecheniya-id-karty-departamenta-gosudarstvennoj-infosistemy/&quot;&gt;здесь&lt;/a&gt;.&lt;br /&gt;Желаете продолжить?</translation>
862+
<source>This type of signed document 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 &lt;a href=&quot;https://www.id.ee/en/article/data-protection-conditions-for-the-id-software-of-the-national-information-system-authority/&quot;&gt;here&lt;/a&gt;.&lt;br /&gt;Do you want to continue?</source>
863+
<translation>Данный тип подписанного документа передается в службу валидации SiVa для проверки действительности цифровых подписей. Подробнее о данных, переданных для проверки действительности электронно-цифровых подписей, можно прочитать &lt;a href=&quot;https://www.id.ee/ru/artikkel/usloviya-zashhity-dannyh-programmnogo-obespecheniya-id-karty-departamenta-gosudarstvennoj-infosistemy/&quot;&gt;здесь&lt;/a&gt;.&lt;br /&gt;Желаете продолжить?</translation>
864864
</message>
865865
<message>
866866
<source>Connecting to SiVa server failed! Please check your internet connection and network settings.</source>

client/widgets/SignatureItem.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ SignatureItem::SignatureItem(DigiDocSignature s, ContainerState /*state*/, QWidg
6363
ui->remove->setIcons(QStringLiteral("/images/icon_remove.svg"), QStringLiteral("/images/icon_remove_hover.svg"),
6464
QStringLiteral("/images/icon_remove_pressed.svg"), 17, 17);
6565
ui->remove->init(LabelButton::White, {}, 0);
66-
ui->remove->setVisible(ui->signature.parent()->isSupported());
66+
ui->remove->setVisible(ui->signature.container()->isSupported());
6767
connect(ui->remove, &LabelButton::clicked, this, &SignatureItem::removeSignature);
6868
init();
6969
}

0 commit comments

Comments
 (0)