/* * Copyright (C) 2013, 2020 Christian Halstrick and others * * This program and the accompanying materials are made available under the * terms of the Eclipse Distribution License v. 1.0 which is available at * https://www.eclipse.org/org/documents/edl-v10.php. * * SPDX-License-Identifier: BSD-3-Clause */ package org.eclipse.jgit.transport.http; import java.io.IOException; import java.net.Proxy; import java.net.URL; import java.security.GeneralSecurityException; import java.text.MessageFormat; import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSocket; import javax.net.ssl.SSLSocketFactory; import javax.net.ssl.TrustManager; import org.eclipse.jgit.internal.JGitText; import org.eclipse.jgit.internal.transport.http.DelegatingSSLSocketFactory; import org.eclipse.jgit.util.HttpSupport; /** * A factory returning instances of * {@link org.eclipse.jgit.transport.http.JDKHttpConnection} * * @since 3.3 */ public class JDKHttpConnectionFactory implements HttpConnectionFactory2 { @Override public HttpConnection create(URL url) throws IOException { return new JDKHttpConnection(url); } @Override public HttpConnection create(URL url, Proxy proxy) throws IOException { return new JDKHttpConnection(url, proxy); } @Override public GitSession newSession() { return new JdkConnectionSession(); } private static class JdkConnectionSession implements GitSession { private SSLContext securityContext; private SSLSocketFactory socketFactory; @Override public JDKHttpConnection configure(HttpConnection connection, boolean sslVerify) throws GeneralSecurityException { if (!(connection instanceof JDKHttpConnection)) { throw new IllegalArgumentException(MessageFormat.format( JGitText.get().httpWrongConnectionType, JDKHttpConnection.class.getName(), connection.getClass().getName())); } JDKHttpConnection conn = (JDKHttpConnection) connection; String scheme = conn.getURL().getProtocol(); if (!"https".equals(scheme) || sslVerify) { //$NON-NLS-1$ // sslVerify == true: use the JDK defaults return conn; } if (securityContext == null) { securityContext = SSLContext.getInstance("TLS"); //$NON-NLS-1$ TrustManager[] trustAllCerts = { new NoCheckX509TrustManager() }; securityContext.init(null, trustAllCerts, null); socketFactory = new DelegatingSSLSocketFactory( securityContext.getSocketFactory()) { @Override protected void configure(SSLSocket socket) { HttpSupport.configureTLS(socket); } }; } conn.setHostnameVerifier((name, session) -> true); ((HttpsURLConnection) conn.wrappedUrlConnection) .setSSLSocketFactory(socketFactory); return conn; } @Override public void close() { securityContext = null; socketFactory = null; } } }