Index: oak-core/src/main/java/org/apache/jackrabbit/oak/spi/whiteboard/WhiteboardAuthorizableNodeName.java =================================================================== --- oak-core/src/main/java/org/apache/jackrabbit/oak/spi/whiteboard/WhiteboardAuthorizableNodeName.java (revision 1789997) +++ oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/whiteboard/WhiteboardAuthorizableNodeName.java (revision ) @@ -14,12 +14,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.jackrabbit.oak.spi.whiteboard; +package org.apache.jackrabbit.oak.security.user.whiteboard; import java.util.List; import javax.annotation.Nonnull; import org.apache.jackrabbit.oak.spi.security.user.AuthorizableNodeName; +import org.apache.jackrabbit.oak.spi.whiteboard.AbstractServiceTracker; /** * Dynamic {@link AuthorizableNodeName} based on the available Index: oak-core/src/main/java/org/apache/jackrabbit/oak/spi/whiteboard/WhiteboardUserAuthenticationFactory.java =================================================================== --- oak-core/src/main/java/org/apache/jackrabbit/oak/spi/whiteboard/WhiteboardUserAuthenticationFactory.java (revision 1789997) +++ oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/whiteboard/WhiteboardUserAuthenticationFactory.java (revision ) @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.jackrabbit.oak.spi.whiteboard; +package org.apache.jackrabbit.oak.security.user.whiteboard; import java.util.List; import javax.annotation.CheckForNull; @@ -25,6 +25,7 @@ import org.apache.jackrabbit.oak.spi.security.authentication.Authentication; import org.apache.jackrabbit.oak.spi.security.user.UserAuthenticationFactory; import org.apache.jackrabbit.oak.spi.security.user.UserConfiguration; +import org.apache.jackrabbit.oak.spi.whiteboard.AbstractServiceTracker; /** * Dynamic {@link org.apache.jackrabbit.oak.spi.security.user.UserAuthenticationFactory} Index: oak-core/src/main/java/org/apache/jackrabbit/oak/spi/whiteboard/WhiteboardAuthorizableActionProvider.java =================================================================== --- oak-core/src/main/java/org/apache/jackrabbit/oak/spi/whiteboard/WhiteboardAuthorizableActionProvider.java (revision 1789997) +++ oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/whiteboard/WhiteboardAuthorizableActionProvider.java (revision ) @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.jackrabbit.oak.spi.whiteboard; +package org.apache.jackrabbit.oak.security.user.whiteboard; import java.util.List; @@ -24,6 +24,7 @@ import org.apache.jackrabbit.oak.spi.security.user.action.AuthorizableAction; import org.apache.jackrabbit.oak.spi.security.user.action.AuthorizableActionProvider; import org.apache.jackrabbit.oak.spi.security.user.action.CompositeActionProvider; +import org.apache.jackrabbit.oak.spi.whiteboard.AbstractServiceTracker; /** * Dynamic {@link AuthorizableActionProvider} based on the available \ No newline at end of file Index: oak-core/src/main/java/org/apache/jackrabbit/oak/security/SecurityProviderImpl.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- oak-core/src/main/java/org/apache/jackrabbit/oak/security/SecurityProviderImpl.java (revision 1789997) +++ oak-core/src/main/java/org/apache/jackrabbit/oak/security/SecurityProviderImpl.java (revision ) @@ -40,11 +40,11 @@ import org.apache.jackrabbit.oak.spi.security.user.UserConfiguration; import org.apache.jackrabbit.oak.spi.security.user.UserConstants; import org.apache.jackrabbit.oak.spi.whiteboard.Whiteboard; -import org.apache.jackrabbit.oak.spi.whiteboard.WhiteboardAuthorizableActionProvider; -import org.apache.jackrabbit.oak.spi.whiteboard.WhiteboardAuthorizableNodeName; +import org.apache.jackrabbit.oak.security.user.whiteboard.WhiteboardAuthorizableActionProvider; +import org.apache.jackrabbit.oak.security.user.whiteboard.WhiteboardAuthorizableNodeName; import org.apache.jackrabbit.oak.spi.whiteboard.WhiteboardAware; import org.apache.jackrabbit.oak.spi.whiteboard.WhiteboardRestrictionProvider; -import org.apache.jackrabbit.oak.spi.whiteboard.WhiteboardUserAuthenticationFactory; +import org.apache.jackrabbit.oak.security.user.whiteboard.WhiteboardUserAuthenticationFactory; import org.osgi.framework.BundleContext; import javax.annotation.Nonnull; Index: oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/whiteboard/WhiteboardAuthorizableNodeNameTest.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/whiteboard/WhiteboardAuthorizableNodeNameTest.java (revision ) +++ oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/whiteboard/WhiteboardAuthorizableNodeNameTest.java (revision ) @@ -0,0 +1,67 @@ +/* + * 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.security.user.whiteboard; + +import javax.annotation.Nonnull; + +import com.google.common.collect.ImmutableMap; +import org.apache.jackrabbit.oak.spi.security.user.AuthorizableNodeName; +import org.apache.jackrabbit.oak.spi.whiteboard.DefaultWhiteboard; +import org.apache.jackrabbit.oak.spi.whiteboard.Whiteboard; +import org.junit.After; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +public class WhiteboardAuthorizableNodeNameTest { + + private static final String TEST_ID = "testID"; + + private final Whiteboard whiteboard = new DefaultWhiteboard(); + private final WhiteboardAuthorizableNodeName authorizableNodeName = new WhiteboardAuthorizableNodeName(); + + @After + public void after() { + authorizableNodeName.stop(); + } + + @Test + public void testDefault() { + assertEquals(AuthorizableNodeName.DEFAULT.generateNodeName(TEST_ID), authorizableNodeName.generateNodeName(TEST_ID)); + } + + @Test + public void testStarted() { + authorizableNodeName.start(whiteboard); + assertEquals(AuthorizableNodeName.DEFAULT.generateNodeName(TEST_ID), authorizableNodeName.generateNodeName(TEST_ID)); + } + + @Test + public void testRegisteredImplementation() { + authorizableNodeName.start(whiteboard); + + AuthorizableNodeName registered = new AuthorizableNodeName() { + @Nonnull + @Override + public String generateNodeName(@Nonnull String authorizableId) { + return "generated"; + } + }; + whiteboard.register(AuthorizableNodeName.class, registered, ImmutableMap.of()); + assertEquals(registered.generateNodeName(TEST_ID), authorizableNodeName.generateNodeName(TEST_ID)); + } +} \ No newline at end of file Index: oak-core/src/test/java/org/apache/jackrabbit/oak/spi/whiteboard/WhiteboardUserAuthenticationFactoryTest.java =================================================================== --- oak-core/src/test/java/org/apache/jackrabbit/oak/spi/whiteboard/WhiteboardUserAuthenticationFactoryTest.java (revision 1789997) +++ oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/whiteboard/WhiteboardUserAuthenticationFactoryTest.java (revision ) @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.jackrabbit.oak.spi.whiteboard; +package org.apache.jackrabbit.oak.security.user.whiteboard; import java.util.ArrayList; import java.util.List; @@ -22,6 +22,7 @@ import javax.annotation.Nullable; import org.apache.jackrabbit.oak.api.Root; +import org.apache.jackrabbit.oak.security.user.whiteboard.WhiteboardUserAuthenticationFactory; import org.apache.jackrabbit.oak.spi.security.authentication.Authentication; import org.apache.jackrabbit.oak.spi.security.user.UserAuthenticationFactory; import org.apache.jackrabbit.oak.spi.security.user.UserConfiguration; Index: oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/whiteboard/WhiteboardAuthorizableActionProviderTest.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/whiteboard/WhiteboardAuthorizableActionProviderTest.java (revision ) +++ oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/whiteboard/WhiteboardAuthorizableActionProviderTest.java (revision ) @@ -0,0 +1,88 @@ +/* + * 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.security.user.whiteboard; + +import java.util.List; +import javax.annotation.Nonnull; + +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; +import org.apache.jackrabbit.oak.spi.security.SecurityProvider; +import org.apache.jackrabbit.oak.spi.security.user.AuthorizableNodeName; +import org.apache.jackrabbit.oak.spi.security.user.action.AbstractAuthorizableAction; +import org.apache.jackrabbit.oak.spi.security.user.action.AuthorizableAction; +import org.apache.jackrabbit.oak.spi.security.user.action.AuthorizableActionProvider; +import org.apache.jackrabbit.oak.spi.whiteboard.DefaultWhiteboard; +import org.apache.jackrabbit.oak.spi.whiteboard.Whiteboard; +import org.junit.After; +import org.junit.Test; +import org.mockito.Mockito; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +public class WhiteboardAuthorizableActionProviderTest { + + private final Whiteboard whiteboard = new DefaultWhiteboard(); + private final WhiteboardAuthorizableActionProvider actionProvider = new WhiteboardAuthorizableActionProvider(); + + @After + public void after() { + actionProvider.stop(); + } + + @Test + public void testDefault() { + List actions = actionProvider.getAuthorizableActions(Mockito.mock(SecurityProvider.class)); + assertNotNull(actions); + assertTrue(actions.isEmpty()); + } + + @Test + public void testStarted() { + actionProvider.start(whiteboard); + + List actions = actionProvider.getAuthorizableActions(Mockito.mock(SecurityProvider.class)); + assertNotNull(actions); + assertTrue(actions.isEmpty()); + } + + @Test + public void testRegisteredImplementation() { + actionProvider.start(whiteboard); + + AuthorizableActionProvider registered = new AuthorizableActionProvider() { + @Nonnull + @Override + public List getAuthorizableActions(@Nonnull SecurityProvider securityProvider) { + return ImmutableList.of(new TestAction()); + } + }; + whiteboard.register(AuthorizableActionProvider.class, registered, ImmutableMap.of()); + + List actions = actionProvider.getAuthorizableActions(Mockito.mock(SecurityProvider.class)); + assertNotNull(actions); + assertEquals(1, actions.size()); + assertTrue(actions.get(0) instanceof TestAction); + } + + private static final class TestAction extends AbstractAuthorizableAction {} + +} \ No newline at end of file Index: oak-core/src/main/java/org/apache/jackrabbit/oak/security/internal/SecurityProviderRegistration.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- oak-core/src/main/java/org/apache/jackrabbit/oak/security/internal/SecurityProviderRegistration.java (revision 1789997) +++ oak-core/src/main/java/org/apache/jackrabbit/oak/security/internal/SecurityProviderRegistration.java (revision ) @@ -55,10 +55,10 @@ import org.apache.jackrabbit.oak.spi.security.user.UserConfiguration; import org.apache.jackrabbit.oak.spi.security.user.UserConstants; import org.apache.jackrabbit.oak.spi.security.user.action.AuthorizableActionProvider; -import org.apache.jackrabbit.oak.spi.whiteboard.WhiteboardAuthorizableActionProvider; -import org.apache.jackrabbit.oak.spi.whiteboard.WhiteboardAuthorizableNodeName; +import org.apache.jackrabbit.oak.security.user.whiteboard.WhiteboardAuthorizableActionProvider; +import org.apache.jackrabbit.oak.security.user.whiteboard.WhiteboardAuthorizableNodeName; import org.apache.jackrabbit.oak.spi.whiteboard.WhiteboardRestrictionProvider; -import org.apache.jackrabbit.oak.spi.whiteboard.WhiteboardUserAuthenticationFactory; +import org.apache.jackrabbit.oak.security.user.whiteboard.WhiteboardUserAuthenticationFactory; import org.osgi.framework.BundleContext; import org.osgi.framework.Constants; import org.osgi.framework.ServiceRegistration;