Skip to content

Commit 83f9950

Browse files
committed
Thales cards do not return Card NR anymore
IB-8696 Signed-off-by: Raul Metsma <[email protected]>
1 parent 42b055a commit 83f9950

File tree

10 files changed

+64
-86
lines changed

10 files changed

+64
-86
lines changed

client/MainWindow.cpp

Lines changed: 9 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -86,18 +86,16 @@ MainWindow::MainWindow( QWidget *parent )
8686

8787
// Refresh ID card info in card widget
8888
connect(qApp->signer(), &QSigner::cacheChanged, this, &MainWindow::updateSelector);
89-
connect(&QPCSC::instance(), &QPCSC::statusChanged, this, &MainWindow::updateSelector);
9089
connect(qApp->signer(), &QSigner::signDataChanged, this, [this](const TokenData &token) {
91-
updateSelectorData(token);
90+
updateSelector();
9291
updateMyEID(token);
9392
ui->signContainerPage->cardChanged(token.cert(), token.data(QStringLiteral("blocked")).toBool());
9493
});
9594
connect(qApp->signer(), &QSigner::authDataChanged, this, [this](const TokenData &token) {
96-
updateSelectorData(token);
95+
updateSelector();
9796
updateMyEID(token);
9897
ui->cryptoContainerPage->cardChanged(token.cert(), token.data(QStringLiteral("blocked")).toBool());
9998
});
100-
QPCSC::instance().start();
10199

102100
// Refresh card info on "My EID" page
103101
connect(qApp->signer()->smartcard(), &QSmartCard::dataChanged, this, &MainWindow::updateMyEid);
@@ -124,7 +122,7 @@ MainWindow::MainWindow( QWidget *parent )
124122
connect(ui->accordion, &Accordion::changePinClicked, this, &MainWindow::changePinClicked);
125123
connect(ui->cardInfo, &CardWidget::selected, ui->selector, &QToolButton::toggle);
126124

127-
updateSelectorData(qApp->signer()->tokensign());
125+
updateSelector();
128126
updateMyEID(qApp->signer()->tokensign());
129127
ui->signContainerPage->cardChanged(qApp->signer()->tokensign().cert());
130128
ui->cryptoContainerPage->cardChanged(qApp->signer()->tokenauth().cert());
@@ -846,11 +844,7 @@ bool MainWindow::wrapContainer(bool signing)
846844

