10
10
******************************************************************************/
11
11
package com.redhat.devtools.intellij.kubernetes.model.client
12
12
13
- import com.intellij.util.net. ssl.CertificateManager
13
+ import com.redhat.devtools. intellij.kubernetes.model.client. ssl.IDEATrustManager
14
14
import com.redhat.devtools.intellij.kubernetes.model.util.isUnauthorized
15
15
import io.fabric8.kubernetes.client.Client
16
16
import io.fabric8.kubernetes.client.Config
17
17
import io.fabric8.kubernetes.client.KubernetesClient
18
18
import io.fabric8.kubernetes.client.KubernetesClientBuilder
19
19
import io.fabric8.kubernetes.client.KubernetesClientException
20
+ import io.fabric8.kubernetes.client.http.HttpClient
20
21
import io.fabric8.kubernetes.client.impl.AppsAPIGroupClient
21
22
import io.fabric8.kubernetes.client.impl.BatchAPIGroupClient
22
23
import io.fabric8.kubernetes.client.impl.NetworkAPIGroupClient
23
24
import io.fabric8.kubernetes.client.impl.StorageAPIGroupClient
25
+ import io.fabric8.kubernetes.client.internal.SSLUtils
24
26
import io.fabric8.openshift.client.NamespacedOpenShiftClient
25
27
import io.fabric8.openshift.client.OpenShiftClient
26
28
import java.util.concurrent.ConcurrentHashMap
29
+ import javax.net.ssl.X509ExtendedTrustManager
30
+ import javax.net.ssl.X509TrustManager
27
31
28
32
open class OSClientAdapter (client : OpenShiftClient , private val kubeClient : KubernetesClient ) :
29
33
ClientAdapter <OpenShiftClient >(client) {
@@ -50,19 +54,31 @@ open class KubeClientAdapter(client: KubernetesClient) :
50
54
}
51
55
}
52
56
53
- abstract class ClientAdapter <C : KubernetesClient >(private val fabric8Client : C ) {
57
+ abstract class ClientAdapter <C : KubernetesClient >(private val fabric8Client : C ) {
54
58
55
59
companion object Factory {
56
- fun create (namespace : String? = null, context : String? = null): ClientAdapter <out KubernetesClient > {
60
+ fun create (
61
+ namespace : String? = null,
62
+ context : String? = null,
63
+ trustManagerProvider : ((toIntegrate: Array <out X509ExtendedTrustManager >) -> X509TrustManager )
64
+ = IDEATrustManager ()::configure
65
+ ): ClientAdapter <out KubernetesClient > {
57
66
val config = Config .autoConfigure(context)
58
- setAcceptCertificates(config)
59
- return create(namespace, config)
67
+ return create(namespace, config, trustManagerProvider)
60
68
}
61
69
62
- fun create (namespace : String? = null, config : Config ): ClientAdapter <out KubernetesClient > {
70
+ fun create (
71
+ namespace : String? = null,
72
+ config : Config ,
73
+ externalTrustManagerProvider : (toIntegrate: Array <out X509ExtendedTrustManager >) -> X509TrustManager
74
+ = IDEATrustManager ()::configure
75
+ ): ClientAdapter <out KubernetesClient > {
63
76
setNamespace(namespace, config)
64
77
val kubeClient = KubernetesClientBuilder ()
65
78
.withConfig(config)
79
+ .withHttpClientBuilderConsumer { builder ->
80
+ setSslContext(builder, config, externalTrustManagerProvider)
81
+ }
66
82
.build()
67
83
val osClient = kubeClient.adapt(NamespacedOpenShiftClient ::class .java)
68
84
val isOpenShift = isOpenShift(osClient)
@@ -73,10 +89,16 @@ abstract class ClientAdapter<C: KubernetesClient>(private val fabric8Client: C)
73
89
}
74
90
}
75
91
76
- private fun setAcceptCertificates (config : Config ) {
77
- val manager = CertificateManager .getInstance().state;
78
- config.isTrustCerts = manager.ACCEPT_AUTOMATICALLY
79
- config.isDisableHostnameVerification = manager.ACCEPT_AUTOMATICALLY
92
+ private fun setSslContext (
93
+ builder : HttpClient .Builder ,
94
+ config : Config ,
95
+ externalTrustManagerProvider : (toIntegrate: Array <out X509ExtendedTrustManager >) -> X509TrustManager
96
+ ) {
97
+ val clientTrustManagers = SSLUtils .trustManagers(config)
98
+ .filterIsInstance<X509ExtendedTrustManager >()
99
+ .toTypedArray()
100
+ val externalTrustManager = externalTrustManagerProvider.invoke(clientTrustManagers)
101
+ builder.sslContext(SSLUtils .keyManagers(config), arrayOf(externalTrustManager))
80
102
}
81
103
82
104
private fun isOpenShift (osClient : NamespacedOpenShiftClient ): Boolean {
0 commit comments