diff options
Diffstat (limited to 'src/keymgmt.cpp')
-rwxr-xr-x | src/keymgmt.cpp | 289 |
1 files changed, 289 insertions, 0 deletions
diff --git a/src/keymgmt.cpp b/src/keymgmt.cpp new file mode 100755 index 0000000..c17fd86 --- /dev/null +++ b/src/keymgmt.cpp @@ -0,0 +1,289 @@ +/* + * + * keymgmt.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 "keymgmt.h" + +KeyMgmt::KeyMgmt(GpgME::GpgContext *ctx, QWidget *parent ) : QMainWindow(parent) +{ + mCtx = ctx; + + /* the list of Keys available*/ + mKeyList = new KeyList(mCtx); + mKeyList->setColumnWidth(2, 250); + mKeyList->setColumnWidth(3, 250); + setCentralWidget(mKeyList); + + createActions(); + createMenus(); + createToolBars(); + connect(this,SIGNAL(signalStatusBarChanged(QString)),this->parent(),SLOT(slotSetStatusBarText(QString))); + + /* Restore the iconstyle */ + QSettings settings; + settings.sync(); + QSize iconSize = settings.value("toolbar/iconsize", QSize(32, 32)).toSize(); + Qt::ToolButtonStyle buttonStyle = static_cast<Qt::ToolButtonStyle>(settings.value("toolbar/iconstyle", Qt::ToolButtonTextUnderIcon).toUInt()); + this->setIconSize(iconSize); + this->setToolButtonStyle(buttonStyle); + + // state sets pos & size of dock-widgets + this->restoreState(settings.value("keymgmt/windowState").toByteArray()); + + // Restore window size & location + if (settings.value("window/windowSave").toBool()) { + QPoint pos = settings.value("keymgmt/pos", QPoint(100, 100)).toPoint(); + QSize size = settings.value("keymgmt/size", QSize(800, 450)).toSize(); + this->resize(size); + this->move(pos); + } else { + this->resize(QSize(800, 400)); + } + + setWindowTitle(tr("Keymanagement")); + mKeyList->addMenuAction(deleteSelectedKeysAct); + mKeyList->addMenuAction(showKeyDetailsAct); +} + +void KeyMgmt::createActions() +{ + closeAct = new QAction(tr("&Close Key Management"), this); + closeAct->setShortcut(tr("Ctrl+Q")); + closeAct->setIcon(QIcon(":exit.png")); + closeAct->setToolTip(tr("Close Key Management")); + connect(closeAct, SIGNAL(triggered()), this, SLOT(close())); + + importKeyFromFileAct = new QAction(tr("&File"), this); + importKeyFromFileAct->setIcon(QIcon(":import_key_from_file.png")); + importKeyFromFileAct->setToolTip(tr("Import New Key From File")); + connect(importKeyFromFileAct, SIGNAL(triggered()), this, SLOT(slotImportKeyFromFile())); + + importKeyFromClipboardAct = new QAction(tr("&Clipboard"), this); + importKeyFromClipboardAct->setIcon(QIcon(":import_key_from_clipboard.png")); + importKeyFromClipboardAct->setToolTip(tr("Import New Key From Clipboard")); + connect(importKeyFromClipboardAct, SIGNAL(triggered()), this, SLOT(slotImportKeyFromClipboard())); + + importKeyFromKeyServerAct = new QAction(tr("&Keyserver"), this); + importKeyFromKeyServerAct->setIcon(QIcon(":import_key_from_server.png")); + importKeyFromKeyServerAct->setToolTip(tr("Import New Key From Keyserver")); + connect(importKeyFromKeyServerAct, SIGNAL(triggered()), this, SLOT(slotImportKeyFromKeyServer())); + + exportKeyToClipboardAct = new QAction(tr("Export To &Clipboard"), this); + exportKeyToClipboardAct->setIcon(QIcon(":export_key_to_clipboard.png")); + exportKeyToClipboardAct->setToolTip(tr("Export Selected Key(s) To Clipboard")); + connect(exportKeyToClipboardAct, SIGNAL(triggered()), this, SLOT(slotExportKeyToClipboard())); + + exportKeyToFileAct = new QAction(tr("Export To &File"), this); + exportKeyToFileAct->setIcon(QIcon(":export_key_to_file.png")); + exportKeyToFileAct->setToolTip(tr("Export Selected Key(s) To File")); + connect(exportKeyToFileAct, SIGNAL(triggered()), this, SLOT(slotExportKeyToFile())); + + deleteSelectedKeysAct = new QAction(tr("Delete Selected Key(s)"), this); + deleteSelectedKeysAct->setToolTip(tr("Delete the Selected keys")); + connect(deleteSelectedKeysAct, SIGNAL(triggered()), this, SLOT(slotDeleteSelectedKeys())); + + deleteCheckedKeysAct = new QAction(tr("Delete Checked Key(s)"), this); + deleteCheckedKeysAct->setToolTip(tr("Delete the Checked keys")); + deleteCheckedKeysAct->setIcon(QIcon(":button_cancel.png")); + connect(deleteCheckedKeysAct, SIGNAL(triggered()), this, SLOT(slotDeleteCheckedKeys())); + + generateKeyDialogAct = new QAction(tr("Generate Key"), this); + generateKeyDialogAct->setToolTip(tr("Generate New Key")); + generateKeyDialogAct->setIcon(QIcon(":key_generate.png")); + connect(generateKeyDialogAct, SIGNAL(triggered()), this, SLOT(slotGenerateKeyDialog())); + + showKeyDetailsAct = new QAction(tr("Show Keydetails"), this); + showKeyDetailsAct->setToolTip(tr("Show Details for this Key")); + connect(showKeyDetailsAct, SIGNAL(triggered()), this, SLOT(slotShowKeyDetails())); +} + +void KeyMgmt::createMenus() +{ + fileMenu = menuBar()->addMenu(tr("&File")); + fileMenu->addAction(closeAct); + + keyMenu = menuBar()->addMenu(tr("&Key")); + importKeyMenu = keyMenu->addMenu(tr("&Import Key From...")); + importKeyMenu->addAction(importKeyFromFileAct); + importKeyMenu->addAction(importKeyFromClipboardAct); + importKeyMenu->addAction(importKeyFromKeyServerAct); + keyMenu->addAction(exportKeyToFileAct); + keyMenu->addAction(exportKeyToClipboardAct); + keyMenu->addSeparator(); + keyMenu->addAction(deleteCheckedKeysAct); + keyMenu->addAction(generateKeyDialogAct); +} + +void KeyMgmt::createToolBars() +{ + QToolBar *keyToolBar = addToolBar(tr("Key")); + keyToolBar->setObjectName("keytoolbar"); + + // add button with popup menu for import + QToolButton* toolButton = new QToolButton(this); + toolButton->setMenu(importKeyMenu); + toolButton->setPopupMode(QToolButton::InstantPopup); + toolButton->setIcon(QIcon(":key_import.png")); + toolButton->setToolTip(tr("Import key")); + toolButton->setText(tr("Import key from")); + toolButton->setToolButtonStyle(Qt::ToolButtonTextUnderIcon); + keyToolBar->addWidget(toolButton); + + keyToolBar->addSeparator(); + keyToolBar->addAction(deleteCheckedKeysAct); + keyToolBar->addSeparator(); + keyToolBar->addAction(exportKeyToFileAct); + keyToolBar->addAction(exportKeyToClipboardAct); + +} + +void KeyMgmt::slotImportKeys(QByteArray inBuffer) +{ + GpgImportInformation result = mCtx->importKey(inBuffer); + new KeyImportDetailDialog(mCtx, result, this); + +} + +void KeyMgmt::slotImportKeyFromFile() +{ + QString fileName = QFileDialog::getOpenFileName(this, tr("Open Key"), "", tr("Key Files") + " (*.asc *.txt);;"+tr("Keyring files")+" (*.gpg);;All Files (*)"); + if (! fileName.isNull()) { + QFile file; + file.setFileName(fileName); + if (!file.open(QIODevice::ReadOnly)) { + qDebug() << tr("Couldn't Open File: ") + fileName; + return; + } + QByteArray inBuffer = file.readAll(); + slotImportKeys(inBuffer); + file.close(); + } +} + +void KeyMgmt::slotImportKeyFromKeyServer() +{ + importDialog = new KeyServerImportDialog(mCtx, mKeyList, this); + importDialog->show(); +} + +void KeyMgmt::slotImportKeyFromClipboard() +{ + QClipboard *cb = QApplication::clipboard(); + slotImportKeys(cb->text(QClipboard::Clipboard).toAscii()); +} + +void KeyMgmt::slotDeleteSelectedKeys() +{ + deleteKeysWithWarning(mKeyList->getSelected()); +} + +void KeyMgmt::slotDeleteCheckedKeys() +{ + deleteKeysWithWarning(mKeyList->getChecked()); +} + +void KeyMgmt::deleteKeysWithWarning(QStringList *uidList) +{ + /** + * TODO: Different Messages for private/public key, check if + * more than one selected... compare to seahorse "delete-dialog" + */ + + if (uidList->isEmpty()) { + return; + } + QString keynames; + foreach (QString uid, *uidList) { + keynames.append(QString::fromUtf8(mCtx->getKeyDetails(uid)->uids->name)); + keynames.append("<i> <"); + keynames.append(QString::fromUtf8(mCtx->getKeyDetails(uid)->uids->email)); + keynames.append("> </i><br/>"); + } + + int ret = QMessageBox::warning(this, tr("Deleting Keys"), + "<b>"+tr("Are you sure that you want to delete the following keys?")+"</b><br/><br/>"+keynames+ + +"<br/>"+tr("The action can not be undone."), + QMessageBox::No | QMessageBox::Yes); + + if (ret == QMessageBox::Yes) { + mCtx->deleteKeys(uidList); + } +} + +void KeyMgmt::slotShowKeyDetails() +{ + if (mKeyList->getSelected()->isEmpty()) { + return; + } + + // TODO: first...? + gpgme_key_t key = mCtx->getKeyDetails(mKeyList->getSelected()->first()); + + new KeyDetailsDialog(mCtx, key); +} + +void KeyMgmt::slotExportKeyToFile() +{ + QByteArray *keyArray = new QByteArray(); + if (!mCtx->exportKeys(mKeyList->getChecked(), keyArray)) { + return; + } + gpgme_key_t key = mCtx->getKeyDetails(mKeyList->getChecked()->first()); + QString fileString = QString::fromUtf8(key->uids->name) + " " + QString::fromUtf8(key->uids->email) + "(" + QString(key->subkeys->keyid)+ ")_pub.asc"; + + QString fileName = QFileDialog::getSaveFileName(this, tr("Export Key To File"), fileString, tr("Key Files") + " (*.asc *.txt);;All Files (*)"); + QFile file(fileName); + if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) + return; + QTextStream stream(&file); + stream << *keyArray; + file.close(); + delete keyArray; + emit signalStatusBarChanged(QString(tr("key(s) exported"))); +} + +void KeyMgmt::slotExportKeyToClipboard() +{ + QByteArray *keyArray = new QByteArray(); + QClipboard *cb = QApplication::clipboard(); + if (!mCtx->exportKeys(mKeyList->getChecked(), keyArray)) { + return; + } + cb->setText(*keyArray); + delete keyArray; +} + +void KeyMgmt::slotGenerateKeyDialog() +{ + KeyGenDialog *keyGenDialog = new KeyGenDialog(mCtx,this); + keyGenDialog->show(); +} + +void KeyMgmt::closeEvent(QCloseEvent *event) +{ + QSettings settings; + //settings.setValue("geometry", saveGeometry()); + settings.setValue("keymgmt/windowState", saveState()); + settings.setValue("keymgmt/pos", pos()); + settings.setValue("keymgmt/size", size()); + + QMainWindow::closeEvent(event); +} |