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

import java.security.Principal;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashSet;
import java.util.Set;
import java.util.Vector;

import javax.annotation.Resource;
import javax.annotation.security.DeclareRoles;
import javax.ejb.EJB;
import javax.ejb.SessionContext;
import javax.ejb.Stateless;

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

import fi.insomnia.bortal.facade.AccessRightFacade;
import fi.insomnia.bortal.facade.RoleFacade;
import fi.insomnia.bortal.facade.UserFacade;
import fi.insomnia.bortal.model.AccessRight;
import fi.insomnia.bortal.model.Event;
import fi.insomnia.bortal.model.Role;
import fi.insomnia.bortal.model.RoleRight;
import fi.insomnia.bortal.model.User;

/**
 * Session Bean implementation class SessionHandlerBean
 */
@Stateless
@DeclareRoles("admin")
public class SessionHandlerBean implements SessionHandlerBeanLocal, SessionHandlerBeanRemote {

    private static final Logger logger = LoggerFactory.getLogger(SessionHandlerBean.class);
    @EJB
    private UserFacade userfacade;
    @EJB
    private AccessRightFacade accessRightFacade;
    @EJB
    private RoleFacade roleFacade;
    @Resource
    private SessionContext context;

    @EJB
    private UserBean userbean;

    /**
     * Default constructor.
     */
    public SessionHandlerBean() {
        // TODO Auto-generated constructor stub
    }

    @Override
    public boolean hasPermission(String target, User user, RolePermission permission) {

        if (user == null) {
            return false;
        }
        AccessRight expectedRight = accessRightFacade.findOrCreateByName(target);

        User dbusr = userfacade.find(user.getId());
        if (dbusr != null) {
            Set<Role> checkedRoles = new HashSet<Role>();
            for (Role r : dbusr.getRoles()) {
                if (getRights(r, expectedRight, permission, checkedRoles)) {
                    return true;
                }
            }
        }
        return false;
    }

    private static boolean getRights(Role role, AccessRight expectedRight, RolePermission permission, Set<Role> checkedRoles) {

        if (checkedRoles.contains(role)) {
            return false;
        }

        for (RoleRight rr : role.getRoleRights()) {
            if (rr.getAccessRight().equals(expectedRight)) {
                switch (permission) {
                case READ:
                    if (rr.getRead()) {
                        return true;
                    }
                    break;
                case WRITE:
                    if (rr.getWrite()) {
                        return true;
                    }
                    break;
                case EXECUTE:
                    if (rr.isExecute()) {
                        return true;
                    }
                }
            }
        }
        checkedRoles.add(role);

        for (Role r : role.getParents()) {
            if (getRights(r, expectedRight, permission, checkedRoles)) {
                return true;
            }

        }
        return false;

    }

    public User tryLogin(String username, String password) {
        User user = userfacade.findByLogin(username.trim());

        if (user != null && user.checkPassword(password)) {
            return user;
        }

        return null;
    }

    /**
     * Makes sure default user and public role exist and the user is member of
     * the role.
     */
    public User getDefaultUser(Event event) {
        Role publicRole = roleFacade.getOrCreatePublicRole(event);
        User defaultUser = userfacade.getOrCreateDefaultUser();
        if (!defaultUser.getRoles().contains(publicRole)) {
            ArrayList<Role> userRoles = new ArrayList<Role>();
            userRoles.add(publicRole);
            defaultUser.setRoles(userRoles);
        }
        return defaultUser;
    }

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

    @Override
    public Enumeration<String> getGroupNames(String user) {
        Vector<String> foo = new Vector<String>();
        foo.add("admin");
        return foo.elements();
    }

    @Override
    public User getCurrentUser(Event event) {
        Principal principal = context.getCallerPrincipal();
        User ret = userbean.getUser(principal.getName());
        if (ret == null) {
            ret = getDefaultUser(event);
        }
        return ret;
    }
}