• 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
keyinfodialog.cpp
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2002 Jean-Baptiste Mardelle <bj@altern.org>
3  * Copyright (C) 2007 Jimmy Gilles <jimmygilles@gmail.com>
4  * Copyright (C) 2008,2009,2010,2011,2012,2013,2014 Rolf Eike Beer <kde@opensource.sf-tec.de>
5  * Copyright (C) 2011 Philip Greggory Lee <rocketman768@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 "keyinfodialog.h"
18 
19 #include "kgpgchangekey.h"
20 #include <kgpgsettings.h>
21 #include "selectexpirydate.h"
22 #include "core/convert.h"
23 #include "core/images.h"
24 #include "core/kgpgkey.h"
25 #include "model/kgpgitemmodel.h"
26 #include "model/kgpgitemnode.h"
27 #include "transactions/kgpgchangepass.h"
28 
29 #include <KComboBox>
30 #include <KDatePicker>
31 #include <KGlobal>
32 #include <KLocale>
33 #include <KMessageBox>
34 #include <KPushButton>
35 #include <KToolInvocation>
36 #include <KUrlLabel>
37 #include <QApplication>
38 #include <QCheckBox>
39 #include <QFormLayout>
40 #include <QGridLayout>
41 #include <QGroupBox>
42 #include <QHBoxLayout>
43 #include <QImage>
44 #include <QPixmap>
45 #include <QVBoxLayout>
46 
47 using namespace KgpgCore;
48 
49 KgpgTrustLabel::KgpgTrustLabel(QWidget *parent, const QString &text, const QColor &color)
50  : QWidget(parent),
51  m_text_w(new QLabel(this)),
52  m_color_w(new QLabel(this)),
53  m_text(text),
54  m_color(color)
55 {
56  m_text_w->setTextInteractionFlags(Qt::TextSelectableByMouse);
57 
58  m_color_w->setLineWidth(1);
59  m_color_w->setFrameShape(QFrame::Box);
60  m_color_w->setAutoFillBackground(true);
61  m_color_w->setMinimumWidth(64);
62 
63  QHBoxLayout *layout = new QHBoxLayout(this);
64  layout->setSpacing(10);
65  layout->setMargin(2);
66  layout->addWidget(m_text_w);
67  layout->addWidget(m_color_w);
68 
69  change();
70 }
71 
72 void KgpgTrustLabel::setText(const QString &text)
73 {
74  m_text = text;
75  change();
76 }
77 
78 void KgpgTrustLabel::setColor(const QColor &color)
79 {
80  m_color = color;
81  change();
82 }
83 
84 QString KgpgTrustLabel::text() const
85 {
86  return m_text;
87 }
88 
89 QColor KgpgTrustLabel::color() const
90 {
91  return m_color;
92 }
93 
94 void KgpgTrustLabel::change()
95 {
96  m_text_w->setText(m_text);
97 
98  QPalette palette = m_color_w->palette();
99  palette.setColor(m_color_w->backgroundRole(), m_color);
100  m_color_w->setPalette(palette);
101 }
102 
103 KgpgKeyInfo::KgpgKeyInfo(KGpgKeyNode *node, KGpgItemModel *model, QWidget *parent)
104  : KDialog(parent),
105  keychange(new KGpgChangeKey(node, this)),
106  m_node(node),
107  m_model(model),
108  m_keywaschanged(false),
109  m_closewhendone(false)
110 {
111  Q_ASSERT(m_model != NULL);
112  Q_ASSERT(m_node != NULL);
113 
114  setupUi(this);
115 
116  setButtons(Ok | Apply | Cancel);
117  setDefaultButton(Ok);
118  setModal(true);
119  enableButtonApply(false);
120 
121  m_email->setUnderline(false);
122  m_trust = new KgpgTrustLabel(this);
123  int trustRow;
124  formLayout_keyproperties->getWidgetPosition(tl_trust, &trustRow, NULL);
125  formLayout_keyproperties->setWidget(trustRow, QFormLayout::FieldRole, m_trust);
126 
127  // Hide some widgets if this is not a secret node.
128  if ( ! m_node->isSecret() ) {
129  m_expirationbtn->hide();
130  m_password->hide();
131  }
132 
133  setMainWidget(page);
134 
135  connect(m_owtrust, SIGNAL(activated(int)), this, SLOT(slotChangeTrust(int)));
136  connect(m_photoid, SIGNAL(activated(QString)), this, SLOT(slotLoadPhoto(QString)));
137  connect(m_email, SIGNAL(leftClickedUrl(QString)), this, SLOT(slotOpenUrl(QString)));
138  connect(keychange, SIGNAL(done(int)), SLOT(slotApplied(int)));
139  connect(m_disable, SIGNAL(toggled(bool)), this, SLOT(slotDisableKey(bool)));
140  connect(m_expirationbtn, SIGNAL(clicked()), this, SLOT(slotChangeDate()));
141  connect(m_password, SIGNAL(clicked()), this, SLOT(slotChangePass()));
142 
143  displayKey();
144  adjustSize();
145  gr_fingerprint->setMinimumHeight(gr_fingerprint->height());
146 }
147 
148 KgpgKeyInfo::~KgpgKeyInfo()
149 {
150  if (keychange)
151  keychange->selfdestruct(false);
152 }
153 
154 void KgpgKeyInfo::reloadNode()
155 {
156  const QString kid(m_node->getId());
157 
158  // this will delete m_node
159  m_model->refreshKey(m_node);
160 
161  m_node = m_model->getRootNode()->findKey(kid);
162  if (m_node != NULL) {
163  displayKey();
164  } else {
165  KMessageBox::error(this, i18n("<qt>The requested key is not present in the keyring anymore.<br />Perhaps it was deleted by another application</qt>"), i18n("Key not found"));
166  m_keywaschanged = false;
167  close();
168  }
169 }
170 
171 void KgpgKeyInfo::displayKey()
172 {
173  const QString name = m_node->getName();
174  setCaption(name);
175  m_name->setText(QLatin1String( "<qt><b>" ) + name + QLatin1String( "</b></qt>" ));
176 
177  const QString email = m_node->getEmail();
178  if (email.isEmpty()) {
179  m_email->setText(i18nc("no email address", "none"));
180  m_email->setUrl(QString());
181  m_email->setEnabled(false);
182  } else {
183  m_email->setText(QLatin1String( "<qt><b>&lt;" ) + email + QLatin1String( "&gt;</b></qt>" ));
184  m_email->setUrl(QLatin1String( "mailto:" ) + name + QLatin1Char( '<' ) + email + QLatin1Char( '>' ));
185  }
186 
187  const KgpgKey *key = m_node->getKey();
188  m_caps->setText(Convert::toString(key->keytype()));
189 
190  QString trust;
191  QColor trustcolor;
192 
193  if (key->valid()) {
194  QModelIndex idx = m_model->nodeIndex(m_node, KEYCOLUMN_TRUST);
195  trust = m_model->data(idx, Qt::AccessibleTextRole).toString();
196  trustcolor = m_model->data(idx, Qt::BackgroundColorRole).value<QColor>();
197  } else {
198  trust = Convert::toString(TRUST_DISABLED);
199  trustcolor = KGpgSettings::colorBad();
200  }
201 
202  m_id->setText(m_node->getId().right(16));
203  m_algorithm->setText(Convert::toString(key->algorithm()) + QLatin1String( " / " ) + Convert::toString(key->encryptionAlgorithm()));
204  m_algorithm->setWhatsThis(i18n("<qt>The left part is the algorithm used by the <b>signature</b> key. The right part is the algorithm used by the <b>encryption</b> key.</qt>"));
205  m_creation->setText(KGlobal::locale()->formatDate(m_node->getCreation().date(), KLocale::ShortDate));
206  if (m_node->getExpiration().isNull())
207  m_expiration->setText(i18nc("Unlimited key lifetime", "Unlimited"));
208  else
209  m_expiration->setText(KGlobal::locale()->formatDate(m_node->getExpiration().date(), KLocale::ShortDate));
210  m_trust->setText(trust);
211  m_trust->setColor(trustcolor);
212  m_length->setText(m_node->getSize());
213  m_length->setWhatsThis(i18n("<qt>The left part is the size of the <b>signature</b> key. The right part is the size of the <b>encryption</b> key.</qt>"));
214  m_fingerprint->setText(m_node->getBeautifiedFingerprint());
215 
216  const QString comment = m_node->getComment();
217  if (comment.isEmpty()) {
218  m_comment->setText(i18nc("no key comment", "<em>none</em>"));
219  m_comment->setTextFormat(Qt::RichText);
220  } else {
221  m_comment->setText(comment);
222  m_comment->setTextFormat(Qt::PlainText);
223  }
224 
225  switch (key->ownerTrust()) {
226  case GPGME_VALIDITY_NEVER:
227  m_owtrust->setCurrentIndex(1);
228  break;
229  case GPGME_VALIDITY_MARGINAL:
230  m_owtrust->setCurrentIndex(2);
231  break;
232  case GPGME_VALIDITY_FULL:
233  m_owtrust->setCurrentIndex(3);
234  break;
235  case GPGME_VALIDITY_ULTIMATE:
236  m_owtrust->setCurrentIndex(4);
237  break;
238  case GPGME_VALIDITY_UNDEFINED:
239  default:
240  m_owtrust->setCurrentIndex(0);
241  break;
242  }
243 
244  if (!key->valid())
245  m_disable->setChecked(true);
246 
247  connect(m_node, SIGNAL(expanded()), SLOT(slotKeyExpanded()));
248  m_node->expand();
249  m_photoid->clear();
250 }
251 
252 void KgpgKeyInfo::slotOpenUrl(const QString &url) const
253 {
254  KToolInvocation::invokeBrowser(url);
255 }
256 
257 void KgpgKeyInfo::slotLoadPhoto(const QString &uid)
258 {
259  int i = uid.toInt();
260  QPixmap pixmap = m_node->getUid(i)->toUatNode()->getPixmap();
261  QImage img = pixmap.toImage();
262  pixmap = QPixmap::fromImage(img.scaled(m_photo->width(), m_photo->height(), Qt::KeepAspectRatio));
263  m_photo->setPixmap(pixmap);
264 }
265 
266 void KgpgKeyInfo::slotChangeDate()
267 {
268  QPointer<SelectExpiryDate> dialog = new SelectExpiryDate(this, m_node->getExpiration());
269  if (dialog->exec() == QDialog::Accepted) {
270  keychange->setExpiration(dialog->date());
271  enableButtonApply(keychange->wasChanged());
272  }
273  delete dialog;
274 }
275 
276 void KgpgKeyInfo::slotDisableKey(const bool ison)
277 {
278  keychange->setDisable(ison);
279  enableButtonApply(keychange->wasChanged());
280 }
281 
282 void KgpgKeyInfo::slotChangePass()
283 {
284  KGpgChangePass *cp = new KGpgChangePass(this, m_node->getId());
285 
286  connect(cp, SIGNAL(done(int)), SLOT(slotInfoPasswordChanged(int)));
287 
288  cp->start();
289  QApplication::setOverrideCursor(QCursor(Qt::BusyCursor));
290 }
291 
292 void KgpgKeyInfo::slotInfoPasswordChanged(int result)
293 {
294  sender()->deleteLater();
295 
296  QApplication::restoreOverrideCursor();
297 
298  switch (result) {
299  case KGpgTransaction::TS_OK:
300  KMessageBox::information(this, i18n("Passphrase for the key was changed"));
301  break;
302  case KGpgTransaction::TS_BAD_PASSPHRASE:
303  KMessageBox::error(this, i18n("Bad old passphrase, the passphrase for the key was not changed"), i18n("Could not change passphrase"));
304  break;
305  case KGpgTransaction::TS_USER_ABORTED:
306  break;
307  default:
308  KMessageBox::error(this, i18n("KGpg was unable to change the passphrase."));
309  }
310 }
311 
312 void KgpgKeyInfo::slotChangeTrust(const int newtrust)
313 {
314  keychange->setOwTrust(static_cast<gpgme_validity_t>(newtrust + 1));
315  enableButtonApply(keychange->wasChanged());
316 }
317 
318 void KgpgKeyInfo::setControlEnable(const bool b)
319 {
320  m_owtrust->setEnabled(b);
321  m_disable->setEnabled(b);
322  enableButtonApply(b && keychange->wasChanged());
323 
324  if (m_expirationbtn)
325  m_expirationbtn->setEnabled(b);
326  if (m_password)
327  m_password->setEnabled(b);
328 
329  if (b)
330  QApplication::restoreOverrideCursor();
331  else
332  QApplication::setOverrideCursor(QCursor(Qt::BusyCursor));
333 }
334 
335 void KgpgKeyInfo::slotButtonClicked(int button)
336 {
337  switch (button) {
338  case Ok:
339  m_closewhendone = true;
340  // Fall-through
341  case Apply:
342  setControlEnable(false);
343  keychange->apply();
344  break;
345  case Cancel:
346  if (m_keywaschanged && m_node)
347  emit keyNeedsRefresh(m_node);
348  reject();
349  break;
350  default:
351  KDialog::slotButtonClicked(button);
352  }
353 }
354 
355 void KgpgKeyInfo::slotApplied(int result)
356 {
357  if (result) {
358  KMessageBox::error(this, i18n("Changing key properties failed."), i18n("Key properties"));
359  } else {
360  m_keywaschanged = true;
361  if (m_node)
362  emit keyNeedsRefresh(m_node);
363  reloadNode();
364  }
365  setControlEnable(true);
366 
367  if (m_closewhendone)
368  accept();
369 }
370 
371 void KgpgKeyInfo::slotKeyExpanded()
372 {
373  // the counting starts at 1 and that is the primary uid which can't be a photo id
374  int i = 2;
375  const KGpgSignableNode *uat;
376 
377  while ((uat = m_node->getUid(i++)) != NULL) {
378  if (uat->getType() != KgpgCore::ITYPE_UAT)
379  continue;
380 
381  m_photoid->addItem(uat->getId());
382  }
383 
384  bool hasphoto = (m_photoid->count() > 0);
385 
386  m_photoid->setVisible(hasphoto);
387  m_photoid->setEnabled(hasphoto);
388  if (hasphoto)
389  slotLoadPhoto(m_photoid->currentText());
390 }
391 
392 #include "keyinfodialog.moc"
QWidget::layout
QLayout * layout() const
KGpgChangeKey::wasChanged
bool wasChanged()
Checks if the cached values differ from those of the key.
Definition: kgpgchangekey.cpp:153
KGpgItemModel
Definition: kgpgitemmodel.h:44
QModelIndex
QWidget
KgpgCore::KgpgKey::ownerTrust
gpgme_validity_t ownerTrust() const
Definition: kgpgkey.cpp:288
KgpgTrustLabel::color
QColor color() const
Definition: keyinfodialog.cpp:89
QWidget::palette
const QPalette & palette() const
KGpgKeyNode::getName
virtual QString getName() const
Definition: KGpgKeyNode.cpp:89
KEYCOLUMN_TRUST
#define KEYCOLUMN_TRUST
Definition: kgpgitemmodel.h:32
KGpgKeyNode::getUid
const KGpgSignableNode * getUid(const unsigned int index) const
get the user id or user attribute with the given number
Definition: KGpgKeyNode.cpp:312
KGpgKeyNode::getKey
const KgpgCore::KgpgKey * getKey() const
Returns a reference to the key used in this object.
Definition: KGpgKeyNode.cpp:193
KGpgTransaction::TS_OK
everything went fine
Definition: kgpgtransaction.h:60
QPalette::setColor
void setColor(ColorGroup group, ColorRole role, const QColor &color)
QFrame::setFrameShape
void setFrameShape(Shape)
KGpgKeyNode::getId
virtual QString getId() const
Definition: KGpgKeyNode.cpp:113
KGpgItemModel::refreshKey
void refreshKey(const QString &id)
Definition: kgpgitemmodel.cpp:429
KgpgCore::KgpgKey::algorithm
KgpgKeyAlgo algorithm() const
Definition: kgpgkey.cpp:313
KgpgCore::KgpgKey::keytype
KgpgSubKeyType keytype() const
Definition: kgpgkey.cpp:335
QWidget::setMinimumWidth
void setMinimumWidth(int minw)
QPointer
QHBoxLayout
QVariant::value
T value() const
QPixmap::fromImage
QPixmap fromImage(const QImage &image, QFlags< Qt::ImageConversionFlag > flags)
images.h
kgpgkey.h
KDialog
KgpgCore::KgpgKey
Definition: kgpgkey.h:236
KGpgChangePass
set a new passphrase for a key pair
Definition: kgpgchangepass.h:24
KGpgChangeKey::selfdestruct
void selfdestruct(const bool applyChanges)
Tell the object to remove itself once all work is done.
Definition: kgpgchangekey.cpp:167
QFrame::setLineWidth
void setLineWidth(int)
KGpgTransaction::start
void start()
Start the operation.
Definition: kgpgtransaction.cpp:390
KGpgChangeKey::setOwTrust
void setOwTrust(const gpgme_validity_t trust)
Cache new owner trust.
Definition: kgpgchangekey.cpp:53
KgpgTrustLabel::setText
void setText(const QString &text)
Definition: keyinfodialog.cpp:72
KGpgKeyNode::getComment
virtual QString getComment() const
Definition: KGpgKeyNode.cpp:149
KGpgKeyNode
A public key with or without corresponding secret key.
Definition: KGpgKeyNode.h:33
KGpgNode::getType
virtual KgpgCore::KgpgItemType getType() const =0
Returns the item type of this object.
KgpgKeyInfo::slotButtonClicked
void slotButtonClicked(int button)
Definition: keyinfodialog.cpp:335
QBoxLayout::addWidget
void addWidget(QWidget *widget, int stretch, QFlags< Qt::AlignmentFlag > alignment)
KgpgTrustLabel::text
QString text() const
Definition: keyinfodialog.cpp:84
KgpgKeyInfo::~KgpgKeyInfo
~KgpgKeyInfo()
Definition: keyinfodialog.cpp:148
KgpgCore::TRUST_DISABLED
key is disabled by user (not owner)
Definition: kgpgkey.h:56
kgpgitemmodel.h
QWidget::backgroundRole
QPalette::ColorRole backgroundRole() const
QString::toInt
int toInt(bool *ok, int base) const
QString::isEmpty
bool isEmpty() const
KGpgChangeKey::setExpiration
void setExpiration(const QDateTime &date)
Cache new expiration date.
Definition: kgpgchangekey.cpp:43
SelectExpiryDate
shows a dialog to choose expiry date
Definition: selectexpirydate.h:32
KGpgUatNode::getPixmap
const QPixmap & getPixmap() const
Definition: KGpgUatNode.cpp:148
QApplication::setOverrideCursor
void setOverrideCursor(const QCursor &cursor)
KgpgCore::Convert::toString
QString toString(const KgpgKeyAlgo algorithm)
Definition: convert.cpp:35
QApplication::restoreOverrideCursor
void restoreOverrideCursor()
KgpgTrustLabel
Definition: keyinfodialog.h:40
KGpgItemModel::data
virtual QVariant data(const QModelIndex &index, int role=Qt::DisplayRole) const
Definition: kgpgitemmodel.cpp:95
QLabel::setText
void setText(const QString &)
QString
QColor
KGpgChangeKey
A class for changing several properties of a key at once.
Definition: kgpgchangekey.h:44
QLayout::setMargin
void setMargin(int margin)
kgpgitemnode.h
QString::right
QString right(int n) const
QPixmap
KGpgChangeKey::setDisable
void setDisable(const bool disable)
Cache new disable flag.
Definition: kgpgchangekey.cpp:48
KgpgKeyInfo::keyNeedsRefresh
void keyNeedsRefresh(KGpgKeyNode *node)
KGpgItemModel::getRootNode
KGpgRootNode * getRootNode() const
Definition: kgpgitemmodel.cpp:250
QLatin1Char
kgpgchangekey.h
QImage
KGpgTransaction::TS_USER_ABORTED
the user aborted the transaction
Definition: kgpgtransaction.h:63
KGpgRootNode::findKey
KGpgKeyNode * findKey(const QString &keyId)
Find a key node with the given id.
Definition: KGpgRootNode.cpp:118
KGpgKeyNode::getExpiration
virtual QDateTime getExpiration() const
Definition: KGpgKeyNode.cpp:101
kgpgsettings.h
QLabel::setTextInteractionFlags
void setTextInteractionFlags(QFlags< Qt::TextInteractionFlag > flags)
KGpgKeyNode::getSize
virtual QString getSize() const
Returns a string describing the size of this object.
Definition: KGpgKeyNode.cpp:81
KGpgKeyNode::isSecret
bool isSecret() const
Return if this key has a private key.
Definition: KGpgKeyNode.cpp:125
KGpgNode::toUatNode
KGpgUatNode * toUatNode()
Definition: KGpgNode.cpp:160
QDateTime::isNull
bool isNull() const
QDateTime::date
QDate date() const
QLatin1String
KGpgNode::getId
virtual QString getId() const
Definition: KGpgNode.cpp:318
KgpgTrustLabel::KgpgTrustLabel
KgpgTrustLabel(QWidget *parent=0, const QString &text=QString(), const QColor &color=QColor())
Definition: keyinfodialog.cpp:49
KGpgKeyNode::getEmail
virtual QString getEmail() const
Definition: KGpgKeyNode.cpp:95
KgpgCore::ITYPE_UAT
user attribute to a key (i.e. photo id)
Definition: kgpgkey.h:100
KGpgChangeKey::apply
bool apply()
Apply all cached changes to the key.
Definition: kgpgchangekey.cpp:58
KGpgTransaction::TS_BAD_PASSPHRASE
the passphrase was not correct
Definition: kgpgtransaction.h:61
KgpgTrustLabel::setColor
void setColor(const QColor &color)
Definition: keyinfodialog.cpp:78
KGpgItemModel::nodeIndex
QModelIndex nodeIndex(KGpgNode *node, const int column=0)
Definition: kgpgitemmodel.cpp:406
QWidget::setAutoFillBackground
void setAutoFillBackground(bool enabled)
selectexpirydate.h
KGpgKeyNode::expand
void expand()
read all subitems
Definition: KGpgKeyNode.cpp:361
kgpgchangepass.h
QPixmap::toImage
QImage toImage() const
KGpgKeyNode::getCreation
virtual QDateTime getCreation() const
Definition: KGpgKeyNode.cpp:107
KgpgCore::KgpgKey::valid
bool valid() const
Definition: kgpgkey.cpp:228
QLabel
QCursor
KGpgKeyNode::getBeautifiedFingerprint
QString getBeautifiedFingerprint() const
Print the full key fingerprint with spaces inserted.
Definition: KGpgKeyNode.cpp:137
KgpgCore::KgpgKey::encryptionAlgorithm
KgpgKeyAlgo encryptionAlgorithm() const
Definition: kgpgkey.cpp:318
keyinfodialog.h
QVariant::toString
QString toString() const
convert.h
QPalette
QBoxLayout::setSpacing
void setSpacing(int spacing)
QImage::scaled
QImage scaled(int width, int height, Qt::AspectRatioMode aspectRatioMode, Qt::TransformationMode transformMode) const
KgpgKeyInfo::keychange
KGpgChangeKey * keychange
Definition: keyinfodialog.h:73
KGpgSignableNode
An object that may have KGpgSignNode children.
Definition: KGpgSignableNode.h:31
KGpgSettings::colorBad
static QColor colorBad()
Get Color used for untrusted keys.
Definition: kgpgsettings.h:782
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