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

kleopatra

  • sources
  • kde-4.12
  • 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 <KLocale>
51 
52 #include <QPointer>
53 #include <QTextDocument> // for Qt::escape
54 
55 #include <boost/bind.hpp>
56 #include <boost/mem_fn.hpp>
57 
58 using namespace Kleo;
59 using namespace Kleo::Crypto;
60 using namespace boost;
61 using namespace GpgME;
62 
63 namespace {
64 
65  class SignEMailResult : public Task::Result {
66  const SigningResult m_result;
67  const AuditLog m_auditLog;
68  public:
69  explicit SignEMailResult( const SigningResult & r, const AuditLog & auditLog )
70  : Task::Result(), m_result( r ), m_auditLog( auditLog ) {}
71 
72  /* reimp */ QString overview() const;
73  /* reimp */ QString details() const;
74  /* reimp */ int errorCode() const;
75  /* reimp */ QString errorString() const;
76  /* reimp */ VisualCode code() const;
77  /* reimp */ AuditLog auditLog() const;
78  };
79 
80  QString makeResultString( const SigningResult& res )
81  {
82  const Error err = res.error();
83 
84  if ( err.isCanceled() )
85  return i18n( "Signing canceled." );
86 
87  if ( err )
88  return i18n( "Signing failed: %1", Qt::escape( QString::fromLocal8Bit( err.asString() ) ) );
89 
90  return i18n( "Signing succeeded." );
91  }
92 }
93 
94 class SignEMailTask::Private {
95  friend class ::Kleo::Crypto::SignEMailTask;
96  SignEMailTask * const q;
97 public:
98  explicit Private( SignEMailTask * qq );
99 
100 private:
101  std::auto_ptr<Kleo::SignJob> createJob( GpgME::Protocol proto );
102 
103 private:
104  void slotResult( const SigningResult & );
105 
106 private:
107  shared_ptr<Input> input;
108  shared_ptr<Output> output;
109  std::vector<Key> signers;
110  bool detached;
111  bool clearsign;
112 
113  QString micAlg;
114 
115  QPointer<Kleo::SignJob> job;
116 };
117 
118 SignEMailTask::Private::Private( SignEMailTask * qq )
119  : q( qq ),
120  input(),
121  output(),
122  signers(),
123  detached( false ),
124  clearsign( false ),
125  micAlg(),
126  job( 0 )
127 {
128 
129 }
130 
131 SignEMailTask::SignEMailTask( QObject * p )
132  : Task( p ), d( new Private( this ) )
133 {
134 
135 }
136 
137 SignEMailTask::~SignEMailTask() {}
138 
139 void SignEMailTask::setInput( const shared_ptr<Input> & input ) {
140  kleo_assert( !d->job );
141  kleo_assert( input );
142  d->input = input;
143 }
144 
145 void SignEMailTask::setOutput( const shared_ptr<Output> & output ) {
146  kleo_assert( !d->job );
147  kleo_assert( output );
148  d->output = output;
149 }
150 
151 void SignEMailTask::setSigners( const std::vector<Key> & signers ) {
152  kleo_assert( !d->job );
153  kleo_assert( !signers.empty() );
154  kleo_assert( kdtools::none_of( signers, mem_fn( &Key::isNull ) ) );
155  d->signers = signers;
156 }
157 
158 void SignEMailTask::setDetachedSignature( bool detached ) {
159  kleo_assert( !d->job );
160  d->detached = detached;
161  d->clearsign = false;
162 }
163 
164 void SignEMailTask::setClearsign( bool clear ) {
165  kleo_assert( !d->job );
166  d->clearsign = clear;
167  d->detached = false;
168 }
169 
170 Protocol SignEMailTask::protocol() const {
171  kleo_assert( !d->signers.empty() );
172  return d->signers.front().protocol();
173 }
174 
175 QString SignEMailTask::label() const
176 {
177  return d->input ? d->input->label() : QString();
178 }
179 
180 unsigned long long SignEMailTask::inputSize() const
181 {
182  return d->input ? d->input->size() : 0;
183 }
184 
185 void SignEMailTask::doStart() {
186  kleo_assert( !d->job );
187  kleo_assert( d->input );
188  kleo_assert( d->output );
189  kleo_assert( !d->signers.empty() );
190 
191  d->micAlg.clear();
192 
193  std::auto_ptr<Kleo::SignJob> job = d->createJob( protocol() );
194  kleo_assert( job.get() );
195 
196  job->start( d->signers,
197  d->input->ioDevice(), d->output->ioDevice(),
198  d->clearsign ? GpgME::Clearsigned : d->detached ? GpgME::Detached : GpgME::NormalSignatureMode );
199 
200  d->job = job.release();
201 }
202 
203 void SignEMailTask::cancel() {
204  if ( d->job )
205  d->job->slotCancel();
206 }
207 
208 std::auto_ptr<Kleo::SignJob> SignEMailTask::Private::createJob( GpgME::Protocol proto ) {
209  const CryptoBackend::Protocol * const backend = CryptoBackendFactory::instance()->protocol( proto );
210  kleo_assert( backend );
211  bool shouldArmor = ( proto == OpenPGP || q->asciiArmor() ) && !output->binaryOpt();
212  std::auto_ptr<Kleo::SignJob> signJob( backend->signJob( /*armor=*/ shouldArmor, /*textmode=*/false ) );
213  kleo_assert( signJob.get() );
214  if ( proto == CMS && !q->asciiArmor() && !output->binaryOpt() )
215  signJob->setOutputIsBase64Encoded( true );
216  connect( signJob.get(), SIGNAL(progress(QString,int,int)),
217  q, SLOT(setProgress(QString,int,int)) );
218  connect( signJob.get(), SIGNAL(result(GpgME::SigningResult,QByteArray)),
219  q, SLOT(slotResult(GpgME::SigningResult)) );
220  return signJob;
221 }
222 
223 static QString collect_micalgs( const GpgME::SigningResult & result, GpgME::Protocol proto ) {
224  const std::vector<GpgME::CreatedSignature> css = result.createdSignatures();
225  QStringList micalgs;
226 #ifndef DASHBOT_HAS_STABLE_COMPILER
227  Q_FOREACH( const GpgME::CreatedSignature & sig, css )
228  micalgs.push_back( QString::fromLatin1( sig.hashAlgorithmAsString() ).toLower() );
229 #else
230  std::transform( css.begin(), css.end(),
231  std::back_inserter( micalgs ),
232  boost::bind( &QString::toLower, boost::bind( &QString::fromLatin1, boost::bind( &GpgME::CreatedSignature::hashAlgorithmAsString, _1 ), -1 ) ) );
233 #endif
234  if ( proto == GpgME::OpenPGP )
235  for ( QStringList::iterator it = micalgs.begin(), end = micalgs.end() ; it != end ; ++it )
236  it->prepend( QLatin1String("pgp-") );
237  micalgs.sort();
238  micalgs.erase( std::unique( micalgs.begin(), micalgs.end() ), micalgs.end() );
239  return micalgs.join( QLatin1String(",") );
240 }
241 
242 void SignEMailTask::Private::slotResult( const SigningResult & result ) {
243  const Job * const job = qobject_cast<const Job*>( q->sender() );
244  if ( result.error().code() ) {
245  output->cancel();
246  } else {
247  output->finalize();
248  micAlg = collect_micalgs( result, q->protocol() );
249  }
250  q->emitResult( shared_ptr<Result>( new SignEMailResult( result, AuditLog::fromJob( job ) ) ) );
251 }
252 
253 QString SignEMailTask::micAlg() const {
254  return d->micAlg;
255 }
256 
257 
258 QString SignEMailResult::overview() const {
259  return makeOverview( makeResultString( m_result ) );
260 }
261 
262 QString SignEMailResult::details() const {
263  return QString();
264 }
265 
266 int SignEMailResult::errorCode() const {
267  return m_result.error().encodedError();
268 }
269 
270 QString SignEMailResult::errorString() const {
271  return hasError() ? makeResultString( m_result ) : QString();
272 }
273 
274 Task::Result::VisualCode SignEMailResult::code() const {
275  if ( m_result.error().isCanceled() )
276  return Warning;
277  return m_result.error().code() ? NeutralError : NeutralSuccess;
278 }
279 
280 AuditLog SignEMailResult::auditLog() const {
281  return m_auditLog;
282 }
283 
284 #include "moc_signemailtask.cpp"
285 
286 
Kleo::Detached
Definition: types.h:55
auditlog.h
output.h
input.h
Kleo::Crypto::Task::Result::VisualCode
VisualCode
Definition: task.h:127
Kleo::AuditLog
Definition: auditlog.h:48
collect_micalgs
static QString collect_micalgs(const GpgME::SigningResult &result, GpgME::Protocol proto)
Definition: signemailtask.cpp:223
Kleo::Crypto::SignEMailTask::setInput
void setInput(const boost::shared_ptr< Input > &input)
Definition: signemailtask.cpp:139
Kleo::Crypto::SignEMailTask::protocol
GpgME::Protocol protocol() const
Definition: signemailtask.cpp:170
Kleo::Crypto::Task
Definition: task.h:55
Kleo::Crypto::SignEMailTask::cancel
void cancel()
Definition: signemailtask.cpp:203
kleo_assert.h
Kleo::Crypto::SignEMailTask::~SignEMailTask
~SignEMailTask()
Definition: signemailtask.cpp:137
boost::shared_ptr
Definition: encryptemailcontroller.h:51
d
#define d
Definition: adduseridcommand.cpp:90
Kleo::Crypto::SignEMailTask::setSigners
void setSigners(const std::vector< GpgME::Key > &recipients)
Definition: signemailtask.cpp:151
Kleo::Class::OpenPGP
Definition: classify.h:49
Kleo::Crypto::SignEMailTask
Definition: signemailtask.h:58
Kleo::Class::CMS
Definition: classify.h:48
Kleo::AuditLog::fromJob
static AuditLog fromJob(const Job *)
Definition: auditlog.cpp:45
Kleo::Crypto::SignEMailTask::setClearsign
void setClearsign(bool clear)
Definition: signemailtask.cpp:164
Kleo::Crypto::SignEMailTask::label
QString label() const
Definition: signemailtask.cpp:175
kleo_assert
#define kleo_assert(cond)
Definition: kleo_assert.h:84
Kleo::Crypto::Task::Result
Definition: task.h:117
Kleo::Crypto::SignEMailTask::micAlg
QString micAlg() const
Definition: signemailtask.cpp:253
q
#define q
Definition: adduseridcommand.cpp:91
signemailtask.h
Kleo::Crypto::SignEMailTask::setDetachedSignature
void setDetachedSignature(bool detached)
Definition: signemailtask.cpp:158
Kleo::Crypto::SignEMailTask::SignEMailTask
SignEMailTask(QObject *parent=0)
Definition: signemailtask.cpp:131
Kleo::Crypto::SignEMailTask::setOutput
void setOutput(const boost::shared_ptr< Output > &output)
Definition: signemailtask.cpp:145
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 22:56:42 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

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