Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions client/DigiDoc.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -723,7 +723,7 @@ bool DigiDoc::sign(const QString &city, const QString &state, const QString &zip
return false;
}

QList<DigiDocSignature> DigiDoc::signatures() const
const QList<DigiDocSignature>& DigiDoc::signatures() const
{
return m_signatures;
}
Expand All @@ -733,7 +733,7 @@ ContainerState DigiDoc::state()
return containerState;
}

QList<DigiDocSignature> DigiDoc::timestamps() const
const QList<DigiDocSignature>& DigiDoc::timestamps() const
{
return m_timestamps;
}
4 changes: 2 additions & 2 deletions client/DigiDoc.h
Original file line number Diff line number Diff line change
Expand Up @@ -140,9 +140,9 @@ class DigiDoc: public QObject
const QString &country,
const QString &role,
digidoc::Signer *signer);
QList<DigiDocSignature> signatures() const;
const QList<DigiDocSignature>& signatures() const;
ria::qdigidoc4::ContainerState state();
QList<DigiDocSignature> timestamps() const;
const QList<DigiDocSignature>& timestamps() const;

static QStringList parseException(const digidoc::Exception &e,
digidoc::Exception::ExceptionCode &code);
Expand Down
18 changes: 11 additions & 7 deletions client/dialogs/CertificateHistory.ui
Original file line number Diff line number Diff line change
Expand Up @@ -72,15 +72,16 @@ background-color: #FFFFFF;
<widget class="QTreeWidget" name="view">
<property name="styleSheet">
<string notr="true">#view {
border:none;
font-family: Roboto, Helvetica;
font-size: 12px;
color: #07142A;
}
QHeaderView::section {
border: 1px solid #D9D9D8;
border-width: 0px 0px 1px 0px;
padding-left: 5px;
height: 28px;
background-color: qlineargradient(x1:0, y1:0, x2:0, y2:1,
stop:0 #FFFFFF, stop:1 #FFFFFF);
font-family: Roboto, Helvetica;
font-size: 14px;
border: none;
border-bottom: 1px solid #E7EAEF;
background-color: #FFFFFF;
}
QHeaderView::up-arrow,
QHeaderView::down-arrow {
Expand All @@ -91,6 +92,9 @@ QHeaderView::down-arrow {
padding-right: 5px;
}</string>
</property>
<property name="frameShape">
<enum>QFrame::NoFrame</enum>
</property>
<property name="horizontalScrollBarPolicy">
<enum>Qt::ScrollBarAlwaysOff</enum>
</property>
Expand Down
2 changes: 1 addition & 1 deletion client/dialogs/SettingsDialog.ui
Original file line number Diff line number Diff line change
Expand Up @@ -1610,7 +1610,7 @@ max-height: 22px;
<string notr="true">QTextEdit {
color: #363739;
background: #FFFFFF;
border-bottom: 1px solid #DEE4E9;
border-bottom: 1px solid #E7EAEF;
}
QScrollBar {
width: 10px;
Expand Down
112 changes: 32 additions & 80 deletions client/dialogs/SignatureDialog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@
#include "ui_SignatureDialog.h"

#include "DateTime.h"
#include "Styles.h"
#include "SslCertificate.h"
#include "dialogs/CertificateDetails.h"
#include "effects/Overlay.h"
Expand Down Expand Up @@ -50,53 +49,55 @@ SignatureDialog::SignatureDialog(const DigiDocSignature &signature, QWidget *par

new Overlay(this);

SslCertificate c = signature.cert();
QString style = QStringLiteral("<font color=\"green\">");
QString status = tr("Signature");
bool isTS = signature.profile() == QStringLiteral("TimeStampToken");
if(isTS)
status = tr("Timestamp");
status += ' ';
auto isValid = [](bool isTS) -> QString {
return isTS ? tr("is valid", "Timestamp") : tr("is valid", "Signature");
};
bool isTS = signature.profile() == QLatin1String("TimeStampToken");
d->warning->hide();
switch(s.status())
{
case DigiDocSignature::Valid:
status += isValid(isTS);
d->status->setLabel(QStringLiteral("good"));
d->status->setText(QCoreApplication::translate("SignatureItem", isTS ? "Timestamp is valid" : "Signature is valid"));
break;
case DigiDocSignature::Warning:
status += QStringLiteral("%1</font> <font color=\"#996C0B\">(%2)").arg(isValid(isTS), tr("Warnings"));
decorateNotice(QStringLiteral("#996C0B"));
d->status->setLabel(QStringLiteral("good"));
d->status->setText(QCoreApplication::translate("SignatureItem", isTS ? "Timestamp is valid" : "Signature is valid"));
d->warning->show();
d->warning->setText(QCoreApplication::translate("SignatureItem", "Warnings"));
d->lblNotice->setLabel(QStringLiteral("warning"));
if(!s.lastError().isEmpty())
d->error->setPlainText( s.lastError() );
if(s.warning() & DigiDocSignature::DigestWeak )
d->info->setText(tr(
"The signature is technically correct, but it is based on the currently weak hash algorithm SHA-1, "
"therefore it is not protected against forgery or alteration."));
else
d->info->setText(tr("SIGNATURE_WARNING"));
d->info->setText(tr(
"The signature is valid, but the container has a specific feature. Usually, this feature has arisen accidentally "
"when containers were created. However, as it is not possible to edit a container without invalidating the signature, "
"<a href='https://www.id.ee/en/article/digital-signing-and-electronic-signatures/'>a warning</a> is displayed."));
break;
case DigiDocSignature::NonQSCD:
status += QStringLiteral("%1</font> <font color=\"#996C0B\">(%2)").arg(isValid(isTS), tr("Restrictions"));
decorateNotice(QStringLiteral("#996C0B"));
d->status->setLabel(QStringLiteral("good"));
d->status->setText(QCoreApplication::translate("SignatureItem", isTS ? "Timestamp is valid" : "Signature is valid"));
d->warning->show();
d->warning->setText(QCoreApplication::translate("SignatureItem", "Restrictions"));
d->lblNotice->setLabel(QStringLiteral("warning"));
d->info->setText( tr(
"This e-Signature is not equivalent with handwritten signature and therefore "
"can be used only in transactions where Qualified e-Signature is not required.") );
break;
case DigiDocSignature::Invalid:
style = QStringLiteral("<font color=\"red\">");
status += isTS ? tr("is not valid", "Timestamp") : tr("is not valid", "Signature");
d->status->setLabel(QStringLiteral("error"));
d->status->setText(QCoreApplication::translate("SignatureItem", isTS ? "Timestamp is not valid" : "Signature is not valid"));
d->error->setPlainText( s.lastError().isEmpty() ? tr("Unknown error") : s.lastError() );
decorateNotice(QStringLiteral("red"));
d->lblNotice->setLabel(QStringLiteral("error"));
d->info->setText( tr(
"This is an invalid signature or malformed digitally signed file. The signature is not valid.") );
break;
case DigiDocSignature::Unknown:
style = QStringLiteral("<font color=\"red\">");
status += isTS ? tr("is unknown", "Timestamp") : tr("is unknown", "Signature");
d->status->setLabel(QStringLiteral("error"));
d->status->setText(QCoreApplication::translate("SignatureItem", isTS ? "Timestamp is unknown" : "Signature is unknown"));
d->error->setPlainText( s.lastError().isEmpty() ? tr("Unknown error") : s.lastError() );
decorateNotice(QStringLiteral("red"));
d->lblNotice->setLabel(QStringLiteral("error"));
d->info->setText( tr(
"Signature status is displayed \"unknown\" if you don't have all validity confirmation "
"service certificates and/or certificate authority certificates installed into your computer "
Expand All @@ -112,32 +113,10 @@ SignatureDialog::SignatureDialog(const DigiDocSignature &signature, QWidget *par
else if(!noError)
d->showErrors->show();

QString name = !c.isNull() ? c.toString(c.showCN() ? QStringLiteral("CN serialNumber") : QStringLiteral("GN SN serialNumber")) : s.signedBy();
d->title->setText(QStringLiteral("%1 | %2%3</font>").arg(name.toHtmlEscaped(), style, status));
d->close->setFont(Styles::font(Styles::Condensed, 14));
SslCertificate c = signature.cert();
d->title->setText(!c.isNull() ? c.toString(c.showCN() ? QStringLiteral("CN serialNumber") : QStringLiteral("GN SN serialNumber")) : s.signedBy());
connect(d->close, &QPushButton::clicked, this, &SignatureDialog::accept);

QFont header = Styles::font(Styles::Regular, 18, QFont::Bold);
QFont regular = Styles::font(Styles::Regular, 14);

d->lblSignerHeader->setFont(header);
d->lblSignatureHeader->setFont(header);
d->lblNotice->setFont(Styles::font(Styles::Regular, 15));

d->title->setFont(regular);
d->info->setFont(regular);
d->signatureView->header()->setFont(regular);
d->lblRole->setFont(regular);
d->lblSigningCity->setFont(regular);
d->lblSigningCountry->setFont(regular);
d->lblSigningCounty->setFont(regular);
d->lblSigningZipCode->setFont(regular);
d->signerCity->setFont(regular);
d->signerState->setFont(regular);
d->signerZip->setFont(regular);
d->signerCountry->setFont(regular);
d->signerRoles->setFont(regular);

const QStringList l = s.locations();
d->signerCity->setText( l.value( 0 ) );
d->signerState->setText( l.value( 1 ) );
Expand All @@ -150,16 +129,15 @@ SignatureDialog::SignatureDialog(const DigiDocSignature &signature, QWidget *par
cnt->setFocusPolicy(cnt->text().isEmpty() ? Qt::NoFocus : Qt::TabFocus);
};
setFocus(d->lblSigningCity, d->signerCity);
setFocus(d->lblSigningCounty, d->signerState);
setFocus(d->lblSigningState, d->signerState);
setFocus(d->lblSigningCountry, d->signerCountry);
setFocus(d->lblSigningZipCode, d->signerZip);
setFocus(d->lblSigningZip, d->signerZip);
setFocus(d->lblRole, d->signerRoles);

// Certificate info
QTreeWidget *t = d->signatureView;
t->header()->setSectionResizeMode(0, QHeaderView::Fixed);
t->header()->resizeSection(0, 244);
t->setHeaderLabels({ tr("Attribute"), tr("Value") });

auto addCert = [this](QTreeWidget *t, const QString &title, const QString &title2, const SslCertificate &cert) {
if(cert.isNull())
Expand Down Expand Up @@ -192,17 +170,11 @@ SignatureDialog::SignatureDialog(const DigiDocSignature &signature, QWidget *par
addCert(t, tr("Archive TS Certificate"), tr("Archive TS Certificate issuer"), s.tsaCert());
addTime(t, tr("Signature Timestamp"), s.tsTime());
addCert(t, tr("TS Certificate"), tr("TS Certificate issuer"), s.tsCert());
addItem(t, tr("Hash value of signature"), SslCertificate::toHex(s.messageImprint()));
addItem(t, tr("Hash value of signature"), s.messageImprint().toHex(' ').toUpper());
addCert(t, tr("OCSP Certificate"), tr("OCSP Certificate issuer"), s.ocspCert());
addTime(t, tr("OCSP time"), s.ocspTime());
addItem(t, tr("Signing time (UTC)"), s.trustedTime());
addItem(t, tr("Claimed signing time (UTC)"), s.claimedTime());

#ifdef Q_OS_MAC
t->setFont(Styles::font(Styles::Regular, 13));
#else
t->setFont(regular);
#endif
}

SignatureDialog::~SignatureDialog()
Expand Down Expand Up @@ -236,12 +208,11 @@ void SignatureDialog::addItem(QTreeWidget *view, const QString &variable, const
addItem(view, variable, DateTime(value).toStringZ(QStringLiteral("dd.MM.yyyy hh:mm:ss")));
}

void SignatureDialog::addItem(QTreeWidget *view, const QString &variable, const QSslCertificate &value)
void SignatureDialog::addItem(QTreeWidget *view, const QString &variable, SslCertificate value)
{
SslCertificate c(value);
QPushButton *button = itemButton(
c.toString(c.showCN() ? QStringLiteral("CN") : QStringLiteral("GN,SN,serialNumber")), view);
connect(button, &QPushButton::clicked, this, [this, c = std::move(c)]{ CertificateDetails::showCertificate(c, this); });
value.toString(value.showCN() ? QStringLiteral("CN") : QStringLiteral("GN,SN,serialNumber")), view);
connect(button, &QPushButton::clicked, this, [this, c = std::move(value)]{ CertificateDetails::showCertificate(c, this); });
addItem(view, variable, button);
}

Expand All @@ -254,37 +225,18 @@ void SignatureDialog::addItem(QTreeWidget *view, const QString &variable, const
addItem(view, variable, button);
}

void SignatureDialog::decorateNotice(const QString &color)
{
d->lblNotice->setText(QStringLiteral("<font color=\"%1\">%2</font>").arg(color, d->lblNotice->text()));
}

QPushButton* SignatureDialog::itemButton(const QString &text, QTreeWidget *view)
{
auto *button = new QPushButton(text, view);
#ifdef Q_OS_MAC
QFont font = Styles::font(Styles::Regular, 13);
#else
QFont font = Styles::font(Styles::Regular, 14);
#endif
font.setUnderline(true);
button->setFont(font);
button->setCursor(QCursor(Qt::PointingHandCursor));
button->setStyleSheet(QStringLiteral("margin-left: 1px; border: none; text-align: left; color: #509B00"));
return button;
}

QLabel* SignatureDialog::itemLabel(const QString &text, QTreeWidget *view)
{
auto *label = new QLabel(text, view);
label->setToolTip(text);
#ifdef Q_OS_MAC
label->setFont(Styles::font(Styles::Regular, 13));
#else
label->setFont(Styles::font(Styles::Regular, 14));
#endif
label->setFocusPolicy(Qt::TabFocus);
label->setStyleSheet(QStringLiteral("border: none;"));
label->setTextInteractionFlags(Qt::TextBrowserInteraction);
return label;
}
4 changes: 2 additions & 2 deletions client/dialogs/SignatureDialog.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ namespace Ui {
class QDateTime;
class QLabel;
class QTreeWidget;
class SslCertificate;

class SignatureDialog : public QDialog
{
Expand All @@ -45,9 +46,8 @@ class SignatureDialog : public QDialog
void addItem(QTreeWidget *view, const QString &variable, QWidget *value);
void addItem(QTreeWidget *view, const QString &variable, const QString &value);
void addItem(QTreeWidget *view, const QString &variable, const QDateTime &value);
void addItem(QTreeWidget *view, const QString &variable, const QSslCertificate &cert);
void addItem(QTreeWidget *view, const QString &variable, SslCertificate cert);
void addItem(QTreeWidget *view, const QString &variable, const QUrl &url);
void decorateNotice(const QString &color);

DigiDocSignature s;
Ui::SignatureDialog *d;
Expand Down
Loading
Loading