package org.jboss.seam.security;
import java.io.Serializable;
import javax.enterprise.context.SessionScoped;
import javax.enterprise.event.Observes;
import javax.enterprise.inject.spi.BeanManager;
import javax.inject.Inject;
import javax.inject.Named;
import org.jboss.seam.security.events.CredentialsInitializedEvent;
import org.jboss.seam.security.events.CredentialsUpdatedEvent;
import org.jboss.seam.security.events.LoginFailedEvent;
import org.picketlink.idm.api.Credential;
import org.picketlink.idm.impl.api.PasswordCredential;
/**
* The default Credentials implementation. This implementation allows for a
* username and plain text password to be set, and uses the PasswordCredential
* implementation of the Credential interface for authentication.
*
* @author Shane Bryzak
*/
public @Named("credentials") @SessionScoped class CredentialsImpl implements Credentials, Serializable
{
private static final long serialVersionUID = -2271248957776488426L;
@Inject BeanManager manager;
private String username;
private Credential credential;
private boolean invalid;
private boolean initialized;
public CredentialsImpl() {}
public boolean isInitialized()
{
return initialized;
}
public void setInitialized(boolean initialized)
{
this.initialized = initialized;
}
public String getUsername()
{
if (!isInitialized())
{
setInitialized(true);
manager.fireEvent(new CredentialsInitializedEvent(this));
}
return username;
}
public Credential getCredential()
{
return credential;
}
public void setCredential(Credential credential)
{
this.credential = credential;
}
public void setUsername(String username)
{
if (this.username != username && (this.username == null || !this.username.equals(username)))
{
this.username = username;
invalid = false;
manager.fireEvent(new CredentialsUpdatedEvent());
}
}
public String getPassword()
{
return credential != null && credential instanceof PasswordCredential ?
((PasswordCredential) credential).getValue() : null;
}
public void setPassword(String password)
{
if (this.credential == null)
{
this.credential = new PasswordCredential(password);
}
else if (this.credential != null && this.credential instanceof PasswordCredential &&
((PasswordCredential) this.credential).getValue() != password &&
((PasswordCredential) this.credential).getValue() == null ||
!((PasswordCredential) this.credential).getValue().equals(password))
{
this.credential = new PasswordCredential(password);
invalid = false;
manager.fireEvent(new CredentialsUpdatedEvent());
}
}
public boolean isSet()
{
return getUsername() != null && this.credential != null &&
((PasswordCredential) this.credential).getValue() != null;
}
public boolean isInvalid()
{
return invalid;
}
public void invalidate()
{
invalid = true;
}
public void clear()
{
username = null;
this.credential = null;
initialized = false;
}
public void loginFailed(@Observes LoginFailedEvent event)
{
invalidate();
}
@Override
public String toString()
{
return "Credentials[" + username + "]";
}
}