Git commit 924bc1b385c750aa974fedc1f1519bf0de2100d2 by Montel Laurent. Committed on 05/04/2016 at 05:03. Pushed by mlaurent into branch 'master'.
Remove all M +0 -2 CMakeLists.txt D +0 -1 kioslave/.krazy D +0 -5 kioslave/.reviewboardrc D +0 -51 kioslave/CMakeLists.txt D +0 -9 kioslave/Mainpage.dox D +0 -22 kioslave/cmake/COPYING-CMAKE-SCRIPTS D +0 -53 kioslave/cmake/FindSasl2.cmake D +0 -1 kioslave/docs/CMakeLists.txt D +0 -3 kioslave/docs/sieve/CMakeLists.txt D +0 -30 kioslave/docs/sieve/index.docbook D +0 -2 kioslave/kdepimlibs-kioslave.categories D +0 -4 kioslave/src/CMakeLists.txt D +0 -50 kioslave/src/common.h D +0 -20 kioslave/src/sieve/CMakeLists.txt D +0 -2 kioslave/src/sieve/Messages.sh D +0 -4 kioslave/src/sieve/RFCs D +0 -2 kioslave/src/sieve/sieve-config.h.cmake D +0 -1313 kioslave/src/sieve/sieve.cpp D +0 -145 kioslave/src/sieve/sieve.h D +0 -65 kioslave/src/sieve/sieve.protocol http://commits.kde.org/kdepimlibs/924bc1b385c750aa974fedc1f1519bf0de2100d2 diff --git a/CMakeLists.txt b/CMakeLists.txt index bbe4d7a..e72c988 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -18,7 +18,6 @@ include(SuperBuild.cmake) sb_add_project(akonadi-mime) sb_add_project(akonadi-contact) sb_add_project(akonadi-notes) -sb_add_project(kioslave) sb_end() else(KDEPIMLIBS_SUPERBUILD) enable_testing() @@ -30,7 +29,6 @@ add_definitions(-DQT_NO_CAST_FROM_ASCII -DQT_NO_CAST_TO_ASCII) add_subdirectory(akonadi-mime) add_subdirectory(akonadi-contact) add_subdirectory(akonadi-notes) -add_subdirectory(kioslave) feature_summary(WHAT ALL FATAL_ON_MISSING_REQUIRED_PACKAGES) endif() diff --git a/kioslave/.krazy b/kioslave/.krazy deleted file mode 100644 index 0b16e7f..0000000 --- a/kioslave/.krazy +++ /dev/null @@ -1 +0,0 @@ -SKIP /tests/ diff --git a/kioslave/.reviewboardrc b/kioslave/.reviewboardrc deleted file mode 100644 index 5c1c502..0000000 --- a/kioslave/.reviewboardrc +++ /dev/null @@ -1,5 +0,0 @@ -REVIEWBOARD_URL = "https://git.reviewboard.kde.org" -#REPOSITORY = "git://anongit.kde.org/kioslave" -BRANCH = "master" -TARGET_GROUPS = "kdepimlibs" -TARGET_PEOPLE = "mlaurent" diff --git a/kioslave/CMakeLists.txt b/kioslave/CMakeLists.txt deleted file mode 100644 index ca9f3e4..0000000 --- a/kioslave/CMakeLists.txt +++ /dev/null @@ -1,51 +0,0 @@ -cmake_minimum_required(VERSION 2.8.12) - -project(kioslave) - -# ECM setup -find_package(ECM 5.19.0 CONFIG REQUIRED) -set(CMAKE_MODULE_PATH ${ECM_MODULE_PATH}) - -set(CMAKE_MODULE_PATH ${kioslave_SOURCE_DIR}/cmake ${ECM_MODULE_PATH}) - -include(GenerateExportHeader) -include(ECMGenerateHeaders) -include(ECMGeneratePriFile) -include(ECMPackageConfigHelpers) -include(ECMSetupVersion) -include(FeatureSummary) -include(KDEInstallDirs) -include(KDECMakeSettings) -include(KDEFrameworkCompilerSettings NO_POLICY_SCOPE) -include(ECMQtDeclareLoggingCategory) - -# FIXME: Do we want the same versions in kdepimlibs and kf5? -set(KF5_VERSION "5.19.0") -set(KDEPIMLIBS_VERSION "5.2.40") -set(MBOXLIB_VERSION "5.2.40") -set(LDABLIB_VERSION "5.2.40") -find_package(Sasl2) -set_package_properties(Sasl2 PROPERTIES - DESCRIPTION "The Cyrus-sasl library" - URL "http://www.cyrussasl.org" - TYPE OPTIONAL -) - -find_package(KF5KIO ${KF5_VERSION} CONFIG REQUIRED) -find_package(KF5I18n ${KF5_VERSION} CONFIG REQUIRED) -find_package(KF5DocTools ${KF5_VERSION} CONFIG REQUIRED) -find_package(KF5Ldap ${LDABLIB_VERSION} CONFIG REQUIRED) -find_package(KF5Mbox ${MBOXLIB_VERSION} CONFIG REQUIRED) -find_package(KF5I18n ${KF5_VERSION} CONFIG REQUIRED) -add_definitions("-DQT_NO_CAST_FROM_ASCII -DQT_NO_CAST_TO_ASCII") - - -add_subdirectory(src) -add_subdirectory(docs) - -install( FILES kdepimlibs-kioslave.categories DESTINATION ${KDE_INSTALL_CONFDIR} ) - -if ("${CMAKE_BINARY_DIR}" STREQUAL "${kioslave_BINARY_DIR}") - feature_summary(WHAT ALL FATAL_ON_MISSING_REQUIRED_PACKAGES) -endif() - diff --git a/kioslave/Mainpage.dox b/kioslave/Mainpage.dox deleted file mode 100644 index 24e1ca6..0000000 --- a/kioslave/Mainpage.dox +++ /dev/null @@ -1,9 +0,0 @@ -/** @mainpage -* -* IO Slaves. -* -* KDE PIM contains a few KIOSlaves. The most important -* of these is the IMAP4Protocol slave which is used for IMAP operations. -* Similarly, the MBoxProtocol slave is used to access mbox files. -* -*/ diff --git a/kioslave/cmake/COPYING-CMAKE-SCRIPTS b/kioslave/cmake/COPYING-CMAKE-SCRIPTS deleted file mode 100644 index 4b41776..0000000 --- a/kioslave/cmake/COPYING-CMAKE-SCRIPTS +++ /dev/null @@ -1,22 +0,0 @@ -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - -1. Redistributions of source code must retain the copyright - notice, this list of conditions and the following disclaimer. -2. Redistributions in binary form must reproduce the copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. -3. The name of the author may not be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR -IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/kioslave/cmake/FindSasl2.cmake b/kioslave/cmake/FindSasl2.cmake deleted file mode 100644 index ec3bb81..0000000 --- a/kioslave/cmake/FindSasl2.cmake +++ /dev/null @@ -1,53 +0,0 @@ -# -# - Try to find the sasl2 directory library -# Once done this will define -# -# Sasl2_FOUND - system has SASL2 -# Sasl2_INCLUDE_DIRS - the SASL2 include directory -# Sasl2_LIBRARIES - The libraries needed to use SASL2 - -# Copyright (c) 2006, 2007 Laurent Montel, <[email protected]> -# -# Redistribution and use is allowed according to the terms of the BSD license. -# For details see the accompanying COPYING-CMAKE-SCRIPTS file. - -# Note: libsasl2.pc doesn't export the include dir. -find_package(PkgConfig QUIET) -pkg_check_modules(PC_Sasl2 libsasl2) - -find_path(Sasl2_INCLUDE_DIRS sasl/sasl.h -) - -# libsasl2 add for windows, because the windows package of cyrus-sasl2 -# contains a libsasl2 also for msvc which is not standard conform -find_library(Sasl2_LIBRARIES - NAMES sasl2 libsasl2 - HINTS ${PC_Sasl2_LIBRARY_DIRS} -) - -set(Sasl2_VERSION ${PC_Sasl2_VERSION}) - -if(NOT Sasl2_VERSION) - if(EXISTS ${Sasl2_INCLUDE_DIRS}/sasl/sasl.h) - file(READ ${Sasl2_INCLUDE_DIRS}/sasl/sasl.h SASL2_H_CONTENT) - string(REGEX MATCH "#define SASL_VERSION_MAJOR[ ]+[0-9]+" SASL2_VERSION_MAJOR_MATCH ${SASL2_H_CONTENT}) - string(REGEX MATCH "#define SASL_VERSION_MINOR[ ]+[0-9]+" SASL2_VERSION_MINOR_MATCH ${SASL2_H_CONTENT}) - string(REGEX MATCH "#define SASL_VERSION_STEP[ ]+[0-9]+" SASL2_VERSION_STEP_MATCH ${SASL2_H_CONTENT}) - - string(REGEX REPLACE ".*_MAJOR[ ]+(.*)" "\\1" SASL2_VERSION_MAJOR ${SASL2_VERSION_MAJOR_MATCH}) - string(REGEX REPLACE ".*_MINOR[ ]+(.*)" "\\1" SASL2_VERSION_MINOR ${SASL2_VERSION_MINOR_MATCH}) - string(REGEX REPLACE ".*_STEP[ ]+(.*)" "\\1" SASL2_VERSION_STEP ${SASL2_VERSION_STEP_MATCH}) - - set(Sasl2_VERSION "${SASL2_VERSION_MAJOR}.${SASL2_VERSION_MINOR}.${SASL2_VERSION_STEP}") - endif() -endif() - -include(FindPackageHandleStandardArgs) - -find_package_handle_standard_args(Sasl2 - FOUND_VAR Sasl2_FOUND - REQUIRED_VARS Sasl2_LIBRARIES Sasl2_INCLUDE_DIRS - VERSION_VAR Sasl2_VERSION -) - -mark_as_advanced(Sasl2_LIBRARIES Sasl2_INCLUDE_DIRS Sasl2_VERSION) diff --git a/kioslave/docs/CMakeLists.txt b/kioslave/docs/CMakeLists.txt deleted file mode 100644 index 44813ac..0000000 --- a/kioslave/docs/CMakeLists.txt +++ /dev/null @@ -1 +0,0 @@ -add_subdirectory(sieve) diff --git a/kioslave/docs/sieve/CMakeLists.txt b/kioslave/docs/sieve/CMakeLists.txt deleted file mode 100644 index 98fdda4..0000000 --- a/kioslave/docs/sieve/CMakeLists.txt +++ /dev/null @@ -1,3 +0,0 @@ -########### install files ############### -kdoctools_create_handbook(index.docbook INSTALL_DESTINATION ${KDE_INSTALL_DOCBUNDLEDIR}/en SUBDIR kioslave5/sieve) - diff --git a/kioslave/docs/sieve/index.docbook b/kioslave/docs/sieve/index.docbook deleted file mode 100644 index d269a68..0000000 --- a/kioslave/docs/sieve/index.docbook +++ /dev/null @@ -1,30 +0,0 @@ -<?xml version="1.0" ?> -<!DOCTYPE article PUBLIC "-//KDE//DTD DocBook XML V4.5-Based Variant V1.1//EN" -"dtd/kdedbx45.dtd" [ -<!ENTITY % addindex "IGNORE"> -<!ENTITY % English "INCLUDE" > <!-- change language only here --> -]> - -<article lang="&language;" id="sieve"> -<title>sieve</title> -<articleinfo> - -<authorgroup> -<author><personname><firstname>Daniel</firstname><surname>Black</surname></personname> -<email>[email protected]</email></author> -<!-- TRANS:ROLES_OF_TRANSLATORS --> -</authorgroup> - -<date>2009-11-05</date> - - -</articleinfo> - -<para>Sieve is a protocol that is used to manage filters for email.</para> - -<para>The filters are stored and run on the email server.</para> - -<para><ulink url="http://www.ietf.org/rfc/rfc5228.txt">IETF -RF5228</ulink> provides more information.</para> - -</article> diff --git a/kioslave/kdepimlibs-kioslave.categories b/kioslave/kdepimlibs-kioslave.categories deleted file mode 100644 index 89d1e8f..0000000 --- a/kioslave/kdepimlibs-kioslave.categories +++ /dev/null @@ -1,2 +0,0 @@ -log_sieve kioslave (sieve) - diff --git a/kioslave/src/CMakeLists.txt b/kioslave/src/CMakeLists.txt deleted file mode 100644 index 0ee108d..0000000 --- a/kioslave/src/CMakeLists.txt +++ /dev/null @@ -1,4 +0,0 @@ -#remove it -remove_definitions(-DQT_NO_CAST_FROM_BYTEARRAY) -add_subdirectory(sieve) - diff --git a/kioslave/src/common.h b/kioslave/src/common.h deleted file mode 100644 index acdeb17..0000000 --- a/kioslave/src/common.h +++ /dev/null @@ -1,50 +0,0 @@ -/* This file is part of the KDE project - Copyright (C) 2008 Jarosław Staniek <[email protected]> - - 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. -*/ - -#ifndef _KIOSLAVE_COMMON_H -#define _KIOSLAVE_COMMON_H - -#include <stdio.h> -#include <QFile> -#include <QDir> - -extern "C" { -#include <sasl/sasl.h> -} - -inline bool initSASL() -{ -#ifdef Q_OS_WIN32 //krazy:exclude=cpp - QByteArray libInstallPath(QFile::encodeName(QDir::toNativeSeparators(KGlobal::dirs()->installPath("lib") + QLatin1String("sasl2")))); - QByteArray configPath(QFile::encodeName(QDir::toNativeSeparators(KGlobal::dirs()->installPath("config") + QLatin1String("sasl2")))); - if (sasl_set_path(SASL_PATH_TYPE_PLUGIN, libInstallPath.data()) != SASL_OK || - sasl_set_path(SASL_PATH_TYPE_CONFIG, configPath.data()) != SASL_OK) { - fprintf(stderr, "SASL path initialization failed!\n"); - return false; - } -#endif - - if (sasl_client_init(NULL) != SASL_OK) { - fprintf(stderr, "SASL library initialization failed!\n"); - return false; - } - return true; -} - -#endif diff --git a/kioslave/src/sieve/CMakeLists.txt b/kioslave/src/sieve/CMakeLists.txt deleted file mode 100644 index 5a6efeb..0000000 --- a/kioslave/src/sieve/CMakeLists.txt +++ /dev/null @@ -1,20 +0,0 @@ -configure_file (sieve-config.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/sieve-config.h ) -########### next target ############### - -set(kio_sieve_PART_SRCS sieve.cpp ) - -ecm_qt_declare_logging_category(kio_sieve_PART_SRCS HEADER sieve_debug.h IDENTIFIER SIEVE_LOG CATEGORY_NAME log_sieve) - -add_library(kio_sieve MODULE ${kio_sieve_PART_SRCS}) - - - -target_link_libraries(kio_sieve KF5::KIOCore KF5::I18n Qt5::Network KF5::WidgetsAddons ${Sasl2_LIBRARIES}) -set_target_properties(kio_sieve PROPERTIES OUTPUT_NAME "sieve") - -install(TARGETS kio_sieve DESTINATION ${KDE_INSTALL_PLUGINDIR}/kf5/kio/) - - -########### install files ############### - -install( FILES sieve.protocol DESTINATION ${KDE_INSTALL_KSERVICES5DIR}) diff --git a/kioslave/src/sieve/Messages.sh b/kioslave/src/sieve/Messages.sh deleted file mode 100644 index d5b8d00..0000000 --- a/kioslave/src/sieve/Messages.sh +++ /dev/null @@ -1,2 +0,0 @@ -#! /bin/sh -$XGETTEXT *.cpp -o $podir/kio_sieve.pot diff --git a/kioslave/src/sieve/RFCs b/kioslave/src/sieve/RFCs deleted file mode 100644 index 9f87c4f..0000000 --- a/kioslave/src/sieve/RFCs +++ /dev/null @@ -1,4 +0,0 @@ -3028: Sieve: A Mail Filtering Language -3431: Sieve Extension: Relational Tests - -Documents at http://ktown.kde.org/~dirk/sieve/ diff --git a/kioslave/src/sieve/sieve-config.h.cmake b/kioslave/src/sieve/sieve-config.h.cmake deleted file mode 100644 index e11fa9f..0000000 --- a/kioslave/src/sieve/sieve-config.h.cmake +++ /dev/null @@ -1,2 +0,0 @@ -/* Define if you have cyrus-sasl2 libraries */ -#cmakedefine HAVE_LIBSASL2 1 diff --git a/kioslave/src/sieve/sieve.cpp b/kioslave/src/sieve/sieve.cpp deleted file mode 100644 index 3b8760b..0000000 --- a/kioslave/src/sieve/sieve.cpp +++ /dev/null @@ -1,1313 +0,0 @@ -/*************************************************************************** - sieve.cpp - description - ------------------- - begin : Thu Dec 20 18:47:08 EST 2001 - copyright : (C) 2001 by Hamish Rodda - email : [email protected] - ***************************************************************************/ - -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License version 2 as * - * published by the Free Software Foundation. * - * * - ***************************************************************************/ - -/** - * Portions adapted from the SMTP ioslave. - * Copyright (c) 2000, 2001 Alex Zepeda <[email protected]> - * Copyright (c) 2001 Michael Häckel <[email protected]> - * All rights reserved. - * - * Policy: the function where the error occurs calls error(). A result of - * false, where it signifies an error, thus doesn't need to call error() itself. - */ - -#include "sieve.h" -#include "../common.h" -#include "sieve_debug.h" - -extern "C" { -#include <sasl/sasl.h> -} - -#include <qregexp.h> -#include <QSslSocket> -#include <QUrlQuery> - -#include <KLocalizedString> -#include <QUrl> -#include <KMessageBox> -#include <QApplication> -#include <sys/stat.h> -#include <cassert> - -#define ksDebug qCDebug( SIEVE_LOG ) - -#define SIEVE_DEFAULT_PORT 2000 - -static const sasl_callback_t callbacks[] = { - { SASL_CB_ECHOPROMPT, NULL, NULL }, - { SASL_CB_NOECHOPROMPT, NULL, NULL }, - { SASL_CB_GETREALM, NULL, NULL }, - { SASL_CB_USER, NULL, NULL }, - { SASL_CB_AUTHNAME, NULL, NULL }, - { SASL_CB_PASS, NULL, NULL }, - { SASL_CB_CANON_USER, NULL, NULL }, - { SASL_CB_LIST_END, NULL, NULL } -}; - -static const unsigned int SIEVE_DEFAULT_RECIEVE_BUFFER = 512; - -using namespace KIO; -extern "C" -{ - Q_DECL_EXPORT int kdemain(int argc, char **argv) - { - QApplication app(argc, argv); - app.setApplicationName(QStringLiteral("kio_sieve")); - - ksDebug << "*** Starting kio_sieve " << endl; - - if (argc != 4) { - ksDebug << "Usage: kio_sieve protocol domain-socket1 domain-socket2" << endl; - return -1; - } - - if (!initSASL()) { - ::exit(-1); - } - - kio_sieveProtocol slave(argv[2], argv[3]); - slave.dispatchLoop(); - - sasl_done(); - - ksDebug << "*** kio_sieve Done" << endl; - return 0; - } -} - -/* ---------------------------------------------------------------------------------- */ -kio_sieveResponse::kio_sieveResponse() -{ - clear(); -} - -/* ---------------------------------------------------------------------------------- */ -const uint &kio_sieveResponse::getType() const -{ - return rType; -} - -/* ---------------------------------------------------------------------------------- */ -uint kio_sieveResponse::getQuantity() const -{ - return quantity; -} - -/* ---------------------------------------------------------------------------------- */ -const QByteArray &kio_sieveResponse::getAction() const -{ - return key; -} - -/* ---------------------------------------------------------------------------------- */ -const QByteArray &kio_sieveResponse::getKey() const -{ - return key; -} - -/* ---------------------------------------------------------------------------------- */ -const QByteArray &kio_sieveResponse::getVal() const -{ - return val; -} - -/* ---------------------------------------------------------------------------------- */ -const QByteArray &kio_sieveResponse::getExtra() const -{ - return extra; -} - -/* ---------------------------------------------------------------------------------- */ -void kio_sieveResponse::setQuantity(const uint &newQty) -{ - rType = QUANTITY; - quantity = newQty; -} - -/* ---------------------------------------------------------------------------------- */ -void kio_sieveResponse::setAction(const QByteArray &newAction) -{ - rType = ACTION; - key = newAction; -} - -/* ---------------------------------------------------------------------------------- */ -void kio_sieveResponse::setKey(const QByteArray &newKey) -{ - rType = KEY_VAL_PAIR; - key = newKey; -} - -/* ---------------------------------------------------------------------------------- */ -void kio_sieveResponse::setVal(const QByteArray &newVal) -{ - val = newVal; -} - -/* ---------------------------------------------------------------------------------- */ -void kio_sieveResponse::setExtra(const QByteArray &newExtra) -{ - extra = newExtra; -} - -/* ---------------------------------------------------------------------------------- */ -void kio_sieveResponse::clear() -{ - rType = NONE; - extra = key = val = QByteArray(); - quantity = 0; -} - -/* ---------------------------------------------------------------------------------- */ -kio_sieveProtocol::kio_sieveProtocol(const QByteArray &pool_socket, const QByteArray &app_socket) - : TCPSlaveBase("sieve", pool_socket, app_socket, false) - , m_connMode(NORMAL) - , m_supportsTLS(false) - , m_shouldBeConnected(false) - , m_allowUnencrypted(false) - , m_port(SIEVE_DEFAULT_PORT) -{ -} - -/* ---------------------------------------------------------------------------------- */ -kio_sieveProtocol::~kio_sieveProtocol() -{ - if (isConnected()) { - disconnect(); - } -} - -/* ---------------------------------------------------------------------------------- */ -void kio_sieveProtocol::setHost(const QString &host, quint16 port, const QString &user, const QString &pass) -{ - if (isConnected() && - (m_sServer != host || - m_port != port || - m_sUser != user || - m_sPass != pass)) { - disconnect(); - } - m_sServer = host; - m_port = port ? port : SIEVE_DEFAULT_PORT; - m_sUser = user; - m_sPass = pass; - m_supportsTLS = false; -} - -/* ---------------------------------------------------------------------------------- */ -void kio_sieveProtocol::openConnection() -{ - m_connMode = CONNECTION_ORIENTED; - connect(); -} - -bool kio_sieveProtocol::parseCapabilities(bool requestCapabilities/* = false*/) -{ - ksDebug << endl; - - // Setup... - bool ret = false; - - if (requestCapabilities) { - sendData("CAPABILITY"); - } - - while (receiveData()) { - ksDebug << "Looping receive" << endl; - - if (r.getType() == kio_sieveResponse::ACTION) { - if (r.getAction().toLower().contains("ok")) { - ksDebug << "Sieve server ready & awaiting authentication." << endl; - break; - } else { - ksDebug << "Unknown action " << r.getAction() << "." << endl; - } - - } else if (r.getKey() == "IMPLEMENTATION") { - ksDebug << "Connected to Sieve server: " << r.getVal() << endl; - ret = true; - setMetaData(QStringLiteral("implementation"), QLatin1String(r.getVal())); - m_implementation = QLatin1String(r.getVal()); - - } else if (r.getKey() == "SASL") { - // Save list of available SASL methods - const QString val = QLatin1String(r.getVal()); - m_sasl_caps = val.split(QLatin1Char(' ')); - ksDebug << "Server SASL authentication methods: " << m_sasl_caps.join(QStringLiteral(", ")) << endl; - setMetaData(QStringLiteral("saslMethods"), QLatin1String(r.getVal())); - - } else if (r.getKey() == "SIEVE") { - // Save script capabilities; report back as meta data: - const QString val = QLatin1String(r.getVal()); - ksDebug << "Server script capabilities: " << val.split(QLatin1Char(' ')).join(QStringLiteral(", ")) << endl; - setMetaData(QStringLiteral("sieveExtensions"), QLatin1String(r.getVal())); - - } else if (r.getKey() == "STARTTLS") { - // The server supports TLS - ksDebug << "Server supports TLS" << endl; - m_supportsTLS = true; - setMetaData(QStringLiteral("tlsSupported"), QStringLiteral("true")); - - } else { - ksDebug << "Unrecognised key " << r.getKey() << endl; - } - } - - if (!m_supportsTLS) { - setMetaData(QStringLiteral("tlsSupported"), QStringLiteral("false")); - } - - return ret; -} - -/* ---------------------------------------------------------------------------------- */ -/** - * Checks if connection parameters have changed. - * If it it, close the current connection - */ -void kio_sieveProtocol::changeCheck(const QUrl &url) -{ - QString auth; - - // Check the SASL auth mechanism in the 'sasl' metadata... - if (!metaData(QStringLiteral("sasl")).isEmpty()) { - auth = metaData(QStringLiteral("sasl")).toUpper(); - } else { - // ... and if not found, check the x-mech=AUTH query part of the url. - QString query = url.query(); - if (query.startsWith(QLatin1Char('?'))) { - query.remove(0, 1); - } - QStringList q = query.split(QLatin1Char(',')); - QStringList::iterator it; - - for (it = q.begin(); it != q.end(); ++it) { - if (((*it).section(QLatin1Char('='), 0, 0)).toLower() == QLatin1String("x-mech")) { - auth = ((*it).section(QLatin1Char('='), 1)).toUpper(); - break; - } - } - } - ksDebug << "auth: " << auth << " m_sAuth: " << m_sAuth << endl; - if (m_sAuth != auth) { - m_sAuth = auth; - if (isConnected()) { - disconnect(); - } - } - // For TLS, only disconnect if we are unencrypted and are - // no longer allowed (otherwise, it's still fine): - const bool allowUnencryptedNow = QUrlQuery(url).queryItemValue(QStringLiteral("x-allow-unencrypted")) == QLatin1String("true"); - if (m_allowUnencrypted && !allowUnencryptedNow) { - if (isConnected()) { - disconnect(); - } - } - m_allowUnencrypted = allowUnencryptedNow; -} - -/* ---------------------------------------------------------------------------------- */ -/** - * Connects to the server. - * returns false and calls error() if an error occurred. - */ -bool kio_sieveProtocol::connect(bool useTLSIfAvailable) -{ - ksDebug << endl; - - if (isConnected()) { - return true; - } - - infoMessage(i18n("Connecting to %1...", m_sServer)); - - if (m_connMode == CONNECTION_ORIENTED && m_shouldBeConnected) { - error(ERR_CONNECTION_BROKEN, i18n("The connection to the server was lost.")); - return false; - } - - setBlocking(true); - - if (!connectToHost(QStringLiteral("sieve"), m_sServer, m_port)) { - return false; - } - - if (!parseCapabilities()) { - disconnectFromHost(); - error(ERR_UNSUPPORTED_PROTOCOL, i18n("Server identification failed.")); - return false; - } - - // Attempt to start TLS - if (!m_allowUnencrypted && !QSslSocket::supportsSsl()) { - error(ERR_SLAVE_DEFINED, i18n("Can not use TLS since the underlying Qt library does not support it.")); - disconnect(); - return false; - } - - if (!m_allowUnencrypted && useTLSIfAvailable && QSslSocket::supportsSsl() && !m_supportsTLS && - messageBox(WarningContinueCancel, - i18n("TLS encryption was requested, but your Sieve server does not advertise TLS in its capabilities.\n" - "You can choose to try to initiate TLS negotiations nonetheless, or cancel the operation."), - i18n("Server Does Not Advertise TLS"), i18n("&Start TLS nonetheless"), i18n("&Cancel")) != KMessageBox::Continue) { - error(ERR_USER_CANCELED, i18n("TLS encryption requested, but not supported by server.")); - disconnect(); - return false; - } - - // FIXME find a test server and test that this works - if (useTLSIfAvailable && m_supportsTLS && QSslSocket::supportsSsl()) { - sendData("STARTTLS"); - if (operationSuccessful()) { - ksDebug << "TLS has been accepted. Starting TLS..." << endl - << "WARNING this is untested and may fail."; - if (startSsl()) { - ksDebug << "TLS enabled successfully." << endl; - // reparse capabilities: - parseCapabilities(requestCapabilitiesAfterStartTLS()); - } else { - ksDebug << "TLS initiation failed."; - if (m_allowUnencrypted) { - disconnect(true); - return connect(false); - } - messageBox(Information, i18n("Your Sieve server claims to support TLS, " - "but negotiation was unsuccessful."), - i18n("Connection Failed")); - disconnect(true); - return false; - } - } else if (!m_allowUnencrypted) { - ksDebug << "Server incapable of TLS."; - disconnect(); - error(ERR_SLAVE_DEFINED, i18n("The server does not seem to support TLS. " - "Disable TLS if you want to connect without encryption.")); - return false; - } else { - ksDebug << "Server incapable of TLS. Transmitted documents will be unencrypted." << endl; - } - } else { - ksDebug << "We are incapable of TLS. Transmitted documents will be unencrypted." << endl; - } - - assert(m_allowUnencrypted || isUsingSsl()); - - infoMessage(i18n("Authenticating user...")); - if (!authenticate()) { - disconnect(); - error(ERR_COULD_NOT_AUTHENTICATE, i18n("Authentication failed.")); - return false; - } - - m_shouldBeConnected = true; - return true; -} - -/* ---------------------------------------------------------------------------------- */ -void kio_sieveProtocol::closeConnection() -{ - m_connMode = CONNECTION_ORIENTED; - disconnect(); -} - -/* ---------------------------------------------------------------------------------- */ -void kio_sieveProtocol::disconnect(bool forcibly) -{ - if (!forcibly) { - sendData("LOGOUT"); - - if (!operationSuccessful()) { - ksDebug << "Server did not logout cleanly." << endl; - } - } - - disconnectFromHost(); - m_shouldBeConnected = false; -} - -/* ---------------------------------------------------------------------------------- */ -/*void kio_sieveProtocol::slave_status() -{ - slaveStatus(isConnected() ? m_sServer : "", isConnected()); - - finished(); -}*/ - -/* ---------------------------------------------------------------------------------- */ -void kio_sieveProtocol::special(const QByteArray &data) -{ - int tmp; - QDataStream stream(data); - QUrl url; - - stream >> tmp; - - switch (tmp) { - case 1: - stream >> url; - if (!activate(url)) { - return; - } - break; - case 2: - if (!deactivate()) { - return; - } - break; - case 3: - parseCapabilities(true); - break; - } - - infoMessage(i18nc("special command completed", "Done.")); - - finished(); -} - -/* ---------------------------------------------------------------------------------- */ -bool kio_sieveProtocol::activate(const QUrl &url) -{ - changeCheck(url); - if (!connect()) { - return false; - } - - infoMessage(i18n("Activating script...")); - - QString filename = url.fileName(); - - if (filename.isEmpty()) { - error(ERR_DOES_NOT_EXIST, url.toDisplayString()); - return false; - } - - if (!sendData("SETACTIVE \"" + filename.toUtf8() + "\"")) { - return false; - } - - if (operationSuccessful()) { - ksDebug << "Script activation complete." << endl; - return true; - } else { - error(ERR_INTERNAL_SERVER, i18n("There was an error activating the script.")); - return false; - } -} - -/* ---------------------------------------------------------------------------------- */ -bool kio_sieveProtocol::deactivate() -{ - if (!connect()) { - return false; - } - - if (!sendData("SETACTIVE \"\"")) { - return false; - } - - if (operationSuccessful()) { - ksDebug << "Script deactivation complete." << endl; - return true; - } else { - error(ERR_INTERNAL_SERVER, i18n("There was an error deactivating the script.")); - return false; - } -} - -static void append_lf2crlf(QByteArray &out, const QByteArray &in) -{ - if (in.isEmpty()) { - return; - } - const unsigned int oldOutSize = out.size(); - out.resize(oldOutSize + 2 * in.size()); - const char *s = in.begin(); - const char *const end = in.end(); - char *d = out.begin() + oldOutSize; - char last = '\0'; - while (s < end) { - if (*s == '\n' && last != '\r') { - *d++ = '\r'; - } - *d++ = last = *s++; - } - out.resize(d - out.begin()); -} - -void kio_sieveProtocol::put(const QUrl &url, int /*permissions*/, KIO::JobFlags) -{ - changeCheck(url); - if (!connect()) { - return; - } - - infoMessage(i18n("Sending data...")); - - QString filename = url.fileName(); - - if (filename.isEmpty()) { - error(ERR_MALFORMED_URL, url.toDisplayString()); - return; - } - - QByteArray data; - for (;;) { - dataReq(); - QByteArray buffer; - const int newSize = readData(buffer); - append_lf2crlf(data, buffer); - if (newSize < 0) { - // read error: network in unknown state so disconnect - error(ERR_COULD_NOT_READ, i18n("KIO data supply error.")); - return; - } - if (newSize == 0) { - break; - } - } - - // script size - int bufLen = (int)data.size(); - totalSize(bufLen); - - // timsieved 1.1.0: - // C: HAVESPACE "rejected" 74 - // S: NO "Number expected" - // C: HAVESPACE 74 - // S: NO "Missing script name" - // S: HAVESPACE "rejected" "74" - // C: NO "Number expected" - // => broken, we can't use it :-( - // (will be fixed in Cyrus 2.1.10) - - if (!sendData("PUTSCRIPT \"" + filename.toUtf8() + "\" {" - + QByteArray::number(bufLen) + "+}")) { - return; - } - - // atEnd() lies so the code below doesn't work. - /*if (!atEnd()) { - // We are not expecting any data here, so if the server has responded - // with anything but OK we treat it as an error. - char * buf = new char[2]; - while (!atEnd()) { - ksDebug << "Reading..." << endl; - read(buf, 1); - ksDebug << "Trailing [" << buf[0] << "]" << endl; - } - ksDebug << "End of data." << endl; - delete[] buf; - - if (!operationSuccessful()) { - error(ERR_UNSUPPORTED_PROTOCOL, i18n("A protocol error occurred " - "while trying to negotiate script uploading.\n" - "The server responded:\n%1") - .arg(r.getAction().right(r.getAction().length() - 3))); - return; - } - }*/ - - // upload data to the server - if (write(data, bufLen) != bufLen) { - error(ERR_COULD_NOT_WRITE, i18n("Network error.")); - disconnect(true); - return; - } - - // finishing CR/LF - if (!sendData("")) { - return; - } - - processedSize(bufLen); - - infoMessage(i18n("Verifying upload completion...")); - - if (operationSuccessful()) { - ksDebug << "Script upload complete." << endl; - } else { - /* The managesieve server parses received scripts and rejects - * scripts which are not syntactically correct. Here we expect - * to receive a message detailing the error (only the first - * error is reported. */ - if (r.getAction().length() > 3) { - // make a copy of the extra info - QByteArray extra = r.getAction().right(r.getAction().length() - 3); - - // send the extra message off for re-processing - receiveData(false, extra); - - if (r.getType() == kio_sieveResponse::QUANTITY) { - // length of the error message - uint len = r.getQuantity(); - - QByteArray errmsg(len, 0); - - read(errmsg.data(), len); - - error(ERR_INTERNAL_SERVER, i18n("The script did not upload successfully.\n" - "This is probably due to errors in the script.\n" - "The server responded:\n%1", QString::fromLatin1(errmsg.data(), errmsg.size()))); - - // clear the rest of the incoming data - receiveData(); - } else if (r.getType() == kio_sieveResponse::KEY_VAL_PAIR) { - error(ERR_INTERNAL_SERVER, i18n("The script did not upload successfully.\n" - "This is probably due to errors in the script.\n" - "The server responded:\n%1", QString::fromUtf8(r.getKey()))); - } else { - error(ERR_INTERNAL_SERVER, i18n("The script did not upload successfully.\n" - "The script may contain errors.")); - } - } else { - error(ERR_INTERNAL_SERVER, i18n("The script did not upload successfully.\n" - "The script may contain errors.")); - } - } - - //if ( permissions != -1 ) - // chmod( url, permissions ); - - infoMessage(i18nc("data upload complete", "Done.")); - - finished(); -} - -static void inplace_crlf2lf(QByteArray &in) -{ - if (in.isEmpty()) { - return; - } - QByteArray &out = in; // inplace - const char *s = in.begin(); - const char *const end = in.end(); - char *d = out.begin(); - char last = '\0'; - while (s < end) { - if (*s == '\n' && last == '\r') { - --d; - } - *d++ = last = *s++; - } - out.resize(d - out.begin()); -} - -/* ---------------------------------------------------------------------------------- */ -void kio_sieveProtocol::get(const QUrl &url) -{ - changeCheck(url); - if (!connect()) { - return; - } - - infoMessage(i18n("Retrieving data...")); - - QString filename = url.fileName(); - - if (filename.isEmpty()) { - error(ERR_MALFORMED_URL, url.toDisplayString()); - return; - } - - //SlaveBase::mimetype( QString("text/plain") ); // "application/sieve"); - - if (!sendData("GETSCRIPT \"" + filename.toUtf8() + "\"")) { - return; - } - - if (receiveData() && r.getType() == kio_sieveResponse::QUANTITY) { - // determine script size - ssize_t total_len = r.getQuantity(); - totalSize(total_len); - - ssize_t recv_len = 0; - do { - // wait for data... - if (!waitForResponse(600)) { - error(KIO::ERR_SERVER_TIMEOUT, m_sServer); - disconnect(true); - return; - } - - // ...read data... - // Only read as much as we need, otherwise we slurp in the OK that - // operationSuccessful() is expecting below. - QByteArray dat(qMin(total_len - recv_len, ssize_t(64 * 1024)), '\0'); - ssize_t this_recv_len = read(dat.data(), dat.size()); - - if (this_recv_len < 1 && !isConnected()) { - error(KIO::ERR_CONNECTION_BROKEN, m_sServer); - disconnect(true); - return; - } - - dat.resize(this_recv_len); - inplace_crlf2lf(dat); - // send data to slaveinterface - data(dat); - - recv_len += this_recv_len; - processedSize(recv_len); - } while (recv_len < total_len); - - infoMessage(i18n("Finishing up...")); - data(QByteArray()); - - if (operationSuccessful()) { - ksDebug << "Script retrieval complete." << endl; - } else { - ksDebug << "Script retrieval failed." << endl; - } - } else { - error(ERR_UNSUPPORTED_PROTOCOL, i18n("A protocol error occurred " - "while trying to negotiate script downloading.")); - return; - } - - infoMessage(i18nc("data retrival complete", "Done.")); - finished(); -} - -void kio_sieveProtocol::del(const QUrl &url, bool isfile) -{ - if (!isfile) { - error(ERR_INTERNAL, i18n("Folders are not supported.")); - return; - } - - changeCheck(url); - if (!connect()) { - return; - } - - infoMessage(i18n("Deleting file...")); - - QString filename = url.fileName(); - - if (filename.isEmpty()) { - error(ERR_MALFORMED_URL, url.toDisplayString()); - return; - } - - if (!sendData("DELETESCRIPT \"" + filename.toUtf8() + "\"")) { - return; - } - - if (operationSuccessful()) { - ksDebug << "Script deletion successful." << endl; - } else { - error(ERR_INTERNAL_SERVER, i18n("The server would not delete the file.")); - return; - } - - infoMessage(i18nc("file removal complete", "Done.")); - - finished(); -} - -void kio_sieveProtocol::chmod(const QUrl &url, int permissions) -{ - switch (permissions) { - case 0700: // activate - activate(url); - break; - case 0600: // deactivate - deactivate(); - break; - default: // unsupported - error(ERR_CANNOT_CHMOD, i18n("Cannot chmod to anything but 0700 (active) or 0600 (inactive script).")); - return; - } - - finished(); -} - -void kio_sieveProtocol::urlStat(const QUrl &url) -{ - changeCheck(url); - if (!connect()) { - return; - } - - UDSEntry entry; - - QString filename = url.fileName(); - - if (filename.isEmpty()) { - entry.insert(KIO::UDSEntry::UDS_NAME, QStringLiteral("/")); - - entry.insert(KIO::UDSEntry::UDS_FILE_TYPE, S_IFDIR); - - entry.insert(KIO::UDSEntry::UDS_ACCESS, 0700); - - statEntry(entry); - - } else { - if (!sendData("LISTSCRIPTS")) { - return; - } - - while (receiveData()) { - if (r.getType() == kio_sieveResponse::ACTION) { - if (r.getAction().toLower().count("ok") == 1) { - // Script list completed - break; - } - - } else { - if (filename == QString::fromUtf8(r.getKey())) { - entry.clear(); - - entry.insert(KIO::UDSEntry::UDS_NAME, QString::fromUtf8(r.getKey())); - - entry.insert(KIO::UDSEntry::UDS_FILE_TYPE, S_IFREG); - - if (r.getExtra() == "ACTIVE") { - entry.insert(KIO::UDSEntry::UDS_ACCESS, 0700); - } else { - entry.insert(KIO::UDSEntry::UDS_ACCESS, 0600); - } - - entry.insert(KIO::UDSEntry::UDS_MIME_TYPE, QStringLiteral("application/sieve")); - - //setMetaData("active", (r.getExtra() == "ACTIVE") ? "yes" : "no"); - - statEntry(entry); - // cannot break here because we need to clear - // the rest of the incoming data. - } - } - } - } - - finished(); -} - -void kio_sieveProtocol::listDir(const QUrl &url) -{ - changeCheck(url); - if (!connect()) { - return; - } - - if (!sendData("LISTSCRIPTS")) { - return; - } - - UDSEntry entry; - - while (receiveData()) { - if (r.getType() == kio_sieveResponse::ACTION) { - if (r.getAction().toLower().count("ok") == 1) { - // Script list completed. - break; - } - - } else { - entry.clear(); - entry.insert(KIO::UDSEntry::UDS_NAME, QString::fromUtf8(r.getKey())); - - entry.insert(KIO::UDSEntry::UDS_FILE_TYPE, S_IFREG); - - if (r.getExtra() == "ACTIVE") { - entry.insert(KIO::UDSEntry::UDS_ACCESS, 0700);// mark exec'able - } else { - entry.insert(KIO::UDSEntry::UDS_ACCESS, 0600); - } - - entry.insert(KIO::UDSEntry::UDS_MIME_TYPE, QStringLiteral("application/sieve")); - - //asetMetaData("active", (r.getExtra() == "ACTIVE") ? "true" : "false"); - - ksDebug << "Listing script " << r.getKey() << endl; - listEntry(entry); - } - } - - finished(); -} - -/* ---------------------------------------------------------------------------------- */ -bool kio_sieveProtocol::saslInteract(void *in, AuthInfo &ai) -{ - ksDebug << "sasl_interact" << endl; - sasl_interact_t *interact = (sasl_interact_t *) in; - - //some mechanisms do not require username && pass, so it doesn't need a popup - //window for getting this info - for (; interact->id != SASL_CB_LIST_END; interact++) { - if (interact->id == SASL_CB_AUTHNAME || - interact->id == SASL_CB_PASS) { - - if (m_sUser.isEmpty() || m_sPass.isEmpty()) { - if (!openPasswordDialog(ai)) { - // calling error() below is wrong for two reasons: - // - ERR_ABORTED is too harsh - // - higher layers already call error() and that can't happen twice. - //error(ERR_ABORTED, i18n("No authentication details supplied.")); - return false; - } - m_sUser = ai.username; - m_sPass = ai.password; - } - break; - } - } - - interact = (sasl_interact_t *) in; - while (interact->id != SASL_CB_LIST_END) { - ksDebug << "SASL_INTERACT id: " << interact->id << endl; - switch (interact->id) { - case SASL_CB_USER: - case SASL_CB_AUTHNAME: - ksDebug << "SASL_CB_[AUTHNAME|USER]: '" << m_sUser << "'" << endl; - interact->result = strdup(m_sUser.toUtf8()); - interact->len = strlen((const char *) interact->result); - break; - case SASL_CB_PASS: - ksDebug << "SASL_CB_PASS: [hidden] " << endl; - interact->result = strdup(m_sPass.toUtf8()); - interact->len = strlen((const char *) interact->result); - break; - default: - interact->result = NULL; - interact->len = 0; - break; - } - interact++; - } - return true; -} - -#define SASLERROR error(ERR_COULD_NOT_AUTHENTICATE, i18n("An error occurred during authentication: %1", \ - QString::fromUtf8( sasl_errdetail( conn ) ))); - -bool kio_sieveProtocol::authenticate() -{ - int result; - sasl_conn_t *conn = NULL; - sasl_interact_t *client_interact = NULL; - const char *out = NULL; - uint outlen; - const char *mechusing = NULL; - QByteArray challenge; - - /* Retrieve authentication details from user. - * Note: should this require realm as well as user & pass details - * before it automatically skips the prompt? - * Note2: encoding issues with PLAIN login? */ - AuthInfo ai; - ai.url.setScheme(QStringLiteral("sieve")); - ai.url.setHost(m_sServer); - ai.url.setPort(m_port); - ai.username = m_sUser; - ai.password = m_sPass; - ai.keepPassword = true; - ai.caption = i18n("Sieve Authentication Details"); - ai.comment = i18n("Please enter your authentication details for your sieve account " - "(usually the same as your email password):"); - - result = sasl_client_new("sieve", m_sServer.toLatin1(), 0, 0, callbacks, 0, &conn); - if (result != SASL_OK) { - ksDebug << "sasl_client_new failed with: " << result << endl; - SASLERROR - return false; - } - - QStringList strList; -// strList.append("NTLM"); - - if (!m_sAuth.isEmpty()) { - strList.append(m_sAuth); - } else { - strList = m_sasl_caps; - } - - do { - result = sasl_client_start(conn, strList.join(QStringLiteral(" ")).toLatin1(), - &client_interact, &out, &outlen, &mechusing); - - if (result == SASL_INTERACT) { - if (!saslInteract(client_interact, ai)) { - sasl_dispose(&conn); - return false; - }; - } - } while (result == SASL_INTERACT); - - if (result != SASL_CONTINUE && result != SASL_OK) { - ksDebug << "sasl_client_start failed with: " << result << endl; - SASLERROR - sasl_dispose(&conn); - return false; - } - - ksDebug << "Preferred authentication method is " << mechusing << "." << endl; - - QString firstCommand = QLatin1String("AUTHENTICATE \"") + QString::fromLatin1(mechusing) + QLatin1String("\""); - challenge = QByteArray::fromRawData(out, outlen).toBase64(); - if (!challenge.isEmpty()) { - firstCommand += QLatin1String(" \""); - firstCommand += QString::fromLatin1(challenge.data(), challenge.size()); - firstCommand += QLatin1Char('\"'); - } - - if (!sendData(firstCommand.toLatin1())) { - return false; - } - - do { - receiveData(); - - if (operationResult() != OTHER) { - break; - } - - ksDebug << "Challenge len " << r.getQuantity() << endl; - - if (r.getType() != kio_sieveResponse::QUANTITY) { - sasl_dispose(&conn); - error(ERR_UNSUPPORTED_PROTOCOL, QString::fromLatin1(mechusing)); - return false; - } - - int qty = r.getQuantity(); - - receiveData(); - - if (r.getType() != kio_sieveResponse::ACTION && r.getAction().length() != qty) { - sasl_dispose(&conn); - error(ERR_UNSUPPORTED_PROTOCOL, i18n("A protocol error occurred during authentication.\n" - "Choose a different authentication method to %1.", QLatin1String(mechusing))); - return false; - } - challenge = QByteArray::fromBase64(QByteArray::fromRawData(r.getAction().data(), qty)); -// ksDebug << "S: [" << r.getAction() << "]." << endl; - - do { - result = sasl_client_step(conn, challenge.isEmpty() ? 0 : challenge.data(), - challenge.size(), &client_interact, &out, &outlen); - - if (result == SASL_INTERACT) { - if (!saslInteract(client_interact, ai)) { - sasl_dispose(&conn); - return false; - }; - } - } while (result == SASL_INTERACT); - - ksDebug << "sasl_client_step: " << result << endl; - if (result != SASL_CONTINUE && result != SASL_OK) { - ksDebug << "sasl_client_step failed with: " << result << endl; - SASLERROR - sasl_dispose(&conn); - return false; - } - - sendData('\"' + QByteArray::fromRawData(out, outlen).toBase64() + '\"'); -// ksDebug << "C-1: [" << out << "]." << endl; - } while (true); - - ksDebug << "Challenges finished." << endl; - sasl_dispose(&conn); - - if (operationResult() == OK) { - // Authentication succeeded. - return true; - } else { - // Authentication failed. - error(ERR_COULD_NOT_AUTHENTICATE, i18n("Authentication failed.\nMost likely the password is wrong.\nThe server responded:\n%1", - QString::fromLatin1(r.getAction()))); - return false; - } -} - -/* --------------------------------------------------------------------------- */ -void kio_sieveProtocol::mimetype(const QUrl &url) -{ - ksDebug << "Requesting mimetype for " << url.toDisplayString() << endl; - - if (url.fileName().isEmpty()) { - mimeType(QStringLiteral("inode/directory")); - } else { - mimeType(QStringLiteral("application/sieve")); - } - - finished(); -} - -/* --------------------------------------------------------------------------- */ -bool kio_sieveProtocol::sendData(const QByteArray &data) -{ - QByteArray write_buf = data + "\r\n"; - - //ksDebug << "C: " << data << endl; - - // Write the command - ssize_t write_buf_len = write_buf.length(); - if (write(write_buf.data(), write_buf_len) != write_buf_len) { - error(ERR_COULD_NOT_WRITE, i18n("Network error.")); - disconnect(true); - return false; - } - - return true; -} - -/* --------------------------------------------------------------------------- */ -bool kio_sieveProtocol::receiveData(bool waitForData, const QByteArray &reparse) -{ - QByteArray interpret; - int start, end; - - if (reparse.isEmpty()) { - if (!waitForData) { - // is there data waiting? - if (atEnd()) { - return false; - } - } - - // read data from the server - char buffer[SIEVE_DEFAULT_RECIEVE_BUFFER]; - const ssize_t numRead = readLine(buffer, SIEVE_DEFAULT_RECIEVE_BUFFER - 1); - if (numRead < 0) { - return false; - } - buffer[SIEVE_DEFAULT_RECIEVE_BUFFER - 1] = '\0'; - - // strip LF/CR - interpret = QByteArray(buffer, qstrlen(buffer) - 2); - - } else { - interpret = reparse; - } - - r.clear(); - - //ksDebug << "S: " << interpret << endl; - - switch (interpret[0]) { - case '{': { - // expecting {quantity} - start = 0; - end = interpret.indexOf("+}", start + 1); - // some older versions of Cyrus enclose the literal size just in { } instead of { +} - if (end == -1) { - end = interpret.indexOf('}', start + 1); - } - - bool ok = false; - r.setQuantity(interpret.mid(start + 1, end - start - 1).toUInt(&ok)); - if (!ok) { - disconnect(); - error(ERR_INTERNAL_SERVER, i18n("A protocol error occurred.")); - return false; - } - - return true; - } - case '"': - // expecting "key" "value" pairs - break; - default: - // expecting single string - r.setAction(interpret); - return true; - } - - start = 0; - - end = interpret.indexOf('"', start + 1); - if (end == -1) { - ksDebug << "Possible insufficient buffer size." << endl; - r.setKey(interpret.right(interpret.length() - start)); - return true; - } - - r.setKey(interpret.mid(start + 1, end - start - 1)); - - start = interpret.indexOf('"', end + 1); - if (start == -1) { - if ((int)interpret.length() > end) { - // skip " and space - r.setExtra(interpret.right(interpret.length() - end - 2)); - } - - return true; - } - - end = interpret.indexOf('"', start + 1); - if (end == -1) { - ksDebug << "Possible insufficient buffer size." << endl; - r.setVal(interpret.right(interpret.length() - start)); - return true; - } - - r.setVal(interpret.mid(start + 1, end - start - 1)); - return true; -} - -bool kio_sieveProtocol::operationSuccessful() -{ - while (receiveData(true)) { - if (r.getType() == kio_sieveResponse::ACTION) { - QByteArray response = r.getAction().left(2); - if (response == "OK") { - return true; - } else if (response == "NO") { - return false; - } - } - } - return false; -} - -int kio_sieveProtocol::operationResult() -{ - if (r.getType() == kio_sieveResponse::ACTION) { - QByteArray response = r.getAction().left(2); - if (response == "OK") { - return OK; - } else if (response == "NO") { - return NO; - } else if (response == "BY"/*E*/) { - return BYE; - } - } - - return OTHER; -} - -bool kio_sieveProtocol::requestCapabilitiesAfterStartTLS() const -{ - // Cyrus didn't send CAPABILITIES after STARTTLS until 2.3.11, which is - // not standard conform, but we need to support that anyway. - // m_implementation looks like this 'Cyrus timsieved v2.2.12' for Cyrus btw. - QRegExp regExp(QStringLiteral("Cyrus\\stimsieved\\sv(\\d+)\\.(\\d+)\\.(\\d+)([-\\w]*)"), Qt::CaseInsensitive); - if (regExp.indexIn(m_implementation) >= 0) { - const int major = regExp.cap(1).toInt(); - const int minor = regExp.cap(2).toInt(); - const int patch = regExp.cap(3).toInt(); - const QString vendor = regExp.cap(4); - if (major < 2 || (major == 2 && (minor < 3 || (minor == 3 && patch < 11))) || (vendor == QLatin1String("-kolab-nocaps"))) { - ksDebug << " kio_sieveProtocol::requestCapabilitiesAfterStartTLS : Enabling compat mode for Cyrus < 2.3.11 or Cyrus marked as \"kolab-nocaps\"" << endl; - return true; - } - } - return false; -} diff --git a/kioslave/src/sieve/sieve.h b/kioslave/src/sieve/sieve.h deleted file mode 100644 index 6ed5d65..0000000 --- a/kioslave/src/sieve/sieve.h +++ /dev/null @@ -1,145 +0,0 @@ -/*************************************************************************** - sieve.h - description - ------------------- - begin : Thu Dec 20 18:47:08 EST 2001 - copyright : (C) 2001 by Hamish Rodda - email : [email protected] - ***************************************************************************/ - -/*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License version 2 as * - * published by the Free Software Foundation. * - * * - ***************************************************************************/ -#ifndef __sieve_h__ -#define __sieve_h__ - -#include "sieve-config.h" - -#include <kio/tcpslavebase.h> -#include <kio/authinfo.h> - -#include <QString> -#include <QByteArray> -#include <QStringList> - -class kio_sieveResponse -{ -public: - enum responses { - NONE, - KEY_VAL_PAIR, - ACTION, - QUANTITY - }; - - kio_sieveResponse(); - - const uint &getType() const; - - const QByteArray &getAction() const; - uint getQuantity() const; - const QByteArray &getKey() const; - const QByteArray &getVal() const; - const QByteArray &getExtra() const; - - void setQuantity(const uint &quantity); - void setAction(const QByteArray &newAction); - void setKey(const QByteArray &newKey); - void setVal(const QByteArray &newVal); - void setExtra(const QByteArray &newExtra); - - void clear(); - -protected: - uint rType; - uint quantity; - QByteArray key; - QByteArray val; - QByteArray extra; -}; - -class kio_sieveProtocol : public KIO::TCPSlaveBase -{ - -public: - enum connectionModes { - NORMAL, - CONNECTION_ORIENTED - }; - enum Results { - OK, - NO, - BYE, - OTHER - }; - - kio_sieveProtocol(const QByteArray &pool_socket, const QByteArray &app_socket); - virtual ~kio_sieveProtocol(); - - void mimetype(const QUrl &url) Q_DECL_OVERRIDE; - void get(const QUrl &url) Q_DECL_OVERRIDE; - void put(const QUrl &url, int permissions, KIO::JobFlags flags) Q_DECL_OVERRIDE; - void del(const QUrl &url, bool isfile) Q_DECL_OVERRIDE; - - void listDir(const QUrl &url) Q_DECL_OVERRIDE; - void chmod(const QUrl &url, int permissions) Q_DECL_OVERRIDE; - virtual void urlStat(const QUrl &url); - - void setHost(const QString &host, quint16 port, const QString &user, const QString &pass) Q_DECL_OVERRIDE; - void openConnection() Q_DECL_OVERRIDE; - void closeConnection() Q_DECL_OVERRIDE; - //virtual void slave_status(); - - /** - * Special commands supported by this slave: - * 1 - activate script - * 2 - deactivate (all - only one active at any one time) scripts - * 3 - request capabilities, returned as metadata - */ - void special(const QByteArray &data) Q_DECL_OVERRIDE; - bool activate(const QUrl &url); - bool deactivate(); - -protected: - bool connect(bool useTLSIfAvailable = true); - bool authenticate(); - void disconnect(bool forcibly = false); - void changeCheck(const QUrl &url); - - bool sendData(const QByteArray &data); - bool receiveData(bool waitForData = true, const QByteArray &reparse = QByteArray()); - bool operationSuccessful(); - int operationResult(); - - bool parseCapabilities(bool requestCapabilities = false); - bool saslInteract(void *in, KIO::AuthInfo &ai); - - // IOSlave global data - uint m_connMode; - - // Host-specific data - QStringList m_sasl_caps; - bool m_supportsTLS; - - // Global server respose class - kio_sieveResponse r; - - // connection details - QString m_sServer; - QString m_sUser; - QString m_sPass; - QString m_sAuth; - bool m_shouldBeConnected; - bool m_allowUnencrypted; - quint16 m_port; - -private: - bool requestCapabilitiesAfterStartTLS() const; - - QString m_implementation; -}; - -#endif diff --git a/kioslave/src/sieve/sieve.protocol b/kioslave/src/sieve/sieve.protocol deleted file mode 100644 index 0bc4a7e..0000000 --- a/kioslave/src/sieve/sieve.protocol +++ /dev/null @@ -1,65 +0,0 @@ -[Protocol] -exec=kf5/kio/sieve -protocol=sieve -input=none -output=filesystem -listing=Name,Access,Type,MimeType, -reading=true -writing=true -makedir=false -deleting=true -linking=false -moving=false -Icon=view-filter -X-DocPath=kioslave5/sieve/index.html -Description=An ioslave for the Sieve mail filtering protocol -Description[ast]=Un esclavu ES pal protocolu de peñera de corréu Sieve -Description[bs]=U/I program za Sieve protokol filtriranja e-pošte -Description[ca]=Un «ioslave» pel protocol de filtratge de correu «Sieve» -Description[ca@valencia]=Un «ioslave» pel protocol de filtratge de correu «Sieve» -Description[cs]=Protokol pro filtrování pošty Sieve -Description[da]=En ioslave til mail-filtreringsprotokollen Sieve -Description[de]=Ein Ein-/Ausgabemodul für das Mailfilter-Protokoll Sieve -Description[el]=Ένα ioslave για το πρωτόκολλο φιλτραρίσματος αλληλογραφίας Sieve -Description[en_GB]=An ioslave for the Sieve mail filtering protocol -Description[es]=Un esclavo de E/S para el protocolo de filtrado de correo Sieve -Description[et]=Sieve kirjade filtreerimise protokolli IO-moodul -Description[fi]=I/O-asiakas Sieve-postinsuodatusyhteyskäytännölle -Description[fr]=Un module d'entrées / sorties pour le protocole de filtrage de messagerie « Sieve » -Description[ga]=Sclábhaí I/A le haghaidh prótacail scagtha ríomhphoist Sieve -Description[gl]=Un ioslave para o protocolo de filtrado de correo Sieve. -Description[he]=תוסף ioslave עבור פרוטוקול מסנני דואר של Sieve -Description[hne]=सीव मेल फिल्टरिंग प्रोटोकाल बर आईओस्लेव -Description[hu]=KDE-protokoll a Sieve levélszűrő protokollhoz -Description[ia]=Un ioslave (sclavo de i/e) per le protocollo per filtrar posta Sieve -Description[it]=Un IOSlave per il protocollo di filtraggio della posta Sieve -Description[ja]=Sieve メールフィルタリングプロトコルのための ioslave -Description[kk]=Sieve пошта сүзгілеу протоколының ioslav-модулі -Description[km]=ioslave សម្រាប់ពិធីការតម្រងសំបុត្ររបស់ Sieve -Description[ko]=Sieve 메일 필터링 프로토콜을 위한 IO 슬레이브 -Description[lt]=Sieve pašto filtravimo protokolo palaikymas -Description[lv]=IO apstrādātājs Sieve pasta filtrēšanas protokolam -Description[mr]=सीव्ह मेल गाळणी शिष्टाचार करिता आयओस्लेव्ह -Description[nb]=En ioslave for Sieve e-postfiltrering -Description[nds]=In-/Utgaavmoduul för't Nettpostfilter-Protokoll Sieve -Description[nl]=Een KIO-slave voor het Sieve-mail filterprotocol -Description[nn]=Ein IO-slave for e-postfiltreringsprotokollen Sieve -Description[pl]=Moduł ioslave dla protokołu filtrowania poczty Sieve -Description[pt]=Um 'ioslave' para o protocolo de filtragem de correio Sieve -Description[pt_BR]=Um ioslave para o protocolo de filtragem de e-mail Sieve -Description[ro]=Un „ioslave” pentru protocolul de filtrare a poștei Sieve -Description[ru]=Поддержка протокола фильтрации почты Sieve -Description[se]=SO-šláva Sieve e-boastasillenprotokolla várás -Description[sk]=Ioslave pre Sieve mail filtrovací protokol -Description[sl]=Ioslave za protokol poštnega filtriranja Sieve -Description[sr]=У/И захват за сито, протокол филтрирања поште -Description[sr@ijekavian]=У/И захват за сито, протокол филтрирања поште -Description[sr@ijekavianlatin]=U/I zahvat za sito, protokol filtriranja pošte -Description[sr@latin]=U/I zahvat za sito, protokol filtriranja pošte -Description[sv]=En I/O-slav för brevfiltreringsprotokollet Sieve -Description[th]=ส่วนเสริม ioslave สำหรับโพรโทคอลการกรองจดหมาย Sieve -Description[tr]=Sieve e-posta filtrelemesi için bir kioslave -Description[uk]=Підлеглий В/В для протоколу фільтрування пошти Sieve -Description[x-test]=xxAn ioslave for the Sieve mail filtering protocolxx -Description[zh_CN]=Sieve 邮件过滤协议的 ioslave -Description[zh_TW]=Sieve 郵件過濾協定的 ioslave _______________________________________________ kde-doc-english mailing list [email protected] https://mail.kde.org/mailman/listinfo/kde-doc-english
