summaryrefslogblamecommitdiffstats
path: root/source/kde/kde/patch/kdepim-runtime/f14fabcefb45790175e209ef8ae394def4a805e9.patch
blob: e911588dbdcb2e12529aacb179df46ce1600ce83 (plain) (tree)






























































































































                                                                                                                                                            
From f14fabcefb45790175e209ef8ae394def4a805e9 Mon Sep 17 00:00:00 2001
From: Albert Astals Cid <aacid@kde.org>
Date: Fri, 10 Dec 2021 21:55:13 +0100
Subject: [PATCH] POP3: Fix SSL connections

We need to go into ssl before trying to read from the socket, otherwise
nothing works

BUGS: 446751
---
 resources/pop3/pop3protocol.cpp | 72 ++++++++++++++++++++-------------
 resources/pop3/pop3protocol.h   |  2 +
 2 files changed, 45 insertions(+), 29 deletions(-)

diff --git a/resources/pop3/pop3protocol.cpp b/resources/pop3/pop3protocol.cpp
index c2d01d33a..15971919e 100644
--- a/resources/pop3/pop3protocol.cpp
+++ b/resources/pop3/pop3protocol.cpp
@@ -535,6 +535,39 @@ Result POP3Protocol::loginPASS()
     return Result::pass();
 }
 
+Result POP3Protocol::startSsl()
+{
+    mSocket->ignoreSslErrors(); // Don't worry, errors are handled manually below
+    mSocket->startClientEncryption();
+    const bool encryptionStarted = mSocket->waitForEncrypted(s_connectTimeout);
+
+    const QSslCipher cipher = mSocket->sessionCipher();
+    const QList<QSslError> errors = mSocket->sslHandshakeErrors();
+    if (!encryptionStarted || !errors.isEmpty() || !mSocket->isEncrypted() || cipher.isNull() || cipher.usedBits() == 0) {
+        QString errorString = std::accumulate(errors.begin(), errors.end(), QString(), [](QString cur, const QSslError &error) {
+            if (!cur.isEmpty())
+                cur += QLatin1Char('\n');
+            cur += error.errorString();
+            return cur;
+        });
+
+        qCDebug(POP3_LOG) << "Initial SSL handshake failed. cipher.isNull() is" << cipher.isNull() << ", cipher.usedBits() is" << cipher.usedBits()
+                          << ", the socket says:" << mSocket->errorString() << "and the SSL errors are:" << errorString;
+        mContinueAfterSslError = false;
+        Q_EMIT sslError(KSslErrorUiData(mSocket));
+        if (!mContinueAfterSslError) {
+            if (errorString.isEmpty())
+                errorString = mSocket->errorString();
+            qCDebug(POP3_LOG) << "TLS setup has failed. Aborting." << errorString;
+            closeConnection();
+            return Result::fail(ERR_SSL_FAILURE, i18n("SSL/TLS error: %1", errorString));
+        }
+    } else {
+        qCDebug(POP3_LOG) << "TLS has been enabled.";
+    }
+    return Result::pass();
+}
+
 Result POP3Protocol::openConnection()
 {
     m_try_apop = mSettings.authenticationMethod() == MailTransport::Transport::EnumAuthenticationType::APOP;
@@ -560,6 +593,13 @@ Result POP3Protocol::openConnection()
             return Result::fail(mSocket->error(), errorString);
         }
 
+        if (mSettings.useSSL()) {
+            const Result res = startSsl();
+            if (!res.success) {
+                return res;
+            }
+        }
+
         mConnected = true;
 
         greeting_buf = new char[GREETING_BUF_LEN];
@@ -608,35 +648,9 @@ Result POP3Protocol::openConnection()
                                          "was unsuccessful.\nYou can "
                                          "disable TLS in the POP account settings dialog."));
             }
-        }
-        if (mSettings.useSSL() || mSettings.useTLS()) {
-            mSocket->ignoreSslErrors(); // Don't worry, errors are handled manually below
-            mSocket->startClientEncryption();
-            const bool encryptionStarted = mSocket->waitForEncrypted(s_connectTimeout);
-
-            const QSslCipher cipher = mSocket->sessionCipher();
-            const QList<QSslError> errors = mSocket->sslHandshakeErrors();
-            if (!encryptionStarted || !errors.isEmpty() || !mSocket->isEncrypted() || cipher.isNull() || cipher.usedBits() == 0) {
-                QString errorString = std::accumulate(errors.begin(), errors.end(), QString(), [](QString cur, const QSslError &error) {
-                    if (!cur.isEmpty())
-                        cur += QLatin1Char('\n');
-                    cur += error.errorString();
-                    return cur;
-                });
-
-                qCDebug(POP3_LOG) << "Initial SSL handshake failed. cipher.isNull() is" << cipher.isNull() << ", cipher.usedBits() is" << cipher.usedBits()
-                                  << ", the socket says:" << mSocket->errorString() << "and the SSL errors are:" << errorString;
-                mContinueAfterSslError = false;
-                Q_EMIT sslError(KSslErrorUiData(mSocket));
-                if (!mContinueAfterSslError) {
-                    if (errorString.isEmpty())
-                        errorString = mSocket->errorString();
-                    qCDebug(POP3_LOG) << "TLS setup has failed. Aborting." << errorString;
-                    closeConnection();
-                    return Result::fail(ERR_SSL_FAILURE, i18n("SSL/TLS error: %1", errorString));
-                }
-            } else {
-                qCDebug(POP3_LOG) << "TLS has been enabled.";
+            const Result res = startSsl();
+            if (!res.success) {
+                return res;
             }
         }
 
diff --git a/resources/pop3/pop3protocol.h b/resources/pop3/pop3protocol.h
index 9b40b334f..d01f7ab7a 100644
--- a/resources/pop3/pop3protocol.h
+++ b/resources/pop3/pop3protocol.h
@@ -127,6 +127,8 @@ private:
      */
     Q_REQUIRED_RESULT Result loginPASS();
 
+    Q_REQUIRED_RESULT Result startSsl();
+
     const Settings &mSettings;
     QSslSocket *const mSocket;
     unsigned short int m_iPort;
-- 
GitLab