847845
void MainWindow::updateSelector()
848846
{
849-
updateSelectorData({});
850-
}
851-
852-
void MainWindow::updateSelectorData(TokenData data)
853-
{
847+
TokenData selected;
854848
enum Filter: uint8_t {
855849
Signing,
856850
Decrypting,
@@ -860,24 +854,24 @@ void MainWindow::updateSelectorData(TokenData data)
860854
{
861855
case SignIntro:
862856
case SignDetails:
863-
if(data.isNull()) data = qApp->signer()->tokensign();
857+
selected = qApp->signer()->tokensign();
864858
filter = Signing;
865859
break;
866860
case CryptoIntro:
867861
case CryptoDetails:
868-
if(data.isNull()) data = qApp->signer()->tokenauth();
862+
selected = qApp->signer()->tokenauth();
869863
filter = Decrypting;
870864
break;
871865
case MyEid:
872866
default:
873-
if(data.isNull()) data = qApp->signer()->smartcard()->tokenData();
867+
selected = qApp->signer()->smartcard()->tokenData();
874868
filter = MyEID;
875869
break;
876870
}
877871
QVector<TokenData> list;
878872
for(const TokenData &token: qApp->signer()->cache())
879873
{
880-
if(token.card() == data.card())
874+
if(token.card() == selected.card())
881875
continue;
882876
if(std::any_of(list.cbegin(), list.cend(), [token](const TokenData &item) { return token.card() == item.card(); }))
883877
continue;
@@ -896,7 +890,7 @@ void MainWindow::updateSelectorData(TokenData data)
896890
ui->selector->setChecked(false);
897891
ui->cardInfo->setVisible(ui->noCardInfo->isHidden());
898892
ui->cardInfo->setCursor(ui->selector->isVisible() ? Qt::PointingHandCursor : Qt::ArrowCursor);
899-
ui->cardInfo->update(data, list.size() > 1);
893+
ui->cardInfo->update(selected, list.size() > 1);
900894
if (!QPCSC::instance().serviceRunning())
901895
ui->noCardInfo->update(NoCardInfo::NoPCSC);
902896
else if(QPCSC::instance().readers().isEmpty())

client/MainWindow.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,6 @@ class MainWindow final : public QWidget
8383
void sign(F &&sign);
8484
bool validateFiles(const QString &container, const QStringList &files);
8585
void updateSelector();
86-
void updateSelectorData(TokenData data);
8786
void updateMyEID(const TokenData &t);
8887
void updateMyEid(const QSmartCardData &data);
8988
bool wrap(const QString& wrappedFile, bool enclose);

client/QCNG.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
#include "SslCertificate.h"
2424
#include "TokenData.h"
2525

26+
#include <QtCore/QUuid>
2627
#include <QtCore/QLoggingCategory>
2728
#include <QtNetwork/QSslKey>
2829

@@ -220,7 +221,8 @@ QList<TokenData> QCNG::tokens() const
220221
if(QByteArray tmp = prop(key, NCRYPT_READER_PROPERTY); !tmp.isEmpty())
221222
reader = QString::fromUtf16((const char16_t*)tmp.data());
222223
}
223-
QString guid = prop(h, NCRYPT_SMARTCARD_GUID_PROPERTY).trimmed();
224+
QByteArray guidData = prop(h, NCRYPT_SMARTCARD_GUID_PROPERTY);
225+
QString guid = guidData[0] >= 0x20 && guidData[0] < 0x7F ? guidData.trimmed() : QUuid(*((GUID*)guidData.data())).toString(QUuid::WithBraces);
224226
TokenData &t = result.emplaceBack();
225227
t.setReader(reader);
226228
t.setCard(cert.type() & SslCertificate::EstEidType || cert.type() & SslCertificate::DigiIDType ?
@@ -232,7 +234,8 @@ QList<TokenData> QCNG::tokens() const
232234
qCWarning(CNG) << "key" << t.data(u"provider"_s)
233235
<< "spec" << t.data(u"spec"_s)
234236
<< "alg" << QStringView(keyname->pszAlgid)
235-
<< "flags" << keyname->dwFlags;
237+
<< "flags" << keyname->dwFlags
238+
<< t.card();
236239
if(cert.publicKey().algorithm() != QSsl::Rsa || reader.isEmpty())
237240
continue;
238241

client/QPCSC.cpp

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -94,10 +94,12 @@ QPCSC::QPCSC()
9494
QPCSC::~QPCSC()
9595
{
9696
requestInterruption();
97+
d->sleepCond.wakeAll();
98+
if(d->thread)
99+
SC(Cancel, d->thread);
97100
wait();
98-
if( d->context )
101+
if(d->context)
99102
SC(ReleaseContext, d->context);
100-
qDeleteAll(d->lock);
101103
delete d;
102104
}
103105

@@ -138,23 +140,30 @@ void QPCSC::run()
138140
std::vector<SCARD_READERSTATE> list;
139141
while(!isInterruptionRequested())
140142
{
141-
if(!pcsc.serviceRunning())
142-
{
143-
sleep(5);
144-
continue;
145-
}
146143
// "\\?PnP?\Notification" does not work on macOS
147144
QByteArray data = pcsc.rawReaders();
148145
if(data.isEmpty())
149146
{
150-
sleep(5);
147+
QMutexLocker locker(&d->sleepMutex);
148+
if (isInterruptionRequested())
149+
break;
150+
d->sleepCond.wait(&d->sleepMutex, 5000);
151151
continue;
152152
}
153153
for(const char *name = data.constData(); *name; name += strlen(name) + 1)
154154
{
155155
if(std::none_of(list.cbegin(), list.cend(), [&name](const SCARD_READERSTATE &state) { return strcmp(state.szReader, name) == 0; }))
156156
list.push_back({ strdup(name), nullptr, 0, 0, 0, {} });
157157
}
158+
if(list.empty())
159+
{
160+
QMutexLocker locker(&d->sleepMutex);
161+
if (isInterruptionRequested())
162+
break;
163+
d->sleepCond.wait(&d->sleepMutex, 5000);
164+
continue;
165+
}
166+
d->thread = pcsc.d->context;
158167
if(SC(GetStatusChange, pcsc.d->context, 5*1000U, list.data(), DWORD(list.size())) != SCARD_S_SUCCESS)
159168
continue;
160169
for(auto i = list.begin(); i != list.end(); )
@@ -164,6 +173,8 @@ void QPCSC::run()
164173
++i;
165174
continue;
166175
}
176+
if((i->dwCurrentState & SCARD_STATE_PRESENT) != (i->dwEventState & SCARD_STATE_PRESENT))
177+
Q_EMIT cardChanged();
167178
i->dwCurrentState = i->dwEventState;
168179
qCDebug(SCard) << "New state: " << QString::fromLocal8Bit(i->szReader) << stateToString(i->dwCurrentState);
169180
Q_EMIT statusChanged(QString::fromLocal8Bit(i->szReader), stateToString(i->dwCurrentState));
@@ -176,6 +187,7 @@ void QPCSC::run()
176187
++i;
177188
}
178189
}
190+
d->thread = {};
179191
}
180192

