Coverage Summary for Class: SecurityObjectAccessFilter (org.kitodo.production.security)

Class Class, % Method, % Line, %
SecurityObjectAccessFilter 0% (0/1) 0% (0/4) 0% (0/38)


 /*
  * (c) Kitodo. Key to digital objects e. V. <contact@kitodo.org>
  *
  * This file is part of the Kitodo project.
  *
  * It is licensed under GNU General Public License version 3 or later.
  *
  * For the full copyright and license information, please read the
  * GPL3-License.txt file that was distributed with this source code.
  */
 
 package org.kitodo.production.security;
 
 import java.io.IOException;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Objects;
 
 import javax.servlet.FilterChain;
 import javax.servlet.ServletException;
 import javax.servlet.ServletRequest;
 import javax.servlet.ServletResponse;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
 import org.kitodo.production.services.ServiceManager;
 import org.kitodo.production.services.security.SecurityAccessService;
 import org.omnifaces.cdi.viewscope.ViewScopeManager;
 import org.springframework.security.access.AccessDeniedException;
 import org.springframework.security.web.access.AccessDeniedHandler;
 import org.springframework.security.web.access.AccessDeniedHandlerImpl;
 import org.springframework.web.filter.GenericFilterBean;
 
 /**
  * This filter handles the accessibility of urls which contains the parameter
  * "id". The access is denied if the user does not have the corresponding
  * authority for the current id.
  */
 public class SecurityObjectAccessFilter extends GenericFilterBean {
     private final AccessDeniedHandler accessDeniedHandler = new AccessDeniedHandlerImpl();
     private final SecurityAccessService securityAccessService = ServiceManager.getSecurityAccessService();
 
     @Override
     public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
             throws IOException, ServletException {
         HttpServletResponse httpServletResponse = (HttpServletResponse) response;
         HttpServletRequest httpServletRequest = (HttpServletRequest) request;
 
         String id = httpServletRequest.getParameter("id");
 
         if (Objects.nonNull(id)) {
             try {
                 Integer.parseInt(id);
             } catch (NumberFormatException e) {
                 if (httpServletRequest.getRequestURI().contains("pages/workflowEdit")
                         && securityAccessService.hasAuthorityToViewWorkflow()) {
                     chain.doFilter(request, response);
                 } else if (ViewScopeManager.isUnloadRequest(httpServletRequest)) {
                     chain.doFilter(request, response);
                 } else {
                     denyAccess(httpServletRequest, httpServletResponse);
                 }
                 return;
             }
 
             Map<String, Boolean> requested = new HashMap<>();
             requested.put("processEdit", securityAccessService.hasAuthorityToViewProcess());
             requested.put("projectEdit", securityAccessService.hasAuthorityToViewProject());
             requested.put("templateEdit", securityAccessService.hasAuthorityToViewTemplate());
             requested.put("workflowEdit", securityAccessService.hasAuthorityToViewWorkflow());
             requested.put("docketEdit", securityAccessService.hasAuthorityToViewDocket());
             requested.put("rulesetEdit", securityAccessService.hasAuthorityToViewRuleset());
             requested.put("roleEdit", securityAccessService.hasAuthorityToViewRole());
             requested.put("clientEdit", securityAccessService.hasAuthorityToViewClient());
 
             for (Map.Entry<String, Boolean> entry : requested.entrySet()) {
                 if (isAccessDenied(httpServletRequest, httpServletResponse, entry.getKey(), entry.getValue())) {
                     return;
                 }
             }
 
             if (httpServletRequest.getRequestURI().contains("pages/userEdit")
                     && !securityAccessService.hasAuthorityToViewUser()
                     && !securityAccessService.hasAuthorityToConfigUser(Integer.parseInt(id))) {
                 denyAccess(httpServletRequest, httpServletResponse);
                 return;
             }
         }
         chain.doFilter(request, response);
     }
 
     private boolean isAccessDenied(HttpServletRequest request, HttpServletResponse response, String page,
             boolean hasAuthority) throws IOException, ServletException {
         if (request.getRequestURI().contains("pages/" + page) && !hasAuthority) {
             denyAccess(request, response);
             return true;
         }
         return false;
     }
 
     private void denyAccess(HttpServletRequest request, HttpServletResponse response)
             throws IOException, ServletException {
         accessDeniedHandler.handle(request, response, new AccessDeniedException("Access is denied"));
     }
 }