This is an automated email from the ASF dual-hosted git repository.
enorman pushed a commit to branch master
in repository
https://gitbox.apache.org/repos/asf/sling-org-apache-sling-testing-jcr-mock.git
The following commit(s) were added to refs/heads/master by this push:
new 7929b38 SLING-12168 Implement MockUserManager#createSystemUser (#29)
7929b38 is described below
commit 7929b388537494b0d77fd6a12ef4352e30a75784
Author: Eric Norman <[email protected]>
AuthorDate: Thu Dec 7 15:12:37 2023 -0800
SLING-12168 Implement MockUserManager#createSystemUser (#29)
---
.../apache/sling/testing/mock/jcr/MockUser.java | 3 +-
.../sling/testing/mock/jcr/MockUserManager.java | 47 ++++++++++++++++--
.../sling/testing/mock/jcr/package-info.java | 2 +-
.../testing/mock/jcr/MockUserManagerTest.java | 57 +++++++++++++++++++++-
4 files changed, 100 insertions(+), 9 deletions(-)
diff --git a/src/main/java/org/apache/sling/testing/mock/jcr/MockUser.java
b/src/main/java/org/apache/sling/testing/mock/jcr/MockUser.java
index faa1b83..ad0f2bb 100644
--- a/src/main/java/org/apache/sling/testing/mock/jcr/MockUser.java
+++ b/src/main/java/org/apache/sling/testing/mock/jcr/MockUser.java
@@ -26,6 +26,7 @@ import javax.jcr.SimpleCredentials;
import org.apache.jackrabbit.api.security.user.Impersonation;
import org.apache.jackrabbit.api.security.user.User;
+import org.apache.jackrabbit.oak.spi.security.principal.SystemUserPrincipal;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.slf4j.Logger;
@@ -62,7 +63,7 @@ class MockUser extends MockAuthorizable implements User {
@Override
public boolean isSystemUser() {
- return false;
+ return principal instanceof SystemUserPrincipal;
}
@Override
diff --git
a/src/main/java/org/apache/sling/testing/mock/jcr/MockUserManager.java
b/src/main/java/org/apache/sling/testing/mock/jcr/MockUserManager.java
index 4b0d14c..f8bd17a 100644
--- a/src/main/java/org/apache/sling/testing/mock/jcr/MockUserManager.java
+++ b/src/main/java/org/apache/sling/testing/mock/jcr/MockUserManager.java
@@ -39,6 +39,7 @@ import org.apache.jackrabbit.api.security.user.Query;
import org.apache.jackrabbit.api.security.user.User;
import org.apache.jackrabbit.api.security.user.UserManager;
import org.apache.jackrabbit.commons.visitor.FilteringItemVisitor;
+import org.apache.jackrabbit.oak.spi.security.principal.SystemUserPrincipal;
import org.apache.jackrabbit.oak.spi.security.user.UserConstants;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -82,6 +83,10 @@ public class MockUserManager implements UserManager {
if (node.isNodeType(UserConstants.NT_REP_USER)) {
String userID =
node.getProperty(UserConstants.REP_AUTHORIZABLE_ID).getString();
authorizables.computeIfAbsent(userID, id -> new
MockUser(id, null, node, MockUserManager.this));
+ } else if
(node.isNodeType(UserConstants.NT_REP_SYSTEM_USER)) {
+ String userID =
node.getProperty(UserConstants.REP_AUTHORIZABLE_ID).getString();
+ SystemUserPrincipal p = () -> userID;
+ authorizables.computeIfAbsent(userID, id -> new
MockUser(id, p, node, MockUserManager.this));
} else if
(node.isNodeType(UserConstants.NT_REP_GROUP)) {
String userID =
node.getProperty(UserConstants.REP_AUTHORIZABLE_ID).getString();
authorizables.computeIfAbsent(userID, id -> new
MockGroup(id, null, node, MockUserManager.this));
@@ -187,7 +192,11 @@ public class MockUserManager implements UserManager {
throw new AuthorizableExistsException("Group already exists");
}
String principalName = toPrincipalName(groupID, principal);
- Node node = ensureAuthorizablePathExists(intermediatePath,
principalName, true);
+ if (intermediatePath == null) {
+ intermediatePath = "/home/groups"; // NOSONAR
+ }
+
+ Node node = ensureAuthorizablePathExists(intermediatePath,
principalName, UserConstants.NT_REP_GROUP);
return (Group)authorizables.computeIfAbsent(groupID, id -> new
MockGroup(id, principal, node, this));
}
@@ -215,8 +224,10 @@ public class MockUserManager implements UserManager {
* @param isGroup Is group
* @return Existing or created node
* @throws RepositoryException Repository exception
+ * @deprecated use {@link #ensureAuthorizablePathExists(String, String,
String)} instead
*/
- protected Node ensureAuthorizablePathExists(String intermediatePath,
String principalName, boolean isGroup) throws RepositoryException {
+ @Deprecated(forRemoval = true, since = "1.4.0")
+ protected Node ensureAuthorizablePathExists(@Nullable String
intermediatePath, @NotNull String principalName, boolean isGroup) throws
RepositoryException {
if (intermediatePath == null) {
if (isGroup) {
intermediatePath = "/home/groups"; // NOSONAR
@@ -224,6 +235,20 @@ public class MockUserManager implements UserManager {
intermediatePath = "/home/users"; // NOSONAR
}
}
+ String authorizableType = isGroup ? UserConstants.NT_REP_GROUP :
UserConstants.NT_REP_USER;
+ return ensureAuthorizablePathExists(intermediatePath, principalName,
authorizableType);
+ }
+
+ /**
+ * Creates the user/group home folder if they don't exist yet
+ *
+ * @param intermediatePath the parent path
+ * @param principalName Principal name
+ * @param authorizableNodeType the node type for the user or group node
+ * @return Existing or created node
+ * @throws RepositoryException Repository exception
+ */
+ protected Node ensureAuthorizablePathExists(@NotNull String
intermediatePath, @NotNull String principalName, @NotNull String
authorizableNodeType) throws RepositoryException {
// ensure the resource at the path exists
String[] segments = intermediatePath.split("/");
Node node = session.getRootNode();
@@ -236,9 +261,11 @@ public class MockUserManager implements UserManager {
}
}
if (!node.hasNode(principalName)) {
- node = node.addNode(principalName, isGroup ?
UserConstants.NT_REP_GROUP : UserConstants.NT_REP_USER);
+ node = node.addNode(principalName, authorizableNodeType);
node.setProperty(UserConstants.REP_PRINCIPAL_NAME, principalName);
node.setProperty(UserConstants.REP_AUTHORIZABLE_ID, principalName);
+ } else {
+ node = node.getNode(principalName);
}
return node;
@@ -247,7 +274,8 @@ public class MockUserManager implements UserManager {
@Override
public @NotNull User createSystemUser(@NotNull String userID, @Nullable
String intermediatePath)
throws RepositoryException {
- throw new UnsupportedOperationException();
+ SystemUserPrincipal p = () -> userID;
+ return maybeCreateUser(userID, null, p, intermediatePath);
}
@Override
@@ -268,7 +296,16 @@ public class MockUserManager implements UserManager {
throw new AuthorizableExistsException("User already exists");
}
String principalName = toPrincipalName(userID, principal);
- Node node = ensureAuthorizablePathExists(intermediatePath,
principalName, false);
+ boolean isSystemUser = principal instanceof SystemUserPrincipal;
+ String authorizableNodeType = isSystemUser ?
UserConstants.NT_REP_SYSTEM_USER : UserConstants.NT_REP_USER;
+ if (intermediatePath == null) {
+ if (isSystemUser) {
+ intermediatePath = "/home/users/system"; // NOSONAR
+ } else {
+ intermediatePath = "/home/users"; // NOSONAR
+ }
+ }
+ Node node = ensureAuthorizablePathExists(intermediatePath,
principalName, authorizableNodeType);
return (User)authorizables.computeIfAbsent(userID, id -> new
MockUser(id, principal, node, this));
}
diff --git a/src/main/java/org/apache/sling/testing/mock/jcr/package-info.java
b/src/main/java/org/apache/sling/testing/mock/jcr/package-info.java
index 78c894c..fd4f1e5 100644
--- a/src/main/java/org/apache/sling/testing/mock/jcr/package-info.java
+++ b/src/main/java/org/apache/sling/testing/mock/jcr/package-info.java
@@ -19,5 +19,5 @@
/**
* Mock implementation of selected JCR APIs.
*/
[email protected]("1.3.0")
[email protected]("1.4.0")
package org.apache.sling.testing.mock.jcr;
diff --git
a/src/test/java/org/apache/sling/testing/mock/jcr/MockUserManagerTest.java
b/src/test/java/org/apache/sling/testing/mock/jcr/MockUserManagerTest.java
index acab813..bc03f2a 100644
--- a/src/test/java/org/apache/sling/testing/mock/jcr/MockUserManagerTest.java
+++ b/src/test/java/org/apache/sling/testing/mock/jcr/MockUserManagerTest.java
@@ -95,6 +95,10 @@ public class MockUserManagerTest {
testuser1.setProperty(UserConstants.REP_AUTHORIZABLE_ID, "testuser1");
testuser1.setProperty(UserConstants.REP_PRINCIPAL_NAME, "testuser1");
+ Node testsystemuser1 = usersNode.addNode("testsystemuser1",
UserConstants.NT_REP_SYSTEM_USER);
+ testsystemuser1.setProperty(UserConstants.REP_AUTHORIZABLE_ID,
"testsystemuser1");
+ testsystemuser1.setProperty(UserConstants.REP_PRINCIPAL_NAME,
"testsystemuser1");
+
Node groupsNode = homeNode.addNode("groups",
UserConstants.NT_REP_AUTHORIZABLE_FOLDER);
Node testgroup1 = groupsNode.addNode("testgroup1",
UserConstants.NT_REP_GROUP);
testgroup1.setProperty(UserConstants.REP_AUTHORIZABLE_ID,
"testgroup1");
@@ -103,6 +107,7 @@ public class MockUserManagerTest {
userManager.loadAlreadyExistingAuthorizables();
assertNotNull(userManager.getAuthorizable("testuser1"));
+ assertNotNull(userManager.getAuthorizable("testsystemuser1"));
assertNotNull(userManager.getAuthorizable("testgroup1"));
}
@@ -191,8 +196,16 @@ public class MockUserManagerTest {
* Test method for {@link
org.apache.sling.testing.mock.jcr.MockUserManager#createSystemUser(java.lang.String,
java.lang.String)}.
*/
@Test
- public void testCreateSystemUser() {
- assertThrows(UnsupportedOperationException.class, () ->
userManager.createSystemUser("systemuser1", "/home/users/system"));
+ public void testCreateSystemUser() throws RepositoryException {
+ @NotNull User user = userManager.createSystemUser("systemuser1",
"/home/users/system/test");
+ assertTrue(user.isSystemUser());
+ assertEquals("/home/users/system/test",
ResourceUtil.getParent(user.getPath()));
+ }
+ @Test
+ public void testCreateSystemUserWithNullIntermediatePath() throws
RepositoryException {
+ @NotNull User user = userManager.createSystemUser("systemuser1", null);
+ assertTrue(user.isSystemUser());
+ assertEquals("/home/users/system",
ResourceUtil.getParent(user.getPath()));
}
/**
@@ -215,6 +228,46 @@ public class MockUserManagerTest {
assertNotNull(user1);
assertEquals("/home/users/path1/user1", user1.getPath());
}
+ @Test
+ public void
testCreateUserStringStringPrincipalStringWithNullIntermediatePath() throws
AuthorizableExistsException, RepositoryException {
+ @NotNull User user1 = userManager.createUser("user1", "pwd", () ->
"user1", null);
+ assertNotNull(user1);
+ assertEquals("/home/users", ResourceUtil.getParent(user1.getPath()));
+ }
+
+ /**
+ * Test method for {@link
org.apache.sling.testing.mock.jcr.MockUserManager#ensureAuthorizablePathExists(java.lang.String,
java.lang.String, boolean)}.
+ */
+ @Deprecated
+ @Test
+ public void testEnsureAuthorizablePathExistsStringStringBoolean() throws
RepositoryException {
+ // intermedate path supplied
+ Node user1node =
userManager.ensureAuthorizablePathExists("/home/users/path1", "user1", false);
+ assertNotNull(user1node);
+ // no intermediate path for the user
+ Node user2node = userManager.ensureAuthorizablePathExists(null,
"user2", false);
+ assertNotNull(user2node);
+ // no intermediate path for the group
+ Node group1node = userManager.ensureAuthorizablePathExists(null,
"group1", true);
+ assertNotNull(group1node);
+
+ // one more time to ensure it works if the path already exists
+ user1node =
userManager.ensureAuthorizablePathExists("/home/users/path1", "user1", false);
+ assertNotNull(user1node);
+ }
+
+ /**
+ * Test method for {@link
org.apache.sling.testing.mock.jcr.MockUserManager#ensureAuthorizablePathExists(java.lang.String,
java.lang.String, java.lang.String)}.
+ */
+ @Test
+ public void testEnsureAuthorizablePathExistsStringStringString() throws
RepositoryException {
+ Node user1node =
userManager.ensureAuthorizablePathExists("/home/users/path1", "user1",
UserConstants.NT_REP_USER);
+ assertNotNull(user1node);
+
+ // one more time to ensure it works if the path already exists
+ user1node =
userManager.ensureAuthorizablePathExists("/home/users/path1", "user1",
UserConstants.NT_REP_USER);
+ assertNotNull(user1node);
+ }
/**
* Test method for {@link
org.apache.sling.testing.mock.jcr.MockUserManager#findAuthorizables(org.apache.jackrabbit.api.security.user.Query)}.