181193
bool QPCSC::serviceRunning() const
@@ -191,9 +203,6 @@ bool QPCSC::serviceRunning() const
191203
QPCSCReader::QPCSCReader( const QString &reader, QPCSC *parent )
192204
: d(new Private)
193205
{
194-
if(!parent->d->lock.contains(reader))
195-
parent->d->lock[reader] = new QMutex();
196-
parent->d->lock[reader]->lock();
197206
d->d = parent->d;
198207
d->reader = reader.toUtf8();
199208
d->state.szReader = d->reader.constData();
@@ -203,7 +212,6 @@ QPCSCReader::QPCSCReader( const QString &reader, QPCSC *parent )
203212
QPCSCReader::~QPCSCReader()
204213
{
205214
disconnect();
206-
d->d->lock[d->reader]->unlock();
207215
delete d;
208216
}
209217

client/QPCSC.h

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ class QPCSC final: public QThread
3636

3737
Q_SIGNALS:
3838
void statusChanged(const QString &reader, const QStringList &state);
39+
void cardChanged();
3940

4041
private:
4142
QPCSC();
@@ -44,7 +45,7 @@ class QPCSC final: public QThread
4445
QByteArray rawReaders() const;
4546
void run() final;
4647

47-
class Private;
48+
struct Private;
4849
Private *d;
4950

5051
friend class QPCSCReader;
@@ -61,7 +62,7 @@ class QPCSCReader final: public QObject
6162
constexpr operator bool() const { return SW == 0x9000; }
6263
};
6364

64-
enum Properties {
65+
enum Properties : quint8 {
6566
wLcdLayout = 0x01,
6667
bEntryValidationCondition = 0x02,
6768
bTimeOut2 = 0x03,
@@ -76,21 +77,20 @@ class QPCSCReader final: public QObject
7677
wIdProduct = 0x0C
7778
};
7879

79-
enum Connect {
80+
enum Connect : quint8 {
8081
Exclusive = 1,
8182
Shared = 2,
8283
Direct = 3
8384
};
8485

85-
enum Reset
86-
{
86+
enum Reset : quint8 {
8787
LeaveCard = 0,
8888
ResetCard = 1,
8989
UnpowerCard = 2,
9090
EjectCard = 3
9191
};
9292

93-
enum Mode {
93+
enum Mode : quint8 {
9494
Undefined = 0,
9595
T0 = 1,
9696
T1 = 2
@@ -105,7 +105,6 @@ class QPCSCReader final: public QObject
105105
QString name() const;
106106
QHash<Properties,int> properties() const;
107107
QStringList state() const;
108-
bool updateState( quint32 msec = 0 );
109108

110109
bool connect( Connect connect = Shared, Mode mode = Mode(T0|T1) );
111110
void disconnect( Reset reset = LeaveCard );
@@ -115,7 +114,9 @@ class QPCSCReader final: public QObject
115114
quint8 minlen = 4, quint8 newPINOffset = 0, bool requestCurrentPIN = true) const;
116115

117116
private:
117+
bool updateState( quint32 msec = 0 );
118+
118119
Q_DISABLE_COPY(QPCSCReader)
119-
class Private;
120+
struct Private;
120121
Private *d;
121122
};

client/QPCSC_p.h

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323

2424
#include <QtCore/QHash>
2525
#include <QtCore/QMutex>
26+
#include <QtCore/QWaitCondition>
2627

2728
#ifdef Q_OS_WIN
2829
#undef UNICODE
@@ -178,16 +179,16 @@ struct DISPLAY_PROPERTIES_STRUCTURE
178179

179180
#pragma pack(pop)
180181

181-
class QPCSC::Private
182+
struct QPCSC::Private
182183
{
183-
public:
184184
SCARDCONTEXT context {};
185-
QHash<QString,QMutex*> lock;
185+
SCARDCONTEXT thread {};
186+
QMutex sleepMutex;
187+
QWaitCondition sleepCond;
186188
};
187189

188-
class QPCSCReader::Private
190+
struct QPCSCReader::Private
189191
{
190-
public:
191192
QHash<DRIVER_FEATURES,quint32> features();
192193

193194
QPCSC::Private *d {};

0 commit comments

Comments
 (0)