/*************************************************** * * cismet GmbH, Saarbruecken, Germany * * ... and it just works. * ****************************************************/ /* * GuiCredentialProvider.java * * Created on 18. Oktober 2006, 11:18 * * To change this template, choose Tools | Template Manager * and open the template in the editor. */ package de.cismet.cismap.commons.rasterservice; import org.apache.commons.httpclient.Credentials; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.HttpStatus; import org.apache.commons.httpclient.UsernamePasswordCredentials; import org.apache.commons.httpclient.auth.AuthScheme; import org.apache.commons.httpclient.auth.AuthScope; import org.apache.commons.httpclient.auth.CredentialsNotAvailableException; import org.apache.commons.httpclient.auth.CredentialsProvider; import org.apache.commons.httpclient.auth.NTLMScheme; import org.apache.commons.httpclient.auth.RFC2617Scheme; import org.apache.commons.httpclient.methods.GetMethod; import org.jdesktop.swingx.JXLoginPane; import org.jdesktop.swingx.JXPanel; import org.jdesktop.swingx.auth.DefaultUserNameStore; import org.jdesktop.swingx.auth.LoginService; import java.awt.Component; import java.io.IOException; import java.net.URL; import java.util.prefs.Preferences; import javax.swing.JFrame; import de.cismet.cismap.commons.interaction.CismapBroker; import de.cismet.tools.gui.StaticSwingTools; /** * DOCUMENT ME! * * @author Sebastian * @version $Revision$, $Date$ */ public class GUICredentialsProvider extends LoginService implements CredentialsProvider { //~ Static fields/initializers --------------------------------------------- private static final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger( "de.cismet.cismap.commons.rasterservice.GUICredentialsProvider"); // NOI18N //~ Instance fields -------------------------------------------------------- private DefaultUserNameStore usernames; private Preferences appPrefs = null; private UsernamePasswordCredentials creds; private Component parent; private JFrame parentFrame; private boolean isAuthenticationDone = false; private boolean isAuthenticationCanceled = false; private URL url; private Object dummy = new Object(); private String username = null; private String title; private String prefTitle; private CismapBroker broker = CismapBroker.getInstance(); //~ Constructors ----------------------------------------------------------- /** * Creates a new GUICredentialsProvider object. * * @param url DOCUMENT ME! */ public GUICredentialsProvider(final URL url) { super(); if (log.isDebugEnabled()) { log.debug("Creating new Credential Provider Instance for URL: " + url.toString()); // NOI18N//NOI18N } this.url = url; } /** * Creates a new GUICredentialsProvider object. * * @param url DOCUMENT ME! * @param parentComponent DOCUMENT ME! */ public GUICredentialsProvider(final URL url, final Component parentComponent) { this(url); if (parentComponent != null) { this.parent = (StaticSwingTools.getParentFrame(parentComponent)); if (this.parent == null) { this.parent = (StaticSwingTools.getFirstParentFrame(parentComponent)); } } } //~ Methods ---------------------------------------------------------------- /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public String getUserName() { return creds.getUserName(); } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public UsernamePasswordCredentials getCredentials() { return creds; } /** * DOCUMENT ME! * * @param creds DOCUMENT ME! */ public void setUsernamePassword(final UsernamePasswordCredentials creds) { this.creds = creds; } @Override public Credentials getCredentials( final AuthScheme authscheme, final String host, final int port, final boolean proxy) throws CredentialsNotAvailableException { if (log.isDebugEnabled()) { log.debug("Credentials requested for :" + url.toString() + " alias: " + title); // NOI18N } usernames = new DefaultUserNameStore(); appPrefs = Preferences.userNodeForPackage(this.getClass()); usernames.setPreferences(appPrefs.node("loginURLHash" + Integer.toString(url.toString().hashCode()))); // NOI18N if (creds != null) { return creds; } synchronized (dummy) { if (creds != null) { return creds; } isAuthenticationCanceled = false; if (authscheme == null) { return null; } if (authscheme instanceof NTLMScheme) { requestUsernamePassword(); return creds; } else if (authscheme instanceof RFC2617Scheme) { requestUsernamePassword(); return creds; } else { throw new CredentialsNotAvailableException("Unsupported authentication scheme: " // NOI18N + authscheme.getSchemeName()); } } } /** * DOCUMENT ME! * * @throws CredentialsNotAvailableException DOCUMENT ME! */ public void requestUsernamePassword() throws CredentialsNotAvailableException { final JXLoginPane login = new JXLoginPane(this, null, usernames); final String[] names = usernames.getUserNames(); if (names.length != 0) { username = names[names.length - 1]; } login.setUserName(username); title = broker.getProperty(url.toString()); if (title != null) { // login.setMessage(org.openide.util.NbBundle.getMessage( GUICredentialsProvider.class, "GUICredentialsProvider.requestUsernamePassword().login.message", new Object[] { title })); // NOI18N } else { title = url.toString(); if (title.startsWith("http://") && (title.length() > 21)) { // NOI18N title = title.substring(7, 21) + "..."; // NOI18N } else if (title.length() > 14) { title = title.substring(0, 14) + "..."; // NOI18N } login.setMessage(org.openide.util.NbBundle.getMessage( GUICredentialsProvider.class, "GUICredentialsProvider.requestUsernamePassword().login.message", new Object[] { title })); // NOI18N } if (log.isDebugEnabled()) { log.debug("parentFrame in GUICredentialprovider:" + parent); // NOI18N } final JXLoginPane.JXLoginDialog dialog = new JXLoginPane.JXLoginDialog((JFrame)parent, login); try { ((JXPanel)((JXPanel)login.getComponent(1)).getComponent(1)).getComponent(3).requestFocus(); } catch (Exception skip) { } dialog.setAlwaysOnTop(true); StaticSwingTools.showDialog(dialog); if (!isAuthenticationDone) { isAuthenticationCanceled = true; throw new CredentialsNotAvailableException(); } } @Override public boolean authenticate(final String name, final char[] password, final String server) throws Exception { if (log.isDebugEnabled()) { log.debug("Authentication with username: " + name); // NOI18N } if (testConnection(new UsernamePasswordCredentials(name, new String(password)))) { if (log.isDebugEnabled()) { log.debug("Credentials are valid for URL: " + url.toString()); // NOI18N } usernames.removeUserName(name); usernames.saveUserNames(); usernames.addUserName(name); usernames.saveUserNames(); isAuthenticationDone = true; setUsernamePassword(new UsernamePasswordCredentials(name, new String(password))); return true; } else { if (log.isDebugEnabled()) { log.debug("Credentials are not valid for URL: " + url.toString()); // NOI18N } return false; } } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public boolean isAuthenticationCanceled() { return isAuthenticationCanceled; } /** * DOCUMENT ME! * * @param creds DOCUMENT ME! * * @return DOCUMENT ME! */ public boolean testConnection(final UsernamePasswordCredentials creds) { final HttpClient client = new HttpClient(); final String proxySet = System.getProperty("proxySet"); // NOI18N if ((proxySet != null) && proxySet.equals("true")) { // NOI18N if (log.isDebugEnabled()) { log.debug("proxyIs Set"); // NOI18N log.debug("ProxyHost:" + System.getProperty("http.proxyHost")); // NOI18N } if (log.isDebugEnabled()) { log.debug("ProxyPort:" + System.getProperty("http.proxyPort")); // NOI18N } try { client.getHostConfiguration() .setProxy(System.getProperty("http.proxyHost"), Integer.parseInt(System.getProperty("http.proxyPort"))); // NOI18N } catch (Exception e) { log.error("Problem while setting proxy", e); // NOI18N } } final GetMethod method = new GetMethod(url.toString()); client.getState().setCredentials(new AuthScope(url.getHost(), AuthScope.ANY_PORT, AuthScope.ANY_REALM), creds); method.setDoAuthentication(true); int statuscode = 0; try { statuscode = client.executeMethod(method); } catch (IOException ex) { } if (statuscode == HttpStatus.SC_OK) { method.releaseConnection(); return true; } else { method.releaseConnection(); usernames.removeUserName(creds.getUserName()); return false; } } /** * DOCUMENT ME! * * @param title DOCUMENT ME! */ public void setTitle(final String title) { this.title = title; } }