aboutsummaryrefslogtreecommitdiffstats
path: root/src/main/java/de/thedevstack/conversationsplus/http/HttpClient.java
blob: e1a3806709e5d6cda55b243e8a32099b72ac85d9 (plain)
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
package de.thedevstack.conversationsplus.http;

import org.apache.http.conn.ssl.StrictHostnameVerifier;

import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.X509TrustManager;

import de.thedevstack.conversationsplus.ConversationsPlusApplication;

import eu.siacs.conversations.utils.CryptoHelper;
import eu.siacs.conversations.utils.SSLSocketHelper;

import okhttp3.OkHttpClient;

/**
 * Created by steckbrief on 22.08.2016.
 */
public final class HttpClient {
    private static HttpClient INSTANCE;
    private boolean interactive = false;
    private OkHttpClient client;

    public static void init() {
        INSTANCE = new HttpClient();
    }

    public static synchronized OkHttpClient getClient(boolean interactive) {
        if (INSTANCE.interactive != interactive) {
            INSTANCE.interactive = interactive;
            INSTANCE.buildClient();
        }
        return INSTANCE.client;
    }

    private HttpClient() {
        this.buildClient();
    }

    private void buildClient() {
        OkHttpClient.Builder builder = new OkHttpClient.Builder();
        this.initTrustManager(builder);
        this.client = builder.build();
    }

    public void initTrustManager(final OkHttpClient.Builder builder) {
        final X509TrustManager trustManager;
        final HostnameVerifier hostnameVerifier;
        if (interactive) {
            trustManager = ConversationsPlusApplication.getMemorizingTrustManager();
            hostnameVerifier = ConversationsPlusApplication.getMemorizingTrustManager().wrapHostnameVerifier(
                    new StrictHostnameVerifier());
        } else {
            trustManager = ConversationsPlusApplication.getMemorizingTrustManager()
                    .getNonInteractive();
            hostnameVerifier = ConversationsPlusApplication.getMemorizingTrustManager()
                    .wrapHostnameVerifierNonInteractive(
                            new StrictHostnameVerifier());
        }
        try {
            final SSLContext sc = SSLSocketHelper.getSSLContext();
            sc.init(null, new X509TrustManager[]{trustManager},
                    ConversationsPlusApplication.getSecureRandom());

            final SSLSocketFactory sf = sc.getSocketFactory();
            final String[] cipherSuites = CryptoHelper.getOrderedCipherSuites(
                    sf.getSupportedCipherSuites());
            if (cipherSuites.length > 0) {
                sc.getDefaultSSLParameters().setCipherSuites(cipherSuites);

            }

            builder.sslSocketFactory(sf, trustManager);
            builder.hostnameVerifier(hostnameVerifier);
        } catch (final KeyManagementException | NoSuchAlgorithmException ignored) {
        }
    }
}