NormalAuthPBean.java 3.3 KB
package fi.codecrew.moya.beans.auth;

import javax.ejb.EJB;
import javax.ejb.LocalBean;
import javax.ejb.Stateless;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import fi.codecrew.moya.AuthenticationResult;
import fi.codecrew.moya.beans.EventBeanLocal;
import fi.codecrew.moya.beans.JaasBean.UserType;
import fi.codecrew.moya.beans.LoggingBeanLocal;
import fi.codecrew.moya.facade.EventUserFacade;
import fi.codecrew.moya.facade.UserFacade;
import fi.codecrew.moya.model.EventUser;
import fi.codecrew.moya.model.LanEvent;
import fi.codecrew.moya.model.LanEventProperty;
import fi.codecrew.moya.model.LanEventPropertyKey;
import fi.codecrew.moya.model.User;
import fi.codecrew.moya.utilities.moyamessage.MoyaEventType;

@LocalBean
@Stateless
public class NormalAuthPBean implements AuthenticationFormat {

	private static final Logger logger = LoggerFactory.getLogger(NormalAuthPBean.class);

	@EJB
	private LoggingBeanLocal secubean;
	@EJB
	private EventUserFacade eventUserFacade;
	@EJB
	private UserFacade userfacade;

	@EJB
	private EventBeanLocal eventbean;

	@Override
	public AuthenticationResult authenticate(String username, String password) {

		AuthenticationResult ret = null;
		EventUser retUser = tryLogin(username, password);
		if (retUser != null) {
			ret = new AuthenticationResult();
			ret.setUsertype(UserType.USER.name());
			ret.setUsername(retUser.getLogin());
		}
		return ret;
	}

	public EventUser tryLogin(String username, String password) {
		// username = username.trim().toLowerCase();

		EventUser eventUser = eventUserFacade.findByLogin(username);
		// logger.info("Found eventuser '{}' with username '{}'", eventUser,
		// username);

		User user = null;
		// Might not have EventUser
		if (eventUser == null) {
			user = userfacade.findByLogin(username);
		} else {
			user = eventUser.getUser();
		}

		logger.info("User '{}' with '{}' ", user, username);

		// If there is no eventuser found, try to create one.
		if (user != null) {
			logger.info("TryLogin user not null: {}, login {}", user, user.getLogin());
			if (user.isAnonymous()) {
				logger.info("logging in as anonymous!!!");
			} else if (!user.checkPassword(password)) {

				secubean.sendMessage(MoyaEventType.LOGIN_FAILED, eventUser,
						"Login failed: wrong password for username: ", username);
				eventUser = null;
				user = null;
			}
			LanEventProperty inviteonly = eventbean.getProperty(LanEventPropertyKey.INVITE_ONLY_EVENT);

			boolean createEventuser = true;
			if (inviteonly != null && inviteonly.isBooleanValue()) {
				createEventuser = false;
			}
			if (createEventuser && user != null && eventUser == null) {
				LanEvent event = eventbean.getCurrentEvent();
				eventUser = new EventUser(user, event, null);
				// eventUser.setCreator(eventUser);
				eventUserFacade.create(eventUser);
				eventUserFacade.flush();
				eventUser.setCreator(eventUser);
			}

			// jos logitetaan anomuumi, niin uuden tapahtuman luominen hajoaa
			// jännästi.
			if (user != null && !user.isAnonymous())
				secubean.sendMessage(MoyaEventType.LOGIN_SUCCESSFULL, eventUser, "User logged in with username: '",
						username, "' eventuser: ", eventUser);
		} else {
			secubean.sendMessage(MoyaEventType.LOGIN_FAILED, eventUserFacade.findByLogin(User.ANONYMOUS_LOGINNAME),
					"Login failed: Username not found: ", username);
		}

		return eventUser;
	}

}