package com.ocpsoft.socialpm.gwt.server.rpc; import java.io.IOException; import java.io.Serializable; import javax.enterprise.context.SessionScoped; import javax.enterprise.event.Observes; import javax.enterprise.inject.Produces; import javax.inject.Inject; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.persistence.PersistenceContextType; import org.jboss.errai.bus.server.annotations.Service; import org.jboss.seam.security.CredentialsImpl; import org.jboss.seam.security.Identity; import org.jboss.seam.security.events.DeferredAuthenticationEvent; import org.jboss.seam.security.events.LoggedInEvent; import org.jboss.seam.security.events.LoginFailedEvent; import org.jboss.seam.security.management.IdmAuthenticator; import org.ocpsoft.logging.Logger; import org.picketlink.idm.api.User; import com.ocpsoft.socialpm.gwt.client.shared.rpc.AuthenticationService; import com.ocpsoft.socialpm.gwt.client.shared.rpc.ProfileService; import com.ocpsoft.socialpm.gwt.server.security.authentication.Authenticated; import com.ocpsoft.socialpm.gwt.server.util.PersistenceUtil; import com.ocpsoft.socialpm.model.user.Profile; @SessionScoped @Service public class AuthenticationServiceImpl extends PersistenceUtil implements Serializable, AuthenticationService { private static final long serialVersionUID = -4014251052694227076L; static Logger logger = Logger.getLogger(AuthenticationServiceImpl.class); @PersistenceContext(type = PersistenceContextType.EXTENDED) protected EntityManager em; @Override public EntityManager getEntityManager() { return em; } @Inject private Identity identity; @Inject private CredentialsImpl credential; @Inject private ProfileService profileService; private Profile loggedIn; @Override public Profile login(String username, String password) { if (loggedIn == null) { identity.setAuthenticatorClass(IdmAuthenticator.class); credential.setUsername(username); credential.setPassword(password); String outcome = Identity.RESPONSE_LOGIN_FAILED; try { outcome = identity.login(); } catch (Exception e) { outcome = identity.login(); } if (Identity.RESPONSE_LOGIN_SUCCESS.equals(outcome)) { loggedIn = profileService.getProfileByIdentityKey(identity.getUser().getKey()); } } return loggedIn; } @Override public void logout() { String userKey = identity.getUser().getKey(); identity.setAuthenticatorClass(IdmAuthenticator.class); identity.logout(); logger.info("User logged out [{}]", userKey); } public static void loginSuccess(@Observes final LoggedInEvent event) throws IOException { User user = event.getUser(); logger.info("User logged in [{}, {}]", user.getId(), user.getKey()); } public static void openLoginSuccess(@Observes final DeferredAuthenticationEvent event) { if (event.isSuccess()) logger.info("User logged in with OpenID"); else logger.info("User failed to login via OpenID, potentially due to cancellation"); } public static void loginFailed(@Observes final LoginFailedEvent event, Identity identity) { Exception exception = event.getLoginException(); if (exception != null) { logger.error( "Login failed due to exception" + identity.getAuthenticatorName() + ", " + identity.getAuthenticatorClass() + ", " + identity); } try { Thread.sleep(500); } catch (InterruptedException e) { throw new RuntimeException(e); } } @Override @Produces @Authenticated public Profile getLoggedInProfile() { Profile result = null; if (identity.isLoggedIn() && loggedIn != null) { result = loggedIn; } else if (identity.isLoggedIn() && loggedIn == null) { result = profileService.getProfileByIdentityKey(identity.getUser().getKey()); } return result; } }