blob: 82e7ca5abd5ba1f2e51132a6af1acb6130b40637 [file] [log] [blame]
/**
* Copyright (c) 2014 Codetrails GmbH.
* 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
*/
package org.eclipse.epp.internal.logging.aeri.ide.server;
import static com.google.common.base.Optional.*;
import static org.apache.commons.lang3.ArrayUtils.isEmpty;
import static org.apache.commons.lang3.StringUtils.*;
import java.io.IOException;
import java.net.InetAddress;
import java.net.URI;
import java.net.UnknownHostException;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.HttpHost;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.NTCredentials;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.fluent.Executor;
import org.eclipse.core.internal.net.ProxyManager;
import org.eclipse.core.net.proxy.IProxyData;
import com.google.common.base.Optional;
@SuppressWarnings("restriction")
public final class Proxies {
private Proxies() {
// Not meant to be instantiated
}
private static final String DOUBLEBACKSLASH = "\\\\"; //$NON-NLS-1$
private static final String ENV_USERDOMAIN = "USERDOMAIN"; //$NON-NLS-1$
private static final String PROP_HTTP_AUTH_NTLM_DOMAIN = "http.auth.ntlm.domain"; //$NON-NLS-1$
/**
* Returns the domain of the current machine- if any.
*
* @param userName
* the user name which may be null. On windows it may contain the domain name as prefix "domain\\username".
*/
public static Optional<String> getUserDomain(String userName) {
// check the app's system properties
String domain = System.getProperty(PROP_HTTP_AUTH_NTLM_DOMAIN);
if (domain != null) {
return of(domain);
}
// check the OS environment
domain = System.getenv(ENV_USERDOMAIN);
if (domain != null) {
return of(domain);
}
// test the user's name whether it may contain an information about the domain name
if (StringUtils.contains(userName, DOUBLEBACKSLASH)) {
return of(substringBefore(userName, DOUBLEBACKSLASH));
}
// no domain name found
return absent();
}
/**
* Returns the host name of this workstation (localhost)
*/
public static Optional<String> getWorkstation() {
try {
return of(InetAddress.getLocalHost().getHostName());
} catch (UnknownHostException e) {
return absent();
}
}
/**
* Returns the user name without a (potential) domain prefix
*
* @param userName
* a String that may look like "domain\\userName"
*/
public static Optional<String> getUserName(String userName) {
if (userName == null) {
return absent();
}
return contains(userName, DOUBLEBACKSLASH) ? of(substringAfterLast(userName, DOUBLEBACKSLASH)) : of(userName);
}
public static Optional<HttpHost> getProxyHost(URI target) {
IProxyData proxy = getProxyData(target).orNull();
if (proxy == null) {
return Optional.absent();
}
return Optional.of(new HttpHost(proxy.getHost(), proxy.getPort()));
}
public static Executor proxyAuthentication(Executor executor, URI target) throws IOException {
IProxyData proxy = getProxyData(target).orNull();
if (proxy != null) {
HttpHost proxyHost = new HttpHost(proxy.getHost(), proxy.getPort());
if (proxy.getUserId() != null) {
String userId = getUserName(proxy.getUserId()).orNull();
String pass = proxy.getPassword();
String workstation = getWorkstation().orNull();
String domain = getUserDomain(proxy.getUserId()).orNull();
return executor
.auth(new AuthScope(proxyHost, AuthScope.ANY_REALM, "ntlm"), new NTCredentials(userId, pass, workstation, domain)) //$NON-NLS-1$
.auth(new AuthScope(proxyHost, AuthScope.ANY_REALM, AuthScope.ANY_SCHEME),
new UsernamePasswordCredentials(userId, pass));
} else {
return executor;
}
}
return executor;
}
private static Optional<IProxyData> getProxyData(URI target) {
IProxyData[] proxies = ProxyManager.getProxyManager().select(target);
if (isEmpty(proxies)) {
return Optional.absent();
}
return Optional.of(proxies[0]);
}
public static Optional<String> getProxyUser(URI target) {
IProxyData proxy = getProxyData(target).orNull();
if (proxy == null) {
return Optional.absent();
}
if (proxy.getUserId() == null) {
return Optional.absent();
}
return getUserName(proxy.getUserId());
}
public static Optional<String> getProxyPassword(URI target) {
IProxyData proxy = getProxyData(target).orNull();
if (proxy == null) {
return Optional.absent();
}
if (proxy.getUserId() == null) {
return Optional.absent();
}
return Optional.fromNullable(proxy.getPassword());
}
}