File kdelibs-trinity-tls_client_method-tlsext_hostname.patch of Package kdelibs3

diff -Naru kdelibs-3.5.10_orig/kio/kssl/kopenssl.cc kdelibs-3.5.10/kio/kssl/kopenssl.cc
--- kdelibs-3.5.10_orig/kio/kssl/kopenssl.cc	2018-05-16 04:37:21.338975706 +0000
+++ kdelibs-3.5.10/kio/kssl/kopenssl.cc	2018-05-16 04:50:44.108104318 +0000
@@ -58,6 +58,9 @@
 static const char* (*K_RAND_file_name) (char *, size_t) = 0L;
 static int (*K_RAND_load_file)  (const char *, long) = 0L;
 static int (*K_RAND_write_file) (const char *) = 0L;
+#if OPENSSL_VERSION_NUMBER >= 0x10100000L
+static SSL_METHOD * (*K_TLS_client_method) () = 0L;
+#endif
 static SSL_METHOD * (*K_TLSv1_client_method) () = 0L;
 static SSL_METHOD * (*K_SSLv2_client_method) () = 0L;
 static SSL_METHOD * (*K_SSLv3_client_method) () = 0L;
@@ -560,6 +563,9 @@
                                   _sslLib->symbol("SSL_get_current_cipher");
       K_SSL_ctrl = (long (*)(SSL * ,int, long, void *))
                                   _sslLib->symbol("SSL_ctrl");
+#if OPENSSL_VERSION_NUMBER >= 0x10100000L
+      K_TLS_client_method = (SSL_METHOD *(*)()) _sslLib->symbol("TLS_client_method");
+#endif
       K_TLSv1_client_method = (SSL_METHOD *(*)()) _sslLib->symbol("TLSv1_client_method");
       K_SSLv2_client_method = (SSL_METHOD *(*)()) _sslLib->symbol("SSLv2_client_method");
       K_SSLv3_client_method = (SSL_METHOD *(*)()) _sslLib->symbol("SSLv3_client_method");
@@ -778,7 +784,13 @@
 
 
 SSL_METHOD *KOpenSSLProxy::SSLv23_client_method() {
+#if OPENSSL_VERSION_NUMBER >= 0x10100000L
+   // Because openssl/ssl.h maps SSLv23_client_method to TLS_client_method,
+   // this method is used as KOpenSSLProxy::TLS_client_method.
+   if (K_TLS_client_method) return (K_TLS_client_method)();
+#else
    if (K_SSLv23_client_method) return (K_SSLv23_client_method)();
+#endif
    return 0L;
 }
 
diff -Naru kdelibs-3.5.10_orig/kio/kssl/kssl.cc kdelibs-3.5.10/kio/kssl/kssl.cc
--- kdelibs-3.5.10_orig/kio/kssl/kssl.cc	2018-05-16 04:37:21.342975651 +0000
+++ kdelibs-3.5.10/kio/kssl/kssl.cc	2018-05-16 04:45:51.644064971 +0000
@@ -135,7 +135,13 @@
 		return false;
 
 	seedWithEGD();
+
+#if OPENSSL_VERSION_NUMBER >= 0x10100000L
+	d->m_meth = d->kossl->TLS_client_method();
+#else
+	// Since openssl < 1.1 does not support TLS_client_method()...
 	d->m_meth = d->kossl->TLSv1_client_method();
+#endif
 	d->lastInitTLS = true;
 
 	m_pi.reset();
@@ -174,13 +180,19 @@
 
 	m_pi.reset();
 
-	if (!m_cfg->tlsv1() && !m_cfg->sslv3() && m_cfg->sslv2())
-		d->m_meth = d->kossl->SSLv2_client_method();
-        else if (m_cfg->tlsv1() && !m_cfg->sslv3() && !m_cfg->sslv2())
+	if (m_cfg->tlsv1() || (m_cfg->sslv3() && m_cfg->sslv2())) {
+#if OPENSSL_VERSION_NUMBER >= 0x10100000L
+		d->m_meth = d->kossl->TLS_client_method();
+#else
 		d->m_meth = d->kossl->TLSv1_client_method();
-	else if (!m_cfg->tlsv1() && m_cfg->sslv3() && !m_cfg->sslv2())
+#endif
+	}
+	else if (m_cfg->sslv3()) {
 		d->m_meth = d->kossl->SSLv3_client_method();
-	else d->m_meth = d->kossl->SSLv23_client_method();
+	}
+	else if (m_cfg->sslv2()) {
+		d->m_meth = d->kossl->SSLv2_client_method();
+	}
 
 /*
 if (m_cfg->sslv2() && m_cfg->sslv3()) kdDebug(7029) << "Double method" << endl;
@@ -337,6 +349,9 @@
 		d->m_ssl = 0;
 		return rc;
 	}
+#ifdef SSL_CTRL_SET_TLSEXT_HOSTNAME
+	d->kossl->SSL_set_tlsext_host_name(d->m_ssl, d->proxyPeer.ascii());
+#endif
 
 	rc = d->kossl->SSL_accept(d->m_ssl);
 	if (rc == 1) {
@@ -441,6 +456,9 @@
 		d->m_ssl = 0;
 		return rc;
 	}
+#ifdef SSL_CTRL_SET_TLSEXT_HOSTNAME
+	d->kossl->SSL_set_tlsext_host_name(d->m_ssl, d->proxyPeer.ascii());
+#endif
 
 connect_again:
 	rc = d->kossl->SSL_connect(d->m_ssl);
openSUSE Build Service is sponsored by