package fi.otavanopisto.pyramus.views.system; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; import javax.naming.InitialContext; import javax.naming.NamingException; import javax.persistence.PersistenceException; import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.StringUtils; import fi.internetix.smvc.controllers.PageRequestContext; import fi.otavanopisto.pyramus.dao.DAOFactory; import fi.otavanopisto.pyramus.dao.security.EnvironmentRolePermissionDAO; import fi.otavanopisto.pyramus.dao.security.PermissionDAO; import fi.otavanopisto.pyramus.domainmodel.security.EnvironmentRolePermission; import fi.otavanopisto.pyramus.domainmodel.security.Permission; import fi.otavanopisto.pyramus.domainmodel.users.Role; import fi.otavanopisto.pyramus.framework.PyramusFormViewController; import fi.otavanopisto.pyramus.framework.UserRole; import fi.otavanopisto.pyramus.security.impl.PermissionCollector; public class ManagePermissionsViewController extends PyramusFormViewController { @Override public void processForm(PageRequestContext requestContext) { PermissionDAO permissionDAO = DAOFactory.getInstance().getPermissionDAO(); EnvironmentRolePermissionDAO environmentRolePermissionDAO = DAOFactory.getInstance().getEnvironmentRolePermissionDAO(); List<Permission> permissions = permissionDAO.listAll(); Collections.sort(permissions, new Comparator<Permission>() { @Override public int compare(Permission o1, Permission o2) { return o1.getName().compareTo(o2.getName()); } }); List<EnvironmentRolePermission> rolePermissions = environmentRolePermissionDAO.listAll(); Map<String, Boolean> rpMap = new HashMap<>(); for (EnvironmentRolePermission erp : rolePermissions) { String key = erp.getPermission().getId().toString() + '.' + erp.getRole().name(); rpMap.put(key, Boolean.TRUE); } requestContext.getRequest().setAttribute("roles", manageableRoles()); requestContext.getRequest().setAttribute("permissions", permissions); requestContext.getRequest().setAttribute("rolePermissions", rpMap); requestContext.setIncludeJSP("/templates/system/managepermissions.jsp"); } @Override public void processSend(PageRequestContext requestContext) { String resetRole = requestContext.getString("roleReset"); if (StringUtils.isBlank(resetRole)) { PermissionDAO permissionDAO = DAOFactory.getInstance().getPermissionDAO(); EnvironmentRolePermissionDAO environmentRolePermissionDAO = DAOFactory.getInstance().getEnvironmentRolePermissionDAO(); List<Permission> permissions = permissionDAO.listAll(); for (Permission permission : permissions) { for (Role role : manageableRoles()) { String paramName = permission.getId().toString() + '.' + role.name(); EnvironmentRolePermission rolePermission = environmentRolePermissionDAO.findByUserRoleAndPermission(role, permission); boolean isSet = new Integer(1).equals(requestContext.getInteger(paramName)); boolean exists = rolePermission != null; if (isSet != exists) { if (isSet) { environmentRolePermissionDAO.create(role, permission); } else { environmentRolePermissionDAO.delete(rolePermission); } } } } } else { resetRoles(Role.valueOf(resetRole)); } processForm(requestContext); } private Role[] manageableRoles() { return ArrayUtils.removeElement(Role.values(), Role.CLOSED); } private void resetRoles(Role role) { try { PermissionCollector permissionCollector = (PermissionCollector) findByClass(PermissionCollector.class); if (permissionCollector != null) { permissionCollector.resetRoles(role); } } catch (Exception e) { Logger.getLogger(getClass().getName()).log(Level.SEVERE, String.format("Reset permissions of role %s failed", role.name()), e); } } private String getAppName() throws NamingException { String appName = ""; try { String jndiName = "java:app/AppName"; appName = (String) new InitialContext().lookup(jndiName); } catch (Throwable t) { } if (StringUtils.isBlank(appName)) appName = "Pyramus"; return appName; } private Object findByClass(Class<?> cls) { try { String jndiName = "java:app/" + getAppName() + "/" + cls.getSimpleName(); return new InitialContext().lookup(jndiName); } catch (NamingException e) { throw new PersistenceException(e); } } @Override public UserRole[] getAllowedRoles() { return new UserRole[] { UserRole.ADMINISTRATOR }; } }