blob: da3d6322f783ad82ad25caab41497b7f97cc27a0 [file] [log] [blame]
/*
* Copyright (c) 2015 Eike Stepper (Berlin, Germany) and others.
* 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:
* Eike Stepper - initial API and implementation
*/
package org.eclipse.oomph.setup.internal.sync;
import org.eclipse.oomph.base.util.BaseResourceFactoryImpl;
import org.eclipse.oomph.base.util.BaseUtil;
import org.eclipse.oomph.util.HexUtil;
import org.eclipse.oomph.util.IOExceptionWithCause;
import org.eclipse.oomph.util.IOUtil;
import org.eclipse.emf.common.CommonPlugin;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.core.internal.net.ProxyManager;
import org.eclipse.core.net.proxy.IProxyData;
import org.eclipse.core.net.proxy.IProxyService;
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 java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.InetAddress;
import java.net.URI;
import java.net.UnknownHostException;
import java.security.NoSuchAlgorithmException;
/**
* @author Eike Stepper
*/
@SuppressWarnings("restriction")
public final class SyncUtil
{
private static final IProxyService PROXY_MANAGER = getProxyManager();
private SyncUtil()
{
}
private static final String PROP_HTTP_AUTH_NTLM_DOMAIN = "http.auth.ntlm.domain";
private static final String ENV_USER_DOMAIN = "USERDOMAIN";
private static final String DOUBLE_BACKSLASH = "\\\\";
public static ResourceSet createResourceSet()
{
ResourceSet resourceSet = new ResourceSetImpl();
resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put("*", new BaseResourceFactoryImpl());
return resourceSet;
}
public static void inititalizeFile(File file, EClass eClass, ResourceSet resourceSet)
{
if (file.length() == 0)
{
EObject rootObject = EcoreUtil.create(eClass);
Resource resource = resourceSet.createResource(org.eclipse.emf.common.util.URI.createFileURI(file.getAbsolutePath()));
resource.getContents().add(rootObject);
BaseUtil.saveEObject(rootObject);
}
}
public static String getDigest(File file) throws IOException
{
if (!file.exists())
{
return null;
}
FileInputStream contents = null;
try
{
contents = new FileInputStream(file);
return HexUtil.bytesToHex(IOUtil.getSHA1(contents));
}
catch (IOException ex)
{
throw ex;
}
catch (NoSuchAlgorithmException ex)
{
throw new IOExceptionWithCause(ex);
}
finally
{
IOUtil.closeSilent(contents);
}
}
public static void deleteFile(File file) throws IOException
{
if (file.isFile())
{
if (!file.delete())
{
throw new IOException("Could not delete file " + file);
}
}
}
public static HttpHost getProxyHost(URI uri)
{
IProxyData proxy = getProxyData(uri);
if (proxy != null)
{
return new HttpHost(proxy.getHost(), proxy.getPort());
}
return null;
}
public static Executor proxyAuthentication(Executor executor, URI uri) throws IOException
{
IProxyData proxy = getProxyData(uri);
if (proxy != null)
{
HttpHost proxyHost = new HttpHost(proxy.getHost(), proxy.getPort());
String proxyUserID = proxy.getUserId();
if (proxyUserID != null)
{
String userID = getUserName(proxyUserID);
String password = proxy.getPassword();
String workstation = getWorkstation();
String domain = getUserDomain(proxyUserID);
return executor.auth(new AuthScope(proxyHost, AuthScope.ANY_REALM, "ntlm"), new NTCredentials(userID, password, workstation, domain))
.auth(new AuthScope(proxyHost, AuthScope.ANY_REALM, AuthScope.ANY_SCHEME), new UsernamePasswordCredentials(userID, password));
}
}
return executor;
}
private static String getWorkstation()
{
try
{
return InetAddress.getLocalHost().getHostName();
}
catch (UnknownHostException e)
{
return null;
}
}
private static String getUserDomain(String userName)
{
String domain = System.getProperty(PROP_HTTP_AUTH_NTLM_DOMAIN);
if (domain != null)
{
return domain;
}
domain = System.getenv(ENV_USER_DOMAIN);
if (domain != null)
{
return domain;
}
if (userName != null)
{
int pos = userName.indexOf(DOUBLE_BACKSLASH);
if (pos != -1)
{
return userName.substring(0, pos);
}
}
return null;
}
private static String getUserName(String userName)
{
if (userName != null)
{
int pos = userName.indexOf(DOUBLE_BACKSLASH);
if (pos != -1)
{
return userName.substring(pos + DOUBLE_BACKSLASH.length());
}
}
return userName;
}
// public static String getProxyUser(URI uri)
// {
// IProxyData proxy = getProxyData(uri);
// if (proxy != null)
// {
// String userID = proxy.getUserId();
// if (userID != null)
// {
// return getUserName(userID);
// }
// }
//
// return null;
// }
//
// public static String getProxyPassword(URI uri)
// {
// IProxyData proxy = getProxyData(uri);
// if (proxy != null)
// {
// String userID = proxy.getUserId();
// if (userID != null)
// {
// return proxy.getPassword();
// }
// }
//
// return null;
// }
private static IProxyData getProxyData(URI uri)
{
if (PROXY_MANAGER != null)
{
IProxyData[] proxies = PROXY_MANAGER.select(uri);
if (proxies.length != 0)
{
return proxies[0];
}
}
return null;
}
private static IProxyService getProxyManager()
{
try
{
if (CommonPlugin.IS_ECLIPSE_RUNNING)
{
return ProxyManager.getProxyManager();
}
}
catch (Throwable ex)
{
//$FALL-THROUGH$
}
return null;
}
}