/*
* Copyright (c) 2012 Data Harmonisation Panel
*
* All rights reserved. This program and the accompanying materials are made
* available under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation, either version 3 of the License,
* or (at your option) any later version.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this distribution. If not, see <http://www.gnu.org/licenses/>.
*
* Contributors:
* HUMBOLDT EU Integrated Project #030962
* Data Harmonisation Panel <http://www.dhpanel.eu>
*/
package eu.esdihumboldt.hale.ui.util.proxy;
import java.net.Authenticator;
import org.eclipse.equinox.security.storage.SecurePreferencesFactory;
import org.eclipse.equinox.security.storage.StorageException;
import org.eclipse.jface.preference.IPreferenceStore;
import de.fhg.igd.slf4jplus.ALogger;
import de.fhg.igd.slf4jplus.ALoggerFactory;
import eu.esdihumboldt.hale.ui.util.internal.UIUtilitiesPlugin;
import eu.esdihumboldt.hale.ui.util.proxy.preferences.PreferenceConstants;
import eu.esdihumboldt.util.http.ProxyUtil;
/**
* Manages and applies the proxy settings
*
* @author Simon Templer
*/
public class ProxySettings {
private static ALogger log = ALoggerFactory.getLogger(ProxySettings.class);
/**
* Install the proxy settings for them to be initialized when a proxy is
* used from {@link ProxyUtil}
*/
public static void install() {
// try to setup now, if it fails, set it up to do it later
try {
applyCurrentSettings();
} catch (Throwable e) {
log.info("Proxy settings not applied, scheduling it for doing it later on demand", e); //$NON-NLS-1$
ProxyUtil.addInitializer(new Runnable() {
@Override
public void run() {
applyCurrentSettings();
}
});
}
}
/**
* Apply the current proxy settings to the system
*/
public static void applyCurrentSettings() {
// update proxy system properties
IPreferenceStore prefs = UIUtilitiesPlugin.getDefault().getPreferenceStore();
String host = prefs.getString(PreferenceConstants.CONNECTION_PROXY_HOST);
int port = prefs.getInt(PreferenceConstants.CONNECTION_PROXY_PORT);
String nonProxyHosts = prefs.getString(PreferenceConstants.CONNECTION_NON_PROXY_HOSTS);
if (nonProxyHosts != null) {
// support additional delimiters for nonProxyHosts: comma and
// semicolon
// the java mechanism needs the pipe as delimiter
// see also ProxyPreferencePage.performOk
nonProxyHosts = nonProxyHosts.replaceAll(",", "|"); //$NON-NLS-1$ //$NON-NLS-2$
nonProxyHosts = nonProxyHosts.replaceAll(";", "|"); //$NON-NLS-1$ //$NON-NLS-2$
}
if (host == null || host.isEmpty()) {
System.clearProperty("http.proxyHost"); //$NON-NLS-1$
System.clearProperty("http.proxyPort"); //$NON-NLS-1$
System.clearProperty("http.nonProxyHosts"); //$NON-NLS-1$
System.clearProperty("http.proxyUser"); //$NON-NLS-1$
System.clearProperty("http.proxyPassword"); //$NON-NLS-1$
}
else {
System.setProperty("http.proxyHost", host); //$NON-NLS-1$
System.setProperty("http.proxyPort", String.valueOf(port)); //$NON-NLS-1$
if (nonProxyHosts == null || nonProxyHosts.isEmpty()) {
System.clearProperty("http.nonProxyHosts"); //$NON-NLS-1$
}
else {
System.setProperty("http.nonProxyHosts", nonProxyHosts); //$NON-NLS-1$
}
// only check user/password if host is set
String proxyUser = prefs.getString(PreferenceConstants.CONNECTION_PROXY_USER);
if (proxyUser != null && !proxyUser.isEmpty()) {
System.setProperty("http.proxyUser", proxyUser); //$NON-NLS-1$
try {
String password = SecurePreferencesFactory.getDefault()
.node(PreferenceConstants.SECURE_NODE_NAME)
.get(PreferenceConstants.CONNECTION_PROXY_PASSWORD, null);
if (password != null) {
System.setProperty("http.proxyPassword", password); //$NON-NLS-1$
Authenticator.setDefault(new HttpAuth(proxyUser, password));
}
else {
System.clearProperty("http.proxyPassword"); //$NON-NLS-1$
}
} catch (StorageException e) {
log.error("Error accessing secure preferences for proxy password"); //$NON-NLS-1$
}
}
else {
System.clearProperty("http.proxyUser"); //$NON-NLS-1$
System.clearProperty("http.proxyPassword"); //$NON-NLS-1$
}
}
}
}