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

kleopatra

  • sources
  • kde-4.14
  • kdepim
  • kleopatra
  • crypto
signemailtask.cpp
Go to the documentation of this file.
1 /* -*- mode: c++; c-basic-offset:4 -*-
2  crypto/signemailtask.cpp
3 
4  This file is part of Kleopatra, the KDE keymanager
5  Copyright (c) 2007 Klarälvdalens Datakonsult AB
6 
7  Kleopatra is free software; you can redistribute it and/or modify
8  it under the terms of the GNU General Public License as published by
9  the Free Software Foundation; either version 2 of the License, or
10  (at your option) any later version.
11 
12  Kleopatra is distributed in the hope that it will be useful,
13  but WITHOUT ANY WARRANTY; without even the implied warranty of
14  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15  General Public License for more details.
16 
17  You should have received a copy of the GNU General Public License
18  along with this program; if not, write to the Free Software
19  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 
21  In addition, as a special exception, the copyright holders give
22  permission to link the code of this program with any edition of
23  the Qt library by Trolltech AS, Norway (or with modified versions
24  of Qt that use the same license as Qt), and distribute linked
25  combinations including the two. You must obey the GNU General
26  Public License in all respects for all of the code used other than
27  Qt. If you modify this file, you may extend this exception to
28  your version of the file, but you are not obligated to do so. If
29  you do not wish to do so, delete this exception statement from
30  your version.
31 */
32 
33 #include <config-kleopatra.h>
34 
35 #include "signemailtask.h"
36 
37 #include <utils/input.h>
38 #include <utils/output.h>
39 #include <utils/kleo_assert.h>
40 #include <utils/auditlog.h>
41 
42 #include <kleo/stl_util.h>
43 #include <kleo/cryptobackendfactory.h>
44 #include <kleo/cryptobackend.h>
45 #include <kleo/signjob.h>
46 
47 #include <gpgme++/signingresult.h>
48 #include <gpgme++/key.h>
49 
50 #include <KLocalizedString>
51 
52 #include <QPointer>
53 #include <QTextDocument> // for Qt::escape
54 
55 #ifndef Q_MOC_RUN
56 #include <boost/bind.hpp>
57 #include <boost/mem_fn.hpp>
58 #endif
59 
60 using namespace Kleo;
61 using namespace Kleo::Crypto;
62 using namespace boost;
63 using namespace GpgME;
64 
65 namespace {
66 
67  class SignEMailResult : public Task::Result {
68  const SigningResult m_result;
69  const AuditLog m_auditLog;
70  public:
71  explicit SignEMailResult( const SigningResult & r, const AuditLog & auditLog )
72  : Task::Result(), m_result( r ), m_auditLog( auditLog ) {}
73 
74  /* reimp */ QString overview() const;
75  /* reimp */ QString details() const;
76  /* reimp */ int errorCode() const;
77  /* reimp */ QString errorString() const;
78  /* reimp */ VisualCode code() const;
79  /* reimp */ AuditLog auditLog() const;
80  };
81 
82  QString makeResultString( const SigningResult& res )
83  {
84  const Error err = res.error();
85 
86  if ( err.isCanceled() )
87  return i18n( "Signing canceled." );
88 
89  if ( err )
90  return i18n( "Signing failed: %1", Qt::escape( QString::fromLocal8Bit( err.asString() ) ) );
91 
92  return i18n( "Signing succeeded." );
93  }
94 }
95 
96 class SignEMailTask::Private {
97  friend class ::Kleo::Crypto::SignEMailTask;
98  SignEMailTask * const q;
99 public:
100  explicit Private( SignEMailTask * qq );
101 
102 private:
103  std::auto_ptr<Kleo::SignJob> createJob( GpgME::Protocol proto );
104 
105 private:
106  void slotResult( const SigningResult & );
107 
108 private:
109  shared_ptr<Input> input;
110  shared_ptr<Output> output;
111  std::vector<Key> signers;
112  bool detached;
113  bool clearsign;
114 
115  QString micAlg;
116 
117  QPointer<Kleo::SignJob> job;
118 };
119 
120 SignEMailTask::Private::Private( SignEMailTask * qq )
121  : q( qq ),
122  input(),
123  output(),
124  signers(),
125  detached( false ),
126  clearsign( false ),
127  micAlg(),
128  job( 0 )
129 {
130 
131 }
132 
133 SignEMailTask::SignEMailTask( QObject * p )
134  : Task( p ), d( new Private( this ) )
135 {
136 
137 }
138 
139 SignEMailTask::~SignEMailTask() {}
140 
141 void SignEMailTask::setInput( const shared_ptr<Input> & input ) {
142  kleo_assert( !d->job );
143  kleo_assert( input );
144  d->input = input;
145 }
146 
147 void SignEMailTask::setOutput( const shared_ptr<Output> & output ) {
148  kleo_assert( !d->job );
149  kleo_assert( output );
150  d->output = output;
151 }
152 
153 void SignEMailTask::setSigners( const std::vector<Key> & signers ) {
154  kleo_assert( !d->job );
155  kleo_assert( !signers.empty() );
156  kleo_assert( kdtools::none_of( signers, mem_fn( &Key::isNull ) ) );
157  d->signers = signers;
158 }
159 
160 void SignEMailTask::setDetachedSignature( bool detached ) {
161  kleo_assert( !d->job );
162  d->detached = detached;
163  d->clearsign = false;
164 }
165 
166 void SignEMailTask::setClearsign( bool clear ) {
167  kleo_assert( !d->job );
168  d->clearsign = clear;
169  d->detached = false;
170 }
171 
172 Protocol SignEMailTask::protocol() const {
173  kleo_assert( !d->signers.empty() );
174  return d->signers.front().protocol();
175 }
176 
177 QString SignEMailTask::label() const
178 {
179  return d->input ? d->input->label() : QString();
180 }
181 
182 unsigned long long SignEMailTask::inputSize() const
183 {
184  return d->input ? d->input->size() : 0;
185 }
186 
187 void SignEMailTask::doStart() {
188  kleo_assert( !d->job );
189  kleo_assert( d->input );
190  kleo_assert( d->output );
191  kleo_assert( !d->signers.empty() );
192 
193  d->micAlg.clear();
194 
195  std::auto_ptr<Kleo::SignJob> job = d->createJob( protocol() );
196  kleo_assert( job.get() );
197 
198  job->start( d->signers,
199  d->input->ioDevice(), d->output->ioDevice(),
200  d->clearsign ? GpgME::Clearsigned : d->detached ? GpgME::Detached : GpgME::NormalSignatureMode );
201 
202  d->job = job.release();
203 }
204 
205 void SignEMailTask::cancel() {
206  if ( d->job )
207  d->job->slotCancel();
208 }
209 
210 std::auto_ptr<Kleo::SignJob> SignEMailTask::Private::createJob( GpgME::Protocol proto ) {
211  const CryptoBackend::Protocol * const backend = CryptoBackendFactory::instance()->protocol( proto );
212  kleo_assert( backend );
213  bool shouldArmor = ( proto == OpenPGP || q->asciiArmor() ) && !output->binaryOpt();
214  std::auto_ptr<Kleo::SignJob> signJob( backend->signJob( /*armor=*/ shouldArmor, /*textmode=*/false ) );
215  kleo_assert( signJob.get() );
216  if ( proto == CMS && !q->asciiArmor() && !output->binaryOpt() )
217  signJob->setOutputIsBase64Encoded( true );
218  connect( signJob.get(), SIGNAL(progress(QString,int,int)),
219  q, SLOT(setProgress(QString,int,int)) );
220  connect( signJob.get(), SIGNAL(result(GpgME::SigningResult,QByteArray)),
221  q, SLOT(slotResult(GpgME::SigningResult)) );
222  return signJob;
223 }
224 
225 static QString collect_micalgs( const GpgME::SigningResult & result, GpgME::Protocol proto ) {
226  const std::vector<GpgME::CreatedSignature> css = result.createdSignatures();
227  QStringList micalgs;
228 #ifndef DASHBOT_HAS_STABLE_COMPILER
229  Q_FOREACH( const GpgME::CreatedSignature & sig, css )
230  micalgs.push_back( QString::fromLatin1( sig.hashAlgorithmAsString() ).toLower() );
231 #else
232  std::transform( css.begin(), css.end(),
233  std::back_inserter( micalgs ),
234  boost::bind( &QString::toLower, boost::bind( &QString::fromLatin1, boost::bind( &GpgME::CreatedSignature::hashAlgorithmAsString, _1 ), -1 ) ) );
235 #endif
236  if ( proto == GpgME::OpenPGP )
237  for ( QStringList::iterator it = micalgs.begin(), end = micalgs.end() ; it != end ; ++it )
238  it->prepend( QLatin1String("pgp-") );
239  micalgs.sort();
240  micalgs.erase( std::unique( micalgs.begin(), micalgs.end() ), micalgs.end() );
241  return micalgs.join( QLatin1String(",") );
242 }
243 
244 void SignEMailTask::Private::slotResult( const SigningResult & result ) {
245  const Job * const job = qobject_cast<const Job*>( q->sender() );
246  if ( result.error().code() ) {
247  output->cancel();
248  } else {
249  output->finalize();
250  micAlg = collect_micalgs( result, q->protocol() );
251  }
252  q->emitResult( shared_ptr<Result>( new SignEMailResult( result, AuditLog::fromJob( job ) ) ) );
253 }
254 
255 QString SignEMailTask::micAlg() const {
256  return d->micAlg;
257 }
258 
259 
260 QString SignEMailResult::overview() const {
261  return makeOverview( makeResultString( m_result ) );
262 }
263 
264 QString SignEMailResult::details() const {
265  return QString();
266 }
267 
268 int SignEMailResult::errorCode() const {
269  return m_result.error().encodedError();
270 }
271 
272 QString SignEMailResult::errorString() const {
273  return hasError() ? makeResultString( m_result ) : QString();
274 }
275 
276 Task::Result::VisualCode SignEMailResult::code() const {
277  if ( m_result.error().isCanceled() )
278  return Warning;
279  return m_result.error().code() ? NeutralError : NeutralSuccess;
280 }
281 
282 AuditLog SignEMailResult::auditLog() const {
283  return m_auditLog;
284 }
285 
286 #include "moc_signemailtask.cpp"
287 
288 
Kleo::Detached
Definition: types.h:55
auditlog.h
output.h
input.h
QList::push_back
void push_back(const T &value)
QByteArray
Kleo::Crypto::Task::Result::VisualCode
VisualCode
Definition: task.h:129
Kleo::AuditLog
Definition: auditlog.h:48
collect_micalgs
static QString collect_micalgs(const GpgME::SigningResult &result, GpgME::Protocol proto)
Definition: signemailtask.cpp:225
Kleo::Crypto::SignEMailTask::setInput
void setInput(const boost::shared_ptr< Input > &input)
Definition: signemailtask.cpp:141
Kleo::Crypto::SignEMailTask::protocol
GpgME::Protocol protocol() const
Definition: signemailtask.cpp:172
QPointer< Kleo::SignJob >
Kleo::Crypto::Task
Definition: task.h:57
QList::erase
iterator erase(iterator pos)
QStringList::join
QString join(const QString &separator) const
Kleo::Crypto::SignEMailTask::cancel
void cancel()
Definition: signemailtask.cpp:205
kleo_assert.h
Kleo::Crypto::SignEMailTask::~SignEMailTask
~SignEMailTask()
Definition: signemailtask.cpp:139
boost::shared_ptr
Definition: encryptemailcontroller.h:51
QString::fromLocal8Bit
QString fromLocal8Bit(const char *str, int size)
d
#define d
Definition: adduseridcommand.cpp:89
Kleo::Crypto::SignEMailTask::setSigners
void setSigners(const std::vector< GpgME::Key > &recipients)
Definition: signemailtask.cpp:153
QObject
Kleo::Class::OpenPGP
Definition: classify.h:49
Kleo::Crypto::SignEMailTask
Definition: signemailtask.h:60
Kleo::Class::CMS
Definition: classify.h:48
Kleo::AuditLog::fromJob
static AuditLog fromJob(const Job *)
Definition: auditlog.cpp:45
QString
Kleo::Crypto::SignEMailTask::setClearsign
void setClearsign(bool clear)
Definition: signemailtask.cpp:166
QList::iterator
QStringList
QList::end
iterator end()
QString::toLower
QString toLower() const
Kleo::Crypto::SignEMailTask::label
QString label() const
Definition: signemailtask.cpp:177
kleo_assert
#define kleo_assert(cond)
Definition: kleo_assert.h:86
Kleo::Crypto::Task::Result
Definition: task.h:119
Kleo::Crypto::SignEMailTask::micAlg
QString micAlg() const
Definition: signemailtask.cpp:255
QLatin1String
Qt::escape
QString escape(const QString &plain)
q
#define q
Definition: adduseridcommand.cpp:90
QString::fromLatin1
QString fromLatin1(const char *str, int size)
QStringList::sort
void sort()
signemailtask.h
Kleo::Crypto::SignEMailTask::setDetachedSignature
void setDetachedSignature(bool detached)
Definition: signemailtask.cpp:160
Kleo::Crypto::SignEMailTask::SignEMailTask
SignEMailTask(QObject *parent=0)
Definition: signemailtask.cpp:133
QList::begin
iterator begin()
Kleo::Crypto::SignEMailTask::setOutput
void setOutput(const boost::shared_ptr< Output > &output)
Definition: signemailtask.cpp:147
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Mon Jun 22 2020 13:33:11 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

kleopatra

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

kdepim API Reference

Skip menu "kdepim API Reference"
  • akonadi_next
  • akregator
  • blogilo
  • calendarsupport
  • console
  •   kabcclient
  •   konsolekalendar
  • kaddressbook
  • kalarm
  •   lib
  • kdgantt2
  • kjots
  • kleopatra
  • kmail
  • knode
  • knotes
  • kontact
  • korgac
  • korganizer
  • ktimetracker
  • libkdepim
  • libkleo
  • libkpgp
  • mailcommon
  • messagelist
  • messageviewer
  • pimprint

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