Author: angela
Date: Thu Mar 22 09:04:55 2018
New Revision: 1827472

URL: http://svn.apache.org/viewvc?rev=1827472&view=rev
Log:
OAK-7356 : CugConfiguration may not pick up CugExclude

Added:
    
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugConfigurationOsgiTest.java
   (with props)
Modified:
    jackrabbit/oak/trunk/oak-authorization-cug/pom.xml
    
jackrabbit/oak/trunk/oak-authorization-cug/src/main/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugConfiguration.java
    
jackrabbit/oak/trunk/oak-authorization-cug/src/main/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugExcludeImpl.java
    jackrabbit/oak/trunk/oak-doc/src/site/markdown/security/authorization/cug.md

Modified: jackrabbit/oak/trunk/oak-authorization-cug/pom.xml
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-authorization-cug/pom.xml?rev=1827472&r1=1827471&r2=1827472&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-authorization-cug/pom.xml (original)
+++ jackrabbit/oak/trunk/oak-authorization-cug/pom.xml Thu Mar 22 09:04:55 2018
@@ -155,6 +155,12 @@
     </dependency>
     <dependency>
       <groupId>org.apache.jackrabbit</groupId>
+      <artifactId>oak-store-composite</artifactId>
+      <version>${project.version}</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.jackrabbit</groupId>
       <artifactId>oak-jcr</artifactId>
       <version>${project.version}</version>
       <classifier>tests</classifier>
@@ -166,6 +172,11 @@
       <version>1.10.19</version>
       <scope>test</scope>
     </dependency>
+    <dependency>
+      <groupId>org.apache.sling</groupId>
+      <artifactId>org.apache.sling.testing.osgi-mock</artifactId>
+      <scope>test</scope>
+    </dependency>
   </dependencies>
 
 </project>
\ No newline at end of file

Modified: 
jackrabbit/oak/trunk/oak-authorization-cug/src/main/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugConfiguration.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-authorization-cug/src/main/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugConfiguration.java?rev=1827472&r1=1827471&r2=1827472&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-authorization-cug/src/main/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugConfiguration.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-authorization-cug/src/main/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugConfiguration.java
 Thu Mar 22 09:04:55 2018
@@ -100,7 +100,7 @@ public class CugConfiguration extends Co
     /**
      * Reference to services implementing {@link 
org.apache.jackrabbit.oak.spi.security.authorization.cug.CugExclude}.
      */
