diff options
author | nils <nils@34ebc366-c3a9-4b3c-9f84-69acf7962910> | 2011-03-12 00:54:11 +0000 |
---|---|---|
committer | nils <nils@34ebc366-c3a9-4b3c-9f84-69acf7962910> | 2011-03-12 00:54:11 +0000 |
commit | f8b267c2c2f5dbe5f4a8bfdf352e2e664a52bac5 (patch) | |
tree | c14e2d5075305d9c0efa21d984c37ebade635612 | |
parent | updated spanish translation (diff) | |
download | gpg4usb-f8b267c2c2f5dbe5f4a8bfdf352e2e664a52bac5.tar.gz gpg4usb-f8b267c2c2f5dbe5f4a8bfdf352e2e664a52bac5.zip |
added import key from keyserver dialog
git-svn-id: http://cpunk.de/svn/src/gpg4usb/trunk@480 34ebc366-c3a9-4b3c-9f84-69acf7962910
Diffstat (limited to '')
-rw-r--r-- | gpg4usb.pro | 8 | ||||
-rw-r--r-- | gpgwin.cpp | 15 | ||||
-rw-r--r-- | gpgwin.h | 5 | ||||
-rw-r--r-- | keyserverimportdialog.cpp | 246 | ||||
-rw-r--r-- | keyserverimportdialog.h | 83 |
5 files changed, 351 insertions, 6 deletions
diff --git a/gpg4usb.pro b/gpg4usb.pro index 0ab3204..dc50340 100644 --- a/gpg4usb.pro +++ b/gpg4usb.pro @@ -13,7 +13,7 @@ INCLUDEPATH += . \ # CONFIG += release static CONFIG += debug - +QT += network # Input HEADERS += attachments.h \ context.h \ @@ -28,7 +28,8 @@ HEADERS += attachments.h \ attachmenttablemodel.h \ textedit.h \ editorpage.h \ - quitdialog.h + quitdialog.h \ + keyserverimportdialog.h SOURCES += attachments.cpp \ context.cpp \ gpgwin.cpp \ @@ -43,7 +44,8 @@ SOURCES += attachments.cpp \ attachmenttablemodel.cpp \ textedit.cpp \ editorpage.cpp \ - quitdialog.cpp + quitdialog.cpp \ + keyserverimportdialog.cpp RC_FILE = gpg4usb.rc # comment out line below for static building @@ -267,6 +267,10 @@ void GpgWin::createActions() importKeyFromClipboardAct->setToolTip(tr("Import New Key From Clipboard")); connect(importKeyFromClipboardAct, SIGNAL(triggered()), this, SLOT(importKeyFromClipboard())); + importKeyFromKeyServerAct = new QAction(tr("&Keyserver"), this); + importKeyFromKeyServerAct->setToolTip(tr("Import New Key From Keyserver")); + connect(importKeyFromKeyServerAct, SIGNAL(triggered()), this, SLOT(importKeyFromKeyServer())); + openKeyManagementAct = new QAction(tr("Key Management"), this); openKeyManagementAct->setIcon(QIcon(iconPath + "keymgmt.png")); openKeyManagementAct->setToolTip(tr("Open Keymanagement")); @@ -346,9 +350,9 @@ void GpgWin::createMenus() cryptMenu = menuBar()->addMenu(tr("&Crypt")); cryptMenu->addAction(encryptAct); cryptMenu->addAction(decryptAct); - /*cryptMenu->addSeparator(); + cryptMenu->addSeparator(); cryptMenu->addAction(signAct); - cryptMenu->addAction(verifyAct);*/ + cryptMenu->addAction(verifyAct); cryptMenu->addSeparator(); cryptMenu->addAction(fileEncryptionAct); @@ -358,6 +362,7 @@ void GpgWin::createMenus() importKeyMenu->addAction(importKeyFromFileAct); importKeyMenu->addAction(importKeyFromEditAct); importKeyMenu->addAction(importKeyFromClipboardAct); + importKeyMenu->addAction(importKeyFromKeyServerAct); keyMenu->addAction(openKeyManagementAct); viewMenu = menuBar()->addMenu(tr("&View")); @@ -638,7 +643,11 @@ void GpgWin::importKeyFromClipboard() QClipboard *cb = QApplication::clipboard(); mCtx->importKey(cb->text(QClipboard::Clipboard).toAscii()); } - +void GpgWin::importKeyFromKeyServer() +{ + importDialog = new KeyServerImportDialog(this); + importDialog->show(); +} void GpgWin::importKeyFromFile() { QFile file; @@ -29,6 +29,7 @@ #include "keymgmt.h" #include "keydetailsdialog.h" #include "textedit.h" +#include "keyserverimportdialog.h" class QMainWindow; class QPlainTextEdit; @@ -72,6 +73,7 @@ public slots: void importKeyFromFile(); void importKeyFromEdit(); void importKeyFromClipboard(); + void importKeyFromKeyServer(); void importKeyDialog(); //void deleteSelectedKeys(); void appendSelectedKeys(); @@ -128,6 +130,8 @@ private: QAction *importKeyFromFileAct; QAction *importKeyFromEditAct; QAction *importKeyFromClipboardAct; + QAction *importKeyFromKeyServerAct; + QAction *appendSelectedKeysAct; QAction *showKeyDetailsAct; QAction *openKeyManagementAct; @@ -164,6 +168,7 @@ private: GpgME::Context *mCtx; QString iconPath; KeyMgmt *keyMgmt; + KeyServerImportDialog *importDialog; }; #endif // __GPGWIN_H__ diff --git a/keyserverimportdialog.cpp b/keyserverimportdialog.cpp new file mode 100644 index 0000000..76906f2 --- /dev/null +++ b/keyserverimportdialog.cpp @@ -0,0 +1,246 @@ +/* + * + * keyserverimportdialog.cpp + * + * Copyright 2008 gpg4usb-team <[email protected]> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301, USA. + */ + +#include <QtGui> +#include <QtNetwork> + +#include "keyserverimportdialog.h" + +KeyServerImportDialog::KeyServerImportDialog(QWidget *parent) + : QDialog(parent) +{ + //text = new QString(); + + closeButton = createButton(tr("&Close"), SLOT(close())); + importButton = createButton(tr("&Import"), SLOT(import())); + searchButton = createButton(tr("&Search"), SLOT(search())); + searchLineEdit = new QLineEdit(); + keyServerComboBox = createComboBox("http://pgp.mit.edu"); + + searchLabel = new QLabel(tr("Seacrh string:")); + keyServerLabel = new QLabel(tr("Keyserver:")); + message = new QLabel; + + createKeysTree(); + + QHBoxLayout *buttonsLayout = new QHBoxLayout; + buttonsLayout->addStretch(); + buttonsLayout->addWidget(importButton); + buttonsLayout->addWidget(closeButton); + + QGridLayout *mainLayout = new QGridLayout; + mainLayout->addWidget(searchLabel, 1, 0); + mainLayout->addWidget(searchLineEdit, 1, 1); + mainLayout->addWidget(searchButton,1, 2); + mainLayout->addWidget(keyServerLabel, 2, 0); + mainLayout->addWidget(keyServerComboBox, 2, 1); + mainLayout->addWidget(keysTree, 3, 0, 1, 3); + mainLayout->addWidget(message, 4, 0, 1, 3); + mainLayout->addLayout(buttonsLayout, 5, 0, 1, 3); + setLayout(mainLayout); + + setWindowTitle(tr("Import Keys from Keyserver")); + resize(700, 300); +} + +static void updateComboBox(QComboBox *comboBox) +{ + if (comboBox->findText(comboBox->currentText()) == -1) + comboBox->addItem(comboBox->currentText()); +} + +void KeyServerImportDialog::import() +{ + updateComboBox(keyServerComboBox); + message->setText("hallo"); + message->setAutoFillBackground(true); + QPalette filesFoundPalette = message->palette(); + filesFoundPalette.setColor(QPalette::Background, "#20ff20"); + message->setPalette(filesFoundPalette); +} + +void KeyServerImportDialog::showKeys(const QStringList &keys) +{ + /*for (int i = 0; i < keys.size(); ++i) { + QFile file(currentDir.absoluteFilePath(keys[i])); + qint64 size = QFileInfo(file).size(); + + QTableWidgetItem *fileNameItem = new QTableWidgetItem(keys[i]); + fileNameItem->setFlags(fileNameItem->flags() ^ Qt::ItemIsEditable); + QTableWidgetItem *sizeItem = new QTableWidgetItem(tr("%1 KB") + .arg(int((size + 1023) / 1024))); + sizeItem->setTextAlignment(Qt::AlignRight | Qt::AlignVCenter); + sizeItem->setFlags(sizeItem->flags() ^ Qt::ItemIsEditable); + + int row = keysTree->rowCount(); + keysTree->insertRow(row); + keysTree->setItem(row, 0, fileNameItem); + keysTree->setItem(row, 1, sizeItem); + } + message->setText(tr("%1 key(s) found").arg(keys.size()) + + (" (Double click on a key to import it)"));*/ +} + +QPushButton *KeyServerImportDialog::createButton(const QString &text, const char *member) +{ + QPushButton *button = new QPushButton(text); + connect(button, SIGNAL(clicked()), this, member); + return button; +} + +QComboBox *KeyServerImportDialog::createComboBox(const QString &text) +{ + QComboBox *comboBox = new QComboBox; + comboBox->setEditable(true); + comboBox->addItem(text); + comboBox->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); + return comboBox; +} + +void KeyServerImportDialog::createKeysTree() +{ + keysTree = new QTreeWidget(); + keysTree->setColumnCount(2); + + QStringList labels; + labels << tr("KeyID") << tr("UID"); + keysTree->setHeaderLabels(labels); + /*keysTree->setSelectionBehavior(QAbstractItemView::SelectRows); + keysTree->setHorizontalHeaderLabels(labels); + keysTree->horizontalHeader()->setResizeMode(0, QHeaderView::Stretch); + keysTree->verticalHeader()->hide(); + keysTree->setShowGrid(false);*/ + + //connect(keysTree, SIGNAL(cellActivated(int,int)), + // this, SLOT(importKeyOfItem(int,int))); +} + +void KeyServerImportDialog::importKeyOfItem(int row, int /* column */) +{ + /*QTableWidgetItem *item = keysTree->item(row, 0); + QDesktopServices::openUrl(QUrl::fromLocalFile(currentDir.absoluteFilePath(item->text()))); + */ +} + +/* + * newly added + */ +void KeyServerImportDialog::search() +{ + QString keyserver = keyServerComboBox->currentText(); + QString searchstring = searchLineEdit->text(); + + QUrl url = keyserver+":11371/pks/lookup?search="+searchstring+"&op=index&options=mr"; + reply = qnam.get(QNetworkRequest(url)); + qDebug() << "error while download"; + connect(reply, SIGNAL(finished()), + this, SLOT(searchFinished())); + qDebug() << "error while download"; +} + +void KeyServerImportDialog::setMessage(const QString &text, int type) +{ + +} + +void KeyServerImportDialog::searchFinished() +{ + QString firstLine = QString(reply->readLine(1024)); + + QVariant redirectionTarget = reply->attribute(QNetworkRequest::RedirectionTargetAttribute); + if (reply->error()) { + message->setAutoFillBackground(true); + QPalette filesFoundPalette = message->palette(); + filesFoundPalette.setColor(QPalette::Background, "#20ff20"); + message->setPalette(filesFoundPalette); + message->setText("Error while contacting keyserver!"); + } else { + qDebug() << "downloaded"; + } + + if (firstLine.contains("Error")) + { + QString text= QString(reply->readLine(1024)); + + if (text.contains("Too many responses")) { + message->setAutoFillBackground(true); + QPalette filesFoundPalette = message->palette(); + filesFoundPalette.setColor(QPalette::Background, "#20ff20"); + message->setPalette(filesFoundPalette); + message->setText("Too many responses from keyserver!"); + qDebug() << "Too many responses"; + } + if (text.contains("No keys found")) { + message->setAutoFillBackground(true); + QPalette filesFoundPalette = message->palette(); + filesFoundPalette.setColor(QPalette::Background, "#20ff20"); + message->setPalette(filesFoundPalette); + message->setText("No keys found containing the search string!"); + qDebug() << "No keys found"; + } + } else { + char buff[1024]; + QList <QTreeWidgetItem*> items; + while (reply->readLine(buff,sizeof(buff)) !=-1) { + QStringList line= QString(buff).split(":"); + qDebug() << line; + if (line[0] == "pub") { + QStringList line2 = QString(reply->readLine()).split(":"); + QStringList l; + l << line[1] << line2[1]; + qDebug() << "l:" << l; + items.append(new QTreeWidgetItem((QTreeWidget*) 0,l)); + +// keysTree->insertTopLevelItem(parentItem); + + } else { + if (line[0] == "uid") { + QStringList l; + l << "" << line[1]; + items.last()->addChild(new QTreeWidgetItem((QTreeWidget*) 0, l)); + } + } + + } + qDebug() << items.size(); + keysTree->insertTopLevelItems(0,items); + } + reply->deleteLater(); + reply = 0; + + //qDebug() << *text; + // TODO linebreak OS-unabhängig machen + //QStringList zeilen = QString( *text ).split('\n'); + + //qDebug() << zeilen.count(); + // use this line to get the key, if get request with keyid is sent + //QString key = zeilen[3]; + /* int count=-1; + foreach (QString zeile, zeilen) { + count++; + if (zeile.startsWith("pub:",Qt::CaseSensitive)) { + qDebug() << "pub"; + } + qDebug() << zeile; + }*/ +} + diff --git a/keyserverimportdialog.h b/keyserverimportdialog.h new file mode 100644 index 0000000..e23aaa2 --- /dev/null +++ b/keyserverimportdialog.h @@ -0,0 +1,83 @@ +/* + * + * keyserverimportdialog.h + * + * Copyright 2008 gpg4usb-team <[email protected]> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301, USA. + */ + +#ifndef KEYSERVERIMPORTDIALOG_H +#define KEYSERVERIMPORTDIALOG_H + +#include <QDialog> +#include <QDir> +#include <QNetworkAccessManager> +#include <QUrl> + +QT_BEGIN_NAMESPACE +class QNetworkReply; +class QComboBox; +class QLabel; +class QPushButton; +class QTableWidget; +class QTableWidgetItem; +class QLineEdit; +class QPalette; +class QTreeWidget; +class QTreeWidgetItem; +QT_END_NAMESPACE +struct key { + QString name; + int fingerprint; + QStringList uids; +}; + +class KeyServerImportDialog : public QDialog +{ + Q_OBJECT + +public: + KeyServerImportDialog(QWidget *parent = 0); + +private slots: + void import(); + void importKeyOfItem(int row, int column); + void searchFinished(); + void search(); + +private: + void showKeys(const QStringList &files); + QPushButton *createButton(const QString &text, const char *member); + QComboBox *createComboBox(const QString &text = QString()); + void createKeysTree(); + void setMessage(const QString &text, int type); + QLineEdit *searchLineEdit; + QComboBox *keyServerComboBox; + QLabel *searchLabel; + QLabel *keyServerLabel; + QLabel *message; + QPushButton *closeButton; + QPushButton *importButton; + QPushButton *searchButton; + QTreeWidget *keysTree; + QDir currentDir; + QUrl url; + QNetworkAccessManager qnam; + QNetworkReply *reply; + //QString *text; +}; +#endif |