• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdeutils API Reference
  • KDE Home
  • Contact Us
 

kgpg

  • sources
  • kde-4.14
  • kdeutils
  • kgpg
keysmanager.cpp
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2002 Jean-Baptiste Mardelle <bj@altern.org>
3  * Copyright (C) 2007,2008,2009,2010,2011,2012,2013
4  * Rolf Eike Beer <kde@opensource.sf-tec.de>
5  * Copyright (C) 2011 Luis Ángel Fernández Fernández <laffdez@gmail.com>
6  */
7 
8 /***************************************************************************
9  * *
10  * This program is free software; you can redistribute it and/or modify *
11  * it under the terms of the GNU General Public License as published by *
12  * the Free Software Foundation; either version 2 of the License, or *
13  * (at your option) any later version. *
14  * *
15  ***************************************************************************/
16 
17 #include "keysmanager.h"
18 
19 #include "caff.h"
20 #include "core/images.h"
21 #include "core/kgpgkey.h"
22 #include "detailedconsole.h"
23 #include "groupedit.h"
24 #include "keyadaptor.h"
25 #include "keyexport.h"
26 #include "keyinfodialog.h"
27 #include "keyservers.h"
28 #include "keytreeview.h"
29 #include "kgpg.h"
30 #include "kgpgchangekey.h"
31 #include "kgpgkeygenerate.h"
32 #include "kgpgoptions.h"
33 #include "kgpgrevokewidget.h"
34 #include "kgpgsettings.h"
35 #include "newkey.h"
36 #include "selectpublickeydialog.h"
37 #include "selectsecretkey.h"
38 #include "sourceselect.h"
39 #include "editor/kgpgeditor.h"
40 #include "editor/kgpgtextedit.h"
41 #include "model/keylistproxymodel.h"
42 #include "transactions/kgpgaddphoto.h"
43 #include "transactions/kgpgadduid.h"
44 #include "transactions/kgpgdecrypt.h"
45 #include "transactions/kgpgdelkey.h"
46 #include "transactions/kgpgdelsign.h"
47 #include "transactions/kgpgdeluid.h"
48 #include "transactions/kgpgencrypt.h"
49 #include "transactions/kgpgexport.h"
50 #include "transactions/kgpggeneratekey.h"
51 #include "transactions/kgpggeneraterevoke.h"
52 #include "transactions/kgpgimport.h"
53 #include "transactions/kgpgkeyservergettransaction.h"
54 #include "transactions/kgpgprimaryuid.h"
55 #include "transactions/kgpgsignkey.h"
56 #include "transactions/kgpgsignuid.h"
57 #include "transactions/kgpgtransactionjob.h"
58 
59 #include <akonadi/contact/contacteditor.h>
60 #include <akonadi/contact/contacteditordialog.h>
61 #include <akonadi/contact/contactsearchjob.h>
62 #include <KAction>
63 #include <KActionCollection>
64 #include <KDebug>
65 #include <KFileDialog>
66 #include <KFind>
67 #include <KFindDialog>
68 #include <KIcon>
69 #include <KInputDialog>
70 #include <KLineEdit>
71 #include <KLocale>
72 #include <KMenu>
73 #include <KMessageBox>
74 #include <KMimeType>
75 #include <KMimeTypeTrader>
76 #include <KProcess>
77 #include <KRecentFilesAction>
78 #include <KRun>
79 #include <KSelectAction>
80 #include <KService>
81 #include <KShortcut>
82 #include <KStandardAction>
83 #include <KStandardDirs>
84 #include <KStandardShortcut>
85 #include <KStatusBar>
86 #include <KStatusNotifierItem>
87 #include <KToggleAction>
88 #include <KToolBar>
89 #include <KToolInvocation>
90 #include <KUniqueApplication>
91 #include <KUrl>
92 #include <KVBox>
93 #include <QApplication>
94 #include <QClipboard>
95 #include <QDesktopWidget>
96 #include <QDir>
97 #include <QEvent>
98 #include <QFile>
99 #include <QKeySequence>
100 #include <QLabel>
101 #include <QList>
102 #include <QMetaObject>
103 #include <QPainter>
104 #include <QPrintDialog>
105 #include <QPrinter>
106 #include <QProcess>
107 #include <QTextStream>
108 #include <QWidget>
109 #include <QtDBus/QtDBus>
110 #include <kabc/addresseelist.h>
111 // #include <kabc/key.h> TODO
112 #include <kio/global.h>
113 #include <kjobtrackerinterface.h>
114 #include <ktip.h>
115 #include <solid/networking.h>
116 
117 using namespace KgpgCore;
118 
119 KeysManager::KeysManager(QWidget *parent)
120  : KXmlGuiWindow(parent),
121  imodel(new KGpgItemModel(this)),
122  m_adduid(NULL),
123  m_genkey(NULL),
124  m_delkey(NULL),
125  terminalkey(NULL),
126  m_trayicon(NULL)
127 {
128  new KeyAdaptor(this);
129  QDBusConnection::sessionBus().registerObject(QLatin1String( "/KeyInterface" ), this);
130 
131  setAttribute(Qt::WA_DeleteOnClose, false);
132  setWindowTitle(i18n("Key Management"));
133 
134  KStandardAction::quit(this, SLOT(quitApp()), actionCollection());
135  actionCollection()->addAction(KStandardAction::Preferences, QLatin1String( "options_configure" ), this, SLOT(showOptions()));
136 
137  openEditor = actionCollection()->addAction(QLatin1String("kgpg_editor"), this, SLOT(slotOpenEditor()));
138  openEditor->setIcon(KIcon( QLatin1String( "accessories-text-editor" )));
139  openEditor->setText(i18n("&Open Editor"));
140 
141  kserver = actionCollection()->addAction( QLatin1String("key_server"), this, SLOT(showKeyServer()));
142  kserver->setText( i18n("&Key Server Dialog") );
143  kserver->setIcon( KIcon( QLatin1String( "network-server" )) );
144 
145  goToDefaultKey = actionCollection()->addAction(QLatin1String("go_default_key"), this, SLOT(slotGotoDefaultKey()));
146  goToDefaultKey->setIcon(KIcon( QLatin1String( "go-home" )));
147  goToDefaultKey->setText(i18n("&Go to Default Key"));
148  goToDefaultKey->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_Home));
149 
150  s_kgpgEditor = new KgpgEditor(this, imodel, Qt::Dialog);
151  s_kgpgEditor->setAttribute(Qt::WA_DeleteOnClose, false);
152 
153  // this must come after kserver, preferences, and openEditor are created
154  // because they are used to set up the tray icon context menu
155  readOptions();
156 
157  if (showTipOfDay)
158  installEventFilter(this);
159 
160  KAction *action;
161 
162  action = actionCollection()->addAction(QLatin1String("help_tipofday"), this, SLOT(slotTip()));
163  action->setIcon( KIcon( QLatin1String( "help-hint" )) );
164  action->setText( i18n("Tip of the &Day") );
165 
166  action = actionCollection()->addAction(QLatin1String("gpg_man"), this, SLOT(slotManpage()));
167  action->setText( i18n("View GnuPG Manual") );
168  action->setIcon( KIcon( QLatin1String( "help-contents" )) );
169 
170  action = actionCollection()->addAction(QLatin1String("key_refresh"), this, SLOT(refreshkey()));
171  action->setIcon(KIcon( QLatin1String( "view-refresh" )));
172  action->setText(i18n("&Refresh List"));
173  action->setShortcuts(KStandardShortcut::reload());
174 
175  longId = actionCollection()->add<KToggleAction>(QLatin1String("show_long_keyid"), this, SLOT(slotShowLongId(bool)));
176  longId->setText(i18n("Show &Long Key Id"));
177  longId->setChecked(KGpgSettings::showLongKeyId());
178 
179  QAction *infoKey = actionCollection()->addAction(QLatin1String("key_info"), this, SLOT(keyproperties()));
180  infoKey->setIcon(KIcon( QLatin1String( "document-properties-key" )));
181  infoKey->setText(i18n("K&ey Properties"));
182 
183  QAction *openKeyUrl = actionCollection()->addAction(QLatin1String("key_url"), this, SLOT(slotOpenKeyUrl()));
184  openKeyUrl->setIcon(KIcon(QLatin1String("applications-internet")));
185  openKeyUrl->setText(i18n("&Open Key URL"));
186 
187  editKey = actionCollection()->addAction(QLatin1String("key_edit"), this, SLOT(slotedit()));
188  editKey->setIcon(KIcon( QLatin1String( "utilities-terminal" )));
189  editKey->setText(i18n("Edit Key in &Terminal"));
190  editKey->setShortcut(QKeySequence(Qt::ALT + Qt::Key_Return));
191 
192  KAction *generateKey = actionCollection()->addAction(QLatin1String("key_gener"), this, SLOT(slotGenerateKey()));
193  generateKey->setIcon(KIcon( QLatin1String( "key-generate-pair" )));
194  generateKey->setText(i18n("&Generate Key Pair..."));
195  generateKey->setShortcuts(KStandardShortcut::shortcut(KStandardShortcut::New));
196 
197  exportPublicKey = actionCollection()->addAction(QLatin1String("key_export"), this, SLOT(slotexport()));
198  exportPublicKey->setIcon(KIcon( QLatin1String( "document-export-key" )));
199  exportPublicKey->setShortcuts(KStandardShortcut::shortcut(KStandardShortcut::Copy));
200 
201  KAction *importKey = actionCollection()->addAction(QLatin1String("key_import"), this, SLOT(slotPreImportKey()));
202  importKey->setIcon(KIcon( QLatin1String( "document-import-key" )));
203  importKey->setText(i18n("&Import Key..."));
204  importKey->setShortcuts(KStandardShortcut::shortcut(KStandardShortcut::Paste));
205 
206  m_sendEmail = actionCollection()->addAction(QLatin1String("send_mail"), this, SLOT(slotSendEmail()));
207  m_sendEmail->setIcon(KIcon(QLatin1String("mail-send")));
208  m_sendEmail->setText(i18n("Send Ema&il"));
209 
210  QAction *newContact = actionCollection()->addAction(QLatin1String("add_kab"), this, SLOT(addToKAB()));
211  newContact->setIcon(KIcon( QLatin1String( "contact-new" )));
212  newContact->setText(i18n("&Create New Contact in Address Book"));
213 
214  createGroup = actionCollection()->addAction(QLatin1String("create_group"), this, SLOT(createNewGroup()));
215  createGroup->setIcon(Images::group());
216 
217  editCurrentGroup = actionCollection()->addAction(QLatin1String("edit_group"), this, SLOT(editGroup()));
218  editCurrentGroup->setText(i18n("&Edit Group..."));
219 
220  delGroup = actionCollection()->addAction(QLatin1String("delete_group"), this, SLOT(deleteGroup()));
221  delGroup->setText(i18n("&Delete Group"));
222  delGroup->setIcon(KIcon( QLatin1String( "edit-delete" )));
223 
224  m_groupRename = actionCollection()->addAction(QLatin1String("rename_group"), this, SLOT(renameGroup()));
225  m_groupRename->setText(i18n("&Rename Group"));
226  m_groupRename->setIcon(KIcon( QLatin1String( "edit-rename" )));
227  m_groupRename->setShortcut(QKeySequence(Qt::Key_F2));
228 
229  deleteKey = actionCollection()->addAction(QLatin1String("key_delete"), this, SLOT(confirmdeletekey()));
230  deleteKey->setIcon(KIcon( QLatin1String( "edit-delete" )));
231  deleteKey->setShortcut(QKeySequence(Qt::Key_Delete));
232 
233  setDefaultKey = actionCollection()->addAction(QLatin1String("key_default"), this, SLOT(slotSetDefKey()));
234  setDefaultKey->setText(i18n("Set as De&fault Key"));
235 
236  QAction *addPhoto = actionCollection()->addAction(QLatin1String("add_photo"), this, SLOT(slotAddPhoto()));
237  addPhoto->setText(i18n("&Add Photo..."));
238 
239  QAction *addUid = actionCollection()->addAction(QLatin1String("add_uid"), this, SLOT(slotAddUid()));
240  addUid->setText(i18n("&Add User Id..."));
241 
242  QAction *exportSecretKey = actionCollection()->addAction(QLatin1String("key_sexport"), this, SLOT(slotexportsec()));
243  exportSecretKey->setText(i18n("Export Secret Key..."));
244 
245  QAction *deleteKeyPair = actionCollection()->addAction(QLatin1String("key_pdelete"), this, SLOT(deleteseckey()));
246  deleteKeyPair->setText(i18n("Delete Key Pair"));
247  deleteKeyPair->setIcon(KIcon( QLatin1String( "edit-delete" )));
248 
249  m_revokeKey = actionCollection()->addAction(QLatin1String("key_revoke"), this, SLOT(revokeWidget()));
250  m_revokeKey->setText(i18n("Revoke Key..."));
251 
252  QAction *regeneratePublic = actionCollection()->addAction(QLatin1String("key_regener"), this, SLOT(slotregenerate()));
253  regeneratePublic->setText(i18n("&Regenerate Public Key"));
254 
255  delUid = actionCollection()->addAction(QLatin1String("del_uid"), this, SLOT(slotDelUid()));
256  delUid->setIcon(KIcon( QLatin1String( "edit-delete" )));
257 
258  setPrimUid = actionCollection()->addAction(QLatin1String("prim_uid"), this, SLOT(slotPrimUid()));
259  setPrimUid->setText(i18n("Set User Id as &Primary"));
260 
261  QAction *openPhoto = actionCollection()->addAction(QLatin1String("key_photo"), this, SLOT(slotShowPhoto()));
262  openPhoto->setIcon(KIcon( QLatin1String( "image-x-generic" )));
263  openPhoto->setText(i18n("&Open Photo"));
264 
265  QAction *deletePhoto = actionCollection()->addAction(QLatin1String("delete_photo"), this, SLOT(slotDeletePhoto()));
266  deletePhoto->setIcon(KIcon( QLatin1String( "edit-delete" )));
267  deletePhoto->setText(i18n("&Delete Photo"));
268 
269  delSignKey = actionCollection()->addAction(QLatin1String("key_delsign"), this, SLOT(delsignkey()));
270  delSignKey->setIcon(KIcon( QLatin1String( "edit-delete" )));
271  delSignKey->setEnabled(false);
272 
273  importAllSignKeys = actionCollection()->addAction(QLatin1String("key_importallsign"), this, SLOT(importallsignkey()));
274  importAllSignKeys->setIcon(KIcon( QLatin1String( "document-import" )));
275  importAllSignKeys->setText(i18n("Import &Missing Signatures From Keyserver"));
276 
277  refreshKey = actionCollection()->addAction(QLatin1String("key_server_refresh"), this, SLOT(refreshKeyFromServer()));
278  refreshKey->setIcon(KIcon( QLatin1String( "view-refresh" )));
279 
280  signKey = actionCollection()->addAction(QLatin1String("key_sign"), this, SLOT(signkey()));
281  signKey->setIcon(KIcon( QLatin1String( "document-sign-key" )));
282 
283  signUid = actionCollection()->addAction(QLatin1String("key_sign_uid"), this, SLOT(signuid()));
284  signUid->setIcon(KIcon( QLatin1String( "document-sign-key" )));
285 
286  signMailUid = actionCollection()->addAction(QLatin1String("key_sign_mail_uid"), this, SLOT(caff()));
287  signMailUid->setIcon(KIcon( QLatin1String( "document-sign-key" )));
288 
289  importSignatureKey = actionCollection()->addAction(QLatin1String("key_importsign"), this, SLOT(preimportsignkey()));
290  importSignatureKey->setIcon(KIcon( QLatin1String( "document-import-key" )));
291 
292  sTrust = actionCollection()->add<KToggleAction>(QLatin1String("show_trust"), this, SLOT(slotShowTrust()));
293  sTrust->setText(i18n("Trust"));
294 
295  sSize = actionCollection()->add<KToggleAction>(QLatin1String("show_size"), this, SLOT(slotShowSize()));
296  sSize->setText(i18n("Size"));
297 
298  sCreat = actionCollection()->add<KToggleAction>(QLatin1String("show_creat"), this, SLOT(slotShowCreation()));
299  sCreat->setText(i18n("Creation"));
300 
301  sExpi = actionCollection()->add<KToggleAction>(QLatin1String("show_expi"), this, SLOT(slotShowExpiration()));
302  sExpi->setText(i18n("Expiration"));
303 
304  photoProps = actionCollection()->add<KSelectAction>(QLatin1String( "photo_settings" ));
305  photoProps->setIcon(KIcon( QLatin1String( "image-x-generic" )));
306  photoProps->setText(i18n("&Photo ID's"));
307 
308  // Keep the list in kgpg.kcfg in sync with this one!
309  QStringList list;
310  list.append(i18n("Disable"));
311  list.append(i18nc("small picture", "Small"));
312  list.append(i18nc("medium picture", "Medium"));
313  list.append(i18nc("large picture", "Large"));
314  photoProps->setItems(list);
315 
316  trustProps = actionCollection()->add<KSelectAction>(QLatin1String( "trust_filter_settings" ));
317  trustProps->setText(i18n("Minimum &Trust"));
318 
319  QStringList tlist;
320  tlist.append(i18nc("no filter: show all keys", "&None"));
321  tlist.append(i18nc("show only active keys", "&Active"));
322  tlist.append(i18nc("show only keys with at least marginal trust", "&Marginal"));
323  tlist.append(i18nc("show only keys with at least full trust", "&Full"));
324  tlist.append(i18nc("show only ultimately trusted keys", "&Ultimate"));
325 
326  trustProps->setItems(tlist);
327 
328  iproxy = new KeyListProxyModel(this);
329  iproxy->setKeyModel(imodel);
330  connect(this, SIGNAL(readAgainOptions()), iproxy, SLOT(settingsChanged()));
331 
332  iview = new KeyTreeView(this, iproxy);
333  connect(iview, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(defaultAction(QModelIndex)));
334  connect(iview, SIGNAL(importDrop(KUrl::List)), SLOT(slotImport(KUrl::List)));
335  iview->setSelectionMode(QAbstractItemView::ExtendedSelection);
336  setCentralWidget(iview);
337  iview->resizeColumnsToContents();
338  iview->setAlternatingRowColors(true);
339  iview->setSortingEnabled(true);
340  connect(iview, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(slotMenu(QPoint)));
341  iview->setContextMenuPolicy(Qt::CustomContextMenu);
342  connect(iview->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)), this, SLOT(checkList()));
343 
344  connect (iview, SIGNAL(returnPressed()), SLOT(slotDefaultAction()));
345 
346  hPublic = actionCollection()->add<KToggleAction>(QLatin1String("show_secret"), iproxy, SLOT(setOnlySecret(bool)));
347  hPublic->setIcon(KIcon( QLatin1String( "view-key-secret" )));
348  hPublic->setText(i18n("&Show Only Secret Keys"));
349  hPublic->setChecked(KGpgSettings::showSecret());
350 
351  int psize = KGpgSettings::photoProperties();
352  photoProps->setCurrentItem(psize);
353  slotSetPhotoSize(psize);
354  psize = KGpgSettings::trustLevel();
355  trustProps->setCurrentItem(psize);
356  slotSetTrustFilter(psize);
357  slotShowLongId(KGpgSettings::showLongKeyId());
358 
359  m_popuppub = new KMenu(this);
360  m_popuppub->addAction(exportPublicKey);
361  m_popuppub->addAction(m_sendEmail);
362  m_popuppub->addAction(signMailUid);
363  m_popuppub->addAction(signKey);
364  m_popuppub->addAction(signUid);
365  m_popuppub->addAction(deleteKey);
366  m_popuppub->addAction(infoKey);
367  m_popuppub->addAction(openKeyUrl);
368  m_popuppub->addAction(editKey);
369  m_popuppub->addAction(refreshKey);
370  m_popuppub->addAction(createGroup);
371  m_popuppub->addSeparator();
372  m_popuppub->addAction(importAllSignKeys);
373 
374  m_popupsec = new KMenu(this);
375  m_popupsec->addAction(exportPublicKey);
376  m_popupsec->addAction(m_sendEmail);
377  m_popupsec->addAction(signKey);
378  m_popupsec->addAction(signUid);
379  m_popupsec->addAction(signMailUid);
380  m_popupsec->addAction(infoKey);
381  m_popupsec->addAction(openKeyUrl);
382  m_popupsec->addAction(editKey);
383  m_popupsec->addAction(refreshKey);
384  m_popupsec->addAction(setDefaultKey);
385  m_popupsec->addSeparator();
386  m_popupsec->addAction(importAllSignKeys);
387  m_popupsec->addSeparator();
388  m_popupsec->addAction(addPhoto);
389  m_popupsec->addAction(addUid);
390  m_popupsec->addAction(exportSecretKey);
391  m_popupsec->addAction(deleteKeyPair);
392 
393  m_popupgroup = new KMenu(this);
394  m_popupgroup->addAction(editCurrentGroup);
395  m_popupgroup->addAction(m_groupRename);
396  m_popupgroup->addAction(delGroup);
397  m_popupgroup->addAction(refreshKey);
398 
399  m_popupout = new KMenu(this);
400  m_popupout->addAction(importKey);
401 
402  m_popupsig = new KMenu();
403  m_popupsig->addAction(importSignatureKey);
404  m_popupsig->addAction(delSignKey);
405 
406  m_popupphoto = new KMenu(this);
407  m_popupphoto->addAction(openPhoto);
408  m_popupphoto->addAction(signUid);
409  m_popupphoto->addAction(signMailUid);
410  m_popupphoto->addAction(deletePhoto);
411 
412  m_popupuid = new KMenu(this);
413  m_popupuid->addAction(m_sendEmail);
414  m_popupuid->addAction(signMailUid);
415  m_popupuid->addAction(signUid);
416  m_popupuid->addAction(delUid);
417  m_popupuid->addAction(setPrimUid);
418 
419  m_popuporphan = new KMenu(this);
420  m_popuporphan->addAction(regeneratePublic);
421  m_popuporphan->addAction(deleteKeyPair);
422 
423  exportPublicKey->setEnabled(false);
424 
425  KConfigGroup cg = KConfigGroup(KGlobal::config().data(), "KeyView");
426  iview->restoreLayout(cg);
427 
428  connect(photoProps, SIGNAL(triggered(int)), this, SLOT(slotSetPhotoSize(int)));
429  connect(trustProps, SIGNAL(triggered(int)), this, SLOT(slotSetTrustFilter(int)));
430 
431  QLabel *searchLabel = new QLabel(i18n("Search:"), this);
432  m_listviewsearch = new KLineEdit(this);
433  m_listviewsearch->setClearButtonShown(true);
434 
435  QWidget *searchWidget = new QWidget(this);
436  QHBoxLayout *searchLayout = new QHBoxLayout(searchWidget);
437  searchLayout->setMargin(0);
438  searchLayout->addWidget(searchLabel);
439  searchLayout->addWidget(m_listviewsearch);
440  searchLayout->addStretch();
441 
442  KAction *searchLineAction = new KAction(i18nc("Name of the action that is a search line, shown for example in the toolbar configuration dialog",
443  "Search Line"), this);
444  actionCollection()->addAction(QLatin1String( "search_line" ), searchLineAction);
445  searchLineAction->setDefaultWidget(searchWidget);
446 
447  action = actionCollection()->addAction(QLatin1String("search_focus"), m_listviewsearch, SLOT(setFocus()));
448  action->setText(i18nc("Name of the action that gives the focus to the search line", "Focus Search Line"));
449  action->setShortcut(QKeySequence(Qt::Key_F6));
450  connect(m_listviewsearch, SIGNAL(textChanged(QString)), iproxy, SLOT(setFilterFixedString(QString)));
451 
452  setActionDescriptions(1);
453 
454  // get all keys data
455  setupGUI(KXmlGuiWindow::Create | Save | ToolBar | StatusBar | Keys, QLatin1String( "keysmanager.rc" ));
456 
457  sTrust->setChecked(KGpgSettings::showTrust());
458  iview->setColumnHidden(2, !KGpgSettings::showTrust());
459  sSize->setChecked(KGpgSettings::showSize());
460  iview->setColumnHidden(3, !KGpgSettings::showSize());
461  sCreat->setChecked(KGpgSettings::showCreat());
462  iview->setColumnHidden(4, !KGpgSettings::showCreat());
463  sExpi->setChecked(KGpgSettings::showExpi());
464  iview->setColumnHidden(5, !KGpgSettings::showExpi());
465  iproxy->setOnlySecret(KGpgSettings::showSecret());
466 
467  KStatusBar *statusbar = statusBar();
468  statusbar->insertPermanentFixedItem(KGpgItemModel::statusCountMessageString(9999, 999), 0);
469  statusbar->changeItem(QString(), 0);
470 
471  cg = KConfigGroup(KGlobal::config().data(), "MainWindow");
472  setAutoSaveSettings(cg, true);
473  applyMainWindowSettings(cg);
474 
475  connect(this, SIGNAL(fontChanged(QFont)), s_kgpgEditor, SLOT(slotSetFont(QFont)));
476 
477  m_netnote = Solid::Networking::notifier();
478  connect(m_netnote, SIGNAL(shouldConnect()), SLOT(slotNetworkUp()));
479  connect(m_netnote, SIGNAL(shouldDisconnect()), SLOT(slotNetworkDown()));
480 
481  toggleNetworkActions(Solid::Networking::status() == Solid::Networking::Unknown || Solid::Networking::status() == Solid::Networking::Connected);
482  importSignatureKey->setEnabled(false);
483 
484  stateChanged("empty_list");
485 
486  QMetaObject::invokeMethod(this, "refreshkey", Qt::QueuedConnection);
487 }
488 
489 KeysManager::~KeysManager()
490 {
491 }
492 
493 void KeysManager::slotGenerateKey()
494 {
495  if (m_genkey) {
496  KMessageBox::error(this,
497  i18n("Another key generation operation is still in progress.\nPlease wait a moment until this operation is complete."),
498  i18n("Generating new key pair"));
499  return;
500  }
501 
502  QPointer<KgpgKeyGenerate> kg = new KgpgKeyGenerate(this);
503  if (kg->exec() == QDialog::Accepted) {
504  if (!kg->isExpertMode()) {
505  KGpgGenerateKey *genkey = new KGpgGenerateKey(this, kg->name(), kg->email(),
506  kg->comment(), kg->algo(), kg->size(), kg->days(), kg->expiration(),
507  kg->caps());
508 
509  m_genkey = new KGpgTransactionJob(genkey);
510  connect(m_genkey, SIGNAL(result(KJob*)), SLOT(slotGenerateKeyDone(KJob*)));
511 
512  KIO::getJobTracker()->registerJob(m_genkey);
513  m_genkey->start();
514  QApplication::setOverrideCursor(Qt::BusyCursor);
515  } else {
516  KConfigGroup config(KGlobal::config(), "General");
517 
518  QString terminalApp(config.readPathEntry("TerminalApplication", QLatin1String( "konsole" )));
519  QStringList args;
520  args << QLatin1String( "-e" )
521  << KGpgSettings::gpgBinaryPath()
522  << QLatin1String("--gen-key")
523  << QLatin1String("--expert");
524 
525  QProcess *genKeyProc = new QProcess(this);
526  genKeyProc->start(terminalApp, args);
527  if (!genKeyProc->waitForStarted(-1)) {
528  KMessageBox::error(this, i18n("Generating new key pair"),
529  i18n("Can not start \"konsole\" application for expert mode."));
530  } else {
531  genKeyProc->waitForFinished(-1);
532  refreshkey();
533  }
534  }
535  }
536 
537  delete kg;
538 }
539 
540 void KeysManager::showKeyManager()
541 {
542  show();
543 }
544 
545 void KeysManager::slotOpenEditor()
546 {
547  KgpgEditor *kgpgtxtedit = new KgpgEditor(this, imodel, Qt::Window);
548 
549  connect(this, SIGNAL(fontChanged(QFont)), kgpgtxtedit, SLOT(slotSetFont(QFont)));
550 
551  kgpgtxtedit->show();
552 }
553 
554 void KeysManager::changeMessage(const QString &msg, const bool keep)
555 {
556  int timeout = keep ? 0 : 10000;
557 
558  statusBar()->showMessage(msg, timeout);
559 }
560 
561 void KeysManager::updateStatusCounter()
562 {
563  statusBar()->changeItem(imodel->statusCountMessage(), 0);
564 }
565 
566 void KeysManager::slotGenerateKeyDone(KJob *job)
567 {
568  changeMessage(i18nc("Application ready for user input", "Ready"));
569  QApplication::restoreOverrideCursor();
570 
571  KGpgTransactionJob *tjob = qobject_cast<KGpgTransactionJob *>(job);
572 
573  const KGpgGenerateKey * const genkey = qobject_cast<const KGpgGenerateKey *>(tjob->getTransaction());
574  int res = tjob->getResultCode();
575 
576  const QString infomessage(i18n("Generating new key pair"));
577 
578  switch (res) {
579  case KGpgTransaction::TS_BAD_PASSPHRASE:
580  KMessageBox::error(this, i18n("Bad passphrase. Cannot generate a new key pair."), infomessage);
581  break;
582  case KGpgTransaction::TS_USER_ABORTED:
583  KMessageBox::error(this, i18n("Aborted by the user. Cannot generate a new key pair."), infomessage);
584  break;
585  case KGpgTransaction::TS_INVALID_EMAIL:
586  KMessageBox::error(this, i18n("The email address is not valid. Cannot generate a new key pair."), infomessage);
587  break;
588  case KGpgGenerateKey::TS_INVALID_NAME:
589  KMessageBox::error(this, i18n("The name is not accepted by gpg. Cannot generate a new key pair."), infomessage);
590  break;
591  case KGpgTransaction::TS_OK: {
592  updateStatusCounter();
593 
594  QPointer<KDialog> keyCreated = new KDialog(this);
595  keyCreated->setCaption(i18n("New Key Pair Created"));
596  keyCreated->setButtons(KDialog::Ok);
597  keyCreated->setDefaultButton(KDialog::Ok);
598  keyCreated->setModal(true);
599 
600  newKey *page = new newKey(keyCreated);
601  page->TLname->setText(QLatin1String( "<b>" ) + genkey->getName() + QLatin1String( "</b>" ));
602 
603  const QString email(genkey->getEmail());
604  page->TLemail->setText(QLatin1String( "<b>" ) + email + QLatin1String( "</b>" ));
605 
606  QString revurl;
607  const QString gpgPath(KGpgSettings::gpgConfigPath());
608  if (!gpgPath.isEmpty())
609  revurl = KUrl::fromPath(gpgPath).directory(KUrl::AppendTrailingSlash);
610  else
611  revurl = QDir::homePath() + QLatin1Char( '/' );
612 
613  if (!email.isEmpty())
614  page->kURLRequester1->setUrl(QString(revurl + email.section(QLatin1Char( '@' ), 0, 0) + QLatin1String( ".revoke" )));
615  else
616  page->kURLRequester1->setUrl(QString(revurl + genkey->getName().section(QLatin1Char(' '), 0, 0) + QLatin1String(".revoke")));
617 
618  const QString fingerprint(genkey->getFingerprint());
619  page->TLid->setText(QLatin1String( "<b>" ) + fingerprint.right(8) + QLatin1String( "</b>" ));
620  page->LEfinger->setText(fingerprint);
621  page->CBdefault->setChecked(true);
622  page->show();
623  keyCreated->setMainWidget(page);
624 
625  keyCreated->exec();
626  if (keyCreated.isNull())
627  return;
628 
629  imodel->refreshKey(fingerprint);
630  KGpgKeyNode *knode = imodel->getRootNode()->findKey(fingerprint);
631  if (page->CBdefault->isChecked())
632  imodel->setDefaultKey(knode);
633 
634  iview->selectNode(knode);
635 
636  if (page->CBsave->isChecked() || page->CBprint->isChecked()) {
637  KUrl revurl;
638  if (page->CBsave->isChecked())
639  revurl = page->kURLRequester1->url();
640 
641  KGpgGenerateRevoke *genRev = new KGpgGenerateRevoke(this, fingerprint, revurl,
642  0, i18n("backup copy"));
643 
644  connect(genRev, SIGNAL(done(int)), SLOT(slotRevokeGenerated(int)));
645 
646  if (page->CBprint->isChecked())
647  connect(genRev, SIGNAL(revokeCertificate(QString)), SLOT(doPrint(QString)));
648 
649  genRev->start();
650  }
651  delete keyCreated;
652  break;
653  }
654  default:
655  KMessageBox::detailedError(this,
656  i18n("gpg process did not finish. Cannot generate a new key pair."),
657  genkey->gpgErrorMessage(), infomessage);
658  }
659 
660  m_genkey = NULL;
661 }
662 
663 void KeysManager::slotShowTrust()
664 {
665  bool b = !sTrust->isChecked();
666  iview->setColumnHidden(KEYCOLUMN_TRUST, b);
667  if (!b && (iview->columnWidth(KEYCOLUMN_TRUST) == 0))
668  iview->resizeColumnToContents(KEYCOLUMN_TRUST);
669 }
670 
671 void KeysManager::slotShowExpiration()
672 {
673  bool b = !sExpi->isChecked();
674  iview->setColumnHidden(KEYCOLUMN_EXPIR, b);
675  if (!b && (iview->columnWidth(KEYCOLUMN_EXPIR) == 0))
676  iview->resizeColumnToContents(KEYCOLUMN_EXPIR);
677 }
678 
679 void KeysManager::slotShowSize()
680 {
681  bool b = !sSize->isChecked();
682  iview->setColumnHidden(KEYCOLUMN_SIZE, b);
683  if (!b && (iview->columnWidth(KEYCOLUMN_SIZE) == 0))
684  iview->resizeColumnToContents(KEYCOLUMN_SIZE);
685 }
686 
687 void KeysManager::slotShowCreation()
688 {
689  bool b = !sCreat->isChecked();
690  iview->setColumnHidden(KEYCOLUMN_CREAT, b);
691  if (!b && (iview->columnWidth(KEYCOLUMN_CREAT) == 0))
692  iview->resizeColumnToContents(KEYCOLUMN_CREAT);
693 }
694 
695 void KeysManager::slotShowLongId(bool b)
696 {
697  iproxy->setIdLength(b ? 16 : 8);
698 }
699 
700 void KeysManager::slotSetTrustFilter(int i)
701 {
702  KgpgCore::KgpgKeyTrustFlag t;
703 
704  Q_ASSERT((i >= 0) && (i < 5));
705  switch (i) {
706  case 0:
707  t = TRUST_MINIMUM;
708  break;
709  case 1:
710  t = TRUST_UNDEFINED;
711  break;
712  case 2:
713  t = TRUST_MARGINAL;
714  break;
715  case 3:
716  t = TRUST_FULL;
717  break;
718  default:
719  t = TRUST_ULTIMATE;
720  }
721 
722  iproxy->setTrustFilter(t);
723 }
724 
725 bool KeysManager::eventFilter(QObject *, QEvent *e)
726 {
727  if ((e->type() == QEvent::Show) && (showTipOfDay)) {
728  KTipDialog::showTip(this, QLatin1String("kgpg/tips"), false);
729  showTipOfDay = false;
730  }
731 
732  return false;
733 }
734 
735 void KeysManager::slotGotoDefaultKey()
736 {
737  iview->selectNode(imodel->getRootNode()->findKey(KGpgSettings::defaultKey()));
738 }
739 
740 void KeysManager::refreshKeyFromServer()
741 {
742  QList<KGpgNode *> keysList(iview->selectedNodes());
743  if (keysList.isEmpty())
744  return;
745 
746  QStringList keyIDS;
747 
748  foreach (KGpgNode *item, keysList) {
749  if (item->getType() == ITYPE_GROUP)
750  {
751  for (int j = 0; j < item->getChildCount(); j++)
752  keyIDS << item->getChild(j)->getId();
753 
754  continue;
755  }
756 
757  if (item->getType() & ITYPE_PAIR) {
758  keyIDS << item->getId();
759  } else {
760  KMessageBox::sorry(this, i18n("You can only refresh primary keys. Please check your selection."));
761  return;
762  }
763  }
764 
765  QString proxy;
766  if (KGpgSettings::useProxy())
767  proxy = QLatin1String( qgetenv("http_proxy") );
768 
769  KGpgRefreshKeys *t = new KGpgRefreshKeys(this, KGpgSettings::keyServers().first(), keyIDS, true, proxy);
770  connect(t, SIGNAL(done(int)), SLOT(slotKeyRefreshDone(int)));
771  QApplication::setOverrideCursor(QCursor(Qt::BusyCursor));
772  t->start();
773 }
774 
775 void KeysManager::slotKeyRefreshDone(int result)
776 {
777  KGpgRefreshKeys *t = qobject_cast<KGpgRefreshKeys *>(sender());
778  Q_ASSERT(t != NULL);
779 
780  if (result == KGpgTransaction::TS_USER_ABORTED) {
781  t->deleteLater();
782  QApplication::restoreOverrideCursor();
783  return;
784  }
785 
786  const QStringList log(t->getLog());
787  const QStringList keys = KGpgImport::getImportedIds(log, 0xffff);
788  const QStringList message(KGpgImport::getImportMessage(log));
789 
790  t->deleteLater();
791 
792  if (!keys.empty())
793  imodel->refreshKeys(keys);
794 
795  QApplication::restoreOverrideCursor();
796  (void) new KgpgDetailedInfo(this, message.join(QLatin1String("\n")), log.join(QLatin1String("<br/>")),
797  KGpgImport::getDetailedImportMessage(log, imodel).split(QLatin1Char('\n')));
798 }
799 
800 void KeysManager::slotDelUid()
801 {
802  KGpgUidNode *nd = iview->selectedNode()->toUidNode();
803 
804  KGpgDelUid *deluid = new KGpgDelUid(this, nd);
805 
806  connect(deluid, SIGNAL(done(int)), SLOT(slotDelUidDone(int)));
807  deluid->start();
808 }
809 
810 void KeysManager::slotDelUidDone(int result)
811 {
812  KGpgDelUid * const deluid = qobject_cast<KGpgDelUid *>(sender());
813  Q_ASSERT(deluid != NULL);
814 
815  sender()->deleteLater();
816  if (result == KGpgTransaction::TS_OK)
817  imodel->refreshKey(deluid->getKeyId());
818  // FIXME: do something useful with result if it is a failure
819 }
820 
821 void KeysManager::slotPrimUid()
822 {
823  KGpgPrimaryUid *puid = new KGpgPrimaryUid(this, iview->selectedNode()->toUidNode());
824 
825  connect(puid, SIGNAL(done(int)), SLOT(slotPrimUidDone(int)));
826 
827  puid->start();
828 }
829 
830 void KeysManager::slotPrimUidDone(int result)
831 {
832  const QString kid(qobject_cast<KGpgPrimaryUid *>(sender())->getKeyId());
833 
834  sender()->deleteLater();
835 
836  if (result == KGpgTransaction::TS_OK)
837  imodel->refreshKey(kid);
838  // FIXME: some error reporting
839 }
840 
841 void KeysManager::slotregenerate()
842 {
843  QString regID = iview->selectedNode()->getId();
844  KProcess *p1, *p2, *p3;
845 
846  p1 = new KProcess(this);
847  *p1 << KGpgSettings::gpgBinaryPath()
848  << QLatin1String("--no-secmem-warning")
849  << QLatin1String("--export-secret-key")
850  << regID;
851  p1->setOutputChannelMode(KProcess::OnlyStdoutChannel);
852 
853  p2 = new KProcess(this);
854  *p2 << QLatin1String("gpgsplit")
855  << QLatin1String("--no-split")
856  << QLatin1String("--secret-to-public");
857  p2->setOutputChannelMode(KProcess::OnlyStdoutChannel);
858 
859  p3 = new KProcess(this);
860  *p3 << KGpgSettings::gpgBinaryPath()
861  << QLatin1String("--import");
862 
863  p1->setStandardOutputProcess(p2);
864  p2->setStandardOutputProcess(p3);
865 
866  p1->start();
867  p2->start();
868  p3->start();
869 
870  p1->waitForFinished();
871  p2->waitForFinished();
872  p3->waitForFinished();
873 
874  delete p1;
875  delete p2;
876  delete p3;
877 
878  imodel->refreshKey(regID);
879 }
880 
881 void KeysManager::slotAddUid()
882 {
883  if (m_adduid) {
884  KMessageBox::error(this, i18n("Another operation is still in progress.\nPlease wait a moment until this operation is complete."),
885  i18n("Add New User Id"));
886  return;
887  }
888 
889  addUidWidget = new KDialog(this );
890  addUidWidget->setCaption( i18n("Add New User Id") );
891  addUidWidget->setButtons( KDialog::Ok | KDialog::Cancel );
892  addUidWidget->setDefaultButton( KDialog::Ok );
893  addUidWidget->setModal( true );
894  addUidWidget->enableButtonOk(false);
895  AddUid *keyUid = new AddUid(addUidWidget);
896  addUidWidget->setMainWidget(keyUid);
897  //keyUid->setMinimumSize(keyUid->sizeHint());
898  keyUid->setMinimumWidth(300);
899 
900  connect(keyUid->kLineEdit1, SIGNAL(textChanged(QString)), this, SLOT(slotAddUidEnable(QString)));
901  if (addUidWidget->exec() != QDialog::Accepted)
902  return;
903 
904  m_adduid = new KGpgAddUid(this, iview->selectedNode()->getId(), keyUid->kLineEdit1->text(),
905  keyUid->kLineEdit2->text(), keyUid->kLineEdit3->text());
906  connect(m_adduid, SIGNAL(done(int)), SLOT(slotAddUidFin(int)));
907  m_adduid->start();
908 }
909 
910 void KeysManager::slotAddUidFin(int res)
911 {
912  // TODO error reporting
913  if (res == 0)
914  imodel->refreshKey(m_adduid->getKeyid());
915  m_adduid->deleteLater();
916  m_adduid = NULL;
917 }
918 
919 void KeysManager::slotAddUidEnable(const QString & name)
920 {
921  addUidWidget->enableButtonOk(name.length() > 4);
922 }
923 
924 void KeysManager::slotAddPhoto()
925 {
926  QString mess = i18n("The image must be a JPEG file. Remember that the image is stored within your public key, so "
927  "if you use a very large picture, your key will become very large as well. The size should not exceed 6 KiB. "
928  "An image size of around 240x288 is a good size to use.");
929 
930  if (KMessageBox::warningContinueCancel(0, mess) != KMessageBox::Continue)
931  return;
932 
933  QString imagepath = KFileDialog::getOpenFileName(KUrl(), QLatin1String( "image/jpeg" ), 0);
934  if (imagepath.isEmpty())
935  return;
936 
937  KGpgAddPhoto *addphoto = new KGpgAddPhoto(this, iview->selectedNode()->getId(), imagepath);
938  connect(addphoto, SIGNAL(done(int)), SLOT(slotAddPhotoFinished(int)));
939  addphoto->start();
940 }
941 
942 void KeysManager::slotAddPhotoFinished(int res)
943 {
944  sender()->deleteLater();
945 
946  // TODO : add res == 3 (bad passphrase)
947 
948  if (res == 0)
949  slotUpdatePhoto();
950 }
951 
952 void KeysManager::slotDeletePhoto()
953 {
954  KGpgNode *nd = iview->selectedNode();
955  KGpgUatNode *und = nd->toUatNode();
956  KGpgKeyNode *parent = und->getParentKeyNode();
957 
958  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>",
959  und->getId(), parent->getName(), parent->getEmail());
960 
961  KGpgDelUid *deluid = new KGpgDelUid(this, und);
962  connect(deluid, SIGNAL(done(int)), SLOT(slotDelPhotoFinished(int)));
963 
964  deluid->start();
965 }
966 
967 void KeysManager::slotDelPhotoFinished(int res)
968 {
969  sender()->deleteLater();
970 
971  // TODO : add res == 3 (bad passphrase)
972 
973  if (res == 0) {
974  KGpgNode *nd = iview->selectedNode();
975  imodel->refreshKey(nd->getParentKeyNode()->toKeyNode());
976  }
977 }
978 
979 void KeysManager::slotUpdatePhoto()
980 {
981  KGpgNode *nd = iview->selectedNode();
982  imodel->refreshKey(nd->toKeyNode());
983 }
984 
985 void KeysManager::slotSetPhotoSize(int size)
986 {
987  switch(size) {
988  case 1:
989  iproxy->setPreviewSize(22);
990  break;
991  case 2:
992  iproxy->setPreviewSize(42);
993  break;
994  case 3:
995  iproxy->setPreviewSize(65);
996  break;
997  default:
998  iproxy->setPreviewSize(0);
999  break;
1000  }
1001 }
1002 
1003 void KeysManager::addToKAB()
1004 {
1005  KGpgNode *nd = iview->selectedNode();
1006  if (nd == NULL)
1007  return;
1008 
1009  Akonadi::ContactSearchJob * const job = new Akonadi::ContactSearchJob();
1010  job->setLimit(1);
1011  job->setQuery(Akonadi::ContactSearchJob::Email, nd->getEmail());
1012  connect(job, SIGNAL(result(KJob*)), this, SLOT(slotAddressbookSearchResult(KJob*)));
1013 
1014  m_addIds[job] = nd;
1015 }
1016 
1017 void KeysManager::slotAddressbookSearchResult(KJob *job)
1018 {
1019  KGpgNode * const nd = m_addIds.value(job, 0);
1020 
1021  if (!nd)
1022  return;
1023 
1024  Akonadi::ContactSearchJob *searchJob = qobject_cast<Akonadi::ContactSearchJob*>(job);
1025  Q_ASSERT(searchJob);
1026  const KABC::Addressee::List addresseeList = searchJob->contacts();
1027 
1028  m_addIds.take(job);
1029 
1030  Akonadi::ContactEditorDialog *dlg;
1031 // KABC::Key key; TODO
1032  if (!addresseeList.isEmpty()) {
1033  dlg = new Akonadi::ContactEditorDialog(Akonadi::ContactEditorDialog::EditMode, this);
1034  dlg->setContact(searchJob->items().first());
1035  } else {
1036  KABC::Addressee addressee;
1037  addressee.setNameFromString(nd->getName());
1038  addressee.setEmails(QStringList(nd->getEmail()));
1039  dlg = new Akonadi::ContactEditorDialog(Akonadi::ContactEditorDialog::CreateMode, this);
1040  dlg->editor()->setContactTemplate(addressee);
1041  }
1042 
1043  connect(dlg, SIGNAL(finished()), dlg, SLOT(deleteLater()));
1044  dlg->show();
1045 }
1046 
1047 void KeysManager::slotManpage()
1048 {
1049  KToolInvocation::startServiceByDesktopName(QLatin1String("khelpcenter"),
1050  QLatin1String("man:/gpg"), 0, 0, 0, QByteArray(), true);
1051 }
1052 
1053 void KeysManager::slotTip()
1054 {
1055  KTipDialog::showTip(this, QLatin1String("kgpg/tips"), true);
1056 }
1057 
1058 void KeysManager::showKeyServer()
1059 {
1060  QPointer<KeyServer> ks = new KeyServer(this, imodel);
1061  connect(ks, SIGNAL(importFinished(QStringList)), imodel, SLOT(refreshKeys(QStringList)));
1062  ks->exec();
1063 
1064  delete ks;
1065  refreshkey();
1066 }
1067 
1068 void KeysManager::checkList()
1069 {
1070  QList<KGpgNode *> exportList = iview->selectedNodes();
1071 
1072  switch (exportList.count()) {
1073  case 0:
1074  stateChanged("empty_list");
1075  return;
1076  case 1:
1077  if (exportList.at(0)->getType() == ITYPE_GROUP) {
1078  stateChanged(QLatin1String( "group_selected" ));
1079  } else {
1080  stateChanged(QLatin1String( "single_selected" ));
1081  m_revokeKey->setEnabled(exportList.at(0)->getType() == ITYPE_PAIR);
1082  if (terminalkey)
1083  editKey->setEnabled(false);
1084  m_sendEmail->setEnabled(!exportList[0]->getEmail().isEmpty());
1085  setDefaultKey->setEnabled(!imodel->isDefaultKey(exportList[0]));
1086  }
1087  break;
1088  default:
1089  stateChanged(QLatin1String( "multi_selected" ));
1090  }
1091  if (!m_online)
1092  refreshKey->setEnabled(false);
1093 
1094  switch (exportList.at(0)->getType()) {
1095  case ITYPE_PUBLIC:
1096  changeMessage(i18n("Public Key"));
1097  break;
1098  case ITYPE_SUB:
1099  changeMessage(i18n("Sub Key"));
1100  break;
1101  case ITYPE_PAIR:
1102  changeMessage(i18n("Secret Key Pair"));
1103  break;
1104  case ITYPE_GROUP:
1105  changeMessage(i18n("Key Group"));
1106  break;
1107  case ITYPE_SIGN:
1108  changeMessage(i18n("Signature"));
1109  break;
1110  case ITYPE_UID:
1111  changeMessage(i18n("User ID"));
1112  break;
1113  case ITYPE_REVSIGN:
1114  changeMessage(i18n("Revocation Signature"));
1115  break;
1116  case ITYPE_UAT:
1117  changeMessage(i18n("Photo ID"));
1118  break;
1119  case ITYPE_SECRET:
1120  changeMessage(i18n("Orphaned Secret Key"));
1121  break;
1122  case ITYPE_GPUBLIC:
1123  case ITYPE_GSECRET:
1124  case ITYPE_GPAIR:
1125  changeMessage(i18n("Group member"));
1126  break;
1127  default:
1128  kDebug(2100) << "Oops, unmatched type value" << exportList.at(0)->getType();
1129  }
1130 }
1131 
1132 void KeysManager::quitApp()
1133 {
1134  // close window
1135  saveToggleOpts();
1136  qApp->quit();
1137 }
1138 
1139 void KeysManager::saveToggleOpts(void)
1140 {
1141  KConfigGroup cg = KConfigGroup(KGlobal::config().data(), "KeyView");
1142  iview->saveLayout(cg);
1143  KGpgSettings::setPhotoProperties(photoProps->currentItem());
1144  KGpgSettings::setShowTrust(sTrust->isChecked());
1145  KGpgSettings::setShowExpi(sExpi->isChecked());
1146  KGpgSettings::setShowCreat(sCreat->isChecked());
1147  KGpgSettings::setShowSize(sSize->isChecked());
1148  KGpgSettings::setTrustLevel(trustProps->currentItem());
1149  KGpgSettings::setShowSecret(hPublic->isChecked());
1150  KGpgSettings::setShowLongKeyId(longId->isChecked());
1151  KGpgSettings::self()->writeConfig();
1152 }
1153 
1154 void KeysManager::readOptions()
1155 {
1156  m_clipboardmode = QClipboard::Clipboard;
1157  if (KGpgSettings::useMouseSelection() && (kapp->clipboard()->supportsSelection()))
1158  m_clipboardmode = QClipboard::Selection;
1159 
1160  if (imodel != NULL)
1161  updateStatusCounter();
1162 
1163  showTipOfDay = KGpgSettings::showTipOfDay();
1164 
1165  if (KGpgSettings::showSystray()) {
1166  setupTrayIcon();
1167  } else {
1168  delete m_trayicon;
1169  m_trayicon = NULL;
1170  }
1171 }
1172 
1173 void KeysManager::showOptions()
1174 {
1175  if (KConfigDialog::showDialog(QLatin1String( "settings" )))
1176  return;
1177 
1178  QPointer<kgpgOptions> optionsDialog = new kgpgOptions(this, imodel);
1179  connect(optionsDialog, SIGNAL(settingsUpdated()), SLOT(readAllOptions()));
1180  connect(optionsDialog, SIGNAL(homeChanged()), imodel, SLOT(refreshKeys()));
1181  connect(optionsDialog, SIGNAL(homeChanged()), imodel, SLOT(refreshGroups()));
1182  connect(optionsDialog, SIGNAL(refreshTrust(KgpgCore::KgpgKeyTrust,QColor)), imodel, SLOT(refreshTrust(KgpgCore::KgpgKeyTrust,QColor)));
1183  connect(optionsDialog, SIGNAL(changeFont(QFont)), SIGNAL(fontChanged(QFont)));
1184  optionsDialog->exec();
1185  delete optionsDialog;
1186 
1187  s_kgpgEditor->m_recentfiles->setMaxItems(KGpgSettings::recentFiles());
1188 }
1189 
1190 void KeysManager::readAllOptions()
1191 {
1192  readOptions();
1193  emit readAgainOptions();
1194 }
1195 
1196 void KeysManager::slotSetDefKey()
1197 {
1198  setDefaultKeyNode(iview->selectedNode()->toKeyNode());
1199 }
1200 
1201 void KeysManager::slotSetDefaultKey(const QString &newID)
1202 {
1203  KGpgKeyNode *ndef = imodel->getRootNode()->findKey(newID);
1204 
1205  if (ndef == NULL) {
1206  KGpgSettings::setDefaultKey(newID);
1207  KGpgSettings::self()->writeConfig();
1208  return;
1209  }
1210 
1211  setDefaultKeyNode(ndef);
1212 }
1213 
1214 void KeysManager::setDefaultKeyNode(KGpgKeyNode *key)
1215 {
1216  const QString &newID(key->getId());
1217 
1218  if (newID == KGpgSettings::defaultKey())
1219  return;
1220 
1221  KGpgSettings::setDefaultKey(newID);
1222  KGpgSettings::self()->writeConfig();
1223 
1224  imodel->setDefaultKey(key);
1225 }
1226 
1227 void
1228 KeysManager::setActionDescriptions(int cnt)
1229 {
1230  signUid->setText(i18np("&Sign User ID ...", "&Sign User IDs ...", cnt));
1231  signMailUid->setText(i18np("Sign and &Mail User ID ...", "Sign and &Mail User IDs ...", cnt));
1232  exportPublicKey->setText(i18np("E&xport Public Key...", "E&xport Public Keys...", cnt));
1233  refreshKey->setText(i18np("&Refresh Key From Keyserver", "&Refresh Keys From Keyserver", cnt));
1234  createGroup->setText(i18np("&Create Group with Selected Key...", "&Create Group with Selected Keys...", cnt));
1235  signKey->setText(i18np("&Sign Key...", "&Sign Keys...", cnt));
1236  delUid->setText(i18np("&Delete User ID", "&Delete User IDs", cnt));
1237  delSignKey->setText(i18np("Delete Sign&ature", "Delete Sign&atures", cnt));
1238  importSignatureKey->setText(i18np("Import Key From Keyserver", "Import Keys From Keyserver", cnt));
1239  deleteKey->setText(i18np("&Delete Key", "&Delete Keys", cnt));
1240 }
1241 
1242 void
1243 KeysManager::slotMenu(const QPoint &pos)
1244 {
1245  QPoint globpos = iview->mapToGlobal(pos);
1246  bool sametype;
1247  KgpgItemType itype;
1248  QList<KGpgNode *> ndlist(iview->selectedNodes(&sametype, &itype));
1249  bool unksig = false;
1250  QSet<QString> l;
1251  int cnt = ndlist.count();
1252 
1253  // find out if an item has unknown signatures. Only check if the item has been
1254  // expanded before as expansion is very expensive and can take several seconds
1255  // that will freeze the UI meanwhile.
1256  foreach (KGpgNode *nd, ndlist) {
1257  if (!nd->hasChildren())
1258  continue;
1259 
1260  KGpgExpandableNode *exnd = nd->toExpandableNode();
1261  if (!exnd->wasExpanded()) {
1262  unksig = true;
1263  break;
1264  }
1265  getMissingSigs(l, exnd);
1266  if (!l.isEmpty()) {
1267  unksig = true;
1268  break;
1269  }
1270  }
1271  importAllSignKeys->setEnabled(unksig && m_online);
1272 
1273  signUid->setEnabled(!(itype & ~(ITYPE_PAIR | ITYPE_UID | ITYPE_UAT)));
1274  signMailUid->setEnabled(signUid->isEnabled());
1275  setActionDescriptions(cnt);
1276 
1277  if (itype == ITYPE_SIGN) {
1278  bool allunksig = true;
1279  foreach (KGpgNode *nd, ndlist) {
1280  allunksig = nd->toSignNode()->isUnknown();
1281  if (!allunksig)
1282  break;
1283  }
1284 
1285  importSignatureKey->setEnabled(allunksig && m_online);
1286  delSignKey->setEnabled( (cnt == 1) );
1287  m_popupsig->exec(globpos);
1288  } else if (itype == ITYPE_UID) {
1289  if (cnt == 1) {
1290  KGpgKeyNode *knd = ndlist.at(0)->toUidNode()->getParentKeyNode();
1291  setPrimUid->setEnabled(knd->getType() & ITYPE_SECRET);
1292  }
1293  m_popupuid->exec(globpos);
1294  } else if ((itype == ITYPE_UAT) && (cnt == 1)) {
1295  m_popupphoto->exec(globpos);
1296  } else if ((itype == ITYPE_PAIR) && (cnt == 1)) {
1297  m_popupsec->exec(globpos);
1298  } else if ((itype == ITYPE_SECRET) && (cnt == 1)) {
1299  m_popuporphan->exec(globpos);
1300  } else if (itype == ITYPE_GROUP) {
1301  delGroup->setEnabled( (cnt == 1) );
1302  editCurrentGroup->setEnabled( (cnt == 1) );
1303  m_groupRename->setEnabled( (cnt == 1) );
1304  m_popupgroup->exec(globpos);
1305  } else if (!(itype & ~(ITYPE_PAIR | ITYPE_GROUP))) {
1306  signKey->setEnabled(!(itype & ITYPE_GROUP));
1307  deleteKey->setEnabled(!(itype & ITYPE_GROUP));
1308  setDefaultKey->setEnabled( (cnt == 1) );
1309  m_popuppub->exec(globpos);
1310  } else if (!(itype & ~(ITYPE_UID | ITYPE_PAIR | ITYPE_UAT))) {
1311  setPrimUid->setEnabled(false);
1312  delUid->setEnabled(false);
1313  m_popupuid->exec(globpos);
1314  } else {
1315  m_popupout->exec(globpos);
1316  }
1317 }
1318 
1319 void KeysManager::revokeWidget()
1320 {
1321  KGpgNode *nd = iview->selectedNode();
1322  KDialog *keyRevokeDialog = new KGpgRevokeDialog(this, nd->toKeyNode());
1323 
1324  connect(keyRevokeDialog, SIGNAL(finished(int)), SLOT(slotRevokeDialogFinished(int)));
1325 
1326  keyRevokeDialog->open();
1327 }
1328 
1329 void KeysManager::slotRevokeDialogFinished(int result)
1330 {
1331  sender()->deleteLater();
1332 
1333  if (result != QDialog::Accepted)
1334  return;
1335 
1336  KGpgRevokeDialog *keyRevokeDialog = qobject_cast<KGpgRevokeDialog *>(sender());
1337 
1338  KGpgGenerateRevoke *genRev = new KGpgGenerateRevoke(this, keyRevokeDialog->getId(), keyRevokeDialog->saveUrl(),
1339  keyRevokeDialog->getReason(), keyRevokeDialog->getDescription());
1340 
1341  connect(genRev, SIGNAL(done(int)), SLOT(slotRevokeGenerated(int)));
1342 
1343  if (keyRevokeDialog->printChecked())
1344  connect(genRev, SIGNAL(revokeCertificate(QString)), SLOT(doPrint(QString)));
1345  if (keyRevokeDialog->importChecked())
1346  connect(genRev, SIGNAL(revokeCertificate(QString)), SLOT(slotImportRevokeTxt(QString)));
1347 
1348  genRev->start();
1349 }
1350 
1351 void KeysManager::slotRevokeGenerated(int result)
1352 {
1353  KGpgGenerateRevoke *genRev = qobject_cast<KGpgGenerateRevoke *>(sender());
1354 
1355  genRev->deleteLater();
1356 
1357  switch (result) {
1358  case KGpgTransaction::TS_OK:
1359  case KGpgTransaction::TS_USER_ABORTED:
1360  break;
1361  default:
1362  KMessageBox::detailedSorry(this, i18n("Creation of the revocation certificate failed..."), genRev->getOutput());
1363  break;
1364  }
1365 }
1366 
1367 void KeysManager::slotImportRevokeTxt(const QString &revokeText)
1368 {
1369  KGpgImport *import = new KGpgImport(this, revokeText);
1370  connect(import, SIGNAL(done(int)), SLOT(slotImportDone(int)));
1371  import->start();
1372 }
1373 
1374 void KeysManager::slotexportsec()
1375 {
1376  // export secret key
1377  const QString warn(i18n("<qt>Secret keys <b>should not</b> be saved in an unsafe place.<br/>"
1378  "If someone else can access this file, encryption with this key will be compromised.<br/>Continue key export?</qt>"));
1379  int result = KMessageBox::warningContinueCancel(this, warn);
1380  if (result != KMessageBox::Continue)
1381  return;
1382  KGpgNode *nd = iview->selectedNode();
1383 
1384  QString sname(nd->getEmail().section(QLatin1Char( '@' ), 0, 0).section(QLatin1Char( '.' ), 0, 0));
1385  if (sname.isEmpty())
1386  sname = nd->getName().section(QLatin1Char( ' ' ), 0, 0);
1387  sname.append(QLatin1String( ".asc" ));
1388  sname.prepend(QDir::homePath() + QLatin1Char( '/' ));
1389  KUrl url(KFileDialog::getSaveUrl(sname, i18n( "*.asc|*.asc Files" ), this, i18n("Export PRIVATE KEY As")));
1390 
1391  if(!url.isEmpty()) {
1392  KGpgExport *exp = new KGpgExport(this, QStringList(nd->getId()), url.path(), QStringList(QLatin1String( "--armor" )), true);
1393 
1394  connect(exp, SIGNAL(done(int)), SLOT(slotExportSecFinished(int)));
1395 
1396  exp->start();
1397  }
1398 }
1399 
1400 void KeysManager::slotExportSecFinished(int result)
1401 {
1402  KGpgExport *exp = qobject_cast<KGpgExport *>(sender());
1403  Q_ASSERT(exp != NULL);
1404 
1405  if (result == KGpgTransaction::TS_OK) {
1406  KMessageBox::information(this,
1407  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>",
1408  exp->getKeyIds().first(), exp->getOutputFile()));
1409  } else {
1410  KMessageBox::sorry(this, i18n("Your secret key could not be exported.\nCheck the key."));
1411  }
1412 }
1413 
1414 void KeysManager::slotexport()
1415 {
1416  bool same;
1417  KgpgItemType tp;
1418 
1419  QList<KGpgNode *> ndlist(iview->selectedNodes(&same, &tp));
1420  if (ndlist.isEmpty())
1421  return;
1422  if (!(tp & ITYPE_PUBLIC) || (tp & ~ITYPE_GPAIR))
1423  return;
1424 
1425  QString sname;
1426 
1427  if (ndlist.count() == 1) {
1428  sname = ndlist.at(0)->getEmail().section(QLatin1Char( '@' ), 0, 0).section(QLatin1Char( '.' ), 0, 0);
1429  if (sname.isEmpty())
1430  sname = ndlist.at(0)->getName().section(QLatin1Char(' '), 0, 0);
1431  } else
1432  sname = QLatin1String( "keyring" );
1433 
1434  QStringList klist;
1435  for (int i = 0; i < ndlist.count(); ++i) {
1436  klist << ndlist.at(i)->getId();
1437  }
1438 
1439  sname.append(QLatin1String( ".asc" ));
1440  sname.prepend(QDir::homePath() + QLatin1Char( '/' ));
1441 
1442  QStringList serverList(KGpgSettings::keyServers());
1443  serverList.replaceInStrings(QRegExp( QLatin1String( " .*") ), QLatin1String( "" ) ); // Remove kde 3.5 (Default) tag.
1444  if (!serverList.isEmpty()) {
1445  QString defaultServer = serverList.takeFirst();
1446  qSort(serverList);
1447  serverList.prepend(defaultServer);
1448  }
1449 
1450  QPointer<KeyExport> page = new KeyExport(this, serverList);
1451 
1452  page->newFilename->setUrl(sname);
1453 
1454  if (!m_online)
1455  page->checkServer->setEnabled(false);
1456 
1457  if (page->exec() == QDialog::Accepted) {
1458  // export to file
1459  QString exportAttr;
1460 
1461  if (page->checkAttrAll->isChecked()) {
1462  // nothing
1463  } else if (page->checkAttrPhoto->isChecked()) {
1464  exportAttr = QLatin1String( "no-export-attributes" );
1465  } else {
1466  exportAttr = QLatin1String( "export-minimal" );
1467  }
1468  QStringList expopts;
1469 
1470  if (!exportAttr.isEmpty())
1471  expopts << QLatin1String( "--export-options" ) << exportAttr;
1472 
1473  if (page->checkServer->isChecked()) {
1474  KeyServer *expServer = new KeyServer(0, imodel);
1475  expServer->slotSetExportAttribute(exportAttr);
1476  expServer->slotSetKeyserver(page->destServer->currentText());
1477 
1478  expServer->slotExport(klist);
1479  } else if (page->checkFile->isChecked()) {
1480  const QString expname(page->newFilename->url().path().simplified());
1481  if (!expname.isEmpty()) {
1482 
1483  expopts.append(QLatin1String( "--armor" ));
1484 
1485  KGpgExport *exp = new KGpgExport(this, klist, expname, expopts);
1486 
1487  connect(exp, SIGNAL(done(int)), SLOT(slotExportFinished(int)));
1488 
1489  exp->start();
1490  }
1491  } else {
1492  KGpgExport *exp = new KGpgExport(this, klist, expopts);
1493 
1494  if (page->checkClipboard->isChecked())
1495  connect(exp, SIGNAL(done(int)), SLOT(slotProcessExportClip(int)));
1496  else
1497  connect(exp, SIGNAL(done(int)), SLOT(slotProcessExportMail(int)));
1498 
1499  exp->start();
1500  }
1501  }
1502 
1503  delete page;
1504 }
1505 
1506 void KeysManager::slotExportFinished(int result)
1507 {
1508  KGpgExport *exp = qobject_cast<KGpgExport *>(sender());
1509  Q_ASSERT(exp != NULL);
1510 
1511  if (result == KGpgTransaction::TS_OK) {
1512  KMessageBox::information(this,
1513  i18np("<qt>The public key was successfully exported to<br/>%2</qt>",
1514  "<qt>The %1 public keys were successfully exported to<br/>%2</qt>",
1515  exp->getKeyIds().count(), exp->getOutputFile()));
1516  } else {
1517  KMessageBox::sorry(this, i18n("Your public key could not be exported\nCheck the key."));
1518  }
1519 
1520  exp->deleteLater();
1521 }
1522 
1523 void KeysManager::slotProcessExportMail(int result)
1524 {
1525  KGpgExport *exp = qobject_cast<KGpgExport *>(sender());
1526  Q_ASSERT(exp != NULL);
1527 
1528  // start default Mail application
1529  if (result == KGpgTransaction::TS_OK) {
1530  KToolInvocation::invokeMailer(QString(), QString(), QString(), QString(),QLatin1String( exp->getOutputData() ));
1531  } else {
1532  KMessageBox::sorry(this, i18n("Your public key could not be exported\nCheck the key."));
1533  }
1534 
1535  exp->deleteLater();
1536 }
1537 
1538 void KeysManager::slotProcessExportClip(int result)
1539 {
1540  KGpgExport *exp = qobject_cast<KGpgExport *>(sender());
1541  Q_ASSERT(exp != NULL);
1542 
1543  if (result == KGpgTransaction::TS_OK) {
1544  kapp->clipboard()->setText(QLatin1String( exp->getOutputData() ), m_clipboardmode);
1545  } else {
1546  KMessageBox::sorry(this, i18n("Your public key could not be exported\nCheck the key."));
1547  }
1548 
1549  exp->deleteLater();
1550 }
1551 
1552 void KeysManager::showKeyInfo(const QString &keyID)
1553 {
1554  KGpgKeyNode *key = imodel->getRootNode()->findKey(keyID);
1555 
1556  if (key == NULL)
1557  return;
1558 
1559  showProperties(key);
1560 }
1561 
1562 void KeysManager::slotShowPhoto()
1563 {
1564  KService::List list(KMimeTypeTrader::self()->query(QLatin1String( "image/jpeg" )));
1565  if (list.isEmpty()) {
1566  KMessageBox::sorry(NULL, i18n("<qt>A viewer for JPEG images is not specified.<br/>Please check your installation.</qt>"),
1567  i18n("Show photo"));
1568  return;
1569  }
1570  KGpgNode *nd = iview->selectedNode();
1571  KGpgUatNode *und = nd->toUatNode();
1572  KGpgKeyNode *parent = und->getParentKeyNode();
1573  KService::Ptr ptr = list.first();
1574 
1575  KProcess p;
1576  p << KGpgSettings::gpgBinaryPath()
1577  << QLatin1String("--no-tty")
1578  << QLatin1String("--photo-viewer")
1579  << (ptr->desktopEntryName() + QLatin1String( " %i" ))
1580  << QLatin1String("--edit-key")
1581  << parent->getId()
1582  << QLatin1String("uid")
1583  << und->getId()
1584  << QLatin1String("showphoto")
1585  << QLatin1String("quit");
1586  p.startDetached();
1587 }
1588 
1589 void KeysManager::defaultAction(const QModelIndex &index)
1590 {
1591  KGpgNode *nd = iproxy->nodeForIndex(index);
1592 
1593  defaultAction(nd);
1594 }
1595 
1596 void KeysManager::slotDefaultAction()
1597 {
1598  defaultAction(iview->selectedNode());
1599 }
1600 
1601 void KeysManager::defaultAction(KGpgNode *nd)
1602 {
1603  if (nd == NULL)
1604  return;
1605 
1606  if (iview->isEditing())
1607  return;
1608 
1609  switch (nd->getType()) {
1610  case ITYPE_GROUP:
1611  editGroup();
1612  break;
1613  case ITYPE_UAT:
1614  slotShowPhoto();
1615  break;
1616  case ITYPE_SIGN:
1617  case ITYPE_GPUBLIC:
1618  case ITYPE_GSECRET:
1619  case ITYPE_GPAIR:
1620  iview->selectNode(nd->toRefNode()->getRefNode());
1621  break;
1622  case ITYPE_SECRET:
1623  slotregenerate();
1624  break;
1625  case ITYPE_PAIR:
1626  case ITYPE_PUBLIC:
1627  showProperties(nd);
1628  return;
1629  }
1630 }
1631 
1632 void
1633 KeysManager::showProperties(KGpgNode *n)
1634 {
1635  switch (n->getType()) {
1636  case ITYPE_UAT:
1637  return;
1638  case ITYPE_PUBLIC:
1639  case ITYPE_PAIR: {
1640  KGpgKeyNode *k = n->toKeyNode();
1641  QPointer<KgpgKeyInfo> opts = new KgpgKeyInfo(k, imodel, this);
1642  connect(opts, SIGNAL(keyNeedsRefresh(KGpgKeyNode*)), imodel, SLOT(refreshKey(KGpgKeyNode*)));
1643  connect(opts->keychange, SIGNAL(keyNeedsRefresh(KGpgKeyNode*)), imodel, SLOT(refreshKey(KGpgKeyNode*)));
1644  opts->exec();
1645  delete opts;
1646  }
1647  default:
1648  return;
1649  }
1650 }
1651 
1652 void KeysManager::keyproperties()
1653 {
1654  KGpgNode *cur = iview->selectedNode();
1655  if (cur == NULL)
1656  return;
1657 
1658  KGpgKeyNode *kn;
1659 
1660  switch (cur->getType()) {
1661  case ITYPE_SECRET:
1662  case ITYPE_GSECRET:
1663  if (KMessageBox::questionYesNo(this,
1664  i18n("<p>This key is an orphaned secret key (secret key without public key.) It is currently not usable.</p>"
1665  "<p>Would you like to regenerate the public key?</p>"),
1666  QString(), KGuiItem(i18n("Generate")), KGuiItem(i18n("Do Not Generate"))) == KMessageBox::Yes)
1667  slotregenerate();
1668  return;
1669  case ITYPE_PAIR:
1670  case ITYPE_PUBLIC: {
1671  kn = cur->toKeyNode();
1672  break;
1673  }
1674  case ITYPE_GPAIR:
1675  case ITYPE_GPUBLIC: {
1676  kn = cur->toGroupMemberNode()->getRefNode();
1677  break;
1678  }
1679  default:
1680  kDebug(2100) << "Oops, called with invalid item type" << cur->getType();
1681  return;
1682  }
1683 
1684  QPointer<KgpgKeyInfo> opts = new KgpgKeyInfo(kn, imodel, this);
1685  connect(opts, SIGNAL(keyNeedsRefresh(KGpgKeyNode*)), imodel, SLOT(refreshKey(KGpgKeyNode*)));
1686  opts->exec();
1687  delete opts;
1688 }
1689 
1690 void KeysManager::deleteGroup()
1691 {
1692  KGpgNode *nd = iview->selectedNode();
1693  if (!nd || (nd->getType() != ITYPE_GROUP))
1694  return;
1695 
1696  int result = KMessageBox::warningContinueCancel(this, i18n("<qt>Are you sure you want to delete group <b>%1</b> ?</qt>",
1697  nd->getName()), QString(), KGuiItem(i18n("Delete"), QLatin1String("edit-delete")));
1698  if (result != KMessageBox::Continue)
1699  return;
1700 
1701  nd->toGroupNode()->remove();
1702  imodel->delNode(nd);
1703 
1704  updateStatusCounter();
1705 }
1706 
1707 void KeysManager::renameGroup()
1708 {
1709  if (iview->selectionModel()->selectedIndexes().isEmpty())
1710  return;
1711 
1712  QModelIndex selectedNodeIndex = iview->selectionModel()->selectedIndexes().first();
1713 
1714  iview->edit(selectedNodeIndex);
1715 }
1716 
1717 void KeysManager::createNewGroup()
1718 {
1719  QStringList badkeys;
1720  KGpgKeyNode::List keysList;
1721  KgpgItemType tp;
1722  KGpgNode::List ndlist(iview->selectedNodes(NULL, &tp));
1723 
1724  if (ndlist.isEmpty())
1725  return;
1726  if (tp & ~ITYPE_PAIR) {
1727  KMessageBox::sorry(this, i18n("<qt>You cannot create a group containing signatures, subkeys or other groups.</qt>"));
1728  return;
1729  }
1730 
1731  KgpgKeyTrustFlag mintrust;
1732  if (KGpgSettings::allowUntrustedGroupMembers()) {
1733  mintrust = KgpgCore::TRUST_UNDEFINED;
1734  } else {
1735  mintrust = KgpgCore::TRUST_FULL;
1736  }
1737 
1738  foreach (KGpgNode *nd, ndlist) {
1739  if (nd->getTrust() >= mintrust) {
1740  keysList.append(nd->toKeyNode());
1741  } else {
1742  badkeys += i18nc("<Name> (<Email>) ID: <KeyId>", "%1 (%2) ID: %3",
1743  nd->getName(), nd->getEmail(), nd->getId());
1744  }
1745  }
1746 
1747  QString groupName(KInputDialog::getText(i18n("Create New Group"),
1748  i18nc("Enter the name of the group you are creating now", "Enter new group name:"),
1749  QString(), 0, this));
1750  if (groupName.isEmpty())
1751  return;
1752  if (!keysList.isEmpty()) {
1753  if (!badkeys.isEmpty())
1754  KMessageBox::informationList(this, i18n("Following keys are not valid or not trusted and will not be added to the group:"), badkeys);
1755 
1756  iview->selectNode(imodel->addGroup(groupName, keysList));
1757  updateStatusCounter();
1758  } else {
1759  KMessageBox::sorry(this,
1760  i18n("<qt>No valid or trusted key was selected. The group <b>%1</b> will not be created.</qt>",
1761  groupName));
1762  }
1763 }
1764 
1765 void KeysManager::editGroup()
1766 {
1767  KGpgNode *nd = iview->selectedNode();
1768  if (!nd || (nd->getType() != ITYPE_GROUP))
1769  return;
1770  KGpgGroupNode *gnd = nd->toGroupNode();
1771  QPointer<KDialog> dialogGroupEdit = new KDialog(this );
1772  dialogGroupEdit->setCaption( i18n("Group Properties") );
1773  dialogGroupEdit->setButtons( KDialog::Ok | KDialog::Cancel );
1774  dialogGroupEdit->setDefaultButton( KDialog::Ok );
1775  dialogGroupEdit->setModal( true );
1776 
1777  QList<KGpgNode *> members(gnd->getChildren());
1778 
1779  groupEdit *gEdit = new groupEdit(dialogGroupEdit, &members, imodel);
1780 
1781  dialogGroupEdit->setMainWidget(gEdit);
1782 
1783  gEdit->show();
1784 
1785  if (dialogGroupEdit->exec() == QDialog::Accepted)
1786  imodel->changeGroup(gnd, members);
1787 
1788  delete dialogGroupEdit;
1789 }
1790 
1791 void KeysManager::signkey()
1792 {
1793  // another sign operation is still running
1794  if (!signList.isEmpty())
1795  return;
1796 
1797  KgpgItemType tp;
1798  QList<KGpgNode *> tmplist = iview->selectedNodes(NULL, &tp);
1799  if (tmplist.isEmpty())
1800  return;
1801 
1802  if (tp & ~ITYPE_PAIR) {
1803  KMessageBox::sorry(this, i18n("You can only sign primary keys. Please check your selection."));
1804  return;
1805  }
1806 
1807  if (tmplist.count() == 1) {
1808  KGpgKeyNode *nd = tmplist.at(0)->toKeyNode();
1809  QString opt;
1810 
1811  if (nd->getEmail().isEmpty())
1812  opt = i18n("<qt>You are about to sign key:<br /><br />%1<br />ID: %2<br />Fingerprint: <br /><b>%3</b>.<br /><br />"
1813  "You should check the key fingerprint by phoning or meeting the key owner to be sure that someone "
1814  "is not trying to intercept your communications.</qt>",
1815  nd->getName(), nd->getId().right(8), nd->getBeautifiedFingerprint());
1816  else
1817  opt = i18n("<qt>You are about to sign key:<br /><br />%1 (%2)<br />ID: %3<br />Fingerprint: <br /><b>%4</b>.<br /><br />"
1818  "You should check the key fingerprint by phoning or meeting the key owner to be sure that someone "
1819  "is not trying to intercept your communications.</qt>",
1820  nd->getName(), nd->getEmail(), nd->getId().right(8), nd->getBeautifiedFingerprint());
1821 
1822  if (KMessageBox::warningContinueCancel(this, opt) != KMessageBox::Continue) {
1823  return;
1824  }
1825  signList.append(nd);
1826  } else {
1827  QStringList signKeyList;
1828  foreach (KGpgNode *n, tmplist) {
1829  const KGpgKeyNode *nd = n->toKeyNode();
1830 
1831  if (nd->getEmail().isEmpty())
1832  signKeyList += i18nc("Name: ID", "%1: %2", nd->getName(), nd->getBeautifiedFingerprint());
1833  else
1834  signKeyList += i18nc("Name (Email): ID", "%1 (%2): %3", nd->getName(), nd->getEmail(), nd->getBeautifiedFingerprint());
1835 
1836  signList.append(n->toSignableNode());
1837  }
1838 
1839  if (KMessageBox::Continue != KMessageBox::warningContinueCancelList(this,
1840  i18n("<qt>You are about to sign the following keys in one pass.<br/><b>If you have not carefully checked all fingerprints,"
1841  " the security of your communications may be compromised.</b></qt>"),
1842  signKeyList))
1843  return;
1844  }
1845 
1846  QPointer<KgpgSelectSecretKey> opts = new KgpgSelectSecretKey(this, imodel, signList.count());
1847  if (opts->exec() != QDialog::Accepted) {
1848  delete opts;
1849  signList.clear();
1850  return;
1851  }
1852 
1853  globalkeyID = QString(opts->getKeyID());
1854  const bool localsign = opts->isLocalSign();
1855  const int checklevel = opts->getSignTrust();
1856  bool isterminal = opts->isTerminalSign();
1857  delete opts;
1858 
1859  if (isterminal) {
1860  const QString keyid(signList.at(0)->getId());
1861  signList.clear();
1862  signKeyOpenConsole(globalkeyID, keyid, checklevel, localsign);
1863  } else {
1864  keyCount = 0;
1865  m_signuids = false;
1866  signLoop(localsign, checklevel);
1867  }
1868 }
1869 
1870 void KeysManager::signuid()
1871 {
1872  // another sign operation is still running
1873  if (!signList.isEmpty())
1874  return;
1875 
1876  KgpgItemType tp;
1877  KGpgNode::List tmplist = iview->selectedNodes(NULL, &tp);
1878  if (tmplist.isEmpty())
1879  return;
1880 
1881  if (tp & ~(ITYPE_PAIR | ITYPE_UID | ITYPE_UAT)) {
1882  KMessageBox::sorry(this, i18n("You can only sign user ids and photo ids. Please check your selection."));
1883  return;
1884  }
1885 
1886  if (tmplist.count() == 1) {
1887  KGpgSignableNode *nd = tmplist.at(0)->toSignableNode();
1888  KGpgKeyNode *pnd;
1889  if (tp & ITYPE_PUBLIC)
1890  pnd = nd->toKeyNode();
1891  else
1892  pnd = nd->getParentKeyNode()->toKeyNode();
1893  QString opt;
1894 
1895  if (nd->getEmail().isEmpty())
1896  opt = i18n("<qt>You are about to sign user id:<br /><br />%1<br />ID: %2<br />Fingerprint: <br /><b>%3</b>.<br /><br />"
1897  "You should check the key fingerprint by phoning or meeting the key owner to be sure that someone "
1898  "is not trying to intercept your communications.</qt>", nd->getName(), nd->getId(), pnd->getBeautifiedFingerprint());
1899  else
1900  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 />"
1901  "You should check the key fingerprint by phoning or meeting the key owner to be sure that someone "
1902  "is not trying to intercept your communications.</qt>", nd->getName(), nd->getEmail(), nd->getId(), pnd->getBeautifiedFingerprint());
1903 
1904  if (KMessageBox::warningContinueCancel(this, opt) != KMessageBox::Continue) {
1905  return;
1906  }
1907  signList.append(nd);
1908  } else {
1909  QStringList signKeyList;
1910 
1911  foreach (KGpgNode *nd, tmplist) {
1912  const KGpgKeyNode *pnd = (nd->getType() & (ITYPE_UID | ITYPE_UAT)) ?
1913  nd->getParentKeyNode()->toKeyNode() : nd->toKeyNode();
1914 
1915  if (nd->getEmail().isEmpty())
1916  signKeyList += i18nc("Name: ID", "%1: %2",
1917  nd->getName(), pnd->getBeautifiedFingerprint());
1918  else
1919  signKeyList += i18nc("Name (Email): ID", "%1 (%2): %3",
1920  nd->getName(), nd->getEmail(), pnd->getBeautifiedFingerprint());
1921 
1922  signList.append(nd->toSignableNode());
1923  }
1924 
1925  if (KMessageBox::warningContinueCancelList(this,
1926  i18n("<qt>You are about to sign the following user ids in one pass.<br/><b>If you have not carefully checked all fingerprints,"
1927  " the security of your communications may be compromised.</b></qt>"),
1928  signKeyList) != KMessageBox::Continue)
1929  return;
1930  }
1931 
1932  QPointer<KgpgSelectSecretKey> opts = new KgpgSelectSecretKey(this, imodel, signList.count());
1933  if (opts->exec() != QDialog::Accepted) {
1934  delete opts;
1935  signList.clear();
1936  return;
1937  }
1938 
1939  globalkeyID = QString(opts->getKeyID());
1940  const bool localsign = opts->isLocalSign();
1941  const int checklevel = opts->getSignTrust();
1942  bool isterminal = opts->isTerminalSign();
1943  delete opts;
1944 
1945  if (isterminal) {
1946  const QString keyid(signList.at(0)->getId());
1947  signList.clear();
1948  signKeyOpenConsole(globalkeyID, keyid, checklevel, localsign);
1949  } else {
1950  keyCount = 0;
1951  m_signuids = true;
1952  signLoop(localsign, checklevel);
1953  }
1954 }
1955 
1956 void KeysManager::signLoop(const bool localsign, const int checklevel)
1957 {
1958  Q_ASSERT(keyCount < signList.count());
1959 
1960  KGpgSignableNode *nd = signList.at(keyCount);
1961  QString uid;
1962  QString keyid;
1963  const KGpgSignTransactionHelper::carefulCheck cc = static_cast<KGpgSignTransactionHelper::carefulCheck>(checklevel);
1964  KGpgTransaction *sta;
1965 
1966  if (m_signuids) {
1967  sta = new KGpgSignUid(this, globalkeyID, nd, localsign, cc);
1968  } else {
1969  sta = new KGpgSignKey(this, globalkeyID, nd->toKeyNode(), localsign, cc);
1970  }
1971 
1972  connect(sta, SIGNAL(done(int)), SLOT(signatureResult(int)));
1973  sta->start();
1974 }
1975 
1976 void KeysManager::signatureResult(int success)
1977 {
1978  KGpgSignTransactionHelper *ta;
1979  KGpgSignUid *suid = qobject_cast<KGpgSignUid *>(sender());
1980  if (suid != NULL) {
1981  ta = static_cast<KGpgSignTransactionHelper *>(suid);
1982  } else {
1983  ta = static_cast<KGpgSignTransactionHelper *>(static_cast<KGpgSignKey *>(sender()));
1984  }
1985  KGpgKeyNode *nd = const_cast<KGpgKeyNode *>(ta->getKey());
1986  const bool localsign = ta->getLocal();
1987  const int checklevel = ta->getChecking();
1988  const QString signer(ta->getSigner());
1989  sender()->deleteLater();
1990 
1991  switch (success) {
1992  case KGpgTransaction::TS_OK:
1993  if (refreshList.indexOf(nd) == -1)
1994  refreshList.append(nd);
1995  break;
1996  case KGpgTransaction::TS_BAD_PASSPHRASE:
1997  KMessageBox::sorry(this, i18n("<qt>Bad passphrase, key <b>%1 (%2)</b> not signed.</qt>",
1998  nd->getName(), nd->getEmail()));
1999  break;
2000  case KGpgSignTransactionHelper::TS_ALREADY_SIGNED:
2001  KMessageBox::sorry(this, i18n("<qt>The key <b>%1 (%2)</b> is already signed.</qt>",
2002  nd->getName(), nd->getEmail()));
2003  break;
2004  default:
2005  if (KMessageBox::questionYesNo(this,
2006  i18n("<qt>Signing key <b>%1</b> with key <b>%2</b> failed.<br />"
2007  "Do you want to try signing the key in console mode?</qt>",
2008  nd->getId(), signer)) == KMessageBox::Yes)
2009  signKeyOpenConsole(signer, nd->getId(), checklevel, localsign);
2010  }
2011 
2012  if (++keyCount == signList.count()) {
2013  signList.clear();
2014  imodel->refreshKeys(refreshList);
2015  refreshList.clear();
2016  } else {
2017  signLoop(localsign, checklevel);
2018  }
2019 }
2020 
2021 void KeysManager::caff()
2022 {
2023  KgpgItemType tp;
2024  KGpgNode::List tmplist = iview->selectedNodes(NULL, &tp);
2025  KGpgSignableNode::List slist;
2026  if (tmplist.isEmpty())
2027  return;
2028 
2029  if (tp & ~(ITYPE_PAIR | ITYPE_UID | ITYPE_UAT)) {
2030  KMessageBox::sorry(this, i18n("You can only sign user ids and photo ids. Please check your selection."));
2031  return;
2032  }
2033 
2034  foreach (KGpgNode *nd, tmplist) {
2035  switch (nd->getType()) {
2036  case KgpgCore::ITYPE_PAIR:
2037  case KgpgCore::ITYPE_PUBLIC: {
2038  KGpgKeyNode *knd = qobject_cast<KGpgKeyNode *>(nd);
2039  if (!knd->wasExpanded())
2040  knd->getChildCount();
2041  }
2042  }
2043  slist.append(nd->toSignableNode());
2044  }
2045 
2046  QPointer<KgpgSelectSecretKey> opts = new KgpgSelectSecretKey(this, imodel, slist.count(), false, false);
2047  if (opts->exec() != QDialog::Accepted) {
2048  delete opts;
2049  return;
2050  }
2051 
2052  KGpgCaff *ca = new KGpgCaff(this, slist, QStringList(opts->getKeyID()), opts->getSignTrust(), KGpgCaff::IgnoreAlreadySigned);
2053  delete opts;
2054 
2055  connect(ca, SIGNAL(done()), SLOT(slotCaffDone()));
2056  connect(ca, SIGNAL(aborted()), SLOT(slotCaffDone()));
2057 
2058  ca->run();
2059 }
2060 
2061 void KeysManager::slotCaffDone()
2062 {
2063  Q_ASSERT(qobject_cast<KGpgCaff *>(sender()) != NULL);
2064 
2065  sender()->deleteLater();
2066 }
2067 
2068 void KeysManager::signKeyOpenConsole(const QString &signer, const QString &keyid, const int checking, const bool local)
2069 {
2070  KConfigGroup config(KGlobal::config(), "General");
2071 
2072  KProcess process;
2073  process << config.readPathEntry("TerminalApplication", QLatin1String("konsole"))
2074  << QLatin1String("-e")
2075  << KGpgSettings::gpgBinaryPath()
2076  << QLatin1String("--no-secmem-warning")
2077  << QLatin1String("-u") << signer
2078  << QLatin1String("--default-cert-level")
2079  << QString(checking);
2080 
2081  if (!local)
2082  process << QLatin1String( "--sign-key" ) << keyid;
2083  else
2084  process << QLatin1String( "--lsign-key" ) << keyid;
2085 
2086  process.execute();
2087 }
2088 
2089 void KeysManager::getMissingSigs(QSet<QString> &missingKeys, const KGpgExpandableNode *nd)
2090 {
2091  foreach (const KGpgNode *ch, nd->getChildren()) {
2092  if (ch->hasChildren()) {
2093  getMissingSigs(missingKeys, ch->toExpandableNode());
2094  continue;
2095  } else if (ch->getType() == ITYPE_SIGN) {
2096  if (ch->toSignNode()->isUnknown())
2097  missingKeys << ch->getId();
2098  }
2099  }
2100 }
2101 
2102 void KeysManager::importallsignkey()
2103 {
2104  const QList<KGpgNode *> sel(iview->selectedNodes());
2105  QSet<QString> missingKeys;
2106 
2107  if (sel.isEmpty())
2108  return;
2109 
2110  foreach (const KGpgNode *nd, sel) {
2111  if (nd->hasChildren()) {
2112  getMissingSigs(missingKeys, nd->toExpandableNode());
2113  } else if (nd->getType() == ITYPE_SIGN) {
2114  const KGpgSignNode *sn = nd->toSignNode();
2115 
2116  if (sn->isUnknown())
2117  missingKeys << sn->getId();
2118  }
2119  }
2120 
2121  if (missingKeys.isEmpty()) {
2122  KMessageBox::information(this,
2123  i18np("All signatures for this key are already in your keyring",
2124  "All signatures for this keys are already in your keyring", sel.count()));
2125  return;
2126  }
2127 
2128  importRemoteKeys(missingKeys.toList());
2129 }
2130 
2131 void KeysManager::preimportsignkey()
2132 {
2133  const QList<KGpgNode *> exportList(iview->selectedNodes());
2134  QStringList idlist;
2135 
2136  if (exportList.empty())
2137  return;
2138 
2139  foreach (const KGpgNode *nd, exportList)
2140  idlist << nd->getId();
2141 
2142  importRemoteKeys(idlist);
2143 }
2144 
2145 bool KeysManager::importRemoteKey(const QString &keyIDs)
2146 {
2147  return importRemoteKeys(keyIDs.simplified().split(QLatin1Char( ' ' )), false);
2148 }
2149 
2150 bool KeysManager::importRemoteKeys(const QStringList &keyIDs, const bool dialog)
2151 {
2152  QStringList kservers(KeyServer::getServerList());
2153  if (kservers.isEmpty())
2154  return false;
2155 
2156  KGpgReceiveKeys *proc = new KGpgReceiveKeys(this, kservers.first(), keyIDs, dialog, QLatin1String( qgetenv("http_proxy") ));
2157  connect(proc, SIGNAL(done(int)), SLOT(importRemoteFinished(int)));
2158 
2159  proc->start();
2160 
2161  return true;
2162 }
2163 
2164 void KeysManager::importRemoteFinished(int result)
2165 {
2166  KGpgReceiveKeys *t = qobject_cast<KGpgReceiveKeys *>(sender());
2167  Q_ASSERT(t != NULL);
2168 
2169  const QStringList keys(KGpgImport::getImportedIds(t->getLog()));
2170 
2171  t->deleteLater();
2172 
2173  if (result == KGpgTransaction::TS_OK)
2174  imodel->refreshKeys(keys);
2175 }
2176 
2177 void KeysManager::refreshKeys(const QStringList& ids)
2178 {
2179  imodel->refreshKeys(ids);
2180 }
2181 
2182 void KeysManager::delsignkey()
2183 {
2184  KGpgNode *nd = iview->selectedNode();
2185  if (nd == NULL)
2186  return;
2187 
2188  QString uid;
2189  QString parentKey;
2190 
2191  KGpgExpandableNode *parent = nd->getParentKeyNode();
2192  switch (parent->getType()) {
2193  case ITYPE_PAIR:
2194  case ITYPE_PUBLIC:
2195  uid = QLatin1Char( '1' );
2196  parentKey = parent->getId();
2197  break;
2198  case ITYPE_UID:
2199  case ITYPE_UAT:
2200  uid = parent->getId();
2201  parentKey = parent->getParentKeyNode()->getId();
2202  break;
2203  default:
2204  Q_ASSERT(0);
2205  return;
2206  }
2207 
2208  const QString signID(nd->getId());
2209  QString signMail(nd->getNameComment());
2210  QString parentMail(parent->getNameComment());
2211 
2212  if (!parent->getEmail().isEmpty())
2213  parentMail += QLatin1String( " &lt;" ) + parent->getEmail() + QLatin1String( "&gt;" );
2214  if (!nd->getEmail().isEmpty())
2215  signMail += QLatin1String( " &lt;" ) + nd->getEmail() + QLatin1String( "&gt;" );
2216 
2217  if (parentKey == signID) {
2218  KMessageBox::sorry(this, i18n("Edit key manually to delete a self-signature."));
2219  return;
2220  }
2221 
2222  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>",
2223  signMail, parentMail, parentKey);
2224 
2225  if (KMessageBox::questionYesNo(this, ask, QString(), KStandardGuiItem::del(), KStandardGuiItem::cancel()) != KMessageBox::Yes)
2226  return;
2227 
2228  KGpgDelSign *delsig = new KGpgDelSign(this, nd->toSignNode());
2229  connect(delsig, SIGNAL(done(int)), SLOT(delsignatureResult(int)));
2230  delsig->start();
2231 }
2232 
2233 void KeysManager::delsignatureResult(int success)
2234 {
2235  sender()->deleteLater();
2236 
2237  if (success == KGpgTransaction::TS_OK) {
2238  KGpgNode *nd = iview->selectedNode()->getParentKeyNode();
2239 
2240  while (!(nd->getType() & ITYPE_PAIR))
2241  nd = nd->getParentKeyNode();
2242  imodel->refreshKey(nd->toKeyNode());
2243  } else {
2244  KMessageBox::sorry(this, i18n("Requested operation was unsuccessful, please edit the key manually."));
2245  }
2246 }
2247 
2248 void KeysManager::slotSendEmail()
2249 {
2250  QStringList maillist;
2251 
2252  foreach (const KGpgNode *nd, iview->selectedNodes()) {
2253  if (nd->getEmail().isEmpty())
2254  continue;
2255 
2256  maillist << QLatin1Char('"') + nd->getName() + QLatin1String("\" <") + nd->getEmail() + QLatin1Char('>');
2257  }
2258 
2259  if (maillist.isEmpty())
2260  return;
2261 
2262  KToolInvocation::invokeMailer(maillist.join(QLatin1String(", ")), QString());
2263 }
2264 
2265 void KeysManager::slotedit()
2266 {
2267  KGpgNode *nd = iview->selectedNode();
2268  Q_ASSERT(nd != NULL);
2269 
2270  if (!(nd->getType() & ITYPE_PAIR))
2271  return;
2272  if (terminalkey)
2273  return;
2274  if ((m_delkey != NULL) && m_delkey->keys().contains(nd->toKeyNode()))
2275  return;
2276 
2277  KProcess *kp = new KProcess(this);
2278  KConfigGroup config(KGlobal::config(), "General");
2279  *kp << config.readPathEntry("TerminalApplication", QLatin1String("konsole"))
2280  << QLatin1String("-e")
2281  << KGpgSettings::gpgBinaryPath()
2282  << QLatin1String("--no-secmem-warning")
2283  << QLatin1String("--edit-key")
2284  << nd->getId()
2285  << QLatin1String("help");
2286  terminalkey = nd->toKeyNode();
2287  editKey->setEnabled(false);
2288 
2289  connect(kp, SIGNAL(finished(int)), SLOT(slotEditDone(int)));
2290  kp->start();
2291 }
2292 
2293 void KeysManager::slotEditDone(int exitcode)
2294 {
2295  if (exitcode == 0)
2296  imodel->refreshKey(terminalkey);
2297 
2298  terminalkey = NULL;
2299  editKey->setEnabled(true);
2300 }
2301 
2302 void KeysManager::doPrint(const QString &txt)
2303 {
2304  QPrinter prt;
2305  //kDebug(2100) << "Printing..." ;
2306  QPointer<QPrintDialog> printDialog = new QPrintDialog(&prt, this);
2307  if (printDialog->exec() == QDialog::Accepted) {
2308  QPainter painter(&prt);
2309  int width = painter.device()->width();
2310  int height = painter.device()->height();
2311  painter.drawText(0, 0, width, height, Qt::AlignLeft|Qt::AlignTop|Qt::TextDontClip, txt);
2312  }
2313  delete printDialog;
2314 }
2315 
2316 void KeysManager::removeFromGroups(KGpgKeyNode *node)
2317 {
2318  QStringList groupNames;
2319 
2320  foreach (const KGpgGroupNode *gnd, node->getGroups())
2321  groupNames << gnd->getName();
2322 
2323  if (groupNames.isEmpty())
2324  return;
2325 
2326  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>",
2327  "<qt>The key you are deleting is a member of the following key groups. Do you want to remove it from these groups?</qt>",
2328  groupNames.count());
2329 
2330  if (KMessageBox::questionYesNoList(this, ask, groupNames, i18n("Delete key")) != KMessageBox::Yes)
2331  return;
2332 
2333  bool groupDeleted = false;
2334 
2335  foreach (KGpgGroupMemberNode *gref, node->getGroupRefs()) {
2336  KGpgGroupNode *group = gref->getParentKeyNode();
2337 
2338  bool deleteWholeGroup = (group->getChildCount() == 1) &&
2339  (group->getChild(0)->toGroupMemberNode() == gref);
2340  if (deleteWholeGroup)
2341  deleteWholeGroup = (KMessageBox::questionYesNo(this,
2342  i18n("You are removing the last key from key group %1.<br/>Do you want to delete the group, too?", group->getName()),
2343  i18n("Delete key")) == KMessageBox::Yes);
2344 
2345  if (!deleteWholeGroup) {
2346  imodel->deleteFromGroup(group, gref);
2347  } else {
2348  group->remove();
2349  imodel->delNode(group);
2350  groupDeleted = true;
2351  }
2352  }
2353 
2354  if (groupDeleted) {
2355  updateStatusCounter();
2356  }
2357 }
2358 
2359 void KeysManager::deleteseckey()
2360 {
2361  KGpgKeyNode *nd = iview->selectedNode()->toKeyNode();
2362  Q_ASSERT(nd != NULL);
2363 
2364  // delete a key
2365  int result = KMessageBox::warningContinueCancel(this,
2366  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.",
2367  nd->getNameComment()),
2368  QString(),
2369  KGuiItem(i18n("Delete"), QLatin1String( "edit-delete" )));
2370  if (result != KMessageBox::Continue)
2371  return;
2372 
2373  if (terminalkey == nd)
2374  return;
2375  if (m_delkey != NULL) {
2376  KMessageBox::error(this,
2377  i18n("Another key delete operation is still in progress.\nPlease wait a moment until this operation is complete."),
2378  i18n("Delete key"));
2379  return;
2380  }
2381 
2382  removeFromGroups(nd);
2383 
2384  m_delkey = new KGpgDelKey(this, nd);
2385  connect(m_delkey, SIGNAL(done(int)), SLOT(secretKeyDeleted(int)));
2386  m_delkey->start();
2387 }
2388 
2389 void KeysManager::secretKeyDeleted(int retcode)
2390 {
2391  KGpgKeyNode *delkey = m_delkey->keys().first();
2392  if (retcode == 0) {
2393  KMessageBox::information(this, i18n("Key <b>%1</b> deleted.", delkey->getBeautifiedFingerprint()), i18n("Delete key"));
2394  imodel->delNode(delkey);
2395  } else {
2396  KMessageBox::error(this, i18n("Deleting key <b>%1</b> failed.", delkey->getBeautifiedFingerprint()), i18n("Delete key"));
2397  }
2398  m_delkey->deleteLater();
2399  m_delkey = NULL;
2400 }
2401 
2402 void KeysManager::confirmdeletekey()
2403 {
2404  if (m_delkey) {
2405  KMessageBox::error(this,
2406  i18n("Another key delete operation is still in progress.\nPlease wait a moment until this operation is complete."),
2407  i18n("Delete key"));
2408  return;
2409  }
2410 
2411  KgpgCore::KgpgItemType pt;
2412  bool same;
2413  QList<KGpgNode *> ndlist(iview->selectedNodes(&same, &pt));
2414  if (ndlist.isEmpty())
2415  return;
2416 
2417  // do not delete a key currently edited in terminal
2418  if ((!(pt & ~ITYPE_PAIR)) && (ndlist.at(0) == terminalkey) && (ndlist.count() == 1)) {
2419  KMessageBox::error(this,
2420  i18n("Can not delete key <b>%1</b> while it is edited in terminal.",
2421  terminalkey->getBeautifiedFingerprint()), i18n("Delete key"));
2422  return;
2423  } else if (pt == ITYPE_GROUP) {
2424  deleteGroup();
2425  return;
2426  } else if (!(pt & ITYPE_GROUP) && (pt & ITYPE_SECRET) && (ndlist.count() == 1)) {
2427  deleteseckey();
2428  return;
2429  } else if ((pt == ITYPE_UID) && (ndlist.count() == 1)) {
2430  slotDelUid();
2431  return;
2432  } else if ((pt & ITYPE_GROUP) && !(pt & ~ITYPE_GPAIR)) {
2433  bool invalidDelete = false;
2434  foreach (const KGpgNode *nd, ndlist)
2435  if (nd->getType() == ITYPE_GROUP) {
2436  invalidDelete = true;
2437  break;
2438  }
2439 
2440  // only allow removing group members if they belong to the same group
2441  if (!invalidDelete) {
2442  const KGpgNode * const group = ndlist.first()->getParentKeyNode();
2443  foreach (const KGpgNode *nd, ndlist)
2444  if (nd->getParentKeyNode() != group) {
2445  invalidDelete = true;
2446  break;
2447  }
2448  }
2449 
2450  if (!invalidDelete) {
2451  KGpgGroupNode *gnd = ndlist.first()->getParentKeyNode()->toGroupNode();
2452 
2453  QList<KGpgNode *> members = gnd->getChildren();
2454 
2455  foreach (KGpgNode *nd, ndlist) {
2456  int r = members.removeAll(nd);
2457  Q_ASSERT(r == 1);
2458  Q_UNUSED(r);
2459  }
2460 
2461  imodel->changeGroup(gnd, members);
2462  return;
2463  }
2464  }
2465 
2466  if (pt & ~ITYPE_PAIR) {
2467  KMessageBox::error(this,
2468  i18n("You have selected items that are not keys. They can not be deleted with this menu entry."),
2469  i18n("Delete key"));
2470  return;
2471  }
2472 
2473  QStringList keysToDelete;
2474  QStringList deleteIds;
2475  QStringList secList;
2476  KGpgKeyNode::List delkeys;
2477 
2478  bool secretKeyInside = (pt & ITYPE_SECRET);
2479  foreach (KGpgNode *nd, ndlist) {
2480  KGpgKeyNode *ki = nd->toKeyNode();
2481 
2482  if (ki->getType() & ITYPE_SECRET) {
2483  secList += ki->getNameComment();
2484  } else if (ki != terminalkey) {
2485  keysToDelete += ki->getNameComment();
2486  deleteIds << ki->getId();
2487  delkeys << ki;
2488  }
2489  }
2490 
2491  if (secretKeyInside) {
2492  int result = KMessageBox::warningContinueCancel(this,
2493  i18n("<qt>The following are secret key pairs:<br/><b>%1</b><br/>They will not be deleted.</qt>",
2494  secList.join( QLatin1String( "<br />" ))));
2495  if (result != KMessageBox::Continue)
2496  return;
2497  }
2498 
2499  if (keysToDelete.isEmpty())
2500  return;
2501 
2502  int result = KMessageBox::warningContinueCancelList(this,
2503  i18np("<qt><b>Delete the following public key?</b></qt>",
2504  "<qt><b>Delete the following %1 public keys?</b></qt>",
2505  keysToDelete.count()), keysToDelete, QString(),
2506  KStandardGuiItem::del());
2507  if (result != KMessageBox::Continue)
2508  return;
2509 
2510  foreach (KGpgNode *nd, ndlist)
2511  removeFromGroups(nd->toKeyNode());
2512 
2513  m_delkey = new KGpgDelKey(this, delkeys);
2514  connect(m_delkey, SIGNAL(done(int)), SLOT(slotDelKeyDone(int)));
2515  m_delkey->start();
2516 }
2517 
2518 void KeysManager::slotDelKeyDone(int res)
2519 {
2520  if (res == 0) {
2521  foreach (KGpgKeyNode *kn, m_delkey->keys())
2522  imodel->delNode(kn);
2523  }
2524 
2525  m_delkey->deleteLater();
2526  m_delkey = NULL;
2527 
2528  updateStatusCounter();
2529 }
2530 
2531 void KeysManager::slotPreImportKey()
2532 {
2533  QPointer<KDialog> dial = new KDialog(this);
2534  dial->setCaption(i18n("Key Import"));
2535  dial->setButtons(KDialog::Ok | KDialog::Cancel);
2536  dial->setDefaultButton(KDialog::Ok);
2537  dial->setModal(true);
2538 
2539  SrcSelect *page = new SrcSelect();
2540  dial->setMainWidget(page);
2541  page->newFilename->setWindowTitle(i18n("Open File"));
2542  page->newFilename->setMode(KFile::File);
2543 
2544  if (dial->exec() == QDialog::Accepted) {
2545  if (page->checkFile->isChecked()) {
2546  KUrl impname = page->newFilename->url();
2547  if (!impname.isEmpty())
2548  slotImport(KUrl::List(impname));
2549  } else if (page->checkServer->isChecked()) {
2550  const QString ids(page->keyIds->text().simplified());
2551  if (!ids.isEmpty())
2552  importRemoteKeys(ids.split(QLatin1Char( ' ' )));
2553  } else {
2554  slotImport(kapp->clipboard()->text(m_clipboardmode));
2555  }
2556  }
2557 
2558  delete dial;
2559 }
2560 
2561 void KeysManager::slotImport(const QString &text)
2562 {
2563  if (text.isEmpty())
2564  return;
2565 
2566  KGpgImport *imp;
2567 
2568  if (!KGpgImport::isKey(text) && KGpgDecrypt::isEncryptedText(text)) {
2569  if (KMessageBox::questionYesNo(this,
2570  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"
2571  " and then try importing it?</qt>"),
2572  i18n("Import from Clipboard")) != KMessageBox::Yes)
2573  return;
2574 
2575  imp = new KGpgImport(this);
2576  KGpgDecrypt *decr = new KGpgDecrypt(this, text);
2577  imp->setInputTransaction(decr);
2578  } else {
2579  imp = new KGpgImport(this, text);
2580  }
2581 
2582  startImport(imp);
2583 }
2584 
2585 void KeysManager::slotImport(const KUrl::List &files)
2586 {
2587  startImport(new KGpgImport(this, files));
2588 }
2589 
2590 void KeysManager::startImport(KGpgImport *import)
2591 {
2592  changeMessage(i18n("Importing..."), true);
2593  connect(import, SIGNAL(done(int)), SLOT(slotImportDone(int)));
2594  import->start();
2595 }
2596 
2597 void KeysManager::slotImportDone(int result)
2598 {
2599  KGpgImport *import = qobject_cast<KGpgImport *>(sender());
2600  Q_ASSERT(import != NULL);
2601  const QStringList rawmsgs(import->getMessages());
2602 
2603  if (result != 0) {
2604  KMessageBox::detailedSorry(this, i18n("Key importing failed. Please see the detailed log for more information."),
2605  rawmsgs.join(QLatin1String("\n")) , i18n("Key Import"));
2606  }
2607 
2608  QStringList keys(import->getImportedIds(0x1f));
2609  const bool needsRefresh = !keys.isEmpty();
2610  keys << import->getImportedIds(0);
2611 
2612  if (!keys.isEmpty()) {
2613  const QString msg(import->getImportMessage());
2614  const QStringList keynames(import->getImportedKeys());
2615 
2616  new KgpgDetailedInfo(this, msg, rawmsgs.join(QLatin1String("\n")), keynames, i18n("Key Import"));
2617  if (needsRefresh)
2618  imodel->refreshKeys(keys);
2619  else
2620  changeMessage(i18nc("Application ready for user input", "Ready"));
2621  } else{
2622  changeMessage(i18nc("Application ready for user input", "Ready"));
2623  }
2624 
2625  import->deleteLater();
2626 }
2627 
2628 void KeysManager::refreshkey()
2629 {
2630  imodel->refreshKeys();
2631  updateStatusCounter();
2632 }
2633 
2634 KGpgItemModel *KeysManager::getModel()
2635 {
2636  return imodel;
2637 }
2638 
2639 void
2640 KeysManager::slotNetworkUp()
2641 {
2642  toggleNetworkActions(true);
2643 }
2644 
2645 void
2646 KeysManager::slotNetworkDown()
2647 {
2648  toggleNetworkActions(false);
2649 }
2650 
2651 void
2652 KeysManager::toggleNetworkActions(bool online)
2653 {
2654  m_online = online;
2655  kserver->setEnabled(online);
2656  importSignatureKey->setEnabled(online);
2657  importAllSignKeys->setEnabled(online);
2658  refreshKey->setEnabled(online);
2659 }
2660 
2661 void
2662 KeysManager::setupTrayIcon()
2663 {
2664  bool newtray = (m_trayicon == NULL);
2665 
2666  if (newtray) {
2667  m_trayicon = new KStatusNotifierItem(this);
2668  m_trayicon->setIconByName(QLatin1String( "kgpg" ));
2669  m_trayicon->setToolTip(QLatin1String( "kgpg" ), i18n("KGpg - encryption tool"), QString());
2670  }
2671 
2672  switch (KGpgSettings::leftClick()) {
2673  case KGpgSettings::EnumLeftClick::Editor:
2674  m_trayicon->setAssociatedWidget(s_kgpgEditor);
2675  break;
2676  case KGpgSettings::EnumLeftClick::KeyManager:
2677  m_trayicon->setAssociatedWidget(this);
2678  break;
2679  }
2680 
2681  m_trayicon->setCategory(KStatusNotifierItem::ApplicationStatus);
2682 
2683  if (!newtray)
2684  return;
2685 
2686  KMenu *conf_menu = m_trayicon->contextMenu();
2687 
2688  QAction *KgpgOpenManager = actionCollection()->addAction(QLatin1String("kgpg_manager"), this, SLOT(show()));
2689  KgpgOpenManager->setIcon(KIcon( QLatin1String( "kgpg" )));
2690  KgpgOpenManager->setText(i18n("Ke&y Manager"));
2691 
2692  QAction *KgpgEncryptClipboard = actionCollection()->addAction(QLatin1String("clip_encrypt"), this, SLOT(clipEncrypt()));
2693  KgpgEncryptClipboard->setText(i18n("&Encrypt Clipboard"));
2694 
2695  QAction *KgpgDecryptClipboard = actionCollection()->addAction(QLatin1String("clip_decrypt"), this, SLOT(clipDecrypt()));
2696  KgpgDecryptClipboard->setText(i18n("&Decrypt Clipboard"));
2697 
2698  QAction *KgpgSignClipboard = actionCollection()->addAction(QLatin1String("clip_sign"), this, SLOT(clipSign()));
2699  KgpgSignClipboard->setText(i18n("&Sign/Verify Clipboard"));
2700  KgpgSignClipboard->setIcon(KIcon( QLatin1String( "document-sign-key" )));
2701 
2702  QAction *KgpgPreferences = KStandardAction::preferences(this, SLOT(showOptions()), actionCollection());
2703 
2704  conf_menu->addAction( KgpgEncryptClipboard );
2705  conf_menu->addAction( KgpgDecryptClipboard );
2706  conf_menu->addAction( KgpgSignClipboard );
2707  conf_menu->addAction( KgpgOpenManager );
2708  conf_menu->addAction( openEditor );
2709  conf_menu->addAction( kserver );
2710  conf_menu->addSeparator();
2711  conf_menu->addAction( KgpgPreferences );
2712 }
2713 
2714 void
2715 KeysManager::showTrayMessage(const QString &message)
2716 {
2717  if (m_trayicon == NULL)
2718  return;
2719 
2720  m_trayicon->showMessage(QString(), message, QLatin1String( "kgpg" ));
2721 }
2722 
2723 KShortcut
2724 KeysManager::goDefaultShortcut() const
2725 {
2726  return goToDefaultKey->shortcut();
2727 }
2728 
2729 void
2730 KeysManager::clipEncrypt()
2731 {
2732  const QString cliptext(kapp->clipboard()->text(m_clipboardmode));
2733 
2734  if (cliptext.isEmpty()) {
2735  Q_ASSERT(m_trayicon != NULL);
2736  m_trayicon->showMessage(QString(), i18n("Clipboard is empty."), QLatin1String( "kgpg" ));
2737  return;
2738  }
2739 
2740  QPointer<KgpgSelectPublicKeyDlg> dialog = new KgpgSelectPublicKeyDlg(this, imodel, goToDefaultKey->shortcut(), true);
2741  if (dialog->exec() == KDialog::Accepted) {
2742  KGpgEncrypt::EncryptOptions encOptions = KGpgEncrypt::AsciiArmored;
2743  QStringList options;
2744 
2745  if (!dialog->getCustomOptions().isEmpty() && KGpgSettings::allowCustomEncryptionOptions())
2746  options = dialog->getCustomOptions().split(QLatin1Char(' '), QString::SkipEmptyParts);
2747 
2748  if (dialog->getUntrusted())
2749  encOptions |= KGpgEncrypt::AllowUntrustedEncryption;
2750  if (dialog->getHideId())
2751  encOptions |= KGpgEncrypt::HideKeyId;
2752 
2753  if (KGpgSettings::pgpCompatibility())
2754  options.append(QLatin1String( "--pgp6" ));
2755 
2756  KGpgEncrypt *enc = new KGpgEncrypt(this, dialog->selectedKeys(), cliptext, encOptions, options);
2757  connect(enc, SIGNAL(done(int)), SLOT(slotSetClip(int)));
2758 
2759  m_trayicon->setStatus(KStatusNotifierItem::Active);
2760  enc->start();
2761  }
2762 
2763  delete dialog;
2764 }
2765 
2766 void
2767 KeysManager::slotSetClip(int result)
2768 {
2769  KGpgEncrypt *enc = qobject_cast<KGpgEncrypt *>(sender());
2770  Q_ASSERT(enc != NULL);
2771  sender()->deleteLater();
2772 
2773  m_trayicon->setStatus(KStatusNotifierItem::Passive);
2774 
2775  if (result != KGpgTransaction::TS_OK)
2776  return;
2777 
2778  kapp->clipboard()->setText(enc->encryptedText().join(QLatin1String("\n")), m_clipboardmode);
2779 
2780  Q_ASSERT(m_trayicon != NULL);
2781  m_trayicon->showMessage(QString(), i18n("Text successfully encrypted."), QLatin1String( "kgpg" ));
2782 }
2783 
2784 void
2785 KeysManager::slotOpenKeyUrl()
2786 {
2787  KGpgNode *cur = iview->selectedNode();
2788  if (cur == NULL)
2789  return;
2790 
2791  QString id;
2792 
2793  switch (cur->getType()) {
2794  case ITYPE_PAIR:
2795  case ITYPE_PUBLIC: {
2796  id = cur->toKeyNode()->getFingerprint();
2797  break;
2798  }
2799  case ITYPE_GPAIR:
2800  case ITYPE_GPUBLIC: {
2801  id = cur->getId();
2802  break;
2803  }
2804  default:
2805  return;
2806  }
2807 
2808  const QStringList servers = KGpgSettings::infoServers();
2809  if (servers.isEmpty())
2810  return;
2811 
2812  QString url = servers.first();
2813 
2814  url.replace(QLatin1String("$$ID8$$"), id.right(8).toUpper());
2815  url.replace(QLatin1String("$$ID16$$"), id.toUpper());
2816  url.replace(QLatin1String("$$FPR$$"), id.toUpper());
2817  url.replace(QLatin1String("$$id8$$"), id.right(8).toLower());
2818  url.replace(QLatin1String("$$id16$$"), id.toLower());
2819  url.replace(QLatin1String("$$fpr$$"), id.toLower());
2820 
2821  new KRun(url, this);
2822 }
2823 
2824 void
2825 KeysManager::clipDecrypt()
2826 {
2827  const QString cliptext(kapp->clipboard()->text(m_clipboardmode).trimmed());
2828 
2829  if (cliptext.isEmpty()) {
2830  Q_ASSERT(m_trayicon != NULL);
2831  m_trayicon->showMessage(QString(), i18n("Clipboard is empty."), QLatin1String( "kgpg" ));
2832  return;
2833  }
2834 
2835  KgpgEditor *kgpgtxtedit = new KgpgEditor(this, imodel, 0);
2836  kgpgtxtedit->setAttribute(Qt::WA_DeleteOnClose);
2837  connect(this, SIGNAL(fontChanged(QFont)), kgpgtxtedit, SLOT(slotSetFont(QFont)));
2838  kgpgtxtedit->m_editor->setPlainText(cliptext);
2839  kgpgtxtedit->m_editor->slotDecode();
2840  kgpgtxtedit->show();
2841 }
2842 
2843 void
2844 KeysManager::clipSign()
2845 {
2846  QString cliptext = kapp->clipboard()->text(m_clipboardmode);
2847  if (cliptext.isEmpty()) {
2848  Q_ASSERT(m_trayicon != NULL);
2849  m_trayicon->showMessage(QString(), i18n("Clipboard is empty."), QLatin1String( "kgpg" ));
2850  return;
2851  }
2852 
2853  KgpgEditor *kgpgtxtedit = new KgpgEditor(this, imodel, 0);
2854  kgpgtxtedit->setAttribute(Qt::WA_DeleteOnClose);
2855  connect(kgpgtxtedit->m_editor, SIGNAL(verifyFinished()), kgpgtxtedit, SLOT(closeWindow()));
2856 
2857  kgpgtxtedit->m_editor->signVerifyText(cliptext);
2858  kgpgtxtedit->show();
2859 }
2860 
2861 #include "keysmanager.moc"
KGpgSettings::setShowLongKeyId
static void setShowLongKeyId(bool v)
Set Show long key id in key manager.
Definition: kgpgsettings.h:468
QAction::setText
void setText(const QString &text)
KgpgEditor::m_editor
KgpgTextEdit *const m_editor
Definition: kgpgeditor.h:45
KGpgCaff
Definition: caff.h:25
KEYCOLUMN_SIZE
#define KEYCOLUMN_SIZE
Definition: kgpgitemmodel.h:34
KGpgItemModel
Definition: kgpgitemmodel.h:44
QList::clear
void clear()
KgpgCore::KgpgKeyTrustFlag
KgpgKeyTrustFlag
trust levels of keys, uids and uats
Definition: kgpgkey.h:52
KGpgCaff::run
void run()
Definition: caff.cpp:365
KGpgSettings::leftClick
static int leftClick()
Get Choose default left-click behavior.
Definition: kgpgsettings.h:573
QModelIndex
KGpgSettings::setShowExpi
static void setShowExpi(bool v)
Set Show the expiration value in key manager.
Definition: kgpgsettings.h:392
KGpgDecrypt
decrypt the given text or files
Definition: kgpgdecrypt.h:29
KGpgSettings::showTipOfDay
static bool showTipOfDay()
Get Show tip of the day.
Definition: kgpgsettings.h:706
KGpgSettings::pgpCompatibility
static bool pgpCompatibility()
Get Enable PGP 6 compatibility.
Definition: kgpgsettings.h:250
KgpgCore::TRUST_MARGINAL
there is a minimal level of trust
Definition: kgpgkey.h:62
QEvent
keytreeview.h
QWidget
kgpgprimaryuid.h
KgpgCore::ITYPE_GPAIR
key pair as member of a key group
Definition: kgpgkey.h:97
KeyTreeView::selectNode
void selectNode(KGpgNode *nd)
Definition: keytreeview.cpp:94
KGpgTransactionJob::getResultCode
int getResultCode() const
get the result of the transaction
Definition: kgpgtransactionjob.cpp:50
kgpgimport.h
QString::append
QString & append(QChar ch)
KeysManager::showKeyInfo
void showKeyInfo(const QString &keyID)
Definition: keysmanager.cpp:1552
KGpgSignTransactionHelper
helper class for key signing transactions
Definition: kgpgsigntransactionhelper.h:25
KProcess
QEvent::type
Type type() const
KGpgExport::getKeyIds
const QStringList & getKeyIds() const
return the key ids to export
Definition: kgpgexport.cpp:77
kgpg.h
KGpgKeyNode::getName
virtual QString getName() const
Definition: KGpgKeyNode.cpp:89
KEYCOLUMN_TRUST
#define KEYCOLUMN_TRUST
Definition: kgpgitemmodel.h:32
KeysManager::readAgainOptions
void readAgainOptions()
QAbstractItemView::setAlternatingRowColors
void setAlternatingRowColors(bool enable)
KGpgSettings::allowUntrustedGroupMembers
static bool allowUntrustedGroupMembers()
Get Allow untrusted keys to become members of key groups.
Definition: kgpgsettings.h:212
kgpgdeluid.h
KGpgNode::getParentKeyNode
KGpgExpandableNode * getParentKeyNode() const
Returns the parent node in the key hierarchy.
Definition: KGpgNode.cpp:330
KGpgSettings::defaultKey
static QString defaultKey()
Definition: kgpgsettings.h:24
KGpgTransaction::TS_OK
everything went fine
Definition: kgpgtransaction.h:60
KeyServer
Definition: keyservers.h:51
QAbstractItemView::setSelectionMode
void setSelectionMode(QAbstractItemView::SelectionMode mode)
KGpgExpandableNode::getChildren
virtual const KGpgNode::List & getChildren() const
Definition: KGpgExpandableNode.cpp:71
KGpgExport::getOutputData
const QByteArray & getOutputData() const
return the data read from standard output
Definition: kgpgexport.cpp:117
KGpgSettings::gpgConfigPath
static QString gpgConfigPath()
Get The path of the gpg configuration file.
Definition: kgpgsettings.h:288
KGpgItemModel::isDefaultKey
bool isDefaultKey(const KGpgNode *node) const
Definition: kgpgitemmodel.cpp:515
KeyServer::slotSetKeyserver
void slotSetKeyserver(const QString &server)
Definition: keyservers.cpp:364
KgpgSelectPublicKeyDlg
shows a dialog to select a public key for encryption
Definition: selectpublickeydialog.h:39
KGpgSettings::showCreat
static bool showCreat()
Get Show the creation value in key manager.
Definition: kgpgsettings.h:440
KeyTreeView::isEditing
bool isEditing() const
Definition: keytreeview.cpp:226
QByteArray
KGpgEncrypt::AsciiArmored
output the data as printable ASCII as opposed to binary data
Definition: kgpgencrypt.h:38
KeyTreeView
Definition: keytreeview.h:35
QAbstractItemView::selectionModel
QItemSelectionModel * selectionModel() const
KGpgRevokeDialog::getId
QString getId() const
Definition: kgpgrevokewidget.cpp:73
kgpgtransactionjob.h
KGpgExport::getOutputFile
const QString & getOutputFile() const
return the output filename currently set
Definition: kgpgexport.cpp:111
KeysManager::showOptions
void showOptions()
Definition: keysmanager.cpp:1173
KGpgGroupNode
A GnuPG group of public keys.
Definition: KGpgGroupNode.h:33
QPrinter
KGpgExport
export one or more keys from keyring
Definition: kgpgexport.h:32
KGpgItemModel::addGroup
KGpgGroupNode * addGroup(const QString &name, const KGpgKeyNode::List &keys)
Definition: kgpgitemmodel.cpp:281
KeysManager::slotOpenEditor
void slotOpenEditor()
Definition: keysmanager.cpp:545
KGpgNode::getNameComment
virtual QString getNameComment() const
Definition: KGpgNode.cpp:51
KeysManager::eventFilter
bool eventFilter(QObject *, QEvent *e)
Definition: keysmanager.cpp:725
KeysManager::removeFromGroups
void removeFromGroups(KGpgKeyNode *nd)
Definition: keysmanager.cpp:2316
KGpgKeyNode::getId
virtual QString getId() const
Definition: KGpgKeyNode.cpp:113
QString::split
QStringList split(const QString &sep, SplitBehavior behavior, Qt::CaseSensitivity cs) const
KGpgItemModel::refreshKey
void refreshKey(const QString &id)
Definition: kgpgitemmodel.cpp:429
QString::prepend
QString & prepend(QChar ch)
KGpgAddUid
add a new user id to a key pair
Definition: kgpgadduid.h:26
QFont
KGpgPrimaryUid
transaction class to change the primary user id of a key
Definition: kgpgprimaryuid.h:27
KeyTreeView::restoreLayout
void restoreLayout(KConfigGroup &cg)
Definition: keytreeview.cpp:106
KGpgSettings::showSystray
static bool showSystray()
Get Show the systray icon.
Definition: kgpgsettings.h:668
KGpgSettings::showLongKeyId
static bool showLongKeyId()
Get Show long key id in key manager.
Definition: kgpgsettings.h:478
KGpgImport
import one or more keys into the keyring
Definition: kgpgimport.h:31
QAction::setIcon
void setIcon(const QIcon &icon)
QList::at
const T & at(int i) const
KgpgCore::ITYPE_GPUBLIC
public key as member of a key group
Definition: kgpgkey.h:96
KeyListProxyModel::nodeForIndex
KGpgNode * nodeForIndex(const QModelIndex &index) const
Definition: keylistproxymodel.cpp:484
QPointer
KGpgTransactionJob
Wrap a GnuPG transaction in a job.
Definition: kgpgtransactionjob.h:28
QDBusConnection::registerObject
bool registerObject(const QString &path, QObject *object, QFlags< QDBusConnection::RegisterOption > options)
QString::simplified
QString simplified() const
KGpgUatNode
A user attribute (i.e.
Definition: KGpgUatNode.h:36
selectsecretkey.h
QWidget::mapToGlobal
QPoint mapToGlobal(const QPoint &pos) const
KeyTreeView::selectedNodes
QList< KGpgNode * > selectedNodes(bool *psame=NULL, KgpgCore::KgpgItemType *pt=NULL) const
Definition: keytreeview.cpp:45
QHBoxLayout
KGpgImport::getImportMessage
QString getImportMessage() const
get textual summary of the import events
Definition: kgpgimport.cpp:96
KGpgSignTransactionHelper::getChecking
carefulCheck getChecking(void) const
check if local signing is requested
Definition: kgpgsigntransactionhelper.cpp:116
KGpgSignTransactionHelper::getSigner
QString getSigner(void) const
get key id which is used to sign
Definition: kgpgsigntransactionhelper.cpp:130
KGpgRefNode::isUnknown
bool isUnknown() const
Check if the referenced key exists.
Definition: KGpgRefNode.cpp:140
KGpgGroupNode::getName
virtual QString getName() const
Definition: KGpgGroupNode.cpp:154
KeysManager::clipSign
void clipSign()
Definition: keysmanager.cpp:2844
KGpgSettings::EnumLeftClick::KeyManager
Definition: kgpgsettings.h:29
QDBusConnection::sessionBus
QDBusConnection sessionBus()
images.h
KGpgSettings::setPhotoProperties
static void setPhotoProperties(int v)
Set photo properties.
Definition: kgpgsettings.h:316
kgpgkey.h
KGpgItemModel::statusCountMessageString
static QString statusCountMessageString(const unsigned int keys, const unsigned int groups)
Definition: kgpgitemmodel.cpp:265
QPoint
KDialog
KGpgRevokeDialog::getReason
int getReason() const
Definition: kgpgrevokewidget.cpp:60
QStringList::join
QString join(const QString &separator) const
KgpgKeyInfo
Definition: keyinfodialog.h:63
KGpgSignUid
transaction class to sign a single user id of a key
Definition: kgpgsignuid.h:28
KGpgUidTransaction::getKeyId
QString getKeyId(void) const
return the key id of the current transaction
Definition: kgpguidtransaction.cpp:74
KGpgTransaction::setInputTransaction
void setInputTransaction(KGpgTransaction *ta)
connect the standard input of this transaction to another process
Definition: kgpgtransaction.cpp:709
KGpgSettings::infoServers
static QStringList infoServers()
Get List of URLs that show details and analysis of the given key.
Definition: kgpgsettings.h:915
KGpgTransaction::start
void start()
Start the operation.
Definition: kgpgtransaction.cpp:390
KeyTreeView::selectedNode
KGpgNode * selectedNode() const
Definition: keytreeview.cpp:83
KGpgNode::toRefNode
KGpgRefNode * toRefNode()
Definition: KGpgNode.cpp:192
KeysManager::setDefaultKeyNode
void setDefaultKeyNode(KGpgKeyNode *key)
Definition: keysmanager.cpp:1214
QDir::homePath
QString homePath()
KGpgExpandableNode::getChild
virtual KGpgNode * getChild(const int index) const
Returns the child node at the given index.
Definition: KGpgExpandableNode.cpp:41
KgpgTextEdit::signVerifyText
void signVerifyText(const QString &message)
Definition: kgpgtextedit.cpp:346
selectpublickeydialog.h
KeysManager::showKeyServer
void showKeyServer()
Definition: keysmanager.cpp:1058
KeyListProxyModel::setKeyModel
void setKeyModel(KGpgItemModel *)
Definition: keylistproxymodel.cpp:253
KeysManager::saveToggleOpts
void saveToggleOpts(void)
Definition: keysmanager.cpp:1139
KGpgDelUid
Definition: kgpgdeluid.h:27
KGpgSettings::EnumLeftClick::Editor
Definition: kgpgsettings.h:29
KGpgSignTransactionHelper::getLocal
bool getLocal(void) const
check if local signing is requested
Definition: kgpgsigntransactionhelper.cpp:104
KGpgEditKeyTransaction::getKeyid
QString getKeyid() const
return the id of the key we are editing
Definition: kgpgeditkeytransaction.cpp:46
KGpgKeyNode
A public key with or without corresponding secret key.
Definition: KGpgKeyNode.h:33
KgpgEditor::m_recentfiles
KRecentFilesAction * m_recentfiles
Definition: kgpgeditor.h:46
KEYCOLUMN_CREAT
#define KEYCOLUMN_CREAT
Definition: kgpgitemmodel.h:35
KGpgImport::getDetailedImportMessage
static QString getDetailedImportMessage(const QStringList &log, const KGpgItemModel *model=NULL)
get detailed summary of import
Definition: kgpgimport.cpp:206
KGpgSettings::setShowSize
static void setShowSize(bool v)
Set Show the size value in key manager.
Definition: kgpgsettings.h:411
QList::indexOf
int indexOf(const T &value, int from) const
kgpgrevokewidget.h
KeysManager::getModel
KGpgItemModel * getModel()
Definition: keysmanager.cpp:2634
kgpgaddphoto.h
KGpgDecrypt::isEncryptedText
static bool isEncryptedText(const QString &text, int *startPos=NULL, int *endPos=NULL)
check if the given text contains an encoded message
Definition: kgpgdecrypt.cpp:93
KGpgAddPhoto
Definition: kgpgaddphoto.h:23
QRegExp
KGpgNode::getType
virtual KgpgCore::KgpgItemType getType() const =0
Returns the item type of this object.
KGpgKeyserverGetTransaction::getLog
const QStringList & getLog() const
Definition: kgpgkeyservergettransaction.cpp:59
QTreeView::columnWidth
int columnWidth(int column) const
KeysManager::refreshKeys
void refreshKeys(const QStringList &ids)
Definition: keysmanager.cpp:2177
KGpgGenerateRevoke
generate a revokation certificate
Definition: kgpggeneraterevoke.h:29
QBoxLayout::addWidget
void addWidget(QWidget *widget, int stretch, QFlags< Qt::AlignmentFlag > alignment)
KgpgCore::ITYPE_GSECRET
secret key as member of a key group
Definition: kgpgkey.h:95
QList::count
int count(const T &value) const
KGpgNode::toSignableNode
KGpgSignableNode * toSignableNode()
Definition: KGpgNode.cpp:78
KeysManager::slotSetDefaultKey
void slotSetDefaultKey(const QString &newID)
Definition: keysmanager.cpp:1201
KeysManager::s_kgpgEditor
KgpgEditor * s_kgpgEditor
Definition: keysmanager.h:76
QList::append
void append(const T &value)
kgpgeditor.h
KXmlGuiWindow
KeyListProxyModel::setTrustFilter
void setTrustFilter(const KgpgCore::KgpgKeyTrustFlag t)
set the minimum trust level to be shown
Definition: keylistproxymodel.cpp:466
KGpgKeyNode::getFingerprint
const QString & getFingerprint() const
Definition: KGpgKeyNode.cpp:75
QList::empty
bool empty() const
KGpgSettings::gpgBinaryPath
static QString gpgBinaryPath()
Get The path of the gpg binary used by KGpg.
Definition: kgpgsettings.h:307
KGpgSettings::setDefaultKey
static void setDefaultKey(const QString &_defaultKey)
Definition: kgpgsettings.h:34
kgpgdelkey.h
KGpgSettings::trustLevel
static int trustLevel()
Get Show only keys with at least that trust level in key manager.
Definition: kgpgsettings.h:497
KeysManager::slotImport
void slotImport(const QString &text)
Definition: keysmanager.cpp:2561
KgpgDetailedInfo
Definition: detailedconsole.h:23
QPrintDialog
QTreeView::resizeColumnToContents
void resizeColumnToContents(int column)
KeysManager::showKeyManager
void showKeyManager()
Definition: keysmanager.cpp:540
KgpgCore::ITYPE_SECRET
secret key
Definition: kgpgkey.h:92
QProcess
KGpgRevokeDialog
Definition: kgpgrevokewidget.h:37
QObject
KGpgCaff::IgnoreAlreadySigned
uids that are already signed will not be mailed again
Definition: caff.h:35
QPointer::isNull
bool isNull() const
KGpgNode::toGroupMemberNode
KGpgGroupMemberNode * toGroupMemberNode()
Definition: KGpgNode.cpp:208
KGpgSignTransactionHelper::TS_ALREADY_SIGNED
user id is alredy signed by given key
Definition: kgpgsigntransactionhelper.h:46
QList::isEmpty
bool isEmpty() const
QPainter
KGpgTransactionJob::getTransaction
const KGpgTransaction * getTransaction() const
get the transaction this job is handling
Definition: kgpgtransactionjob.cpp:44
KgpgTextEdit::slotDecode
void slotDecode()
Definition: kgpgtextedit.cpp:192
kgpgencrypt.h
QString::isEmpty
bool isEmpty() const
QItemSelectionModel::selectedIndexes
QModelIndexList selectedIndexes() const
KGpgSettings::useProxy
static bool useProxy()
Get Use HTTP proxy when available.
Definition: kgpgsettings.h:934
QList::removeAll
int removeAll(const T &value)
KGpgGenerateKey
generate a new key pair
Definition: kgpggeneratekey.h:28
KgpgCore::ITYPE_PUBLIC
public key
Definition: kgpgkey.h:93
KeysManager::slotGenerateKey
void slotGenerateKey()
Definition: keysmanager.cpp:493
QApplication::setOverrideCursor
void setOverrideCursor(const QCursor &cursor)
KGpgUatNode::getId
virtual QString getId() const
Definition: KGpgUatNode.cpp:156
KgpgEditor
Definition: kgpgeditor.h:33
KGpgExpandableNode::getChildCount
virtual int getChildCount()
Return how many child nodes exist.
Definition: KGpgExpandableNode.cpp:49
KeyExport
Definition: keyexport.h:25
KeysManager::importRemoteKey
bool importRemoteKey(const QString &keyIDs)
Definition: keysmanager.cpp:2145
KeysManager::clipEncrypt
void clipEncrypt()
When you click on "encrypt the clipboard" in the systray, this slot will open the dialog to choose a ...
Definition: keysmanager.cpp:2730
KeysManager::refreshkey
void refreshkey()
Definition: keysmanager.cpp:2628
QApplication::restoreOverrideCursor
void restoreOverrideCursor()
groupedit.h
KeyServer::slotExport
void slotExport(const QStringList &keyIds)
Definition: keyservers.cpp:156
QSet
KGpgItemModel::statusCountMessage
QString statusCountMessage() const
Definition: kgpgitemmodel.cpp:256
QObject::deleteLater
void deleteLater()
KGpgItemModel::changeGroup
void changeGroup(KGpgGroupNode *node, const KGpgNode::List &keys)
Definition: kgpgitemmodel.cpp:306
QList::first
T & first()
kgpgdecrypt.h
KGpgGroupMemberNode::getParentKeyNode
virtual KGpgGroupNode * getParentKeyNode() const
Definition: KGpgGroupMemberNode.cpp:97
QString
QList< KGpgNode * >
KeysManager::fontChanged
void fontChanged(QFont)
QColor
KgpgCore::TRUST_FULL
you can fully trust this key
Definition: kgpgkey.h:63
KGpgSettings::photoProperties
static int photoProperties()
Get photo properties.
Definition: kgpgsettings.h:326
QSet::count
int count() const
KgpgCore::ITYPE_GROUP
the element is a GnuPG key group
Definition: kgpgkey.h:91
kgpgexport.h
KGpgUatNode::getParentKeyNode
virtual KGpgKeyNode * getParentKeyNode() const
Definition: KGpgUatNode.cpp:125
QLayout::setMargin
void setMargin(int margin)
kgpgdelsign.h
KGpgEncrypt::HideKeyId
remove anything that shows which key ids this data is encrypted to, ignored for symmetric encryption ...
Definition: kgpgencrypt.h:40
KGpgSettings::useMouseSelection
static bool useMouseSelection()
Get Use the mouse selection instead of the clipboard.
Definition: kgpgsettings.h:516
kgpgsignuid.h
QStringList
KGpgSettings::showTrust
static bool showTrust()
Get Show the trust value in key manager.
Definition: kgpgsettings.h:383
QString::right
QString right(int n) const
kgpgtextedit.h
KeysManager::clipDecrypt
void clipDecrypt()
Definition: keysmanager.cpp:2825
KGpgSettings::setShowCreat
static void setShowCreat(bool v)
Set Show the creation value in key manager.
Definition: kgpgsettings.h:430
sourceselect.h
KGpgItemModel::delNode
void delNode(KGpgNode *node)
Definition: kgpgitemmodel.cpp:298
QHash::value
const T value(const Key &key) const
QTreeView::setColumnHidden
void setColumnHidden(int column, bool hide)
KeyListProxyModel::setIdLength
void setIdLength(const int length)
Definition: keylistproxymodel.cpp:549
KGpgRefNode::getRefNode
virtual KGpgKeyNode * getRefNode() const
Get the node of the primary key this node references to.
Definition: KGpgRefNode.cpp:146
KGpgNode
The abstract base class for all classes representing keyring data.
Definition: KGpgNode.h:42
KgpgCore::ITYPE_PAIR
key pair
Definition: kgpgkey.h:94
KGpgItemModel::getRootNode
KGpgRootNode * getRootNode() const
Definition: kgpgitemmodel.cpp:250
KGpgKeyNode::getType
static KgpgCore::KgpgItemType getType(const KgpgCore::KgpgKey *k)
Definition: KGpgKeyNode.cpp:60
KGpgSettings::allowCustomEncryptionOptions
static bool allowCustomEncryptionOptions()
Get Allow custom encryption options.
Definition: kgpgsettings.h:117
QProcess::waitForStarted
bool waitForStarted(int msecs)
KgpgCore::ITYPE_REVSIGN
revokation signature
Definition: kgpgkey.h:101
QLatin1Char
KgpgCore::TRUST_UNDEFINED
trust value undefined (i.e. you did not set a trust level)
Definition: kgpgkey.h:59
KEYCOLUMN_EXPIR
#define KEYCOLUMN_EXPIR
Definition: kgpgitemmodel.h:33
QWidget::setContextMenuPolicy
void setContextMenuPolicy(Qt::ContextMenuPolicy policy)
kgpgoptions.h
KgpgCore::Images::group
QPixmap group()
Definition: images.cpp:48
KGpgEncrypt::encryptedText
QStringList encryptedText() const
get decryption result
Definition: kgpgencrypt.cpp:81
QList::contains
bool contains(const T &value) const
KGpgSignTransactionHelper::getKey
const KGpgKeyNode * getKey(void) const
get the key node this transaction is using
Definition: kgpgsigntransactionhelper.cpp:39
kgpgchangekey.h
KGpgTransaction::TS_USER_ABORTED
the user aborted the transaction
Definition: kgpgtransaction.h:63
kgpgsignkey.h
KGpgRootNode::findKey
KGpgKeyNode * findKey(const QString &keyId)
Find a key node with the given id.
Definition: KGpgRootNode.cpp:118
QMetaObject::invokeMethod
bool invokeMethod(QObject *obj, const char *member, Qt::ConnectionType type, QGenericReturnArgument ret, QGenericArgument val0, QGenericArgument val1, QGenericArgument val2, QGenericArgument val3, QGenericArgument val4, QGenericArgument val5, QGenericArgument val6, QGenericArgument val7, QGenericArgument val8, QGenericArgument val9)
KgpgCore::TRUST_MINIMUM
internal value for use in filters
Definition: kgpgkey.h:54
KGpgNode::toExpandableNode
KGpgExpandableNode * toExpandableNode()
Definition: KGpgNode.cpp:60
kgpgsettings.h
KgpgCore::ITYPE_SIGN
signature (to a key, uid or uat)
Definition: kgpgkey.h:102
keyexport.h
KeyListProxyModel
Definition: keylistproxymodel.h:30
KGpgExpandableNode
The abstract base class for all classes that may have child objects.
Definition: KGpgExpandableNode.h:34
QItemSelection
KeyTreeView::saveLayout
void saveLayout(KConfigGroup &cg) const
Definition: keytreeview.cpp:141
QString::replace
QString & replace(int position, int n, QChar after)
KGpgSettings::self
static KGpgSettings * self()
Definition: kgpgsettings.cpp:17
keyservers.h
QTreeView::setSortingEnabled
void setSortingEnabled(bool enable)
newkey.h
KGpgNode::toUatNode
KGpgUatNode * toUatNode()
Definition: KGpgNode.cpp:160
KGpgRevokeDialog::getDescription
QString getDescription() const
Definition: kgpgrevokewidget.cpp:55
kgpgkeyservergettransaction.h
KeysManager::importRemoteKeys
bool importRemoteKeys(const QStringList &keyIDs, const bool dialog=true)
Definition: keysmanager.cpp:2150
KGpgNode::toKeyNode
KGpgKeyNode * toKeyNode()
Definition: KGpgNode.cpp:94
KGpgSettings::keyServers
static QStringList keyServers()
Get Key servers used by KGpg.
Definition: kgpgsettings.h:896
QHash::take
T take(const Key &key)
KGpgSettings::recentFiles
static uint recentFiles()
Get The number of recently opened files shown in the editor menu.
Definition: kgpgsettings.h:687
QLatin1String
QKeySequence
KGpgSettings::showExpi
static bool showExpi()
Get Show the expiration value in key manager.
Definition: kgpgsettings.h:402
KGpgItemModel::refreshKeys
void refreshKeys(const QStringList &ids=QStringList())
Definition: kgpgitemmodel.cpp:441
QBoxLayout::addStretch
void addStretch(int stretch)
KGpgNode::getId
virtual QString getId() const
Definition: KGpgNode.cpp:318
KGpgRefNode::getId
virtual QString getId() const
Definition: KGpgRefNode.cpp:115
KGpgExpandableNode::wasExpanded
virtual bool wasExpanded() const
check if there are any child nodes present in memory
Definition: KGpgExpandableNode.cpp:64
KGpgKeyNode::getEmail
virtual QString getEmail() const
Definition: KGpgKeyNode.cpp:95
KeysManager::~KeysManager
~KeysManager()
Definition: keysmanager.cpp:489
KGpgNode::toUidNode
KGpgUidNode * toUidNode()
Definition: KGpgNode.cpp:128
KGpgGroupMemberNode
A member of a GnuPG group.
Definition: KGpgGroupMemberNode.h:35
KGpgDelKey::keys
KGpgKeyNode::List keys() const
the keys that were requested to be removed
Definition: kgpgdelkey.cpp:40
KGpgRevokeDialog::printChecked
bool printChecked()
Definition: kgpgrevokewidget.cpp:83
KeysManager::KeysManager
KeysManager(QWidget *parent=0)
Definition: keysmanager.cpp:119
QString::at
const QChar at(int position) const
KgpgCore::ITYPE_UAT
user attribute to a key (i.e. photo id)
Definition: kgpgkey.h:100
QAction
KGpgNode::toGroupNode
KGpgGroupNode * toGroupNode()
Definition: KGpgNode.cpp:176
KeyTreeView::resizeColumnsToContents
void resizeColumnsToContents()
Definition: keytreeview.cpp:207
KeysManager::slotImportDone
void slotImportDone(int ret)
Definition: keysmanager.cpp:2597
newKey
Definition: newkey.h:24
KGpgSettings::showSecret
static bool showSecret()
Get Show only secret keys in key manager.
Definition: kgpgsettings.h:459
KGpgReceiveKeys
class for downloading new keys from keyserver
Definition: kgpgkeyservergettransaction.h:68
KGpgNode::getEmail
virtual QString getEmail() const
Definition: KGpgNode.cpp:300
KGpgNode::getChild
virtual KGpgNode * getChild(const int index) const
Returns the child node at the given index.
Definition: KGpgNode.cpp:268
keysmanager.h
KGpgRevokeDialog::importChecked
bool importChecked()
Definition: kgpgrevokewidget.cpp:78
kgpgadduid.h
KGpgRevokeDialog::saveUrl
KUrl saveUrl() const
Definition: kgpgrevokewidget.cpp:65
KGpgTransaction::TS_INVALID_EMAIL
the given email address is invalid
Definition: kgpgtransaction.h:64
KeyServer::getServerList
static QStringList getServerList()
Returns the server list.
Definition: keyservers.cpp:339
QString::length
int length() const
KGpgGenerateRevoke::getOutput
const QString & getOutput() const
returns the revokation certificate
Definition: kgpggeneraterevoke.cpp:121
KGpgTransaction::TS_BAD_PASSPHRASE
the passphrase was not correct
Definition: kgpgtransaction.h:61
QSet::isEmpty
bool isEmpty() const
KGpgNode::getChildCount
virtual int getChildCount()
Return how many child nodes exist.
Definition: KGpgNode.cpp:262
QString::section
QString section(QChar sep, int start, int end, QFlags< QString::SectionFlag > flags) const
caff.h
KGpgNode::toSignNode
KGpgSignNode * toSignNode()
Definition: KGpgNode.cpp:224
QAbstractItemView::edit
void edit(const QModelIndex &index)
KGpgNode::getName
virtual QString getName() const
Definition: KGpgNode.cpp:294
KGpgKeyNode::getGroupRefs
QList< KGpgGroupMemberNode * > getGroupRefs(void) const
returns a list of all group member nodes that reference this key
Definition: KGpgKeyNode.cpp:250
KgpgKeyGenerate
Definition: kgpgkeygenerate.h:27
KGpgImport::getImportedIds
static QStringList getImportedIds(const QStringList &log, const int reason=-1)
get the full fingerprints of the imported keys
Definition: kgpgimport.cpp:59
kgpggeneratekey.h
KGpgDelSign
delete signatures from user ids
Definition: kgpgdelsign.h:27
KeysManager::showTrayMessage
void showTrayMessage(const QString &message)
Definition: keysmanager.cpp:2715
kgpggeneraterevoke.h
KGpgUidNode::getParentKeyNode
virtual KGpgKeyNode * getParentKeyNode() const
Definition: KGpgUidNode.cpp:116
detailedconsole.h
QWidget::show
void show()
KGpgTransaction
Process one GnuPG operation.
Definition: kgpgtransaction.h:44
KGpgItemModel::deleteFromGroup
void deleteFromGroup(KGpgGroupNode *group, KGpgGroupMemberNode *member)
Definition: kgpgitemmodel.cpp:348
KGpgUidNode
A user id of a public key or key pair.
Definition: KGpgUidNode.h:33
KeyListProxyModel::setPreviewSize
void setPreviewSize(const int pixel)
Definition: keylistproxymodel.cpp:500
KGpgImport::isKey
static int isKey(const QString &text, const bool incomplete=false)
check if the given text contains a private or public key
Definition: kgpgimport.cpp:276
kgpgOptions
Definition: kgpgoptions.h:93
KGpgItemModel::setDefaultKey
void setDefaultKey(KGpgKeyNode *def)
Definition: kgpgitemmodel.cpp:384
KGpgSignNode
A signature to another key object.
Definition: KGpgSignNode.h:31
KgpgCore::TRUST_ULTIMATE
this key has highest possible level of trust (e.g. your own secret keys)
Definition: kgpgkey.h:64
KGpgNode::hasChildren
virtual bool hasChildren() const
Returns if this node has child nodes.
Definition: KGpgNode.cpp:256
QLabel
KGpgGroupNode::remove
void remove()
Remove this group from the GnuPG config file.
Definition: KGpgGroupNode.cpp:233
QCursor
KGpgKeyNode::getBeautifiedFingerprint
QString getBeautifiedFingerprint() const
Print the full key fingerprint with spaces inserted.
Definition: KGpgKeyNode.cpp:137
KGpgKeyNode::getGroups
QList< KGpgGroupNode * > getGroups(void) const
returns a list of all groups this key is member of
Definition: KGpgKeyNode.cpp:226
KGpgNode::getTrust
virtual KgpgCore::KgpgKeyTrust getTrust() const
Definition: KGpgNode.cpp:282
keyinfodialog.h
KeysManager::goDefaultShortcut
KShortcut goDefaultShortcut() const
returns the shortcut to go to the default key in a key selection
Definition: keysmanager.cpp:2724
KgpgCore::ITYPE_UID
additional user id
Definition: kgpgkey.h:99
KGpgSignTransactionHelper::carefulCheck
carefulCheck
Definition: kgpgsigntransactionhelper.h:38
KGpgSettings::setShowSecret
static void setShowSecret(bool v)
Set Show only secret keys in key manager.
Definition: kgpgsettings.h:449
KJob
kgpgkeygenerate.h
KGpgSettings::showSize
static bool showSize()
Get Show the size value in key manager.
Definition: kgpgsettings.h:421
KGpgEncrypt
encrypt the given text or files
Definition: kgpgencrypt.h:30
QProcess::start
void start(const QString &program, const QStringList &arguments, QFlags< QIODevice::OpenModeFlag > mode)
KGpgSignKey
transaction class to sign all user ids of a key
Definition: kgpgsignkey.h:28
KGpgDelKey
delete a public key
Definition: kgpgdelkey.h:26
KGpgSignableNode
An object that may have KGpgSignNode children.
Definition: KGpgSignableNode.h:31
KGpgGenerateKey::TS_INVALID_NAME
the owners name is not accepted by GnuPG
Definition: kgpggeneratekey.h:35
KGpgSettings::setTrustLevel
static void setTrustLevel(int v)
Set Show only keys with at least that trust level in key manager.
Definition: kgpgsettings.h:487
KGpgSettings::setShowTrust
static void setShowTrust(bool v)
Set Show the trust value in key manager.
Definition: kgpgsettings.h:373
KGpgRefreshKeys
class for refreshing keys already in the keyring from keyserver
Definition: kgpgkeyservergettransaction.h:90
KgpgSelectSecretKey
Definition: selectsecretkey.h:23
KeysManager::readAllOptions
void readAllOptions()
Definition: keysmanager.cpp:1190
KeyServer::slotSetExportAttribute
void slotSetExportAttribute(const QString &attr)
Definition: keyservers.cpp:288
KGpgEncrypt::AllowUntrustedEncryption
allow encryption with untrusted keys, ignored for symmetric encryption
Definition: kgpgencrypt.h:39
QProcess::waitForFinished
bool waitForFinished(int msecs)
keylistproxymodel.h
KgpgCore::ITYPE_SUB
subkey of a public or secret key
Definition: kgpgkey.h:98
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Mon Jun 22 2020 13:42:08 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

kgpg

Skip menu "kgpg"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

kdeutils API Reference

Skip menu "kdeutils API Reference"
  • ark
  • filelight
  • kcalc
  • kcharselect
  • kdf
  • kfloppy
  • kgpg
  • ktimer
  • kwallet
  • sweeper

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal