|
|
|
/* -*- mode: C++; c-file-style: "gnu" -*-
|
|
|
|
objecttreeparser_p.cpp
|
|
|
|
|
|
|
|
This file is part of KMail, the KDE mail client.
|
|
|
|
Copyright (c) 2009 Klarälvdalens Datakonsult AB
|
|
|
|
Authors: Marc Mutz <marc@kdab.net>
|
|
|
|
|
|
|
|
KMail is free software; you can redistribute it and/or modify it
|
|
|
|
under the terms of the GNU General Public License, version 2, as
|
|
|
|
published by the Free Software Foundation.
|
|
|
|
|
|
|
|
KMail is distributed in the hope that it will be useful, but
|
|
|
|
WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
|
|
along with this program; if not, write to the Free Software
|
|
|
|
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
|
|
|
|
|
|
In addition, as a special exception, the copyright holders give
|
|
|
|
permission to link the code of this program with any edition of
|
|
|
|
the TQt library by Trolltech AS, Norway (or with modified versions
|
|
|
|
of TQt that use the same license as TQt), and distribute linked
|
|
|
|
combinations including the two. You must obey the GNU General
|
|
|
|
Public License in all respects for all of the code used other than
|
|
|
|
TQt. If you modify this file, you may extend this exception to
|
|
|
|
your version of the file, but you are not obligated to do so. If
|
|
|
|
you do not wish to do so, delete this exception statement from
|
|
|
|
your version.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <config.h>
|
|
|
|
|
|
|
|
#include "objecttreeparser_p.h"
|
|
|
|
|
|
|
|
#include <kleo/decryptverifyjob.h>
|
|
|
|
#include <kleo/verifydetachedjob.h>
|
|
|
|
#include <kleo/verifyopaquejob.h>
|
|
|
|
#include <kleo/keylistjob.h>
|
|
|
|
|
|
|
|
#include <gpgmepp/keylistresult.h>
|
|
|
|
|
|
|
|
#include <tqtimer.h>
|
|
|
|
#include <tqstringlist.h>
|
|
|
|
|
|
|
|
#include <cassert>
|
|
|
|
|
|
|
|
using namespace KMail;
|
|
|
|
using namespace Kleo;
|
|
|
|
using namespace GpgME;
|
|
|
|
|
|
|
|
CryptoBodyPartMemento::CryptoBodyPartMemento()
|
|
|
|
: TQObject( 0 ),
|
|
|
|
Interface::BodyPartMemento(),
|
|
|
|
ISubject(),
|
|
|
|
m_running( false )
|
|
|
|
{
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
CryptoBodyPartMemento::~CryptoBodyPartMemento() {}
|
|
|
|
|
|
|
|
void CryptoBodyPartMemento::setAuditLog( const GpgME::Error & err, const TQString & log ) {
|
|
|
|
m_auditLogError = err;
|
|
|
|
m_auditLog = log;
|
|
|
|
}
|
|
|
|
|
|
|
|
void CryptoBodyPartMemento::setRunning( bool running ) {
|
|
|
|
m_running = running;
|
|
|
|
}
|
|
|
|
|
|
|
|
DecryptVerifyBodyPartMemento::DecryptVerifyBodyPartMemento( DecryptVerifyJob * job, const TQByteArray & cipherText )
|
|
|
|
: CryptoBodyPartMemento(),
|
|
|
|
m_cipherText( cipherText ),
|
|
|
|
m_job( job )
|
|
|
|
{
|
|
|
|
assert( m_job );
|
|
|
|
}
|
|
|
|
|
|
|
|
DecryptVerifyBodyPartMemento::~DecryptVerifyBodyPartMemento() {
|
|
|
|
if ( m_job )
|
|
|
|
m_job->slotCancel();
|
|
|
|
}
|
|
|
|
|
|
|
|
bool DecryptVerifyBodyPartMemento::start() {
|
|
|
|
assert( m_job );
|
|
|
|
if ( const GpgME::Error err = m_job->start( m_cipherText ) ) {
|
|
|
|
m_dr = DecryptionResult( err );
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
connect( m_job, TQT_SIGNAL(result(const GpgME::DecryptionResult&,const GpgME::VerificationResult&,const TQByteArray&)),
|
|
|
|
this, TQT_SLOT(slotResult(const GpgME::DecryptionResult&,const GpgME::VerificationResult&,const TQByteArray&)) );
|
|
|
|
setRunning( true );
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
void DecryptVerifyBodyPartMemento::exec() {
|
|
|
|
assert( m_job );
|
|
|
|
TQByteArray plainText;
|
|
|
|
setRunning( true );
|
|
|
|
const std::pair<DecryptionResult,VerificationResult> p = m_job->exec( m_cipherText, plainText );
|
|
|
|
saveResult( p.first, p.second, plainText );
|
|
|
|
m_job->deleteLater(); // exec'ed jobs don't delete themselves
|
|
|
|
m_job = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void DecryptVerifyBodyPartMemento::saveResult( const DecryptionResult & dr,
|
|
|
|
const VerificationResult & vr,
|
|
|
|
const TQByteArray & plainText )
|
|
|
|
{
|
|
|
|
assert( m_job );
|
|
|
|
setRunning( false );
|
|
|
|
m_dr = dr;
|
|
|
|
m_vr = vr;
|
|
|
|
m_plainText = plainText;
|
|
|
|
setAuditLog( m_job->auditLogError(), m_job->auditLogAsHtml() );
|
|
|
|
}
|
|
|
|
|
|
|
|
void DecryptVerifyBodyPartMemento::slotResult( const DecryptionResult & dr,
|
|
|
|
const VerificationResult & vr,
|
|
|
|
const TQByteArray & plainText )
|
|
|
|
{
|
|
|
|
saveResult( dr, vr, plainText );
|
|
|
|
m_job = 0;
|
|
|
|
notify();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
VerifyDetachedBodyPartMemento::VerifyDetachedBodyPartMemento( VerifyDetachedJob * job,
|
|
|
|
KeyListJob * klj,
|
|
|
|
const TQByteArray & signature,
|
|
|
|
const TQByteArray & plainText )
|
|
|
|
: CryptoBodyPartMemento(),
|
|
|
|
m_signature( signature ),
|
|
|
|
m_plainText( plainText ),
|
|
|
|
m_job( job ),
|
|
|
|
m_keylistjob( klj )
|
|
|
|
{
|
|
|
|
assert( m_job );
|
|
|
|
}
|
|
|
|
|
|
|
|
VerifyDetachedBodyPartMemento::~VerifyDetachedBodyPartMemento() {
|
|
|
|
if ( m_job )
|
|
|
|
m_job->slotCancel();
|
|
|
|
if ( m_keylistjob )
|
|
|
|
m_keylistjob->slotCancel();
|
|
|
|
}
|
|
|
|
|
|
|
|
bool VerifyDetachedBodyPartMemento::start() {
|
|
|
|
assert( m_job );
|
|
|
|
if ( const GpgME::Error err = m_job->start( m_signature, m_plainText ) ) {
|
|
|
|
m_vr = VerificationResult( err );
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
connect( m_job, TQT_SIGNAL(result(const GpgME::VerificationResult&)),
|
|
|
|
this, TQT_SLOT(slotResult(const GpgME::VerificationResult&)) );
|
|
|
|
setRunning( true );
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
void VerifyDetachedBodyPartMemento::exec() {
|
|
|
|
assert( m_job );
|
|
|
|
setRunning( true );
|
|
|
|
saveResult( m_job->exec( m_signature, m_plainText ) );
|
|
|
|
m_job->deleteLater(); // exec'ed jobs don't delete themselves
|
|
|
|
m_job = 0;
|
|
|
|
if ( canStartKeyListJob() ) {
|
|
|
|
std::vector<GpgME::Key> keys;
|
|
|
|
m_keylistjob->exec( keyListPattern(), /*secretOnly=*/false, keys );
|
|
|
|
if ( !keys.empty() )
|
|
|
|
m_key = keys.back();
|
|
|
|
}
|
|
|
|
if ( m_keylistjob )
|
|
|
|
m_keylistjob->deleteLater(); // exec'ed jobs don't delete themselves
|
|
|
|
m_keylistjob = 0;
|
|
|
|
setRunning( false );
|
|
|
|
}
|
|
|
|
|
|
|
|
bool VerifyDetachedBodyPartMemento::canStartKeyListJob() const
|
|
|
|
{
|
|
|
|
if ( !m_keylistjob )
|
|
|
|
return false;
|
|
|
|
const char * const fpr = m_vr.signature( 0 ).fingerprint();
|
|
|
|
return fpr && *fpr;
|
|
|
|
}
|
|
|
|
|
|
|
|
TQStringList VerifyDetachedBodyPartMemento::keyListPattern() const
|
|
|
|
{
|
|
|
|
assert( canStartKeyListJob() );
|
|
|
|
return TQStringList( TQString::tqfromLatin1( m_vr.signature( 0 ).fingerprint() ) );
|
|
|
|
}
|
|
|
|
|
|
|
|
void VerifyDetachedBodyPartMemento::saveResult( const VerificationResult & vr )
|
|
|
|
{
|
|
|
|
assert( m_job );
|
|
|
|
m_vr = vr;
|
|
|
|
setAuditLog( m_job->auditLogError(), m_job->auditLogAsHtml() );
|
|
|
|
}
|
|
|
|
|
|
|
|
void VerifyDetachedBodyPartMemento::slotResult( const VerificationResult & vr )
|
|
|
|
{
|
|
|
|
saveResult( vr );
|
|
|
|
m_job = 0;
|
|
|
|
if ( canStartKeyListJob() && startKeyListJob() )
|
|
|
|
return;
|
|
|
|
if ( m_keylistjob )
|
|
|
|
m_keylistjob->deleteLater();
|
|
|
|
m_keylistjob = 0;
|
|
|
|
setRunning( false );
|
|
|
|
notify();
|
|
|
|
}
|
|
|
|
|
|
|
|
bool VerifyDetachedBodyPartMemento::startKeyListJob()
|
|
|
|
{
|
|
|
|
assert( canStartKeyListJob() );
|
|
|
|
if ( const GpgME::Error err = m_keylistjob->start( keyListPattern() ) )
|
|
|
|
return false;
|
|
|
|
connect( m_keylistjob, TQT_SIGNAL(done()), this, TQT_SLOT(slotKeyListJobDone()) );
|
|
|
|
connect( m_keylistjob, TQT_SIGNAL(nextKey(const GpgME::Key&)),
|
|
|
|
this, TQT_SLOT(slotNextKey(const GpgME::Key&)) );
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
void VerifyDetachedBodyPartMemento::slotNextKey( const GpgME::Key & key )
|
|
|
|
{
|
|
|
|
m_key = key;
|
|
|
|
}
|
|
|
|
|
|
|
|
void VerifyDetachedBodyPartMemento::slotKeyListJobDone()
|
|
|
|
{
|
|
|
|
m_keylistjob = 0;
|
|
|
|
setRunning( false );
|
|
|
|
notify();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
VerifyOpaqueBodyPartMemento::VerifyOpaqueBodyPartMemento( VerifyOpaqueJob * job,
|
|
|
|
KeyListJob * klj,
|
|
|
|
const TQByteArray & signature )
|
|
|
|
: CryptoBodyPartMemento(),
|
|
|
|
m_signature( signature ),
|
|
|
|
m_job( job ),
|
|
|
|
m_keylistjob( klj )
|
|
|
|
{
|
|
|
|
assert( m_job );
|
|
|
|
}
|
|
|
|
|
|
|
|
VerifyOpaqueBodyPartMemento::~VerifyOpaqueBodyPartMemento() {
|
|
|
|
if ( m_job )
|
|
|
|
m_job->slotCancel();
|
|
|
|
if ( m_keylistjob )
|
|
|
|
m_keylistjob->slotCancel();
|
|
|
|
}
|
|
|
|
|
|
|
|
bool VerifyOpaqueBodyPartMemento::start() {
|
|
|
|
assert( m_job );
|
|
|
|
if ( const GpgME::Error err = m_job->start( m_signature ) ) {
|
|
|
|
m_vr = VerificationResult( err );
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
connect( m_job, TQT_SIGNAL(result(const GpgME::VerificationResult&,const TQByteArray&)),
|
|
|
|
this, TQT_SLOT(slotResult(const GpgME::VerificationResult&,const TQByteArray&)) );
|
|
|
|
setRunning( true );
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
void VerifyOpaqueBodyPartMemento::exec() {
|
|
|
|
assert( m_job );
|
|
|
|
setRunning( true );
|
|
|
|
TQByteArray plainText;
|
|
|
|
saveResult( m_job->exec( m_signature, plainText ), plainText );
|
|
|
|
m_job->deleteLater(); // exec'ed jobs don't delete themselves
|
|
|
|
m_job = 0;
|
|
|
|
if ( canStartKeyListJob() ) {
|
|
|
|
std::vector<GpgME::Key> keys;
|
|
|
|
m_keylistjob->exec( keyListPattern(), /*secretOnly=*/false, keys );
|
|
|
|
if ( !keys.empty() )
|
|
|
|
m_key = keys.back();
|
|
|
|
}
|
|
|
|
if ( m_keylistjob )
|
|
|
|
m_keylistjob->deleteLater(); // exec'ed jobs don't delete themselves
|
|
|
|
m_keylistjob = 0;
|
|
|
|
setRunning( false );
|
|
|
|
}
|
|
|
|
|
|
|
|
bool VerifyOpaqueBodyPartMemento::canStartKeyListJob() const
|
|
|
|
{
|
|
|
|
if ( !m_keylistjob )
|
|
|
|
return false;
|
|
|
|
const char * const fpr = m_vr.signature( 0 ).fingerprint();
|
|
|
|
return fpr && *fpr;
|
|
|
|
}
|
|
|
|
|
|
|
|
TQStringList VerifyOpaqueBodyPartMemento::keyListPattern() const
|
|
|
|
{
|
|
|
|
assert( canStartKeyListJob() );
|
|
|
|
return TQStringList( TQString::tqfromLatin1( m_vr.signature( 0 ).fingerprint() ) );
|
|
|
|
}
|
|
|
|
|
|
|
|
void VerifyOpaqueBodyPartMemento::saveResult( const VerificationResult & vr,
|
|
|
|
const TQByteArray & plainText )
|
|
|
|
{
|
|
|
|
assert( m_job );
|
|
|
|
m_vr = vr;
|
|
|
|
m_plainText = plainText;
|
|
|
|
setAuditLog( m_job->auditLogError(), m_job->auditLogAsHtml() );
|
|
|
|
}
|
|
|
|
|
|
|
|
void VerifyOpaqueBodyPartMemento::slotResult( const VerificationResult & vr,
|
|
|
|
const TQByteArray & plainText )
|
|
|
|
{
|
|
|
|
saveResult( vr, plainText );
|
|
|
|
m_job = 0;
|
|
|
|
if ( canStartKeyListJob() && startKeyListJob() )
|
|
|
|
return;
|
|
|
|
if ( m_keylistjob )
|
|
|
|
m_keylistjob->deleteLater();
|
|
|
|
m_keylistjob = 0;
|
|
|
|
setRunning( false );
|
|
|
|
notify();
|
|
|
|
}
|
|
|
|
|
|
|
|
bool VerifyOpaqueBodyPartMemento::startKeyListJob()
|
|
|
|
{
|
|
|
|
assert( canStartKeyListJob() );
|
|
|
|
if ( const GpgME::Error err = m_keylistjob->start( keyListPattern() ) )
|
|
|
|
return false;
|
|
|
|
connect( m_keylistjob, TQT_SIGNAL(done()), this, TQT_SLOT(slotKeyListJobDone()) );
|
|
|
|
connect( m_keylistjob, TQT_SIGNAL(nextKey(const GpgME::Key&)),
|
|
|
|
this, TQT_SLOT(slotNextKey(const GpgME::Key&)) );
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
void VerifyOpaqueBodyPartMemento::slotNextKey( const GpgME::Key & key )
|
|
|
|
{
|
|
|
|
m_key = key;
|
|
|
|
}
|
|
|
|
|
|
|
|
void VerifyOpaqueBodyPartMemento::slotKeyListJobDone()
|
|
|
|
{
|
|
|
|
m_keylistjob = 0;
|
|
|
|
setRunning( false );
|
|
|
|
notify();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#include "objecttreeparser_p.moc"
|