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

kget

  • sources
  • kde-4.12
  • kdenetwork
  • kget
  • core
signature.cpp
Go to the documentation of this file.
1 /**************************************************************************
2 * Copyright (C) 2009-2011 Matthias Fuchs <mat69@gmx.net> *
3 * *
4 * This program is free software; you can redistribute it and/or modify *
5 * it under the terms of the GNU General Public License as published by *
6 * the Free Software Foundation; either version 2 of the License, or *
7 * (at your option) any later version. *
8 * *
9 * This program is distributed in the hope that it will be useful, *
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
12 * GNU General Public License for more details. *
13 * *
14 * You should have received a copy of the GNU General Public License *
15 * along with this program; if not, write to the *
16 * Free Software Foundation, Inc., *
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . *
18 ***************************************************************************/
19 
20 #include "signature_p.h"
21 #include "keydownloader.h"
22 #include "settings.h"
23 
24 #include <KDebug>
25 #include <KLocale>
26 #include <KMessageBox>
27 
28 #include <QtXml/QDomElement>
29 
30 #ifdef HAVE_QGPGME
31 #include <gpgme++/context.h>
32 #include <gpgme++/data.h>
33 #include <qgpgme/dataprovider.h>
34 
35 #include <QtCore/QFile>
36 #endif
37 
38 #ifdef HAVE_QGPGME
39 K_GLOBAL_STATIC(KeyDownloader, signatureDownloader)
40 #endif //HAVE_QGPGME
41 
42 SignaturePrivate::SignaturePrivate(Signature *signature)
43  : q(signature),
44  type(Signature::NoType),
45  status(Signature::NoResult),
46  verifyTried(false),
47  sigSummary(0),
48  error(0)
49 {
50 }
51 
52 SignaturePrivate::~SignaturePrivate()
53 {
54 }
55 
56 void SignaturePrivate::signatureDownloaded()
57 {
58  if (verifyTried) {
59  kDebug(5001) << "Rerun verification.";
60  q->verify();
61  }
62 }
63 
64 #ifdef HAVE_QGPGME
65 GpgME::VerificationResult SignaturePrivate::verify(const KUrl &dest, const QByteArray &sig)
66 {
67  GpgME::VerificationResult result;
68  if (!QFile::exists(dest.pathOrUrl()) || sig.isEmpty()) {
69  return result;
70  }
71 
72  GpgME::initializeLibrary();
73  GpgME::Error error = GpgME::checkEngine(GpgME::OpenPGP);
74  if (error) {
75  kDebug(5001) << "OpenPGP not supported!";
76  return result;
77  }
78 
79  QScopedPointer<GpgME::Context> context(GpgME::Context::createForProtocol(GpgME::OpenPGP));
80  if (!context.data()) {
81  kDebug(5001) << "Could not create context.";
82  return result;
83  }
84 
85  boost::shared_ptr<QFile> qFile(new QFile(dest.pathOrUrl()));
86  qFile->open(QIODevice::ReadOnly);
87  QGpgME::QIODeviceDataProvider *file = new QGpgME::QIODeviceDataProvider(qFile);
88  GpgME::Data dFile(file);
89 
90  QGpgME::QByteArrayDataProvider signatureBA(sig);
91  GpgME::Data signature(&signatureBA);
92 
93  return context->verifyDetachedSignature(signature, dFile);
94 }
95 #endif //HAVE_QGPGME
96 
97 
98 Signature::Signature(const KUrl &dest, QObject *object)
99  : QObject(object),
100  d(new SignaturePrivate(this))
101 {
102  d->dest = dest;
103 #ifdef HAVE_QGPGME
104  qRegisterMetaType<GpgME::VerificationResult>("GpgME::VerificationResult");
105  connect(&d->thread, SIGNAL(verified(GpgME::VerificationResult)), this, SLOT(slotVerified(GpgME::VerificationResult)));
106 #endif //HAVE_QGPGME
107 }
108 
109 Signature::~Signature()
110 {
111  delete d;
112 }
113 
114 KUrl Signature::destination() const
115 {
116  return d->dest;
117 }
118 
119 void Signature::setDestination(const KUrl &destination)
120 {
121  d->dest = destination;
122 }
123 
124 Signature::VerificationStatus Signature::status() const
125 {
126  return d->status;
127 }
128 
129 #ifdef HAVE_QGPGME
130 GpgME::VerificationResult Signature::verificationResult()
131 {
132  return d->verificationResult;
133 }
134 #endif //HAVE_QGPGME
135 
136 QByteArray Signature::signature()
137 {
138  return d->signature;
139 }
140 
141 void Signature::setAsciiDetatchedSignature(const QString &signature)
142 {
143  setSignature(signature.toAscii(), AsciiDetached);
144 }
145 
146 void Signature::setSignature(const QByteArray &signature, SignatureType type)
147 {
148  if ((signature == d->signature) && (type == d->type)) {
149  return;
150  }
151 
152  d->type = type;
153  d->signature = signature;
154 
155  d->fingerprint.clear();
156  d->error = 0;
157  d->sigSummary = 0;
158  d->status = Signature::NoResult;
159 
160 #ifdef HAVE_QGPGME
161  d->verificationResult = GpgME::VerificationResult();
162 #endif //HAVE_QGPGME
163 
164  emit verified(d->status);//FIXME
165 }
166 
167 Signature::SignatureType Signature::type() const
168 {
169  return d->type;
170 }
171 
172 QString Signature::fingerprint()
173 {
174  return d->fingerprint;
175 }
176 
177 void Signature::downloadKey(QString fingerprint) // krazy:exclude=passbyvalue
178 {
179 #ifdef HAVE_QGPGME
180  kDebug(5001) << "Downloading key:" << fingerprint;
181  signatureDownloader->downloadKey(fingerprint, this);
182 #else
183  Q_UNUSED(fingerprint)
184 #endif //HAVE_QGPGME
185 }
186 
187 bool Signature::isVerifyable()
188 {
189 #ifdef HAVE_QGPGME
190  return QFile::exists(d->dest.pathOrUrl()) && !d->signature.isEmpty();
191 #else
192  return false;
193 #endif //HAVE_QGPGME
194 }
195 
196 void Signature::verify()
197 {
198 #ifdef HAVE_QGPGME
199  d->thread.verify(d->dest, d->signature);
200 #endif //HAVE_QGPGME
201 }
202 
203 #ifdef HAVE_QGPGME
204 void Signature::slotVerified(const GpgME::VerificationResult &result)
205 {
206  d->verificationResult = result;
207  d->status = Signature::NotWorked;
208 
209  if (!d->verificationResult.numSignatures()) {
210  kDebug(5001) << "No signatures\n";
211  emit verified(d->status);
212  return;
213  }
214 
215  GpgME::Signature signature = d->verificationResult.signature(0);
216  d->sigSummary = signature.summary();
217  d->error = signature.status().code();
218  d->fingerprint = signature.fingerprint();
219 
220  kDebug(5001) << "Fingerprint:" << d->fingerprint;
221  kDebug(5001) << "Signature summary:" << d->sigSummary;
222  kDebug(5001) << "Error code:" << d->error;
223 
224  if (d->sigSummary & GpgME::Signature::KeyMissing) {
225  kDebug(5001) << "Public key missing.";
226  if (Settings::signatureAutomaticDownloading() ||
227  (KMessageBox::warningYesNoCancel(0,
228  i18n("The key to verify the signature is missing, do you want to download it?")) == KMessageBox::Yes)) {
229  d->verifyTried = true;
230  downloadKey(d->fingerprint);
231  emit verified(d->status);
232  return;
233  }
234  }
235 
236  if (!signature.status()) {
237  if (d->sigSummary & GpgME::Signature::Valid) {
238  d->status = Signature::Verified;
239  } else if ((d->sigSummary & GpgME::Signature::Green) || (d->sigSummary == 0)) {
240  d->status = Signature::VerifiedInformation;
241  }
242  } else if (signature.status()) {
243  if ((d->sigSummary & GpgME::Signature::KeyExpired) || (d->sigSummary & GpgME::Signature::KeyRevoked)) {
244  d->status = Signature::VerifiedWarning;
245  }
246  if (d->sigSummary & GpgME::Signature::Red) {//TODO handle more cases!
247  d->status = Signature::NotVerified;
248  //TODO handle that dialog better in 4.5
249  KMessageBox::error(0,
250  i18n("The signature could not be verified for %1. See transfer settings for more information.", d->dest.fileName()),
251  i18n("Signature not verified"));
252  }
253  }
254 
255  emit verified(d->status);
256 }
257 #endif //HAVE_QGPGME
258 
259 void Signature::save(const QDomElement &element)
260 {
261  QDomElement e = element;
262 
263  QDomElement verification = e.ownerDocument().createElement("signature");
264  verification.setAttribute("status", d->status);
265  verification.setAttribute("sigStatus", d->sigSummary);
266  verification.setAttribute("error", d->error);
267  verification.setAttribute("fingerprint", d->fingerprint);
268  verification.setAttribute("type", d->type);
269  QDomText value;
270  switch (d->type) {
271  case NoType:
272  case AsciiDetached:
273  value = e.ownerDocument().createTextNode(d->signature);
274  break;
275  case BinaryDetached:
276  value = e.ownerDocument().createTextNode(d->signature.toBase64());
277  break;
278  }
279  verification.appendChild(value);
280 
281 
282  e.appendChild(verification);
283 }
284 
285 void Signature::load(const QDomElement &e)
286 {
287  QDomElement verification = e.firstChildElement("signature");
288  d->status = static_cast<VerificationStatus>(verification.attribute("status").toInt());
289  d->sigSummary = verification.attribute("sigStatus").toInt();
290  d->error = verification.attribute("error").toInt();
291  d->fingerprint = verification.attribute("fingerprint");
292  d->type = static_cast<SignatureType>(verification.attribute("type").toInt());
293  switch (d->type) {
294  case NoType:
295  case AsciiDetached:
296  d->signature = verification.text().toAscii();
297  break;
298  case BinaryDetached:
299  d->signature = QByteArray::fromBase64(verification.text().toAscii());
300  }
301 }
302 
303 #include "signature.moc"
SignaturePrivate::SignaturePrivate
SignaturePrivate(Signature *signature)
Definition: signature.cpp:42
SignaturePrivate::type
Signature::SignatureType type
Definition: signature_p.h:46
Signature::isVerifyable
bool isVerifyable()
Definition: signature.cpp:187
SignaturePrivate::q
Signature * q
Definition: signature_p.h:44
KeyDownloader
Class to download Keys.
Definition: keydownloader.h:34
Signature::AsciiDetached
Definition: signature.h:53
Signature::verify
void verify()
Definition: signature.cpp:196
SignaturePrivate
Definition: signature_p.h:26
SignaturePrivate::thread
SignatureThread thread
Definition: signature_p.h:51
keydownloader.h
Signature::SignatureType
SignatureType
Definition: signature.h:50
Signature::BinaryDetached
Definition: signature.h:54
Signature::downloadKey
void downloadKey(QString fingerprint)
Definition: signature.cpp:177
Signature::VerifiedInformation
Definition: signature.h:63
QObject
SignaturePrivate::~SignaturePrivate
~SignaturePrivate()
Definition: signature.cpp:52
SignaturePrivate::signature
QByteArray signature
Definition: signature_p.h:53
Signature::Verified
Definition: signature.h:62
Signature::NotWorked
Definition: signature.h:60
Signature::verified
void verified(int verificationStatus)
SignaturePrivate::signatureDownloaded
void signatureDownloaded()
Starts verification again if a verification was tried before but aborted because of missing keys...
Definition: signature.cpp:56
Signature::~Signature
~Signature()
Definition: signature.cpp:109
SignaturePrivate::error
int error
Definition: signature_p.h:50
Signature::NoResult
Definition: signature.h:59
SignaturePrivate::dest
KUrl dest
Definition: signature_p.h:52
Signature::NotVerified
Definition: signature.h:61
Signature::destination
KUrl destination() const
Definition: signature.cpp:114
Signature::VerifiedWarning
Definition: signature.h:64
signature_p.h
Signature::type
SignatureType type() const
Definition: signature.cpp:167
SignaturePrivate::sigSummary
int sigSummary
Definition: signature_p.h:49
SignatureThread::verify
void verify(const KUrl &dest, const QByteArray &sig)
Definition: signaturethread.cpp:49
settings.h
SignaturePrivate::status
Signature::VerificationStatus status
Definition: signature_p.h:47
Signature::load
void load(const QDomElement &e)
Definition: signature.cpp:285
Signature::NoType
Definition: signature.h:52
Signature::status
VerificationStatus status() const
Definition: signature.cpp:124
Signature::save
void save(const QDomElement &element)
Definition: signature.cpp:259
SignaturePrivate::fingerprint
QString fingerprint
Definition: signature_p.h:54
Signature
Class to verify signatures.
Definition: signature.h:38
Signature::setAsciiDetatchedSignature
void setAsciiDetatchedSignature(const QString &signature)
Definition: signature.cpp:141
Signature::setSignature
void setSignature(const QByteArray &signature, SignatureType type)
Definition: signature.cpp:146
Signature::fingerprint
QString fingerprint()
The fingerprint of the signature//TODO get even without verification??
Definition: signature.cpp:172
Signature::signature
QByteArray signature()
Definition: signature.cpp:136
Settings::signatureAutomaticDownloading
static bool signatureAutomaticDownloading()
Get SignatureAutomaticDownloading.
Definition: settings.h:1076
Signature::setDestination
void setDestination(const KUrl &destination)
Definition: signature.cpp:119
SignaturePrivate::verifyTried
bool verifyTried
Definition: signature_p.h:48
Signature::VerificationStatus
VerificationStatus
Definition: signature.h:57
Signature::Signature
Signature(const KUrl &dest, QObject *object=0)
Definition: signature.cpp:98
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 22:53:17 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

kget

Skip menu "kget"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members

kdenetwork API Reference

Skip menu "kdenetwork API Reference"
  • kget
  • kopete
  •   kopete
  •   libkopete
  • krdc
  • krfb

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