-    @Reference(cardinality = ReferenceCardinality.OPTIONAL_UNARY)
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     private CugExclude exclude;
 
     /**
@@ -217,6 +217,14 @@ public class CugConfiguration extends Co
         this.mountInfoProvider = null;
     }
 
+    public void bindExclude(CugExclude exclude) {
+        this.exclude = exclude;
+    }
+
+    public void unbindExclude(CugExclude exclude) {
+        this.exclude = null;
+    }
+
     
//--------------------------------------------------------------------------
     @Nonnull
     private CugExclude getExclude() {

Modified: 
jackrabbit/oak/trunk/oak-authorization-cug/src/main/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugExcludeImpl.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-authorization-cug/src/main/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugExcludeImpl.java?rev=1827472&r1=1827471&r2=1827472&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-authorization-cug/src/main/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugExcludeImpl.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-authorization-cug/src/main/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugExcludeImpl.java
 Thu Mar 22 09:04:55 2018
@@ -25,7 +25,6 @@ import javax.annotation.Nonnull;
 import com.google.common.collect.ImmutableSet;
 import org.apache.felix.scr.annotations.Activate;
 import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.ConfigurationPolicy;
 import org.apache.felix.scr.annotations.Modified;
 import org.apache.felix.scr.annotations.Properties;
 import org.apache.felix.scr.annotations.Property;
@@ -37,19 +36,18 @@ import org.apache.jackrabbit.oak.spi.sec
  * Extension of the default {@link 
org.apache.jackrabbit.oak.spi.security.authorization.cug.CugExclude}
  * implementation that allow to specify additional principal names to be 
excluded
  * from CUG evaluation.
- *
- * Note: this component is requires a configuration (i.e. a configured list of
- * principal names) in order to be activated.
  */
 @Component(metatype = true,
+        immediate = true,
         label = "Apache Jackrabbit Oak CUG Exclude List",
-        description = "Allows to exclude principal(s) with the configured 
name(s) from CUG evaluation.",
-        policy = ConfigurationPolicy.REQUIRE)
+        description = "Exclude principal(s) from CUG evaluation. In addition 
to the " +
+                "principals defined by the default CugExclude 
('AdminPrincipal', 'SystemPrincipal', 'SystemUserPrincipal' classes), " +
+                "this component allows to optionally configure additional 
principals by name.")
 @Service({CugExclude.class})
 @Properties({
         @Property(name = "principalNames",
                 label = "Principal Names",
-                description = "Name of principals that are always excluded 
from CUG evaluation.",
+                description = "Name(s) of additional principal(s) that are 
excluded from CUG evaluation.",
                 cardinality = Integer.MAX_VALUE)
 })
 public class CugExcludeImpl extends CugExclude.Default {

Added: 
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugConfigurationOsgiTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugConfigurationOsgiTest.java?rev=1827472&view=auto
==============================================================================
--- 
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugConfigurationOsgiTest.java
 (added)
+++ 
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugConfigurationOsgiTest.java
 Thu Mar 22 09:04:55 2018
@@ -0,0 +1,144 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.oak.spi.security.authorization.cug.impl;
+
+import java.security.Principal;
+import java.util.Map;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
+import org.apache.jackrabbit.oak.AbstractSecurityTest;
+import org.apache.jackrabbit.oak.composite.MountInfoProviderService;
+import org.apache.jackrabbit.oak.plugins.tree.impl.RootProviderService;
+import org.apache.jackrabbit.oak.plugins.tree.impl.TreeProviderService;
+import 
org.apache.jackrabbit.oak.spi.security.authorization.AuthorizationConfiguration;
+import 
org.apache.jackrabbit.oak.spi.security.authorization.permission.EmptyPermissionProvider;
+import 
org.apache.jackrabbit.oak.spi.security.authorization.permission.PermissionProvider;
+import org.apache.jackrabbit.oak.spi.security.principal.AdminPrincipal;
+import org.apache.jackrabbit.oak.spi.security.principal.PrincipalImpl;
+import org.apache.jackrabbit.oak.spi.security.principal.SystemPrincipal;
+import org.apache.jackrabbit.oak.spi.security.principal.SystemUserPrincipal;
+import org.apache.sling.testing.mock.osgi.ReferenceViolationException;
+import org.apache.sling.testing.mock.osgi.junit.OsgiContext;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+
+import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertTrue;
+
+public class CugConfigurationOsgiTest extends AbstractSecurityTest {
+
+    private static final String EXCLUDED_PRINCIPAL_NAME = "excludedPrincipal";
+    private static final String ANY_PRINCIPAL_NAME = "anyPrincipal";
+
+    private static final Map<String, Object> PROPERTIES = ImmutableMap.of(
+            CugConstants.PARAM_CUG_ENABLED, true,
+            CugConstants.PARAM_CUG_SUPPORTED_PATHS, new String[] {"/"});
+
+    @Rule
+    public final OsgiContext context = new OsgiContext();
+
+    private CugConfiguration cugConfiguration;
+    private CugExcludeImpl cugExclude;
+    private String wspName;
+
+    @Before
+    public void before() throws Exception {
+        super.before();
+
+        wspName = root.getContentSession().getWorkspaceName();
+
+        cugConfiguration = new CugConfiguration(getSecurityProvider());
+        cugConfiguration.setRootProvider(new RootProviderService());
+        cugConfiguration.setTreeProvider(new TreeProviderService());
+
+        cugExclude = new CugExcludeImpl();
+
+        MountInfoProviderService mip = new MountInfoProviderService();
+        context.registerInjectActivateService(mip);
+    }
+
+    @Test(expected = ReferenceViolationException.class)
+    public void testMissingCugExclude() {
+        context.registerInjectActivateService(cugConfiguration, PROPERTIES);
+    }
+
+    @Test
+    public void testCugExcludeExcludedDefault() {
+        context.registerInjectActivateService(cugExclude);
+        context.registerInjectActivateService(cugConfiguration, PROPERTIES);
+
+        // default exclusion
+        AdminPrincipal admin = () -> "name";
+        SystemUserPrincipal suPrincipal = () -> "name";
+
+        AuthorizationConfiguration config = 
context.getService(AuthorizationConfiguration.class);
+        for (Principal p : new Principal[] {SystemPrincipal.INSTANCE, admin, 
suPrincipal}) {
+            PermissionProvider permissionProvider = 
config.getPermissionProvider(root, wspName, ImmutableSet.of(p));
+            assertSame(EmptyPermissionProvider.getInstance(), 
permissionProvider);
+        }
+
+        // however, other principals must not be excluded
+        PermissionProvider permissionProvider = 
config.getPermissionProvider(root, wspName, ImmutableSet.of(new 
PrincipalImpl(EXCLUDED_PRINCIPAL_NAME)));
+        assertTrue(permissionProvider instanceof CugPermissionProvider);
+    }
+
+    @Test
+    public void testCugExcludeExcludedPrincipal() {
+        context.registerInjectActivateService(cugExclude, 
ImmutableMap.of("principalNames", new String[] {EXCLUDED_PRINCIPAL_NAME}));
+        context.registerInjectActivateService(cugConfiguration, PROPERTIES);
+
+        AuthorizationConfiguration config = 
context.getService(AuthorizationConfiguration.class);
+        PermissionProvider permissionProvider = 
config.getPermissionProvider(root, wspName, ImmutableSet.of(new 
PrincipalImpl(EXCLUDED_PRINCIPAL_NAME)));
+        assertSame(EmptyPermissionProvider.getInstance(), permissionProvider);
+    }
+
+    @Test
+    public void testCugExcludeAnyPrincipal() {
+        context.registerInjectActivateService(cugExclude, 
ImmutableMap.of("principalNames", new String[] {EXCLUDED_PRINCIPAL_NAME}));
+        context.registerInjectActivateService(cugConfiguration, PROPERTIES);
+
+        AuthorizationConfiguration config = 
context.getService(AuthorizationConfiguration.class);
+        PermissionProvider permissionProvider = 
config.getPermissionProvider(root, wspName, ImmutableSet.of(new 
PrincipalImpl(ANY_PRINCIPAL_NAME)));
+        assertTrue(permissionProvider instanceof CugPermissionProvider);
+    }
+
+    @Test
+    public void testNotEnabled() {
+        context.registerInjectActivateService(cugExclude, 
ImmutableMap.of("principalNames", new String[] {ANY_PRINCIPAL_NAME}));
+        context.registerInjectActivateService(cugConfiguration, 
ImmutableMap.of(
+                CugConstants.PARAM_CUG_ENABLED, false,
+                CugConstants.PARAM_CUG_SUPPORTED_PATHS, new String[]{"/"}));
+
+        AuthorizationConfiguration config = 
context.getService(AuthorizationConfiguration.class);
+        PermissionProvider permissionProvider = 
config.getPermissionProvider(root, wspName, ImmutableSet.of(new 
PrincipalImpl(ANY_PRINCIPAL_NAME)));
+        assertSame(EmptyPermissionProvider.getInstance(), permissionProvider);
+    }
+
+    @Test
+    public void testNoSupportedPaths() {
+        context.registerInjectActivateService(cugExclude, 
ImmutableMap.of("principalNames", new String[] {ANY_PRINCIPAL_NAME}));
+        context.registerInjectActivateService(cugConfiguration, 
ImmutableMap.of(
+                CugConstants.PARAM_CUG_ENABLED, true,
+                CugConstants.PARAM_CUG_SUPPORTED_PATHS, new String[0]));
+
+        AuthorizationConfiguration config = 
context.getService(AuthorizationConfiguration.class);
+        PermissionProvider permissionProvider = 
config.getPermissionProvider(root, wspName, ImmutableSet.of(new 
PrincipalImpl(ANY_PRINCIPAL_NAME)));
+        assertSame(EmptyPermissionProvider.getInstance(), permissionProvider);
+    }
+}
\ No newline at end of file

Propchange: 
jackrabbit/oak/trunk/oak-authorization-cug/src/test/java/org/apache/jackrabbit/oak/spi/security/authorization/cug/impl/CugConfigurationOsgiTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: 
jackrabbit/oak/trunk/oak-doc/src/site/markdown/security/authorization/cug.md
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-doc/src/site/markdown/security/authorization/cug.md?rev=1827472&r1=1827471&r2=1827472&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-doc/src/site/markdown/security/authorization/cug.md 
(original)
+++ 
jackrabbit/oak/trunk/oak-doc/src/site/markdown/security/authorization/cug.md 
Thu Mar 22 09:04:55 2018
@@ -233,7 +233,7 @@ to be excluded from the evaluation of re
 | `principalNames`            | Set\<String\>  | \-       | Name of principals 
that are always excluded from CUG evaluation.  |
 | | | | |
 
-_Note:_ this is an optional feature to extend the 
[default](/oak/docs/apidocs/org/apache/jackrabbit/oak/spi/security/authorization/cug/CugExclude.Default.html)
 
+_Note:_ This implementation extends the 
[default](/oak/docs/apidocs/org/apache/jackrabbit/oak/spi/security/authorization/cug/CugExclude.Default.html)
 
 exclusion list. Alternatively, it is possible to plug a custom `CugExclude` 
implementation matching 
 specific needs (see [below](#pluggability)).
 
@@ -296,7 +296,8 @@ in the `org.apache.jackrabbit.oak.spi.se
 
 1. implement `CugExclude` interface according to you needs,
 2. make your implementation an OSGi service
-3. deploy the bundle containing your implementation in the OSGi container and 
activate the service.
+3. deploy the bundle containing your implementation in the OSGi container and 
activate the service. 
+4. make sure the default CUGExclude service is properly replaced by the custom 
implementation.
 
 ###### Example
 


Reply via email to