JaasBean.java 4.41 KB
package fi.insomnia.bortal.beans;

import java.util.Enumeration;
import java.util.HashSet;
import java.util.List;
import java.util.Vector;

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

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

import fi.insomnia.bortal.enums.BortalApplication;
import fi.insomnia.bortal.enums.apps.IAppPermission;
import fi.insomnia.bortal.enums.apps.SpecialPermission;
import fi.insomnia.bortal.enums.apps.UserPermission;
import fi.insomnia.bortal.facade.EventUserFacade;
import fi.insomnia.bortal.facade.UserFacade;
import fi.insomnia.bortal.model.ApplicationPermission;
import fi.insomnia.bortal.model.EventUser;
import fi.insomnia.bortal.model.LanEvent;
import fi.insomnia.bortal.model.Role;
import fi.insomnia.bortal.model.User;

/**
 * Session Bean implementation class SessionHandlerBean
 */
@Stateless
public class JaasBean implements JaasBeanLocal, JaasBeanRemote {

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

	@EJB
	private UserFacade userfacade;

	@EJB
	private EventUserFacade eventUserFacade;

	@EJB
	private LoggingBeanLocal secubean;

	@EJB
	private UserBean userbean;
	@EJB
	private PermissionBeanLocal permbean;
	@EJB
	private EventBeanLocal eventbean;

	public EventUser tryLogin(String username, String password) {

		EventUser eventUser = eventUserFacade.findByLogin(username.trim());

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

		if (user != null) {

			if (user.isAnonymous()) {
				logger.info("logging in as anonymous!!!");
			} else if (!user.checkPassword(password)) {
				secubean.logMessage(SecurityLogType.permissionDenied, eventUser, "Login failed: wrong password for username ", username);
				eventUser = null;
				user = null;
			}
			if (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);
			}
		} else {
			secubean.logMessage(SecurityLogType.permissionDenied, eventbean.getCurrentEvent(), null, "Login failed: Username not found: ", username);
		}

		return eventUser;
	}

	// public static void foo()
	// {
	// if (user != null) {
	// LanEvent event = eventbean.getCurrentEvent();
	// eventUser = new EventUser(user, event, null);
	// // eventUser.setCreator(eventUser);
	// eventUserFacade.create(eventUser);
	// eventUserFacade.flush();
	// eventUser.setCreator(eventUser);
	// }
	// }

	@Override
	public boolean authenticate(String username, String password) {
		boolean ret = (tryLogin(username, password) != null);
		return ret;
	}

	@Override
	public Enumeration<String> getGroupNames(String user) {
		logger.info("Fetching groupNames for user {} event {}", user, eventbean.getCurrentEvent().getName());
		EventUser usr = eventUserFacade.findByLogin(user);
		HashSet<String> roleset = new HashSet<String>();
		roleset.add(UserPermission.ANYUSER.getFullName());

		if (usr == null) {
			if (SpecialPermission.VERKKOMAKSU_CHECKER.name().equals(user)) {
				roleset.add(SpecialPermission.VERKKOMAKSU_CHECKER.name());
			}

			usr = permbean.getAnonEventUser();
			roleset.add(SpecialPermission.ANONYMOUS.name());
		}

		if (!usr.getUser().isAnonymous()) {
			roleset.add(SpecialPermission.USER.name());
		}
		// TODO: EI NÄIN!!!!! Superadmin ei saa kaikkia oikkia!!

		if (usr.getUser().isSuperadmin()) {
			for (BortalApplication app : BortalApplication.values()) {
				for (IAppPermission perm : app.getPermissions()) {
					roleset.add(perm.getFullName());
				}
			}
			roleset.add(SpecialPermission.SUPERADMIN.name());
		} else {

			List<Role> usrroles = userbean.localFindUsersRoles(usr);
			for (Role role : usrroles) {
				for (ApplicationPermission apperm : role.getPermissions()) {
					roleset.add(apperm.getPermission().getFullName());
				}
			}
			LanEvent event = eventbean.getCurrentEvent();

			if (event != null && !usr.getUser().isAnonymous() && event.getDefaultRole() != null) {
				for (ApplicationPermission apperm : event.getDefaultRole().getPermissions()) {
					roleset.add(apperm.getPermission().getFullName());
				}
			}
		}

		Vector<String> retvect = new Vector<String>();
		retvect.addAll(roleset);
		logger.info("group names for user {}: {}", user, retvect);

		return retvect.elements();
	}
}