SessionHandler.java 3.76 KB
/*

 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package fi.insomnia.bortal.handler;

import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;

import fi.insomnia.bortal.HostnameFilter;
import fi.insomnia.bortal.beans.EventBeanLocal;
import fi.insomnia.bortal.beans.SecurityBeanLocal;
import fi.insomnia.bortal.beans.JaasBeanLocal;
import fi.insomnia.bortal.beans.UserBeanLocal;
import fi.insomnia.bortal.enums.Permission;
import fi.insomnia.bortal.enums.RolePermission;
import fi.insomnia.bortal.model.Event;
import fi.insomnia.bortal.model.User;

/**
 * 
 * @author tuukka
 */
@ManagedBean(name = "sessionHandler")
@SessionScoped
public class SessionHandler {

    @EJB
    private JaasBeanLocal handlerbean;
    private User user = null;
    @EJB
    private SecurityBeanLocal secubean;
    @EJB
    private EventBeanLocal eventbean;
    @EJB
    private UserBeanLocal userbean;

    /** Creates a new instance of SessionHandler */
    public SessionHandler() {
    }

    public boolean hasPermission(String target, String permission) {
        RolePermission perm = null;
        if (permission.equalsIgnoreCase("read")) {
            perm = RolePermission.READ;
        } else if (permission.equals("write")) {
            perm = RolePermission.WRITE;
        } else if (permission.equals("execute")) {
            perm = RolePermission.EXECUTE;
        }

        return hasPermission(target, perm);
    }

    private HttpSession getHttpSession() {
        FacesContext ctx = FacesContext.getCurrentInstance();
        HttpSession sess = (HttpSession) ctx.getExternalContext().getSession(false);
        return sess;
    }

    public String getHostname() {
        HttpSession sess = getHttpSession();
        String ret = "";
        if (sess != null) {
            ret = HostnameFilter.getHostname(getHttpSession());
        }
        return ret;
    }

    public Event getCurrentEvent() {
        String hostname = getHostname();
        return eventbean.getEventByHostname(hostname);
    }

    public boolean hasPermission(String target, RolePermission permission) {
        if (target == null || target.isEmpty()) {
            throw new RuntimeException("Empty target");
        }

        
        return userbean.hasPermission(Permission.getPermission(target), getUser(), permission);

    }

    public boolean canWrite(String target) {
        return hasPermission(target, RolePermission.WRITE);
    }

    public boolean canRead(String target) {
        return hasPermission(target, RolePermission.READ);
    }

    public boolean canExecute(String target) {
        return hasPermission(target, RolePermission.EXECUTE);
    }

    public void setUser(User user) {
        if (user == null) {
            this.user = getUser();

        } else if (canExecute("user")) {
            secubean.logMessage(userbean.getCurrentUser(getCurrentEvent()), "Successfully impersonating user id: " + user.getId() + " and login: " + user.getLogin());
            this.user = user;
        } else {
            secubean.logMessage(userbean.getCurrentUser(getCurrentEvent()), "User tried to impersonate as id: " + user.getId() + " login: " + user.getLogin() + " but did not have enough rights");
        }
    }

    public User getUser() {

        if (user == null) {
            user = userbean.getCurrentUser(getCurrentEvent());
        }

        return user;
    }

    public String logout() {
        user = null;

        FacesContext ctx = FacesContext.getCurrentInstance();
        HttpSession sess = (HttpSession) ctx.getExternalContext().getSession(false);
        if (sess != null) {
            sess.invalidate();
        }
        return "logout";
    }
}