SLING-5135 - use two configurable sets of whitelisted BSNs: default and additional

git-svn-id: https://svn.apache.org/repos/asf/sling/trunk@1765984 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/src/main/java/org/apache/sling/jcr/base/internal/LoginAdminWhitelistImpl.java b/src/main/java/org/apache/sling/jcr/base/internal/LoginAdminWhitelistImpl.java
index a97304f..e7a6710 100644
--- a/src/main/java/org/apache/sling/jcr/base/internal/LoginAdminWhitelistImpl.java
+++ b/src/main/java/org/apache/sling/jcr/base/internal/LoginAdminWhitelistImpl.java
@@ -74,22 +74,35 @@
     private Pattern whitelistRegexp;
 
     @Property(
-            label="Whitelisted BSNs",
-            description="List of bundle symbolic names for which loginAdministrative() is allowed",
+            label="Default whitelisted BSNs",
+            description="Default list of bundle symbolic names for which loginAdministrative() is allowed",
             value = {})
-    public static final String PROP_WHITELISTED_BSN = "whitelisted.bundle.symbolic.names";
+    public static final String PROP_DEFAULT_WHITELISTED_BSN = "default.whitelisted.bundle.symbolic.names";
+    
+    @Property(
+            label="Additional whitelisted BSNs",
+            description="Additional list of bundle symbolic names for which loginAdministrative() is allowed",
+            value = {})
+    public static final String PROP_ADDITIONAL_WHITELISTED_BSN = "additional.whitelisted.bundle.symbolic.names";
+    
     private Set<String> whitelistedBsn;
 
     public void activate(Map<String, Object> config) {
         bypassWhitelist = PropertiesUtil.toBoolean(config.get(PROP_BYPASS_WHITELIST), DEFAULT_BYPASS);
         whitelistedBsn = new TreeSet<String>();
-        final Object bsns = config.get(PROP_WHITELISTED_BSN);
-        if(bsns == null) {
+        
+        final Object defBsns = config.get(PROP_DEFAULT_WHITELISTED_BSN);
+        if(defBsns == null) {
             whitelistedBsn.addAll(Arrays.asList(DefaultWhitelist.WHITELISTED_BSN));
         } else {
-            whitelistedBsn.addAll(Arrays.asList(PropertiesUtil.toStringArray(bsns)));
+            whitelistedBsn.addAll(Arrays.asList(PropertiesUtil.toStringArray(defBsns)));
         }
 
+        final Object addBsns = config.get(PROP_ADDITIONAL_WHITELISTED_BSN);
+        if(addBsns != null) {
+            whitelistedBsn.addAll(Arrays.asList(PropertiesUtil.toStringArray(addBsns)));
+        }
+        
         final String regexp = PropertiesUtil.toString(config.get(PROP_WHITELIST_REGEXP), "");
         if(regexp.trim().length() > 0) {
             whitelistRegexp = Pattern.compile(regexp);
diff --git a/src/test/java/org/apache/sling/jcr/base/internal/LoginAdminWhitelistImplTest.java b/src/test/java/org/apache/sling/jcr/base/internal/LoginAdminWhitelistImplTest.java
index 474454a..e621be4 100644
--- a/src/test/java/org/apache/sling/jcr/base/internal/LoginAdminWhitelistImplTest.java
+++ b/src/test/java/org/apache/sling/jcr/base/internal/LoginAdminWhitelistImplTest.java
@@ -84,11 +84,11 @@
     }
     
     @Test
-    public void testConfiguredWhitelist() {
+    public void testDefaultConfigOnly() {
         final String [] allowed = {
                 "bundle1", "bundle2"
         };
-        config.put(LoginAdminWhitelistImpl.PROP_WHITELISTED_BSN, allowed);
+        config.put(LoginAdminWhitelistImpl.PROP_DEFAULT_WHITELISTED_BSN, allowed);
         whitelist.activate(config);
         
         assertAdminLogin("bundle1", true);
@@ -102,11 +102,48 @@
     }
     
     @Test
+    public void testAdditionalConfigOnly() {
+        final String [] allowed = {
+                "bundle5", "bundle6"
+        };
+        config.put(LoginAdminWhitelistImpl.PROP_ADDITIONAL_WHITELISTED_BSN, allowed);
+        whitelist.activate(config);
+        
+        assertAdminLogin("bundle5", true);
+        assertAdminLogin("bundle6", true);
+        assertAdminLogin("foo.1.bar", false);
+        
+        for(String bsn : DefaultWhitelist.WHITELISTED_BSN) {
+            assertAdminLogin(bsn, true);
+        }
+        
+        for(String bsn : randomBsn()) {
+            assertAdminLogin(bsn, false);
+        }
+    }
+    
+    @Test
+    public void testDefaultAndAdditionalConfig() {
+        config.put(LoginAdminWhitelistImpl.PROP_DEFAULT_WHITELISTED_BSN, new String [] { "defB"});
+        config.put(LoginAdminWhitelistImpl.PROP_ADDITIONAL_WHITELISTED_BSN, new String [] { "addB"});
+        whitelist.activate(config);
+        
+        assertAdminLogin("defB", true);
+        assertAdminLogin("addB", true);
+        assertAdminLogin("foo.1.bar", false);
+        assertAdminLogin(TYPICAL_DEFAULT_ALLOWED_BSN, false);
+        
+        for(String bsn : randomBsn()) {
+            assertAdminLogin(bsn, false);
+        }
+    }
+    
+    @Test
     public void testRegexpWhitelist() {
         final String [] allowed = {
                 "bundle3", "bundle4"
         };
-        config.put(LoginAdminWhitelistImpl.PROP_WHITELISTED_BSN, allowed);
+        config.put(LoginAdminWhitelistImpl.PROP_DEFAULT_WHITELISTED_BSN, allowed);
         config.put(LoginAdminWhitelistImpl.PROP_WHITELIST_REGEXP, "foo.*bar");
         whitelist.activate(config);