eventhandlerdemo.cpp
The code below shows to implement a client side handler for password / passphrase / PIN and token requests from
QCA and any associated providers.
#include <QtCrypto>
#include <QCoreApplication>
#include <iostream>
class ClientPassphraseHandler: public QObject
{
Q_OBJECT
public:
ClientPassphraseHandler(QObject *parent = 0) : QObject( parent )
{
connect( &m_handler, SIGNAL( eventReady(int, const QCA::Event &) ),
SLOT( my_eventReady(int, const QCA::Event &) ) );
m_handler.start();
}
private slots:
void my_eventReady(int id, const QCA::Event &event)
{
if ( event.isNull() ) {
return;
}
if ( event.source() == QCA::Event::KeyStore ) {
std::cout << "Event is associated with a key store operation" << std::endl;
} else if ( event.source() == QCA::Event::Data ) {
std::cout << "Event is associated with a file or some other data" << std::endl;
std::cout << " Filename: " << qPrintable( event.fileName() ) << std::endl;
} else {
std::cout << "Unexpected Source for Event" << std::endl;
}
if ( event.type() == QCA::Event::Token ) {
std::cout << "Request for token" << std::endl;
m_handler.tokenOkay( id );
} else if ( event.type() == QCA::Event::Password ) {
std::cout << "Request for password, passphrase or PIN" << std::endl;
if ( event.passwordStyle() == QCA::Event::StylePassword ) {
std::cout << " [Password request]" << std::endl;
} else if ( event.passwordStyle() == QCA::Event::StylePassphrase ) {
std::cout << " [Passphrase request]" << std::endl;
} else if ( event.passwordStyle() == QCA::Event::StylePIN ){
std::cout << " [PIN request]" << std::endl;
} else {
std::cout << " [unexpect request style]" << std::endl;
}
m_handler.submitPassword( id, QCA::SecureArray( "hello" ) );
} else {
std::cout << "Unexpected event type" << std::endl;
}
}
private:
QCA::EventHandler m_handler;
};
void asker_procedure();
class AskerThread : public QThread
{
Q_OBJECT
protected:
virtual void run()
{
asker_procedure();
}
};
int main(int argc, char **argv)
{
QCA::Initializer init;
QCoreApplication exampleApp(argc, argv);
ClientPassphraseHandler cph;
AskerThread askerThread;
QObject::connect(&askerThread, SIGNAL(finished()), &exampleApp, SLOT(quit()));
askerThread.start();
exampleApp.exec();
return 0;
}
void asker_procedure()
{
QCA::PasswordAsker pwAsker;
pwAsker.ask( QCA::Event::StylePassword, "foo.tmp", 0 );
pwAsker.waitForResponse();
std::cout << "Password was: " << pwAsker.password().toByteArray().data() << std::endl;
std::cout << std::endl << "Now do token:" << std::endl;
QCA::TokenAsker tokenAsker;
tokenAsker.ask( QCA::KeyStoreInfo( QCA::KeyStore::SmartCard, "Token Id", "Token Name" ), QCA::KeyStoreEntry(), 0 );
tokenAsker.waitForResponse();
if ( tokenAsker.accepted() ) {
std::cout << "Token was accepted" << std::endl;
} else {
std::cout << "Token was not accepted" << std::endl;
}
}
#include "eventhandlerdemo.moc"