diff --git a/client/Application.cpp b/client/Application.cpp index 307dd7cf..95a5b735 100644 --- a/client/Application.cpp +++ b/client/Application.cpp @@ -373,12 +373,11 @@ Application::Application( int &argc, char **argv ) return new QAccessibleWidget(qobject_cast(object), QAccessible::StaticText); return {}; }); - Settings::SETTINGS_MIGRATED.clear(); installTranslator( &d->appTranslator ); installTranslator( &d->commonTranslator ); installTranslator( &d->qtTranslator ); - loadTranslation( Common::language() ); + loadTranslation(Settings::LANGUAGE); // Clear obsolete registriy settings Settings::SETTINGS_MIGRATED.clear(); @@ -875,9 +874,15 @@ void Application::showClient(const QStringList ¶ms, bool crypto, bool sign, else if(!newWindow) { // else select first window with no open files - auto *main = qobject_cast(uniqueRoot()); - if(main && main->windowFilePath().isEmpty()) - w = main; + for(auto *widget : topLevelWidgets()) + { + if(auto *main = qobject_cast(widget); + main && main->windowFilePath().isEmpty()) + { + w = main; + break; + } + } } if( !w ) { @@ -933,24 +938,6 @@ void Application::showWarning( const QString &msg, const digidoc::Exception &e ) QSigner* Application::signer() const { return d->signer; } -QWidget* Application::uniqueRoot() -{ - MainWindow* root = nullptr; - - // Return main window if only one main window is opened - for(auto *w : topLevelWidgets()) - { - if(auto *r = qobject_cast(w)) - { - if(root) - return nullptr; - root = r; - } - } - - return root; -} - void Application::waitForTSL( const QString &file ) { if(!CONTAINER_EXT.contains(QFileInfo(file).suffix(), Qt::CaseInsensitive)) diff --git a/client/Application.h b/client/Application.h index 1dc02e48..373805c1 100644 --- a/client/Application.h +++ b/client/Application.h @@ -90,7 +90,6 @@ private Q_SLOTS: static void parseArgs(const QString &msg = {}); static void parseArgs(QStringList args); static void showWarning(const QString &msg, const digidoc::Exception &e); - static QWidget* uniqueRoot(); #if defined(Q_OS_MAC) static void initMacEvents(); static void deinitMacEvents(); diff --git a/client/QSmartCard.cpp b/client/QSmartCard.cpp index 9a6eaa94..d4264b14 100644 --- a/client/QSmartCard.cpp +++ b/client/QSmartCard.cpp @@ -18,13 +18,13 @@ */ #include "QSmartCard_p.h" + #include "QCardLock.h" #include "IKValidator.h" +#include "Settings.h" +#include "Utils.h" #include "dialogs/PinPopup.h" #include "dialogs/PinUnblock.h" -#include "Utils.h" - -#include #include #include @@ -32,7 +32,6 @@ #include #include #include -#include #include Q_LOGGING_CATEGORY(CLog, "qdigidoc4.QSmartCard") @@ -90,7 +89,7 @@ QString QSmartCardData::typeString(QSmartCardData::PinType type) case Pin2Type: return QStringLiteral("PIN2"); case PukType: return QStringLiteral("PUK"); } - return QString(); + return {}; } @@ -104,14 +103,14 @@ const QByteArray Card::REPLACE = APDU("002C0000 00"); const QByteArray Card::VERIFY = APDU("00200000 00"); QPCSCReader::Result Card::transfer(QPCSCReader *reader, bool verify, const QByteArray &apdu, - QSmartCardData::PinType type, quint8 newPINOffset, bool requestCurrentPIN) const + QSmartCardData::PinType type, quint8 newPINOffset, bool requestCurrentPIN) { if(!reader->isPinPad()) return reader->transfer(apdu); quint16 language = 0x0000; - if(Common::language() == QLatin1String("en")) language = 0x0409; - else if(Common::language() == QLatin1String("et")) language = 0x0425; - else if(Common::language() == QLatin1String("ru")) language = 0x0419; + if(Settings::LANGUAGE == QLatin1String("en")) language = 0x0409; + else if(Settings::LANGUAGE == QLatin1String("et")) language = 0x0425; + else if(Settings::LANGUAGE == QLatin1String("ru")) language = 0x0419; return waitFor(&QPCSCReader::transferCTL, reader, apdu, verify, language, QSmartCardData::minPinLen(type), newPINOffset, requestCurrentPIN); } @@ -119,31 +118,9 @@ QPCSCReader::Result Card::transfer(QPCSCReader *reader, bool verify, const QByte const QByteArray EstEIDCard::AID35 = APDU("00A40400 0F D23300000045737445494420763335"); -const QByteArray EstEIDCard::UPDATER_AID = APDU("00A40400 0A D2330000005550443101"); const QByteArray EstEIDCard::ESTEIDDF = APDU("00A4010C 02 EEEE"); const QByteArray EstEIDCard::PERSONALDATA = APDU("00A4020C 02 5044"); -QTextCodec* EstEIDCard::codec = QTextCodec::codecForName("Windows-1252"); - -QString EstEIDCard::cardNR(QPCSCReader *reader) -{ - if(!reader->transfer(MASTER_FILE)) - { // Master file selection failed, test if it is updater applet - if(!reader->transfer(UPDATER_AID)) - return QString(); // Updater applet not found - if(!reader->transfer(MASTER_FILE)) - { //Found updater applet but cannot select master file, select back 3.5 - reader->transfer(AID35); - return QString(); - } - } - if(!reader->transfer(ESTEIDDF) || - !reader->transfer(PERSONALDATA)) - return QString(); - QByteArray cardid = READRECORD; - cardid[2] = 8; - QPCSCReader::Result result = reader->transfer(cardid); - return codec->toUnicode(result.data); -} +const QTextCodec* EstEIDCard::codec = QTextCodec::codecForName("Windows-1252"); QPCSCReader::Result EstEIDCard::change(QPCSCReader *reader, QSmartCardData::PinType type, const QString &pin_, const QString &newpin_) const { @@ -171,21 +148,9 @@ bool EstEIDCard::loadPerso(QPCSCReader *reader, QSmartCardDataPrivate *d) const static const QByteArray SIGNCERT = APDU("00A40200 02 DDCE"); d->version = isSupported(reader->atr()); - if(reader->transfer(UPDATER_AID).resultOk()) - { - //Prefer EstEID applet when if it is usable - if(!reader->transfer(AID35) || - !reader->transfer(MASTER_FILE)) - { - reader->transfer(UPDATER_AID); - d->version = QSmartCardData::VER_USABLEUPDATER; - } - } - else - reader->transfer(AID35); - if(reader->transfer(MASTER_FILE).resultOk() && - reader->transfer(ESTEIDDF).resultOk() && - d->data.isEmpty() && reader->transfer(PERSONALDATA).resultOk()) + if(reader->transfer(MASTER_FILE) && + reader->transfer(ESTEIDDF) && + d->data.isEmpty() && reader->transfer(PERSONALDATA)) { QByteArray cmd = READRECORD; for(char data = QSmartCardData::SurName; data != QSmartCardData::Comment4; ++data) @@ -271,7 +236,7 @@ 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(); + return {}; QByteArray cmd = MUTUAL_AUTH; cmd[4] = char(dgst.size()); cmd.insert(5, dgst); @@ -348,17 +313,6 @@ const QByteArray IDEMIACard::AID = APDU("00A40400 10 A000000077010800070000FE000 const QByteArray IDEMIACard::AID_OT = APDU("00A4040C 0D E828BD080FF2504F5420415750"); const QByteArray IDEMIACard::AID_QSCD = APDU("00A4040C 10 51534344204170706C69636174696F6E"); -QString IDEMIACard::cardNR(QPCSCReader *reader) -{ - QPCSCReader::Result result; - if(!reader->transfer(AID) || - !reader->transfer(MASTER_FILE) || - !reader->transfer(APDU("00A4010C02D003")) || - !(result = reader->transfer(READBINARY))) - return QString(); - return QString::fromUtf8(result.data.mid(2)); -} - QPCSCReader::Result IDEMIACard::change(QPCSCReader *reader, QSmartCardData::PinType type, const QString &pin_, const QString &newpin_) const { QByteArray cmd = CHANGE; @@ -393,7 +347,7 @@ bool IDEMIACard::loadPerso(QPCSCReader *reader, QSmartCardDataPrivate *d) const if(!reader->transfer(AID) || !reader->transfer(MASTER_FILE)) return false; - if(d->data.isEmpty() && reader->transfer(APDU("00A4010C025000")).resultOk()) + if(d->data.isEmpty() && reader->transfer(APDU("00A4010C025000"))) { QByteArray cmd = APDU("00A4010C025001"); for(char data = 1; data <= 15; ++data) @@ -480,7 +434,7 @@ bool IDEMIACard::loadPerso(QPCSCReader *reader, QSmartCardDataPrivate *d) const return updateCounters(reader, d); } -QByteArray IDEMIACard::pinTemplate(const QString &pin) const +QByteArray IDEMIACard::pinTemplate(const QString &pin) { QByteArray result = pin.toUtf8(); result += QByteArray(12 - result.size(), char(0xFF)); @@ -511,7 +465,7 @@ QByteArray IDEMIACard::sign(QPCSCReader *reader, const QByteArray &dgst) const { if(!reader->transfer(AID_OT) || !reader->transfer(APDU("002241A4 09 8004FF200800840181"))) - return QByteArray(); + return {}; QByteArray cmd = MUTUAL_AUTH; cmd[4] = char(std::min(size_t(dgst.size()), 0x30)); cmd.insert(5, dgst.left(0x30)); @@ -523,15 +477,12 @@ bool IDEMIACard::updateCounters(QPCSCReader *reader, QSmartCardDataPrivate *d) c d->usage[QSmartCardData::Pin1Type] = 0; d->usage[QSmartCardData::Pin2Type] = 0; reader->transfer(AID); - QPCSCReader::Result data = reader->transfer(APDU("00CB3FFF 0A 4D087006BF810102A08000")); - if(data.resultOk()) + if(auto data = reader->transfer(APDU("00CB3FFF 0A 4D087006BF810102A08000"))) d->retry[QSmartCardData::Pin1Type] = quint8(data.data[13]); - data = reader->transfer(APDU("00CB3FFF 0A 4D087006BF810202A08000")); - if(data.resultOk()) + if(auto data = reader->transfer(APDU("00CB3FFF 0A 4D087006BF810202A08000"))) d->retry[QSmartCardData::PukType] = quint8(data.data[13]); reader->transfer(AID_QSCD); - data = reader->transfer(APDU("00CB3FFF 0A 4D087006BF810502A08000")); - if(data.resultOk()) + if(auto data = reader->transfer(APDU("00CB3FFF 0A 4D087006BF810502A08000"))) d->retry[QSmartCardData::Pin2Type] = quint8(data.data[13]); return true; } diff --git a/client/QSmartCard.h b/client/QSmartCard.h index 6402fec3..065f65f3 100644 --- a/client/QSmartCard.h +++ b/client/QSmartCard.h @@ -60,7 +60,6 @@ class QSmartCardData { VER_INVALID = -1, VER_3_5, - VER_USABLEUPDATER, VER_IDEMIA, }; diff --git a/client/QSmartCard_p.h b/client/QSmartCard_p.h index 43f5e702..9f242c0e 100644 --- a/client/QSmartCard_p.h +++ b/client/QSmartCard_p.h @@ -40,8 +40,8 @@ class Card virtual bool loadPerso(QPCSCReader *reader, QSmartCardDataPrivate *d) const = 0; virtual QPCSCReader::Result replace(QPCSCReader *reader, QSmartCardData::PinType type, const QString &puk, const QString &pin) const = 0; virtual QByteArray sign(QPCSCReader *reader, const QByteArray &dgst) const = 0; - QPCSCReader::Result transfer(QPCSCReader *reader, bool verify, const QByteArray &apdu, - QSmartCardData::PinType type, quint8 newPINOffset, bool requestCurrentPIN) const; + 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; @@ -57,17 +57,18 @@ class Card class EstEIDCard: public Card { public: - static QString cardNR(QPCSCReader *reader); QPCSCReader::Result change(QPCSCReader *reader, QSmartCardData::PinType type, const QString &pin, const QString &newpin) const final; - static QSmartCardData::CardVersion isSupported(const QByteArray &atr); 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 QTextCodec *codec; - static const QByteArray AID35, UPDATER_AID; + static QString cardNR(QPCSCReader *reader); + static QSmartCardData::CardVersion isSupported(const QByteArray &atr); + + static const QTextCodec *codec; + static const QByteArray AID35; static const QByteArray ESTEIDDF; static const QByteArray PERSONALDATA; }; @@ -75,23 +76,24 @@ class EstEIDCard: public Card class IDEMIACard: public Card { public: - static QString cardNR(QPCSCReader *reader); QPCSCReader::Result change(QPCSCReader *reader, QSmartCardData::PinType type, const QString &pin, const QString &newpin) const final; - static QSmartCardData::CardVersion isSupported(const QByteArray &atr); bool loadPerso(QPCSCReader *reader, QSmartCardDataPrivate *d) const final; - QByteArray pinTemplate(const QString &pin) const; 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 QSmartCardData::CardVersion isSupported(const QByteArray &atr); + static QByteArray pinTemplate(const QString &pin); + static const QByteArray AID, AID_OT, AID_QSCD; }; class QSmartCard::Private { public: - QSharedPointer connect(const QString &reader); + static QSharedPointer connect(const QString &reader); QSmartCard::ErrorType handlePinResult(QPCSCReader *reader, const QPCSCReader::Result &response, bool forceUpdate); QSharedPointer reader; diff --git a/client/Settings.cpp b/client/Settings.cpp index 2c823aed..87802efe 100644 --- a/client/Settings.cpp +++ b/client/Settings.cpp @@ -70,7 +70,12 @@ const Option Settings::TSA_URL_CUSTOM { QStringLiteral("TSA-URL-CUSTOM"), [] { return Settings::TSA_URL.isSet(); } }; const Option Settings::DEFAULT_DIR { QStringLiteral("DefaultDir") }; -const Option Settings::LANGUAGE { QStringLiteral("Language") }; +const Option Settings::LANGUAGE { QStringLiteral("Language"), [] { + auto languages = QLocale().uiLanguages(); + if(languages.first().contains(QLatin1String("et"), Qt::CaseInsensitive)) return QStringLiteral("et"); + if(languages.first().contains(QLatin1String("ru"), Qt::CaseInsensitive)) return QStringLiteral("ru"); + return QStringLiteral("en"); +}}; const Option Settings::LAST_PATH { QStringLiteral("lastPath") }; const Option Settings::LIBDIGIDOCPP_DEBUG { QStringLiteral("LibdigidocppDebug"), false }; const Option Settings::SETTINGS_MIGRATED { QStringLiteral("SettingsMigrated"), false }; diff --git a/client/Settings.h b/client/Settings.h index 0b4a20e7..81b90285 100644 --- a/client/Settings.h +++ b/client/Settings.h @@ -103,7 +103,7 @@ struct Settings static const Option TSA_URL_CUSTOM; static const Option DEFAULT_DIR; - static const Option LANGUAGE; + static const Option LANGUAGE; static const Option LAST_PATH; static const Option LIBDIGIDOCPP_DEBUG; static const Option SETTINGS_MIGRATED; diff --git a/client/dialogs/FirstRun.cpp b/client/dialogs/FirstRun.cpp index 44181447..09ac5072 100644 --- a/client/dialogs/FirstRun.cpp +++ b/client/dialogs/FirstRun.cpp @@ -20,11 +20,9 @@ #include "FirstRun.h" #include "ui_FirstRun.h" -#include "MainWindow.h" +#include "Settings.h" #include "Styles.h" -#include - #include #include @@ -43,7 +41,6 @@ FirstRun::FirstRun(QWidget *parent) move(parent->geometry().center() - geometry().center()); auto buttonFont = Styles::font(Styles::Condensed, 14); - auto labelFont = Styles::font(Styles::Regular, 18); auto dmLabelFont = Styles::font(Styles::Regular, 18); auto regular12 = Styles::font(Styles::Regular, 12); auto regular14 = Styles::font(Styles::Regular, 14); @@ -58,11 +55,11 @@ FirstRun::FirstRun(QWidget *parent) ui->lang->setFont(regular14); ui->lang->addItem(QStringLiteral("Eesti keel")); ui->lang->addItem(QStringLiteral("English")); - ui->lang->addItem("Русский язык"); //QStringLiteral breaks windows text + ui->lang->addItem(QString::fromUtf8("Русский язык")); //QStringLiteral breaks windows text - if(Common::language() == QStringLiteral("en")) + if(Settings::LANGUAGE == QLatin1String("en")) ui->lang->setCurrentIndex(1); - else if(Common::language() == QStringLiteral("ru")) + else if(Settings::LANGUAGE == QLatin1String("ru")) ui->lang->setCurrentIndex(2); else ui->lang->setCurrentIndex(0); @@ -79,8 +76,7 @@ FirstRun::FirstRun(QWidget *parent) }); ui->continueBtn->setFont(buttonFont); - QSvgWidget* coatOfArs = new QSvgWidget(QStringLiteral(":/images/Logo_Suur.svg"), ui->coatOfArms); - coatOfArs->show(); + ui->coatOfArms->load(QStringLiteral(":/images/Logo_Suur.svg")); ui->leaves->load(QStringLiteral(":/images/vapilehed.svg")); ui->structureFunds->load(QStringLiteral(":/images/Struktuurifondid.svg")); @@ -190,7 +186,7 @@ void FirstRun::keyPressEvent(QKeyEvent *event) void FirstRun::loadImages() { - QString lang = Common::language(); + QString lang = Settings::LANGUAGE; auto loadPixmap = [lang](const QString &base, QLabel *label) { label->setPixmap(QPixmap(QStringLiteral(":/images/%1_%2.png").arg(base, lang))); }; diff --git a/client/dialogs/FirstRun.ui b/client/dialogs/FirstRun.ui index 3c968074..f9aafa2d 100644 --- a/client/dialogs/FirstRun.ui +++ b/client/dialogs/FirstRun.ui @@ -208,13 +208,13 @@ QPushButton:disabled { border: none; - + 440 40 144 - 133 + 144 diff --git a/client/dialogs/SettingsDialog.cpp b/client/dialogs/SettingsDialog.cpp index eb756c18..da8149b4 100644 --- a/client/dialogs/SettingsDialog.cpp +++ b/client/dialogs/SettingsDialog.cpp @@ -529,7 +529,7 @@ QSslCertificate SettingsDialog::selectCert(const QString &label, const QString & void SettingsDialog::selectLanguage() { for(QAbstractButton *button: ui->langGroup->buttons()) - button->setChecked(button->property("lang").toString() == Common::language()); + button->setChecked(button->property("lang").toString() == Settings::LANGUAGE); } void SettingsDialog::setProxyEnabled() diff --git a/client/images/Logo_Suur.svg b/client/images/Logo_Suur.svg index 8e52bf83..04e30e84 100644 --- a/client/images/Logo_Suur.svg +++ b/client/images/Logo_Suur.svg @@ -1,89 +1,74 @@ - - - Logo - Suur - Created with Sketch. - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/client/widgets/VerifyCert.cpp b/client/widgets/VerifyCert.cpp index e86b22ea..5043e336 100644 --- a/client/widgets/VerifyCert.cpp +++ b/client/widgets/VerifyCert.cpp @@ -169,7 +169,7 @@ void VerifyCert::update() ui->validUntil->setText(tr("The PUK code is located in your envelope")); ui->validUntil->setHidden(isBlockedPuk); ui->changePIN->setText(tr("CHANGE PUK")); - ui->changePIN->setHidden(cardData.version() == QSmartCardData::VER_USABLEUPDATER || isBlockedPuk); + ui->changePIN->setHidden(cardData.version() == isBlockedPuk); ui->forgotPinLink->hide(); ui->details->hide(); ui->checkCert->hide(); diff --git a/common b/common index 33d878cb..b36e325b 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit 33d878cbcf538a2cdf991527c715adaf41cba19f +Subproject commit b36e325b39a6a792b97e3d857220af8347e4dbb6