Author: angela
Date: Thu Aug 9 13:05:03 2012
New Revision: 1371189
URL: http://svn.apache.org/viewvc?rev=1371189&view=rev
Log:
OAK-50 : Implement User Management (WIP)
Added:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/UserProviderImpl.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/security/user/UserConstants.java
- copied, changed from r1370710,
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/security/user/UserConstants.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/security/user/UserProvider.java
Removed:
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/security/user/UserConstants.java
Modified:
jackrabbit/oak/trunk/oak-core/pom.xml
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/security/user/AuthorizableImpl.java
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/security/user/AuthorizableNodeCreator.java
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/security/user/ImpersonationImpl.java
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/security/user/MembershipManager.java
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/security/user/UserManagerImpl.java
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/user/AuthorizableImplTest.java
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/user/UserManagerImplTest.java
Modified: jackrabbit/oak/trunk/oak-core/pom.xml
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/pom.xml?rev=1371189&r1=1371188&r2=1371189&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/pom.xml (original)
+++ jackrabbit/oak/trunk/oak-core/pom.xml Thu Aug 9 13:05:03 2012
@@ -54,6 +54,7 @@
org.apache.jackrabbit.oak.spi.security.user.action,
org.apache.jackrabbit.oak.security.principal,
org.apache.jackrabbit.oak.security.privilege
+ org.apache.jackrabbit.oak.security.user
</Export-Package>
<Bundle-Activator>
org.apache.jackrabbit.oak.osgi.Activator
Added:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/UserProviderImpl.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/UserProviderImpl.java?rev=1371189&view=auto
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/UserProviderImpl.java
(added)
+++
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/user/UserProviderImpl.java
Thu Aug 9 13:05:03 2012
@@ -0,0 +1,253 @@
+/*
+ * 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;
+
+import java.io.UnsupportedEncodingException;
+import java.util.UUID;
+import javax.jcr.RepositoryException;
+import javax.jcr.nodetype.ConstraintViolationException;
+
+import org.apache.jackrabbit.JcrConstants;
+import org.apache.jackrabbit.oak.api.CoreValueFactory;
+import org.apache.jackrabbit.oak.api.Root;
+import org.apache.jackrabbit.oak.api.Tree;
+import org.apache.jackrabbit.oak.namepath.NameMapper;
+import org.apache.jackrabbit.oak.spi.security.user.UserConstants;
+import org.apache.jackrabbit.oak.spi.security.user.UserManagerConfig;
+import org.apache.jackrabbit.oak.spi.security.user.UserProvider;
+import org.apache.jackrabbit.oak.util.NodeUtil;
+import org.apache.jackrabbit.util.Text;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * User provider implementation creating the JCR nodes corresponding the a
given
+ * authorizable ID with the following behavior:
+ * <ul>
+ * <li>Users are created below /rep:security/rep:authorizables/rep:users or
+ * the path configured in the {@link
org.apache.jackrabbit.oak.spi.security.user.UserManagerConfig#PARAM_USER_PATH}
+ * respectively.</li>
+ * <li>Groups are created below /rep:security/rep:authorizables/rep:groups or
+ * the path configured in the {@link
org.apache.jackrabbit.oak.spi.security.user.UserManagerConfig#PARAM_GROUP_PATH}
+ * respectively.</li>
+ * <li>Below each category authorizables are created within a human readable
+ * structure based on the defined intermediate path or some internal logic
+ * with a depth defined by the {@code defaultDepth} config option.<br>
+ * E.g. creating a user node for an ID 'aSmith' would result in the following
+ * structure assuming defaultDepth == 2 is used:
+ * <pre>
+ * + rep:security [rep:AuthorizableFolder]
+ * + rep:authorizables [rep:AuthorizableFolder]
+ * + rep:users [rep:AuthorizableFolder]
+ * + a [rep:AuthorizableFolder]
+ * + aS [rep:AuthorizableFolder]
+ * -> + aSmith [rep:User]
+ * </pre>
+ * </li>
+ * <li>The node name is calculated from the specified authorizable ID
+ * {@link org.apache.jackrabbit.util.Text#escapeIllegalJcrChars(String)
escaping} any illegal JCR chars.</li>
+ * <li>If no intermediate path is passed the names of the intermediate
+ * folders are calculated from the leading chars of the escaped node name.</li>
+ * <li>If the escaped node name is shorter than the {@code defaultDepth}
+ * the last char is repeated.<br>
+ * E.g. creating a user node for an ID 'a' would result in the following
+ * structure assuming defaultDepth == 2 is used:
+ * <pre>
+ * + rep:security [rep:AuthorizableFolder]
+ * + rep:authorizables [rep:AuthorizableFolder]
+ * + rep:users [rep:AuthorizableFolder]
+ * + a [rep:AuthorizableFolder]
+ * + aa [rep:AuthorizableFolder]
+ * -> + a [rep:User]
+ * </pre></li>
+ *
+ * <h3>Conflicts</h3>
+ *
+ * <ul>
+ * <li>If the authorizable node to be created would collide with an
existing
+ * folder the conflict is resolved by using the colling folder as
target.</li>
+ * <li>The current implementation asserts that authorizable nodes are
always
+ * created underneath an node of type {@code rep:AuthorizableFolder}. If
this
+ * condition is violated a {@code ConstraintViolationException} is
thrown.</li>
+ * <li>If the specified intermediate path results in an authorizable node
+ * being located outside of the configured content structure a
+ * {@code ConstraintViolationException} is thrown.</li>
+ * </ul>
+ *
+ * <h3>Configuration Options</h3>
+ * <ul>
+ * <li>{@link
org.apache.jackrabbit.oak.spi.security.user.UserManagerConfig#PARAM_USER_PATH}:
Underneath this structure
+ * all user nodes are created. Default value is
+ * "/rep:security/rep:authorizables/rep:users"</li>
+ * <li>{@link
org.apache.jackrabbit.oak.spi.security.user.UserManagerConfig#PARAM_GROUP_PATH}:
Underneath this structure
+ * all group nodes are created. Default value is
+ * "/rep:security/rep:authorizables/rep:groups"</li>
+ * <li>{@link
org.apache.jackrabbit.oak.spi.security.user.UserManagerConfig#PARAM_DEFAULT_DEPTH}:
A positive {@code integer}
+ * greater than zero defining the depth of the default structure that is
+ * always created. Default value: 2</li>
+ * </ul>
+ *
+ * <h3>Compatibility with Jackrabbit 2.x</h3>
+ *
+ * Due to the fact that this JCR implementation is expected to deal with huge
amount
+ * of child nodes the following configuration options are no longer supported:
+ * <ul>
+ * <li>autoExpandTree</li>
+ * <li>autoExpandSize</li>
+ * </ul>
+ */
+public class UserProviderImpl implements UserProvider {
+
+ /**
+ * logger instance
+ */
+ private static final Logger log =
LoggerFactory.getLogger(UserProviderImpl.class);
+
+ private static final String DELIMITER = "/";
+ private static final int DEFAULT_DEPTH = 2;
+
+ private final Root root;
+ private final CoreValueFactory valueFactory;
+ private final NameMapper nameMapper;
+
+ private final int defaultDepth;
+
+ private final String groupPath;
+ private final String userPath;
+
+ public UserProviderImpl(Root root, CoreValueFactory valueFactory,
+ NameMapper nameMapper,
+ UserManagerConfig config) {
+ this.root = root;
+ this.valueFactory = valueFactory;
+ this.nameMapper = nameMapper;
+
+ defaultDepth =
config.getConfigValue(UserManagerConfig.PARAM_DEFAULT_DEPTH, DEFAULT_DEPTH);
+
+ groupPath = config.getConfigValue(UserManagerConfig.PARAM_GROUP_PATH,
"/rep:security/rep:authorizables/rep:groups");
+ userPath = config.getConfigValue(UserManagerConfig.PARAM_USER_PATH,
"/rep:security/rep:authorizables/rep:users");
+ }
+
+ @Override
+ public String createUser(String userID, String intermediateJcrPath) throws
RepositoryException {
+ return createAuthorizableNode(userID, false, intermediateJcrPath);
+ }
+
+ @Override
+ public String createGroup(String groupID, String intermediateJcrPath)
throws RepositoryException {
+ return createAuthorizableNode(groupID, true, intermediateJcrPath);
+ }
+
+ @Override
+ public String getContentID(String authorizableId) throws
RepositoryException {
+ try {
+ UUID uuid =
UUID.nameUUIDFromBytes(authorizableId.toLowerCase().getBytes("UTF-8"));
+ return uuid.toString();
+ } catch (UnsupportedEncodingException e) {
+ throw new RepositoryException("Unexpected error while creating
authorizable node", e);
+ }
+ }
+
+ private String createAuthorizableNode(String authorizableId, boolean
isGroup, String intermediatePath) throws RepositoryException {
+ String nodeName = Text.escapeIllegalJcrChars(authorizableId);
+ NodeUtil folder = createFolderNodes(authorizableId, nodeName, isGroup,
intermediatePath);
+
+ String ntName = (isGroup) ? UserConstants.NT_REP_GROUP :
UserConstants.NT_REP_USER;
+ NodeUtil authorizableNode = folder.addChild(nodeName, ntName);
+
+ String nodeID = getContentID(authorizableId);
+ authorizableNode.setString(JcrConstants.JCR_UUID, nodeID);
+
+ return authorizableNode.getTree().getPath();
+ }
+
+ /**
+ * Create folder structure for the authorizable to be created. The
structure
+ * consists of a tree of rep:AuthorizableFolder node(s) starting at the
+ * configured user or group path. Note that Authorizable nodes are never
+ * nested.
+ *
+ * @param authorizableId
+ * @param nodeName
+ * @param isGroup
+ * @param intermediatePath
+ * @return The folder node.
+ * @throws RepositoryException If an error occurs
+ */
+ private NodeUtil createFolderNodes(String authorizableId, String nodeName,
+ boolean isGroup, String intermediatePath)
throws RepositoryException {
+ String authRoot = (isGroup) ? groupPath : userPath;
+ NodeUtil folder;
+ Tree authTree = root.getTree(authRoot);
+ if (authTree == null) {
+ folder = new NodeUtil(valueFactory, nameMapper, root.getTree(""));
+ for (String name : Text.explode(authRoot, '/', false)) {
+ folder = folder.getOrAddChild(name,
UserConstants.NT_REP_AUTHORIZABLE_FOLDER);
+ }
+ } else {
+ folder = new NodeUtil(valueFactory, nameMapper, authTree);
+ }
+ String folderPath = getFolderPath(authorizableId, intermediatePath);
+ String[] segmts = Text.explode(folderPath, '/', false);
+ for (String segment : segmts) {
+ folder = folder.getOrAddChild(segment,
UserConstants.NT_REP_AUTHORIZABLE_FOLDER);
+ if
(!folder.hasPrimaryNodeTypeName(UserConstants.NT_REP_AUTHORIZABLE_FOLDER)) {
+ String msg = "Cannot create user/group: Intermediate folders
must be of type rep:AuthorizableFolder.";
+ throw new ConstraintViolationException(msg);
+ }
+ }
+
+ // test for colliding folder child node.
+ while (folder.hasChild(nodeName)) {
+ NodeUtil colliding = folder.getChild(nodeName);
+ if
(colliding.hasPrimaryNodeTypeName(UserConstants.NT_REP_AUTHORIZABLE_FOLDER)) {
+ log.debug("Existing folder node collides with user/group to be
created. Expanding path by: " + colliding.getName());
+ folder = colliding;
+ } else {
+ String msg = "Failed to create authorizable with id '" +
authorizableId + "' : " +
+ "Detected conflicting node of unexpected node type '"
+ colliding.getString(JcrConstants.JCR_PRIMARYTYPE, null) + "'.";
+ log.error(msg);
+ throw new ConstraintViolationException(msg);
+ }
+ }
+
+ if (!Text.isDescendantOrEqual(authRoot, folder.getTree().getPath())) {
+ throw new ConstraintViolationException("Attempt to create
user/group outside of configured scope " + authRoot);
+ }
+ return folder;
+ }
+
+ private String getFolderPath(String authorizableId, String
intermediatePath) {
+ StringBuilder sb = new StringBuilder();
+ if (intermediatePath != null && !intermediatePath.isEmpty()) {
+ sb.append(intermediatePath);
+ } else {
+ int idLength = authorizableId.length();
+ StringBuilder segment = new StringBuilder();
+ for (int i = 0; i < defaultDepth; i++) {
+ if (idLength > i) {
+ segment.append(authorizableId.charAt(i));
+ } else {
+ // escapedID is too short -> append the last char again
+ segment.append(authorizableId.charAt(idLength-1));
+ }
+
sb.append(DELIMITER).append(Text.escapeIllegalJcrChars(segment.toString()));
+ }
+ }
+ return sb.toString();
+ }
+}
\ No newline at end of file
Copied:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/security/user/UserConstants.java
(from r1370710,
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/security/user/UserConstants.java)
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/security/user/UserConstants.java?p2=jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/security/user/UserConstants.java&p1=jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/security/user/UserConstants.java&r1=1370710&r2=1371189&rev=1371189&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/security/user/UserConstants.java
(original)
+++
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/security/user/UserConstants.java
Thu Aug 9 13:05:03 2012
@@ -14,12 +14,12 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.apache.jackrabbit.oak.jcr.security.user;
+package org.apache.jackrabbit.oak.spi.security.user;
/**
* UserConstants...
*/
-interface UserConstants {
+public interface UserConstants {
String NT_REP_AUTHORIZABLE = "rep:Authorizable";
String NT_REP_AUTHORIZABLE_FOLDER = "rep:AuthorizableFolder";
Added:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/security/user/UserProvider.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/security/user/UserProvider.java?rev=1371189&view=auto
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/security/user/UserProvider.java
(added)
+++
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/security/user/UserProvider.java
Thu Aug 9 13:05:03 2012
@@ -0,0 +1,32 @@
+/*
+ * 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.user;
+
+import javax.jcr.RepositoryException;
+
+/**
+ * UserProvider deals with with creating and resolving repository content
+ * associated with {@code User}s and {@code Group}s.
+ */
+public interface UserProvider {
+
+ String createUser(String userId, String intermediateJcrPath) throws
RepositoryException;
+
+ String createGroup(String groupId, String intermediateJcrPath) throws
RepositoryException;
+
+ String getContentID(String authorizableId) throws RepositoryException;
+}
\ No newline at end of file
Modified:
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/security/user/AuthorizableImpl.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/security/user/AuthorizableImpl.java?rev=1371189&r1=1371188&r2=1371189&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/security/user/AuthorizableImpl.java
(original)
+++
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/security/user/AuthorizableImpl.java
Thu Aug 9 13:05:03 2012
@@ -20,6 +20,7 @@ import org.apache.jackrabbit.api.securit
import org.apache.jackrabbit.api.security.user.Group;
import org.apache.jackrabbit.api.security.user.User;
import org.apache.jackrabbit.oak.spi.security.principal.EveryonePrincipal;
+import org.apache.jackrabbit.oak.spi.security.user.UserConstants;
import org.apache.jackrabbit.util.Text;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Modified:
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/security/user/AuthorizableNodeCreator.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/security/user/AuthorizableNodeCreator.java?rev=1371189&r1=1371188&r2=1371189&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/security/user/AuthorizableNodeCreator.java
(original)
+++
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/security/user/AuthorizableNodeCreator.java
Thu Aug 9 13:05:03 2012
@@ -21,6 +21,7 @@ import org.apache.jackrabbit.oak.api.Cor
import org.apache.jackrabbit.oak.jcr.SessionDelegate;
import org.apache.jackrabbit.oak.jcr.value.ValueConverter;
import org.apache.jackrabbit.oak.namepath.NamePathMapper;
+import org.apache.jackrabbit.oak.spi.security.user.UserConstants;
import org.apache.jackrabbit.oak.spi.security.user.UserManagerConfig;
import org.apache.jackrabbit.util.Text;
import org.slf4j.Logger;
Modified:
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/security/user/ImpersonationImpl.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/security/user/ImpersonationImpl.java?rev=1371189&r1=1371188&r2=1371189&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/security/user/ImpersonationImpl.java
(original)
+++
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/security/user/ImpersonationImpl.java
Thu Aug 9 13:05:03 2012
@@ -22,6 +22,7 @@ import org.apache.jackrabbit.api.securit
import org.apache.jackrabbit.api.security.user.Authorizable;
import org.apache.jackrabbit.api.security.user.Impersonation;
import
org.apache.jackrabbit.oak.jcr.security.principal.PrincipalIteratorAdapter;
+import org.apache.jackrabbit.oak.spi.security.user.UserConstants;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Modified:
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/security/user/MembershipManager.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/security/user/MembershipManager.java?rev=1371189&r1=1371188&r2=1371189&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/security/user/MembershipManager.java
(original)
+++
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/security/user/MembershipManager.java
Thu Aug 9 13:05:03 2012
@@ -25,6 +25,7 @@ import org.apache.jackrabbit.commons.fla
import org.apache.jackrabbit.commons.flat.Rank;
import org.apache.jackrabbit.commons.flat.TreeManager;
import org.apache.jackrabbit.commons.iterator.RangeIteratorAdapter;
+import org.apache.jackrabbit.oak.spi.security.user.UserConstants;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Modified:
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/security/user/UserManagerImpl.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/security/user/UserManagerImpl.java?rev=1371189&r1=1371188&r2=1371189&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/security/user/UserManagerImpl.java
(original)
+++
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/security/user/UserManagerImpl.java
Thu Aug 9 13:05:03 2012
@@ -43,6 +43,7 @@ import org.apache.jackrabbit.oak.jcr.Ses
import org.apache.jackrabbit.oak.jcr.value.ValueConverter;
import org.apache.jackrabbit.oak.spi.security.principal.EveryonePrincipal;
import org.apache.jackrabbit.oak.spi.security.user.PasswordUtility;
+import org.apache.jackrabbit.oak.spi.security.user.UserConstants;
import org.apache.jackrabbit.oak.spi.security.user.UserManagerConfig;
import org.apache.jackrabbit.oak.spi.security.user.action.AuthorizableAction;
import org.slf4j.Logger;
Modified:
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/user/AuthorizableImplTest.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/user/AuthorizableImplTest.java?rev=1371189&r1=1371188&r2=1371189&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/user/AuthorizableImplTest.java
(original)
+++
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/user/AuthorizableImplTest.java
Thu Aug 9 13:05:03 2012
@@ -19,6 +19,7 @@ package org.apache.jackrabbit.oak.jcr.se
import org.apache.jackrabbit.api.security.user.Authorizable;
import org.apache.jackrabbit.api.security.user.Group;
import org.apache.jackrabbit.api.security.user.UserManager;
+import org.apache.jackrabbit.oak.spi.security.user.UserConstants;
import org.apache.jackrabbit.test.NotExecutableException;
import org.apache.jackrabbit.value.StringValue;
import org.junit.Test;
Modified:
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/user/UserManagerImplTest.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/user/UserManagerImplTest.java?rev=1371189&r1=1371188&r2=1371189&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/user/UserManagerImplTest.java
(original)
+++
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/security/user/UserManagerImplTest.java
Thu Aug 9 13:05:03 2012
@@ -22,6 +22,7 @@ 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.spi.security.principal.EveryonePrincipal;
+import org.apache.jackrabbit.oak.spi.security.user.UserConstants;
import org.apache.jackrabbit.test.NotExecutableException;
import org.junit.Ignore;
import org.junit.Test;