View Javadoc

1   package com.atlassian.plugins.rest.module.scope;
2   
3   import com.atlassian.plugin.scope.ScopeManager;
4   import com.atlassian.plugins.rest.module.RestModuleDescriptor;
5   import com.sun.jersey.spi.container.ContainerRequest;
6   import com.sun.jersey.spi.container.ContainerRequestFilter;
7   import com.sun.jersey.spi.container.ContainerResponseFilter;
8   import com.sun.jersey.spi.container.ResourceFilter;
9   import org.slf4j.Logger;
10  import org.slf4j.LoggerFactory;
11  
12  import javax.ws.rs.core.Response;
13  
14  import static javax.ws.rs.core.Response.Status.PRECONDITION_FAILED;
15  
16  /**
17   * Rejects requests that do not satisfy Scope checks.
18   * <p>
19   * A request is rejected if it requires Scope protection,
20   * but associated tenant/user does not have scope activated.
21   *
22   * @since 3.2
23   */
24  public class ScopeResourceFilter implements ResourceFilter, ContainerRequestFilter {
25      private static final Logger log = LoggerFactory.getLogger(ScopeResourceFilter.class);
26  
27      private final RestModuleDescriptor descriptor;
28      private final ScopeManager scopeManager;
29  
30      private final Response.Status failureStatus = PRECONDITION_FAILED;
31  
32      public ScopeResourceFilter(ScopeManager scopeManager, RestModuleDescriptor descriptor) {
33          this.descriptor = descriptor;
34          this.scopeManager = scopeManager;
35      }
36  
37      /**
38       * Proceeds with request if module's scope is activated for given tenant
39       */
40      public ContainerRequest filter(final ContainerRequest request) {
41          log.debug("Applying scope filter for {} ", descriptor);
42  
43          final Boolean permit = descriptor.getScopeKey().map(scopeManager::isScopeActive).orElse(true);
44  
45          if (!permit) {
46              log.debug("Scope is not active for matching descriptor {}", descriptor);
47  
48              throw new ScopeCheckFailedException(failureStatus);
49          }
50  
51          return request;
52      }
53  
54      public ContainerRequestFilter getRequestFilter() {
55          return this;
56      }
57  
58      public ContainerResponseFilter getResponseFilter() {
59          return null;
60      }
61  }