From 44d6870c76efd90c0105e36a35a6b44db5bd4a1a Mon Sep 17 00:00:00 2001
From: Rick Herrick <jrherrick@wustl.edu>
Date: Tue, 31 May 2016 12:40:26 -0500
Subject: [PATCH] Converted XnatInitCheckFilter initialization to use YAML
 configuration instead of hard-coded URLs.

---
 .../xnat/initialization/SecurityConfig.java   | 39 ++++++++++++++-----
 .../xnat/security/initialization-urls.yaml    | 14 +++++++
 2 files changed, 44 insertions(+), 9 deletions(-)
 create mode 100644 src/main/resources/META-INF/xnat/security/initialization-urls.yaml

diff --git a/src/main/java/org/nrg/xnat/initialization/SecurityConfig.java b/src/main/java/org/nrg/xnat/initialization/SecurityConfig.java
index 771b24c2..c61d791d 100644
--- a/src/main/java/org/nrg/xnat/initialization/SecurityConfig.java
+++ b/src/main/java/org/nrg/xnat/initialization/SecurityConfig.java
@@ -1,6 +1,8 @@
 package org.nrg.xnat.initialization;
 
 import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.node.ArrayNode;
 import org.nrg.config.exceptions.SiteConfigurationException;
 import org.nrg.framework.services.SerializerService;
 import org.nrg.xdat.preferences.InitializerSiteConfiguration;
@@ -100,7 +102,7 @@ public class SecurityConfig {
         final SecurityContextLogoutHandler securityContextLogoutHandler = new SecurityContextLogoutHandler();
         securityContextLogoutHandler.setInvalidateHttpSession(true);
         final XnatLogoutHandler xnatLogoutHandler = new XnatLogoutHandler();
-        final LogoutFilter      filter            = new LogoutFilter(logoutSuccessHandler, securityContextLogoutHandler, xnatLogoutHandler);
+        final LogoutFilter filter = new LogoutFilter(logoutSuccessHandler, securityContextLogoutHandler, xnatLogoutHandler);
         filter.setFilterProcessesUrl("/app/action/LogoutUser");
         return filter;
     }
@@ -109,7 +111,7 @@ public class SecurityConfig {
     public FilterSecurityInterceptorBeanPostProcessor filterSecurityInterceptorBeanPostProcessor() throws IOException {
         final Resource resource = RESOURCE_LOADER.getResource("classpath:META-INF/xnat/security/configured-urls.yaml");
         try (final InputStream inputStream = resource.getInputStream()) {
-            final HashMap<String, ArrayList<String>>         urlMap        = _serializer.deserializeYaml(inputStream, TYPE_REFERENCE);
+            final HashMap<String, ArrayList<String>> urlMap = _serializer.deserializeYaml(inputStream, TYPE_REFERENCE);
             final FilterSecurityInterceptorBeanPostProcessor postProcessor = new FilterSecurityInterceptorBeanPostProcessor();
             postProcessor.setOpenUrls(urlMap.get("openUrls"));
             postProcessor.setAdminUrls(urlMap.get("adminUrls"));
@@ -195,13 +197,17 @@ public class SecurityConfig {
     }
 
     @Bean
-    public XnatInitCheckFilter xnatInitCheckFilter() {
-        final XnatInitCheckFilter filter = new XnatInitCheckFilter();
-        filter.setInitializationPaths(Arrays.asList("/xapi/siteConfig/batch", "/xapi/notifications/smtp"));
-        filter.setConfigurationPath("/setup");
-        filter.setNonAdminErrorPath("/app/template/Unconfigured.vm");
-        filter.setExemptedPaths(Arrays.asList("/app/template/XDATScreen_UpdateUser.vm", "/app/action/ModifyPassword", "/app/template/Login.vm", "/style/app.css", "/login"));
-        return filter;
+    public XnatInitCheckFilter xnatInitCheckFilter() throws IOException {
+        final Resource resource = RESOURCE_LOADER.getResource("classpath:META-INF/xnat/security/initialization-urls.yaml");
+        try (final InputStream inputStream = resource.getInputStream()) {
+            final XnatInitCheckFilter filter = new XnatInitCheckFilter();
+            final JsonNode paths = _serializer.deserializeYaml(inputStream);
+            filter.setConfigurationPath(paths.get("configPath").asText());
+            filter.setNonAdminErrorPath(paths.get("nonAdminErrorPath").asText());
+            filter.setInitializationPaths(nodeToList(paths.get("initPaths")));
+            filter.setExemptedPaths(nodeToList(paths.get("exemptedPaths")));
+            return filter;
+        }
     }
 
     @Bean
@@ -211,6 +217,21 @@ public class SecurityConfig {
         return service;
     }
 
+    protected List<String> nodeToList(final JsonNode node) {
+        final List<String> list = new ArrayList<>();
+        if (node.isArray()) {
+            final ArrayNode arrayNode = (ArrayNode) node;
+            for (final JsonNode item : arrayNode) {
+                list.add(item.asText());
+            }
+        } else if (node.isTextual()) {
+            list.add(node.asText());
+        } else {
+            list.add(node.toString());
+        }
+        return list;
+    }
+
     private static final ResourceLoader                                    RESOURCE_LOADER = new DefaultResourceLoader();
     private static final TypeReference<HashMap<String, ArrayList<String>>> TYPE_REFERENCE  = new TypeReference<HashMap<String, ArrayList<String>>>() {
     };
diff --git a/src/main/resources/META-INF/xnat/security/initialization-urls.yaml b/src/main/resources/META-INF/xnat/security/initialization-urls.yaml
new file mode 100644
index 00000000..e536e0db
--- /dev/null
+++ b/src/main/resources/META-INF/xnat/security/initialization-urls.yaml
@@ -0,0 +1,14 @@
+configPath: /setup
+nonAdminErrorPath: /app/template/Unconfigured.vm
+
+initPaths:
+  - /xapi/siteConfig/batch
+  - /xapi/notifications/smtp
+  - /xapi/spawner/resolve/siteAdmin/siteSetup
+
+exemptedPaths:
+  - /app/template/XDATScreen_UpdateUser.vm
+  - /app/action/ModifyPassword
+  - /app/template/Login.vm
+  - /style/app.css
+  - /login
-- 
GitLab