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

import java.util.HashSet;
import java.util.Set;

import javax.annotation.Resource;
import javax.ejb.EJB;
import javax.ejb.SessionContext;
import javax.ejb.Stateless;
import javax.servlet.http.HttpSession;

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

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

/**
 * Session Bean implementation class SessionHandlerBean
 */
@Stateless
public class SessionHandlerBean implements SessionHandlerBeanLocal {

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

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


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

        AccessRight expectedRight = accessRightFacade.findOrCreateByName(target);

        User dbusr = userfacade.find(user.getId());
        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.hashPassword(password).equals(user.getPassword())*/ true) {
            return user;
        }
        
        return null;
    }

    public User getDefaultUser() {
        throw new UnsupportedOperationException("Not supported yet.");
    }
}