Patch by Ingo Heeskens implementing a per folder option for loading

external references in html mails and a link to enable them for a single
mail, if they are disabled for the folder and globally. Thanks a lot, Ingo,
many people have been asking for this. :)

FEATURE: 34857
GUI:

svn path=/trunk/kdepim/; revision=365026
wilder-work
Till Adam 22 years ago
parent 402704f24b
commit 4dff97c406
  1. 11
      kmcommands.cpp
  2. 5
      kmcommands.h
  3. 43
      kmmainwidget.cpp
  4. 6
      kmmainwidget.h
  5. 3
      kmmainwin.rc
  6. 7
      kmreadermainwin.cpp
  7. 2
      kmreadermainwin.h
  8. 23
      kmreaderwin.cpp
  9. 9
      kmreaderwin.h
  10. 10
      objecttreeparser.cpp
  11. 29
      urlhandlermanager.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;

@ -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;
};

@ -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(

@ -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;

@ -1,5 +1,5 @@
<!DOCTYPE kpartgui>
<kpartgui version="79" name="kmmainwin" >
<kpartgui version="80" name="kmmainwin" >
<MenuBar>
<Menu noMerge="1" name="file" >
<text>&amp;File</text>
@ -77,6 +77,7 @@
<Action name="delete_folder" />
<Separator/>
<Action name="prefer_html" />
<Action name="prefer_html_external_refs" />
<Action name="thread_messages" />
<Action name="thread_messages_by_subject" />
<Separator/>

@ -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();
}

@ -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,

@ -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 )
{

@ -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;

@ -778,6 +778,16 @@ bool ObjectTreeParser::okDecryptMIME( partNode& data,
if ( 0 <= i ) cstr.truncate(i);
}
// ---Sven's strip </BODY> and </HTML> from end of attachment end-
if ( !mReader->htmlLoadExternal() ) {
htmlWriter()->queue( "<div class=\"htmlWarn\">\n" );
htmlWriter()->queue( i18n("<b>Note:</b> 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 "
"<a href=\"kmail:loadExternal\">by clicking here</a>.") );
htmlWriter()->queue( "</div><br><br>" );
}
} else {
htmlWriter()->queue( "<div class=\"htmlWarn\">\n" );
htmlWriter()->queue( i18n("<b>Note:</b> This is an HTML message. For "

@ -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 ;
}
}

Loading…
Cancel
Save