mirror of
https://bitbucket.org/smil3y/kde-playground.git
synced 2025-02-24 10:52:52 +00:00
244 lines
12 KiB
C++
244 lines
12 KiB
C++
/*
|
|
Copyright (C) 2009 Klaralvdalens Datakonsult AB, a KDAB Group company, info@kdab.net
|
|
Copyright (c) 2009 Leo Franchi <lfranchi@kde.org>
|
|
|
|
This library is free software; you can redistribute it and/or modify it
|
|
under the terms of the GNU Library General Public License as published by
|
|
the Free Software Foundation; either version 2 of the License, or (at your
|
|
option) any later version.
|
|
|
|
This library 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 Library General Public
|
|
License for more details.
|
|
|
|
You should have received a copy of the GNU Library General Public License
|
|
along with this library; see the file COPYING.LIB. If not, write to the
|
|
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
|
02110-1301, USA.
|
|
*/
|
|
|
|
#include "cryptofunctions.h"
|
|
|
|
#include "testhtmlwriter.h"
|
|
#include "testcsshelper.h"
|
|
|
|
#include <kleo/enum.h>
|
|
#include <kleo/keylistjob.h>
|
|
#include <kleo/cryptobackendfactory.h>
|
|
#include <kmime/kmime_message.h>
|
|
#include <kmime/kmime_content.h>
|
|
|
|
#include <messageviewer/viewer/objecttreeparser.h>
|
|
#include <messageviewer/viewer/objecttreeemptysource.h>
|
|
#include <messageviewer/viewer/csshelper.h>
|
|
|
|
#include <messagecore/helpers/nodehelper.h>
|
|
|
|
#include <KDebug>
|
|
#include <QDir>
|
|
#include <QFile>
|
|
#include <QtTest>
|
|
|
|
#include <stdlib.h>
|
|
#include <gpgme++/keylistresult.h>
|
|
#include <messagecore/tests/util.h>
|
|
|
|
void ComposerTestUtil::verify( bool sign, bool encrypt, KMime::Content* content, QByteArray origContent, Kleo::CryptoMessageFormat f, KMime::Headers::contentEncoding encoding ) {
|
|
if ( sign && encrypt ) {
|
|
verifySignatureAndEncryption( content, origContent, f, false );
|
|
} else if ( sign ) {
|
|
verifySignature( content, origContent, f, encoding );
|
|
} else {
|
|
verifyEncryption( content, origContent, f );
|
|
}
|
|
}
|
|
|
|
void ComposerTestUtil::verifySignature( KMime::Content* content, QByteArray signedContent, Kleo::CryptoMessageFormat f, KMime::Headers::contentEncoding encoding ) {
|
|
kDebug() << "verifySignature";
|
|
// store it in a KMime::Message, that's what OTP needs
|
|
KMime::Message* resultMessage = new KMime::Message;
|
|
resultMessage->setContent( content->encodedContent() );
|
|
resultMessage->parse();
|
|
|
|
// parse the result and make sure it is valid in various ways
|
|
TestHtmlWriter testWriter;
|
|
TestCSSHelper testCSSHelper;
|
|
MessageCore::Test::TestObjectTreeSource testSource( &testWriter, &testCSSHelper );
|
|
MessageViewer::NodeHelper* nh = new MessageViewer::NodeHelper;
|
|
MessageViewer::ObjectTreeParser otp( &testSource, nh );
|
|
MessageViewer::ProcessResult pResult( nh );
|
|
|
|
// ensure the signed part exists and is parseable
|
|
if( f & Kleo::OpenPGPMIMEFormat ) {
|
|
// process the result..
|
|
otp.parseObjectTree( resultMessage );
|
|
|
|
KMime::Content* signedPart = MessageViewer::ObjectTreeParser::findType( resultMessage, "application", "pgp-signature", true, true );
|
|
Q_ASSERT( signedPart );
|
|
QCOMPARE( signedPart->contentTransferEncoding()->encoding(), KMime::Headers::CE7Bit );
|
|
Q_UNUSED( signedPart );
|
|
|
|
//Q_ASSERT( nh->signatureState( resultMessage ) == MessageViewer::KMMsgFullySigned );
|
|
|
|
QCOMPARE( MessageCore::NodeHelper::firstChild( resultMessage )->contentTransferEncoding()->encoding(), encoding );
|
|
} else if( f & Kleo::InlineOpenPGPFormat ) {
|
|
// process the result..
|
|
otp.parseObjectTree( resultMessage );
|
|
QCOMPARE( nh->signatureState( resultMessage ), MessageViewer::KMMsgFullySigned );
|
|
|
|
QCOMPARE( resultMessage->contentTransferEncoding()->encoding(), encoding );
|
|
} else if( f & Kleo::AnySMIME ) {
|
|
if( f & Kleo::SMIMEFormat ) {
|
|
KMime::Content* signedPart = MessageViewer::ObjectTreeParser::findType( resultMessage, "application", "pkcs7-signature", true, true );
|
|
Q_ASSERT( signedPart );
|
|
QCOMPARE( signedPart->contentTransferEncoding()->encoding(), KMime::Headers::CEbase64 );
|
|
QCOMPARE( signedPart->contentType()->mimeType(), QByteArray( "application/pkcs7-signature" ) );
|
|
QCOMPARE( signedPart->contentType()->name(), QString::fromLatin1( "smime.p7s" ) );
|
|
QCOMPARE( signedPart->contentDisposition()->disposition(), KMime::Headers::CDattachment );
|
|
QCOMPARE( signedPart->contentDisposition()->filename(), QString::fromLatin1( "smime.p7s" ) );
|
|
Q_UNUSED( signedPart );
|
|
|
|
QCOMPARE( MessageCore::NodeHelper::firstChild( resultMessage )->contentTransferEncoding()->encoding(), encoding );
|
|
|
|
QCOMPARE( resultMessage->contentType()->mimeType(), QByteArray( "multipart/signed" ) );
|
|
QCOMPARE( resultMessage->contentType()->parameter( QString::fromLatin1( "protocol" ) ), QString::fromLatin1( "application/pkcs7-signature" ) );
|
|
QCOMPARE( resultMessage->contentType()->parameter( QString::fromLatin1( "micalg" ) ), QString::fromLatin1( "sha1" ) );
|
|
|
|
} else if( f & Kleo::SMIMEOpaqueFormat ) {
|
|
KMime::Content* signedPart = MessageViewer::ObjectTreeParser::findType( resultMessage, "application", "pkcs7-mime", true, true );
|
|
Q_ASSERT( signedPart );
|
|
QCOMPARE( signedPart->contentTransferEncoding()->encoding(), KMime::Headers::CEbase64 );
|
|
QCOMPARE( signedPart->contentType()->mimeType(), QByteArray( "application/pkcs7-mime" ) );
|
|
QCOMPARE( signedPart->contentType()->name(), QString::fromLatin1( "smime.p7m" ) );
|
|
QCOMPARE( signedPart->contentType()->parameter( QString::fromLatin1( "smime-type" ) ), QString::fromLatin1( "signed-data" ) );
|
|
QCOMPARE( signedPart->contentDisposition()->disposition(), KMime::Headers::CDattachment );
|
|
QCOMPARE( signedPart->contentDisposition()->filename(), QString::fromLatin1( "smime.p7m" ) );
|
|
Q_UNUSED( signedPart );
|
|
}
|
|
// process the result..
|
|
otp.parseObjectTree( resultMessage );
|
|
|
|
//Q_ASSERT( nh->signatureState( resultMessage ) == MessageViewer::KMMsgFullySigned );
|
|
}
|
|
|
|
// make sure the good sig is of what we think it is
|
|
QCOMPARE( otp.plainTextContent(), QString::fromUtf8( signedContent ) );
|
|
Q_UNUSED( signedContent );
|
|
|
|
}
|
|
|
|
void ComposerTestUtil::verifyEncryption( KMime::Content* content, QByteArray encrContent, Kleo::CryptoMessageFormat f , bool withAttachment)
|
|
{
|
|
// store it in a KMime::Message, that's what OTP needs
|
|
KMime::Message::Ptr resultMessage = KMime::Message::Ptr( new KMime::Message );
|
|
resultMessage->setContent( content->encodedContent() );
|
|
resultMessage->parse();
|
|
|
|
// parse the result and make sure it is valid in various ways
|
|
TestHtmlWriter testWriter;
|
|
TestCSSHelper testCSSHelper;
|
|
MessageCore::Test::TestObjectTreeSource testSource( &testWriter, &testCSSHelper );
|
|
testSource.setAllowDecryption( true );
|
|
MessageViewer::NodeHelper* nh = new MessageViewer::NodeHelper;
|
|
MessageViewer::ObjectTreeParser otp( &testSource, nh );
|
|
MessageViewer::ProcessResult pResult( nh );
|
|
|
|
if( f & Kleo::OpenPGPMIMEFormat ) {
|
|
// ensure the enc part exists and is parseable
|
|
KMime::Content* encPart = MessageViewer::ObjectTreeParser::findType( resultMessage.get(), "application", "pgp-encrypted", true, true );
|
|
Q_ASSERT( encPart );
|
|
Q_UNUSED( encPart );
|
|
|
|
// process the result..
|
|
otp.parseObjectTree( resultMessage.get() );
|
|
QCOMPARE( nh->encryptionState( resultMessage.get() ), MessageViewer::KMMsgFullyEncrypted );
|
|
|
|
} else if( f & Kleo::InlineOpenPGPFormat ) {
|
|
if ( withAttachment ) {
|
|
//Only first MimePart is the encrypted Text
|
|
KMime::Content *cContent = MessageCore::NodeHelper::firstChild( resultMessage.get() );
|
|
resultMessage->setContent( cContent->encodedContent() );
|
|
resultMessage->parse();
|
|
}
|
|
|
|
otp.processTextPlainSubtype( resultMessage.get(), pResult );
|
|
|
|
QCOMPARE( pResult.inlineEncryptionState(), MessageViewer::KMMsgFullyEncrypted );
|
|
|
|
} else if( f & Kleo::AnySMIME) {
|
|
// ensure the enc part exists and is parseable
|
|
KMime::Content* encPart = MessageViewer::ObjectTreeParser::findType( resultMessage.get(), "application", "pkcs7-mime", true, true );
|
|
Q_ASSERT( encPart );
|
|
|
|
QCOMPARE( encPart->contentType()->mimeType(), QByteArray( "application/pkcs7-mime" ) );
|
|
QCOMPARE( encPart->contentType()->name(), QString::fromLatin1( "smime.p7m" ) );
|
|
QCOMPARE( encPart->contentType()->parameter( QString::fromLatin1( "smime-type" ) ), QString::fromLatin1( "enveloped-data" ) );
|
|
QCOMPARE( encPart->contentDisposition()->disposition(), KMime::Headers::CDattachment );
|
|
QCOMPARE( encPart->contentDisposition()->filename(), QString::fromLatin1( "smime.p7m" ) );
|
|
Q_UNUSED( encPart );
|
|
|
|
otp.parseObjectTree( resultMessage.get() );
|
|
QCOMPARE( nh->encryptionState( resultMessage.get() ), MessageViewer::KMMsgFullyEncrypted );
|
|
|
|
}
|
|
QCOMPARE( otp.plainTextContent(), QString::fromUtf8( encrContent ) );
|
|
Q_UNUSED( encrContent );
|
|
}
|
|
|
|
void ComposerTestUtil::verifySignatureAndEncryption( KMime::Content* content, QByteArray origContent, Kleo::CryptoMessageFormat f, bool withAttachment )
|
|
{
|
|
Q_UNUSED( withAttachment );
|
|
// store it in a KMime::Message, that's what OTP needs
|
|
KMime::Message::Ptr resultMessage = KMime::Message::Ptr( new KMime::Message );
|
|
resultMessage->setContent( content->encodedContent() );
|
|
resultMessage->parse();
|
|
|
|
// parse the result and make sure it is valid in various ways
|
|
TestHtmlWriter testWriter;
|
|
TestCSSHelper testCSSHelper;
|
|
MessageCore::Test::TestObjectTreeSource testSource( &testWriter, &testCSSHelper );
|
|
testSource.setAllowDecryption( true );
|
|
MessageViewer::NodeHelper* nh = new MessageViewer::NodeHelper;
|
|
MessageViewer::ObjectTreeParser otp( &testSource, nh );
|
|
MessageViewer::ProcessResult pResult( nh );
|
|
|
|
if( f & Kleo::OpenPGPMIMEFormat ) {
|
|
// ensure the enc part exists and is parseable
|
|
KMime::Content* encPart = MessageViewer::ObjectTreeParser::findType( resultMessage.get(), "application", "pgp-encrypted", true, true );
|
|
Q_ASSERT( encPart );
|
|
Q_UNUSED( encPart );
|
|
otp.parseObjectTree( resultMessage.get() );
|
|
QCOMPARE( nh->encryptionState( resultMessage.get() ), MessageViewer::KMMsgFullyEncrypted );
|
|
|
|
QList< KMime::Content* > extra = nh->extraContents( resultMessage.get() );
|
|
kDebug() << "size:" << extra.size();
|
|
QCOMPARE( extra.size(), 1 );
|
|
QCOMPARE( nh->signatureState( extra[ 0 ] ), MessageViewer::KMMsgFullySigned );
|
|
} else if( f & Kleo::InlineOpenPGPFormat ) {
|
|
otp.processTextPlainSubtype( resultMessage.get(), pResult );
|
|
|
|
QCOMPARE( pResult.inlineEncryptionState(), MessageViewer::KMMsgFullyEncrypted );
|
|
QCOMPARE( pResult.inlineSignatureState(), MessageViewer::KMMsgFullySigned );
|
|
} else if( f & Kleo::AnySMIME ) {
|
|
KMime::Content* encPart = MessageViewer::ObjectTreeParser::findType( resultMessage.get(), "application", "pkcs7-mime", true, true );
|
|
Q_ASSERT( encPart );
|
|
QCOMPARE( encPart->contentType()->mimeType(), QByteArray( "application/pkcs7-mime" ) );
|
|
QCOMPARE( encPart->contentType()->name(), QString::fromLatin1( "smime.p7m" ) );
|
|
QCOMPARE( encPart->contentType()->parameter( QString::fromLatin1( "smime-type" ) ), QString::fromLatin1( "enveloped-data" ) );
|
|
QCOMPARE( encPart->contentDisposition()->disposition(), KMime::Headers::CDattachment );
|
|
QCOMPARE( encPart->contentDisposition()->filename(), QString::fromLatin1( "smime.p7m" ) );
|
|
Q_UNUSED( encPart );
|
|
|
|
otp.parseObjectTree( resultMessage.get() );
|
|
QCOMPARE( nh->encryptionState( resultMessage.get() ), MessageViewer::KMMsgFullyEncrypted );
|
|
|
|
QList< KMime::Content* > extra = nh->extraContents( resultMessage.get() );
|
|
kDebug() << "size:" << extra.size();
|
|
QCOMPARE( extra.size(), 1 );
|
|
QCOMPARE( nh->signatureState( extra[ 0 ] ), MessageViewer::KMMsgFullySigned );
|
|
}
|
|
QCOMPARE( otp.plainTextContent(), QString::fromUtf8( origContent ) );
|
|
Q_UNUSED( origContent );
|
|
}
|
|
|