package org.marketcetera.client; import org.marketcetera.util.log.SLF4JLoggerProxy; import org.marketcetera.util.misc.ClassVersion; import org.apache.commons.lang.ObjectUtils; import javax.security.auth.spi.LoginModule; import javax.security.auth.Subject; import javax.security.auth.login.LoginException; import javax.security.auth.login.FailedLoginException; import javax.security.auth.callback.*; import java.util.Map; import java.util.Set; import java.util.HashSet; import java.io.IOException; import java.security.Principal; import com.sun.security.auth.UserPrincipal; /* $License$ */ /** * * A Test login module to aid testing of Client via {@link MockServer}. * It allows login when the username is the same as the password. * * @author anshul@marketcetera.com */ @ClassVersion("$Id: MockLoginModule.java 16154 2012-07-14 16:34:05Z colin $") //$NON-NLS-1$ public class MockLoginModule implements LoginModule { @Override public void initialize(Subject subject, CallbackHandler callbackHandler, Map<String, ?> sharedState, Map<String, ?> options) { this.subject = subject; this.callback = callbackHandler; } @Override public boolean login() throws LoginException { Callback[] callbacks = new Callback[2]; callbacks[0] = new NameCallback("Name"); callbacks[1] = new PasswordCallback("Password",false); try { callback.handle(callbacks); } catch (UnsupportedCallbackException e) { final LoginException ex = new FailedLoginException(e.getMessage()); ex.initCause(e); throw ex; } catch (IOException e) { final LoginException ex = new FailedLoginException(e.getMessage()); ex.initCause(e); throw ex; } username = ((NameCallback)callbacks[0]).getName(); char [] password = ((PasswordCallback)callbacks[1]).getPassword(); String pass = String.valueOf(password); if(!ObjectUtils.equals(username, pass)) { throw new FailedLoginException(username + "<>" + pass); } SLF4JLoggerProxy.debug(this,"login done for user {}",username); //$NON-NLS-1$ return true; } @Override public boolean commit() throws LoginException { principals.add(new UserPrincipal(username)); subject.getPrincipals().addAll(principals); return true; } @Override public boolean abort() throws LoginException { SLF4JLoggerProxy.debug(this,"Aborting login for user {}",username); //$NON-NLS-1$ clear(); return true; } @Override public boolean logout() throws LoginException { subject.getPrincipals().removeAll(principals); principals.clear(); clear(); return true; } private void clear() { username = null; } private Subject subject; private CallbackHandler callback; private Set<Principal> principals = new HashSet<Principal>(); private String username; }