You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

276 lines
9.7 KiB

/*
* messagecomposer.cpp
*
* Copyright (c) 2004 Bo Thorsen <bo@sonofthor.dk>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; version 2 of the License
*
* This program 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 Qt library by Trolltech AS, Norway (or with modified versions
* of Qt that use the same license as Qt), 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
* Qt. 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.
*/
#ifndef MESSAGECOMPOSER_H
#define MESSAGECOMPOSER_H
#include "kmmsgpart.h"
#include "keyresolver.h"
#include <QObject>
#include <QList>
#include <QByteArray>
#include <mimelib/mediatyp.h>
#include "kleo/cryptobackend.h"
#include <libkpgp/kpgp.h>
#include <vector>
class KMMessage;
class KMComposeWin;
class MessageComposerJob;
class EncryptMessageJob;
class SetLastMessageAsUnencryptedVersionOfLastButOne;
namespace Kleo {
class KeyResolver;
}
namespace GpgME {
class Key;
}
namespace KPIM {
class Identity;
}
class MessageComposer : public QObject {
Q_OBJECT
friend class ::MessageComposerJob;
friend class ::EncryptMessageJob;
friend class ::SetLastMessageAsUnencryptedVersionOfLastButOne;
public:
class KeyResolver;
MessageComposer( KMComposeWin *win );
~MessageComposer();
/*
Applies the user changes to the message object of the composer
and signs/encrypts the message if activated. Returns false in
case of an error (e.g. if PGP encryption fails).
If backgroundMode is true then no functions which might require
user interaction (like signing/encrypting) are performed
*/
void applyChanges( bool disableCrypto );
QString originalBCC() const { return mBcc; }
void setDisableBreaking( bool b ) { mDisableBreaking = b; }
const QVector<KMMessage*> &composedMessageList() const { return mMessageList; }
bool isPerformingSignOperation() const { return mPerformingSignOperation; }
signals:
void done( bool );
private:
void readFromComposeWin();
void adjustCryptFlags();
bool encryptWithChiasmus( const Kleo::CryptoBackend::Protocol *chiasmus,
const QByteArray &body,
QByteArray &resultData ) const;
void chiasmusEncryptAllAttachments();
void composeChiasmusMessage( KMMessage &theMessage,
Kleo::CryptoMessageFormat format );
// This is the composeMessage method
void composeMessage();
// And these two are the parts that should be run after job completions
void createUnencryptedMessageVersion();
/*
Internal helper function called from applyChanges(void) to allow
processing several messages (encrypted or unencrypted) based on
the same composer content.
That's useful for storing decrypted versions of messages which
were sent in encrypted form. (khz, 2002/06/24)
*/
void composeMessage( KMMessage &theMessage,
bool doSign, bool doEncrypt,
Kleo::CryptoMessageFormat format );
void continueComposeMessage( KMMessage &theMessage, bool doSign,
bool doEncrypt,
Kleo::CryptoMessageFormat format );
/*
Called by composeMessage for inline-openpgp messages
*/
void composeInlineOpenPGPMessage( KMMessage &theMessage,
bool doSign, bool doEncrypt );
/*
Gets the message ready for sending or saving.
This must be done _before_ signing and/or encrypting it.
*/
QByteArray breakLinesAndApplyCodec() const;
/*
Creates a plain text version of a marked up mail for use as the plain
part in a multipart/alternative mail.
*/
QByteArray plainTextFromMarkup( const QString &markupText ) const;
/*
Gets the signature for a message (into mMessage).
To build nice S/MIME objects signing and encoding must be separated.
*/
void pgpSignedMsg( const QByteArray &cText, Kleo::CryptoMessageFormat f );
/*
Gets the encrypted message.
To build nice S/MIME objects signing and encrypting must be separate.
*/
Kpgp::Result pgpEncryptedMsg( QByteArray &rEncryptedBody,
const QByteArray &cText,
const std::vector<GpgME::Key> &encryptionKeys,
Kleo::CryptoMessageFormat f ) const;
/*
Gets the signed & encrypted message.
To build nice S/MIME objects signing and encrypting must be separate.
*/
Kpgp::Result pgpSignedAndEncryptedMsg( QByteArray &rEncryptedBody,
const QByteArray &cText,
const std::vector<GpgME::Key> &signingKeys,
const std::vector<GpgME::Key> &encryptionKeys,
Kleo::CryptoMessageFormat f ) const;
/*
Builds a MIME object (or a flat text resp.) based upon structuring
information returned by a crypto plugin that was called via
pgpSignedMsg() (or pgpEncryptedMsg(), resp.).
NOTE: The c string representation of the MIME object (or the
flat text, resp.) is returned in resultingPart, so just
use this string as body text of the surrounding MIME object.
This string *is* encoded according to contentTEncClear
and thus should be ready for being sent via SMTP.
*/
bool processStructuringInfo( const QString bugURL,
const QString contentDescriptionClear,
const QByteArray contentTypeClear,
const QByteArray contentSubtypeClear,
const QByteArray contentDispClear,
const QByteArray contentTEncClear,
const QByteArray &bodytext,
const QString contentDescriptionCiph,
const QByteArray &ciphertext,
KMMessagePart &resultingPart,
bool signing, Kleo::CryptoMessageFormat format ) const;
void encryptMessage( KMMessage *msg,
const Kleo::KeyResolver::SplitInfo &si,
bool doSign, bool doEncrypt,
KMMessagePart newBodyPart,
Kleo::CryptoMessageFormat format );
void addBodyAndAttachments( KMMessage *msg,
const Kleo::KeyResolver::SplitInfo &si,
bool doSign, bool doEncrypt,
const KMMessagePart &ourFineBodyPart,
Kleo::CryptoMessageFormat format );
private slots:
void slotDoNextJob();
private:
void doNextJob();
void emitDone( bool );
bool determineWhetherToSign( bool doSignCompletely );
bool determineWhetherToEncrypt( bool doEncryptCompletely );
void markAllAttachmentsForSigning( bool sign );
void markAllAttachmentsForEncryption( bool enc );
KMComposeWin *mComposeWin;
MessageComposerJob *mCurrentJob;
KMMessage *mReferenceMessage;
QVector<KMMessage*> mMessageList;
Kleo::KeyResolver *mKeyResolver;
QByteArray mSignCertFingerprint;
struct Attachment {
Attachment( KMMessagePart *p=0, bool s=false, bool e=false )
: part( p ), sign( s ), encrypt( e ) {}
KMMessagePart *part;
bool sign;
bool encrypt;
};
QVector<Attachment> mAttachments;
QString mPGPSigningKey, mSMIMESigningKey;
bool mUseOpportunisticEncryption;
bool mSignBody, mEncryptBody;
bool mSigningRequested, mEncryptionRequested;
bool mDoSign, mDoEncrypt;
unsigned int mAllowedCryptoMessageFormats;
bool mDisableCrypto;
bool mDisableBreaking;
QString mBcc;
QStringList mTo, mCc, mBccList;
bool mDebugComposerCrypto;
bool mAutoCharset;
QByteArray mCharset;
bool mIsRichText;
uint mIdentityUid;
bool mRc; // Set this to false, if something fails during the processes
bool mHoldJobs; // Don't run the next job yet
QByteArray mText; // textual representation of the message text, encoded
unsigned int mLineBreakColumn; // used for line breaking
// These are the variables of the big composeMessage(X,Y,Z) message
KMMessagePart *mNewBodyPart;
QByteArray mSignature;
QByteArray mEncodedBody; // Only needed if signing and/or encrypting
bool mEarlyAddAttachments, mAllAttachmentsAreInBody;
KMMessagePart mOldBodyPart;
int mPreviousBoundaryLevel;
// The boundary is saved for later addition into mp/a body
DwString mSaveBoundary;
QList<MessageComposerJob*> mJobs;
bool mEncryptWithChiasmus;
bool mPerformingSignOperation;
};
#endif /* MESSAGECOMPOSER_H */