/*************************************************** * * cismet GmbH, Saarbruecken, Germany * * ... and it just works. * ****************************************************/ /* * To change this template, choose Tools | Templates * and open the template in the editor. */ package de.cismet.security; import org.apache.commons.httpclient.UsernamePasswordCredentials; import org.apache.commons.httpclient.auth.CredentialsNotAvailableException; 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.net.URL; import java.util.prefs.Preferences; import javax.swing.JFrame; import de.cismet.tools.gui.StaticSwingTools; /** * DOCUMENT ME! * * @author spuhl * @version $Revision$, $Date$ */ public abstract class PasswordDialog extends LoginService { //~ Static fields/initializers --------------------------------------------- private static final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(PasswordDialog.class); //~ Instance fields -------------------------------------------------------- protected DefaultUserNameStore usernames; protected Component parent; protected boolean isAuthenticationDone = false; protected URL url; private Preferences appPrefs = null; private UsernamePasswordCredentials creds; private JFrame parentFrame; private boolean isAuthenticationCanceled = false; private Object dummy = new Object(); private String username = null; private String title; private String prefTitle; //~ Constructors ----------------------------------------------------------- /** * Creates a new PasswordDialog object. * * @param url DOCUMENT ME! */ public PasswordDialog(final URL url) { super(); if (log.isDebugEnabled()) { log.debug("Creating new PaswordDialog Instance for URL: " + url.toString()); // NOI18N } this.url = url; } /** * Creates a new PasswordDialog object. * * @param url DOCUMENT ME! * @param parentComponent DOCUMENT ME! */ public PasswordDialog(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! * * @param creds DOCUMENT ME! */ public void setUsernamePassword(final UsernamePasswordCredentials creds) { this.creds = creds; } /** * DOCUMENT ME! * * @return DOCUMENT ME! * * @throws CredentialsNotAvailableException DOCUMENT ME! */ public UsernamePasswordCredentials getCredentials() 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; requestUsernamePassword(); return creds; } } /** * DOCUMENT ME! * * @throws CredentialsNotAvailableException DOCUMENT ME! */ private void requestUsernamePassword() throws CredentialsNotAvailableException { if (log.isDebugEnabled()) { log.debug("requestUsernamePassword"); // NOI18N } 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 = WebAccessManager.getInstance().getServerAliasProperty(url.toString()); if (title != null) { final String msg = org.openide.util.NbBundle.getMessage( PasswordDialog.class, "PasswordDialog.requestUsernamePassword().login.message"); login.setMessage(msg + " \"" + 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 } final String msg = org.openide.util.NbBundle.getMessage( PasswordDialog.class, "PasswordDialog.requestUsernamePassword().login.message"); login.setMessage(msg + "\n" + " \"" + 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) { } login.setVisible(true); dialog.setAlwaysOnTop(true); dialog.setVisible(true); if (!isAuthenticationDone) { isAuthenticationCanceled = true; throw new CredentialsNotAvailableException(); } } @Override public abstract boolean authenticate(String name, char[] password, String server) throws Exception; /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public boolean isAuthenticationCanceled() { return isAuthenticationCanceled; } /** * DOCUMENT ME! * * @param title DOCUMENT ME! */ public void setTitle(final String title) { this.title = title; } }