4242#include < openssl/obj_mac.h>
4343#include < openssl/rsa.h>
4444
45- #include < memory>
46-
47- Q_LOGGING_CATEGORY (SLog, " qdigidoc4.QSigner" )
45+ static Q_LOGGING_CATEGORY (SLog, " qdigidoc4.QSigner" )
4846
4947class QSigner::Private final
5048{
@@ -123,10 +121,10 @@ QSigner::QSigner(QObject *parent)
123121 WarningDialog::show (msg);
124122 });
125123 connect (this , &QSigner::signDataChanged, this , [this ](const TokenData &token) {
126- std::string method = ( CONF (signatureDigestUri)) ;
124+ std::string method;
127125 if (token.data (QStringLiteral (" PSS" )).toBool ())
128126 {
129- switch (methodToNID (method ))
127+ switch (methodToNID (CONF (signatureDigestUri) ))
130128 {
131129 case QCryptographicHash::Sha224: method = " http://www.w3.org/2007/05/xmldsig-more#sha224-rsa-MGF1" ; break ;
132130 case QCryptographicHash::Sha256: method = " http://www.w3.org/2007/05/xmldsig-more#sha256-rsa-MGF1" ; break ;
@@ -266,7 +264,8 @@ quint8 QSigner::login(const TokenData &cert) const
266264 return login (cert);
267265 default :
268266 d->lock .unlock ();
269- d->smartcard ->reloadCounters (); // QSmartCard should also know that PIN is blocked.
267+ // QSmartCard should also know that PIN is blocked.
268+ std::thread (&QSmartCard::reloadCard, d->smartcard , d->smartcard ->tokenData (), true ).detach ();
270269 return status;
271270 }
272271}
@@ -275,7 +274,8 @@ void QSigner::logout() const
275274{
276275 d->backend ->logout ();
277276 d->lock .unlock ();
278- d->smartcard ->reloadCounters (); // QSmartCard should also know that PIN1 info is updated
277+ // QSmartCard should also know that PIN1 info is updated
278+ std::thread (&QSmartCard::reloadCard, d->smartcard , d->smartcard ->tokenData (), true ).detach ();
279279}
280280
281281QCryptographicHash::Algorithm QSigner::methodToNID (const std::string &method)
@@ -320,8 +320,6 @@ void QSigner::run()
320320 return ;
321321 }
322322
323- TokenData aold = d->auth , at = aold;
324- TokenData sold = d->sign , st = sold;
325323 QList<TokenData> acards, scards;
326324 QList<TokenData> cache = d->backend ->tokens ();
327325 std::sort (cache.begin (), cache.end (), cardsOrder);
@@ -340,33 +338,35 @@ void QSigner::run()
340338 scards.append (t);
341339 }
342340
341+ TokenData aold = d->auth ;
342+ TokenData sold = d->sign ;
343343 // check if selected card is still in slot
344- if (!at .isNull () && !acards.contains (at ))
344+ if (!d-> auth .isNull () && !acards.contains (d-> auth ))
345345 {
346- qCDebug (SLog) << " Disconnected from auth card" << st .card ();
347- at .clear ();
346+ qCDebug (SLog) << " Disconnected from auth card" << d-> auth .card ();
347+ d-> auth .clear ();
348348 }
349- if (!st .isNull () && !scards.contains (st ))
349+ if (!d-> sign .isNull () && !scards.contains (d-> sign ))
350350 {
351- qCDebug (SLog) << " Disconnected from sign card" << st .card ();
352- st .clear ();
351+ qCDebug (SLog) << " Disconnected from sign card" << d-> sign .card ();
352+ d-> sign .clear ();
353353 }
354354
355355 // if none is selected then pick first card with signing cert;
356356 // if no signing certs then pick first card with auth cert
357- if (st .isNull () && !scards.isEmpty ())
358- st = scards.first ();
359- if (at .isNull () && !acards.isEmpty ())
360- at = acards.first ();
357+ if (d-> sign .isNull () && !scards.isEmpty ())
358+ d-> sign = scards.first ();
359+ if (d-> auth .isNull () && !acards.isEmpty ())
360+ d-> auth = acards.first ();
361361
362362 // update data if something has changed
363363 TokenData update;
364- if (aold != at )
365- Q_EMIT authDataChanged (d-> auth = update = at );
366- if (sold != st )
367- Q_EMIT signDataChanged (d-> sign = update = st );
368- if (aold != at || sold != st )
369- d->smartcard ->reloadCard (update);
364+ if (aold != d-> auth )
365+ Q_EMIT authDataChanged (update = d-> auth );
366+ if (sold != d-> sign )
367+ Q_EMIT signDataChanged (update = d-> sign );
368+ if (aold != d-> auth || sold != d-> sign )
369+ d->smartcard ->reloadCard (update, false );
370370 d->lock .unlock ();
371371 }
372372
@@ -394,7 +394,7 @@ void QSigner::selectCard(const TokenData &token)
394394 Q_EMIT signDataChanged (d->sign = other);
395395 break ;
396396 }
397- d->smartcard -> reloadCard ( token);
397+ std::thread (&QSmartCard::reloadCard, d->smartcard , token, false ). detach ( );
398398}
399399
400400std::vector<unsigned char > QSigner::sign (const std::string &method, const std::vector<unsigned char > &digest ) const
0 commit comments