aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authornils <nils@34ebc366-c3a9-4b3c-9f84-69acf7962910>2011-03-12 00:54:11 +0000
committernils <nils@34ebc366-c3a9-4b3c-9f84-69acf7962910>2011-03-12 00:54:11 +0000
commitf8b267c2c2f5dbe5f4a8bfdf352e2e664a52bac5 (patch)
treec14e2d5075305d9c0efa21d984c37ebade635612
parentupdated spanish translation (diff)
downloadgpg4usb-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.pro8
-rw-r--r--gpgwin.cpp15
-rw-r--r--gpgwin.h5
-rw-r--r--keyserverimportdialog.cpp246
-rw-r--r--keyserverimportdialog.h83
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
diff --git a/gpgwin.cpp b/gpgwin.cpp
index af23b45..981b97b 100644
--- a/gpgwin.cpp
+++ b/gpgwin.cpp
@@ -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;
diff --git a/gpgwin.h b/gpgwin.h
index c7495b6..07041ed 100644
--- a/gpgwin.h
+++ b/gpgwin.h
@@ -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