aboutsummaryrefslogtreecommitdiffstats
path: root/src/keylist.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/keylist.cpp')
-rw-r--r--src/keylist.cpp321
1 files changed, 321 insertions, 0 deletions
diff --git a/src/keylist.cpp b/src/keylist.cpp
new file mode 100644
index 0000000..cd01a2e
--- /dev/null
+++ b/src/keylist.cpp
@@ -0,0 +1,321 @@
+/*
+ * keylist.cpp
+ *
+ * Copyright 2008 gpg4usb-team <[email protected]>
+ *
+ * This file is part of gpg4usb.
+ *
+ * Gpg4usb 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 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Gpg4usb 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 gpg4usb. If not, see <http://www.gnu.org/licenses/>
+ */
+
+#include "keylist.h"
+
+KeyList::KeyList(GpgME::GpgContext *ctx, QWidget *parent)
+ : QWidget(parent)
+{
+ mCtx = ctx;
+
+ mKeyList = new QTableWidget(this);
+ mKeyList->setColumnCount(6);
+ mKeyList->verticalHeader()->hide();
+ mKeyList->setShowGrid(false);
+ mKeyList->setColumnWidth(0, 24);
+ mKeyList->setColumnWidth(1, 20);
+ mKeyList->sortByColumn(2, Qt::AscendingOrder);
+ mKeyList->setSelectionBehavior(QAbstractItemView::SelectRows);
+ // hide id and fingerprint of key
+ mKeyList->setColumnHidden(4, true);
+ mKeyList->setColumnHidden(5, true);
+
+ // tableitems not editable
+ mKeyList->setEditTriggers(QAbstractItemView::NoEditTriggers);
+ // no focus (rectangle around tableitems)
+ // may be it should focus on whole row
+ mKeyList->setFocusPolicy(Qt::NoFocus);
+
+ mKeyList->setAlternatingRowColors(true);
+
+ QStringList labels;
+ labels << "" << "" << tr("Name") << tr("EMail") << "id" << "fpr";
+ mKeyList->setHorizontalHeaderLabels(labels);
+ mKeyList->horizontalHeader()->setStretchLastSection(true);
+
+ QVBoxLayout *layout = new QVBoxLayout;
+ layout->addWidget(mKeyList);
+ layout->setContentsMargins(0, 0, 0, 0);
+ layout->setSpacing(3);
+ setLayout(layout);
+
+ popupMenu = new QMenu(this);
+ connect(mCtx, SIGNAL(signalKeyDBChanged()), this, SLOT(slotRefresh()));
+ setAcceptDrops(true);
+ slotRefresh();
+}
+
+void KeyList::slotRefresh()
+{
+ QStringList *keyList;
+ keyList = getChecked();
+ // while filling the table, sort enabled causes errors
+ mKeyList->setSortingEnabled(false);
+ mKeyList->clearContents();
+
+ GpgKeyList keys = mCtx->listKeys();
+ mKeyList->setRowCount(keys.size());
+
+ int row = 0;
+ GpgKeyList::iterator it = keys.begin();
+ while (it != keys.end()) {
+
+ QTableWidgetItem *tmp0 = new QTableWidgetItem();
+ tmp0->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsSelectable);
+ tmp0->setCheckState(Qt::Unchecked);
+ mKeyList->setItem(row, 0, tmp0);
+
+ if (it->privkey) {
+ QTableWidgetItem *tmp1 = new QTableWidgetItem(QIcon(":kgpg_key2.png"), "");
+ mKeyList->setItem(row, 1, tmp1);
+ }
+ QTableWidgetItem *tmp2 = new QTableWidgetItem(it->name);
+ tmp2->setToolTip(it->name);
+ mKeyList->setItem(row, 2, tmp2);
+ QTableWidgetItem *tmp3 = new QTableWidgetItem(it->email);
+ tmp3->setToolTip(it->email);
+ // strike out expired keys
+ if(it->expired || it->revoked) {
+ QFont strike = tmp2->font();
+ strike.setStrikeOut(true);
+ tmp2->setFont(strike);
+ tmp3->setFont(strike);
+ }
+ mKeyList->setItem(row, 3, tmp3);
+ QTableWidgetItem *tmp4 = new QTableWidgetItem(it->id);
+ mKeyList->setItem(row, 4, tmp4);
+ QTableWidgetItem *tmp5 = new QTableWidgetItem(it->fpr);
+ mKeyList->setItem(row, 5, tmp5);
+
+
+ it++;
+ ++row;
+ }
+ mKeyList->setSortingEnabled(true);
+ setChecked(keyList);
+}
+
+QStringList *KeyList::getChecked()
+{
+ QStringList *ret = new QStringList();
+ for (int i = 0; i < mKeyList->rowCount(); i++) {
+ if (mKeyList->item(i, 0)->checkState() == Qt::Checked) {
+ *ret << mKeyList->item(i, 4)->text();
+ }
+ }
+ return ret;
+}
+
+QStringList *KeyList::getAllPrivateKeys()
+{
+ QStringList *ret = new QStringList();
+ for (int i = 0; i < mKeyList->rowCount(); i++) {
+ if (mKeyList->item(i, 1)) {
+ *ret << mKeyList->item(i, 4)->text();
+ }
+ }
+ return ret;
+}
+
+QStringList *KeyList::getPrivateChecked()
+{
+ QStringList *ret = new QStringList();
+ for (int i = 0; i < mKeyList->rowCount(); i++) {
+ if ((mKeyList->item(i, 0)->checkState() == Qt::Checked) && (mKeyList->item(i, 1))) {
+ *ret << mKeyList->item(i, 4)->text();
+ }
+ }
+ return ret;
+}
+
+void KeyList::setChecked(QStringList *keyIds)
+{
+ if (!keyIds->isEmpty()) {
+ for (int i = 0; i < mKeyList->rowCount(); i++) {
+ if (keyIds->contains(mKeyList->item(i, 4)->text())) {
+ mKeyList->item(i, 0)->setCheckState(Qt::Checked);
+ }
+ }
+ }
+}
+
+QStringList *KeyList::getSelected()
+{
+ QStringList *ret = new QStringList();
+
+ for (int i = 0; i < mKeyList->rowCount(); i++) {
+ if (mKeyList->item(i, 0)->isSelected() == 1) {
+ *ret << mKeyList->item(i, 4)->text();
+ }
+ }
+ return ret;
+}
+
+bool KeyList::containsPrivateKeys()
+{
+ for (int i = 0; i < mKeyList->rowCount(); i++) {
+ if (mKeyList->item(i, 1)) {
+ return true;
+ }
+ }
+ return false;
+}
+
+void KeyList::setColumnWidth(int row, int size)
+{
+ mKeyList->setColumnWidth(row, size);
+}
+
+void KeyList::contextMenuEvent(QContextMenuEvent *event)
+{
+ popupMenu->exec(event->globalPos());
+}
+
+void KeyList::addMenuAction(QAction *act)
+{
+ popupMenu->addAction(act);
+}
+
+void KeyList::dropEvent(QDropEvent* event)
+{
+// importKeyDialog();
+ QSettings settings;
+
+ QDialog *dialog = new QDialog();
+
+ dialog->setWindowTitle(tr("Import Keys"));
+ QLabel *label;
+ label = new QLabel(tr("You've dropped something on the keylist.\n gpg4usb will now try to import key(s).")+"\n");
+
+ // "always import keys"-CheckBox
+ QCheckBox *checkBox = new QCheckBox(tr("Always import without bothering."));
+ if (settings.value("general/confirmImportKeys").toBool()) checkBox->setCheckState(Qt::Unchecked);
+
+ // Buttons for ok and cancel
+ QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel);
+ connect(buttonBox, SIGNAL(accepted()), dialog, SLOT(accept()));
+ connect(buttonBox, SIGNAL(rejected()), dialog, SLOT(reject()));
+
+ QVBoxLayout *vbox = new QVBoxLayout();
+ vbox->addWidget(label);
+ vbox->addWidget(checkBox);
+ vbox->addWidget(buttonBox);
+
+ dialog->setLayout(vbox);
+
+ if (settings.value("general/confirmImportKeys",Qt::Checked).toBool())
+ {
+ dialog->exec();
+ if (dialog->result() == QDialog::Rejected) {
+ return;
+ }
+ if (checkBox->isChecked()){
+ settings.setValue("general/confirmImportKeys", false);
+ } else {
+ settings.setValue("general/confirmImportKeys", true);
+
+ }
+ }
+
+ if (event->mimeData()->hasUrls())
+ {
+ foreach (QUrl tmp, event->mimeData()->urls())
+ {
+ QFile file;
+ file.setFileName(tmp.toLocalFile());
+ if (!file.open(QIODevice::ReadOnly)) {
+ qDebug() << tr("Couldn't Open File: ") + tmp.toString();
+ }
+ QByteArray inBuffer = file.readAll();
+ this->importKeys(inBuffer);
+ file.close();
+ }
+ } else {
+ QByteArray inBuffer(event->mimeData()->text().toUtf8());
+ this->importKeys(inBuffer);
+ }
+}
+
+void KeyList::dragEnterEvent(QDragEnterEvent *event)
+{
+ event->acceptProposedAction();
+}
+
+/** set background color for Keys and put them to top
+ *
+ */
+void KeyList::markKeys(QStringList *keyIds)
+{
+ foreach(QString id, *keyIds) {
+ qDebug() << "marked: " << id;
+ }
+}
+
+void KeyList::importKeys(QByteArray inBuffer)
+{
+ GpgImportInformation result = mCtx->importKey(inBuffer);
+ new KeyImportDetailDialog(mCtx, result, this);
+}
+
+void KeyList::uploadKeyToServer(QByteArray *keys)
+{
+ QUrl reqUrl("http://localhost:11371/pks/add");
+ qnam = new QNetworkAccessManager(this);
+
+ QUrl params;
+ keys->replace("\n", "%0D%0A")
+ .replace("(", "%28")
+ .replace(")", "%29")
+ .replace("/", "%2F")
+ .replace(":", "%3A")
+ .replace("+","%2B")
+ .replace(' ', '+');
+
+ params.addEncodedQueryItem("keytext", *keys);
+ QNetworkRequest req(reqUrl);
+
+ req.setHeader(QNetworkRequest::ContentTypeHeader,"application/x-www-form-urlencoded");
+
+ QNetworkReply *reply = qnam->post(req,params.encodedQuery());
+ connect(reply, SIGNAL(finished()),
+ this, SLOT(uploadFinished()));
+ qDebug() << "REQURL: " << reqUrl;
+ qDebug() << "PARAMS.ENCODED: " << params.toEncoded();
+}
+
+void KeyList::uploadFinished()
+{
+ QNetworkReply *reply = qobject_cast<QNetworkReply *>(sender());
+
+ QByteArray response = reply->readAll();
+ qDebug() << "RESPNOSE: " << response.data();
+ //reply->readAll();
+ qDebug() << "ERROR: " << reply->error();
+ if (reply->error()) {
+ qDebug() << "Error while contacting keyserver!";
+ return;
+ } else {
+ qDebug() << "Success while contacting keyserver!";
+ }
+
+ reply->deleteLater();
+ reply = 0;
+}