• 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
keyservers.cpp
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2002 Jean-Baptiste Mardelle <bj@altern.org>
3  * Copyright (C) 2006,2007,2008,2009,2010,2012,2013 Rolf Eike Beer <kde@opensource.sf-tec.de>
4  */
5 
6 /***************************************************************************
7  * *
8  * This program is free software; you can redistribute it and/or modify *
9  * it under the terms of the GNU General Public License as published by *
10  * the Free Software Foundation; either version 2 of the License, or *
11  * (at your option) any later version. *
12  * *
13  ***************************************************************************/
14 
15 #include "keyservers.h"
16 
17 #include "core/convert.h"
18 #include "detailedconsole.h"
19 #include "gpgproc.h"
20 #include "kgpgsettings.h"
21 #include "model/keylistproxymodel.h"
22 #include "model/kgpgitemmodel.h"
23 #include "model/kgpgsearchresultmodel.h"
24 #include "transactions/kgpgimport.h"
25 #include "transactions/kgpgkeyservergettransaction.h"
26 #include "transactions/kgpgkeyserversearchtransaction.h"
27 #include "transactions/kgpgsendkeys.h"
28 
29 #include <KConfig>
30 #include <KDateTime>
31 #include <KDebug>
32 #include <KLocale>
33 #include <KMessageBox>
34 #include <QCursor>
35 #include <QLabel>
36 #include <QTextCodec>
37 
38 KeyServer::KeyServer(QWidget *parent, KGpgItemModel *model, const bool autoclose)
39  : KDialog(parent),
40  m_dialogserver(NULL),
41  m_searchproc(NULL),
42  page(new keyServerWidget()),
43  m_listpop(NULL),
44  m_resultmodel(NULL),
45  m_itemmodel(new KeyListProxyModel(this, KeyListProxyModel::SingleColumnIdFirst))
46 {
47  setCaption(i18n("Key Server"));
48  setButtons(Close);
49  setModal(false);
50 
51  m_autoclose = autoclose;
52  m_filtermodel.setSortCaseSensitivity(Qt::CaseInsensitive);
53  m_filtermodel.setDynamicSortFilter(true);
54  m_filtermodel.setFilterKeyColumn(0);
55 
56  setMainWidget(page);
57 
58  const QStringList serverlist(getServerList());
59  page->kCBexportks->addItems(serverlist);
60  page->kCBimportks->addItems(serverlist);
61  page->kLEimportid->setFocus();
62 
63  connect(page->Buttonimport, SIGNAL(clicked()), SLOT(slotImport()));
64  connect(page->Buttonsearch, SIGNAL(clicked()), SLOT(slotSearch()));
65  connect(page->Buttonexport, SIGNAL(clicked()), SLOT(slotPreExport()));
66  connect(page->kLEimportid, SIGNAL(returnPressed()), SLOT(slotSearch()));
67  connect(this, SIGNAL(okClicked()), SLOT(slotOk()));
68  connect(page->cBproxyI, SIGNAL(toggled(bool)), SLOT(slotEnableProxyI(bool)));
69  connect(page->cBproxyE, SIGNAL(toggled(bool)), SLOT(slotEnableProxyE(bool)));
70  connect(page->kLEimportid, SIGNAL(textChanged(QString)), SLOT(slotTextChanged(QString)));
71 
72  page->cBproxyI->setChecked(KGpgSettings::useProxy());
73  page->cBproxyE->setChecked(KGpgSettings::useProxy());
74 
75  const QString httpproxy(QLatin1String( qgetenv("http_proxy") ));
76  if (!httpproxy.isEmpty()) {
77  page->cBproxyI->setEnabled(true);
78  page->cBproxyE->setEnabled(true);
79  page->kLEproxyI->setText(httpproxy);
80  page->kLEproxyE->setText(httpproxy);
81  }
82 
83  page->Buttonimport->setEnabled(!page->kLEimportid->text().isEmpty());
84  page->Buttonsearch->setEnabled(!page->kLEimportid->text().isEmpty());
85  setMinimumSize(sizeHint());
86 
87  m_itemmodel->setKeyModel(model);
88  m_itemmodel->setTrustFilter(KgpgCore::TRUST_UNDEFINED);
89  page->kCBexportkey->setModel(m_itemmodel);
90 }
91 
92 KeyServer::~KeyServer()
93 {
94  delete page;
95 }
96 
97 void KeyServer::slotImport()
98 {
99  if (page->kCBimportks->currentText().isEmpty())
100  return;
101 
102  if (page->kLEimportid->text().isEmpty()) {
103  KMessageBox::sorry(this, i18n("You must enter a search string."));
104  return;
105  }
106 
107  startImport(page->kLEimportid->text().simplified().split(QLatin1Char( ' ' )), page->kCBimportks->currentText(), page->kLEproxyI->text());
108 }
109 
110 void KeyServer::startImport(const QStringList &keys, QString server, const QString &proxy)
111 {
112  if (server.isEmpty()) {
113  const QStringList kservers = KeyServer::getServerList();
114  if (kservers.isEmpty()) {
115  KMessageBox::sorry(this, i18n("You need to configure keyservers before trying to download keys."),
116  i18n("No keyservers defined"));
117  return;
118  }
119 
120  server = kservers.first();
121  }
122 
123  QApplication::setOverrideCursor(QCursor(Qt::BusyCursor));
124 
125  KGpgReceiveKeys *proc = new KGpgReceiveKeys(this, server, keys, true, proxy);
126  connect(proc, SIGNAL(done(int)), SLOT(slotDownloadKeysFinished(int)));
127 
128  proc->start();
129 }
130 
131 void KeyServer::slotDownloadKeysFinished(int resultcode)
132 {
133  QApplication::restoreOverrideCursor();
134 
135  KGpgKeyserverGetTransaction *t = qobject_cast<KGpgKeyserverGetTransaction *>(sender());
136  const QStringList log(t->getLog());
137 
138  t->deleteLater();
139 
140  if (resultcode == KGpgTransaction::TS_USER_ABORTED) {
141  emit importFailed();
142  return;
143  }
144 
145  const QStringList keys(KGpgImport::getImportedIds(log));
146  const QString resultmessage(KGpgImport::getImportMessage(log));
147 
148  if (!keys.empty())
149  emit importFinished(keys);
150 
151  (void) new KgpgDetailedInfo(this, resultmessage, log.join(QLatin1String("\n")),
152  KGpgImport::getDetailedImportMessage(log).split(QLatin1Char( '\n' )),
153  i18nc("Caption of message box", "Key Import Finished"));
154 }
155 
156 void KeyServer::slotExport(const QStringList &keyIds)
157 {
158  if (page->kCBexportks->currentText().isEmpty())
159  return;
160 
161  QApplication::setOverrideCursor(QCursor(Qt::BusyCursor));
162 
163  KGpgSendKeys *nk = new KGpgSendKeys(this, page->kCBimportks->currentText(), keyIds, expattr, true, page->kLEproxyI->text());
164  connect(nk, SIGNAL(done(int)), SLOT(slotUploadKeysFinished(int)));
165 
166  nk->start();
167 }
168 
169 void KeyServer::slotUploadKeysFinished(int resultcode)
170 {
171  KGpgSendKeys *nk = qobject_cast<KGpgSendKeys *>(sender());
172  Q_ASSERT(nk != NULL);
173 
174  const QStringList message(nk->getLog());
175  nk->deleteLater();
176 
177  QApplication::restoreOverrideCursor();
178 
179  QString title;
180  if (resultcode == KGpgTransaction::TS_OK)
181  title = i18n("Upload to keyserver finished without errors");
182  else
183  title = i18n("Upload to keyserver failed");
184  KMessageBox::informationList(this, title, message);
185 }
186 
187 void KeyServer::slotSearch()
188 {
189  if (page->kCBimportks->currentText().isEmpty())
190  return;
191 
192  if (page->kLEimportid->text().isEmpty()) {
193  KMessageBox::sorry(this, i18n("You must enter a search string."));
194  return;
195  }
196 
197  page->Buttonsearch->setEnabled(false);
198  if (m_searchproc)
199  return;
200 
201  if (m_resultmodel != NULL)
202  m_resultmodel->deleteLater();
203  m_resultmodel = new KGpgSearchResultModel(this);
204  m_filtermodel.setSourceModel(m_resultmodel);
205  m_filtermodel.setFilterRegExp(QRegExp());
206 
207  m_dialogserver = new KDialog(this );
208  m_dialogserver->setCaption( i18n("Import Key From Keyserver") );
209  m_dialogserver->setButtons( KDialog::Ok | KDialog::Close );
210  m_dialogserver->setDefaultButton( KDialog::Ok);
211  m_dialogserver->setModal( true );
212 
213  m_dialogserver->setButtonText(KDialog::Ok, i18n("&Import"));
214  m_dialogserver->enableButtonOk(false);
215  m_listpop = new searchRes(m_dialogserver);
216  m_listpop->kLVsearch->setModel(&m_filtermodel);
217  m_listpop->kLVsearch->setColumnWidth(0, 180);
218  m_listpop->statusText->setText(i18n("Connecting to the server..."));
219 
220  connect(m_listpop->filterEdit, SIGNAL(textChanged(QString)), SLOT(slotSetFilterString(QString)));
221  connect(m_listpop->kLVsearch->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)), SLOT(transferKeyID()));
222  connect(m_dialogserver, SIGNAL(okClicked()), this, SLOT(slotPreImport()));
223  connect(m_listpop->kLVsearch, SIGNAL(activated(QModelIndex)), m_dialogserver, SIGNAL(okClicked()));
224  connect(m_dialogserver, SIGNAL(closeClicked()), this, SLOT(handleQuit()));
225  connect(m_listpop->kLEID, SIGNAL(clearButtonClicked()), m_listpop->kLVsearch->selectionModel(), SLOT(clearSelection()));
226 
227  m_listpop->kLVsearch->setSelectionMode(QAbstractItemView::ExtendedSelection);
228 
229  m_readmessage.clear();
230 
231  const QString keyserv(page->kCBimportks->currentText());
232 
233  bool useproxy = page->cBproxyI->isChecked();
234  QString proxy;
235  if (useproxy)
236  proxy = page->kLEproxyI->text();
237 
238  m_searchproc = new KGpgKeyserverSearchTransaction(this, keyserv, page->kLEimportid->text().simplified(),
239  true, proxy);
240  connect(m_searchproc, SIGNAL(done(int)), SLOT(slotSearchResult(int)));
241  connect(m_searchproc, SIGNAL(newKey(QStringList)), m_resultmodel, SLOT(slotAddKey(QStringList)));
242  m_searchproc->start();
243 
244  QApplication::setOverrideCursor(QCursor(Qt::BusyCursor));
245  m_dialogserver->setMainWidget(m_listpop);
246  m_listpop->setMinimumSize(m_listpop->sizeHint());
247  m_dialogserver->exec();
248 }
249 
250 void KeyServer::slotSearchResult(int result)
251 {
252  Q_ASSERT(sender() == m_searchproc);
253  m_searchproc->deleteLater();
254  m_searchproc = NULL;
255  page->Buttonsearch->setEnabled(true);
256  QApplication::restoreOverrideCursor();
257 
258  if (result == KGpgTransaction::TS_USER_ABORTED) {
259  delete m_dialogserver;
260  m_dialogserver = NULL;
261  return;
262  }
263 
264  m_dialogserver->enableButtonOk(true);
265 
266  const int keys = m_resultmodel->rowCount(QModelIndex());
267 
268  if (keys > 0) {
269  m_listpop->statusText->setText(i18np("Found 1 matching key", "Found %1 matching keys", keys));
270  m_listpop->kLVsearch->selectionModel()->setCurrentIndex(m_resultmodel->index(0, 0),
271  QItemSelectionModel::SelectCurrent | QItemSelectionModel::Rows);
272  } else {
273  m_listpop->statusText->setText(i18n("No matching keys found"));
274  }
275 }
276 
277 void KeyServer::slotSetText(const QString &text)
278 {
279  page->kLEimportid->setText(text);
280 }
281 
282 void KeyServer::slotTextChanged(const QString &text)
283 {
284  page->Buttonimport->setEnabled(!text.isEmpty());
285  page->Buttonsearch->setEnabled(!text.isEmpty() && (m_searchproc == NULL));
286 }
287 
288 void KeyServer::slotSetExportAttribute(const QString &state)
289 {
290  if (!state.isEmpty())
291  expattr = state;
292  else
293  expattr.clear();
294 }
295 
296 void KeyServer::slotEnableProxyI(const bool on)
297 {
298  page->kLEproxyI->setEnabled(on);
299 }
300 
301 void KeyServer::slotEnableProxyE(const bool on)
302 {
303  page->kLEproxyE->setEnabled(on);
304 }
305 
306 void KeyServer::transferKeyID()
307 {
308  QSet<QString> ids;
309 
310  foreach (const QModelIndex &index, m_listpop->kLVsearch->selectionModel()->selectedIndexes())
311  ids << m_resultmodel->idForIndex(m_filtermodel.mapToSource(index));
312 
313  const QStringList idlist(ids.toList());
314  m_listpop->kLEID->setText(idlist.join( QLatin1String( " " )));
315 }
316 
317 void KeyServer::slotPreImport()
318 {
319  transferKeyID();
320  if (m_listpop->kLEID->text().isEmpty()) {
321  KMessageBox::sorry(this, i18n("You must choose a key."));
322  return;
323  }
324  const QStringList keys = m_listpop->kLEID->text().simplified().split(QLatin1Char(' '));
325  m_dialogserver->close();
326  startImport(keys, page->kCBimportks->currentText(), page->kLEproxyI->text());
327 }
328 
329 void KeyServer::slotPreExport()
330 {
331  slotExport(QStringList(page->kCBexportkey->currentText().section(QLatin1Char( ':' ), 0, 0)));
332 }
333 
334 void KeyServer::slotOk()
335 {
336  accept();
337 }
338 
339 QStringList KeyServer::getServerList()
340 {
341  QStringList serverList(KGpgSettings::keyServers()); // From kgpg config
342  if (!serverList.isEmpty()) {
343  serverList.replaceInStrings(QRegExp(QLatin1String(" .*")), QString()); // Remove kde 3.5 (Default) tag.
344  const QString defaultServer(serverList.takeFirst());
345  qSort(serverList);
346  serverList.prepend(defaultServer);
347  }
348 
349  return serverList;
350 }
351 
352 void KeyServer::handleQuit()
353 {
354  if (m_searchproc != NULL) {
355  QApplication::restoreOverrideCursor();
356  disconnect(m_searchproc, 0, 0, 0);
357  m_searchproc->deleteLater();
358  m_searchproc = NULL;
359  }
360  m_dialogserver->close();
361  page->Buttonsearch->setEnabled(true);
362 }
363 
364 void KeyServer::slotSetKeyserver(const QString &server)
365 {
366  page->kCBimportks->setCurrentIndex(page->kCBimportks->findText(server));
367 }
368 
369 void KeyServer::slotSetFilterString(const QString &expression)
370 {
371  m_filtermodel.setFilterRegExp(QRegExp(expression, Qt::CaseInsensitive, QRegExp::RegExp2));
372 }
373 
374 #include "keyservers.moc"
KGpgItemModel
Definition: kgpgitemmodel.h:44
QModelIndex
QWidget
kgpgimport.h
KGpgTransaction::TS_OK
everything went fine
Definition: kgpgtransaction.h:60
KeyServer::slotSetKeyserver
void slotSetKeyserver(const QString &server)
Definition: keyservers.cpp:364
KGpgKeyserverSearchTransaction
base class for transactions downloading from key servers
Definition: kgpgkeyserversearchtransaction.h:26
KeyServer::transferKeyID
void transferKeyID()
Definition: keyservers.cpp:306
QSortFilterProxyModel::setSourceModel
virtual void setSourceModel(QAbstractItemModel *sourceModel)
keyServerWidget
Definition: keyservers.h:31
QString::split
QStringList split(const QString &sep, SplitBehavior behavior, Qt::CaseSensitivity cs) const
KeyServer::~KeyServer
~KeyServer()
Definition: keyservers.cpp:92
KGpgImport::getImportMessage
QString getImportMessage() const
get textual summary of the import events
Definition: kgpgimport.cpp:96
KDialog
KGpgSearchResultModel::rowCount
virtual int rowCount(const QModelIndex &parent=QModelIndex()) const
Definition: kgpgsearchresultmodel.cpp:304
KGpgTransaction::start
void start()
Start the operation.
Definition: kgpgtransaction.cpp:390
KeyListProxyModel::setKeyModel
void setKeyModel(KGpgItemModel *)
Definition: keylistproxymodel.cpp:253
KeyServer::slotEnableProxyE
void slotEnableProxyE(const bool on)
Definition: keyservers.cpp:301
KGpgImport::getDetailedImportMessage
static QString getDetailedImportMessage(const QStringList &log, const KGpgItemModel *model=NULL)
get detailed summary of import
Definition: kgpgimport.cpp:206
QString::clear
void clear()
QWidget::setMinimumSize
void setMinimumSize(const QSize &)
QRegExp
KGpgKeyserverGetTransaction::getLog
const QStringList & getLog() const
Definition: kgpgkeyservergettransaction.cpp:59
QWidget::setEnabled
void setEnabled(bool)
KeyListProxyModel::setTrustFilter
void setTrustFilter(const KgpgCore::KgpgKeyTrustFlag t)
set the minimum trust level to be shown
Definition: keylistproxymodel.cpp:466
KeyServer::handleQuit
void handleQuit()
Definition: keyservers.cpp:352
KgpgDetailedInfo
Definition: detailedconsole.h:23
QWidget::setFocus
void setFocus()
KGpgSearchResultModel
Model of the results of a keyserver search.
Definition: kgpgsearchresultmodel.h:36
kgpgitemmodel.h
QList::isEmpty
bool isEmpty() const
QString::isEmpty
bool isEmpty() const
KGpgSettings::useProxy
static bool useProxy()
Get Use HTTP proxy when available.
Definition: kgpgsettings.h:934
kgpgkeyserversearchtransaction.h
KeyServer::KeyServer
KeyServer(QWidget *parent=0, KGpgItemModel *model=0, const bool autoclose=false)
Definition: keyservers.cpp:38
gpgproc.h
QApplication::setOverrideCursor
void setOverrideCursor(const QCursor &cursor)
searchRes
Definition: keyservers.h:41
KeyServer::slotSetText
void slotSetText(const QString &text)
Definition: keyservers.cpp:277
QSortFilterProxyModel::setDynamicSortFilter
void setDynamicSortFilter(bool enable)
QApplication::restoreOverrideCursor
void restoreOverrideCursor()
KeyServer::slotExport
void slotExport(const QStringList &keyIds)
Definition: keyservers.cpp:156
KGpgKeyserverGetTransaction
base class for transactions downloading from key servers
Definition: kgpgkeyservergettransaction.h:26
KeyServer::startImport
void startImport(const QStringList &keys, QString server=QString(), const QString &proxy=QString())
import the given keys
Definition: keyservers.cpp:110
QSet
QStringList::replaceInStrings
QStringList & replaceInStrings(const QString &before, const QString &after, Qt::CaseSensitivity cs)
QObject::deleteLater
void deleteLater()
QList::first
T & first()
KeyServer::importFailed
void importFailed()
importing failed
QString
KeyServer::slotPreImport
void slotPreImport()
Definition: keyservers.cpp:317
QStringList
kgpgsearchresultmodel.h
KeyServer::slotOk
void slotOk()
Definition: keyservers.cpp:334
QLatin1Char
KgpgCore::TRUST_UNDEFINED
trust value undefined (i.e. you did not set a trust level)
Definition: kgpgkey.h:59
KeyServer::slotImport
void slotImport()
Definition: keyservers.cpp:97
QWidget::sizeHint
sizeHint
KGpgTransaction::TS_USER_ABORTED
the user aborted the transaction
Definition: kgpgtransaction.h:63
kgpgsettings.h
KeyListProxyModel
Definition: keylistproxymodel.h:30
QItemSelection
keyservers.h
QSortFilterProxyModel::mapToSource
virtual QModelIndex mapToSource(const QModelIndex &proxyIndex) const
kgpgkeyservergettransaction.h
KGpgSearchResultModel::index
virtual QModelIndex index(int row, int column, const QModelIndex &parent=QModelIndex()) const
Definition: kgpgsearchresultmodel.cpp:261
KGpgSettings::keyServers
static QStringList keyServers()
Get Key servers used by KGpg.
Definition: kgpgsettings.h:896
QSortFilterProxyModel::setSortCaseSensitivity
void setSortCaseSensitivity(Qt::CaseSensitivity cs)
QList::takeFirst
T takeFirst()
QLatin1String
kgpgsendkeys.h
KGpgSearchResultModel::idForIndex
const QString & idForIndex(const QModelIndex &index) const
get the key fingerprint for the given index
Definition: kgpgsearchresultmodel.cpp:343
newKey
Definition: newkey.h:24
KGpgSendKeys::getLog
const QStringList & getLog() const
Definition: kgpgsendkeys.cpp:63
KGpgReceiveKeys
class for downloading new keys from keyserver
Definition: kgpgkeyservergettransaction.h:68
KeyServer::getServerList
static QStringList getServerList()
Returns the server list.
Definition: keyservers.cpp:339
KeyServer::slotEnableProxyI
void slotEnableProxyI(const bool on)
Definition: keyservers.cpp:296
QSet::toList
QList< T > toList() const
KeyServer::importFinished
void importFinished(QStringList)
KGpgImport::getImportedIds
static QStringList getImportedIds(const QStringList &log, const int reason=-1)
get the full fingerprints of the imported keys
Definition: kgpgimport.cpp:59
QList::prepend
void prepend(const T &value)
detailedconsole.h
KeyServer::slotTextChanged
void slotTextChanged(const QString &text)
Definition: keyservers.cpp:282
KeyServer::slotPreExport
void slotPreExport()
Definition: keyservers.cpp:329
QCursor
QSortFilterProxyModel::setFilterKeyColumn
void setFilterKeyColumn(int column)
convert.h
QSortFilterProxyModel::setFilterRegExp
void setFilterRegExp(const QRegExp &regExp)
KGpgSendKeys
class for uploading keys from the keyring to a keyserver
Definition: kgpgsendkeys.h:26
KeyServer::slotSetExportAttribute
void slotSetExportAttribute(const QString &attr)
Definition: keyservers.cpp:288
keylistproxymodel.h
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