MojErr MojDbLevelQuery::seekImpl(const ByteVec& key, bool desc, bool& foundOut) { if (key.empty()) { // if key is empty, seek to beginning (or end if desc) MojErr err = getKey(foundOut, SeekEmptyFlags[desc]); MojErrCheck(err); } else { // otherwise seek to the key MojErr err = m_key.fromBytes(key.begin(), key.size()); MojErrCheck(err); err = getKey(foundOut, SeekFlags); MojErrCheck(err); // if descending, skip the first result (which is outside the range) if (desc) { err = next(foundOut); MojErrCheck(err); } } return MojErrNone; }
void QSmartCard::run() { while( !d->terminate ) { if( d->m.tryLock() ) { // Get list of available cards QMap<QString,std::string> cards; QStringList readers; try { EstEIDManager *card = new EstEIDManager(); std::vector<Token> list = card->getTokenList(); for( std::vector<Token>::const_iterator i = list.begin(); i != list.end(); ++i ) { qDebug() << i->first.c_str() << i->second.c_str(); readers << i->first.c_str(); if( !i->second.empty() ) cards[i->second.c_str()] = i->first.c_str(); } delete card; } catch( const std::runtime_error &e ) { qDebug() << Q_FUNC_INFO << e.what(); } // cardlist has changed QStringList order = cards.keys(); std::sort( order.begin(), order.end(), Common::cardsOrder ); bool update = d->t.cards() != order || d->t.readers() != readers; // check if selected card is still in slot if( !d->t.card().isEmpty() && !order.contains( d->t.card() ) ) { update = true; d->t.d = new QSmartCardDataPrivate(); } d->t.d->cards = order; d->t.d->readers = readers; // if none is selected select first from cardlist if( d->t.card().isEmpty() && !d->t.cards().isEmpty() ) selectCard( d->t.cards().first() ); // read card data if( d->t.cards().contains( d->t.card() ) && (!d->card || d->t.authCert().isNull() || d->t.signCert().isNull()) ) { update = true; try { QSmartCardDataPrivate *t = d->t.d; std::string reader = cards.value( t->card ); delete d->card; d->card = 0; d->card = new EstEidCard( reader ); d->card->setReaderLanguageId( d->lang ); d->updateCounters( t ); std::vector<std::string> data; d->card->readPersonalData( data, EstEidCard::SURNAME, EstEidCard::COMMENT4 ); ByteVec authcert = d->card->getAuthCert(); ByteVec signcert = d->card->getSignCert(); t->reader = reader.c_str(); t->pinpad = d->card->isSecureConnection(); t->version = QSmartCardData::CardVersion(d->card->getCardVersion()); try { if( t->version > QSmartCardData::VER_1_1 ) { d->card->sendApplicationIdentifierPreV3(); t->version = QSmartCardData::VER_3_0; } } catch( const std::runtime_error &e ) { qDebug() << Q_FUNC_INFO << "Card is not V3.0: " << e.what(); } t->data[QSmartCardData::SurName] = SslCertificate::formatName( d->encode( data[EstEidCard::SURNAME] ) ).trimmed(); t->data[QSmartCardData::FirstName] = SslCertificate::formatName( d->encode( data[EstEidCard::FIRSTNAME] ) ).trimmed(); t->data[QSmartCardData::MiddleName] = SslCertificate::formatName( d->encode( data[EstEidCard::MIDDLENAME] ) ).trimmed(); t->data[QSmartCardData::Sex] = d->encode( data[EstEidCard::SEX] ); t->data[QSmartCardData::Citizen] = d->encode( data[EstEidCard::CITIZEN] ); t->data[QSmartCardData::BirthDate] = QDate::fromString( d->encode( data[EstEidCard::BIRTHDATE] ), "dd.MM.yyyy" ); t->data[QSmartCardData::Id] = d->encode( data[EstEidCard::ID] ); t->data[QSmartCardData::DocumentId] = d->encode( data[EstEidCard::DOCUMENTID] ); t->data[QSmartCardData::Expiry] = QDate::fromString( d->encode( data[EstEidCard::EXPIRY] ), "dd.MM.yyyy" ); t->data[QSmartCardData::BirthPlace] = SslCertificate::formatName( d->encode( data[EstEidCard::BIRTHPLACE] ) ); t->data[QSmartCardData::IssueDate] = QDate::fromString( d->encode( data[EstEidCard::ISSUEDATE] ), "dd.MM.yyyy" ); t->data[QSmartCardData::ResidencePermit] = d->encode( data[EstEidCard::RESIDENCEPERMIT] ); t->data[QSmartCardData::Comment1] = d->encode( data[EstEidCard::COMMENT1] ); t->data[QSmartCardData::Comment2] = d->encode( data[EstEidCard::COMMENT2] ); t->data[QSmartCardData::Comment3] = d->encode( data[EstEidCard::COMMENT3] ); t->data[QSmartCardData::Comment4] = d->encode( data[EstEidCard::COMMENT4] ); if( !authcert.empty() ) t->authCert = QSslCertificate( QByteArray( (char*)&authcert[0], (int)authcert.size() ), QSsl::Der ); if( !signcert.empty() ) t->signCert = QSslCertificate( QByteArray( (char*)&signcert[0], (int)signcert.size() ), QSsl::Der ); QStringList mailaddresses = t->authCert.alternateSubjectNames().values( QSsl::EmailEntry ); t->data[QSmartCardData::Email] = !mailaddresses.isEmpty() ? mailaddresses.first() : ""; QStringList name = QStringList() << t->data[QSmartCardData::FirstName].toString() << t->data[QSmartCardData::MiddleName].toString() << t->data[QSmartCardData::SurName].toString(); name.removeAll( "" ); t->data[QSmartCardData::FullName] = name.join( " " ); if( t->authCert.type() & SslCertificate::DigiIDType ) { t->data[QSmartCardData::FullName] = t->authCert.toString( "GN SN" ); t->data[QSmartCardData::Id] = t->authCert.subjectInfo("serialNumber"); t->data[QSmartCardData::BirthDate] = IKValidator::birthDate( t->authCert.subjectInfo("serialNumber") ); t->data[QSmartCardData::IssueDate] = t->authCert.effectiveDate(); t->data[QSmartCardData::Expiry] = t->authCert.expiryDate(); } } catch( const std::runtime_error &e ) { qDebug() << Q_FUNC_INFO << "Error on loading card data: " << e.what(); } } // update data if something has changed if( update ) Q_EMIT dataChanged(); d->m.unlock(); } else if( d->e.isRunning() ) { emit eventStarted(); try { byte retries = 0; d->result = QSmartCard::UnknownError; switch( d->cmd ) { case QSmartCardPrivate::Change: switch( d->type ) { case QSmartCardData::Pin1Type: d->card->changeAuthPin( d->pin, d->old, retries ); break; case QSmartCardData::Pin2Type: d->card->changeSignPin( d->pin, d->old, retries ); break; case QSmartCardData::PukType: d->card->changePUK( d->pin, d->old, retries ); break; } d->updateCounters( d->t.d ); break; case QSmartCardPrivate::Unblock: switch( d->type ) { case QSmartCardData::Pin1Type: d->card->unblockAuthPin( d->pin, d->old, retries ); break; case QSmartCardData::Pin2Type: d->card->unblockSignPin( d->pin, d->old, retries ); break; default: break; } d->updateCounters( d->t.d ); break; case QSmartCardPrivate::Validate: switch( d->type ) { case QSmartCardData::Pin1Type: d->card->validateAuthPin( d->pin, retries ); break; case QSmartCardData::Pin2Type: d->card->validateSignPin( d->pin, retries ); break; case QSmartCardData::PukType: d->card->validatePuk( d->pin, retries ); break; default: break; } break; case QSmartCardPrivate::ValidateInternal: switch( d->type ) { case QSmartCardData::Pin1Type: d->card->enterPin( EstEidCard::PIN_AUTH, d->pin ); break; case QSmartCardData::Pin2Type: d->card->enterPin( EstEidCard::PIN_SIGN, d->pin ); break; case QSmartCardData::PukType: d->card->enterPin( EstEidCard::PUK, d->pin ); break; } break; default: break; } d->result = QSmartCard::NoError; } catch( const AuthError &e ) { d->result = d->handleAuthError( d->cmd == QSmartCardPrivate::Unblock ? QSmartCardData::PukType : d->type, e ); } catch( const std::runtime_error &e ) { qDebug() << Q_FUNC_INFO << e.what(); } d->pin.clear(); d->old.clear(); d->e.quit(); } sleep( 5 ); } }