kde-extraapps/kgpg/keysmanager.cpp

2861 lines
85 KiB
C++

/*
* Copyright (C) 2002 Jean-Baptiste Mardelle <bj@altern.org>
* Copyright (C) 2007,2008,2009,2010,2011,2012,2013
* Rolf Eike Beer <kde@opensource.sf-tec.de>
* Copyright (C) 2011 Luis Ángel Fernández Fernández <laffdez@gmail.com>
*/
/***************************************************************************
* *
* 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. *
* *
***************************************************************************/
#include "keysmanager.h"
#include "caff.h"
#include "core/images.h"
#include "core/kgpgkey.h"
#include "detailedconsole.h"
#include "groupedit.h"
#include "keyadaptor.h"
#include "keyexport.h"
#include "keyinfodialog.h"
#include "keyservers.h"
#include "keytreeview.h"
#include "kgpg.h"
#include "kgpgchangekey.h"
#include "kgpgkeygenerate.h"
#include "kgpgoptions.h"
#include "kgpgrevokewidget.h"
#include "kgpgsettings.h"
#include "newkey.h"
#include "selectpublickeydialog.h"
#include "selectsecretkey.h"
#include "sourceselect.h"
#include "editor/kgpgeditor.h"
#include "editor/kgpgtextedit.h"
#include "model/keylistproxymodel.h"
#include "transactions/kgpgaddphoto.h"
#include "transactions/kgpgadduid.h"
#include "transactions/kgpgdecrypt.h"
#include "transactions/kgpgdelkey.h"
#include "transactions/kgpgdelsign.h"
#include "transactions/kgpgdeluid.h"
#include "transactions/kgpgencrypt.h"
#include "transactions/kgpgexport.h"
#include "transactions/kgpggeneratekey.h"
#include "transactions/kgpggeneraterevoke.h"
#include "transactions/kgpgimport.h"
#include "transactions/kgpgkeyservergettransaction.h"
#include "transactions/kgpgprimaryuid.h"
#include "transactions/kgpgsignkey.h"
#include "transactions/kgpgsignuid.h"
#include "transactions/kgpgtransactionjob.h"
#include <akonadi/contact/contacteditor.h>
#include <akonadi/contact/contacteditordialog.h>
#include <akonadi/contact/contactsearchjob.h>
#include <KAction>
#include <KActionCollection>
#include <KDebug>
#include <KFileDialog>
#include <KFind>
#include <KFindDialog>
#include <KIcon>
#include <KInputDialog>
#include <KLineEdit>
#include <KLocale>
#include <KMenu>
#include <KMessageBox>
#include <KMimeType>
#include <KMimeTypeTrader>
#include <KProcess>
#include <KRecentFilesAction>
#include <KRun>
#include <KSelectAction>
#include <KService>
#include <KShortcut>
#include <KStandardAction>
#include <KStandardDirs>
#include <KStandardShortcut>
#include <KStatusBar>
#include <KStatusNotifierItem>
#include <KToggleAction>
#include <KToolBar>
#include <KToolInvocation>
#include <KUniqueApplication>
#include <KUrl>
#include <KVBox>
#include <QApplication>
#include <QClipboard>
#include <QDesktopWidget>
#include <QDir>
#include <QEvent>
#include <QFile>
#include <QKeySequence>
#include <QLabel>
#include <QList>
#include <QMetaObject>
#include <QPainter>
#include <QPrintDialog>
#include <QPrinter>
#include <QProcess>
#include <QTextStream>
#include <QWidget>
#include <QtDBus/QtDBus>
#include <kabc/addresseelist.h>
// #include <kabc/key.h> TODO
#include <kio/global.h>
#include <kjobtrackerinterface.h>
#include <ktip.h>
#include <solid/networking.h>
using namespace KgpgCore;
KeysManager::KeysManager(QWidget *parent)
: KXmlGuiWindow(parent),
imodel(new KGpgItemModel(this)),
m_adduid(NULL),
m_genkey(NULL),
m_delkey(NULL),
terminalkey(NULL),
m_trayicon(NULL)
{
new KeyAdaptor(this);
QDBusConnection::sessionBus().registerObject(QLatin1String( "/KeyInterface" ), this);
setAttribute(Qt::WA_DeleteOnClose, false);
setWindowTitle(i18n("Key Management"));
KStandardAction::quit(this, SLOT(quitApp()), actionCollection());
actionCollection()->addAction(KStandardAction::Preferences, QLatin1String( "options_configure" ), this, SLOT(showOptions()));
openEditor = actionCollection()->addAction(QLatin1String("kgpg_editor"), this, SLOT(slotOpenEditor()));
openEditor->setIcon(KIcon( QLatin1String( "accessories-text-editor" )));
openEditor->setText(i18n("&Open Editor"));
kserver = actionCollection()->addAction( QLatin1String("key_server"), this, SLOT(showKeyServer()));
kserver->setText( i18n("&Key Server Dialog") );
kserver->setIcon( KIcon( QLatin1String( "network-server" )) );
goToDefaultKey = actionCollection()->addAction(QLatin1String("go_default_key"), this, SLOT(slotGotoDefaultKey()));
goToDefaultKey->setIcon(KIcon( QLatin1String( "go-home" )));
goToDefaultKey->setText(i18n("&Go to Default Key"));
goToDefaultKey->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_Home));
s_kgpgEditor = new KgpgEditor(this, imodel, Qt::Dialog);
s_kgpgEditor->setAttribute(Qt::WA_DeleteOnClose, false);
// this must come after kserver, preferences, and openEditor are created
// because they are used to set up the tray icon context menu
readOptions();
if (showTipOfDay)
installEventFilter(this);
KAction *action;
action = actionCollection()->addAction(QLatin1String("help_tipofday"), this, SLOT(slotTip()));
action->setIcon( KIcon( QLatin1String( "help-hint" )) );
action->setText( i18n("Tip of the &Day") );
action = actionCollection()->addAction(QLatin1String("gpg_man"), this, SLOT(slotManpage()));
action->setText( i18n("View GnuPG Manual") );
action->setIcon( KIcon( QLatin1String( "help-contents" )) );
action = actionCollection()->addAction(QLatin1String("key_refresh"), this, SLOT(refreshkey()));
action->setIcon(KIcon( QLatin1String( "view-refresh" )));
action->setText(i18n("&Refresh List"));
action->setShortcuts(KStandardShortcut::reload());
longId = actionCollection()->add<KToggleAction>(QLatin1String("show_long_keyid"), this, SLOT(slotShowLongId(bool)));
longId->setText(i18n("Show &Long Key Id"));
longId->setChecked(KGpgSettings::showLongKeyId());
QAction *infoKey = actionCollection()->addAction(QLatin1String("key_info"), this, SLOT(keyproperties()));
infoKey->setIcon(KIcon( QLatin1String( "document-properties-key" )));
infoKey->setText(i18n("K&ey Properties"));
QAction *openKeyUrl = actionCollection()->addAction(QLatin1String("key_url"), this, SLOT(slotOpenKeyUrl()));
openKeyUrl->setIcon(KIcon(QLatin1String("applications-internet")));
openKeyUrl->setText(i18n("&Open Key URL"));
editKey = actionCollection()->addAction(QLatin1String("key_edit"), this, SLOT(slotedit()));
editKey->setIcon(KIcon( QLatin1String( "utilities-terminal" )));
editKey->setText(i18n("Edit Key in &Terminal"));
editKey->setShortcut(QKeySequence(Qt::ALT + Qt::Key_Return));
KAction *generateKey = actionCollection()->addAction(QLatin1String("key_gener"), this, SLOT(slotGenerateKey()));
generateKey->setIcon(KIcon( QLatin1String( "key-generate-pair" )));
generateKey->setText(i18n("&Generate Key Pair..."));
generateKey->setShortcuts(KStandardShortcut::shortcut(KStandardShortcut::New));
exportPublicKey = actionCollection()->addAction(QLatin1String("key_export"), this, SLOT(slotexport()));
exportPublicKey->setIcon(KIcon( QLatin1String( "document-export-key" )));
exportPublicKey->setShortcuts(KStandardShortcut::shortcut(KStandardShortcut::Copy));
KAction *importKey = actionCollection()->addAction(QLatin1String("key_import"), this, SLOT(slotPreImportKey()));
importKey->setIcon(KIcon( QLatin1String( "document-import-key" )));
importKey->setText(i18n("&Import Key..."));
importKey->setShortcuts(KStandardShortcut::shortcut(KStandardShortcut::Paste));
m_sendEmail = actionCollection()->addAction(QLatin1String("send_mail"), this, SLOT(slotSendEmail()));
m_sendEmail->setIcon(KIcon(QLatin1String("mail-send")));
m_sendEmail->setText(i18n("Send Ema&il"));
QAction *newContact = actionCollection()->addAction(QLatin1String("add_kab"), this, SLOT(addToKAB()));
newContact->setIcon(KIcon( QLatin1String( "contact-new" )));
newContact->setText(i18n("&Create New Contact in Address Book"));
createGroup = actionCollection()->addAction(QLatin1String("create_group"), this, SLOT(createNewGroup()));
createGroup->setIcon(Images::group());
editCurrentGroup = actionCollection()->addAction(QLatin1String("edit_group"), this, SLOT(editGroup()));
editCurrentGroup->setText(i18n("&Edit Group..."));
delGroup = actionCollection()->addAction(QLatin1String("delete_group"), this, SLOT(deleteGroup()));
delGroup->setText(i18n("&Delete Group"));
delGroup->setIcon(KIcon( QLatin1String( "edit-delete" )));
m_groupRename = actionCollection()->addAction(QLatin1String("rename_group"), this, SLOT(renameGroup()));
m_groupRename->setText(i18n("&Rename Group"));
m_groupRename->setIcon(KIcon( QLatin1String( "edit-rename" )));
m_groupRename->setShortcut(QKeySequence(Qt::Key_F2));
deleteKey = actionCollection()->addAction(QLatin1String("key_delete"), this, SLOT(confirmdeletekey()));
deleteKey->setIcon(KIcon( QLatin1String( "edit-delete" )));
deleteKey->setShortcut(QKeySequence(Qt::Key_Delete));
setDefaultKey = actionCollection()->addAction(QLatin1String("key_default"), this, SLOT(slotSetDefKey()));
setDefaultKey->setText(i18n("Set as De&fault Key"));
QAction *addPhoto = actionCollection()->addAction(QLatin1String("add_photo"), this, SLOT(slotAddPhoto()));
addPhoto->setText(i18n("&Add Photo..."));
QAction *addUid = actionCollection()->addAction(QLatin1String("add_uid"), this, SLOT(slotAddUid()));
addUid->setText(i18n("&Add User Id..."));
QAction *exportSecretKey = actionCollection()->addAction(QLatin1String("key_sexport"), this, SLOT(slotexportsec()));
exportSecretKey->setText(i18n("Export Secret Key..."));
QAction *deleteKeyPair = actionCollection()->addAction(QLatin1String("key_pdelete"), this, SLOT(deleteseckey()));
deleteKeyPair->setText(i18n("Delete Key Pair"));
deleteKeyPair->setIcon(KIcon( QLatin1String( "edit-delete" )));
m_revokeKey = actionCollection()->addAction(QLatin1String("key_revoke"), this, SLOT(revokeWidget()));
m_revokeKey->setText(i18n("Revoke Key..."));
QAction *regeneratePublic = actionCollection()->addAction(QLatin1String("key_regener"), this, SLOT(slotregenerate()));
regeneratePublic->setText(i18n("&Regenerate Public Key"));
delUid = actionCollection()->addAction(QLatin1String("del_uid"), this, SLOT(slotDelUid()));
delUid->setIcon(KIcon( QLatin1String( "edit-delete" )));
setPrimUid = actionCollection()->addAction(QLatin1String("prim_uid"), this, SLOT(slotPrimUid()));
setPrimUid->setText(i18n("Set User Id as &Primary"));
QAction *openPhoto = actionCollection()->addAction(QLatin1String("key_photo"), this, SLOT(slotShowPhoto()));
openPhoto->setIcon(KIcon( QLatin1String( "image-x-generic" )));
openPhoto->setText(i18n("&Open Photo"));
QAction *deletePhoto = actionCollection()->addAction(QLatin1String("delete_photo"), this, SLOT(slotDeletePhoto()));
deletePhoto->setIcon(KIcon( QLatin1String( "edit-delete" )));
deletePhoto->setText(i18n("&Delete Photo"));
delSignKey = actionCollection()->addAction(QLatin1String("key_delsign"), this, SLOT(delsignkey()));
delSignKey->setIcon(KIcon( QLatin1String( "edit-delete" )));
delSignKey->setEnabled(false);
importAllSignKeys = actionCollection()->addAction(QLatin1String("key_importallsign"), this, SLOT(importallsignkey()));
importAllSignKeys->setIcon(KIcon( QLatin1String( "document-import" )));
importAllSignKeys->setText(i18n("Import &Missing Signatures From Keyserver"));
refreshKey = actionCollection()->addAction(QLatin1String("key_server_refresh"), this, SLOT(refreshKeyFromServer()));
refreshKey->setIcon(KIcon( QLatin1String( "view-refresh" )));
signKey = actionCollection()->addAction(QLatin1String("key_sign"), this, SLOT(signkey()));
signKey->setIcon(KIcon( QLatin1String( "document-sign-key" )));
signUid = actionCollection()->addAction(QLatin1String("key_sign_uid"), this, SLOT(signuid()));
signUid->setIcon(KIcon( QLatin1String( "document-sign-key" )));
signMailUid = actionCollection()->addAction(QLatin1String("key_sign_mail_uid"), this, SLOT(caff()));
signMailUid->setIcon(KIcon( QLatin1String( "document-sign-key" )));
importSignatureKey = actionCollection()->addAction(QLatin1String("key_importsign"), this, SLOT(preimportsignkey()));
importSignatureKey->setIcon(KIcon( QLatin1String( "document-import-key" )));
sTrust = actionCollection()->add<KToggleAction>(QLatin1String("show_trust"), this, SLOT(slotShowTrust()));
sTrust->setText(i18n("Trust"));
sSize = actionCollection()->add<KToggleAction>(QLatin1String("show_size"), this, SLOT(slotShowSize()));
sSize->setText(i18n("Size"));
sCreat = actionCollection()->add<KToggleAction>(QLatin1String("show_creat"), this, SLOT(slotShowCreation()));
sCreat->setText(i18n("Creation"));
sExpi = actionCollection()->add<KToggleAction>(QLatin1String("show_expi"), this, SLOT(slotShowExpiration()));
sExpi->setText(i18n("Expiration"));
photoProps = actionCollection()->add<KSelectAction>(QLatin1String( "photo_settings" ));
photoProps->setIcon(KIcon( QLatin1String( "image-x-generic" )));
photoProps->setText(i18n("&Photo ID's"));
// Keep the list in kgpg.kcfg in sync with this one!
QStringList list;
list.append(i18n("Disable"));
list.append(i18nc("small picture", "Small"));
list.append(i18nc("medium picture", "Medium"));
list.append(i18nc("large picture", "Large"));
photoProps->setItems(list);
trustProps = actionCollection()->add<KSelectAction>(QLatin1String( "trust_filter_settings" ));
trustProps->setText(i18n("Minimum &Trust"));
QStringList tlist;
tlist.append(i18nc("no filter: show all keys", "&None"));
tlist.append(i18nc("show only active keys", "&Active"));
tlist.append(i18nc("show only keys with at least marginal trust", "&Marginal"));
tlist.append(i18nc("show only keys with at least full trust", "&Full"));
tlist.append(i18nc("show only ultimately trusted keys", "&Ultimate"));
trustProps->setItems(tlist);
iproxy = new KeyListProxyModel(this);
iproxy->setKeyModel(imodel);
connect(this, SIGNAL(readAgainOptions()), iproxy, SLOT(settingsChanged()));
iview = new KeyTreeView(this, iproxy);
connect(iview, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(defaultAction(QModelIndex)));
connect(iview, SIGNAL(importDrop(KUrl::List)), SLOT(slotImport(KUrl::List)));
iview->setSelectionMode(QAbstractItemView::ExtendedSelection);
setCentralWidget(iview);
iview->resizeColumnsToContents();
iview->setAlternatingRowColors(true);
iview->setSortingEnabled(true);
connect(iview, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(slotMenu(QPoint)));
iview->setContextMenuPolicy(Qt::CustomContextMenu);
connect(iview->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)), this, SLOT(checkList()));
connect (iview, SIGNAL(returnPressed()), SLOT(slotDefaultAction()));
hPublic = actionCollection()->add<KToggleAction>(QLatin1String("show_secret"), iproxy, SLOT(setOnlySecret(bool)));
hPublic->setIcon(KIcon( QLatin1String( "view-key-secret" )));
hPublic->setText(i18n("&Show Only Secret Keys"));
hPublic->setChecked(KGpgSettings::showSecret());
int psize = KGpgSettings::photoProperties();
photoProps->setCurrentItem(psize);
slotSetPhotoSize(psize);
psize = KGpgSettings::trustLevel();
trustProps->setCurrentItem(psize);
slotSetTrustFilter(psize);
slotShowLongId(KGpgSettings::showLongKeyId());
m_popuppub = new KMenu(this);
m_popuppub->addAction(exportPublicKey);
m_popuppub->addAction(m_sendEmail);
m_popuppub->addAction(signMailUid);
m_popuppub->addAction(signKey);
m_popuppub->addAction(signUid);
m_popuppub->addAction(deleteKey);
m_popuppub->addAction(infoKey);
m_popuppub->addAction(openKeyUrl);
m_popuppub->addAction(editKey);
m_popuppub->addAction(refreshKey);
m_popuppub->addAction(createGroup);
m_popuppub->addSeparator();
m_popuppub->addAction(importAllSignKeys);
m_popupsec = new KMenu(this);
m_popupsec->addAction(exportPublicKey);
m_popupsec->addAction(m_sendEmail);
m_popupsec->addAction(signKey);
m_popupsec->addAction(signUid);
m_popupsec->addAction(signMailUid);
m_popupsec->addAction(infoKey);
m_popupsec->addAction(openKeyUrl);
m_popupsec->addAction(editKey);
m_popupsec->addAction(refreshKey);
m_popupsec->addAction(setDefaultKey);
m_popupsec->addSeparator();
m_popupsec->addAction(importAllSignKeys);
m_popupsec->addSeparator();
m_popupsec->addAction(addPhoto);
m_popupsec->addAction(addUid);
m_popupsec->addAction(exportSecretKey);
m_popupsec->addAction(deleteKeyPair);
m_popupgroup = new KMenu(this);
m_popupgroup->addAction(editCurrentGroup);
m_popupgroup->addAction(m_groupRename);
m_popupgroup->addAction(delGroup);
m_popupgroup->addAction(refreshKey);
m_popupout = new KMenu(this);
m_popupout->addAction(importKey);
m_popupsig = new KMenu();
m_popupsig->addAction(importSignatureKey);
m_popupsig->addAction(delSignKey);
m_popupphoto = new KMenu(this);
m_popupphoto->addAction(openPhoto);
m_popupphoto->addAction(signUid);
m_popupphoto->addAction(signMailUid);
m_popupphoto->addAction(deletePhoto);
m_popupuid = new KMenu(this);
m_popupuid->addAction(m_sendEmail);
m_popupuid->addAction(signMailUid);
m_popupuid->addAction(signUid);
m_popupuid->addAction(delUid);
m_popupuid->addAction(setPrimUid);
m_popuporphan = new KMenu(this);
m_popuporphan->addAction(regeneratePublic);
m_popuporphan->addAction(deleteKeyPair);
exportPublicKey->setEnabled(false);
KConfigGroup cg = KConfigGroup(KGlobal::config().data(), "KeyView");
iview->restoreLayout(cg);
connect(photoProps, SIGNAL(triggered(int)), this, SLOT(slotSetPhotoSize(int)));
connect(trustProps, SIGNAL(triggered(int)), this, SLOT(slotSetTrustFilter(int)));
QLabel *searchLabel = new QLabel(i18n("Search:"), this);
m_listviewsearch = new KLineEdit(this);
m_listviewsearch->setClearButtonShown(true);
QWidget *searchWidget = new QWidget(this);
QHBoxLayout *searchLayout = new QHBoxLayout(searchWidget);
searchLayout->setMargin(0);
searchLayout->addWidget(searchLabel);
searchLayout->addWidget(m_listviewsearch);
searchLayout->addStretch();
KAction *searchLineAction = new KAction(i18nc("Name of the action that is a search line, shown for example in the toolbar configuration dialog",
"Search Line"), this);
actionCollection()->addAction(QLatin1String( "search_line" ), searchLineAction);
searchLineAction->setDefaultWidget(searchWidget);
action = actionCollection()->addAction(QLatin1String("search_focus"), m_listviewsearch, SLOT(setFocus()));
action->setText(i18nc("Name of the action that gives the focus to the search line", "Focus Search Line"));
action->setShortcut(QKeySequence(Qt::Key_F6));
connect(m_listviewsearch, SIGNAL(textChanged(QString)), iproxy, SLOT(setFilterFixedString(QString)));
setActionDescriptions(1);
// get all keys data
setupGUI(KXmlGuiWindow::Create | Save | ToolBar | StatusBar | Keys, QLatin1String( "keysmanager.rc" ));
sTrust->setChecked(KGpgSettings::showTrust());
iview->setColumnHidden(2, !KGpgSettings::showTrust());
sSize->setChecked(KGpgSettings::showSize());
iview->setColumnHidden(3, !KGpgSettings::showSize());
sCreat->setChecked(KGpgSettings::showCreat());
iview->setColumnHidden(4, !KGpgSettings::showCreat());
sExpi->setChecked(KGpgSettings::showExpi());
iview->setColumnHidden(5, !KGpgSettings::showExpi());
iproxy->setOnlySecret(KGpgSettings::showSecret());
KStatusBar *statusbar = statusBar();
statusbar->insertPermanentFixedItem(KGpgItemModel::statusCountMessageString(9999, 999), 0);
statusbar->changeItem(QString(), 0);
cg = KConfigGroup(KGlobal::config().data(), "MainWindow");
setAutoSaveSettings(cg, true);
applyMainWindowSettings(cg);
connect(this, SIGNAL(fontChanged(QFont)), s_kgpgEditor, SLOT(slotSetFont(QFont)));
m_netnote = Solid::Networking::notifier();
connect(m_netnote, SIGNAL(shouldConnect()), SLOT(slotNetworkUp()));
connect(m_netnote, SIGNAL(shouldDisconnect()), SLOT(slotNetworkDown()));
toggleNetworkActions(Solid::Networking::status() == Solid::Networking::Unknown || Solid::Networking::status() == Solid::Networking::Connected);
importSignatureKey->setEnabled(false);
stateChanged("empty_list");
QMetaObject::invokeMethod(this, "refreshkey", Qt::QueuedConnection);
}
KeysManager::~KeysManager()
{
}
void KeysManager::slotGenerateKey()
{
if (m_genkey) {
KMessageBox::error(this,
i18n("Another key generation operation is still in progress.\nPlease wait a moment until this operation is complete."),
i18n("Generating new key pair"));
return;
}
QPointer<KgpgKeyGenerate> kg = new KgpgKeyGenerate(this);
if (kg->exec() == QDialog::Accepted) {
if (!kg->isExpertMode()) {
KGpgGenerateKey *genkey = new KGpgGenerateKey(this, kg->name(), kg->email(),
kg->comment(), kg->algo(), kg->size(), kg->days(), kg->expiration(),
kg->caps());
m_genkey = new KGpgTransactionJob(genkey);
connect(m_genkey, SIGNAL(result(KJob*)), SLOT(slotGenerateKeyDone(KJob*)));
KIO::getJobTracker()->registerJob(m_genkey);
m_genkey->start();
QApplication::setOverrideCursor(Qt::BusyCursor);
} else {
KConfigGroup config(KGlobal::config(), "General");
QString terminalApp(config.readPathEntry("TerminalApplication", QLatin1String( "konsole" )));
QStringList args;
args << QLatin1String( "-e" )
<< KGpgSettings::gpgBinaryPath()
<< QLatin1String("--gen-key")
<< QLatin1String("--expert");
QProcess *genKeyProc = new QProcess(this);
genKeyProc->start(terminalApp, args);
if (!genKeyProc->waitForStarted(-1)) {
KMessageBox::error(this, i18n("Generating new key pair"),
i18n("Can not start \"konsole\" application for expert mode."));
} else {
genKeyProc->waitForFinished(-1);
refreshkey();
}
}
}
delete kg;
}
void KeysManager::showKeyManager()
{
show();
}
void KeysManager::slotOpenEditor()
{
KgpgEditor *kgpgtxtedit = new KgpgEditor(this, imodel, Qt::Window);
connect(this, SIGNAL(fontChanged(QFont)), kgpgtxtedit, SLOT(slotSetFont(QFont)));
kgpgtxtedit->show();
}
void KeysManager::changeMessage(const QString &msg, const bool keep)
{
int timeout = keep ? 0 : 10000;
statusBar()->showMessage(msg, timeout);
}
void KeysManager::updateStatusCounter()
{
statusBar()->changeItem(imodel->statusCountMessage(), 0);
}
void KeysManager::slotGenerateKeyDone(KJob *job)
{
changeMessage(i18nc("Application ready for user input", "Ready"));
QApplication::restoreOverrideCursor();
KGpgTransactionJob *tjob = qobject_cast<KGpgTransactionJob *>(job);
const KGpgGenerateKey * const genkey = qobject_cast<const KGpgGenerateKey *>(tjob->getTransaction());
int res = tjob->getResultCode();
const QString infomessage(i18n("Generating new key pair"));
switch (res) {
case KGpgTransaction::TS_BAD_PASSPHRASE:
KMessageBox::error(this, i18n("Bad passphrase. Cannot generate a new key pair."), infomessage);
break;
case KGpgTransaction::TS_USER_ABORTED:
KMessageBox::error(this, i18n("Aborted by the user. Cannot generate a new key pair."), infomessage);
break;
case KGpgTransaction::TS_INVALID_EMAIL:
KMessageBox::error(this, i18n("The email address is not valid. Cannot generate a new key pair."), infomessage);
break;
case KGpgGenerateKey::TS_INVALID_NAME:
KMessageBox::error(this, i18n("The name is not accepted by gpg. Cannot generate a new key pair."), infomessage);
break;
case KGpgTransaction::TS_OK: {
updateStatusCounter();
QPointer<KDialog> keyCreated = new KDialog(this);
keyCreated->setCaption(i18n("New Key Pair Created"));
keyCreated->setButtons(KDialog::Ok);
keyCreated->setDefaultButton(KDialog::Ok);
keyCreated->setModal(true);
newKey *page = new newKey(keyCreated);
page->TLname->setText(QLatin1String( "<b>" ) + genkey->getName() + QLatin1String( "</b>" ));
const QString email(genkey->getEmail());
page->TLemail->setText(QLatin1String( "<b>" ) + email + QLatin1String( "</b>" ));
QString revurl;
const QString gpgPath(KGpgSettings::gpgConfigPath());
if (!gpgPath.isEmpty())
revurl = KUrl::fromPath(gpgPath).directory(KUrl::AppendTrailingSlash);
else
revurl = QDir::homePath() + QLatin1Char( '/' );
if (!email.isEmpty())
page->kURLRequester1->setUrl(QString(revurl + email.section(QLatin1Char( '@' ), 0, 0) + QLatin1String( ".revoke" )));
else
page->kURLRequester1->setUrl(QString(revurl + genkey->getName().section(QLatin1Char(' '), 0, 0) + QLatin1String(".revoke")));
const QString fingerprint(genkey->getFingerprint());
page->TLid->setText(QLatin1String( "<b>" ) + fingerprint.right(8) + QLatin1String( "</b>" ));
page->LEfinger->setText(fingerprint);
page->CBdefault->setChecked(true);
page->show();
keyCreated->setMainWidget(page);
keyCreated->exec();
if (keyCreated.isNull())
return;
imodel->refreshKey(fingerprint);
KGpgKeyNode *knode = imodel->getRootNode()->findKey(fingerprint);
if (page->CBdefault->isChecked())
imodel->setDefaultKey(knode);
iview->selectNode(knode);
if (page->CBsave->isChecked() || page->CBprint->isChecked()) {
KUrl revurl;
if (page->CBsave->isChecked())
revurl = page->kURLRequester1->url();
KGpgGenerateRevoke *genRev = new KGpgGenerateRevoke(this, fingerprint, revurl,
0, i18n("backup copy"));
connect(genRev, SIGNAL(done(int)), SLOT(slotRevokeGenerated(int)));
if (page->CBprint->isChecked())
connect(genRev, SIGNAL(revokeCertificate(QString)), SLOT(doPrint(QString)));
genRev->start();
}
delete keyCreated;
break;
}
default:
KMessageBox::detailedError(this,
i18n("gpg process did not finish. Cannot generate a new key pair."),
genkey->gpgErrorMessage(), infomessage);
}
m_genkey = NULL;
}
void KeysManager::slotShowTrust()
{
bool b = !sTrust->isChecked();
iview->setColumnHidden(KEYCOLUMN_TRUST, b);
if (!b && (iview->columnWidth(KEYCOLUMN_TRUST) == 0))
iview->resizeColumnToContents(KEYCOLUMN_TRUST);
}
void KeysManager::slotShowExpiration()
{
bool b = !sExpi->isChecked();
iview->setColumnHidden(KEYCOLUMN_EXPIR, b);
if (!b && (iview->columnWidth(KEYCOLUMN_EXPIR) == 0))
iview->resizeColumnToContents(KEYCOLUMN_EXPIR);
}
void KeysManager::slotShowSize()
{
bool b = !sSize->isChecked();
iview->setColumnHidden(KEYCOLUMN_SIZE, b);
if (!b && (iview->columnWidth(KEYCOLUMN_SIZE) == 0))
iview->resizeColumnToContents(KEYCOLUMN_SIZE);
}
void KeysManager::slotShowCreation()
{
bool b = !sCreat->isChecked();
iview->setColumnHidden(KEYCOLUMN_CREAT, b);
if (!b && (iview->columnWidth(KEYCOLUMN_CREAT) == 0))
iview->resizeColumnToContents(KEYCOLUMN_CREAT);
}
void KeysManager::slotShowLongId(bool b)
{
iproxy->setIdLength(b ? 16 : 8);
}
void KeysManager::slotSetTrustFilter(int i)
{
KgpgCore::KgpgKeyTrustFlag t;
Q_ASSERT((i >= 0) && (i < 5));
switch (i) {
case 0:
t = TRUST_MINIMUM;
break;
case 1:
t = TRUST_UNDEFINED;
break;
case 2:
t = TRUST_MARGINAL;
break;
case 3:
t = TRUST_FULL;
break;
default:
t = TRUST_ULTIMATE;
}
iproxy->setTrustFilter(t);
}
bool KeysManager::eventFilter(QObject *, QEvent *e)
{
if ((e->type() == QEvent::Show) && (showTipOfDay)) {
KTipDialog::showTip(this, QLatin1String("kgpg/tips"), false);
showTipOfDay = false;
}
return false;
}
void KeysManager::slotGotoDefaultKey()
{
iview->selectNode(imodel->getRootNode()->findKey(KGpgSettings::defaultKey()));
}
void KeysManager::refreshKeyFromServer()
{
QList<KGpgNode *> keysList(iview->selectedNodes());
if (keysList.isEmpty())
return;
QStringList keyIDS;
foreach (KGpgNode *item, keysList) {
if (item->getType() == ITYPE_GROUP)
{
for (int j = 0; j < item->getChildCount(); j++)
keyIDS << item->getChild(j)->getId();
continue;
}
if (item->getType() & ITYPE_PAIR) {
keyIDS << item->getId();
} else {
KMessageBox::sorry(this, i18n("You can only refresh primary keys. Please check your selection."));
return;
}
}
QString proxy;
if (KGpgSettings::useProxy())
proxy = QLatin1String( qgetenv("http_proxy") );
KGpgRefreshKeys *t = new KGpgRefreshKeys(this, KGpgSettings::keyServers().first(), keyIDS, true, proxy);
connect(t, SIGNAL(done(int)), SLOT(slotKeyRefreshDone(int)));
QApplication::setOverrideCursor(QCursor(Qt::BusyCursor));
t->start();
}
void KeysManager::slotKeyRefreshDone(int result)
{
KGpgRefreshKeys *t = qobject_cast<KGpgRefreshKeys *>(sender());
Q_ASSERT(t != NULL);
if (result == KGpgTransaction::TS_USER_ABORTED) {
t->deleteLater();
QApplication::restoreOverrideCursor();
return;
}
const QStringList log(t->getLog());
const QStringList keys = KGpgImport::getImportedIds(log, 0xffff);
const QStringList message(KGpgImport::getImportMessage(log));
t->deleteLater();
if (!keys.empty())
imodel->refreshKeys(keys);
QApplication::restoreOverrideCursor();
(void) new KgpgDetailedInfo(this, message.join(QLatin1String("\n")), log.join(QLatin1String("<br/>")),
KGpgImport::getDetailedImportMessage(log, imodel).split(QLatin1Char('\n')));
}
void KeysManager::slotDelUid()
{
KGpgUidNode *nd = iview->selectedNode()->toUidNode();
KGpgDelUid *deluid = new KGpgDelUid(this, nd);
connect(deluid, SIGNAL(done(int)), SLOT(slotDelUidDone(int)));
deluid->start();
}
void KeysManager::slotDelUidDone(int result)
{
KGpgDelUid * const deluid = qobject_cast<KGpgDelUid *>(sender());
Q_ASSERT(deluid != NULL);
sender()->deleteLater();
if (result == KGpgTransaction::TS_OK)
imodel->refreshKey(deluid->getKeyId());
// FIXME: do something useful with result if it is a failure
}
void KeysManager::slotPrimUid()
{
KGpgPrimaryUid *puid = new KGpgPrimaryUid(this, iview->selectedNode()->toUidNode());
connect(puid, SIGNAL(done(int)), SLOT(slotPrimUidDone(int)));
puid->start();
}
void KeysManager::slotPrimUidDone(int result)
{
const QString kid(qobject_cast<KGpgPrimaryUid *>(sender())->getKeyId());
sender()->deleteLater();
if (result == KGpgTransaction::TS_OK)
imodel->refreshKey(kid);
// FIXME: some error reporting
}
void KeysManager::slotregenerate()
{
QString regID = iview->selectedNode()->getId();
KProcess *p1, *p2, *p3;
p1 = new KProcess(this);
*p1 << KGpgSettings::gpgBinaryPath()
<< QLatin1String("--no-secmem-warning")
<< QLatin1String("--export-secret-key")
<< regID;
p1->setOutputChannelMode(KProcess::OnlyStdoutChannel);
p2 = new KProcess(this);
*p2 << QLatin1String("gpgsplit")
<< QLatin1String("--no-split")
<< QLatin1String("--secret-to-public");
p2->setOutputChannelMode(KProcess::OnlyStdoutChannel);
p3 = new KProcess(this);
*p3 << KGpgSettings::gpgBinaryPath()
<< QLatin1String("--import");
p1->setStandardOutputProcess(p2);
p2->setStandardOutputProcess(p3);
p1->start();
p2->start();
p3->start();
p1->waitForFinished();
p2->waitForFinished();
p3->waitForFinished();
delete p1;
delete p2;
delete p3;
imodel->refreshKey(regID);
}
void KeysManager::slotAddUid()
{
if (m_adduid) {
KMessageBox::error(this, i18n("Another operation is still in progress.\nPlease wait a moment until this operation is complete."),
i18n("Add New User Id"));
return;
}
addUidWidget = new KDialog(this );
addUidWidget->setCaption( i18n("Add New User Id") );
addUidWidget->setButtons( KDialog::Ok | KDialog::Cancel );
addUidWidget->setDefaultButton( KDialog::Ok );
addUidWidget->setModal( true );
addUidWidget->enableButtonOk(false);
AddUid *keyUid = new AddUid(addUidWidget);
addUidWidget->setMainWidget(keyUid);
//keyUid->setMinimumSize(keyUid->sizeHint());
keyUid->setMinimumWidth(300);
connect(keyUid->kLineEdit1, SIGNAL(textChanged(QString)), this, SLOT(slotAddUidEnable(QString)));
if (addUidWidget->exec() != QDialog::Accepted)
return;
m_adduid = new KGpgAddUid(this, iview->selectedNode()->getId(), keyUid->kLineEdit1->text(),
keyUid->kLineEdit2->text(), keyUid->kLineEdit3->text());
connect(m_adduid, SIGNAL(done(int)), SLOT(slotAddUidFin(int)));
m_adduid->start();
}
void KeysManager::slotAddUidFin(int res)
{
// TODO error reporting
if (res == 0)
imodel->refreshKey(m_adduid->getKeyid());
m_adduid->deleteLater();
m_adduid = NULL;
}
void KeysManager::slotAddUidEnable(const QString & name)
{
addUidWidget->enableButtonOk(name.length() > 4);
}
void KeysManager::slotAddPhoto()
{
QString mess = i18n("The image must be a JPEG file. Remember that the image is stored within your public key, so "
"if you use a very large picture, your key will become very large as well. The size should not exceed 6 KiB. "
"An image size of around 240x288 is a good size to use.");
if (KMessageBox::warningContinueCancel(0, mess) != KMessageBox::Continue)
return;
QString imagepath = KFileDialog::getOpenFileName(KUrl(), QLatin1String( "image/jpeg" ), 0);
if (imagepath.isEmpty())
return;
KGpgAddPhoto *addphoto = new KGpgAddPhoto(this, iview->selectedNode()->getId(), imagepath);
connect(addphoto, SIGNAL(done(int)), SLOT(slotAddPhotoFinished(int)));
addphoto->start();
}
void KeysManager::slotAddPhotoFinished(int res)
{
sender()->deleteLater();
// TODO : add res == 3 (bad passphrase)
if (res == 0)
slotUpdatePhoto();
}
void KeysManager::slotDeletePhoto()
{
KGpgNode *nd = iview->selectedNode();
KGpgUatNode *und = nd->toUatNode();
KGpgKeyNode *parent = und->getParentKeyNode();
QString mess = i18n("<qt>Are you sure you want to delete Photo id <b>%1</b><br/>from key <b>%2 &lt;%3&gt;</b>?</qt>",
und->getId(), parent->getName(), parent->getEmail());
KGpgDelUid *deluid = new KGpgDelUid(this, und);
connect(deluid, SIGNAL(done(int)), SLOT(slotDelPhotoFinished(int)));
deluid->start();
}
void KeysManager::slotDelPhotoFinished(int res)
{
sender()->deleteLater();
// TODO : add res == 3 (bad passphrase)
if (res == 0) {
KGpgNode *nd = iview->selectedNode();
imodel->refreshKey(nd->getParentKeyNode()->toKeyNode());
}
}
void KeysManager::slotUpdatePhoto()
{
KGpgNode *nd = iview->selectedNode();
imodel->refreshKey(nd->toKeyNode());
}
void KeysManager::slotSetPhotoSize(int size)
{
switch(size) {
case 1:
iproxy->setPreviewSize(22);
break;
case 2:
iproxy->setPreviewSize(42);
break;
case 3:
iproxy->setPreviewSize(65);
break;
default:
iproxy->setPreviewSize(0);
break;
}
}
void KeysManager::addToKAB()
{
KGpgNode *nd = iview->selectedNode();
if (nd == NULL)
return;
Akonadi::ContactSearchJob * const job = new Akonadi::ContactSearchJob();
job->setLimit(1);
job->setQuery(Akonadi::ContactSearchJob::Email, nd->getEmail());
connect(job, SIGNAL(result(KJob*)), this, SLOT(slotAddressbookSearchResult(KJob*)));
m_addIds[job] = nd;
}
void KeysManager::slotAddressbookSearchResult(KJob *job)
{
KGpgNode * const nd = m_addIds.value(job, 0);
if (!nd)
return;
Akonadi::ContactSearchJob *searchJob = qobject_cast<Akonadi::ContactSearchJob*>(job);
Q_ASSERT(searchJob);
const KABC::Addressee::List addresseeList = searchJob->contacts();
m_addIds.take(job);
Akonadi::ContactEditorDialog *dlg;
// KABC::Key key; TODO
if (!addresseeList.isEmpty()) {
dlg = new Akonadi::ContactEditorDialog(Akonadi::ContactEditorDialog::EditMode, this);
dlg->setContact(searchJob->items().first());
} else {
KABC::Addressee addressee;
addressee.setNameFromString(nd->getName());
addressee.setEmails(QStringList(nd->getEmail()));
dlg = new Akonadi::ContactEditorDialog(Akonadi::ContactEditorDialog::CreateMode, this);
dlg->editor()->setContactTemplate(addressee);
}
connect(dlg, SIGNAL(finished()), dlg, SLOT(deleteLater()));
dlg->show();
}
void KeysManager::slotManpage()
{
KToolInvocation::startServiceByDesktopName(QLatin1String("khelpcenter"),
QLatin1String("man:/gpg"), 0, 0, 0, QByteArray(), true);
}
void KeysManager::slotTip()
{
KTipDialog::showTip(this, QLatin1String("kgpg/tips"), true);
}
void KeysManager::showKeyServer()
{
QPointer<KeyServer> ks = new KeyServer(this, imodel);
connect(ks, SIGNAL(importFinished(QStringList)), imodel, SLOT(refreshKeys(QStringList)));
ks->exec();
delete ks;
refreshkey();
}
void KeysManager::checkList()
{
QList<KGpgNode *> exportList = iview->selectedNodes();
switch (exportList.count()) {
case 0:
stateChanged("empty_list");
return;
case 1:
if (exportList.at(0)->getType() == ITYPE_GROUP) {
stateChanged(QLatin1String( "group_selected" ));
} else {
stateChanged(QLatin1String( "single_selected" ));
m_revokeKey->setEnabled(exportList.at(0)->getType() == ITYPE_PAIR);
if (terminalkey)
editKey->setEnabled(false);
m_sendEmail->setEnabled(!exportList[0]->getEmail().isEmpty());
setDefaultKey->setEnabled(!imodel->isDefaultKey(exportList[0]));
}
break;
default:
stateChanged(QLatin1String( "multi_selected" ));
}
if (!m_online)
refreshKey->setEnabled(false);
switch (exportList.at(0)->getType()) {
case ITYPE_PUBLIC:
changeMessage(i18n("Public Key"));
break;
case ITYPE_SUB:
changeMessage(i18n("Sub Key"));
break;
case ITYPE_PAIR:
changeMessage(i18n("Secret Key Pair"));
break;
case ITYPE_GROUP:
changeMessage(i18n("Key Group"));
break;
case ITYPE_SIGN:
changeMessage(i18n("Signature"));
break;
case ITYPE_UID:
changeMessage(i18n("User ID"));
break;
case ITYPE_REVSIGN:
changeMessage(i18n("Revocation Signature"));
break;
case ITYPE_UAT:
changeMessage(i18n("Photo ID"));
break;
case ITYPE_SECRET:
changeMessage(i18n("Orphaned Secret Key"));
break;
case ITYPE_GPUBLIC:
case ITYPE_GSECRET:
case ITYPE_GPAIR:
changeMessage(i18n("Group member"));
break;
default:
kDebug(2100) << "Oops, unmatched type value" << exportList.at(0)->getType();
}
}
void KeysManager::quitApp()
{
// close window
saveToggleOpts();
qApp->quit();
}
void KeysManager::saveToggleOpts(void)
{
KConfigGroup cg = KConfigGroup(KGlobal::config().data(), "KeyView");
iview->saveLayout(cg);
KGpgSettings::setPhotoProperties(photoProps->currentItem());
KGpgSettings::setShowTrust(sTrust->isChecked());
KGpgSettings::setShowExpi(sExpi->isChecked());
KGpgSettings::setShowCreat(sCreat->isChecked());
KGpgSettings::setShowSize(sSize->isChecked());
KGpgSettings::setTrustLevel(trustProps->currentItem());
KGpgSettings::setShowSecret(hPublic->isChecked());
KGpgSettings::setShowLongKeyId(longId->isChecked());
KGpgSettings::self()->writeConfig();
}
void KeysManager::readOptions()
{
m_clipboardmode = QClipboard::Clipboard;
if (KGpgSettings::useMouseSelection() && (kapp->clipboard()->supportsSelection()))
m_clipboardmode = QClipboard::Selection;
if (imodel != NULL)
updateStatusCounter();
showTipOfDay = KGpgSettings::showTipOfDay();
if (KGpgSettings::showSystray()) {
setupTrayIcon();
} else {
delete m_trayicon;
m_trayicon = NULL;
}
}
void KeysManager::showOptions()
{
if (KConfigDialog::showDialog(QLatin1String( "settings" )))
return;
QPointer<kgpgOptions> optionsDialog = new kgpgOptions(this, imodel);
connect(optionsDialog, SIGNAL(settingsUpdated()), SLOT(readAllOptions()));
connect(optionsDialog, SIGNAL(homeChanged()), imodel, SLOT(refreshKeys()));
connect(optionsDialog, SIGNAL(homeChanged()), imodel, SLOT(refreshGroups()));
connect(optionsDialog, SIGNAL(refreshTrust(KgpgCore::KgpgKeyTrust,QColor)), imodel, SLOT(refreshTrust(KgpgCore::KgpgKeyTrust,QColor)));
connect(optionsDialog, SIGNAL(changeFont(QFont)), SIGNAL(fontChanged(QFont)));
optionsDialog->exec();
delete optionsDialog;
s_kgpgEditor->m_recentfiles->setMaxItems(KGpgSettings::recentFiles());
}
void KeysManager::readAllOptions()
{
readOptions();
emit readAgainOptions();
}
void KeysManager::slotSetDefKey()
{
setDefaultKeyNode(iview->selectedNode()->toKeyNode());
}
void KeysManager::slotSetDefaultKey(const QString &newID)
{
KGpgKeyNode *ndef = imodel->getRootNode()->findKey(newID);
if (ndef == NULL) {
KGpgSettings::setDefaultKey(newID);
KGpgSettings::self()->writeConfig();
return;
}
setDefaultKeyNode(ndef);
}
void KeysManager::setDefaultKeyNode(KGpgKeyNode *key)
{
const QString &newID(key->getId());
if (newID == KGpgSettings::defaultKey())
return;
KGpgSettings::setDefaultKey(newID);
KGpgSettings::self()->writeConfig();
imodel->setDefaultKey(key);
}
void
KeysManager::setActionDescriptions(int cnt)
{
signUid->setText(i18np("&Sign User ID ...", "&Sign User IDs ...", cnt));
signMailUid->setText(i18np("Sign and &Mail User ID ...", "Sign and &Mail User IDs ...", cnt));
exportPublicKey->setText(i18np("E&xport Public Key...", "E&xport Public Keys...", cnt));
refreshKey->setText(i18np("&Refresh Key From Keyserver", "&Refresh Keys From Keyserver", cnt));
createGroup->setText(i18np("&Create Group with Selected Key...", "&Create Group with Selected Keys...", cnt));
signKey->setText(i18np("&Sign Key...", "&Sign Keys...", cnt));
delUid->setText(i18np("&Delete User ID", "&Delete User IDs", cnt));
delSignKey->setText(i18np("Delete Sign&ature", "Delete Sign&atures", cnt));
importSignatureKey->setText(i18np("Import Key From Keyserver", "Import Keys From Keyserver", cnt));
deleteKey->setText(i18np("&Delete Key", "&Delete Keys", cnt));
}
void
KeysManager::slotMenu(const QPoint &pos)
{
QPoint globpos = iview->mapToGlobal(pos);
bool sametype;
KgpgItemType itype;
QList<KGpgNode *> ndlist(iview->selectedNodes(&sametype, &itype));
bool unksig = false;
QSet<QString> l;
int cnt = ndlist.count();
// find out if an item has unknown signatures. Only check if the item has been
// expanded before as expansion is very expensive and can take several seconds
// that will freeze the UI meanwhile.
foreach (KGpgNode *nd, ndlist) {
if (!nd->hasChildren())
continue;
KGpgExpandableNode *exnd = nd->toExpandableNode();
if (!exnd->wasExpanded()) {
unksig = true;
break;
}
getMissingSigs(l, exnd);
if (!l.isEmpty()) {
unksig = true;
break;
}
}
importAllSignKeys->setEnabled(unksig && m_online);
signUid->setEnabled(!(itype & ~(ITYPE_PAIR | ITYPE_UID | ITYPE_UAT)));
signMailUid->setEnabled(signUid->isEnabled());
setActionDescriptions(cnt);
if (itype == ITYPE_SIGN) {
bool allunksig = true;
foreach (KGpgNode *nd, ndlist) {
allunksig = nd->toSignNode()->isUnknown();
if (!allunksig)
break;
}
importSignatureKey->setEnabled(allunksig && m_online);
delSignKey->setEnabled( (cnt == 1) );
m_popupsig->exec(globpos);
} else if (itype == ITYPE_UID) {
if (cnt == 1) {
KGpgKeyNode *knd = ndlist.at(0)->toUidNode()->getParentKeyNode();
setPrimUid->setEnabled(knd->getType() & ITYPE_SECRET);
}
m_popupuid->exec(globpos);
} else if ((itype == ITYPE_UAT) && (cnt == 1)) {
m_popupphoto->exec(globpos);
} else if ((itype == ITYPE_PAIR) && (cnt == 1)) {
m_popupsec->exec(globpos);
} else if ((itype == ITYPE_SECRET) && (cnt == 1)) {
m_popuporphan->exec(globpos);
} else if (itype == ITYPE_GROUP) {
delGroup->setEnabled( (cnt == 1) );
editCurrentGroup->setEnabled( (cnt == 1) );
m_groupRename->setEnabled( (cnt == 1) );
m_popupgroup->exec(globpos);
} else if (!(itype & ~(ITYPE_PAIR | ITYPE_GROUP))) {
signKey->setEnabled(!(itype & ITYPE_GROUP));
deleteKey->setEnabled(!(itype & ITYPE_GROUP));
setDefaultKey->setEnabled( (cnt == 1) );
m_popuppub->exec(globpos);
} else if (!(itype & ~(ITYPE_UID | ITYPE_PAIR | ITYPE_UAT))) {
setPrimUid->setEnabled(false);
delUid->setEnabled(false);
m_popupuid->exec(globpos);
} else {
m_popupout->exec(globpos);
}
}
void KeysManager::revokeWidget()
{
KGpgNode *nd = iview->selectedNode();
KDialog *keyRevokeDialog = new KGpgRevokeDialog(this, nd->toKeyNode());
connect(keyRevokeDialog, SIGNAL(finished(int)), SLOT(slotRevokeDialogFinished(int)));
keyRevokeDialog->open();
}
void KeysManager::slotRevokeDialogFinished(int result)
{
sender()->deleteLater();
if (result != QDialog::Accepted)
return;
KGpgRevokeDialog *keyRevokeDialog = qobject_cast<KGpgRevokeDialog *>(sender());
KGpgGenerateRevoke *genRev = new KGpgGenerateRevoke(this, keyRevokeDialog->getId(), keyRevokeDialog->saveUrl(),
keyRevokeDialog->getReason(), keyRevokeDialog->getDescription());
connect(genRev, SIGNAL(done(int)), SLOT(slotRevokeGenerated(int)));
if (keyRevokeDialog->printChecked())
connect(genRev, SIGNAL(revokeCertificate(QString)), SLOT(doPrint(QString)));
if (keyRevokeDialog->importChecked())
connect(genRev, SIGNAL(revokeCertificate(QString)), SLOT(slotImportRevokeTxt(QString)));
genRev->start();
}
void KeysManager::slotRevokeGenerated(int result)
{
KGpgGenerateRevoke *genRev = qobject_cast<KGpgGenerateRevoke *>(sender());
genRev->deleteLater();
switch (result) {
case KGpgTransaction::TS_OK:
case KGpgTransaction::TS_USER_ABORTED:
break;
default:
KMessageBox::detailedSorry(this, i18n("Creation of the revocation certificate failed..."), genRev->getOutput());
break;
}
}
void KeysManager::slotImportRevokeTxt(const QString &revokeText)
{
KGpgImport *import = new KGpgImport(this, revokeText);
connect(import, SIGNAL(done(int)), SLOT(slotImportDone(int)));
import->start();
}
void KeysManager::slotexportsec()
{
// export secret key
const QString warn(i18n("<qt>Secret keys <b>should not</b> be saved in an unsafe place.<br/>"
"If someone else can access this file, encryption with this key will be compromised.<br/>Continue key export?</qt>"));
int result = KMessageBox::warningContinueCancel(this, warn);
if (result != KMessageBox::Continue)
return;
KGpgNode *nd = iview->selectedNode();
QString sname(nd->getEmail().section(QLatin1Char( '@' ), 0, 0).section(QLatin1Char( '.' ), 0, 0));
if (sname.isEmpty())
sname = nd->getName().section(QLatin1Char( ' ' ), 0, 0);
sname.append(QLatin1String( ".asc" ));
sname.prepend(QDir::homePath() + QLatin1Char( '/' ));
KUrl url(KFileDialog::getSaveUrl(sname, i18n( "*.asc|*.asc Files" ), this, i18n("Export PRIVATE KEY As")));
if(!url.isEmpty()) {
KGpgExport *exp = new KGpgExport(this, QStringList(nd->getId()), url.path(), QStringList(QLatin1String( "--armor" )), true);
connect(exp, SIGNAL(done(int)), SLOT(slotExportSecFinished(int)));
exp->start();
}
}
void KeysManager::slotExportSecFinished(int result)
{
KGpgExport *exp = qobject_cast<KGpgExport *>(sender());
Q_ASSERT(exp != NULL);
if (result == KGpgTransaction::TS_OK) {
KMessageBox::information(this,
i18n("<qt>Your <b>private</b> key \"%1\" was successfully exported to<br/>%2.<br/><b>Do not</b> leave it in an insecure place.</qt>",
exp->getKeyIds().first(), exp->getOutputFile()));
} else {
KMessageBox::sorry(this, i18n("Your secret key could not be exported.\nCheck the key."));
}
}
void KeysManager::slotexport()
{
bool same;
KgpgItemType tp;
QList<KGpgNode *> ndlist(iview->selectedNodes(&same, &tp));
if (ndlist.isEmpty())
return;
if (!(tp & ITYPE_PUBLIC) || (tp & ~ITYPE_GPAIR))
return;
QString sname;
if (ndlist.count() == 1) {
sname = ndlist.at(0)->getEmail().section(QLatin1Char( '@' ), 0, 0).section(QLatin1Char( '.' ), 0, 0);
if (sname.isEmpty())
sname = ndlist.at(0)->getName().section(QLatin1Char(' '), 0, 0);
} else
sname = QLatin1String( "keyring" );
QStringList klist;
for (int i = 0; i < ndlist.count(); ++i) {
klist << ndlist.at(i)->getId();
}
sname.append(QLatin1String( ".asc" ));
sname.prepend(QDir::homePath() + QLatin1Char( '/' ));
QStringList serverList(KGpgSettings::keyServers());
serverList.replaceInStrings(QRegExp( QLatin1String( " .*") ), QLatin1String( "" ) ); // Remove kde 3.5 (Default) tag.
if (!serverList.isEmpty()) {
QString defaultServer = serverList.takeFirst();
qSort(serverList);
serverList.prepend(defaultServer);
}
QPointer<KeyExport> page = new KeyExport(this, serverList);
page->newFilename->setUrl(sname);
if (!m_online)
page->checkServer->setEnabled(false);
if (page->exec() == QDialog::Accepted) {
// export to file
QString exportAttr;
if (page->checkAttrAll->isChecked()) {
// nothing
} else if (page->checkAttrPhoto->isChecked()) {
exportAttr = QLatin1String( "no-export-attributes" );
} else {
exportAttr = QLatin1String( "export-minimal" );
}
QStringList expopts;
if (!exportAttr.isEmpty())
expopts << QLatin1String( "--export-options" ) << exportAttr;
if (page->checkServer->isChecked()) {
KeyServer *expServer = new KeyServer(0, imodel);
expServer->slotSetExportAttribute(exportAttr);
expServer->slotSetKeyserver(page->destServer->currentText());
expServer->slotExport(klist);
} else if (page->checkFile->isChecked()) {
const QString expname(page->newFilename->url().path().simplified());
if (!expname.isEmpty()) {
expopts.append(QLatin1String( "--armor" ));
KGpgExport *exp = new KGpgExport(this, klist, expname, expopts);
connect(exp, SIGNAL(done(int)), SLOT(slotExportFinished(int)));
exp->start();
}
} else {
KGpgExport *exp = new KGpgExport(this, klist, expopts);
if (page->checkClipboard->isChecked())
connect(exp, SIGNAL(done(int)), SLOT(slotProcessExportClip(int)));
else
connect(exp, SIGNAL(done(int)), SLOT(slotProcessExportMail(int)));
exp->start();
}
}
delete page;
}
void KeysManager::slotExportFinished(int result)
{
KGpgExport *exp = qobject_cast<KGpgExport *>(sender());
Q_ASSERT(exp != NULL);
if (result == KGpgTransaction::TS_OK) {
KMessageBox::information(this,
i18np("<qt>The public key was successfully exported to<br/>%2</qt>",
"<qt>The %1 public keys were successfully exported to<br/>%2</qt>",
exp->getKeyIds().count(), exp->getOutputFile()));
} else {
KMessageBox::sorry(this, i18n("Your public key could not be exported\nCheck the key."));
}
exp->deleteLater();
}
void KeysManager::slotProcessExportMail(int result)
{
KGpgExport *exp = qobject_cast<KGpgExport *>(sender());
Q_ASSERT(exp != NULL);
// start default Mail application
if (result == KGpgTransaction::TS_OK) {
KToolInvocation::invokeMailer(QString(), QString(), QString(), QString(),QLatin1String( exp->getOutputData() ));
} else {
KMessageBox::sorry(this, i18n("Your public key could not be exported\nCheck the key."));
}
exp->deleteLater();
}
void KeysManager::slotProcessExportClip(int result)
{
KGpgExport *exp = qobject_cast<KGpgExport *>(sender());
Q_ASSERT(exp != NULL);
if (result == KGpgTransaction::TS_OK) {
kapp->clipboard()->setText(QLatin1String( exp->getOutputData() ), m_clipboardmode);
} else {
KMessageBox::sorry(this, i18n("Your public key could not be exported\nCheck the key."));
}
exp->deleteLater();
}
void KeysManager::showKeyInfo(const QString &keyID)
{
KGpgKeyNode *key = imodel->getRootNode()->findKey(keyID);
if (key == NULL)
return;
showProperties(key);
}
void KeysManager::slotShowPhoto()
{
KService::List list(KMimeTypeTrader::self()->query(QLatin1String( "image/jpeg" )));
if (list.isEmpty()) {
KMessageBox::sorry(NULL, i18n("<qt>A viewer for JPEG images is not specified.<br/>Please check your installation.</qt>"),
i18n("Show photo"));
return;
}
KGpgNode *nd = iview->selectedNode();
KGpgUatNode *und = nd->toUatNode();
KGpgKeyNode *parent = und->getParentKeyNode();
KService::Ptr ptr = list.first();
KProcess p;
p << KGpgSettings::gpgBinaryPath()
<< QLatin1String("--no-tty")
<< QLatin1String("--photo-viewer")
<< (ptr->desktopEntryName() + QLatin1String( " %i" ))
<< QLatin1String("--edit-key")
<< parent->getId()
<< QLatin1String("uid")
<< und->getId()
<< QLatin1String("showphoto")
<< QLatin1String("quit");
p.startDetached();
}
void KeysManager::defaultAction(const QModelIndex &index)
{
KGpgNode *nd = iproxy->nodeForIndex(index);
defaultAction(nd);
}
void KeysManager::slotDefaultAction()
{
defaultAction(iview->selectedNode());
}
void KeysManager::defaultAction(KGpgNode *nd)
{
if (nd == NULL)
return;
if (iview->isEditing())
return;
switch (nd->getType()) {
case ITYPE_GROUP:
editGroup();
break;
case ITYPE_UAT:
slotShowPhoto();
break;
case ITYPE_SIGN:
case ITYPE_GPUBLIC:
case ITYPE_GSECRET:
case ITYPE_GPAIR:
iview->selectNode(nd->toRefNode()->getRefNode());
break;
case ITYPE_SECRET:
slotregenerate();
break;
case ITYPE_PAIR:
case ITYPE_PUBLIC:
showProperties(nd);
return;
}
}
void
KeysManager::showProperties(KGpgNode *n)
{
switch (n->getType()) {
case ITYPE_UAT:
return;
case ITYPE_PUBLIC:
case ITYPE_PAIR: {
KGpgKeyNode *k = n->toKeyNode();
QPointer<KgpgKeyInfo> opts = new KgpgKeyInfo(k, imodel, this);
connect(opts, SIGNAL(keyNeedsRefresh(KGpgKeyNode*)), imodel, SLOT(refreshKey(KGpgKeyNode*)));
connect(opts->keychange, SIGNAL(keyNeedsRefresh(KGpgKeyNode*)), imodel, SLOT(refreshKey(KGpgKeyNode*)));
opts->exec();
delete opts;
}
default:
return;
}
}
void KeysManager::keyproperties()
{
KGpgNode *cur = iview->selectedNode();
if (cur == NULL)
return;
KGpgKeyNode *kn;
switch (cur->getType()) {
case ITYPE_SECRET:
case ITYPE_GSECRET:
if (KMessageBox::questionYesNo(this,
i18n("<p>This key is an orphaned secret key (secret key without public key.) It is currently not usable.</p>"
"<p>Would you like to regenerate the public key?</p>"),
QString(), KGuiItem(i18n("Generate")), KGuiItem(i18n("Do Not Generate"))) == KMessageBox::Yes)
slotregenerate();
return;
case ITYPE_PAIR:
case ITYPE_PUBLIC: {
kn = cur->toKeyNode();
break;
}
case ITYPE_GPAIR:
case ITYPE_GPUBLIC: {
kn = cur->toGroupMemberNode()->getRefNode();
break;
}
default:
kDebug(2100) << "Oops, called with invalid item type" << cur->getType();
return;
}
QPointer<KgpgKeyInfo> opts = new KgpgKeyInfo(kn, imodel, this);
connect(opts, SIGNAL(keyNeedsRefresh(KGpgKeyNode*)), imodel, SLOT(refreshKey(KGpgKeyNode*)));
opts->exec();
delete opts;
}
void KeysManager::deleteGroup()
{
KGpgNode *nd = iview->selectedNode();
if (!nd || (nd->getType() != ITYPE_GROUP))
return;
int result = KMessageBox::warningContinueCancel(this, i18n("<qt>Are you sure you want to delete group <b>%1</b> ?</qt>",
nd->getName()), QString(), KGuiItem(i18n("Delete"), QLatin1String("edit-delete")));
if (result != KMessageBox::Continue)
return;
nd->toGroupNode()->remove();
imodel->delNode(nd);
updateStatusCounter();
}
void KeysManager::renameGroup()
{
if (iview->selectionModel()->selectedIndexes().isEmpty())
return;
QModelIndex selectedNodeIndex = iview->selectionModel()->selectedIndexes().first();
iview->edit(selectedNodeIndex);
}
void KeysManager::createNewGroup()
{
QStringList badkeys;
KGpgKeyNode::List keysList;
KgpgItemType tp;
KGpgNode::List ndlist(iview->selectedNodes(NULL, &tp));
if (ndlist.isEmpty())
return;
if (tp & ~ITYPE_PAIR) {
KMessageBox::sorry(this, i18n("<qt>You cannot create a group containing signatures, subkeys or other groups.</qt>"));
return;
}
KgpgKeyTrustFlag mintrust;
if (KGpgSettings::allowUntrustedGroupMembers()) {
mintrust = KgpgCore::TRUST_UNDEFINED;
} else {
mintrust = KgpgCore::TRUST_FULL;
}
foreach (KGpgNode *nd, ndlist) {
if (nd->getTrust() >= mintrust) {
keysList.append(nd->toKeyNode());
} else {
badkeys += i18nc("<Name> (<Email>) ID: <KeyId>", "%1 (%2) ID: %3",
nd->getName(), nd->getEmail(), nd->getId());
}
}
QString groupName(KInputDialog::getText(i18n("Create New Group"),
i18nc("Enter the name of the group you are creating now", "Enter new group name:"),
QString(), 0, this));
if (groupName.isEmpty())
return;
if (!keysList.isEmpty()) {
if (!badkeys.isEmpty())
KMessageBox::informationList(this, i18n("Following keys are not valid or not trusted and will not be added to the group:"), badkeys);
iview->selectNode(imodel->addGroup(groupName, keysList));
updateStatusCounter();
} else {
KMessageBox::sorry(this,
i18n("<qt>No valid or trusted key was selected. The group <b>%1</b> will not be created.</qt>",
groupName));
}
}
void KeysManager::editGroup()
{
KGpgNode *nd = iview->selectedNode();
if (!nd || (nd->getType() != ITYPE_GROUP))
return;
KGpgGroupNode *gnd = nd->toGroupNode();
QPointer<KDialog> dialogGroupEdit = new KDialog(this );
dialogGroupEdit->setCaption( i18n("Group Properties") );
dialogGroupEdit->setButtons( KDialog::Ok | KDialog::Cancel );
dialogGroupEdit->setDefaultButton( KDialog::Ok );
dialogGroupEdit->setModal( true );
QList<KGpgNode *> members(gnd->getChildren());
groupEdit *gEdit = new groupEdit(dialogGroupEdit, &members, imodel);
dialogGroupEdit->setMainWidget(gEdit);
gEdit->show();
if (dialogGroupEdit->exec() == QDialog::Accepted)
imodel->changeGroup(gnd, members);
delete dialogGroupEdit;
}
void KeysManager::signkey()
{
// another sign operation is still running
if (!signList.isEmpty())
return;
KgpgItemType tp;
QList<KGpgNode *> tmplist = iview->selectedNodes(NULL, &tp);
if (tmplist.isEmpty())
return;
if (tp & ~ITYPE_PAIR) {
KMessageBox::sorry(this, i18n("You can only sign primary keys. Please check your selection."));
return;
}
if (tmplist.count() == 1) {
KGpgKeyNode *nd = tmplist.at(0)->toKeyNode();
QString opt;
if (nd->getEmail().isEmpty())
opt = i18n("<qt>You are about to sign key:<br /><br />%1<br />ID: %2<br />Fingerprint: <br /><b>%3</b>.<br /><br />"
"You should check the key fingerprint by phoning or meeting the key owner to be sure that someone "
"is not trying to intercept your communications.</qt>",
nd->getName(), nd->getId().right(8), nd->getBeautifiedFingerprint());
else
opt = i18n("<qt>You are about to sign key:<br /><br />%1 (%2)<br />ID: %3<br />Fingerprint: <br /><b>%4</b>.<br /><br />"
"You should check the key fingerprint by phoning or meeting the key owner to be sure that someone "
"is not trying to intercept your communications.</qt>",
nd->getName(), nd->getEmail(), nd->getId().right(8), nd->getBeautifiedFingerprint());
if (KMessageBox::warningContinueCancel(this, opt) != KMessageBox::Continue) {
return;
}
signList.append(nd);
} else {
QStringList signKeyList;
foreach (KGpgNode *n, tmplist) {
const KGpgKeyNode *nd = n->toKeyNode();
if (nd->getEmail().isEmpty())
signKeyList += i18nc("Name: ID", "%1: %2", nd->getName(), nd->getBeautifiedFingerprint());
else
signKeyList += i18nc("Name (Email): ID", "%1 (%2): %3", nd->getName(), nd->getEmail(), nd->getBeautifiedFingerprint());
signList.append(n->toSignableNode());
}
if (KMessageBox::Continue != KMessageBox::warningContinueCancelList(this,
i18n("<qt>You are about to sign the following keys in one pass.<br/><b>If you have not carefully checked all fingerprints,"
" the security of your communications may be compromised.</b></qt>"),
signKeyList))
return;
}
QPointer<KgpgSelectSecretKey> opts = new KgpgSelectSecretKey(this, imodel, signList.count());
if (opts->exec() != QDialog::Accepted) {
delete opts;
signList.clear();
return;
}
globalkeyID = QString(opts->getKeyID());
const bool localsign = opts->isLocalSign();
const int checklevel = opts->getSignTrust();
bool isterminal = opts->isTerminalSign();
delete opts;
if (isterminal) {
const QString keyid(signList.at(0)->getId());
signList.clear();
signKeyOpenConsole(globalkeyID, keyid, checklevel, localsign);
} else {
keyCount = 0;
m_signuids = false;
signLoop(localsign, checklevel);
}
}
void KeysManager::signuid()
{
// another sign operation is still running
if (!signList.isEmpty())
return;
KgpgItemType tp;
KGpgNode::List tmplist = iview->selectedNodes(NULL, &tp);
if (tmplist.isEmpty())
return;
if (tp & ~(ITYPE_PAIR | ITYPE_UID | ITYPE_UAT)) {
KMessageBox::sorry(this, i18n("You can only sign user ids and photo ids. Please check your selection."));
return;
}
if (tmplist.count() == 1) {
KGpgSignableNode *nd = tmplist.at(0)->toSignableNode();
KGpgKeyNode *pnd;
if (tp & ITYPE_PUBLIC)
pnd = nd->toKeyNode();
else
pnd = nd->getParentKeyNode()->toKeyNode();
QString opt;
if (nd->getEmail().isEmpty())
opt = i18n("<qt>You are about to sign user id:<br /><br />%1<br />ID: %2<br />Fingerprint: <br /><b>%3</b>.<br /><br />"
"You should check the key fingerprint by phoning or meeting the key owner to be sure that someone "
"is not trying to intercept your communications.</qt>", nd->getName(), nd->getId(), pnd->getBeautifiedFingerprint());
else
opt = i18n("<qt>You are about to sign user id:<br /><br />%1 (%2)<br />ID: %3<br />Fingerprint: <br /><b>%4</b>.<br /><br />"
"You should check the key fingerprint by phoning or meeting the key owner to be sure that someone "
"is not trying to intercept your communications.</qt>", nd->getName(), nd->getEmail(), nd->getId(), pnd->getBeautifiedFingerprint());
if (KMessageBox::warningContinueCancel(this, opt) != KMessageBox::Continue) {
return;
}
signList.append(nd);
} else {
QStringList signKeyList;
foreach (KGpgNode *nd, tmplist) {
const KGpgKeyNode *pnd = (nd->getType() & (ITYPE_UID | ITYPE_UAT)) ?
nd->getParentKeyNode()->toKeyNode() : nd->toKeyNode();
if (nd->getEmail().isEmpty())
signKeyList += i18nc("Name: ID", "%1: %2",
nd->getName(), pnd->getBeautifiedFingerprint());
else
signKeyList += i18nc("Name (Email): ID", "%1 (%2): %3",
nd->getName(), nd->getEmail(), pnd->getBeautifiedFingerprint());
signList.append(nd->toSignableNode());
}
if (KMessageBox::warningContinueCancelList(this,
i18n("<qt>You are about to sign the following user ids in one pass.<br/><b>If you have not carefully checked all fingerprints,"
" the security of your communications may be compromised.</b></qt>"),
signKeyList) != KMessageBox::Continue)
return;
}
QPointer<KgpgSelectSecretKey> opts = new KgpgSelectSecretKey(this, imodel, signList.count());
if (opts->exec() != QDialog::Accepted) {
delete opts;
signList.clear();
return;
}
globalkeyID = QString(opts->getKeyID());
const bool localsign = opts->isLocalSign();
const int checklevel = opts->getSignTrust();
bool isterminal = opts->isTerminalSign();
delete opts;
if (isterminal) {
const QString keyid(signList.at(0)->getId());
signList.clear();
signKeyOpenConsole(globalkeyID, keyid, checklevel, localsign);
} else {
keyCount = 0;
m_signuids = true;
signLoop(localsign, checklevel);
}
}
void KeysManager::signLoop(const bool localsign, const int checklevel)
{
Q_ASSERT(keyCount < signList.count());
KGpgSignableNode *nd = signList.at(keyCount);
QString uid;
QString keyid;
const KGpgSignTransactionHelper::carefulCheck cc = static_cast<KGpgSignTransactionHelper::carefulCheck>(checklevel);
KGpgTransaction *sta;
if (m_signuids) {
sta = new KGpgSignUid(this, globalkeyID, nd, localsign, cc);
} else {
sta = new KGpgSignKey(this, globalkeyID, nd->toKeyNode(), localsign, cc);
}
connect(sta, SIGNAL(done(int)), SLOT(signatureResult(int)));
sta->start();
}
void KeysManager::signatureResult(int success)
{
KGpgSignTransactionHelper *ta;
KGpgSignUid *suid = qobject_cast<KGpgSignUid *>(sender());
if (suid != NULL) {
ta = static_cast<KGpgSignTransactionHelper *>(suid);
} else {
ta = static_cast<KGpgSignTransactionHelper *>(static_cast<KGpgSignKey *>(sender()));
}
KGpgKeyNode *nd = const_cast<KGpgKeyNode *>(ta->getKey());
const bool localsign = ta->getLocal();
const int checklevel = ta->getChecking();
const QString signer(ta->getSigner());
sender()->deleteLater();
switch (success) {
case KGpgTransaction::TS_OK:
if (refreshList.indexOf(nd) == -1)
refreshList.append(nd);
break;
case KGpgTransaction::TS_BAD_PASSPHRASE:
KMessageBox::sorry(this, i18n("<qt>Bad passphrase, key <b>%1 (%2)</b> not signed.</qt>",
nd->getName(), nd->getEmail()));
break;
case KGpgSignTransactionHelper::TS_ALREADY_SIGNED:
KMessageBox::sorry(this, i18n("<qt>The key <b>%1 (%2)</b> is already signed.</qt>",
nd->getName(), nd->getEmail()));
break;
default:
if (KMessageBox::questionYesNo(this,
i18n("<qt>Signing key <b>%1</b> with key <b>%2</b> failed.<br />"
"Do you want to try signing the key in console mode?</qt>",
nd->getId(), signer)) == KMessageBox::Yes)
signKeyOpenConsole(signer, nd->getId(), checklevel, localsign);
}
if (++keyCount == signList.count()) {
signList.clear();
imodel->refreshKeys(refreshList);
refreshList.clear();
} else {
signLoop(localsign, checklevel);
}
}
void KeysManager::caff()
{
KgpgItemType tp;
KGpgNode::List tmplist = iview->selectedNodes(NULL, &tp);
KGpgSignableNode::List slist;
if (tmplist.isEmpty())
return;
if (tp & ~(ITYPE_PAIR | ITYPE_UID | ITYPE_UAT)) {
KMessageBox::sorry(this, i18n("You can only sign user ids and photo ids. Please check your selection."));
return;
}
foreach (KGpgNode *nd, tmplist) {
switch (nd->getType()) {
case KgpgCore::ITYPE_PAIR:
case KgpgCore::ITYPE_PUBLIC: {
KGpgKeyNode *knd = qobject_cast<KGpgKeyNode *>(nd);
if (!knd->wasExpanded())
knd->getChildCount();
}
}
slist.append(nd->toSignableNode());
}
QPointer<KgpgSelectSecretKey> opts = new KgpgSelectSecretKey(this, imodel, slist.count(), false, false);
if (opts->exec() != QDialog::Accepted) {
delete opts;
return;
}
KGpgCaff *ca = new KGpgCaff(this, slist, QStringList(opts->getKeyID()), opts->getSignTrust(), KGpgCaff::IgnoreAlreadySigned);
delete opts;
connect(ca, SIGNAL(done()), SLOT(slotCaffDone()));
connect(ca, SIGNAL(aborted()), SLOT(slotCaffDone()));
ca->run();
}
void KeysManager::slotCaffDone()
{
Q_ASSERT(qobject_cast<KGpgCaff *>(sender()) != NULL);
sender()->deleteLater();
}
void KeysManager::signKeyOpenConsole(const QString &signer, const QString &keyid, const int checking, const bool local)
{
KConfigGroup config(KGlobal::config(), "General");
KProcess process;
process << config.readPathEntry("TerminalApplication", QLatin1String("konsole"))
<< QLatin1String("-e")
<< KGpgSettings::gpgBinaryPath()
<< QLatin1String("--no-secmem-warning")
<< QLatin1String("-u") << signer
<< QLatin1String("--default-cert-level")
<< QString(checking);
if (!local)
process << QLatin1String( "--sign-key" ) << keyid;
else
process << QLatin1String( "--lsign-key" ) << keyid;
process.execute();
}
void KeysManager::getMissingSigs(QSet<QString> &missingKeys, const KGpgExpandableNode *nd)
{
foreach (const KGpgNode *ch, nd->getChildren()) {
if (ch->hasChildren()) {
getMissingSigs(missingKeys, ch->toExpandableNode());
continue;
} else if (ch->getType() == ITYPE_SIGN) {
if (ch->toSignNode()->isUnknown())
missingKeys << ch->getId();
}
}
}
void KeysManager::importallsignkey()
{
const QList<KGpgNode *> sel(iview->selectedNodes());
QSet<QString> missingKeys;
if (sel.isEmpty())
return;
foreach (const KGpgNode *nd, sel) {
if (nd->hasChildren()) {
getMissingSigs(missingKeys, nd->toExpandableNode());
} else if (nd->getType() == ITYPE_SIGN) {
const KGpgSignNode *sn = nd->toSignNode();
if (sn->isUnknown())
missingKeys << sn->getId();
}
}
if (missingKeys.isEmpty()) {
KMessageBox::information(this,
i18np("All signatures for this key are already in your keyring",
"All signatures for this keys are already in your keyring", sel.count()));
return;
}
importRemoteKeys(missingKeys.toList());
}
void KeysManager::preimportsignkey()
{
const QList<KGpgNode *> exportList(iview->selectedNodes());
QStringList idlist;
if (exportList.empty())
return;
foreach (const KGpgNode *nd, exportList)
idlist << nd->getId();
importRemoteKeys(idlist);
}
bool KeysManager::importRemoteKey(const QString &keyIDs)
{
return importRemoteKeys(keyIDs.simplified().split(QLatin1Char( ' ' )), false);
}
bool KeysManager::importRemoteKeys(const QStringList &keyIDs, const bool dialog)
{
QStringList kservers(KeyServer::getServerList());
if (kservers.isEmpty())
return false;
KGpgReceiveKeys *proc = new KGpgReceiveKeys(this, kservers.first(), keyIDs, dialog, QLatin1String( qgetenv("http_proxy") ));
connect(proc, SIGNAL(done(int)), SLOT(importRemoteFinished(int)));
proc->start();
return true;
}
void KeysManager::importRemoteFinished(int result)
{
KGpgReceiveKeys *t = qobject_cast<KGpgReceiveKeys *>(sender());
Q_ASSERT(t != NULL);
const QStringList keys(KGpgImport::getImportedIds(t->getLog()));
t->deleteLater();
if (result == KGpgTransaction::TS_OK)
imodel->refreshKeys(keys);
}
void KeysManager::refreshKeys(const QStringList& ids)
{
imodel->refreshKeys(ids);
}
void KeysManager::delsignkey()
{
KGpgNode *nd = iview->selectedNode();
if (nd == NULL)
return;
QString uid;
QString parentKey;
KGpgExpandableNode *parent = nd->getParentKeyNode();
switch (parent->getType()) {
case ITYPE_PAIR:
case ITYPE_PUBLIC:
uid = QLatin1Char( '1' );
parentKey = parent->getId();
break;
case ITYPE_UID:
case ITYPE_UAT:
uid = parent->getId();
parentKey = parent->getParentKeyNode()->getId();
break;
default:
Q_ASSERT(0);
return;
}
const QString signID(nd->getId());
QString signMail(nd->getNameComment());
QString parentMail(parent->getNameComment());
if (!parent->getEmail().isEmpty())
parentMail += QLatin1String( " &lt;" ) + parent->getEmail() + QLatin1String( "&gt;" );
if (!nd->getEmail().isEmpty())
signMail += QLatin1String( " &lt;" ) + nd->getEmail() + QLatin1String( "&gt;" );
if (parentKey == signID) {
KMessageBox::sorry(this, i18n("Edit key manually to delete a self-signature."));
return;
}
QString ask = i18n("<qt>Are you sure you want to delete signature<br /><b>%1</b><br />from user id <b>%2</b><br />of key: <b>%3</b>?</qt>",
signMail, parentMail, parentKey);
if (KMessageBox::questionYesNo(this, ask, QString(), KStandardGuiItem::del(), KStandardGuiItem::cancel()) != KMessageBox::Yes)
return;
KGpgDelSign *delsig = new KGpgDelSign(this, nd->toSignNode());
connect(delsig, SIGNAL(done(int)), SLOT(delsignatureResult(int)));
delsig->start();
}
void KeysManager::delsignatureResult(int success)
{
sender()->deleteLater();
if (success == KGpgTransaction::TS_OK) {
KGpgNode *nd = iview->selectedNode()->getParentKeyNode();
while (!(nd->getType() & ITYPE_PAIR))
nd = nd->getParentKeyNode();
imodel->refreshKey(nd->toKeyNode());
} else {
KMessageBox::sorry(this, i18n("Requested operation was unsuccessful, please edit the key manually."));
}
}
void KeysManager::slotSendEmail()
{
QStringList maillist;
foreach (const KGpgNode *nd, iview->selectedNodes()) {
if (nd->getEmail().isEmpty())
continue;
maillist << QLatin1Char('"') + nd->getName() + QLatin1String("\" <") + nd->getEmail() + QLatin1Char('>');
}
if (maillist.isEmpty())
return;
KToolInvocation::invokeMailer(maillist.join(QLatin1String(", ")), QString());
}
void KeysManager::slotedit()
{
KGpgNode *nd = iview->selectedNode();
Q_ASSERT(nd != NULL);
if (!(nd->getType() & ITYPE_PAIR))
return;
if (terminalkey)
return;
if ((m_delkey != NULL) && m_delkey->keys().contains(nd->toKeyNode()))
return;
KProcess *kp = new KProcess(this);
KConfigGroup config(KGlobal::config(), "General");
*kp << config.readPathEntry("TerminalApplication", QLatin1String("konsole"))
<< QLatin1String("-e")
<< KGpgSettings::gpgBinaryPath()
<< QLatin1String("--no-secmem-warning")
<< QLatin1String("--edit-key")
<< nd->getId()
<< QLatin1String("help");
terminalkey = nd->toKeyNode();
editKey->setEnabled(false);
connect(kp, SIGNAL(finished(int)), SLOT(slotEditDone(int)));
kp->start();
}
void KeysManager::slotEditDone(int exitcode)
{
if (exitcode == 0)
imodel->refreshKey(terminalkey);
terminalkey = NULL;
editKey->setEnabled(true);
}
void KeysManager::doPrint(const QString &txt)
{
QPrinter prt;
//kDebug(2100) << "Printing..." ;
QPointer<QPrintDialog> printDialog = new QPrintDialog(&prt, this);
if (printDialog->exec() == QDialog::Accepted) {
QPainter painter(&prt);
int width = painter.device()->width();
int height = painter.device()->height();
painter.drawText(0, 0, width, height, Qt::AlignLeft|Qt::AlignTop|Qt::TextDontClip, txt);
}
delete printDialog;
}
void KeysManager::removeFromGroups(KGpgKeyNode *node)
{
QStringList groupNames;
foreach (const KGpgGroupNode *gnd, node->getGroups())
groupNames << gnd->getName();
if (groupNames.isEmpty())
return;
const QString ask = i18np("<qt>The key you are deleting is a member of the following key group. Do you want to remove it from this group?</qt>",
"<qt>The key you are deleting is a member of the following key groups. Do you want to remove it from these groups?</qt>",
groupNames.count());
if (KMessageBox::questionYesNoList(this, ask, groupNames, i18n("Delete key")) != KMessageBox::Yes)
return;
bool groupDeleted = false;
foreach (KGpgGroupMemberNode *gref, node->getGroupRefs()) {
KGpgGroupNode *group = gref->getParentKeyNode();
bool deleteWholeGroup = (group->getChildCount() == 1) &&
(group->getChild(0)->toGroupMemberNode() == gref);
if (deleteWholeGroup)
deleteWholeGroup = (KMessageBox::questionYesNo(this,
i18n("You are removing the last key from key group %1.<br/>Do you want to delete the group, too?", group->getName()),
i18n("Delete key")) == KMessageBox::Yes);
if (!deleteWholeGroup) {
imodel->deleteFromGroup(group, gref);
} else {
group->remove();
imodel->delNode(group);
groupDeleted = true;
}
}
if (groupDeleted) {
updateStatusCounter();
}
}
void KeysManager::deleteseckey()
{
KGpgKeyNode *nd = iview->selectedNode()->toKeyNode();
Q_ASSERT(nd != NULL);
// delete a key
int result = KMessageBox::warningContinueCancel(this,
i18n("<p>Delete <b>secret</b> key pair <b>%1</b>?</p>Deleting this key pair means you will never be able to decrypt files encrypted with this key again.",
nd->getNameComment()),
QString(),
KGuiItem(i18n("Delete"), QLatin1String( "edit-delete" )));
if (result != KMessageBox::Continue)
return;
if (terminalkey == nd)
return;
if (m_delkey != NULL) {
KMessageBox::error(this,
i18n("Another key delete operation is still in progress.\nPlease wait a moment until this operation is complete."),
i18n("Delete key"));
return;
}
removeFromGroups(nd);
m_delkey = new KGpgDelKey(this, nd);
connect(m_delkey, SIGNAL(done(int)), SLOT(secretKeyDeleted(int)));
m_delkey->start();
}
void KeysManager::secretKeyDeleted(int retcode)
{
KGpgKeyNode *delkey = m_delkey->keys().first();
if (retcode == 0) {
KMessageBox::information(this, i18n("Key <b>%1</b> deleted.", delkey->getBeautifiedFingerprint()), i18n("Delete key"));
imodel->delNode(delkey);
} else {
KMessageBox::error(this, i18n("Deleting key <b>%1</b> failed.", delkey->getBeautifiedFingerprint()), i18n("Delete key"));
}
m_delkey->deleteLater();
m_delkey = NULL;
}
void KeysManager::confirmdeletekey()
{
if (m_delkey) {
KMessageBox::error(this,
i18n("Another key delete operation is still in progress.\nPlease wait a moment until this operation is complete."),
i18n("Delete key"));
return;
}
KgpgCore::KgpgItemType pt;
bool same;
QList<KGpgNode *> ndlist(iview->selectedNodes(&same, &pt));
if (ndlist.isEmpty())
return;
// do not delete a key currently edited in terminal
if ((!(pt & ~ITYPE_PAIR)) && (ndlist.at(0) == terminalkey) && (ndlist.count() == 1)) {
KMessageBox::error(this,
i18n("Can not delete key <b>%1</b> while it is edited in terminal.",
terminalkey->getBeautifiedFingerprint()), i18n("Delete key"));
return;
} else if (pt == ITYPE_GROUP) {
deleteGroup();
return;
} else if (!(pt & ITYPE_GROUP) && (pt & ITYPE_SECRET) && (ndlist.count() == 1)) {
deleteseckey();
return;
} else if ((pt == ITYPE_UID) && (ndlist.count() == 1)) {
slotDelUid();
return;
} else if ((pt & ITYPE_GROUP) && !(pt & ~ITYPE_GPAIR)) {
bool invalidDelete = false;
foreach (const KGpgNode *nd, ndlist)
if (nd->getType() == ITYPE_GROUP) {
invalidDelete = true;
break;
}
// only allow removing group members if they belong to the same group
if (!invalidDelete) {
const KGpgNode * const group = ndlist.first()->getParentKeyNode();
foreach (const KGpgNode *nd, ndlist)
if (nd->getParentKeyNode() != group) {
invalidDelete = true;
break;
}
}
if (!invalidDelete) {
KGpgGroupNode *gnd = ndlist.first()->getParentKeyNode()->toGroupNode();
QList<KGpgNode *> members = gnd->getChildren();
foreach (KGpgNode *nd, ndlist) {
int r = members.removeAll(nd);
Q_ASSERT(r == 1);
Q_UNUSED(r);
}
imodel->changeGroup(gnd, members);
return;
}
}
if (pt & ~ITYPE_PAIR) {
KMessageBox::error(this,
i18n("You have selected items that are not keys. They can not be deleted with this menu entry."),
i18n("Delete key"));
return;
}
QStringList keysToDelete;
QStringList deleteIds;
QStringList secList;
KGpgKeyNode::List delkeys;
bool secretKeyInside = (pt & ITYPE_SECRET);
foreach (KGpgNode *nd, ndlist) {
KGpgKeyNode *ki = nd->toKeyNode();
if (ki->getType() & ITYPE_SECRET) {
secList += ki->getNameComment();
} else if (ki != terminalkey) {
keysToDelete += ki->getNameComment();
deleteIds << ki->getId();
delkeys << ki;
}
}
if (secretKeyInside) {
int result = KMessageBox::warningContinueCancel(this,
i18n("<qt>The following are secret key pairs:<br/><b>%1</b><br/>They will not be deleted.</qt>",
secList.join( QLatin1String( "<br />" ))));
if (result != KMessageBox::Continue)
return;
}
if (keysToDelete.isEmpty())
return;
int result = KMessageBox::warningContinueCancelList(this,
i18np("<qt><b>Delete the following public key?</b></qt>",
"<qt><b>Delete the following %1 public keys?</b></qt>",
keysToDelete.count()), keysToDelete, QString(),
KStandardGuiItem::del());
if (result != KMessageBox::Continue)
return;
foreach (KGpgNode *nd, ndlist)
removeFromGroups(nd->toKeyNode());
m_delkey = new KGpgDelKey(this, delkeys);
connect(m_delkey, SIGNAL(done(int)), SLOT(slotDelKeyDone(int)));
m_delkey->start();
}
void KeysManager::slotDelKeyDone(int res)
{
if (res == 0) {
foreach (KGpgKeyNode *kn, m_delkey->keys())
imodel->delNode(kn);
}
m_delkey->deleteLater();
m_delkey = NULL;
updateStatusCounter();
}
void KeysManager::slotPreImportKey()
{
QPointer<KDialog> dial = new KDialog(this);
dial->setCaption(i18n("Key Import"));
dial->setButtons(KDialog::Ok | KDialog::Cancel);
dial->setDefaultButton(KDialog::Ok);
dial->setModal(true);
SrcSelect *page = new SrcSelect();
dial->setMainWidget(page);
page->newFilename->setWindowTitle(i18n("Open File"));
page->newFilename->setMode(KFile::File);
if (dial->exec() == QDialog::Accepted) {
if (page->checkFile->isChecked()) {
KUrl impname = page->newFilename->url();
if (!impname.isEmpty())
slotImport(KUrl::List(impname));
} else if (page->checkServer->isChecked()) {
const QString ids(page->keyIds->text().simplified());
if (!ids.isEmpty())
importRemoteKeys(ids.split(QLatin1Char( ' ' )));
} else {
slotImport(kapp->clipboard()->text(m_clipboardmode));
}
}
delete dial;
}
void KeysManager::slotImport(const QString &text)
{
if (text.isEmpty())
return;
KGpgImport *imp;
if (!KGpgImport::isKey(text) && KGpgDecrypt::isEncryptedText(text)) {
if (KMessageBox::questionYesNo(this,
i18n("<qt>The text in the clipboard does not look like a key, but like encrypted text.<br />Do you want to decrypt it first"
" and then try importing it?</qt>"),
i18n("Import from Clipboard")) != KMessageBox::Yes)
return;
imp = new KGpgImport(this);
KGpgDecrypt *decr = new KGpgDecrypt(this, text);
imp->setInputTransaction(decr);
} else {
imp = new KGpgImport(this, text);
}
startImport(imp);
}
void KeysManager::slotImport(const KUrl::List &files)
{
startImport(new KGpgImport(this, files));
}
void KeysManager::startImport(KGpgImport *import)
{
changeMessage(i18n("Importing..."), true);
connect(import, SIGNAL(done(int)), SLOT(slotImportDone(int)));
import->start();
}
void KeysManager::slotImportDone(int result)
{
KGpgImport *import = qobject_cast<KGpgImport *>(sender());
Q_ASSERT(import != NULL);
const QStringList rawmsgs(import->getMessages());
if (result != 0) {
KMessageBox::detailedSorry(this, i18n("Key importing failed. Please see the detailed log for more information."),
rawmsgs.join(QLatin1String("\n")) , i18n("Key Import"));
}
QStringList keys(import->getImportedIds(0x1f));
const bool needsRefresh = !keys.isEmpty();
keys << import->getImportedIds(0);
if (!keys.isEmpty()) {
const QString msg(import->getImportMessage());
const QStringList keynames(import->getImportedKeys());
new KgpgDetailedInfo(this, msg, rawmsgs.join(QLatin1String("\n")), keynames, i18n("Key Import"));
if (needsRefresh)
imodel->refreshKeys(keys);
else
changeMessage(i18nc("Application ready for user input", "Ready"));
} else{
changeMessage(i18nc("Application ready for user input", "Ready"));
}
import->deleteLater();
}
void KeysManager::refreshkey()
{
imodel->refreshKeys();
updateStatusCounter();
}
KGpgItemModel *KeysManager::getModel()
{
return imodel;
}
void
KeysManager::slotNetworkUp()
{
toggleNetworkActions(true);
}
void
KeysManager::slotNetworkDown()
{
toggleNetworkActions(false);
}
void
KeysManager::toggleNetworkActions(bool online)
{
m_online = online;
kserver->setEnabled(online);
importSignatureKey->setEnabled(online);
importAllSignKeys->setEnabled(online);
refreshKey->setEnabled(online);
}
void
KeysManager::setupTrayIcon()
{
bool newtray = (m_trayicon == NULL);
if (newtray) {
m_trayicon = new KStatusNotifierItem(this);
m_trayicon->setIconByName(QLatin1String( "kgpg" ));
m_trayicon->setToolTip(QLatin1String( "kgpg" ), i18n("KGpg - encryption tool"), QString());
}
switch (KGpgSettings::leftClick()) {
case KGpgSettings::EnumLeftClick::Editor:
m_trayicon->setAssociatedWidget(s_kgpgEditor);
break;
case KGpgSettings::EnumLeftClick::KeyManager:
m_trayicon->setAssociatedWidget(this);
break;
}
m_trayicon->setCategory(KStatusNotifierItem::ApplicationStatus);
if (!newtray)
return;
KMenu *conf_menu = m_trayicon->contextMenu();
QAction *KgpgOpenManager = actionCollection()->addAction(QLatin1String("kgpg_manager"), this, SLOT(show()));
KgpgOpenManager->setIcon(KIcon( QLatin1String( "kgpg" )));
KgpgOpenManager->setText(i18n("Ke&y Manager"));
QAction *KgpgEncryptClipboard = actionCollection()->addAction(QLatin1String("clip_encrypt"), this, SLOT(clipEncrypt()));
KgpgEncryptClipboard->setText(i18n("&Encrypt Clipboard"));
QAction *KgpgDecryptClipboard = actionCollection()->addAction(QLatin1String("clip_decrypt"), this, SLOT(clipDecrypt()));
KgpgDecryptClipboard->setText(i18n("&Decrypt Clipboard"));
QAction *KgpgSignClipboard = actionCollection()->addAction(QLatin1String("clip_sign"), this, SLOT(clipSign()));
KgpgSignClipboard->setText(i18n("&Sign/Verify Clipboard"));
KgpgSignClipboard->setIcon(KIcon( QLatin1String( "document-sign-key" )));
QAction *KgpgPreferences = KStandardAction::preferences(this, SLOT(showOptions()), actionCollection());
conf_menu->addAction( KgpgEncryptClipboard );
conf_menu->addAction( KgpgDecryptClipboard );
conf_menu->addAction( KgpgSignClipboard );
conf_menu->addAction( KgpgOpenManager );
conf_menu->addAction( openEditor );
conf_menu->addAction( kserver );
conf_menu->addSeparator();
conf_menu->addAction( KgpgPreferences );
}
void
KeysManager::showTrayMessage(const QString &message)
{
if (m_trayicon == NULL)
return;
m_trayicon->showMessage(QString(), message, QLatin1String( "kgpg" ));
}
KShortcut
KeysManager::goDefaultShortcut() const
{
return goToDefaultKey->shortcut();
}
void
KeysManager::clipEncrypt()
{
const QString cliptext(kapp->clipboard()->text(m_clipboardmode));
if (cliptext.isEmpty()) {
Q_ASSERT(m_trayicon != NULL);
m_trayicon->showMessage(QString(), i18n("Clipboard is empty."), QLatin1String( "kgpg" ));
return;
}
QPointer<KgpgSelectPublicKeyDlg> dialog = new KgpgSelectPublicKeyDlg(this, imodel, goToDefaultKey->shortcut(), true);
if (dialog->exec() == KDialog::Accepted) {
KGpgEncrypt::EncryptOptions encOptions = KGpgEncrypt::AsciiArmored;
QStringList options;
if (!dialog->getCustomOptions().isEmpty() && KGpgSettings::allowCustomEncryptionOptions())
options = dialog->getCustomOptions().split(QLatin1Char(' '), QString::SkipEmptyParts);
if (dialog->getUntrusted())
encOptions |= KGpgEncrypt::AllowUntrustedEncryption;
if (dialog->getHideId())
encOptions |= KGpgEncrypt::HideKeyId;
if (KGpgSettings::pgpCompatibility())
options.append(QLatin1String( "--pgp6" ));
KGpgEncrypt *enc = new KGpgEncrypt(this, dialog->selectedKeys(), cliptext, encOptions, options);
connect(enc, SIGNAL(done(int)), SLOT(slotSetClip(int)));
m_trayicon->setStatus(KStatusNotifierItem::Active);
enc->start();
}
delete dialog;
}
void
KeysManager::slotSetClip(int result)
{
KGpgEncrypt *enc = qobject_cast<KGpgEncrypt *>(sender());
Q_ASSERT(enc != NULL);
sender()->deleteLater();
m_trayicon->setStatus(KStatusNotifierItem::Passive);
if (result != KGpgTransaction::TS_OK)
return;
kapp->clipboard()->setText(enc->encryptedText().join(QLatin1String("\n")), m_clipboardmode);
Q_ASSERT(m_trayicon != NULL);
m_trayicon->showMessage(QString(), i18n("Text successfully encrypted."), QLatin1String( "kgpg" ));
}
void
KeysManager::slotOpenKeyUrl()
{
KGpgNode *cur = iview->selectedNode();
if (cur == NULL)
return;
QString id;
switch (cur->getType()) {
case ITYPE_PAIR:
case ITYPE_PUBLIC: {
id = cur->toKeyNode()->getFingerprint();
break;
}
case ITYPE_GPAIR:
case ITYPE_GPUBLIC: {
id = cur->getId();
break;
}
default:
return;
}
const QStringList servers = KGpgSettings::infoServers();
if (servers.isEmpty())
return;
QString url = servers.first();
url.replace(QLatin1String("$$ID8$$"), id.right(8).toUpper());
url.replace(QLatin1String("$$ID16$$"), id.toUpper());
url.replace(QLatin1String("$$FPR$$"), id.toUpper());
url.replace(QLatin1String("$$id8$$"), id.right(8).toLower());
url.replace(QLatin1String("$$id16$$"), id.toLower());
url.replace(QLatin1String("$$fpr$$"), id.toLower());
new KRun(url, this);
}
void
KeysManager::clipDecrypt()
{
const QString cliptext(kapp->clipboard()->text(m_clipboardmode).trimmed());
if (cliptext.isEmpty()) {
Q_ASSERT(m_trayicon != NULL);
m_trayicon->showMessage(QString(), i18n("Clipboard is empty."), QLatin1String( "kgpg" ));
return;
}
KgpgEditor *kgpgtxtedit = new KgpgEditor(this, imodel, 0);
kgpgtxtedit->setAttribute(Qt::WA_DeleteOnClose);
connect(this, SIGNAL(fontChanged(QFont)), kgpgtxtedit, SLOT(slotSetFont(QFont)));
kgpgtxtedit->m_editor->setPlainText(cliptext);
kgpgtxtedit->m_editor->slotDecode();
kgpgtxtedit->show();
}
void
KeysManager::clipSign()
{
QString cliptext = kapp->clipboard()->text(m_clipboardmode);
if (cliptext.isEmpty()) {
Q_ASSERT(m_trayicon != NULL);
m_trayicon->showMessage(QString(), i18n("Clipboard is empty."), QLatin1String( "kgpg" ));
return;
}
KgpgEditor *kgpgtxtedit = new KgpgEditor(this, imodel, 0);
kgpgtxtedit->setAttribute(Qt::WA_DeleteOnClose);
connect(kgpgtxtedit->m_editor, SIGNAL(verifyFinished()), kgpgtxtedit, SLOT(closeWindow()));
kgpgtxtedit->m_editor->signVerifyText(cliptext);
kgpgtxtedit->show();
}
#include "keysmanager.moc"