diff --git a/libksieve/ksieveui/util/util.cpp b/libksieve/ksieveui/util/util.cpp index 656ab37f0c..47f53a021c 100644 --- a/libksieve/ksieveui/util/util.cpp +++ b/libksieve/ksieveui/util/util.cpp @@ -1,210 +1,244 @@ /******************************************************************************* ** ** Filename : util ** Created on : 03 April, 2005 ** Copyright : (c) 2005 Till Adam ** Email : ** *******************************************************************************/ /******************************************************************************* ** ** 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; either version 2 of the License, or ** (at your option) any later version. ** ** It 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. ** *******************************************************************************/ #include "util.h" #include "pimcommon/util/pimutil.h" #include "imapresourcesettings.h" #include "sieve-vacation.h" #include #include #include #include using namespace KSieveUi; KUrl KSieveUi::Util::findSieveUrlForAccount( const QString &identifier ) { QScopedPointer interface( PimCommon::Util::createImapSettingsInterface(identifier) ); if ( !interface->sieveSupport() ) return KUrl(); if ( interface->sieveReuseConfig() ) { // assemble Sieve url from the settings of the account: KUrl u; u.setScheme( QLatin1String("sieve") ); QString server; QDBusReply reply = interface->imapServer(); if ( reply.isValid() ) { server = reply; server = server.section( QLatin1Char(':'), 0, 0 ); } else { return KUrl(); } u.setHost( server ); u.setUserName( interface->userName() ); QDBusInterface resourceSettings( QLatin1String( "org.freedesktop.Akonadi.Resource." ) + identifier, QLatin1String("/Settings"), QLatin1String("org.kde.Akonadi.Imap.Wallet") ); QString pwd; QDBusReply replyPass = resourceSettings.call( QLatin1String("password") ); if ( replyPass.isValid() ) { pwd = replyPass; } u.setPassword( pwd ); u.setPort( interface->sievePort() ); QString authStr; switch( interface->authentication() ) { case MailTransport::Transport::EnumAuthenticationType::CLEAR: case MailTransport::Transport::EnumAuthenticationType::PLAIN: authStr = QLatin1String("PLAIN"); break; case MailTransport::Transport::EnumAuthenticationType::LOGIN: authStr = QLatin1String("LOGIN"); break; case MailTransport::Transport::EnumAuthenticationType::CRAM_MD5: authStr = QLatin1String("CRAM-MD5"); break; case MailTransport::Transport::EnumAuthenticationType::DIGEST_MD5: authStr = QLatin1String("DIGEST-MD5"); break; case MailTransport::Transport::EnumAuthenticationType::GSSAPI: authStr = QLatin1String("GSSAPI"); break; case MailTransport::Transport::EnumAuthenticationType::ANONYMOUS: authStr = QLatin1String("ANONYMOUS"); break; default: authStr = QLatin1String("PLAIN"); break; } u.addQueryItem( QLatin1String("x-mech"), authStr ); const QString resultSafety = interface->safety(); if ( resultSafety == QLatin1String("None")) u.addQueryItem( QLatin1String("x-allow-unencrypted"), QLatin1String("true") ); u.setFileName( interface->sieveVacationFilename() ); return u; } else { KUrl u( interface->sieveAlternateUrl() ); const QString resultSafety = interface->safety(); + + if (u.protocol().isEmpty() || u.port() < 1) { + kWarning() << "Invalid sieve url " << u; + return KUrl(); + } + if ( u.protocol().toLower() == QLatin1String("sieve") && ( resultSafety == QLatin1String("None") ) && u.queryItem(QLatin1String("x-allow-unencrypted")).isEmpty() ) u.addQueryItem( QLatin1String("x-allow-unencrypted"), QLatin1String("true") ); + if (u.queryItem(QLatin1String("x-mech")).isEmpty()) { + QString authStr; + switch( interface->authentication() ) { + case MailTransport::Transport::EnumAuthenticationType::CLEAR: + case MailTransport::Transport::EnumAuthenticationType::PLAIN: + authStr = QLatin1String("PLAIN"); + break; + case MailTransport::Transport::EnumAuthenticationType::LOGIN: + authStr = QLatin1String("LOGIN"); + break; + case MailTransport::Transport::EnumAuthenticationType::CRAM_MD5: + authStr = QLatin1String("CRAM-MD5"); + break; + case MailTransport::Transport::EnumAuthenticationType::DIGEST_MD5: + authStr = QLatin1String("DIGEST-MD5"); + break; + case MailTransport::Transport::EnumAuthenticationType::GSSAPI: + authStr = QLatin1String("GSSAPI"); + break; + case MailTransport::Transport::EnumAuthenticationType::ANONYMOUS: + authStr = QLatin1String("ANONYMOUS"); + break; + default: + authStr = QLatin1String("PLAIN"); + break; + } + u.addQueryItem( QLatin1String("x-mech"), authStr ); + } const QString resultCustomAuthentication = interface->sieveCustomAuthentification(); if (resultCustomAuthentication == QLatin1String("ImapUserPassword")) { u.setUserName( interface->userName() ); QDBusInterface resourceSettings( QLatin1String( "org.freedesktop.Akonadi.Resource." ) + identifier, QLatin1String("/Settings"), QLatin1String("org.kde.Akonadi.Imap.Wallet") ); QString pwd; QDBusReply replyPass = resourceSettings.call( QLatin1String("password") ); if ( replyPass.isValid() ) { pwd = replyPass; } u.setPassword( pwd ); } else if (resultCustomAuthentication == QLatin1String("CustomUserPassword")) { QDBusInterface resourceSettings( QLatin1String( "org.freedesktop.Akonadi.Resource." ) + identifier, QLatin1String("/Settings"), QLatin1String("org.kde.Akonadi.Imap.Wallet") ); QString pwd; QDBusReply replyPass = resourceSettings.call( QLatin1String("sieveCustomPassword") ); if ( replyPass.isValid() ) { pwd = replyPass; } u.setPassword( pwd ); u.setUserName( interface->sieveCustomUsername() ); } u.setFileName( interface->sieveVacationFilename() ); return u; } } Akonadi::AgentInstance::List KSieveUi::Util::imapAgentInstances() { Akonadi::AgentInstance::List relevantInstances; foreach ( const Akonadi::AgentInstance &instance, Akonadi::AgentManager::self()->instances() ) { if ( instance.type().mimeTypes().contains( KMime::Message::mimeType() ) && instance.type().capabilities().contains( QLatin1String("Resource") ) && !instance.type().capabilities().contains( QLatin1String("Virtual") ) ) { if ( instance.identifier().contains( IMAP_RESOURCE_IDENTIFIER ) || instance.identifier().contains( KOLAB_RESOURCE_IDENTIFIER ) ) relevantInstances << instance; } } return relevantInstances; } bool KSieveUi::Util::checkOutOfOfficeOnStartup() { return VacationSettings::self()->checkOutOfOfficeOnStartup(); } bool KSieveUi::Util::allowOutOfOfficeSettings() { return VacationSettings::self()->allowOutOfOfficeSettings(); } bool Util::hasKep14Support(const QStringList &sieveCapabilities, const QStringList &availableScripts, const QString &activeScript) { const bool hasIncludeCapability = sieveCapabilities.contains(QLatin1String("include")); if (!hasIncludeCapability) { return false; } bool masterIsActive = !activeScript.isEmpty(); if (masterIsActive) { const QString scriptName = activeScript.split(QLatin1Char('.')).first().toLower(); masterIsActive = (scriptName == QLatin1String("master") || scriptName == QLatin1String("user")); } if (!masterIsActive) { return false; } bool hasUserScript = false; foreach(const QString &script, availableScripts) { if (script.isEmpty()) { continue; } const QString name = script.split(QLatin1Char('.')).first().toLower(); if (name == QLatin1String("user")) { hasUserScript = true; break; } } return hasIncludeCapability && masterIsActive && hasUserScript; } bool Util::isKep14ProtectedName(const QString &name) { QString n = name.split(QLatin1Char('.')).first().toLower(); if (n == QLatin1String("master") || n == QLatin1String("user") || n == QLatin1String("management")) { return true; } return false; -} \ No newline at end of file +}