Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
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 );
	}
}