From e31ddc9c7ddd6021c5ab13f685614dd56e79f691 Mon Sep 17 00:00:00 2001 From: Justin Karneges Date: Fri, 6 Jul 2007 01:47:35 +0000 Subject: [PATCH] prompting for unavailable entries svn path=/trunk/kdesupport/qca/; revision=684063 --- examples/cmssigner/prompter.cpp | 90 +++++++++++++++++++++++++++++---- tools/qcatool/main.cpp | 87 +++++++++++++++++++++++++++---- 2 files changed, 158 insertions(+), 19 deletions(-) diff --git a/examples/cmssigner/prompter.cpp b/examples/cmssigner/prompter.cpp index 682e94b0..76826191 100644 --- a/examples/cmssigner/prompter.cpp +++ b/examples/cmssigner/prompter.cpp @@ -42,6 +42,7 @@ public: QList pending; bool prompting; QMessageBox *token_prompt; + bool auto_accept; QCA::KeyStoreManager ksm; QList keyStores; @@ -149,12 +150,44 @@ private slots: // we should still check if the token is present, due to // a possible race between insert and token request. bool found = false; - foreach(QCA::KeyStore *ks, keyStores) + + // token-only + if(event.keyStoreEntry().isNull()) { - if(ks->id() == event.keyStoreInfo().id()) + foreach(QCA::KeyStore *ks, keyStores) { - found = true; - break; + if(ks->id() == event.keyStoreInfo().id()) + { + found = true; + break; + } + } + } + // token-entry + else + { + QCA::KeyStoreEntry kse = event.keyStoreEntry(); + + QCA::KeyStore *ks = 0; + foreach(QCA::KeyStore *i, keyStores) + { + if(i->id() == event.keyStoreInfo().id()) + { + ks = i; + break; + } + } + if(ks) + { + QList list = ks->entryList(); + foreach(const QCA::KeyStoreEntry &e, list) + { + if(e.id() == kse.id() && kse.isAvailable()) + { + found = true; + break; + } + } } } if(found) @@ -168,18 +201,19 @@ private slots: QString name; if(!entry.isNull()) { - name = Prompter::tr("the '%1' token for %2").arg(entry.storeName(), entry.name()); + name = Prompter::tr("Please make %1 (of %2) available").arg(entry.name(), entry.storeName()); } else { - name = Prompter::tr("the '%1' token").arg(event.keyStoreInfo().name()); + name = Prompter::tr("Please insert the '%1' token").arg(event.keyStoreInfo().name()); } - QString str = Prompter::tr("Please insert %1 and click OK.").arg(name); + QString str = Prompter::tr("%1 and click OK.").arg(name); QMessageBox msgBox(QMessageBox::Information, QApplication::instance()->applicationName() + ": " + tr("Prompt"), str, QMessageBox::Ok | QMessageBox::Cancel, 0); token_prompt = &msgBox; - if(msgBox.exec() == QDialog::Accepted) + auto_accept = false; + if(msgBox.exec() == QMessageBox::Ok || auto_accept) handler.tokenOkay(id); else handler.reject(id); @@ -199,16 +233,19 @@ private slots: void ks_available(const QString &keyStoreId) { QCA::KeyStore *ks = new QCA::KeyStore(keyStoreId, &ksm); + connect(ks, SIGNAL(updated()), SLOT(ks_updated())); connect(ks, SIGNAL(unavailable()), SLOT(ks_unavailable())); keyStores += ks; + ks->startAsynchronousMode(); - // are we currently in a token prompt? - if(token_prompt && pending.first().event.type() == QCA::Event::Token) + // are we currently in a token-only prompt? + if(token_prompt && pending.first().event.type() == QCA::Event::Token && pending.first().event.keyStoreEntry().isNull()) { // was the token we're looking for just inserted? if(pending.first().event.keyStoreInfo().id() == keyStoreId) { // auto-accept + auto_accept = true; token_prompt->accept(); } } @@ -220,6 +257,39 @@ private slots: keyStores.removeAll(ks); delete ks; } + + void ks_updated() + { + QCA::KeyStore *ks = (QCA::KeyStore *)sender(); + + // are we currently in a token-entry prompt? + if(token_prompt && pending.first().event.type() == QCA::Event::Token && !pending.first().event.keyStoreEntry().isNull()) + { + QCA::KeyStoreEntry kse = pending.first().event.keyStoreEntry(); + + // was the token of the entry we're looking for updated? + if(pending.first().event.keyStoreInfo().id() == ks->id()) + { + // is the entry available? + bool avail = false; + QList list = ks->entryList(); + foreach(const QCA::KeyStoreEntry &e, list) + { + if(e.id() == kse.id()) + { + avail = kse.isAvailable(); + break; + } + } + if(avail) + { + // auto-accept + auto_accept = true; + token_prompt->accept(); + } + } + } + } }; Prompter::Prompter(QObject *parent) : diff --git a/tools/qcatool/main.cpp b/tools/qcatool/main.cpp index 2a553101..47b14195 100644 --- a/tools/qcatool/main.cpp +++ b/tools/qcatool/main.cpp @@ -469,12 +469,44 @@ private slots: // we should still check if the token is present, due to // a possible race between insert and token request. bool found = false; - foreach(QCA::KeyStore *ks, keyStores) + + // token-only + if(e.keyStoreEntry().isNull()) { - if(ks->id() == e.keyStoreInfo().id()) + foreach(QCA::KeyStore *ks, keyStores) { - found = true; - break; + if(ks->id() == e.keyStoreInfo().id()) + { + found = true; + break; + } + } + } + // token-entry + else + { + QCA::KeyStoreEntry kse = e.keyStoreEntry(); + + QCA::KeyStore *ks = 0; + foreach(QCA::KeyStore *i, keyStores) + { + if(i->id() == e.keyStoreInfo().id()) + { + ks = i; + break; + } + } + if(ks) + { + QList list = ks->entryList(); + foreach(const QCA::KeyStoreEntry &e, list) + { + if(e.id() == kse.id() && kse.isAvailable()) + { + found = true; + break; + } + } } } if(found) @@ -488,14 +520,14 @@ private slots: QString name; if(!entry.isNull()) { - name = QString("the '") + entry.storeName() + "' token for " + entry.name(); + name = QString("Please make ") + entry.name() + " (of " + entry.storeName() + ") available"; } else { - name = QString("the '") + e.keyStoreInfo().name() + "' token"; + name = QString("Please insert the '") + e.keyStoreInfo().name() + "' token"; } - QString str = QString("Please insert %1 and press Enter (or 'q' to cancel) ...").arg(name); + QString str = QString("%1 and press Enter (or 'q' to cancel) ...").arg(name); if(!prompt) { @@ -573,11 +605,13 @@ private slots: void ks_available(const QString &keyStoreId) { QCA::KeyStore *ks = new QCA::KeyStore(keyStoreId, &ksm); + connect(ks, SIGNAL(updated()), SLOT(ks_updated())); connect(ks, SIGNAL(unavailable()), SLOT(ks_unavailable())); keyStores += ks; + ks->startAsynchronousMode(); - // are we currently in a token prompt? - if(prompt && prompt_event.type() == QCA::Event::Token) + // are we currently in a token-only prompt? + if(prompt && prompt_event.type() == QCA::Event::Token && prompt_event.keyStoreEntry().isNull()) { // was the token we're looking for just inserted? if(prompt_event.keyStoreInfo().id() == keyStoreId) @@ -597,6 +631,41 @@ private slots: keyStores.removeAll(ks); delete ks; } + + void ks_updated() + { + QCA::KeyStore *ks = (QCA::KeyStore *)sender(); + + // are we currently in a token-entry prompt? + if(prompt && prompt_event.type() == QCA::Event::Token && !prompt_event.keyStoreEntry().isNull()) + { + QCA::KeyStoreEntry kse = prompt_event.keyStoreEntry(); + + // was the token of the entry we're looking for updated? + if(prompt_event.keyStoreInfo().id() == ks->id()) + { + // is the entry available? + bool avail = false; + QList list = ks->entryList(); + foreach(const QCA::KeyStoreEntry &e, list) + { + if(e.id() == kse.id()) + { + avail = kse.isAvailable(); + break; + } + } + if(avail) + { + fprintf(stderr, "Entry available! Continuing...\n"); + + // auto-accept + auto_accept = true; + prompt_finished(); + } + } + } + } }; class PassphrasePromptThread : public QCA::SyncThread