summaryrefslogtreecommitdiffstats
path: root/source/kde/kde/patch/kdepim-runtime/f14fabcefb45790175e209ef8ae394def4a805e9.patch
blob: e911588dbdcb2e12529aacb179df46ce1600ce83 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
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