/*!
* This program is free software; you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software
* Foundation.
*
* You should have received a copy of the GNU Lesser General Public License along with this
* program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
* or from the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU Lesser General Public License for more details.
*
* Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved.
*/
package org.pentaho.reporting.designer.core.settings;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.pentaho.reporting.libraries.base.util.StringUtils;
import org.pentaho.reporting.libraries.xmlns.common.ParserUtil;
import java.net.Authenticator;
import java.net.PasswordAuthentication;
import java.util.prefs.BackingStoreException;
import java.util.prefs.Preferences;
/**
* User: Martin Date: 03.03.2006 Time: 14:12:13
*/
public class ProxySettings {
private class SettingsAuthenticator extends Authenticator {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication( getProxyUser(),
getProxyPassword().toCharArray() );
}
}
public static final String HTTP_DOT_PROXY_HOST = "http.proxyHost";
public static final String HTTP_DOT_PROXY_PORT = "http.proxyPort";
public static final String SOCKS_PROXY_HOST = "socksProxyHost";
public static final String SOCKS_PROXY_PORT = "socksProxyPort";
public static final String DEPLOYMENT_PROXY_HTTP_HOST = "deployment.proxy.http.host";
public static final String DEPLOYMENT_PROXY_HTTP_PORT = "deployment.proxy.http.port";
public static final String DEPLOYMENT_PROXY_SOCKS_HOST = "deployment.proxy.socks.host";
public static final String DEPLOYMENT_PROXY_SOCKS_PORT = "deployment.proxy.socks.port";
public static final String PROXY_PORT = "proxyPort";
public static final String PROXY_HOST = "proxyHost";
private static final Log logger = LogFactory.getLog( ProxySettings.class );
private static ProxySettings instance;
private static final String PROXY_TYPE_KEY = "ProxyType";
private static final String PROXY_USER_KEY = "ProxyUser";
private static final String PROXY_PASSWORD_KEY = "ProxyPassword";
private static final String USE_SOCKS_PROXY_KEY = "UseSocksProxy";
public static synchronized ProxySettings getInstance() {
if ( instance == null ) {
instance = new ProxySettings();
}
return instance;
}
private Preferences preferences;
public ProxySettings() {
preferences = Preferences.userRoot().node( "org/pentaho/reporting/designer/core/settings/proxy-settings" );//NON-NLS
}
public void installAuthenticator() {
Authenticator.setDefault( new SettingsAuthenticator() );
}
public ProxyType getProxyType() {
final String unitText = preferences.get( PROXY_TYPE_KEY, ProxyType.AUTO_DETECT_PROXY.toString() );
try {
return ProxyType.valueOf( unitText );
} catch ( Exception e ) {
return null;
}
}
public void setProxyType( final ProxyType proxyType ) {
if ( proxyType == null ) {
throw new IllegalArgumentException( "proxyType must not be null" );
}
preferences.put( PROXY_TYPE_KEY, String.valueOf( proxyType ) );
}
public String getHTTPProxyHost() {
return preferences.get( HTTP_DOT_PROXY_HOST, System.getProperty( HTTP_DOT_PROXY_HOST ) );
}
public void setHTTPProxyHost( final String httpProxyHost ) {
//noinspection ConstantConditions
if ( httpProxyHost == null ) {
preferences.remove( HTTP_DOT_PROXY_HOST );
} else {
preferences.put( HTTP_DOT_PROXY_HOST, httpProxyHost );
}
}
public int getHTTPProxyPort() {
return preferences
.getInt( HTTP_DOT_PROXY_PORT, ParserUtil.parseInt( System.getProperty( HTTP_DOT_PROXY_PORT ), -1 ) );
}
public void setHTTPProxyPort( final int httpProxyPort ) {
preferences.putInt( HTTP_DOT_PROXY_PORT, httpProxyPort );
}
public String getProxyUser() {
return preferences.get( PROXY_USER_KEY, "" );
}
public void setProxyUser( final String proxyUser ) {
preferences.put( PROXY_USER_KEY, proxyUser );
}
public String getProxyPassword() {
return preferences.get( PROXY_PASSWORD_KEY, "" );
}
public void setProxyPassword( final String proxyPassword ) {
preferences.put( PROXY_PASSWORD_KEY, proxyPassword );
}
public boolean isUseSocksProxy() {
return preferences.getBoolean( USE_SOCKS_PROXY_KEY, false );
}
public void setUseSocksProxy( final boolean useSocksProxy ) {
preferences.putBoolean( USE_SOCKS_PROXY_KEY, useSocksProxy );
}
public int getSocksProxyPort() {
return preferences.getInt( SOCKS_PROXY_PORT, ParserUtil.parseInt( System.getProperty( SOCKS_PROXY_PORT ), -1 ) );
}
public void setSocksProxyPort( final int socksProxyPort ) {
preferences.putInt( SOCKS_PROXY_PORT, socksProxyPort );
}
public String getSocksProxyHost() {
return preferences.get( SOCKS_PROXY_HOST, System.getProperty( SOCKS_PROXY_HOST ) );
}
public void setSocksProxyHost( final String socksProxyHost ) {
//noinspection ConstantConditions
if ( socksProxyHost == null ) {
preferences.remove( SOCKS_PROXY_HOST );
} else {
preferences.put( SOCKS_PROXY_HOST, socksProxyHost );
}
}
public void applySettings() {
try {
System.setProperty( HTTP_DOT_PROXY_HOST, "" );
System.setProperty( HTTP_DOT_PROXY_PORT, "" );
System.setProperty( SOCKS_PROXY_HOST, "" );
System.setProperty( SOCKS_PROXY_PORT, "" );
switch( getProxyType() ) {
case AUTO_DETECT_PROXY: {
final String host = getWebstartHTTPProxyHost();
boolean httpProxySet = false;
if ( host != null && host.trim().length() > 0 ) {
System.setProperty( HTTP_DOT_PROXY_HOST, host );
httpProxySet = true;
}
final String port = getWebstartHTTPProxyPort();
if ( port != null ) {
System.setProperty( HTTP_DOT_PROXY_PORT, port );
}
if ( !httpProxySet ) {
final String socksHost = getWebstartSOCKSProxyHost();
if ( StringUtils.isEmpty( socksHost, true ) == false ) {
System.setProperty( SOCKS_PROXY_HOST, socksHost );
}
final String socksPort = getWebstartSOCKSProxyPort();
if ( StringUtils.isEmpty( socksPort, true ) == false ) {
System.setProperty( SOCKS_PROXY_PORT, socksPort );
}
}
break;
}
case NO_PROXY: {
break;
}
case USER_PROXY: {
if ( isUseSocksProxy() ) {
System.setProperty( HTTP_DOT_PROXY_HOST, "" );
System.setProperty( HTTP_DOT_PROXY_PORT, "" );
final String host = getSocksProxyHost();
if ( StringUtils.isEmpty( host ) == false ) {
System.setProperty( SOCKS_PROXY_HOST, host );
}
final int port = getSocksProxyPort();
if ( port != -1 ) {
System.setProperty( SOCKS_PROXY_PORT, String.valueOf( port ) );
}
} else {
final String host = getHTTPProxyHost();
if ( StringUtils.isEmpty( host ) == false ) {
System.setProperty( HTTP_DOT_PROXY_HOST, host );
}
final int port = getHTTPProxyPort();
if ( port != -1 ) {
System.setProperty( HTTP_DOT_PROXY_PORT, String.valueOf( port ) );
}
System.setProperty( SOCKS_PROXY_HOST, "" );
System.setProperty( SOCKS_PROXY_PORT, "" );
}
break;
}
}
} catch ( Throwable t ) {
logger.error( "Failed to configure proxy settings.", t );
}
printProxyConfiguration();
}
private void printProxyConfiguration() {
logger.info( HTTP_DOT_PROXY_HOST + System.getProperty( HTTP_DOT_PROXY_HOST, "<undefined>" ) );
logger.info( HTTP_DOT_PROXY_PORT + System.getProperty( HTTP_DOT_PROXY_PORT, "<undefined>" ) );
logger.info( SOCKS_PROXY_HOST + System.getProperty( SOCKS_PROXY_HOST, "<undefined>" ) );
logger.info( SOCKS_PROXY_PORT + System.getProperty( SOCKS_PROXY_PORT, "<undefined>" ) );
}
private static String getWebstartHTTPProxyHost() {
final String host = System.getProperty( DEPLOYMENT_PROXY_HTTP_HOST );
if ( host != null ) {
return host;
}
return System.getProperty( PROXY_HOST );
}
private static String getWebstartHTTPProxyPort() {
final String port = System.getProperty( DEPLOYMENT_PROXY_HTTP_PORT );
if ( port != null ) {
return port;
}
return System.getProperty( PROXY_PORT );
}
private static String getWebstartSOCKSProxyHost() {
return System.getProperty( DEPLOYMENT_PROXY_SOCKS_HOST );
}
private static String getWebstartSOCKSProxyPort() {
return System.getProperty( DEPLOYMENT_PROXY_SOCKS_PORT );
}
public void flush() {
try {
preferences.flush();
} catch ( BackingStoreException e ) {
e.printStackTrace();
}
}
}