Skip to content

Commit 42b055a

Browse files
authored
Fix CDoc2 custom server selection (#1358)
IB-8563, IB-8662, IB-8406, IB-8554 Signed-off-by: Raul Metsma <[email protected]>
1 parent 6496acc commit 42b055a

File tree

11 files changed

+43
-93
lines changed

11 files changed

+43
-93
lines changed

client/Diagnostics.cpp

Lines changed: 21 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,15 @@
2828
#include <QtCore/QTextStream>
2929
#include <QtNetwork/QSslCertificate>
3030

31+
#include <digidocpp/Conf.h>
32+
33+
using namespace digidoc;
34+
35+
static QTextStream &operator<<(QTextStream &s, bool result)
36+
{
37+
return s << (result ? "true" : "false");
38+
}
39+
3140
void Diagnostics::generalInfo(QTextStream &s)
3241
{
3342
s << "<b>" << tr("Arguments:") << "</b> " << Application::arguments().join(' ') << "<br />"
@@ -45,18 +54,21 @@ void Diagnostics::generalInfo(QTextStream &s)
4554
<< "<br />TSA_URL: " << Application::confValue(Application::TSAUrl).toString()
4655
<< "<br />SIVA_URL: " << Application::confValue(Application::SiVaUrl).toString()
4756
<< "<br /><b>CDOC2:</b>"
48-
<< "<br />" << Settings::CDOC2_DEFAULT.KEY << ": " << (Settings::CDOC2_DEFAULT ? tr("true") : tr("false"))
49-
<< "<br />" << Settings::CDOC2_USE_KEYSERVER.KEY << ": " << (Settings::CDOC2_USE_KEYSERVER ? tr("true") : tr("false"))
57+
<< "<br />" << Settings::CDOC2_DEFAULT.KEY << ": " << Settings::CDOC2_DEFAULT
58+
<< "<br />" << Settings::CDOC2_USE_KEYSERVER.KEY << ": " << Settings::CDOC2_USE_KEYSERVER
5059
<< "<br />" << Settings::CDOC2_DEFAULT_KEYSERVER.KEY << ": " << Settings::CDOC2_DEFAULT_KEYSERVER
60+
<< "<br /><b>Settings:</b>"
61+
<< "<br />Proxy config: " << Settings::PROXY_CONFIG
62+
<< "<br />Proxy auth: " << !CONF(proxyUser).empty()
5163
<< "<br /><br /><b>" << tr("TSL signing certs") << ":</b>";
5264
for(const QSslCertificate &cert: Application::confValue(Application::TSLCerts).value<QList<QSslCertificate>>())
53-
s << "<br />" << cert.subjectInfo("CN").value(0);
54-
s << "<br /><br /><b>" << tr("TSL cache") << ":</b>";
65+
s << "<br />" << cert.subjectInfo("CN").value(0) << " (Exp: " << cert.expiryDate().toString(QStringLiteral("dd.MM.yyyy hh:mm:ss)"));
5566
QString cache = Application::confValue(Application::TSLCache).toString();
67+
s << "<br /><br /><b>" << tr("TSL cache") << "</b> (" << cache << "):";
5668
const QStringList tsllist = QDir(cache).entryList({QStringLiteral("*.xml")});
5769
for(const QString &file: tsllist)
5870
{
59-
if(uint ver = Application::readTSLVersion(cache + "/" + file); ver > 0)
71+
if(uint ver = Application::readTSLVersion(cache + '/' + file); ver > 0)
6072
s << "<br />" << file << " (" << ver << ")";
6173
}
6274
s << "<br /><br />";
@@ -77,10 +89,10 @@ void Diagnostics::generalInfo(QTextStream &s)
7789
s << "<b>" << tr("Smart Card service status: ") << "</b>" << " "
7890
<< (QPCSC::instance().serviceRunning() ? tr("Running") : tr("Not running"));
7991

80-
s << "<br /><b>" << tr("Smart Card readers") << ":</b><br />";
92+
s << "<br /><b>" << tr("Smart Card readers") << ":</b>";
8193
for( const QString &readername: QPCSC::instance().readers() )
8294
{
83-
s << readername;
95+
s << "<br />" << readername;
8496
QPCSCReader reader( readername, &QPCSC::instance() );
8597
if( !reader.isPresent() )
8698
{
@@ -109,17 +121,10 @@ void Diagnostics::generalInfo(QTextStream &s)
109121
if( !reader.isPresent() )
110122
continue;
111123

112-
reader.reconnect( QPCSCReader::UnpowerCard );
113-
QString cold = reader.atr();
114-
reader.reconnect( QPCSCReader::ResetCard );
115-
QString warm = reader.atr();
116-
117-
s << "ATR cold - " << cold << "<br />"
118-
<< "ATR warm - " << warm << "<br />";
119-
124+
s << "ATR - " << reader.atr() << "<br />";
120125
reader.beginTransaction();
121126
constexpr auto APDU = &QByteArray::fromHex;
122-
auto printAID = [&](const QLatin1String &label, const QByteArray &apdu)
127+
auto printAID = [&](QLatin1String label, const QByteArray &apdu)
123128
{
124129
QPCSCReader::Result r = reader.transfer(apdu);
125130
s << label << ": " << Qt::hex << r.SW;
@@ -135,7 +140,6 @@ void Diagnostics::generalInfo(QTextStream &s)
135140
if(printAID(QLatin1String("AID_THALES"), APDU("00A4040C 0C A000000063504B43532D3135")) &&
136141
reader.transfer(APDU("00A4080C 04 DFDD 5006")))
137142
s << "ID - " << reader.transfer(APDU("00B00000 00")).data << "<br />";
138-
reader.endTransaction();
139143
}
140144

141145
#ifdef Q_OS_WIN

client/MainWindow.cpp

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -681,11 +681,6 @@ void MainWindow::showSettings(int page)
681681
return;
682682
}
683683
SettingsDialog dlg(page, this);
684-
685-
connect(&dlg, &SettingsDialog::langChanged, this, [this](const QString& lang ) {
686-
qApp->loadTranslation( lang );
687-
ui->retranslateUi(this);
688-
});
689684
connect(&dlg, &SettingsDialog::togglePrinting, ui->signContainerPage, &ContainerPage::togglePrinting);
690685
dlg.exec();
691686
}

client/QPCSC.cpp

Lines changed: 5 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@
2727
#include <array>
2828
#include <cstring>
2929

30-
Q_LOGGING_CATEGORY(APDU,"QPCSC.APDU")
31-
Q_LOGGING_CATEGORY(SCard,"QPCSC.SCard")
30+
static Q_LOGGING_CATEGORY(APDU,"QPCSC.APDU")
31+
static Q_LOGGING_CATEGORY(SCard,"QPCSC.SCard")
3232

3333
static quint16 toUInt16(const QByteArray &data, int size)
3434
{
@@ -218,21 +218,17 @@ bool QPCSCReader::beginTransaction()
218218
}
219219

220220
bool QPCSCReader::connect(Connect connect, Mode mode)
221-
{
222-
return connectEx(connect, mode) == SCARD_S_SUCCESS;
223-
}
224-
225-
quint32 QPCSCReader::connectEx(Connect connect, Mode mode)
226221
{
227222
LONG err = SC(Connect, d->d->context, d->state.szReader, connect, mode, &d->card, &d->io.dwProtocol);
228223
updateState();
229-
return quint32(err);
224+
return err == SCARD_S_SUCCESS;
230225
}
231226

232227
void QPCSCReader::disconnect( Reset reset )
233228
{
234229
if(d->isTransacted)
235-
endTransaction();
230+
SC(EndTransaction, d->card, reset);
231+
d->isTransacted = false;
236232
if( d->card )
237233
SC(Disconnect, d->card, reset);
238234
d->io.dwProtocol = SCARD_PROTOCOL_UNDEFINED;
@@ -241,14 +237,6 @@ void QPCSCReader::disconnect( Reset reset )
241237
updateState();
242238
}
243239

244-
bool QPCSCReader::endTransaction( Reset reset )
245-
{
246-
bool result = SC(EndTransaction, d->card, reset) == SCARD_S_SUCCESS;
247-
if(result)
248-
d->isTransacted = false;
249-
return result;
250-
}
251-
252240
bool QPCSCReader::isPinPad() const
253241
{
254242
if(d->reader.contains("HID Global OMNIKEY 3x21 Smart Card Reader") ||
@@ -290,15 +278,6 @@ QHash<QPCSCReader::Properties, int> QPCSCReader::properties() const
290278
return properties;
291279
}
292280

293-
bool QPCSCReader::reconnect( Reset reset, Mode mode )
294-
{
295-
if( !d->card )
296-
return false;
297-
LONG err = SC(Reconnect, d->card, DWORD(SCARD_SHARE_SHARED), mode, reset, &d->io.dwProtocol);
298-
updateState();
299-
return err == SCARD_S_SUCCESS;
300-
}
301-
302281
QStringList QPCSCReader::state() const
303282
{
304283
return stateToString(d->state.dwEventState);

client/QPCSC.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -108,11 +108,8 @@ class QPCSCReader final: public QObject
108108
bool updateState( quint32 msec = 0 );
109109

110110
bool connect( Connect connect = Shared, Mode mode = Mode(T0|T1) );
111-
quint32 connectEx( Connect connect = Shared, Mode mode = Mode(T0|T1) );
112111
void disconnect( Reset reset = LeaveCard );
113-
bool reconnect( Reset reset = LeaveCard, Mode mode = Mode(T0|T1) );
114112
bool beginTransaction();
115-
bool endTransaction( Reset reset = LeaveCard );
116113
Result transfer( const QByteArray &apdu ) const;
117114
Result transferCTL(const QByteArray &apdu, bool verify, quint16 lang = 0,
118115
quint8 minlen = 4, quint8 newPINOffset = 0, bool requestCurrentPIN = true) const;

client/Settings.cpp

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,18 @@
2626
template<class T, class D = T>
2727
using Option = Settings::Option<T, D>;
2828

29-
const Option<bool> Settings::CDOC2_DEFAULT { QStringLiteral("CDOC2-DEFAULT"), false };
29+
const Option<bool, bool (*)()> Settings::CDOC2_DEFAULT { QStringLiteral("CDOC2-DEFAULT"), [] {
30+
return Application::confValue(QLatin1String("CDOC2-DEFAULT")).toBool(false);
31+
}};
3032
const Option<bool> Settings::CDOC2_NOTIFICATION { QStringLiteral("CDOC2-NOTIFICATION"), false };
31-
const Option<bool> Settings::CDOC2_USE_KEYSERVER { QStringLiteral("CDOC2-USE-KEYSERVER"), true };
33+
const Option<bool, bool (*)()> Settings::CDOC2_USE_KEYSERVER { QStringLiteral("CDOC2-USE-KEYSERVER"), [] {
34+
return Application::confValue(QLatin1String("CDOC2-USE-KEYSERVER")).toBool(true);
35+
}};
3236
const Option<QString, QString (*)()> Settings::CDOC2_DEFAULT_KEYSERVER { QStringLiteral("CDOC2-DEFAULT-KEYSERVER"), [] {
3337
return Application::confValue(QLatin1String("CDOC2-DEFAULT-KEYSERVER"))
3438
.toString(QStringLiteral("00000000-0000-0000-0000-000000000000"));
3539
}};
36-
const Option<QString> Settings::CDOC2_UUID { QStringLiteral("CDOC2-UUID"), QStringLiteral("00000000-0000-0000-0000-000000000002") };
40+
const Option<QString> Settings::CDOC2_UUID { QStringLiteral("CDOC2-UUID") };
3741
const Option<QString> Settings::CDOC2_GET { QStringLiteral("CDOC2-GET"), QStringLiteral(CDOC2_GET_URL) };
3842
const Option<QByteArray> Settings::CDOC2_GET_CERT { QStringLiteral("CDOC2-GET-CERT") };
3943
const Option<QString> Settings::CDOC2_POST { QStringLiteral("CDOC2-POST"), QStringLiteral(CDOC2_POST_URL) };

client/Settings.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,9 +93,9 @@ struct Settings
9393
std::function<void (const T &value)> f {};
9494
};
9595

96-
static const Option<bool> CDOC2_DEFAULT;
96+
static const Option<bool, bool (*)()> CDOC2_DEFAULT;
9797
static const Option<bool> CDOC2_NOTIFICATION;
98-
static const Option<bool> CDOC2_USE_KEYSERVER;
98+
static const Option<bool, bool (*)()> CDOC2_USE_KEYSERVER;
9999
static const Option<QString, QString (*)()> CDOC2_DEFAULT_KEYSERVER;
100100
static const Option<QString> CDOC2_UUID;
101101
static const Option<QString> CDOC2_GET;

client/dialogs/SettingsDialog.cpp

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,8 @@ SettingsDialog::SettingsDialog(int page, QWidget *parent)
240240
};
241241
for(QJsonObject::const_iterator i = list.constBegin(); i != list.constEnd(); ++i)
242242
ui->cmbCdoc2Name->addItem(i.value().toObject().value(QLatin1String("NAME")).toString(), i.key());
243+
if(QUuid(QString(Settings::CDOC2_UUID)).isNull())
244+
Settings::CDOC2_UUID = QUuid::createUuid().toString(QUuid::WithoutBraces);
243245
ui->cmbCdoc2Name->addItem(tr("Use a manually specified key transfer server for encryption"), Settings::CDOC2_UUID);
244246
QString cdoc2Service = Settings::CDOC2_DEFAULT_KEYSERVER;
245247
ui->cmbCdoc2Name->setCurrentIndex(ui->cmbCdoc2Name->findData(cdoc2Service));
@@ -249,7 +251,10 @@ SettingsDialog::SettingsDialog(int page, QWidget *parent)
249251
setCDoc2Values(key);
250252
});
251253
setCDoc2Values(cdoc2Service);
252-
connect(ui->txtCdoc2UUID, &QLineEdit::textEdited, this, Settings::CDOC2_UUID);
254+
connect(ui->txtCdoc2UUID, &QLineEdit::textEdited, this, [](const QString &uuid) {
255+
Settings::CDOC2_UUID = uuid;
256+
Settings::CDOC2_DEFAULT_KEYSERVER = uuid;
257+
});
253258
connect(ui->txtCdoc2Fetch, &QLineEdit::textEdited, this, [this](const QString &url) {
254259
Settings::CDOC2_GET = url;
255260
if(url.isEmpty())
@@ -424,7 +429,6 @@ SettingsDialog::SettingsDialog(int page, QWidget *parent)
424429
ui->pageGroup->setId(ui->btnMenuInfo, LicenseSettings);
425430
connect(ui->pageGroup, &QButtonGroup::idClicked, this, &SettingsDialog::showPage);
426431

427-
updateVersion();
428432
updateDiagnostics();
429433
showPage(page);
430434
}
@@ -467,11 +471,8 @@ void SettingsDialog::checkConnection()
467471

468472
void SettingsDialog::retranslate(const QString& lang)
469473
{
470-
emit langChanged(lang);
471-
472474
qApp->loadTranslation( lang );
473475
ui->retranslateUi(this);
474-
updateVersion();
475476
updateDiagnostics();
476477
ui->cmbCdoc2Name->setItemText(ui->cmbCdoc2Name->count() - 1,
477478
tr("Use a manually specified key transfer server for encryption"));
@@ -523,12 +524,6 @@ void SettingsDialog::selectLanguage()
523524
button->setChecked(button->property("lang").toString() == Settings::LANGUAGE);
524525
}
525526

526-
void SettingsDialog::updateVersion()
527-
{
528-
ui->txtNavVersion->setText(tr("DigiDoc4 version %1, released %2")
529-
.arg(QApplication::applicationVersion(), QStringLiteral(BUILD_DATE)));
530-
}
531-
532527
void SettingsDialog::saveProxy()
533528
{
534529
Settings::PROXY_CONFIG = ui->proxyGroup->checkedId();
@@ -568,6 +563,8 @@ void SettingsDialog::loadProxy( const digidoc::Conf *conf )
568563

569564
void SettingsDialog::updateDiagnostics()
570565
{
566+
ui->txtNavVersion->setText(tr("DigiDoc4 version %1, released %2")
567+
.arg(QApplication::applicationVersion(), QStringLiteral(BUILD_DATE)));
571568
ui->txtDiagnostics->setEnabled(false);
572569
ui->txtDiagnostics->clear();
573570
ui->btnNavSaveReport->setDisabled(true);

client/dialogs/SettingsDialog.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,6 @@ class SettingsDialog final: public QDialog
5959
static void loadProxy( const digidoc::Conf *conf );
6060

6161
signals:
62-
void langChanged(const QString& lang);
6362
void togglePrinting(bool enable);
6463

6564
private:
@@ -74,7 +73,6 @@ class SettingsDialog final: public QDialog
7473
void updateCDoc2Cert(const QSslCertificate &c);
7574
void updateSiVaCert(const QSslCertificate &c);
7675
void updateTSACert(const QSslCertificate &c);
77-
void updateVersion();
7876
void updateDiagnostics();
7977
void useDefaultSettings();
8078

client/translations/en.ts

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -683,14 +683,6 @@
683683
<source>TSL cache</source>
684684
<translation>TSL cache</translation>
685685
</message>
686-
<message>
687-
<source>true</source>
688-
<translation type="unfinished"></translation>
689-
</message>
690-
<message>
691-
<source>false</source>
692-
<translation type="unfinished"></translation>
693-
</message>
694686
</context>
695687
<context>
696688
<name>DigiDoc</name>

client/translations/et.ts

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -683,14 +683,6 @@
683683
<source>TSL cache</source>
684684
<translation>TSL puhver</translation>
685685
</message>
686-
<message>
687-
<source>true</source>
688-
<translation type="unfinished"></translation>
689-
</message>
690-
<message>
691-
<source>false</source>
692-
<translation type="unfinished"></translation>
693-
</message>
694686
</context>
695687
<context>
696688
<name>DigiDoc</name>

0 commit comments

Comments
 (0)