Author: angela
Date: Mon Apr  3 14:52:40 2017
New Revision: 1790006

URL: http://svn.apache.org/viewvc?rev=1790006&view=rev
Log:
OAK-6027 : UserImporter.Impersonators : use Oak path to user instead of ID 
OAK-5882 : Improve coverage for oak.security code in oak-core (wip)

Modified:
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/UserImporter.java
    
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/UserImporterTest.java

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/UserImporter.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/UserImporter.java?rev=1790006&r1=1790005&r2=1790006&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/UserImporter.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/UserImporter.java
 Mon Apr  3 14:52:40 2017
@@ -297,7 +297,7 @@ class UserImporter implements ProtectedP
                 // since impersonators may be imported later on, postpone 
processing
                 // to the end.
                 // see -> process References
-                referenceTracker.processedReference(new 
Impersonators(a.getID(), propInfo.getTextValues()));
+                referenceTracker.processedReference(new 
Impersonators(parent.getPath(), propInfo.getTextValues()));
                 return true;
 
             } else if (REP_DISABLED.equals(propName)) {
@@ -665,20 +665,20 @@ class UserImporter implements ProtectedP
      */
     private final class Impersonators {
 
-        private final String userId;
+        private final String userPath;
         private final Set<String> principalNames = new HashSet<String>();
 
-        private Impersonators(String userId, List<? extends TextValue> values) 
{
-            this.userId = userId;
+        private Impersonators(String userPath, List<? extends TextValue> 
values) {
+            this.userPath = userPath;
             for (TextValue v : values) {
                 principalNames.add(v.getString());
             }
         }
 
         private void process() throws RepositoryException {
-            Authorizable a = userManager.getAuthorizable(userId);
+            Authorizable a = userManager.getAuthorizableByOakPath(userPath);
             if (a == null || a.isGroup()) {
-                throw new RepositoryException(userId + " does not represent a 
valid user.");
+                throw new RepositoryException(userPath + " does not represent 
a valid user.");
             }
 
             Impersonation imp = checkNotNull(((User) a).getImpersonation());

Modified: 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/UserImporterTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/UserImporterTest.java?rev=1790006&r1=1790005&r2=1790006&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/UserImporterTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/security/user/UserImporterTest.java
 Mon Apr  3 14:52:40 2017
@@ -17,6 +17,7 @@
 package org.apache.jackrabbit.oak.security.user;
 
 import java.util.ArrayList;
+import java.util.Iterator;
 import java.util.List;
 import javax.annotation.Nonnull;
 import javax.jcr.ImportUUIDBehavior;
@@ -29,6 +30,7 @@ import javax.jcr.nodetype.PropertyDefini
 import javax.jcr.nodetype.PropertyDefinitionTemplate;
 
 import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Lists;
 import org.apache.jackrabbit.JcrConstants;
 import org.apache.jackrabbit.api.JackrabbitSession;
@@ -38,19 +40,23 @@ import org.apache.jackrabbit.api.securit
 import org.apache.jackrabbit.api.security.user.User;
 import org.apache.jackrabbit.api.security.user.UserManager;
 import org.apache.jackrabbit.oak.AbstractSecurityTest;
+import org.apache.jackrabbit.oak.api.PropertyState;
 import org.apache.jackrabbit.oak.api.Root;
 import org.apache.jackrabbit.oak.api.Tree;
 import org.apache.jackrabbit.oak.api.Type;
 import org.apache.jackrabbit.oak.commons.PathUtils;
 import org.apache.jackrabbit.oak.namepath.NamePathMapper;
+import org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants;
 import org.apache.jackrabbit.oak.plugins.nodetype.ReadOnlyNodeTypeManager;
 import org.apache.jackrabbit.oak.spi.security.ConfigurationParameters;
 import org.apache.jackrabbit.oak.spi.security.SecurityProvider;
+import org.apache.jackrabbit.oak.spi.security.principal.EveryonePrincipal;
 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.AuthorizableAction;
 import 
org.apache.jackrabbit.oak.spi.security.user.action.AuthorizableActionProvider;
 import org.apache.jackrabbit.oak.spi.security.user.action.GroupAction;
+import org.apache.jackrabbit.oak.spi.security.user.util.PasswordUtil;
 import org.apache.jackrabbit.oak.spi.xml.ImportBehavior;
 import org.apache.jackrabbit.oak.spi.xml.PropInfo;
 import org.apache.jackrabbit.oak.spi.xml.ProtectedItemImporter;
@@ -63,6 +69,7 @@ import org.mockito.Mockito;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 import static org.mockito.Mockito.when;
@@ -70,6 +77,7 @@ import static org.mockito.Mockito.when;
 public class UserImporterTest extends AbstractSecurityTest implements 
UserConstants {
 
     private static final String TEST_USER_ID = "uid";
+    private static final String TEST_GROUP_ID = "gid";
 
     private TestAction testAction;
     AuthorizableActionProvider actionProvider = new 
AuthorizableActionProvider() {
@@ -79,8 +87,11 @@ public class UserImporterTest extends Ab
             return (testAction == null) ? 
ImmutableList.<AuthorizableAction>of() : ImmutableList.of(testAction);
         }
     };
+
     private User testUser;
 
+    private ReferenceChangeTracker refTracker = new ReferenceChangeTracker();
+
     UserImporter importer;
 
     @Override
@@ -94,6 +105,7 @@ public class UserImporterTest extends Ab
     @Override
     public void after() throws Exception {
         try {
+            refTracker.clear();
             root.refresh();
         } finally {
             super.after();
@@ -136,7 +148,7 @@ public class UserImporterTest extends Ab
         if (createAction) {
             testAction = new TestAction();
         }
-        return importer.init(mockJackrabbitSession(), root, 
getNamePathMapper(), isWorkspaceImport(), 
ImportUUIDBehavior.IMPORT_UUID_COLLISION_REMOVE_EXISTING, new 
ReferenceChangeTracker(), getSecurityProvider());
+        return importer.init(mockJackrabbitSession(), root, 
getNamePathMapper(), isWorkspaceImport(), 
ImportUUIDBehavior.IMPORT_UUID_COLLISION_REMOVE_EXISTING, refTracker, 
getSecurityProvider());
     }
 
     private Tree createUserTree() {
@@ -153,26 +165,32 @@ public class UserImporterTest extends Ab
         NodeUtil node = new NodeUtil(root.getTree(PathUtils.ROOT_PATH));
         NodeUtil groupRoot = 
node.getOrAddTree(PathUtils.relativize(PathUtils.ROOT_PATH, groupPath), 
NT_REP_AUTHORIZABLE_FOLDER);
 
-        return groupRoot.addChild("testGroup", NT_REP_GROUP).getTree();
-    }
-
-    private PropInfo createPropInfo(@Nonnull String name, final String value) {
-        return new PropInfo(name, PropertyType.STRING, new TextValue() {
-            @Override
-            public String getString() {
-                return value;
-            }
-
-            @Override
-            public Value getValue(int targetType) throws RepositoryException {
-                return getValueFactory(root).createValue(value, targetType);
-            }
-
-            @Override
-            public void dispose() {
-                //nop
-            }
-        });
+        Tree groupTree = groupRoot.addChild("testGroup", 
NT_REP_GROUP).getTree();
+        groupTree.setProperty(JcrConstants.JCR_UUID, new UserProvider(root, 
ConfigurationParameters.EMPTY).getContentID(TEST_GROUP_ID));
+        return groupTree;
+    }
+
+    private PropInfo createPropInfo(@Nonnull String name, final String... 
values) {
+        List<TextValue> txtValues = Lists.newArrayList();
+        for (final String v : values) {
+            txtValues.add(new TextValue() {
+                @Override
+                public String getString() {
+                    return v;
+                }
+
+                @Override
+                public Value getValue(int targetType) throws 
RepositoryException {
+                    return getValueFactory(root).createValue(v, targetType);
+                }
+
+                @Override
+                public void dispose() {
+                    //nop
+                }
+            });
+        }
+        return new PropInfo(name, PropertyType.STRING, txtValues);
     }
 
     private PropertyDefinition mockPropertyDefinition(@Nonnull String 
declaringNt, boolean mv) throws Exception {
@@ -275,6 +293,166 @@ public class UserImporterTest extends Ab
         assertTrue(importer.handlePropInfo(userTree, 
createPropInfo(REP_AUTHORIZABLE_ID, TEST_USER_ID), 
mockPropertyDefinition(NT_REP_USER, false)));
     }
 
+    @Test
+    public void testHandlePrincipalName() throws Exception {
+        init();
+        Tree userTree = createUserTree();
+        assertTrue(importer.handlePropInfo(userTree, 
createPropInfo(REP_PRINCIPAL_NAME, "principalName"), 
mockPropertyDefinition(NT_REP_AUTHORIZABLE, false)));
+        assertEquals("principalName", 
userTree.getProperty(REP_PRINCIPAL_NAME).getValue(Type.STRING));
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void testHandleEmptyPrincipalName() throws Exception {
+        init();
+        Tree userTree = createUserTree();
+        importer.handlePropInfo(userTree, createPropInfo(REP_PRINCIPAL_NAME, 
""), mockPropertyDefinition(NT_REP_AUTHORIZABLE, false));
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void testHandleEveryonePrincipalNameOnUser() throws Exception {
+        init();
+        Tree userTree = createUserTree();
+        importer.handlePropInfo(userTree, createPropInfo(REP_PRINCIPAL_NAME, 
EveryonePrincipal.NAME), mockPropertyDefinition(NT_REP_AUTHORIZABLE, false));
+    }
+
+    @Test
+    public void testHandlePrincipalNameMvPropertyDef() throws Exception {
+        init();
+        Tree userTree = createUserTree();
+        assertFalse(importer.handlePropInfo(userTree, 
createPropInfo(REP_PRINCIPAL_NAME, "principalName"), 
mockPropertyDefinition(NT_REP_AUTHORIZABLE, true)));
+        assertNull(userTree.getProperty(REP_PRINCIPAL_NAME));
+    }
+
+    @Test
+    public void testHandlePrincipalNameOtherDeclNtDef() throws Exception {
+        init();
+        Tree userTree = createUserTree();
+        assertFalse(importer.handlePropInfo(userTree, 
createPropInfo(REP_PRINCIPAL_NAME, "principalName"), 
mockPropertyDefinition(NT_REP_AUTHORIZABLE_FOLDER, false)));
+        assertNull(userTree.getProperty(REP_PRINCIPAL_NAME));
+    }
+
+    @Test
+    public void testHandlePassword() throws Exception {
+        init();
+        Tree userTree = createUserTree();
+        String pwHash = PasswordUtil.buildPasswordHash("pw");
+        assertTrue(importer.handlePropInfo(userTree, 
createPropInfo(REP_PASSWORD, pwHash), mockPropertyDefinition(NT_REP_USER, 
false)));
+        assertEquals(pwHash, 
userTree.getProperty(REP_PASSWORD).getValue(Type.STRING));
+    }
+
+    @Test
+    public void testHandlePasswordOnSystemUser() throws Exception {
+        init();
+        Tree userTree = createUserTree();
+        userTree.setProperty(JcrConstants.JCR_PRIMARYTYPE, NT_REP_SYSTEM_USER, 
Type.NAME);
+        assertFalse(importer.handlePropInfo(userTree, 
createPropInfo(REP_PASSWORD, PasswordUtil.buildPasswordHash("pw")), 
mockPropertyDefinition(NT_REP_USER, false)));
+    }
+
+    @Test
+    public void testHandlePasswordOnGroup() throws Exception {
+        init();
+        Tree groupTree = createGroupTree();
+        assertFalse(importer.handlePropInfo(groupTree, 
createPropInfo(REP_PASSWORD, PasswordUtil.buildPasswordHash("pw")), 
mockPropertyDefinition(NT_REP_USER, false)));
+    }
+
+    @Test
+    public void testHandlePasswordMvPropertyDef() throws Exception {
+        init();
+        Tree userTree = createUserTree();
+        assertFalse(importer.handlePropInfo(userTree, 
createPropInfo(REP_PASSWORD, PasswordUtil.buildPasswordHash("pw")), 
mockPropertyDefinition(NT_REP_USER, true)));
+        assertNull(userTree.getProperty(REP_PASSWORD));
+    }
+
+    @Test
+    public void testHandlePasswordOtherDeclNtDef() throws Exception {
+        init();
+        Tree userTree = createUserTree();
+        assertFalse(importer.handlePropInfo(userTree, 
createPropInfo(REP_PASSWORD, PasswordUtil.buildPasswordHash("pw")), 
mockPropertyDefinition(NT_REP_AUTHORIZABLE, false)));
+        assertNull(userTree.getProperty(REP_PASSWORD));
+    }
+
+    @Test
+    public void testHandleImpersonators() throws Exception {
+        init();
+        Tree userTree = createUserTree();
+        assertTrue(importer.handlePropInfo(userTree, 
createPropInfo(REP_IMPERSONATORS, "impersonator1", "impersonator2"), 
mockPropertyDefinition(NT_REP_USER, true)));
+        // writing is postponed though and the ref-tracker must not be empty
+        assertNull(userTree.getProperty(REP_IMPERSONATORS));
+        assertTrue(refTracker.getProcessedReferences().hasNext());
+    }
+
+    @Test
+    public void testHandleImpersonatorsOnGroup() throws Exception {
+        init();
+        Tree groupTree = createGroupTree();
+        assertFalse(importer.handlePropInfo(groupTree, 
createPropInfo(REP_IMPERSONATORS, "impersonator1"), 
mockPropertyDefinition(NT_REP_USER, true)));
+    }
+
+    @Test
+    public void testHandleImpersonatorsSinglePropertyDef() throws Exception {
+        init();
+        Tree userTree = createUserTree();
+        assertFalse(importer.handlePropInfo(userTree, 
createPropInfo(REP_IMPERSONATORS, "impersonator1"), 
mockPropertyDefinition(NT_REP_USER, false)));
+        assertNull(userTree.getProperty(REP_IMPERSONATORS));
+    }
+
+    @Test
+    public void testHandleImpersonatorsOtherDeclNtDef() throws Exception {
+        init();
+        Tree userTree = createUserTree();
+        assertFalse(importer.handlePropInfo(userTree, 
createPropInfo(REP_IMPERSONATORS, "impersonator1"), 
mockPropertyDefinition(NT_REP_AUTHORIZABLE, true)));
+        assertNull(userTree.getProperty(REP_IMPERSONATORS));
+    }
+
+    @Test
+    public void testHandleDisabled() throws Exception {
+        init();
+        Tree userTree = createUserTree();
+        assertTrue(importer.handlePropInfo(userTree, 
createPropInfo(REP_DISABLED, "disabled"), mockPropertyDefinition(NT_REP_USER, 
false)));
+        PropertyState property = userTree.getProperty(REP_DISABLED);
+        assertNotNull(property);
+        assertEquals("disabled", property.getValue(Type.STRING));
+    }
+
+    @Test
+    public void testHandleDisabledOnGroup() throws Exception {
+        init();
+        Tree groupTree = createGroupTree();
+        assertFalse(importer.handlePropInfo(groupTree, 
createPropInfo(REP_DISABLED, "disabled"), mockPropertyDefinition(NT_REP_USER, 
false)));
+        assertNull(groupTree.getProperty(REP_DISABLED));
+    }
+
+    @Test(expected = RepositoryException.class)
+    public void testHandleDisabledMvProperty() throws Exception {
+        init();
+        Tree userTree = createUserTree();
+        importer.handlePropInfo(userTree, createPropInfo(REP_DISABLED, 
"disabled", "disabled"), mockPropertyDefinition(NT_REP_USER, false));
+    }
+
+    @Test
+    public void testHandleDisabledMvPropertyDef() throws Exception {
+        init();
+        Tree userTree = createUserTree();
+        assertFalse(importer.handlePropInfo(userTree, 
createPropInfo(REP_DISABLED, "disabled"), mockPropertyDefinition(NT_REP_USER, 
true)));
+        assertNull(userTree.getProperty(REP_DISABLED));
+    }
+
+    @Test
+    public void testHandleDisabledOtherDeclNtDef() throws Exception {
+        init();
+        Tree userTree = createUserTree();
+        assertFalse(importer.handlePropInfo(userTree, 
createPropInfo(REP_DISABLED, "disabled"), 
mockPropertyDefinition(NT_REP_AUTHORIZABLE, false)));
+        assertNull(userTree.getProperty(REP_DISABLED));
+    }
+
+    @Test
+    public void testHandleUnknownProperty() throws Exception {
+        init();
+        Tree userTree = createUserTree();
+        assertFalse(importer.handlePropInfo(userTree, 
createPropInfo("unknownProperty", "value"), 
mockPropertyDefinition(NodeTypeConstants.NT_OAK_UNSTRUCTURED, false)));
+        assertNull(userTree.getProperty("unknownProperty"));
+    }
+
     //--------------------------------------------------< processReferences 
>---
 
     @Test(expected = IllegalStateException.class)
@@ -282,6 +460,32 @@ public class UserImporterTest extends Ab
         importer.processReferences();
     }
 
+    @Test
+    public void testProcessUnknownImpersonators() throws Exception {
+        init();
+        Tree userTree = createUserTree();
+        assertTrue(importer.handlePropInfo(userTree, 
createPropInfo(REP_IMPERSONATORS, "impersonator1", "impersonator2"), 
mockPropertyDefinition(NT_REP_USER, true)));
+
+        importer.processReferences();
+
+        // default importbehavior == IGNORE
+        PropertyState impersonators = userTree.getProperty(REP_IMPERSONATORS);
+        assertNull(impersonators);
+    }
+
+    @Test
+    public void testProcessImpersonators() throws Exception {
+        init();
+        Tree userTree = createUserTree();
+        assertTrue(importer.handlePropInfo(userTree, 
createPropInfo(REP_IMPERSONATORS, testUser.getPrincipal().getName()), 
mockPropertyDefinition(NT_REP_USER, true)));
+
+        importer.processReferences();
+
+        PropertyState impersonators = userTree.getProperty(REP_IMPERSONATORS);
+        assertNotNull(impersonators);
+        assertEquals(ImmutableList.of(testUser.getPrincipal().getName()), 
impersonators.getValue(Type.STRINGS));
+    }
+
     //------------------------------------------------< propertiesCompleted 
>---
 
     @Test


Reply via email to