diff --git a/kmcommands.cpp b/kmcommands.cpp index 13cf9bbd4..33856d76a 100644 --- a/kmcommands.cpp +++ b/kmcommands.cpp @@ -1290,19 +1290,22 @@ KMCommand::Result KMBounceCommand::execute() KMPrintCommand::KMPrintCommand( QWidget *parent, - KMMessage *msg, bool htmlOverride, const QTextCodec* codec ) - : KMCommand( parent, msg ), mHtmlOverride( htmlOverride ), mCodec( codec ) + KMMessage *msg, bool htmlOverride, bool htmlLoadExtOverride, + const QTextCodec *codec ) + : KMCommand( parent, msg ), mHtmlOverride( htmlOverride ), + mHtmlLoadExtOverride( htmlLoadExtOverride ), mCodec( codec ) { } KMCommand::Result KMPrintCommand::execute() { KMReaderWin printWin( 0, 0, 0 ); - printWin.setPrinting(TRUE); + printWin.setPrinting( true ); printWin.readConfig(); printWin.setHtmlOverride( mHtmlOverride ); + printWin.setHtmlLoadExtOverride( mHtmlLoadExtOverride ); printWin.setOverrideCodec( mCodec ); - printWin.setMsg(retrievedMessage(), TRUE); + printWin.setMsg( retrievedMessage(), true ); printWin.printMsg(); return OK; diff --git a/kmcommands.h b/kmcommands.h index 245320d89..9d09ac870 100644 --- a/kmcommands.h +++ b/kmcommands.h @@ -513,12 +513,15 @@ class KMPrintCommand : public KMCommand public: KMPrintCommand( QWidget *parent, KMMessage *msg, - bool htmlOverride=false, const QTextCodec *codec = 0 ); + bool htmlOverride=false, + bool htmlLoadExtOverride=false, + const QTextCodec *codec = 0 ); private: virtual Result execute(); bool mHtmlOverride; + bool mHtmlLoadExtOverride; const QTextCodec *mCodec; }; diff --git a/kmmainwidget.cpp b/kmmainwidget.cpp index 540d1fac7..2387e5aa7 100644 --- a/kmmainwidget.cpp +++ b/kmmainwidget.cpp @@ -120,6 +120,7 @@ KMMainWidget::KMMainWidget(QWidget *parent, const char *name, mReaderWindowActive = true; mReaderWindowBelow = true; mFolderHtmlPref = false; + mFolderHtmlLoadExtPref = false; mSystemTray = 0; mDestructed = false; mActionCollection = actionCollection; @@ -239,6 +240,7 @@ void KMMainWidget::readFolderConfig(void) mFolderThreadPref = config->readBoolEntry( "threadMessagesOverride", false ); mFolderThreadSubjPref = config->readBoolEntry( "threadMessagesBySubject", true ); mFolderHtmlPref = config->readBoolEntry( "htmlMailOverride", false ); + mFolderHtmlLoadExtPref = config->readBoolEntry( "htmlLoadExternalOverride", false ); } @@ -253,6 +255,7 @@ void KMMainWidget::writeFolderConfig(void) config->writeEntry( "threadMessagesOverride", mFolderThreadPref ); config->writeEntry( "threadMessagesBySubject", mFolderThreadSubjPref ); config->writeEntry( "htmlMailOverride", mFolderHtmlPref ); + config->writeEntry( "htmlLoadExternalOverride", mFolderHtmlLoadExtPref ); } @@ -292,6 +295,7 @@ void KMMainWidget::readConfig(void) // read "Reader" config options KConfigGroup readerConfig( config, "Reader" ); mHtmlPref = readerConfig.readBoolEntry( "htmlMail", false ); + mHtmlLoadExtPref = readerConfig.readBoolEntry( "htmlLoadExternal", false ); { // area for config group "Geometry" KConfigGroupSaver saver(config, "Geometry"); @@ -1173,6 +1177,30 @@ void KMMainWidget::slotOverrideHtml() } } +//----------------------------------------------------------------------------- +void KMMainWidget::slotOverrideHtmlLoadExt() +{ + if( mHtmlLoadExtPref == mFolderHtmlLoadExtPref ) { + int result = KMessageBox::warningContinueCancel( this, + // the warning text is taken from configuredialog.cpp: + i18n( "Loading external references in html mail will make you more vulnerable to " + "\"spam\" and may increase the likelihood that your system will be " + "compromised by other present and anticipated security exploits." ), + i18n( "Security Warning" ), + i18n( "Load External References" ), + "OverrideHtmlLoadExtWarning", false); + if( result == KMessageBox::Cancel ) { + mPreferHtmlLoadExtAction->setChecked( false ); + return; + } + } + mFolderHtmlLoadExtPref = !mFolderHtmlLoadExtPref; + if (mMsgView) { + mMsgView->setHtmlLoadExtOverride(mFolderHtmlLoadExtPref); + mMsgView->update( true ); + } +} + //----------------------------------------------------------------------------- void KMMainWidget::slotOverrideThread() { @@ -1501,9 +1529,11 @@ void KMMainWidget::slotCopyMsg() void KMMainWidget::slotPrintMsg() { bool htmlOverride = mMsgView ? mMsgView->htmlOverride() : false; + bool htmlLoadExtOverride = mMsgView ? mMsgView->htmlLoadExtOverride() : false; KMCommand *command = new KMPrintCommand( this, mHeaders->currentMsg(), - htmlOverride, mCodec ); + htmlOverride, htmlLoadExtOverride, + mCodec ); command->start(); } @@ -1662,7 +1692,10 @@ void KMMainWidget::folderSelected( KMFolder* aFolder, bool forceJumpToUnread ) } readFolderConfig(); if (mMsgView) + { mMsgView->setHtmlOverride(mFolderHtmlPref); + mMsgView->setHtmlLoadExtOverride(mFolderHtmlLoadExtPref); + } mHeaders->setFolder( mFolder, forceJumpToUnread ); updateMessageActions(); updateFolderMenu(); @@ -1694,6 +1727,7 @@ void KMMainWidget::slotMsgSelected(KMMessage *msg) } // reset HTML override to the folder setting mMsgView->setHtmlOverride(mFolderHtmlPref); + mMsgView->setHtmlLoadExtOverride(mFolderHtmlLoadExtPref); } //----------------------------------------------------------------------------- @@ -1981,7 +2015,7 @@ void KMMainWidget::slotMsgActivated(KMMessage *msg) } assert( msg != 0 ); - KMReaderMainWin *win = new KMReaderMainWin( mFolderHtmlPref ); + KMReaderMainWin *win = new KMReaderMainWin( mFolderHtmlPref, mFolderHtmlLoadExtPref ); KMMessage *newMessage = new KMMessage(*msg); newMessage->setParent( msg->parent() ); newMessage->setMsgSerNum( msg->getMsgSerNum() ); @@ -2228,6 +2262,9 @@ void KMMainWidget::setupActions() mPreferHtmlAction = new KToggleAction( i18n("Prefer &HTML to Plain Text"), 0, this, SLOT(slotOverrideHtml()), actionCollection(), "prefer_html" ); + mPreferHtmlLoadExtAction = new KToggleAction( i18n("Load e&xternal references"), 0, this, + SLOT(slotOverrideHtmlLoadExt()), actionCollection(), "prefer_html_external_refs" ); + mThreadMessagesAction = new KToggleAction( i18n("&Thread Messages"), 0, this, SLOT(slotOverrideThread()), actionCollection(), "thread_messages" ); @@ -2939,9 +2976,11 @@ void KMMainWidget::updateFolderMenu() mExpireFolderAction->setEnabled( mFolder && mFolder->isAutoExpire() ); updateMarkAsReadAction(); mPreferHtmlAction->setEnabled( mFolder ? true : false ); + mPreferHtmlLoadExtAction->setEnabled( mFolder && (mHtmlPref ? !mFolderHtmlPref : mFolderHtmlPref) ? true : false ); mThreadMessagesAction->setEnabled( mFolder ? true : false ); mPreferHtmlAction->setChecked( mHtmlPref ? !mFolderHtmlPref : mFolderHtmlPref ); + mPreferHtmlLoadExtAction->setChecked( mHtmlLoadExtPref ? !mFolderHtmlLoadExtPref : mFolderHtmlLoadExtPref ); mThreadMessagesAction->setChecked( mThreadPref ? !mFolderThreadPref : mFolderThreadPref ); mThreadBySubjectAction->setEnabled( diff --git a/kmmainwidget.h b/kmmainwidget.h index 9bc1ece1f..8d4badf55 100644 --- a/kmmainwidget.h +++ b/kmmainwidget.h @@ -243,6 +243,7 @@ protected slots: void slotRefreshFolder(); void slotCompactAll(); void slotOverrideHtml(); + void slotOverrideHtmlLoadExt(); void slotOverrideThread(); void slotToggleSubjectThreading(); void slotMessageQueuedOrDrafted(); @@ -445,7 +446,8 @@ private: bool mStartupDone; KMMenuToFolder mMenuToFolder; int copyId, moveId, htmlId, threadId; - bool mHtmlPref, mThreadPref, mFolderHtmlPref, mFolderThreadPref, + bool mHtmlPref, mHtmlLoadExtPref, mThreadPref, + mFolderHtmlPref, mFolderHtmlLoadExtPref, mFolderThreadPref, mFolderThreadSubjPref, mReaderWindowActive, mReaderWindowBelow; // QPopupMenu *mMessageMenu; @@ -454,7 +456,7 @@ private: KAction *mModifyFolderAction, *mRemoveFolderAction, *mExpireFolderAction, *mCompactFolderAction, *mRefreshFolderAction, *mEmptyFolderAction, *mMarkAllAsReadAction; - KToggleAction *mPreferHtmlAction, *mThreadMessagesAction; + KToggleAction *mPreferHtmlAction, *mPreferHtmlLoadExtAction, *mThreadMessagesAction; KToggleAction *mThreadBySubjectAction; KToggleAction *mFolderAction, *mHeaderAction, *mMimeAction; diff --git a/kmmainwin.rc b/kmmainwin.rc index a39ebc80a..e39601fe3 100644 --- a/kmmainwin.rc +++ b/kmmainwin.rc @@ -1,5 +1,5 @@ - + &File @@ -77,6 +77,7 @@ + diff --git a/kmreadermainwin.cpp b/kmreadermainwin.cpp index 2d861d509..e03491f88 100644 --- a/kmreadermainwin.cpp +++ b/kmreadermainwin.cpp @@ -30,7 +30,8 @@ #include "kmreadermainwin.h" -KMReaderMainWin::KMReaderMainWin( bool htmlOverride, char *name ) +KMReaderMainWin::KMReaderMainWin( bool htmlOverride, bool htmlLoadExtOverride, + char *name ) : KMail::SecondaryWindow( name ? name : "readerwindow#" ), mMsg( 0 ) { @@ -38,6 +39,7 @@ KMReaderMainWin::KMReaderMainWin( bool htmlOverride, char *name ) //mReaderWin->setShowCompleteMessage( true ); mReaderWin->setAutoDelete( true ); mReaderWin->setHtmlOverride( htmlOverride ); + mReaderWin->setHtmlLoadExtOverride( htmlLoadExtOverride ); initKMReaderMainWin(); } @@ -98,7 +100,8 @@ void KMReaderMainWin::showMsg( const QTextCodec *codec, KMMessage *msg ) void KMReaderMainWin::slotPrintMsg() { KMCommand *command = new KMPrintCommand( this, mReaderWin->message(), - mReaderWin->htmlOverride(), mReaderWin->overrideCodec() ); + mReaderWin->htmlOverride(), mReaderWin->htmlLoadExtOverride(), + mReaderWin->overrideCodec() ); command->start(); } diff --git a/kmreadermainwin.h b/kmreadermainwin.h index 04f92c214..de5d1f0fb 100644 --- a/kmreadermainwin.h +++ b/kmreadermainwin.h @@ -21,7 +21,7 @@ class KMReaderMainWin : public KMail::SecondaryWindow Q_OBJECT public: - KMReaderMainWin( bool htmlOverride, char *name = 0 ); + KMReaderMainWin( bool htmlOverride, bool htmlLoadExtOverride, char *name = 0 ); KMReaderMainWin( char *name = 0 ); KMReaderMainWin(KMMessagePart* aMsgPart, bool aHTML, const QString& aFileName, const QString& pname, diff --git a/kmreaderwin.cpp b/kmreaderwin.cpp index fc2445d1d..570d24720 100644 --- a/kmreaderwin.cpp +++ b/kmreaderwin.cpp @@ -510,6 +510,7 @@ KMReaderWin::KMReaderWin(QWidget *aParent, readConfig(); mHtmlOverride = false; + mHtmlLoadExtOverride = false; connect( &updateReaderWinTimer, SIGNAL(timeout()), this, SLOT(updateReaderWin()) ); @@ -862,6 +863,7 @@ void KMReaderWin::readConfig(void) mToggleFixFontAction->setChecked( mUseFixedFont ); mHtmlMail = reader.readBoolEntry( "htmlMail", false ); + mHtmlLoadExternal = reader.readBoolEntry( "htmlLoadExternal", false ); setHeaderStyleAndStrategy( HeaderStyle::create( reader.readEntry( "header-style", "fancy" ) ), HeaderStrategy::create( reader.readEntry( "header-set-displayed", "rich" ) ) ); @@ -874,8 +876,6 @@ void KMReaderWin::readConfig(void) assert( raction ); raction->setChecked( true ); - mViewer->setOnlyLocalReferences( !reader.readBoolEntry( "htmlLoadExternal", false ) ); - // if the user uses OpenPGP then the color bar defaults to enabled // else it defaults to disabled mShowColorbar = reader.readBoolEntry( "showColorbar", Kpgp::Module::getKpgp()->usePGP() ); @@ -1235,6 +1235,8 @@ void KMReaderWin::updateReaderWin() { if (!mMsgDisplay) return; + mViewer->setOnlyLocalReferences(!htmlLoadExternal()); + htmlWriter()->reset(); KMFolder* folder; @@ -2228,6 +2230,15 @@ void KMReaderWin::setHtmlOverride(bool override) } +//----------------------------------------------------------------------------- +void KMReaderWin::setHtmlLoadExtOverride(bool override) +{ + mHtmlLoadExtOverride = override; + //if (message()) + // message()->setDecodeHTML(htmlMail()); +} + + //----------------------------------------------------------------------------- bool KMReaderWin::htmlMail() { @@ -2235,6 +2246,14 @@ bool KMReaderWin::htmlMail() } +//----------------------------------------------------------------------------- +bool KMReaderWin::htmlLoadExternal() +{ + return ((mHtmlLoadExternal && !mHtmlLoadExtOverride) || + (!mHtmlLoadExternal && mHtmlLoadExtOverride)); +} + + //----------------------------------------------------------------------------- void KMReaderWin::update( bool force ) { diff --git a/kmreaderwin.h b/kmreaderwin.h index 259e48913..c360316bd 100644 --- a/kmreaderwin.h +++ b/kmreaderwin.h @@ -171,9 +171,16 @@ public: bool htmlOverride() const { return mHtmlOverride; } void setHtmlOverride( bool override ); + /** Override default load external references setting */ + bool htmlLoadExtOverride() const { return mHtmlLoadExtOverride; } + void setHtmlLoadExtOverride( bool override ); + /** Is html mail to be supported? Takes into account override */ bool htmlMail(); + /** Is loading ext. references to be supported? Takes into account override */ + bool htmlLoadExternal(); + /** Returns the MD5 hash for the list of new features */ static QString newFeaturesMD5(); @@ -411,7 +418,7 @@ private: private: - bool mHtmlMail, mHtmlOverride; + bool mHtmlMail, mHtmlLoadExternal, mHtmlOverride, mHtmlLoadExtOverride; int mAtmCurrent; QString mAtmCurrentName; KMMessage *mMessage; diff --git a/objecttreeparser.cpp b/objecttreeparser.cpp index cecdfff82..e18188383 100644 --- a/objecttreeparser.cpp +++ b/objecttreeparser.cpp @@ -778,6 +778,16 @@ bool ObjectTreeParser::okDecryptMIME( partNode& data, if ( 0 <= i ) cstr.truncate(i); } // ---Sven's strip and from end of attachment end- + if ( !mReader->htmlLoadExternal() ) { + htmlWriter()->queue( "
\n" ); + htmlWriter()->queue( i18n("Note: This HTML message may contain external " + "references to images etc. For security/privacy reasons " + "external references are not loaded. If you trust the " + "sender of this message then you can load the external " + "references for this message " + "by clicking here.") ); + htmlWriter()->queue( "


