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
|
From fb456a2ad77b8d2bd4b0013832591c1dda8bb09a 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/TLS connections
We need to go into ssl before trying to read from the socket, otherwise
nothing works
BUGS: 446751
---
resources/pop3/pop3protocol.cpp | 61 +++++++++++++++++----------------
1 file changed, 31 insertions(+), 30 deletions(-)
diff --git a/resources/pop3/pop3protocol.cpp b/resources/pop3/pop3protocol.cpp
index c2d01d33a..02fa49770 100644
--- a/resources/pop3/pop3protocol.cpp
+++ b/resources/pop3/pop3protocol.cpp
@@ -560,6 +560,37 @@ Result POP3Protocol::openConnection()
return Result::fail(mSocket->error(), errorString);
}
+ 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.";
+ }
+ }
+
mConnected = true;
greeting_buf = new char[GREETING_BUF_LEN];
@@ -609,36 +640,6 @@ Result POP3Protocol::openConnection()
"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.";
- }
- }
if (supports_apop && m_try_apop) {
qCDebug(POP3_LOG) << "Trying APOP";
--
GitLab
|