From 3894d763069601cf9f62374bca4355256a2faec4 Mon Sep 17 00:00:00 2001
From: Rick Herrick <jrherrick@wustl.edu>
Date: Fri, 9 Sep 2016 16:19:40 -0500
Subject: [PATCH] XNAT-4301 Fixed permissions on user API. Tried to fix
 intermittent concurrent modification error in SecureResource.

---
 src/main/java/org/nrg/xapi/rest/users/UsersApi.java | 13 ++++++++-----
 .../nrg/xnat/restlet/resources/SecureResource.java  |  5 +++--
 2 files changed, 11 insertions(+), 7 deletions(-)

diff --git a/src/main/java/org/nrg/xapi/rest/users/UsersApi.java b/src/main/java/org/nrg/xapi/rest/users/UsersApi.java
index 499f9298..abcc0abd 100644
--- a/src/main/java/org/nrg/xapi/rest/users/UsersApi.java
+++ b/src/main/java/org/nrg/xapi/rest/users/UsersApi.java
@@ -145,7 +145,7 @@ public class UsersApi extends AbstractXapiRestController {
     @RequestMapping(value = "active/{username}", produces = MediaType.APPLICATION_JSON_VALUE, method = RequestMethod.GET)
     @ResponseBody
     public ResponseEntity<List<String>> getUserActiveSessions(@ApiParam(value = "ID of the user to fetch", required = true) @PathVariable("username") final String username) {
-        final HttpStatus status = isPermitted();
+        final HttpStatus status = isPermitted(username);
         if (status != null) {
             return new ResponseEntity<>(status);
         }
@@ -162,6 +162,7 @@ public class UsersApi extends AbstractXapiRestController {
             }
             return new ResponseEntity<>(sessionIds, HttpStatus.OK);
         }
+
         return new ResponseEntity<>(HttpStatus.NOT_FOUND);
     }
 
@@ -173,9 +174,11 @@ public class UsersApi extends AbstractXapiRestController {
                    @ApiResponse(code = 500, message = "An unexpected error occurred.")})
     @RequestMapping(value = "{username}", produces = MediaType.APPLICATION_JSON_VALUE, method = RequestMethod.GET)
     public ResponseEntity<User> getUser(@ApiParam(value = "Username of the user to fetch.", required = true) @PathVariable("username") final String username) {
-        HttpStatus status = isPermitted(username);
-        if (status != null) {
-            return new ResponseEntity<>(status);
+        if (_preferences.getRestrictUserListAccessToAdmins()) {
+            final HttpStatus status = isPermitted(username);
+            if (status != null) {
+                return new ResponseEntity<>(status);
+            }
         }
         final UserI user;
         try {
@@ -309,7 +312,7 @@ public class UsersApi extends AbstractXapiRestController {
                    @ApiResponse(code = 403, message = "Not authorized to create or update this user."),
                    @ApiResponse(code = 404, message = "User not found."),
                    @ApiResponse(code = 500, message = "An unexpected error occurred.")})
-    @RequestMapping(value = {"{username}", "active/{username}"}, produces = MediaType.APPLICATION_JSON_VALUE, method = RequestMethod.DELETE)
+    @RequestMapping(value = "active/{username}", produces = MediaType.APPLICATION_JSON_VALUE, method = RequestMethod.DELETE)
     public ResponseEntity<List<String>> invalidateUser(final HttpSession current, @ApiParam(value = "The username of the user to invalidate.", required = true) @PathVariable("username") final String username) throws NotFoundException {
         HttpStatus status = isPermitted(username);
         if (status != null) {
diff --git a/src/main/java/org/nrg/xnat/restlet/resources/SecureResource.java b/src/main/java/org/nrg/xnat/restlet/resources/SecureResource.java
index eac158f4..c2b54b8a 100644
--- a/src/main/java/org/nrg/xnat/restlet/resources/SecureResource.java
+++ b/src/main/java/org/nrg/xnat/restlet/resources/SecureResource.java
@@ -10,7 +10,6 @@
  */
 package org.nrg.xnat.restlet.resources;
 
-import com.fasterxml.jackson.core.type.TypeReference;
 import com.google.common.collect.Maps;
 import com.noelios.restlet.http.HttpConstants;
 import org.apache.commons.beanutils.BeanUtils;
@@ -1564,11 +1563,13 @@ public abstract class SecureResource extends Resource {
                     throw new RuntimeException(exception);
                 }
 
+                final List<FilteredResourceHandlerI> handlerClasses = new ArrayList<>();
                 for (Class<?> clazz : classes) {
                     if (FilteredResourceHandlerI.class.isAssignableFrom(clazz)) {
-                        handlers.get(_package).add((FilteredResourceHandlerI) clazz.newInstance());
+                        handlerClasses.add((FilteredResourceHandlerI) clazz.newInstance());
                     }
                 }
+                handlers.get(_package).addAll(handlerClasses);
             }
         }
 
-- 
GitLab