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

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

import fi.codecrew.moya.beans.EventBean;
import fi.codecrew.moya.facade.LanEventPropertyFacade;
import fi.codecrew.moya.utilities.UserLoginUtils;
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 EventBean eventbean;
	@EJB
	private LanEventPropertyFacade eventPropertyFacade;

	@Override
	public AuthenticationResult authenticate(String jaasUsername, String password) {
		String username = UserLoginUtils.getUsernameFromJaasString(jaasUsername);
		String domain = UserLoginUtils.getDomainFromJaasString(jaasUsername);
		LanEvent event = eventbean.getEventForHostname(domain);

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

	private EventUser tryLogin(String username, String password, LanEvent event) {
		// username = username.trim().toLowerCase();
		EventUser eventUser = eventUserFacade.findByLogin(username, event);
		// 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();
		}

		// If there is no eventuser found, try to create one.
		if (user != null) {

			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 = eventPropertyFacade.find(event, LanEventPropertyKey.INVITE_ONLY_EVENT);

			boolean createEventuser = true;
			if (inviteonly != null && inviteonly.isBooleanValue()) {
				createEventuser = false;
			}
			if (createEventuser && user != null && eventUser == null) {
				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, event), "Login failed: Username not found: ", username);
		}

		return eventUser;
	}

}