From c13354b266bd96d19a4f9dd1b3e7c876face5afd Mon Sep 17 00:00:00 2001 From: Raul Metsma Date: Thu, 15 Feb 2024 21:08:51 +0200 Subject: [PATCH] Remove Gemalto card support IB-7847 Signed-off-by: Raul Metsma --- .github/workflows/build.yml | 9 +- README.md | 4 +- client/CMakeLists.txt | 5 +- client/CryptoDoc.cpp | 7 - client/Diagnostics.cpp | 26 +-- client/MainWindow.cpp | 3 +- client/MainWindow.ui | 252 +++++++++++----------- client/MainWindow_MyEID.cpp | 31 +-- client/QSigner.cpp | 18 +- client/QSmartCard.cpp | 298 ++++---------------------- client/QSmartCard.h | 31 +-- client/QSmartCard_p.h | 26 +-- client/SslCertificate.cpp | 21 +- client/SslCertificate.h | 1 + client/common_enums.h | 1 - client/dialogs/SettingsDialog.cpp | 5 +- client/images/intro_eid-manage_en.png | Bin 25021 -> 21363 bytes client/images/intro_eid-manage_et.png | Bin 23115 -> 20139 bytes client/images/intro_eid-manage_ru.png | Bin 26606 -> 22805 bytes client/translations/en.ts | 38 +--- client/translations/et.ts | 38 +--- client/translations/ru.ts | 38 +--- client/widgets/InfoStack.cpp | 8 +- client/widgets/VerifyCert.cpp | 82 +++---- client/widgets/WarningItem.cpp | 5 - client/widgets/WarningList.cpp | 26 +-- client/widgets/WarningList.h | 2 +- prepare_osx_build_environment.sh | 2 +- qdigidoc4.wxs | 1 - 29 files changed, 290 insertions(+), 688 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index ce49ff0b1..659761696 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -65,7 +65,7 @@ jobs: run: apt update -qq && apt install --no-install-recommends -y git lsb-release fakeroot build-essential devscripts debhelper pkg-config cmake libldap2-dev gettext libpcsclite-dev libssl-dev libqt5svg5-dev qttools5-dev-tools qttools5-dev lintian libflatbuffers-dev zlib1g-dev - name: Install dependencies if: matrix.container != 'ubuntu:20.04' - run: apt update -qq && apt install --no-install-recommends -y git lsb-release fakeroot build-essential devscripts debhelper pkg-config cmake libldap2-dev gettext libpcsclite-dev libssl-dev libgl-dev libqt6svg6-dev qt6-tools-dev qt6-tools-dev-tools qt6-l10n-tools libqt6core5compat6-dev lintian libflatbuffers-dev zlib1g-dev + run: apt update -qq && apt install --no-install-recommends -y git lsb-release fakeroot build-essential devscripts debhelper pkg-config cmake libldap2-dev gettext libpcsclite-dev libssl-dev libgl-dev libqt6svg6-dev qt6-tools-dev qt6-tools-dev-tools qt6-l10n-tools lintian libflatbuffers-dev zlib1g-dev - name: Checkout uses: actions/checkout@v4 with: @@ -109,7 +109,7 @@ jobs: - name: Install Deps run: | dnf install -y --setopt=install_weak_deps=False \ - git gcc-c++ cmake rpm-build gettext openssl-devel openldap-devel pcsc-lite-devel qt6-qtsvg-devel qt6-qttools-devel qt6-qt5compat-devel flatbuffers-devel flatbuffers-compiler zlib-devel + git gcc-c++ cmake rpm-build gettext openssl-devel openldap-devel pcsc-lite-devel qt6-qtsvg-devel qt6-qttools-devel flatbuffers-devel flatbuffers-compiler zlib-devel - name: Install CMake if: matrix.container == 'fedora:39' run: | @@ -182,7 +182,6 @@ jobs: with: version: 6.6.1 arch: win64_msvc2019_64 - modules: qt5compat - name: Setup dev env uses: ilammy/msvc-dev-cmd@v1 with: @@ -218,7 +217,7 @@ jobs: with: submodules: recursive - name: Install dependencies - run: sudo apt update -qq && sudo apt install --no-install-recommends -y cmake libldap2-dev gettext libpcsclite-dev libminizip-dev libxml-security-c-dev libgl-dev libqt6svg6-dev qt6-tools-dev qt6-tools-dev-tools qt6-l10n-tools libqt6core5compat6-dev libflatbuffers-dev zlib1g-dev + run: sudo apt update -qq && sudo apt install --no-install-recommends -y cmake libldap2-dev gettext libpcsclite-dev libminizip-dev libxml-security-c-dev libgl-dev libqt6svg6-dev qt6-tools-dev qt6-tools-dev-tools qt6-l10n-tools libflatbuffers-dev zlib1g-dev - name: Download artifact uses: dawidd6/action-download-artifact@v2 with: @@ -262,7 +261,7 @@ jobs: with: submodules: recursive - name: Install dependencies - run: sudo apt update -qq && sudo apt install --no-install-recommends -y cmake libldap2-dev gettext libpcsclite-dev libminizip-dev libxml-security-c-dev libgl-dev libqt6svg6-dev qt6-tools-dev qt6-tools-dev-tools qt6-l10n-tools libqt6core5compat6-dev libflatbuffers-dev zlib1g-dev + run: sudo apt update -qq && sudo apt install --no-install-recommends -y cmake libldap2-dev gettext libpcsclite-dev libminizip-dev libxml-security-c-dev libgl-dev libqt6svg6-dev qt6-tools-dev qt6-tools-dev-tools qt6-l10n-tools libflatbuffers-dev zlib1g-dev - name: Download artifact uses: dawidd6/action-download-artifact@v2 with: diff --git a/README.md b/README.md index 91a170856..bca6137ac 100644 --- a/README.md +++ b/README.md @@ -24,9 +24,9 @@ * Install # Ubuntu - 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 + sudo apt install cmake qt6-tools-dev libqt6svg6-dev libpcsclite-dev libssl-dev libdigidocpp-dev libldap2-dev gettext pkg-config libflatbuffers-dev zlib1g-dev # Fedora - 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 + sudo dnf install qt6-qtsvg-devel qt6-qttools-devel pcsc-lite-devel openssl-devel libdigidocpp openldap-devel gettext pkg-config flatbuffers-devel flatbuffers-compiler * Also runtime dependency opensc-pkcs11 and pcscd is needed diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index 2594007aa..174f707d8 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -1,5 +1,6 @@ add_executable( TSLDownload TSLDownload.cpp ) target_link_libraries(TSLDownload Qt${QT_VERSION_MAJOR}::Network) +set_target_properties(TSLDownload PROPERTIES AUTOMOC OFF) get_target_property(qtCore_install_prefix Qt${QT_VERSION_MAJOR}::qmake IMPORTED_LOCATION) get_filename_component(qtCore_install_prefix ${qtCore_install_prefix} DIRECTORY) add_custom_command( @@ -102,8 +103,8 @@ if(NOT BUILD_DATE) endif() if(${QT_VERSION_MAJOR} STREQUAL "6") - find_package(Qt6 COMPONENTS Core5Compat SvgWidgets REQUIRED) - target_link_libraries(${PROJECT_NAME} Qt6::Core5Compat Qt6::SvgWidgets) + find_package(Qt6 COMPONENTS SvgWidgets REQUIRED) + target_link_libraries(${PROJECT_NAME} Qt6::SvgWidgets) endif() set_target_properties(${PROJECT_NAME} PROPERTIES diff --git a/client/CryptoDoc.cpp b/client/CryptoDoc.cpp index 1b5ad7754..e2d882177 100644 --- a/client/CryptoDoc.cpp +++ b/client/CryptoDoc.cpp @@ -226,14 +226,7 @@ CKey::CKey(const QSslCertificate &c) QString sn = c.subjectInfo("SN"); if(!gn.isEmpty() || !sn.isEmpty()) cn = QStringLiteral("%1 %2 %3").arg(gn, sn, c.personalCode()); - QString o = c.subjectInfo(QSslCertificate::Organization); - static const QRegularExpression rx(QStringLiteral("ESTEID \\((.*)\\)")); - QRegularExpressionMatch match = rx.match(o); - if(match.hasMatch()) - return QStringLiteral("%1 %2").arg(cn, match.captured(1)); - if(o == QLatin1String("ESTEID")) - return QStringLiteral("%1 %2").arg(cn, CryptoDoc::tr("ID-CARD")); int certType = c.type(); if(certType & SslCertificate::EResidentSubType) return QStringLiteral("%1 %2").arg(cn, CryptoDoc::tr("Digi-ID E-RESIDENT")); diff --git a/client/Diagnostics.cpp b/client/Diagnostics.cpp index 6d25ec0fe..34fa74e31 100644 --- a/client/Diagnostics.cpp +++ b/client/Diagnostics.cpp @@ -129,31 +129,7 @@ void Diagnostics::generalInfo(QTextStream &s) s << "
"; return r; }; - if(printAID(QStringLiteral("AID35"), APDU("00A40400 0F D23300000045737445494420763335")) || - printAID(QStringLiteral("UPDATER_AID"), APDU("00A40400 0A D2330000005550443101"))) - { - reader.transfer(APDU("00A4000C")); - reader.transfer(APDU("00A4010C 02 EEEE")); - reader.transfer(APDU("00A4020C 02 5044")); - QByteArray row = APDU("00B20004 00"); - row[2] = 0x07; // read card id - s << "ID - " << reader.transfer(row).data << "
"; - - QString appletVersion; - if(QPCSCReader::Result data = reader.transfer(APDU("00CA0100 00"))) - { - for(int i = 0; i < data.data.size(); ++i) - { - if(i == 0) - appletVersion = QString::number(quint8(data.data[i])); - else - appletVersion += QStringLiteral(".%1").arg(quint8(data.data[i])); - } - } - if(!appletVersion.isEmpty()) - s << tr("Applet version") << ": " << appletVersion << "
"; - } - else if(printAID(QStringLiteral("AID_IDEMIA"), APDU("00A40400 10 A000000077010800070000FE00000100")) || + if(printAID(QStringLiteral("AID_IDEMIA"), APDU("00A40400 10 A000000077010800070000FE00000100")) || printAID(QStringLiteral("AID_OT"), APDU("00A4040C 0D E828BD080FF2504F5420415750")) || printAID(QStringLiteral("AID_QSCD"), APDU("00A4040C 10 51534344204170706C69636174696F6E"))) { diff --git a/client/MainWindow.cpp b/client/MainWindow.cpp index 43ca32748..bd8b3a5ed 100644 --- a/client/MainWindow.cpp +++ b/client/MainWindow.cpp @@ -28,7 +28,7 @@ #include "PrintSheet.h" #include "QPCSC.h" #include "QSigner.h" -#include "Settings.h" +#include "SslCertificate.h" #include "Styles.h" #include "TokenData.h" #include "effects/ButtonHoverFilter.h" @@ -43,7 +43,6 @@ #include "dialogs/WarningDialog.h" #include "widgets/DropdownButton.h" #include "widgets/CardPopup.h" -#include "widgets/VerifyCert.h" #include "widgets/WarningItem.h" #include "widgets/WarningList.h" diff --git a/client/MainWindow.ui b/client/MainWindow.ui index f2cd24b1e..257863090 100644 --- a/client/MainWindow.ui +++ b/client/MainWindow.ui @@ -527,7 +527,7 @@ background-position: bottom; } - + Qt::Vertical @@ -540,66 +540,63 @@ background-position: bottom; } - + 0 - 128 + 45 - - - - - - 20 - true - - - - border: none; + + + 20 + true + + + + border: none; color: #041E42; - - - 0 - - - Drag file here for signing ... - - - Qt::AlignCenter - - - - - - - - 240 - 45 - - - - - 240 - 45 - - - - - 14 - false - false - - - - PointingHandCursor - - - Load file from disk for signing or verifying - - - QPushButton { + + + 0 + + + Drag file here for signing ... + + + Qt::AlignCenter + + + + + + + + 240 + 45 + + + + + 240 + 45 + + + + + 14 + false + false + + + + PointingHandCursor + + + Load file from disk for signing or verifying + + + QPushButton { padding: 6px 10px; border-radius: 2px; background-color: #006eb5; @@ -616,17 +613,14 @@ QPushButton:hover:!pressed { QPushButton:disabled { background-color: #BEDBED; } - - - Open file for signing or verifying - - - - + + + Open file for signing or verifying + - + Qt::Vertical @@ -664,43 +658,63 @@ background-position: bottom; - + 0 - 128 + 45 - - - - - - 240 - 45 - - - - - 240 - 45 - - - - - 14 - false - false - - - - PointingHandCursor - - - Load file from disk for encryption or decryption - - - QPushButton { + + + 20 + true + + + + border: none; +color: #041E42; + + + 0 + + + Drag file here for encryption ... + + + Qt::AlignCenter + + + + + + + + 240 + 45 + + + + + 240 + 45 + + + + + 14 + false + false + + + + PointingHandCursor + + + Load file from disk for encryption or decryption + + + QPushButton { padding: 6px 10px; border-radius: 2px; background-color: #006eb5; @@ -717,36 +731,10 @@ QPushButton:hover:!pressed { QPushButton:disabled { background-color: #BEDBED; } - - - Open file for encryption or decryption - - - - - - - - 20 - true - - - - border: none; -color: #041E42; - - - 0 - - - Drag file here for encryption ... - - - Qt::AlignCenter - - - - + + + Open file for encryption or decryption + @@ -838,12 +826,6 @@ background-position: bottom; - - - 16777215 - 45 - - 20 @@ -862,6 +844,12 @@ background-position: bottom; Qt::AlignCenter + + true + + + true + @@ -912,7 +900,7 @@ background-position: bottom; QSvgWidget QWidget -
QSvgWidget.h
+
QSvgWidget
1
diff --git a/client/MainWindow_MyEID.cpp b/client/MainWindow_MyEID.cpp index 8c4303cac..db71c21c8 100644 --- a/client/MainWindow_MyEID.cpp +++ b/client/MainWindow_MyEID.cpp @@ -139,7 +139,7 @@ bool MainWindow::validateCardError(QSmartCardData::PinType type, QSmartCardData: void MainWindow::showNotification( const QString &msg, bool isSuccess ) { - FadeInNotification* notification = new FadeInNotification(this, + auto *notification = new FadeInNotification(this, isSuccess ? QStringLiteral("#ffffff") : QStringLiteral("#353739"), isSuccess ? QStringLiteral("#498526") : QStringLiteral("#F8DDA7"), 110); notification->start(msg, 750, 3000, 1200); @@ -182,11 +182,6 @@ void MainWindow::updateCardWarnings(const QSmartCardData &data) ui->myEid->invalidIcon(true); warnings->showWarning(WarningText(WarningType::CertExpiredWarning)); } - else if(data.authCert().publicKey().algorithm() == QSsl::Rsa) - { - ui->myEid->invalidIcon(true); - warnings->showWarning(WarningText(WarningType::CertRevokedWarning)); - } else if(expiresIn <= 105 * DAY) { ui->myEid->warningIcon(true); @@ -198,15 +193,23 @@ void MainWindow::updateMyEID(const TokenData &t) { warnings->clearMyEIDWarnings(); SslCertificate cert(t.cert()); - int type = cert.type(); - ui->infoStack->setHidden(t.isNull() || type == SslCertificate::UnknownType); - ui->accordion->setHidden(t.isNull() || type == SslCertificate::UnknownType); - ui->noReaderInfo->setVisible(t.isNull() || type == SslCertificate::UnknownType); - - if(!t.isNull()) + auto type = cert.type(); + ui->infoStack->setHidden(type == SslCertificate::UnknownType || type == SslCertificate::OldEstEidType); + ui->accordion->setHidden(type == SslCertificate::UnknownType || type == SslCertificate::OldEstEidType); + ui->noReaderInfo->setVisible(type == SslCertificate::UnknownType || type == SslCertificate::OldEstEidType); + + auto setText = [this](const char *text) { + ui->noReaderInfoText->setProperty("currenttext", text); + ui->noReaderInfoText->setText(tr(text)); + }; + if(type == SslCertificate::OldEstEidType) + setText(QT_TR_NOOP( + "The ID-card in the card reader has expired and is no longer supported in the DigiDoc4 Client.
" + "You can apply for a new ID-card from the Estonian Police and Border Guard Board.
" + "Additional information.")); + else if(!t.isNull()) { - ui->noReaderInfoText->setProperty("currenttext", "The card in the card reader is not an Estonian ID-card"); - ui->noReaderInfoText->setText(tr("The card in the card reader is not an Estonian ID-card")); + setText(QT_TR_NOOP("The card in the card reader is not an Estonian ID-card")); if(ui->cardInfo->token().card() != t.card()) ui->accordion->clear(); if(type & SslCertificate::TempelType) diff --git a/client/QSigner.cpp b/client/QSigner.cpp index ff2c8283d..3d48c792c 100644 --- a/client/QSigner.cpp +++ b/client/QSigner.cpp @@ -224,12 +224,12 @@ QByteArray QSigner::decrypt(std::function &&func) continue; case QCryptoBackend::PinLocked: QCardLock::instance().exclusiveUnlock(); - d->smartcard->reload(); // QSmartCard should also know that PIN1 is blocked. + d->smartcard->reloadCounters(); // QSmartCard should also know that PIN1 is blocked. Q_EMIT error(QCryptoBackend::errorString(status)); return {}; default: QCardLock::instance().exclusiveUnlock(); - d->smartcard->reload(); // QSmartCard should also know that PIN1 is blocked. + d->smartcard->reloadCounters(); // QSmartCard should also know that PIN1 is blocked. Q_EMIT error(tr("Failed to login token") + " " + QCryptoBackend::errorString(status)); return {}; } @@ -237,7 +237,7 @@ QByteArray QSigner::decrypt(std::function &&func) QByteArray result = waitFor(func, d->backend); QCardLock::instance().exclusiveUnlock(); d->backend->logout(); - d->smartcard->reload(); // QSmartCard should also know that PIN1 is blocked. + d->smartcard->reloadCounters(); // QSmartCard should also know that PIN1 is blocked. if(d->backend->lastError() == QCryptoBackend::PinCanceled) return {}; @@ -266,7 +266,7 @@ QSslKey QSigner::key() const case QCryptoBackend::PinLocked: default: QCardLock::instance().exclusiveUnlock(); - d->smartcard->reload(); + d->smartcard->reloadCounters(); // QSmartCard should also know that PIN1 is blocked. return {}; } } while(status != QCryptoBackend::PinOK); @@ -290,7 +290,7 @@ void QSigner::logout() { d->backend->logout(); QCardLock::instance().exclusiveUnlock(); - d->smartcard->reload(); // QSmartCard should also know that PIN1 info is updated + d->smartcard->reloadCounters(); // QSmartCard should also know that PIN1 info is updated } QCryptographicHash::Algorithm QSigner::methodToNID(const std::string &method) @@ -437,18 +437,18 @@ std::vector QSigner::sign(const std::string &method, const std::v case QCryptoBackend::PinOK: break; case QCryptoBackend::PinCanceled: QCardLock::instance().exclusiveUnlock(); - d->smartcard->reload(); // QSmartCard should also know that PIN2 info is updated + d->smartcard->reloadCounters(); // QSmartCard should also know that PIN2 info is updated throwException((tr("Failed to login token") + " " + QCryptoBackend::errorString(status)), Exception::PINCanceled) case QCryptoBackend::PinIncorrect: (new WarningDialog(QCryptoBackend::errorString(status), Application::mainWindow()))->exec(); continue; case QCryptoBackend::PinLocked: QCardLock::instance().exclusiveUnlock(); - d->smartcard->reload(); // QSmartCard should also know that PIN2 info is updated + d->smartcard->reloadCounters(); // QSmartCard should also know that PIN2 info is updated throwException((tr("Failed to login token") + " " + QCryptoBackend::errorString(status)), Exception::PINLocked) default: QCardLock::instance().exclusiveUnlock(); - d->smartcard->reload(); // QSmartCard should also know that PIN2 info is updated + d->smartcard->reloadCounters(); // QSmartCard should also know that PIN2 info is updated throwException((tr("Failed to login token") + " " + QCryptoBackend::errorString(status)), Exception::PINFailed) } } while(status != QCryptoBackend::PinOK); @@ -456,7 +456,7 @@ std::vector QSigner::sign(const std::string &method, const std::v methodToNID(method), QByteArray::fromRawData((const char*)digest.data(), int(digest.size()))); QCardLock::instance().exclusiveUnlock(); d->backend->logout(); - d->smartcard->reload(); // QSmartCard should also know that PIN2 info is updated + d->smartcard->reloadCounters(); // QSmartCard should also know that PIN2 info is updated if(d->backend->lastError() == QCryptoBackend::PinCanceled) throwException(tr("Failed to login token"), Exception::PINCanceled) diff --git a/client/QSmartCard.cpp b/client/QSmartCard.cpp index 8f237a039..959d2bc37 100644 --- a/client/QSmartCard.cpp +++ b/client/QSmartCard.cpp @@ -31,16 +31,15 @@ #include #include #include -#include Q_LOGGING_CATEGORY(CLog, "qdigidoc4.QSmartCard") QSmartCardData::QSmartCardData(): d(new QSmartCardDataPrivate) {} QSmartCardData::QSmartCardData(const QSmartCardData &other) = default; -QSmartCardData::QSmartCardData(QSmartCardData &&other) Q_DECL_NOEXCEPT: d(std::move(other.d)) {} +QSmartCardData::QSmartCardData(QSmartCardData &&other) Q_DECL_NOEXCEPT = default; QSmartCardData::~QSmartCardData() = default; QSmartCardData& QSmartCardData::operator =(const QSmartCardData &other) = default; -QSmartCardData& QSmartCardData::operator =(QSmartCardData &&other) Q_DECL_NOEXCEPT { std::swap(d, other.d); return *this; } +QSmartCardData& QSmartCardData::operator =(QSmartCardData &&other) Q_DECL_NOEXCEPT = default; bool QSmartCardData::operator ==(const QSmartCardData &other) const { return d == other.d || ( @@ -65,7 +64,6 @@ QVariant QSmartCardData::data(PersonalDataType type) const SslCertificate QSmartCardData::authCert() const { return d->authCert; } SslCertificate QSmartCardData::signCert() const { return d->signCert; } quint8 QSmartCardData::retryCount(PinType type) const { return d->retry.value(type); } -ulong QSmartCardData::usageCount(PinType type) const { return d->usage.value(type); } quint8 QSmartCardData::minPinLen(QSmartCardData::PinType type) { @@ -113,181 +111,23 @@ QPCSCReader::Result Card::transfer(QPCSCReader *reader, bool verify, const QByte } - -const QByteArray EstEIDCard::ESTEIDDF = APDU("00A4010C 02 EEEE"); -const QByteArray EstEIDCard::PERSONALDATA = APDU("00A4020C 02 5044"); -const QTextCodec* EstEIDCard::codec = QTextCodec::codecForName("Windows-1252"); - -QPCSCReader::Result EstEIDCard::change(QPCSCReader *reader, QSmartCardData::PinType type, const QString &pin_, const QString &newpin_) const +QHash Card::parseFCI(const QByteArray &data) { - QByteArray cmd = CHANGE; - QByteArray newpin = newpin_.toUtf8(); - QByteArray pin = pin_.toUtf8(); - cmd[3] = char(type == QSmartCardData::PukType ? 0 : type); - cmd[4] = char(pin.size() + newpin.size()); - return transfer(reader, false, cmd + pin + newpin, type, quint8(pin.size()), true); -} - -bool EstEIDCard::loadPerso(QPCSCReader *reader, QSmartCardDataPrivate *d) const -{ - static const QByteArray AUTHCERT = APDU("00A40200 02 AACE"); - static const QByteArray SIGNCERT = APDU("00A40200 02 DDCE"); - - if(reader->transfer(MASTER_FILE) && - reader->transfer(ESTEIDDF) && - d->data.isEmpty() && reader->transfer(PERSONALDATA)) + QHash result; + for(QByteArray::const_iterator i = data.constBegin(); i != data.constEnd(); ++i) { - QByteArray cmd = READRECORD; - for(char data = QSmartCardData::SurName; data != QSmartCardData::Comment4; ++data) - { - cmd[2] = data; - QPCSCReader::Result result = reader->transfer(cmd); - if(!result) - return false; - QString record = codec->toUnicode(result.data.trimmed()); - if(record == QChar(0)) - record.clear(); - switch(data) - { - case QSmartCardData::BirthDate: - case QSmartCardData::IssueDate: - d->data[QSmartCardData::PersonalDataType(data)] = QDate::fromString(record, QStringLiteral("dd.MM.yyyy")); - break; - case QSmartCardData::Expiry: - d->data[QSmartCardData::PersonalDataType(data)] = QDateTime::fromString(record, QStringLiteral("dd.MM.yyyy")).addDays(1).addSecs(-1); - break; - default: - d->data[QSmartCardData::PersonalDataType(data)] = record; - break; - } - } - } - bool readFailed = false; - auto readCert = [&](const QByteArray &file) { - // Workaround some cards, add Le to end - QPCSCReader::Result data = reader->transfer(file + APDU(reader->protocol() == QPCSCReader::T1 ? "00" : "")); - if(!data) - return QSslCertificate(); - QHash fci = QSmartCard::parseFCI(data.data); - int size = fci.contains(0x85) ? quint8(fci[0x85][0]) << 8 | quint8(fci[0x85][1]) : 0x0600; - QByteArray cert; - QByteArray cmd = READBINARY; - while(cert.size() < size) + quint8 tag(*i), size(*++i); + result[tag] = QByteArray(i + 1, size); + switch(tag) { - cmd[2] = char(cert.size() >> 8); - cmd[3] = char(cert.size()); - data = reader->transfer(cmd); - if(!data) - { - readFailed = true; - return QSslCertificate(); - } - cert += data.data; + case 0x6F: + case 0x62: + case 0x64: + case 0xA1: continue; + default: i += size; break; } - return QSslCertificate(cert, QSsl::Der); - }; - if(d->authCert.isNull()) - d->authCert = readCert(AUTHCERT); - if(d->signCert.isNull()) - d->signCert = readCert(SIGNCERT); - if(readFailed) - return false; - d->data[QSmartCardData::Email] = d->authCert.subjectAlternativeNames().values(QSsl::EmailEntry).value(0); - return updateCounters(reader, d); -} - -QPCSCReader::Result EstEIDCard::replace(QPCSCReader *reader, QSmartCardData::PinType type, const QString &puk_, const QString &pin_) const -{ - QPCSCReader::Result result; - if(!reader->isPinPad()) //Verify PUK. Not for pinpad. - { - result = verify(reader, QSmartCardData::PukType, puk_); - if(!result) - return result; } - - // Replace PIN with PUK - QByteArray pin = pin_.toUtf8(); - QByteArray puk = puk_.toUtf8(); - QByteArray cmd = Card::REPLACE; - cmd[3] = type; - cmd[4] = char(puk.size() + pin.size()); - return transfer(reader, false, cmd + puk + pin, type, 0, true); -} - -QByteArray EstEIDCard::sign(QPCSCReader *reader, const QByteArray &dgst) const -{ - if(!reader->transfer(APDU("0022F301")) || // 00")) || // Compatibilty for some cards // SECENV1 - !reader->transfer(APDU("002241B8 02 8300"))) //Key reference, 8303801100 - return {}; - QByteArray cmd = MUTUAL_AUTH; - cmd[4] = char(dgst.size()); - cmd.insert(5, dgst); - return reader->transfer(cmd).data; -} - -bool EstEIDCard::updateCounters(QPCSCReader *reader, QSmartCardDataPrivate *d) const -{ - static const QByteArray KEYPOINTER = APDU("00A4020C 02 0033"); - static const QByteArray KEYUSAGE = APDU("00A4020C 02 0013"); - static const QByteArray PINRETRY = APDU("00A4020C 02 0016"); - - if(!reader->transfer(MASTER_FILE) || - !reader->transfer(PINRETRY)) - return false; - - QByteArray cmd = READRECORD; - for(int i = QSmartCardData::Pin1Type; i <= QSmartCardData::PukType; ++i) - { - cmd[2] = char(i); - QPCSCReader::Result data = reader->transfer(cmd); - if(!data) - return false; - d->retry[QSmartCardData::PinType(i)] = quint8(data.data[5]); - } - - if(!reader->transfer(ESTEIDDF) || - !reader->transfer(KEYPOINTER)) - return false; - - cmd[2] = 1; - QPCSCReader::Result data = reader->transfer(cmd); - if(!data) - return false; - - /* - * SIGN1 0100 1 - * SIGN2 0200 2 - * AUTH1 1100 3 - * AUTH2 1200 4 - */ - quint8 signkey = data.data.at(0x13) == 0x01 && data.data.at(0x14) == 0x00 ? 1 : 2; - quint8 authkey = data.data.at(0x09) == 0x11 && data.data.at(0x0A) == 0x00 ? 3 : 4; - - if(!reader->transfer(KEYUSAGE)) - return false; - - cmd[2] = char(authkey); - data = reader->transfer(cmd); - if(!data) - return false; - d->usage[QSmartCardData::Pin1Type] = 0xFFFFFF - ((quint8(data.data[12]) << 16) + (quint8(data.data[13]) << 8) + quint8(data.data[14])); - - cmd[2] = char(signkey); - data = reader->transfer(cmd); - if(!data) - return false; - d->usage[QSmartCardData::Pin2Type] = 0xFFFFFF - ((quint8(data.data[12]) << 16) + (quint8(data.data[13]) << 8) + quint8(data.data[14])); - return true; -} - -QPCSCReader::Result EstEIDCard::verify(QPCSCReader *reader, QSmartCardData::PinType type, const QString &pin_) const -{ - QByteArray pin = pin_.toUtf8(); - QByteArray cmd = VERIFY; - cmd[3] = char(type == QSmartCardData::PukType ? 0 : type); - cmd[4] = char(pin.size()); - return transfer(reader, true, cmd + pin, type, 0, true); + return result; } @@ -332,7 +172,7 @@ bool IDEMIACard::loadPerso(QPCSCReader *reader, QSmartCardDataPrivate *d) const if(d->data.isEmpty() && reader->transfer(APDU("00A4010C025000"))) { QByteArray cmd = APDU("00A4010C025001"); - for(char data = 1; data <= 15; ++data) + for(char data = 1; data <= 8; ++data) { cmd[6] = data; if(!reader->transfer(cmd)) @@ -346,14 +186,12 @@ bool IDEMIACard::loadPerso(QPCSCReader *reader, QSmartCardDataPrivate *d) const switch(data) { case 1: d->data[QSmartCardData::SurName] = record; break; - case 2: d->data[QSmartCardData::FirstName1] = record; break; - case 3: d->data[QSmartCardData::Sex] = record; break; + case 2: d->data[QSmartCardData::FirstName] = record; break; case 4: d->data[QSmartCardData::Citizen] = record; break; case 5: if(!record.isEmpty()) { QStringList data = record.split(' '); - d->data[QSmartCardData::BirthPlace] = data.value(3); if(data.size() > 3) data.removeLast(); d->data[QSmartCardData::BirthDate] = QDate::fromString(data.join('.'), QStringLiteral("dd.MM.yyyy")); @@ -362,12 +200,6 @@ bool IDEMIACard::loadPerso(QPCSCReader *reader, QSmartCardDataPrivate *d) const case 6: d->data[QSmartCardData::Id] = record; break; case 7: d->data[QSmartCardData::DocumentId] = record; break; case 8: d->data[QSmartCardData::Expiry] = QDateTime::fromString(record, QStringLiteral("dd MM yyyy")).addDays(1).addSecs(-1); break; - case 9: d->data[QSmartCardData::IssueDate] = record; break; - case 10: d->data[QSmartCardData::ResidencePermit] = record; break; - case 11: d->data[QSmartCardData::Comment1] = record; break; - case 12: d->data[QSmartCardData::Comment2] = record; break; - case 13: d->data[QSmartCardData::Comment3] = record; break; - case 14: d->data[QSmartCardData::Comment4] = record; break; default: break; } } @@ -383,7 +215,7 @@ bool IDEMIACard::loadPerso(QPCSCReader *reader, QSmartCardDataPrivate *d) const QPCSCReader::Result data = reader->transfer(file2); if(!data) return QSslCertificate(); - QHash fci = QSmartCard::parseFCI(data.data); + QHash fci = parseFCI(data.data); int size = fci.contains(0x80) ? quint8(fci[0x80][0]) << 8 | quint8(fci[0x80][1]) : 0x0600; QByteArray cert; QByteArray cmd = READBINARY; @@ -408,7 +240,6 @@ bool IDEMIACard::loadPerso(QPCSCReader *reader, QSmartCardDataPrivate *d) const if(readFailed) return false; - d->data[QSmartCardData::Email] = d->authCert.subjectAlternativeNames().values(QSsl::EmailEntry).value(0); return updateCounters(reader, d); } @@ -419,13 +250,21 @@ QByteArray IDEMIACard::pinTemplate(const QString &pin) return result; } -QPCSCReader::Result IDEMIACard::replace(QPCSCReader *reader, QSmartCardData::PinType type, const QString &puk, const QString &pin_) const +QPCSCReader::Result IDEMIACard::replace(QPCSCReader *reader, QSmartCardData::PinType type, const QString &puk_, const QString &pin_) const { - QPCSCReader::Result result = verify(reader, QSmartCardData::PukType, puk); + auto result = reader->transfer(AID); if(!result) return result; - QByteArray cmd = Card::REPLACE; + QByteArray puk = pinTemplate(puk_); + QByteArray cmd = VERIFY; + cmd[3] = 2; + cmd[4] = char(puk.size()); + result = transfer(reader, true, cmd + puk, type, 0, true); + if(!result) + return result; + + cmd = Card::REPLACE; cmd[2] = 2; if(type == QSmartCardData::Pin2Type) { @@ -452,8 +291,6 @@ QByteArray IDEMIACard::sign(QPCSCReader *reader, const QByteArray &dgst) const bool IDEMIACard::updateCounters(QPCSCReader *reader, QSmartCardDataPrivate *d) const { - d->usage[QSmartCardData::Pin1Type] = 0; - d->usage[QSmartCardData::Pin2Type] = 0; reader->transfer(AID); if(auto data = reader->transfer(APDU("00CB3FFF 0A 4D087006BF810102A08000"))) d->retry[QSmartCardData::Pin1Type] = quint8(data.data[13]); @@ -465,28 +302,6 @@ bool IDEMIACard::updateCounters(QPCSCReader *reader, QSmartCardDataPrivate *d) c return true; } -QPCSCReader::Result IDEMIACard::verify(QPCSCReader *reader, QSmartCardData::PinType type, const QString &pin_) const -{ - QByteArray pin = pinTemplate(pin_); - QByteArray cmd = VERIFY; - switch (type) { - case QSmartCardData::Pin1Type: - reader->transfer(AID); - cmd[3] = 1; - break; - case QSmartCardData::PukType: - reader->transfer(AID); - cmd[3] = 2; - break; - case QSmartCardData::Pin2Type: - reader->transfer(AID_QSCD); - cmd[3] = char(0x85); - break; - } - cmd[4] = char(pin.size()); - return transfer(reader, true, cmd + pin, type, 0, true); -} - QSharedPointer QSmartCard::Private::connect(const QString &reader) @@ -528,10 +343,7 @@ QSmartCard::QSmartCard(QObject *parent) { } -QSmartCard::~QSmartCard() -{ - delete d; -} +QSmartCard::~QSmartCard() = default; QSmartCard::ErrorType QSmartCard::change(QSmartCardData::PinType type, QWidget* parent, const QString &newpin, const QString &pin, const QString &title, const QString &bodyText) { @@ -559,25 +371,6 @@ QSmartCard::ErrorType QSmartCard::change(QSmartCardData::PinType type, QWidget* QSmartCardData QSmartCard::data() const { return d->t; } -QHash QSmartCard::parseFCI(const QByteArray &data) -{ - QHash result; - for(QByteArray::const_iterator i = data.constBegin(); i != data.constEnd(); ++i) - { - quint8 tag(*i), size(*++i); - result[tag] = QByteArray(i + 1, size); - switch(tag) - { - case 0x6F: - case 0x62: - case 0x64: - case 0xA1: continue; - default: i += size; break; - } - } - return result; -} - QSmartCard::ErrorType QSmartCard::pinChange(QSmartCardData::PinType type, QWidget* parent) { QScopedPointer p; @@ -628,23 +421,16 @@ QSmartCard::ErrorType QSmartCard::pinUnblock(QSmartCardData::PinType type, bool return unblock(type, parent, newPin, puk, title, textBody); } -void QSmartCard::reload() +void QSmartCard::reloadCounters() { - QCardLocker locker; - QSharedDataPointer t = d->t.d; - t->data.clear(); - t->authCert = QSslCertificate(); - t->signCert = QSslCertificate(); - d->t.d = t; - Q_EMIT dataChanged(d->t); - QTimer::singleShot(0, this, [this] { reloadCard(d->token); }); + QMetaObject::invokeMethod(this, [this] { reloadCard(d->token, true); }); } -void QSmartCard::reloadCard(const TokenData &token) +void QSmartCard::reloadCard(const TokenData &token, bool reloadCounters) { qCDebug(CLog) << "Polling"; d->token = token; - if(!d->t.isNull() && !d->t.card().isEmpty() && d->t.card() == token.card()) + if(!reloadCounters && !d->t.isNull() && !d->t.card().isEmpty() && d->t.card() == token.card()) return; // check if selected card is same as signer @@ -657,12 +443,12 @@ void QSmartCard::reloadCard(const TokenData &token) QSharedDataPointer t = d->t.d; t->card = token.card(); t->data.clear(); - t->authCert = QSslCertificate(); - t->signCert = QSslCertificate(); + t->authCert.clear(); + t->signCert.clear(); d->t.d = t; } - if(!d->t.isNull() || token.reader().isEmpty()) + if(!reloadCounters && (!d->t.isNull() || token.reader().isEmpty())) return; QString reader = token.reader(); @@ -678,16 +464,18 @@ void QSmartCard::reloadCard(const TokenData &token) if(!selectedReader->connect() || !selectedReader->beginTransaction()) return; + if(!IDEMIACard::isSupported(selectedReader->atr())) { + qDebug() << "Unsupported card"; + return; + } + qCDebug(CLog) << "Read card" << token.card() << "info"; QSharedDataPointer t; t = d->t.d; t->reader = selectedReader->name(); t->pinpad = selectedReader->isPinPad(); - delete d->card; - if(IDEMIACard::isSupported(selectedReader->atr())) - d->card = new IDEMIACard(); - else - d->card = new EstEIDCard(); + d->card.reset(); + d->card = std::make_unique(); if(d->card->loadPerso(selectedReader.data(), t)) { d->t.d = t; diff --git a/client/QSmartCard.h b/client/QSmartCard.h index ed2626f9b..d1d14575a 100644 --- a/client/QSmartCard.h +++ b/client/QSmartCard.h @@ -22,6 +22,8 @@ #include #include +#include + class SslCertificate; class QSmartCardDataPrivate; class QSslKey; @@ -32,23 +34,13 @@ class QSmartCardData public: enum PersonalDataType { - SurName = 1, - FirstName1, - FirstName2, - Sex, + SurName, + FirstName, Citizen, BirthDate, Id, DocumentId, Expiry, - BirthPlace, - IssueDate, - ResidencePermit, - Comment1, - Comment2, - Comment3, - Comment4, - Email }; enum PinType { @@ -77,7 +69,6 @@ class QSmartCardData SslCertificate authCert() const; SslCertificate signCert() const; quint8 retryCount( PinType type ) const; - ulong usageCount( PinType type ) const; static quint8 minPinLen(QSmartCardData::PinType type); static QString typeString( PinType type ); @@ -89,7 +80,7 @@ class QSmartCardData friend class QSmartCardPrivate; }; -class QSmartCard: public QObject +class QSmartCard final: public QObject { Q_OBJECT public: @@ -106,26 +97,24 @@ class QSmartCard: public QObject }; explicit QSmartCard(QObject *parent = nullptr); - ~QSmartCard(); + ~QSmartCard() final; ErrorType change( QSmartCardData::PinType type, QWidget* parent, const QString &newpin, const QString &pin, const QString &title, const QString &bodyText ); QSmartCardData data() const; TokenData tokenData() const; - void reloadCard(const TokenData &token); + void reloadCard(const TokenData &token, bool reloadCounters = false); + void reloadCounters(); ErrorType unblock( QSmartCardData::PinType type, QWidget* parent, const QString &pin, const QString &puk, const QString &title, const QString &bodyText ); ErrorType pinUnblock( QSmartCardData::PinType type, bool isForgotPin = false, QWidget* parent = nullptr ); ErrorType pinChange( QSmartCardData::PinType type, QWidget* parent = nullptr ); - static QHash parseFCI(const QByteArray &data); - signals: void dataChanged(const QSmartCardData &data); private: - void reload(); + Q_DISABLE_COPY(QSmartCard) class Private; - Private *d; - friend class QSigner; + std::unique_ptr d; }; diff --git a/client/QSmartCard_p.h b/client/QSmartCard_p.h index cc4416658..84c5c0905 100644 --- a/client/QSmartCard_p.h +++ b/client/QSmartCard_p.h @@ -30,8 +30,6 @@ #define APDU QByteArray::fromHex -class QTextCodec; - class Card { public: @@ -43,7 +41,8 @@ class Card static QPCSCReader::Result transfer(QPCSCReader *reader, bool verify, const QByteArray &apdu, QSmartCardData::PinType type, quint8 newPINOffset, bool requestCurrentPIN); virtual bool updateCounters(QPCSCReader *reader, QSmartCardDataPrivate *d) const = 0; - virtual QPCSCReader::Result verify(QPCSCReader *reader, QSmartCardData::PinType type, const QString &pin) const = 0; + + static QHash parseFCI(const QByteArray &data); static const QByteArray MASTER_FILE; static const QByteArray MUTUAL_AUTH; @@ -54,23 +53,6 @@ class Card static const QByteArray VERIFY; }; -class EstEIDCard: public Card -{ -public: - QPCSCReader::Result change(QPCSCReader *reader, QSmartCardData::PinType type, const QString &pin, const QString &newpin) const final; - bool loadPerso(QPCSCReader *reader, QSmartCardDataPrivate *d) const final; - QPCSCReader::Result replace(QPCSCReader *reader, QSmartCardData::PinType type, const QString &puk, const QString &pin) const final; - QByteArray sign(QPCSCReader *reader, const QByteArray &dgst) const final; - bool updateCounters(QPCSCReader *reader, QSmartCardDataPrivate *d) const final; - QPCSCReader::Result verify(QPCSCReader *reader, QSmartCardData::PinType type, const QString &pin) const final; - - static QString cardNR(QPCSCReader *reader); - - static const QTextCodec *codec; - static const QByteArray ESTEIDDF; - static const QByteArray PERSONALDATA; -}; - class IDEMIACard: public Card { public: @@ -79,7 +61,6 @@ class IDEMIACard: public Card QPCSCReader::Result replace(QPCSCReader *reader, QSmartCardData::PinType type, const QString &puk, const QString &pin) const final; QByteArray sign(QPCSCReader *reader, const QByteArray &dgst) const final; bool updateCounters(QPCSCReader *reader, QSmartCardDataPrivate *d) const final; - QPCSCReader::Result verify(QPCSCReader *reader, QSmartCardData::PinType type, const QString &pin) const final; static QString cardNR(QPCSCReader *reader); static bool isSupported(const QByteArray &atr); @@ -95,7 +76,7 @@ class QSmartCard::Private QSmartCard::ErrorType handlePinResult(QPCSCReader *reader, const QPCSCReader::Result &response, bool forceUpdate); QSharedPointer reader; - Card *card = nullptr; + std::unique_ptr card; TokenData token; QSmartCardData t; }; @@ -107,6 +88,5 @@ class QSmartCardDataPrivate: public QSharedData QHash data; SslCertificate authCert, signCert; QHash retry; - QHash usage; bool pinpad = false; }; diff --git a/client/SslCertificate.cpp b/client/SslCertificate.cpp index f97d69918..fc89619ee 100644 --- a/client/SslCertificate.cpp +++ b/client/SslCertificate.cpp @@ -37,14 +37,19 @@ #include -#define toQByteArray(x) QByteArray((const char*)(x)->data, (x)->length) +template +auto toQByteArray(T &x) +{ + return QByteArray((const char*)x->data, x->length); +} + template static QByteArray i2dDer(Func func, Arg arg) { if(!arg) return {}; QByteArray der(func(arg, nullptr), 0); - unsigned char *p = (unsigned char*)der.data(); + auto *p = (unsigned char*)der.data(); if(der.isEmpty() || func(arg, &p) != der.size()) return {}; return der; @@ -265,7 +270,7 @@ QByteArray SslCertificate::toHex( const QByteArray &in, QChar separator ) QString SslCertificate::toString( const QString &format ) const { - QRegularExpression r(QStringLiteral("[a-zA-Z]+")); + static const QRegularExpression r(QStringLiteral("[a-zA-Z]+")); QString ret = format; QRegularExpressionMatch match; for(int pos = 0; (match = r.match(ret, pos)).hasMatch(); ) { @@ -282,11 +287,10 @@ SslCertificate::CertType SslCertificate::type() const for(const QString &p: policies()) { if(p.startsWith(QLatin1String("1.3.6.1.4.1.10015.1.1")) || - p.startsWith(QLatin1String("1.3.6.1.4.1.10015.3.1"))) - return EstEidType; - if(p.startsWith(QLatin1String("1.3.6.1.4.1.10015.1.2")) || + p.startsWith(QLatin1String("1.3.6.1.4.1.10015.3.1")) || + p.startsWith(QLatin1String("1.3.6.1.4.1.10015.1.2")) || p.startsWith(QLatin1String("1.3.6.1.4.1.10015.3.2"))) - return subjectInfo(QSslCertificate::Organization).contains(QStringLiteral("E-RESIDENT")) ? EResidentType : DigiIDType; + return OldEstEidType; if(p.startsWith(QLatin1String("1.3.6.1.4.1.10015.1.3")) || p.startsWith(QLatin1String("1.3.6.1.4.1.10015.11.1")) || p.startsWith(QLatin1String("1.3.6.1.4.1.10015.3.3")) || @@ -311,8 +315,7 @@ SslCertificate::CertType SslCertificate::type() const } // Check qcStatements extension according to ETSI EN 319 412-5 - QByteArray der = toDer(); - if (!der.isNull()) + if(QByteArray der = toDer(); !der.isNull()) { try { digidoc::X509Cert x509Cert((const unsigned char*)der.constData(), diff --git a/client/SslCertificate.h b/client/SslCertificate.h index 6bbe82038..54dbcca75 100644 --- a/client/SslCertificate.h +++ b/client/SslCertificate.h @@ -63,6 +63,7 @@ class SslCertificate: public QSslCertificate DigiIDType = 1 << 0, EstEidType = 1 << 1, MobileIDType = 1 << 2, + OldEstEidType = 1 << 3, TempelType = 1 << 4, EResidentSubType = 1 << 6, EResidentType = DigiIDType|EResidentSubType, diff --git a/client/common_enums.h b/client/common_enums.h index 8ca88841b..fdc828dbc 100644 --- a/client/common_enums.h +++ b/client/common_enums.h @@ -78,7 +78,6 @@ enum WarningType { CertExpiredWarning, CertExpiryWarning, - CertRevokedWarning, UnblockPin1Warning, UnblockPin2Warning, diff --git a/client/dialogs/SettingsDialog.cpp b/client/dialogs/SettingsDialog.cpp index b07b9a0c5..ae378e42c 100644 --- a/client/dialogs/SettingsDialog.cpp +++ b/client/dialogs/SettingsDialog.cpp @@ -238,15 +238,14 @@ SettingsDialog::SettingsDialog(int page, QWidget *parent) }); #ifdef Q_OS_WIN connect(ui->btnNavFromHistory, &QPushButton::clicked, this, [this] { - // remove certificates (having %ESTEID% text) from browsing history of Internet Explorer and/or Google Chrome, and do it for all users. + // remove certificates from browsing history of Internet Explorer and/or Google Chrome, and do it for all users. QList cache = qApp->signer()->cache(); CertStore s; for(const QSslCertificate &c: s.list()) { if(std::any_of(cache.cbegin(), cache.cend(), [&](const TokenData &token) { return token.cert() == c; })) continue; - if(c.subjectInfo(QSslCertificate::Organization).join(QString()).contains(QStringLiteral("ESTEID"), Qt::CaseInsensitive) || - c.issuerInfo(QSslCertificate::CommonName).join(QString()).contains(QStringLiteral("KLASS3-SK"), Qt::CaseInsensitive) || + if(c.issuerInfo(QSslCertificate::CommonName).join(QString()).contains(QStringLiteral("KLASS3-SK"), Qt::CaseInsensitive) || c.issuerInfo(QSslCertificate::Organization).contains(QStringLiteral("SK ID Solutions AS"), Qt::CaseInsensitive)) s.remove( c ); } diff --git a/client/images/intro_eid-manage_en.png b/client/images/intro_eid-manage_en.png index 54464ab6988358a03f224affe192c3a0ce943ce4..c80b9572e2b8fbd71bd1448edc826efe96e62e45 100644 GIT binary patch delta 18325 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 B>oouX diff --git a/client/images/intro_eid-manage_et.png b/client/images/intro_eid-manage_et.png index 61a8327ce5d692ffa1c89c14bda7f52b8950df2c..5affb633fc428f363b14ac23537cf474fca4f736 100644 GIT binary patch delta 17091 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

~guLe*`2fe3xKk2wNqN+~iT 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 u>F(!^=LqBv1h}HgAN|Cop@Qe;0RGwdm^U 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 Q@7*0WC2hqj#Iw+U0V}aHJpcdz diff --git a/client/translations/en.ts b/client/translations/en.ts index 1c6a14509..7142f15ea 100644 --- a/client/translations/en.ts +++ b/client/translations/en.ts @@ -763,10 +763,6 @@ TSL cache TSL cache - - Applet version - Applet version - true @@ -1571,6 +1567,10 @@ ID-CARD %1 changed! %1 changed! + + The ID-card in the card reader has expired and is no longer supported in the DigiDoc4 Client.<br />You can apply for a new ID-card from the Estonian Police and Border Guard Board.<br /><a href="https://www.politsei.ee/en/instructions/applying-for-an-id-card-for-an-adult">Additional information</a>. + The ID-card in the card reader has expired and is no longer supported in the DigiDoc4 Client.<br />You can apply for a new ID-card from the Estonian Police and Border Guard Board.<br /><a href="https://www.politsei.ee/en/instructions/applying-for-an-id-card-for-an-adult">Additional information</a>. + Encrypting Encrypting @@ -3055,10 +3055,6 @@ Additional licenses and components Certificate has expired! Certificate has expired! - - Certificate is revoked! - Certificate is revoked! - Certificate %1is valid%2 until %3 Certificate %1is valid%2 until %3 @@ -3103,16 +3099,6 @@ Additional licenses and components PUK code is blocked because the PUK code has been entered 3 times incorrectly. You can not unblock the PUK code yourself. As long as the PUK code is blocked, all eID options can be used, except PUK code. Please visit the service center to obtain new codes. <a href="https://www.politsei.ee/en/instructions/applying-for-an-id-card-for-an-adult/reminders-for-id-card-holders/">Additional information</a>. PUK code is blocked because the PUK code has been entered 3 times incorrectly. You can not unblock the PUK code yourself. <br><br>As long as the PUK code is blocked, all eID options can be used, except PUK code. <br><br>Please visit the service center to obtain new codes. <a href="https://www.politsei.ee/en/instructions/applying-for-an-id-card-for-an-adult/reminders-for-id-card-holders/">Additional information</a>. - - key has been used %1 times - pin1 - Authentication key has been used %1 times - - - key has been used %1 times - pin2 - Signature key has been used %1 times - PIN can be changed only using eToken utility PIN can be changed only using eToken utility @@ -3165,10 +3151,6 @@ Additional licenses and components PIN%1 can not be used because the certificate has expired. PIN%1 can not be used because the certificate has expired. - - PIN%1 can not be used because the certificate has revoked. - PIN%1 can not be used because the certificate has revoked. - Certificate status check failed. Please check your internet connection. Certificate status check failed. Please check your internet connection. @@ -3204,18 +3186,6 @@ Additional licenses and components WarningItem - - Certificates are revoked! - Certificates are revoked! - - - Additional information - Additional information - - - https://www.id.ee/en/article/the-majority-of-electronically-used-id-cards-were-renewed/ - https://www.id.ee/en/article/the-majority-of-electronically-used-id-cards-were-renewed/ - %n signatures are not valid! diff --git a/client/translations/et.ts b/client/translations/et.ts index 3a2f95429..28a30a7df 100644 --- a/client/translations/et.ts +++ b/client/translations/et.ts @@ -763,10 +763,6 @@ TSL cache TSL puhver - - Applet version - Apleti versioon - true @@ -1571,6 +1567,10 @@ ID-KAARDIGA %1 changed! %1-kood muudetud! + + The ID-card in the card reader has expired and is no longer supported in the DigiDoc4 Client.<br />You can apply for a new ID-card from the Estonian Police and Border Guard Board.<br /><a href="https://www.politsei.ee/en/instructions/applying-for-an-id-card-for-an-adult">Additional information</a>. + Lugejas olev ID-kaart on aegunud ning ei ole enam DigiDoc4 kliendis toetatud.<br />Uue ID-kaardi saad taotleda Politsei- ja Piirivalveametist.<br /><a href="https://www.politsei.ee/et/juhend/id-kaardi-taotlemine-taeiskasvanule">Loe täpsemalt siit</a>. + Encrypting Krüpteerin @@ -3055,10 +3055,6 @@ Täiendavad litsentsid ja komponendid Certificate has expired! Sertifikaat on aegunud! - - Certificate is revoked! - Sertifikaat on tühistatud! - Certificate %1is valid%2 until %3 Sertifikaat %1kehtib%2 kuni %3 @@ -3111,16 +3107,6 @@ Täiendavad litsentsid ja komponendid PIN can be changed only using eToken utility PIN-koodi saab muuta ainult e-Templi tarkvaraga - - key has been used %1 times - pin1 - Sertifikaati on kasutatud %1 korda - - - key has been used %1 times - pin2 - Sertifikaati on kasutatud %1 korda - Certificate for Encryption Krüpteerimissertifikaat @@ -3165,10 +3151,6 @@ Täiendavad litsentsid ja komponendid Certificate is not valid. A valid certificate is required for electronic use. Sertifikaat ei kehti. Elektrooniliseks kasutamiseks on vaja kehtivat sertifikaati. - - PIN%1 can not be used because the certificate has revoked. - PIN%1 ei saa kasutada, kuna sertifikaat on tühistatud. - Certificate status check failed. Please check your internet connection. Sertifikaadi staatuse kontrollimine ebaõnnestus. Palun kontrolli internetiühendust. @@ -3204,18 +3186,6 @@ Täiendavad litsentsid ja komponendid WarningItem - - Certificates are revoked! - Sertifikaadid on tühistatud! - - - Additional information - Täiendav informatsioon - - - https://www.id.ee/en/article/the-majority-of-electronically-used-id-cards-were-renewed/ - https://www.id.ee/artikkel/uuendati-enamik-elektrooniliselt-kasutatud-id-kaartidest/ - %n signatures are not valid! diff --git a/client/translations/ru.ts b/client/translations/ru.ts index a1e9490ad..ca5afbacd 100644 --- a/client/translations/ru.ts +++ b/client/translations/ru.ts @@ -763,10 +763,6 @@ TSL cache TSL-буфер - - Applet version - Версия апплета - true @@ -1571,6 +1567,10 @@ ID-КАРТОЙ %1 changed! %1-код изменён! + + The ID-card in the card reader has expired and is no longer supported in the DigiDoc4 Client.<br />You can apply for a new ID-card from the Estonian Police and Border Guard Board.<br /><a href="https://www.politsei.ee/en/instructions/applying-for-an-id-card-for-an-adult">Additional information</a>. + Срок действия ID-карты подключенной к считывателю карт истек, и больше не поддерживается программой DigiDoc4 клиент.<br />Вы можете ходатайствовать о новой ID-карте в Департаменте полиции и погранохраны.<br /><a href="https://www.politsei.ee/ru/instruktsii/hodataystvo-o-vydache-id-karty-vzroslomu">Подробнее читайте здесь</a>. + Encrypting Зашифровывание @@ -3056,10 +3056,6 @@ Additional licenses and components Certificate has expired! Срок действия сертификата истек! - - Certificate is revoked! - Сертификат отозван! - Certificate %1is valid%2 until %3 Сертификат %1действителен%2 до %3 @@ -3108,16 +3104,6 @@ Additional licenses and components PIN can be changed only using eToken utility PIN-код можно сменить только при помощи программного обеспечения e-Tempel - - key has been used %1 times - pin1 - Сертификат использован %1 раз - - - key has been used %1 times - pin2 - Сертификат использован %1 раз - Certificate for Encryption Сертификат шифрования @@ -3166,10 +3152,6 @@ Additional licenses and components PIN%1 can not be used because the certificate has expired. PIN%1 не может быть использован, так как срок действия сертификата истек. - - PIN%1 can not be used because the certificate has revoked. - PIN%1 не может быть использован, так как сертификат был отменен. - Certificate status check failed. Please check your internet connection. Проверка статуса сертификата не удалась. Пожалуйста проверьте подключение к интернету. @@ -3205,18 +3187,6 @@ Additional licenses and components WarningItem - - Certificates are revoked! - Сертификаты отозваны! - - - Additional information - Дополнительная информация - - - https://www.id.ee/en/article/the-majority-of-electronically-used-id-cards-were-renewed/ - https://www.id.ee/ru/artikkel/obnovleno-bolshinstvo-zatronutyh-riskom-id-kart-kotorye-ispolzovalis-elektronno/ - %n signatures are not valid! diff --git a/client/widgets/InfoStack.cpp b/client/widgets/InfoStack.cpp index df2a1a3f2..b9f4f82f5 100644 --- a/client/widgets/InfoStack.cpp +++ b/client/widgets/InfoStack.cpp @@ -134,14 +134,8 @@ void InfoStack::update(const SslCertificate &cert) void InfoStack::update(const QSmartCardData &t) { data = t; - QStringList firstName { - t.data( QSmartCardData::FirstName1 ).toString(), - t.data( QSmartCardData::FirstName2 ).toString() - }; - firstName.removeAll({}); - certType = t.authCert().type(); - givenNamesText = firstName.join(' '); + givenNamesText = t.data(QSmartCardData::FirstName).toString(); surnameText = t.data(QSmartCardData::SurName).toString(); personalCodeText = t.data(QSmartCardData::Id).toString(); citizenshipText = t.data(QSmartCardData::Citizen).toString(); diff --git a/client/widgets/VerifyCert.cpp b/client/widgets/VerifyCert.cpp index c5a71b0a3..b3fc7d51e 100644 --- a/client/widgets/VerifyCert.cpp +++ b/client/widgets/VerifyCert.cpp @@ -34,18 +34,18 @@ VerifyCert::VerifyCert(QWidget *parent) { ui->setupUi( this ); - connect(ui->changePIN, &QPushButton::clicked, [=] { + connect(ui->changePIN, &QPushButton::clicked, this, [=] { emit changePinClicked( false, isBlockedPin ); }); - connect(ui->forgotPinLink, &QPushButton::clicked, [=] { + connect(ui->forgotPinLink, &QPushButton::clicked, this, [=] { emit changePinClicked( true, false ); // Change PIN with PUK code }); - connect(ui->details, &QPushButton::clicked, [=] { + connect(ui->details, &QPushButton::clicked, this, [=] { CertificateDetails::showCertificate(c, this, pinType == QSmartCardData::Pin1Type ? QStringLiteral("-auth") : QStringLiteral("-sign")); }); connect(ui->checkCert, &QPushButton::clicked, this, [=]{ - QString msg = tr("Read more here.");; + QString msg = tr("Read more here."); switch(c.validateOnline()) { case SslCertificate::Good: @@ -108,16 +108,12 @@ void VerifyCert::update() { bool isBlockedPuk = !cardData.isNull() && cardData.retryCount( QSmartCardData::PukType ) == 0; bool isTempelType = c.type() & SslCertificate::TempelType; - bool isRevoked = pinType != QSmartCardData::PukType && - cardData.authCert().publicKey().algorithm() == QSsl::Rsa; - isValidCert = c.isNull() || (c.isValid() && !isRevoked); + isValidCert = c.isNull() || c.isValid(); QString txt; QTextStream cert( &txt ); - if(isRevoked) - cert << tr("Certificate is revoked!"); - else if( !isValidCert ) + if(!isValidCert) cert << tr("Certificate has expired!"); else { @@ -125,17 +121,11 @@ void VerifyCert::update() if(leftDays <= 105 && !c.isNull()) cert << ""; cert << tr("Certificate %1is valid%2 until %3").arg( - QStringLiteral(""), - QStringLiteral(""), + QLatin1String(""), + QLatin1String(""), DateTime(c.expiryDate().toLocalTime()).formatDate(QStringLiteral("dd. MMMM yyyy"))); if(leftDays <= 105 && !c.isNull()) cert << ""; - if(auto count = cardData.usageCount(pinType); count > 0) - { - cert << "
" << (pinType == QSmartCardData::Pin1Type ? - tr("key has been used %1 times", "pin1").arg(count) : - tr("key has been used %1 times", "pin2").arg(count)); - } } switch(pinType) { @@ -154,7 +144,6 @@ void VerifyCert::update() ui->forgotPinLink->setHidden(isBlockedPin || isBlockedPuk || isTempelType); ui->checkCert->setVisible(isValidCert); ui->error->setText( - isRevoked ? tr("PIN%1 can not be used because the certificate has revoked. ").arg(pinType) : !isValidCert ? tr("PIN%1 can not be used because the certificate has expired.").arg(pinType) : (isBlockedPin && isBlockedPuk) ? tr("PIN%1 has been blocked because PIN%1 code has been entered incorrectly 3 times.").arg(pinType) : isBlockedPin ? QStringLiteral("%1 %2").arg(tr("PIN%1 has been blocked because PIN%1 code has been entered incorrectly 3 times.").arg(pinType), tr("Unblock to reuse PIN%1.").arg(pinType)) : @@ -173,7 +162,8 @@ void VerifyCert::update() ui->error->setText( isBlockedPuk ? tr("PUK code is blocked because the PUK code has been entered 3 times incorrectly. " "You can not unblock the PUK code yourself. As long as the PUK code is blocked, all eID options can be used, except PUK code. " - "Please visit the service center to obtain new codes. Additional information.") : + "Please visit the service center to obtain new codes. " + "Additional information.") : QString() ); ui->widget->setHidden(isBlockedPuk); @@ -183,39 +173,35 @@ void VerifyCert::update() if( !isValidCert && pinType != QSmartCardData::PukType ) { setStyleSheet(QStringLiteral("opacity: 0.25; background-color: #F9EBEB;")); - ui->changePIN->setStyleSheet( - "QPushButton { border-radius: 2px; border: none; color: #ffffff; background-color: #006EB5;}" - "QPushButton:pressed { background-color: #41B6E6;}" - "QPushButton:hover:!pressed { background-color: #008DCF;}" - "QPushButton:disabled { background-color: #BEDBED;};" - ); - ui->error->setStyleSheet( - "padding: 6px 6px 6px 6px;" - "line-height: 14px;" - "border: 1px solid #c53e3e;" - "border-radius: 2px;" - "background-color: #e09797;" - "color: #5c1c1c;" - ); + ui->changePIN->setStyleSheet(QStringLiteral( + "QPushButton { border-radius: 2px; border: none; color: #ffffff; background-color: #006EB5;}" + "QPushButton:pressed { background-color: #41B6E6;}" + "QPushButton:hover:!pressed { background-color: #008DCF;}" + "QPushButton:disabled { background-color: #BEDBED;};")); + ui->error->setStyleSheet(QStringLiteral( + "padding: 6px 6px 6px 6px;" + "line-height: 14px;" + "border: 1px solid #c53e3e;" + "border-radius: 2px;" + "background-color: #e09797;" + "color: #5c1c1c;")); ui->nameIcon->load(QStringLiteral(":/images/icon_alert_red.svg")); ui->nameIcon->show(); } else if( isBlockedPin ) { setStyleSheet(QStringLiteral("opacity: 0.25; background-color: #fcf5ea;")); - ui->changePIN->setStyleSheet( - "QPushButton { border-radius: 2px; border: none; color: #ffffff; background-color: #006EB5;}" - "QPushButton:pressed { background-color: #41B6E6;}" - "QPushButton:hover:!pressed { background-color: #008DCF;}" - "QPushButton:disabled { background-color: #BEDBED;};" - ); - ui->error->setStyleSheet( - "padding: 6px 6px 6px 6px;" - "line-height: 14px;" - "border: 1px solid #e89c30;" - "border-radius: 2px;" - "background-color: #F8DDA7;" - ); + ui->changePIN->setStyleSheet(QStringLiteral( + "QPushButton { border-radius: 2px; border: none; color: #ffffff; background-color: #006EB5;}" + "QPushButton:pressed { background-color: #41B6E6;}" + "QPushButton:hover:!pressed { background-color: #008DCF;}" + "QPushButton:disabled { background-color: #BEDBED;};")); + ui->error->setStyleSheet(QStringLiteral( + "padding: 6px 6px 6px 6px;" + "line-height: 14px;" + "border: 1px solid #e89c30;" + "border-radius: 2px;" + "background-color: #F8DDA7;")); ui->nameIcon->load(QStringLiteral(":/images/icon_alert_orange.svg")); ui->nameIcon->show(); } @@ -233,7 +219,7 @@ void VerifyCert::update() if(pinType == QSmartCardData::Pin1Type) { adjustSize(); - if(VerifyCert *pukBox = parent()->findChild(QStringLiteral("pukBox"))) + if(auto *pukBox = parent()->findChild(QStringLiteral("pukBox"))) pukBox->ui->validUntil->setMinimumSize(ui->validUntil->size()); } } diff --git a/client/widgets/WarningItem.cpp b/client/widgets/WarningItem.cpp index d5656a212..1af1d8b1c 100644 --- a/client/widgets/WarningItem.cpp +++ b/client/widgets/WarningItem.cpp @@ -94,11 +94,6 @@ void WarningItem::lookupWarning() ui->warningText->setTextInteractionFlags(Qt::TextBrowserInteraction); ui->warningText->setOpenExternalLinks(true); break; - case ria::qdigidoc4::CertRevokedWarning: - warnText.text = tr("Certificates are revoked!"); - warnText.url = tr("https://www.id.ee/en/article/the-majority-of-electronically-used-id-cards-were-renewed/"); - warnText.details = tr("Additional information").toUpper(); - break; case ria::qdigidoc4::UnblockPin1Warning: warnText.text = QStringLiteral("%1 %2").arg(VerifyCert::tr("PIN%1 has been blocked because PIN%1 code has been entered incorrectly 3 times.").arg(1), VerifyCert::tr("Unblock to reuse PIN%1.").arg(1)); warnText.url = QStringLiteral("#unblock-PIN1"); diff --git a/client/widgets/WarningList.cpp b/client/widgets/WarningList.cpp index eb8797ce5..37bd98808 100644 --- a/client/widgets/WarningList.cpp +++ b/client/widgets/WarningList.cpp @@ -17,15 +17,15 @@ WarningList::WarningList(Ui::MainWindow *main, QWidget *parent) parent->installEventFilter(this); } -bool WarningList::appearsOnPage(WarningItem *warning, int page) const +bool WarningList::appearsOnPage(WarningItem *warning, int page) { return warning->page() == page || warning->page() == -1; } void WarningList::clearMyEIDWarnings() { - static const QList warningTypes {CertExpiredWarning, CertExpiryWarning, CertRevokedWarning, UnblockPin1Warning, UnblockPin2Warning}; - for(auto warning: warnings) + static const QList warningTypes {CertExpiredWarning, CertExpiryWarning, UnblockPin1Warning, UnblockPin2Warning}; + for(auto *warning: warnings) { if(warningTypes.contains(warning->warningType()) || warning->page() == MyEid) closeWarning(warning); @@ -35,7 +35,7 @@ void WarningList::clearMyEIDWarnings() void WarningList::closeWarning(int warningType) { - for(auto warning: warnings) + for(auto *warning: warnings) { if(warningType == warning->warningType()) closeWarning(warning); @@ -51,7 +51,7 @@ void WarningList::closeWarning(WarningItem *warning) void WarningList::closeWarnings(int page) { - for(auto warning: warnings) + for(auto *warning: warnings) { if(warning->page() == page) closeWarning(warning); @@ -64,7 +64,7 @@ bool WarningList::eventFilter(QObject *object, QEvent *event) if(object != parent() || event->type() != QEvent::MouseButtonPress) return QObject::eventFilter(object, event); - for(auto warning: warnings) + for(auto *warning: warnings) { if(warning->underMouse()) { @@ -93,14 +93,14 @@ void WarningList::showWarning(const WarningText &warningText) { if(warningText.warningType) { - for(auto warning: warnings) + for(auto *warning: warnings) { if(warning->warningType() == warningText.warningType) return; } } - WarningItem *warning = new WarningItem(warningText, ui->page); - auto layout = qobject_cast(ui->page->layout()); + auto *warning = new WarningItem(warningText, ui->page); + auto *layout = qobject_cast(ui->page->layout()); warnings << warning; connect(warning, &WarningItem::linkActivated, this, &WarningList::warningClicked); layout->insertWidget(warnings.size(), warning); @@ -110,7 +110,7 @@ void WarningList::showWarning(const WarningText &warningText) void WarningList::updateRibbon(int page, bool expanded) { short count = 0; - for(auto warning: warnings) + for(auto *warning: warnings) { if(appearsOnPage(warning, page)) { @@ -133,7 +133,7 @@ void WarningList::updateWarnings() { int page = ui->startScreen->currentIndex(); int count = 0; - for(auto warning: warnings) + for(auto *warning: warnings) { if(appearsOnPage(warning, page)) count++; @@ -152,7 +152,7 @@ void WarningList::updateWarnings() { delete ribbon; ribbon = nullptr; - for(auto warning: warnings) + for(auto *warning: warnings) { if(appearsOnPage(warning, page)) warning->show(); @@ -162,7 +162,7 @@ void WarningList::updateWarnings() else if(!ribbon) { ribbon = new WarningRibbon(count - 3, ui->page); - auto layout = qobject_cast(ui->page->layout()); + auto *layout = qobject_cast(ui->page->layout()); layout->insertWidget(warnings.size() + 1, ribbon); ribbon->show(); } diff --git a/client/widgets/WarningList.h b/client/widgets/WarningList.h index e28a2505e..a718f67e8 100644 --- a/client/widgets/WarningList.h +++ b/client/widgets/WarningList.h @@ -42,7 +42,7 @@ class WarningList: public QObject void warningClicked(const QString &link); private: - bool appearsOnPage(WarningItem *warning, int page) const; + static bool appearsOnPage(WarningItem *warning, int page); void closeWarning(WarningItem *warning); bool eventFilter(QObject *object, QEvent *event) final; void updateRibbon(int page, bool expanded); diff --git a/prepare_osx_build_environment.sh b/prepare_osx_build_environment.sh index ea9802b27..072dba2ae 100755 --- a/prepare_osx_build_environment.sh +++ b/prepare_osx_build_environment.sh @@ -100,7 +100,7 @@ if [[ "$REBUILD" = true || ! -d ${QT_PATH} ]] ; then echo -e "\n${ORANGE}##### Building Qt ${QT_VER} ${QT_PATH} #####${RESET}\n" mkdir -p ${BUILD_PATH} pushd ${BUILD_PATH} - for PACKAGE in qtbase-everywhere-src-${QT_VER} qtsvg-everywhere-src-${QT_VER} qttools-everywhere-src-${QT_VER} qt5compat-everywhere-src-${QT_VER}; do + for PACKAGE in qtbase-everywhere-src-${QT_VER} qtsvg-everywhere-src-${QT_VER} qttools-everywhere-src-${QT_VER}; do if [ ! -f ${PACKAGE}.tar.xz ]; then curl -O -L http://download.qt.io/official_releases/qt/${QT_MINOR}/${QT_VER}/submodules/${PACKAGE}.tar.xz fi diff --git a/qdigidoc4.wxs b/qdigidoc4.wxs index 3302ec28a..c68d2eda3 100644 --- a/qdigidoc4.wxs +++ b/qdigidoc4.wxs @@ -148,7 +148,6 @@ msiexec /a libdigidocpp-3.13.8.1378.msi /qn TARGETDIR=C:\target -