/******************************************************************************* * Copyright (c) 2015 Red Hat. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Red Hat - Initial Contribution *******************************************************************************/ package org.eclipse.linuxtools.internal.docker.core; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * TCP Connection settings */ public class TCPConnectionSettings extends BaseConnectionSettings { /** * the host to connect to (a URI representation, including 'tcp' scheme and * port number). */ private final String host; private String ipaddr; public final Pattern ipaddrPattern = Pattern .compile("[a-z]*://([0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+)[:]*[0-9]*"); /** * absolute path to folder containing the certificates (ca.pem, key.pem and * cert.pem). */ private final String pathToCertificates; /** * Constructor * * @param host * host to connect to * @param pathToCertificates * absolute path to folder containing the certificates */ public TCPConnectionSettings(final String host, final String pathToCertificates) { super(); this.host = new HostBuilder(host).enableTLS(pathToCertificates); this.pathToCertificates = pathToCertificates; } @Override public BindingType getType() { return BindingType.TCP_CONNECTION; } @Override public Object[] getProperties() { return new Object[] { new Object[] { "Type", this.getType().toString() }, //$NON-NLS-1$ new Object[] { "Host", this.getHost() }, //$NON-NLS-1$ new Object[] { "Certificates", //$NON-NLS-1$ this.getPathToCertificates() }, }; } /** * @return the ip address for the host */ public String getAddr() { if (ipaddr == null) { Matcher m = ipaddrPattern.matcher(host); if (m.matches()) { ipaddr = m.group(1); } else { ipaddr = ""; } } return ipaddr; } /** * @return the host */ public String getHost() { return host; } public boolean hasHost() { return this.host != null && !this.host.isEmpty(); } /** * @return the tlsVerify */ public boolean isTlsVerify() { return this.pathToCertificates != null; } /** * @return the pathToCertificates */ public String getPathToCertificates() { return pathToCertificates; } /** * A utility class to build the actual {@code host} field from the given * input by setting the correct {@code http} or {@code https} scheme. */ private static class HostBuilder { private static String HTTP_SCHEME = "http://"; //$NON-NLS-1$ private static String TCP_SCHEME = "tcp://"; //$NON-NLS-1$ private static String HTTPS_SCHEME = "https://"; //$NON-NLS-1$ private final String host; public HostBuilder(final String host) { if (host == null || host.isEmpty()) { this.host = ""; } else if (!host.matches("\\w+://.*")) { //$NON-NLS-1$ this.host = HTTP_SCHEME + host; } else { this.host = host.replace(TCP_SCHEME, HTTP_SCHEME); } } public String enableTLS(final String pathToCertificates) { if (pathToCertificates == null || pathToCertificates.isEmpty()) { return this.host; } // enforce 'https' return this.host.replace(HTTP_SCHEME, HTTPS_SCHEME); } } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((host == null) ? 0 : host.hashCode()); result = prime * result + ((pathToCertificates == null) ? 0 : pathToCertificates.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) { return true; } if (getClass() != obj.getClass()) { return false; } TCPConnectionSettings other = (TCPConnectionSettings) obj; if (host == null) { if (other.host != null) { return false; } } else if (!host.equals(other.host)) { return false; } if (pathToCertificates == null) { if (other.pathToCertificates != null) { return false; } } else if (!pathToCertificates.equals(other.pathToCertificates)) { return false; } return true; } }