6
#include "passphrasedlg.h"
9
PGPUtil::PGPUtil() : qcaEventHandler_(NULL), passphraseDlg_(NULL)
11
qcaEventHandler_ = new QCA::EventHandler(this);
12
connect(qcaEventHandler_,SIGNAL(eventReady(int,const QCA::Event&)),SLOT(handleEvent(int,const QCA::Event&)));
13
qcaEventHandler_->start();
14
qcaKeyStoreManager_.waitForBusyFinished(); // FIXME get rid of this
15
connect(&qcaKeyStoreManager_, SIGNAL(keyStoreAvailable(const QString&)), SLOT(keyStoreAvailable(const QString&)));
16
foreach(QString k, qcaKeyStoreManager_.keyStores()) {
17
QCA::KeyStore* ks = new QCA::KeyStore(k, &qcaKeyStoreManager_);
18
connect(ks, SIGNAL(updated()), SIGNAL(pgpKeysUpdated()));
22
connect(QCoreApplication::instance(),SIGNAL(aboutToQuit()),SLOT(deleteLater()));
27
foreach(QCA::KeyStore* ks,keystores_) {
34
PGPUtil& PGPUtil::instance()
37
instance_ = new PGPUtil();
42
void PGPUtil::handleEvent(int id, const QCA::Event& event)
44
if (event.type() == QCA::Event::Password) {
45
QCA::KeyStoreEntry entry = event.keyStoreEntry();
46
if(!entry.isNull() && passphrases_.contains(entry.id())) {
47
qcaEventHandler_->submitPassword(id,QCA::SecureArray(passphrases_[entry.id()].utf8()));
49
else if (passphraseDlg_) {
53
pendingEvents_.push_back(i);
56
promptPassphrase(id,event);
61
void PGPUtil::promptPassphrase(int id, const QCA::Event& event)
66
QCA::KeyStoreEntry entry = event.keyStoreEntry();
69
currentEntryId_ = entry.id();
72
name = event.keyStoreInfo().name();
73
currentEntryId_ = QString();
76
if (!passphraseDlg_) {
77
passphraseDlg_ = new PassphraseDlg();
78
connect(passphraseDlg_,SIGNAL(finished(int)),SLOT(passphraseDone(int)));
80
passphraseDlg_->promptPassphrase(name);
81
passphraseDlg_->show();
84
void PGPUtil::passphraseDone(int result)
87
if (result == QDialog::Accepted) {
88
QString passphrase = passphraseDlg_->getPassphrase();
89
if (!currentEntryId_.isEmpty()) {
90
passphrases_[currentEntryId_] = passphrase;
92
qcaEventHandler_->submitPassword(currentEventId_,passphrase.toUtf8());
94
else if (result == QDialog::Rejected) {
95
qcaEventHandler_->reject(currentEventId_);
98
qWarning() << "PGPUtil: Unexpected passphrase dialog result";
102
if (!pendingEvents_.isEmpty()) {
104
bool handlePendingEvent = false;
105
while (!pendingEvents_.isEmpty() && !handlePendingEvent) {
106
eventItem = pendingEvents_.takeFirst();
107
QCA::KeyStoreEntry entry = eventItem.event.keyStoreEntry();
108
if(!entry.isNull() && passphrases_.contains(entry.id())) {
109
qcaEventHandler_->submitPassword(eventItem.id,QCA::SecureArray(passphrases_[entry.id()].utf8()));
112
handlePendingEvent = true;
115
if (handlePendingEvent) {
116
promptPassphrase(eventItem.id,eventItem.event);
120
passphraseDlg_->deleteLater();
121
passphraseDlg_ = NULL;
124
bool PGPUtil::pgpAvailable()
126
return (QCA::isSupported("openpgp") && keystores_.count() > 0);
129
QString PGPUtil::stripHeaderFooter(const QString &str)
133
qWarning("pgputil.cpp: Empty PGP message");
138
QStringList lines = QStringList::split('\n', str, true);
139
QStringList::ConstIterator it = lines.begin();
140
// skip the first line
142
if(it == lines.end())
146
for(; it != lines.end(); ++it) {
150
if(it == lines.end())
153
if(it == lines.end())
157
for(; it != lines.end(); ++it) {
158
if((*it).at(0) == '-')
170
QString PGPUtil::addHeaderFooter(const QString &str, int type)
179
s += QString("-----BEGIN PGP %1-----\n").arg(stype);
180
s += "Version: PGP\n";
183
s += QString("-----END PGP %1-----\n").arg(stype);
188
QCA::KeyStoreEntry PGPUtil::getSecretKeyStoreEntry(const QString& keyID)
190
foreach(QCA::KeyStore *ks, keystores_) {
191
if (ks->type() == QCA::KeyStore::PGPKeyring && ks->holdsIdentities()) {
192
foreach(QCA::KeyStoreEntry ke, ks->entryList()) {
193
if (ke.type() == QCA::KeyStoreEntry::TypePGPSecretKey
194
&& ke.pgpSecretKey().keyId() == keyID) {
200
return QCA::KeyStoreEntry();
203
QCA::KeyStoreEntry PGPUtil::getPublicKeyStoreEntry(const QString& keyID)
205
foreach(QCA::KeyStore *ks, keystores_) {
206
if (ks->type() == QCA::KeyStore::PGPKeyring && ks->holdsIdentities()) {
207
foreach(QCA::KeyStoreEntry ke, ks->entryList()) {
208
if ((ke.type() == QCA::KeyStoreEntry::TypePGPSecretKey
209
|| ke.type() == QCA::KeyStoreEntry::TypePGPPublicKey)
210
&& ke.pgpPublicKey().keyId() == keyID) {
216
return QCA::KeyStoreEntry();
219
QString PGPUtil::messageErrorString(enum QCA::SecureMessage::Error e)
223
case QCA::SecureMessage::ErrorPassphrase:
224
msg = QObject::tr("Invalid passphrase");
226
case QCA::SecureMessage::ErrorFormat:
227
msg = QObject::tr("Invalid input format");
229
case QCA::SecureMessage::ErrorSignerExpired:
230
msg = QObject::tr("Signing key expired");
232
case QCA::SecureMessage::ErrorSignerInvalid:
233
msg = QObject::tr("Invalid key");
235
case QCA::SecureMessage::ErrorEncryptExpired:
236
msg = QObject::tr("Encrypting key expired");
238
case QCA::SecureMessage::ErrorEncryptUntrusted:
239
msg = QObject::tr("Encrypting key is untrusted");
241
case QCA::SecureMessage::ErrorEncryptInvalid:
242
msg = QObject::tr("Encrypting key is invalid");
244
case QCA::SecureMessage::ErrorNeedCard:
245
msg = QObject::tr("PGP card is missing");
248
msg = QObject::tr("Unknown error");
253
bool PGPUtil::equals(QCA::PGPKey k1, QCA::PGPKey k2)
258
else if (k2.isNull()) {
262
return k1.keyId() == k2.keyId();
266
void PGPUtil::removePassphrase(const QString& id)
268
passphrases_.remove(id);
271
void PGPUtil::keyStoreAvailable(const QString& k)
273
QCA::KeyStore* ks = new QCA::KeyStore(k, &qcaKeyStoreManager_);
274
connect(ks, SIGNAL(updated()), SIGNAL(pgpKeysUpdated()));
281
PGPUtil* PGPUtil::instance_ = NULL;