" ); + } } else { htmlWriter()->queue( "
\n" ); htmlWriter()->queue( i18n("Note: This is an HTML message. For " diff --git a/urlhandlermanager.cpp b/urlhandlermanager.cpp index b5fdb33c5..5a77929e1 100644 --- a/urlhandlermanager.cpp +++ b/urlhandlermanager.cpp @@ -325,14 +325,19 @@ QString KMail::URLHandlerManager::statusBarMessage( const KURL & url, KMReaderWi namespace { bool ShowHtmlSwitchURLHandler::handleClick( const KURL & url, KMReaderWin * w ) const { - if ( url.protocol() == "kmail" ) - { - if ( url.path() == "showHTML" ) - { - if ( w ) { - w->setHtmlOverride( !w->htmlOverride() ); - w->update( true ); - } + if ( url.protocol() == "kmail" ) { + if ( !w ) + return false; + + if ( url.path() == "showHTML" ) { + w->setHtmlOverride( !w->htmlOverride() ); + w->update( true ); + return true; + } + + if ( url.path() == "loadExternal" ) { + w->setHtmlLoadExtOverride( !w->htmlLoadExtOverride() ); + w->update( true ); return true; } // if ( url.path() == "startIMApp" ) @@ -346,9 +351,11 @@ namespace { } QString ShowHtmlSwitchURLHandler::statusBarMessage( const KURL & url, KMReaderWin * ) const { - return url.url() == "kmail:showHTML" - ? i18n("Turn on HTML rendering for this message.") - : QString::null ; + if ( url.url() == "kmail:showHTML" ) + return i18n("Turn on HTML rendering for this message."); + if ( url.url() == "kmail:loadExternal" ) + return i18n("Load external references from the Internet for this message."); + return QString::null ; } }