prompting for unavailable entries

svn path=/trunk/kdesupport/qca/; revision=684063
This commit is contained in:
Justin Karneges 2007-07-06 01:47:35 +00:00
parent 9f5874cd05
commit e31ddc9c7d
2 changed files with 158 additions and 19 deletions

View File

@ -42,6 +42,7 @@ public:
QList<Item> pending;
bool prompting;
QMessageBox *token_prompt;
bool auto_accept;
QCA::KeyStoreManager ksm;
QList<QCA::KeyStore*> 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<QCA::KeyStoreEntry> 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<QCA::KeyStoreEntry> 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) :

View File

@ -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<QCA::KeyStoreEntry> 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<QCA::KeyStoreEntry> 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