From e15ca6e6fac413ecdb61f294da55705a75705c1c Mon Sep 17 00:00:00 2001 From: Raul Metsma Date: Sat, 10 Feb 2024 13:14:36 +0200 Subject: [PATCH] Fix coverity warnings IB-7930 Signed-off-by: Raul Metsma --- lib/libelectronic-id | 2 +- src/controller/certandpininfo.hpp | 5 +- .../command-handlers/certificatereader.cpp | 30 +++++------- src/ui/certificatewidget.cpp | 20 +++++--- src/ui/certificatewidget.hpp | 1 + src/ui/webeiddialog.cpp | 48 ++++++++++--------- 6 files changed, 55 insertions(+), 51 deletions(-) diff --git a/lib/libelectronic-id b/lib/libelectronic-id index a89a2b17..76def42e 160000 --- a/lib/libelectronic-id +++ b/lib/libelectronic-id @@ -1 +1 @@ -Subproject commit a89a2b17e6c666dfbe96f66c3efbed53b0fbdf5d +Subproject commit 76def42e7bce94244f3c01a01b4f361c756bd5dd diff --git a/src/controller/certandpininfo.hpp b/src/controller/certandpininfo.hpp index 27aa67d1..e3a659a5 100644 --- a/src/controller/certandpininfo.hpp +++ b/src/controller/certandpininfo.hpp @@ -33,14 +33,11 @@ struct CertificateInfo bool isExpired = false; bool notEffective = false; QString subject; - QString issuer; - QString effectiveDate; - QString expiryDate; }; struct PinInfo { - using PinMinMaxLength = std::pair; + using PinMinMaxLength = std::pair; using PinRetriesCount = std::pair; PinMinMaxLength pinMinMaxLength = {0, 0}; diff --git a/src/controller/command-handlers/certificatereader.cpp b/src/controller/command-handlers/certificatereader.cpp index c04c5cd8..b3031c7c 100644 --- a/src/controller/command-handlers/certificatereader.cpp +++ b/src/controller/command-handlers/certificatereader.cpp @@ -25,7 +25,6 @@ #include "application.hpp" #include "signauthutils.hpp" #include "utils/utils.hpp" -#include "magic_enum/magic_enum.hpp" using namespace electronic_id; @@ -37,9 +36,9 @@ CardCertificateAndPinInfo getCertificateWithStatusAndInfo(const CardInfo::ptr& c { const auto certificateBytes = card->eid().getCertificate(certificateType); - auto certificateDer = QByteArray(reinterpret_cast(certificateBytes.data()), - int(certificateBytes.size())); - auto certificate = QSslCertificate(certificateDer, QSsl::Der); + QByteArray certificateDer(reinterpret_cast(certificateBytes.data()), + int(certificateBytes.size())); + QSslCertificate certificate(certificateDer, QSsl::Der); if (certificate.isNull()) { THROW(SmartCardChangeRequiredError, "Invalid certificate returned by electronic ID " + card->eid().name()); @@ -59,24 +58,19 @@ CardCertificateAndPinInfo getCertificateWithStatusAndInfo(const CardInfo::ptr& c subject = QStringLiteral("%1, %2, %3").arg(surName, givenName, serialNumber); } - auto certInfo = CertificateInfo {certificateType, - certificate.expiryDate() < QDateTime::currentDateTimeUtc(), - certificate.effectiveDate() > QDateTime::currentDateTimeUtc(), - subject, - certificate.issuerInfo(QSslCertificate::CommonName).join(' '), - certificate.effectiveDate().date().toString(Qt::ISODate), - certificate.expiryDate().date().toString(Qt::ISODate)}; - auto pinInfo = - PinInfo {certificateType.isAuthentication() ? card->eid().authPinMinMaxLength() - : card->eid().signingPinMinMaxLength(), - certificateType.isAuthentication() ? card->eid().authPinRetriesLeft() - : card->eid().signingPinRetriesLeft(), - card->eid().smartcard().readerHasPinPad()}; + CertificateInfo certInfo { + certificateType, certificate.expiryDate() < QDateTime::currentDateTimeUtc(), + certificate.effectiveDate() > QDateTime::currentDateTimeUtc(), std::move(subject)}; + PinInfo pinInfo {certificateType.isAuthentication() ? card->eid().authPinMinMaxLength() + : card->eid().signingPinMinMaxLength(), + certificateType.isAuthentication() ? card->eid().authPinRetriesLeft() + : card->eid().signingPinRetriesLeft(), + card->eid().smartcard().readerHasPinPad()}; if (pinInfo.pinRetriesCount.first == 0) { pinInfo.pinIsBlocked = true; } - return {card, certificateDer, certificate, std::move(certInfo), std::move(pinInfo)}; + return {card, std::move(certificateDer), certificate, std::move(certInfo), std::move(pinInfo)}; } } // namespace diff --git a/src/ui/certificatewidget.cpp b/src/ui/certificatewidget.cpp index 1a04f12f..86b1df1a 100644 --- a/src/ui/certificatewidget.cpp +++ b/src/ui/certificatewidget.cpp @@ -76,6 +76,13 @@ CardCertificateAndPinInfo CertificateWidgetInfo::certificateInfo() const return certAndPinInfo; } +std::tuple CertificateWidgetInfo::certData() const +{ + return {certAndPinInfo.certificate.issuerInfo(QSslCertificate::CommonName).join(' '), + certAndPinInfo.certificate.effectiveDate().date().toString(Qt::ISODate), + certAndPinInfo.certificate.expiryDate().date().toString(Qt::ISODate)}; +} + void CertificateWidgetInfo::drawWarnIcon() { QPainter p(warnIcon); @@ -93,7 +100,8 @@ void CertificateWidgetInfo::setCertificateInfo(const CardCertificateAndPinInfo& warn->setText(CertificateWidget::tr("Pin locked")); certAndPinInfo = cardCertPinInfo; const auto& certInfo = cardCertPinInfo.certInfo; - QString warning, effectiveDate = certInfo.effectiveDate, expiryDate = certInfo.expiryDate; + QString warning; + auto [issuer, effectiveDate, expiryDate] = certData(); if (certInfo.notEffective) { effectiveDate = displayInRed(effectiveDate); warning = displayInRed(CertificateWidget::tr(" (Not effective)")); @@ -103,7 +111,7 @@ void CertificateWidgetInfo::setCertificateInfo(const CardCertificateAndPinInfo& warning = displayInRed(CertificateWidget::tr(" (Expired)")); } info->setText(CertificateWidget::tr("%1
Issuer: %2
Valid: %3 to %4%5") - .arg(certInfo.subject, certInfo.issuer, effectiveDate, expiryDate, warning)); + .arg(certInfo.subject, issuer, effectiveDate, expiryDate, warning)); info->parentWidget()->setDisabled(certInfo.notEffective || certInfo.isExpired || cardCertPinInfo.pinInfo.pinIsBlocked); if (warning.isEmpty() && cardCertPinInfo.pinInfo.pinIsBlocked) { @@ -163,10 +171,10 @@ bool CertificateButton::eventFilter(QObject* object, QEvent* event) void CertificateButton::setCertificateInfo(const CardCertificateAndPinInfo& cardCertPinInfo) { CertificateWidgetInfo::setCertificateInfo(cardCertPinInfo); - const auto certInfo = cardCertPinInfo.certInfo; - setText( - tr("%1 Issuer: %2 Valid: %3 to %4") - .arg(certInfo.subject, certInfo.issuer, certInfo.effectiveDate, certInfo.expiryDate)); + const auto& certInfo = cardCertPinInfo.certInfo; + auto [issuer, effectiveDate, expiryDate] = certData(); + setText(tr("%1 Issuer: %2 Valid: %3 to %4") + .arg(certInfo.subject, issuer, effectiveDate, expiryDate)); } void CertificateButton::paintEvent(QPaintEvent* /*event*/) diff --git a/src/ui/certificatewidget.hpp b/src/ui/certificatewidget.hpp index 44c8e4a1..ebf2750c 100644 --- a/src/ui/certificatewidget.hpp +++ b/src/ui/certificatewidget.hpp @@ -42,6 +42,7 @@ class CertificateWidgetInfo Q_DISABLE_COPY_MOVE(CertificateWidgetInfo) void drawWarnIcon(); + std::tuple certData() const; QLabel* icon; QLabel* info; diff --git a/src/ui/webeiddialog.cpp b/src/ui/webeiddialog.cpp index 2eb22c66..a6715800 100644 --- a/src/ui/webeiddialog.cpp +++ b/src/ui/webeiddialog.cpp @@ -85,8 +85,9 @@ WebEidDialog::WebEidDialog(QWidget* parent) : WebEidUI(parent), ui(new Private) setWindowFlag(Qt::CustomizeWindowHint); setWindowFlag(Qt::WindowTitleHint); setWindowTitle(QApplication::applicationDisplayName()); - setTrText(ui->aboutVersion, - [] { return tr("Version: %1").arg(QApplication::applicationVersion()); }); + setTrText(ui->aboutVersion, []() -> QString { + return tr("Version: %1").arg(QApplication::applicationVersion()); + }); ui->langButton = new QToolButton(this); ui->langButton->setObjectName("langButton"); @@ -259,7 +260,7 @@ void WebEidDialog::showAboutPage() void WebEidDialog::showFatalErrorPage() { auto* d = new WebEidDialog(); - d->setTrText(d->ui->messagePageTitleLabel, [] { return tr("Operation failed"); }); + d->setTrText(d->ui->messagePageTitleLabel, []() -> QString { return tr("Operation failed"); }); d->ui->fatalError->show(); d->ui->fatalHelp->show(); d->ui->connectCardLabel->hide(); @@ -293,10 +294,12 @@ void WebEidDialog::onSmartCardStatusUpdate(const RetriableError status) { currentCommand = CommandType::INSERT_CARD; - setTrText(ui->connectCardLabel, - [status] { return std::get<0>(retriableErrorToTextTitleAndIcon(status)); }); - setTrText(ui->messagePageTitleLabel, - [status] { return std::get<1>(retriableErrorToTextTitleAndIcon(status)); }); + setTrText(ui->connectCardLabel, [status]() -> QString { + return std::get<0>(retriableErrorToTextTitleAndIcon(status)); + }); + setTrText(ui->messagePageTitleLabel, [status]() -> QString { + return std::get<1>(retriableErrorToTextTitleAndIcon(status)); + }); ui->cardChipIcon->setPixmap(std::get<2>(retriableErrorToTextTitleAndIcon(status))); // In case the insert card page is not shown, switch back to it. @@ -338,7 +341,7 @@ void WebEidDialog::onMultipleCertificatesReady( ui->pinInput->clear(); onMultipleCertificatesReady(origin, certificateAndPinInfos); }); - setupOK([this, origin, certificateAndPinInfos] { + setupOK([this, origin] { // Authenticate continues with the selected certificate to onSingleCertificateReady(). if (auto* button = qobject_cast(ui->selectionGroup->checkedButton())) { @@ -379,12 +382,12 @@ void WebEidDialog::onSingleCertificateReady(const QUrl& origin, return; case CommandType::AUTHENTICATE: ui->pinInputCertificateInfo->setCertificateInfo(certAndPin); - setTrText(ui->pinInputPageTitleLabel, [] { return tr("Authenticate"); }); - setTrText(ui->pinInputDescriptionLabel, [] { + setTrText(ui->pinInputPageTitleLabel, []() -> QString { return tr("Authenticate"); }); + setTrText(ui->pinInputDescriptionLabel, []() -> QString { return tr("By authenticating, I agree to the transfer of my name and personal " "identification code to the service provider."); }); - setTrText(ui->pinTitleLabel, [useExternalPinDialog] { + setTrText(ui->pinTitleLabel, [useExternalPinDialog]() -> QString { return useExternalPinDialog ? tr("Please enter PIN for authentication in the PIN dialog window that opens.") : tr("Enter PIN1 for authentication"); @@ -392,12 +395,12 @@ void WebEidDialog::onSingleCertificateReady(const QUrl& origin, break; case CommandType::SIGN: ui->pinInputCertificateInfo->setCertificateInfo(certAndPin); - setTrText(ui->pinInputPageTitleLabel, [] { return tr("Signing"); }); - setTrText(ui->pinInputDescriptionLabel, [] { + setTrText(ui->pinInputPageTitleLabel, []() -> QString { return tr("Signing"); }); + setTrText(ui->pinInputDescriptionLabel, []() -> QString { return tr("By signing, I agree to the transfer of my name and personal identification " "code to the service provider."); }); - setTrText(ui->pinTitleLabel, [useExternalPinDialog] { + setTrText(ui->pinTitleLabel, [useExternalPinDialog]() -> QString { return useExternalPinDialog ? tr("Please enter PIN for signing in the PIN dialog window that opens.") : tr("Enter PIN2 for signing"); @@ -447,7 +450,7 @@ void WebEidDialog::onVerifyPinFailed(const VerifyPinFailed::Status status, const // FIXME: don't allow retry in case of UNKNOWN_ERROR switch (status) { case Status::RETRY_ALLOWED: - message = [retriesLeft] { + message = [retriesLeft]() -> QString { return retriesLeft == -1 ? tr("Incorrect PIN.") : tr("Incorrect PIN, %n attempts left.", nullptr, retriesLeft); }; @@ -520,9 +523,9 @@ template void WebEidDialog::onRetryImpl(Text text) { setTrText(ui->connectCardLabel, std::forward(text)); - setTrText(ui->messagePageTitleLabel, [] { return tr("Operation failed"); }); + setTrText(ui->messagePageTitleLabel, []() -> QString { return tr("Operation failed"); }); ui->cardChipIcon->setPixmap(pixmap("no-id-card"_L1)); - setupOK([this] { emit retry(); }, [] { return tr("Try again"); }, true); + setupOK([this] { emit retry(); }, []() -> QString { return tr("Try again"); }, true); ui->pageStack->setCurrentIndex(int(Page::ALERT)); } @@ -589,7 +592,7 @@ void WebEidDialog::setupPinPrompt(const PinInfo& pinInfo) ui->pinErrorLabel->setVisible(showPinError); showPinInputWarning(showPinError); if (showPinError) { - setTrText(ui->pinErrorLabel, [pinInfo] { + setTrText(ui->pinErrorLabel, [pinInfo]() -> QString { return tr("The PIN has been entered incorrectly at least once. %n attempts left.", nullptr, int(pinInfo.pinRetriesCount.first)); }); @@ -606,7 +609,7 @@ void WebEidDialog::setupPinPadProgressBarAndEmitWait(const CardCertificateAndPin ui->selectAnotherCertificate->hide(); ui->pinTimeRemaining->setText( tr("Time remaining: %1").arg(ui->pinEntryTimeoutProgressBar->maximum())); - setTrText(ui->pinTitleLabel, [this] { + setTrText(ui->pinTitleLabel, [this]() -> QString { return tr("Please enter %1 in PinPad reader") .arg(currentCommand == CommandType::AUTHENTICATE ? tr("PIN1 for authentication") : tr("PIN2 for signing")); @@ -633,7 +636,7 @@ void WebEidDialog::setupPinInput(const CardCertificateAndPinInfo& certAndPin) // 4. Special characters // (ASCII 0x20...0x2F, space../ + 0x3A...0x40, :..@ + 0x5B...0x60, [..` + 0x7B...0x7F, {..~). // 5. We additionally allow uppercase and lowercase Unicode letters. - const auto regexpWithOrWithoutLetters = + const auto& regexpWithOrWithoutLetters = certAndPin.cardInfo->eid().allowsUsingLettersAndSpecialCharactersInPin() ? QStringLiteral("[0-9 -/:-@[-`{-~\\p{L}]{%1,%2}") : QStringLiteral("[0-9]{%1,%2}"); @@ -653,7 +656,7 @@ void WebEidDialog::setupOK(Func&& func, const std::function& text, bo connect(ui->okButton, &QPushButton::clicked, this, std::forward(func)); ui->okButton->show(); ui->okButton->setEnabled(enabled); - setTrText(ui->okButton, text ? text : [] { return tr("Confirm"); }); + setTrText(ui->okButton, text ? text : []() -> QString { return tr("Confirm"); }); ui->cancelButton->show(); ui->cancelButton->setEnabled(true); ui->helpButton->hide(); @@ -666,7 +669,8 @@ void WebEidDialog::displayPinBlockedError() ui->pinTimeoutTimer->stop(); ui->pinTimeRemaining->hide(); ui->pinEntryTimeoutProgressBar->hide(); - setTrText(ui->pinErrorLabel, [] { return tr("PIN is locked. Unblock and try again."); }); + setTrText(ui->pinErrorLabel, + []() -> QString { return tr("PIN is locked. Unblock and try again."); }); ui->pinErrorLabel->show(); ui->okButton->hide(); ui->cancelButton->setEnabled(true);