Skip to content

Commit

Permalink
Use uiLanguages preferences
Browse files Browse the repository at this point in the history
IB-7564

Signed-off-by: Raul Metsma <[email protected]>
  • Loading branch information
metsma committed Jun 16, 2023
1 parent 0422b42 commit ebba912
Show file tree
Hide file tree
Showing 13 changed files with 129 additions and 205 deletions.
33 changes: 10 additions & 23 deletions client/Application.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -373,12 +373,11 @@ Application::Application( int &argc, char **argv )
return new QAccessibleWidget(qobject_cast<QWidget *>(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();
Expand Down Expand Up @@ -875,9 +874,15 @@ void Application::showClient(const QStringList &params, bool crypto, bool sign,
else if(!newWindow)
{
// else select first window with no open files
auto *main = qobject_cast<MainWindow*>(uniqueRoot());
if(main && main->windowFilePath().isEmpty())
w = main;
for(auto *widget : topLevelWidgets())
{
if(auto *main = qobject_cast<MainWindow*>(widget);
main && main->windowFilePath().isEmpty())
{
w = main;
break;
}
}
}
if( !w )
{
Expand Down Expand Up @@ -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<MainWindow*>(w))
{
if(root)
return nullptr;
root = r;
}
}

return root;
}

void Application::waitForTSL( const QString &file )
{
if(!CONTAINER_EXT.contains(QFileInfo(file).suffix(), Qt::CaseInsensitive))
Expand Down
1 change: 0 additions & 1 deletion client/Application.h
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
87 changes: 19 additions & 68 deletions client/QSmartCard.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,21 +18,20 @@
*/

#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 <common/Common.h>

#include <QtCore/QDateTime>
#include <QtCore/QDebug>
#include <QtCore/QLoggingCategory>
#include <QtCore/QScopedPointer>
#include <QtCore/QTimer>
#include <QtNetwork/QSslKey>
#include <QtWidgets/QApplication>
#include <QTextCodec>

Q_LOGGING_CATEGORY(CLog, "qdigidoc4.QSmartCard")
Expand Down Expand Up @@ -90,7 +89,7 @@ QString QSmartCardData::typeString(QSmartCardData::PinType type)
case Pin2Type: return QStringLiteral("PIN2");
case PukType: return QStringLiteral("PUK");
}
return QString();
return {};
}


Expand All @@ -104,46 +103,24 @@ 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);
}



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
{
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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));
Expand Down Expand Up @@ -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>(size_t(dgst.size()), 0x30));
cmd.insert(5, dgst.left(0x30));
Expand All @@ -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;
}
Expand Down
1 change: 0 additions & 1 deletion client/QSmartCard.h
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,6 @@ class QSmartCardData
{
VER_INVALID = -1,
VER_3_5,
VER_USABLEUPDATER,
VER_IDEMIA,
};

Expand Down
22 changes: 12 additions & 10 deletions client/QSmartCard_p.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -57,41 +57,43 @@ 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;
};

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<QPCSCReader> connect(const QString &reader);
static QSharedPointer<QPCSCReader> connect(const QString &reader);
QSmartCard::ErrorType handlePinResult(QPCSCReader *reader, const QPCSCReader::Result &response, bool forceUpdate);

QSharedPointer<QPCSCReader> reader;
Expand Down
7 changes: 6 additions & 1 deletion client/Settings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,12 @@ const Option<bool, bool (*)()> Settings::TSA_URL_CUSTOM
{ QStringLiteral("TSA-URL-CUSTOM"), [] { return Settings::TSA_URL.isSet(); } };

const Option<QString> Settings::DEFAULT_DIR { QStringLiteral("DefaultDir") };
const Option<QString> Settings::LANGUAGE { QStringLiteral("Language") };
const Option<QString, QString (*)()> 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<QString> Settings::LAST_PATH { QStringLiteral("lastPath") };
const Option<bool> Settings::LIBDIGIDOCPP_DEBUG { QStringLiteral("LibdigidocppDebug"), false };
const Option<bool> Settings::SETTINGS_MIGRATED { QStringLiteral("SettingsMigrated"), false };
Expand Down
2 changes: 1 addition & 1 deletion client/Settings.h
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ struct Settings
static const Option<bool, bool (*)()> TSA_URL_CUSTOM;

static const Option<QString> DEFAULT_DIR;
static const Option<QString> LANGUAGE;
static const Option<QString, QString (*)()> LANGUAGE;
static const Option<QString> LAST_PATH;
static const Option<bool> LIBDIGIDOCPP_DEBUG;
static const Option<bool> SETTINGS_MIGRATED;
Expand Down
16 changes: 6 additions & 10 deletions client/dialogs/FirstRun.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,11 +20,9 @@
#include "FirstRun.h"
#include "ui_FirstRun.h"

#include "MainWindow.h"
#include "Settings.h"
#include "Styles.h"

#include <common/Common.h>

#include <QKeyEvent>
#include <QPixmap>

Expand All @@ -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);
Expand All @@ -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);
Expand All @@ -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"));

Expand Down Expand Up @@ -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)));
};
Expand Down
Loading

0 comments on commit ebba912

Please sign in to comment.