You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by an...@apache.org on 2008/08/27 17:12:07 UTC

svn commit: r689499 [11/11] - in /jackrabbit/trunk: jackrabbit-api/src/main/java/org/apache/jackrabbit/api/jsr283/ jackrabbit-api/src/main/java/org/apache/jackrabbit/api/jsr283/retention/ jackrabbit-api/src/main/java/org/apache/jackrabbit/api/jsr283/se...

Modified: jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/security/user/UserManagerImplTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/security/user/UserManagerImplTest.java?rev=689499&r1=689498&r2=689499&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/security/user/UserManagerImplTest.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/security/user/UserManagerImplTest.java Wed Aug 27 08:12:04 2008
@@ -20,11 +20,12 @@
 import org.apache.jackrabbit.api.security.user.Authorizable;
 import org.apache.jackrabbit.api.security.user.Group;
 import org.apache.jackrabbit.api.security.user.User;
+import org.apache.jackrabbit.api.security.user.UserManager;
 import org.apache.jackrabbit.core.NodeImpl;
+import org.apache.jackrabbit.core.SessionImpl;
 import org.apache.jackrabbit.core.security.TestPrincipal;
 import org.apache.jackrabbit.test.NotExecutableException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.apache.jackrabbit.spi.commons.conversion.NameResolver;
 
 import javax.jcr.Credentials;
 import javax.jcr.RepositoryException;
@@ -41,13 +42,17 @@
  */
 public class UserManagerImplTest extends AbstractUserTest {
 
-    private static Logger log = LoggerFactory.getLogger(UserManagerImplTest.class);
+    private String pPrincipalName;
+    private String pUserID;
 
     protected void setUp() throws Exception {
         super.setUp();
         if (!(userMgr instanceof UserManagerImpl)) {
             throw new NotExecutableException("UserManagerImpl expected -> cannot perform test.");
         }
+        NameResolver resolver = (SessionImpl) superuser;
+        pPrincipalName = resolver.getJCRName(UserConstants.P_PRINCIPAL_NAME);
+        pUserID = resolver.getJCRName(UserConstants.P_USERID);
     }
 
     private String getTestUserId(Principal p) throws RepositoryException {
@@ -211,7 +216,7 @@
             if (auth != null) {
                 if (!auth.isGroup() && auth.hasProperty("rep:userId")) {
                     String val = auth.getProperty("rep:userId")[0].getString();
-                    Iterator users = userMgr.findAuthorizable("rep:userId", val);
+                    Iterator users = userMgr.findAuthorizables("rep:userId", val);
 
                     // the result must contain 1 authorizable
                     assertTrue(users.hasNext());
@@ -235,7 +240,7 @@
             auth.setProperty("E-Mail", new Value[] { superuser.getValueFactory().createValue("anyVal")});
 
             boolean found = false;
-            Iterator result = userMgr.findAuthorizable("E-Mail", "anyVal");
+            Iterator result = userMgr.findAuthorizables("E-Mail", "anyVal");
             while (result.hasNext()) {
                 Authorizable a = (Authorizable) result.next();
                 if (a.getID().equals(auth.getID())) {
@@ -260,14 +265,14 @@
             u = userMgr.createUser(uid, buildPassword(uid, false), p, null);
 
             boolean found = false;
-            Iterator it = ((UserManagerImpl)userMgr).findUsers("");
+            Iterator it = userMgr.findAuthorizables(pPrincipalName, null, UserManager.SEARCH_TYPE_USER);
             while (it.hasNext() && !found) {
                 User nu = (User) it.next();
                 found = nu.getID().equals(uid);
             }
-            assertTrue("Searching for \"\" must find the created user.", found);
+            assertTrue("Searching for 'null' must find the created user.", found);
 
-            it = ((UserManagerImpl)userMgr).findUsers(p.getName());
+            it = userMgr.findAuthorizables(pPrincipalName, p.getName(), UserManager.SEARCH_TYPE_USER);
             found = false;
             while (it.hasNext() && !found) {
                 User nu = (User) it.next();
@@ -275,7 +280,7 @@
             }
             assertTrue("Searching for principal-name must find the created user.", found);
 
-            it = ((UserManagerImpl)userMgr).findUsers(uid);
+            it = userMgr.findAuthorizables(pUserID, uid, UserManager.SEARCH_TYPE_USER);
             found = false;
             while (it.hasNext() && !found) {
                 User nu = (User) it.next();
@@ -284,10 +289,10 @@
             assertTrue("Searching for user id must find the created user.", found);
 
             // but search groups should not find anything
-            it = ((UserManagerImpl)userMgr).findGroups(uid);
+            it = userMgr.findAuthorizables(pPrincipalName, p.getName(), UserManager.SEARCH_TYPE_GROUP);
             assertFalse(it.hasNext());
 
-            it = ((UserManagerImpl)userMgr).findGroups("");
+            it = userMgr.findAuthorizables(pPrincipalName, null, UserManager.SEARCH_TYPE_GROUP);
             while (it.hasNext()) {
                 if (((Authorizable) it.next()).getPrincipal().getName().equals(p.getName())) {
                     fail("Searching for Groups should never find a user");
@@ -307,26 +312,24 @@
             gr = userMgr.createGroup(p);
 
             boolean found = false;
-            Iterator it = ((UserManagerImpl)userMgr).findGroups("");
+            Iterator it = userMgr.findAuthorizables(pPrincipalName, null, UserManager.SEARCH_TYPE_GROUP);
             while (it.hasNext() && !found) {
                 Group ng = (Group) it.next();
                 found = ng.getPrincipal().getName().equals(p.getName());
             }
             assertTrue("Searching for \"\" must find the created group.", found);
 
-            it = ((UserManagerImpl)userMgr).findGroups(p.getName());
-            found = false;
-            while (it.hasNext() && !found) {
-                Group ng = (Group) it.next();
-                found = ng.getPrincipal().getName().equals(p.getName());
-            }
-            assertTrue("Searching for principal-name must find the created group.", found);
+            it = userMgr.findAuthorizables(pPrincipalName, p.getName(), UserManager.SEARCH_TYPE_GROUP);
+            assertTrue(it.hasNext());
+            Group ng = (Group) it.next();
+            assertEquals("Searching for principal-name must find the created group.", p.getName(), ng.getPrincipal().getName());
+            assertFalse("Only a single group must be found for a given principal name.", it.hasNext());
 
             // but search users should not find anything
-            it = ((UserManagerImpl)userMgr).findUsers(p.getName());
+            it = userMgr.findAuthorizables(pPrincipalName, p.getName(), UserManager.SEARCH_TYPE_USER);
             assertFalse(it.hasNext());
 
-            it = ((UserManagerImpl)userMgr).findUsers("");
+            it = userMgr.findAuthorizables(pPrincipalName, null, UserManager.SEARCH_TYPE_USER);
             while (it.hasNext()) {
                 if (((Authorizable) it.next()).getPrincipal().getName().equals(p.getName())) {
                     fail("Searching for Users should never find a group");
@@ -340,14 +343,14 @@
     }
 
     public void testFindAllUsers() throws RepositoryException {
-        Iterator it = ((UserManagerImpl)userMgr).findUsers("");
+        Iterator it = userMgr.findAuthorizables(pPrincipalName, null, UserManager.SEARCH_TYPE_USER);
         while (it.hasNext()) {
             assertFalse(((Authorizable) it.next()).isGroup());
         }
     }
 
     public void testFindAllGroups() throws RepositoryException {
-        Iterator it = ((UserManagerImpl)userMgr).findGroups("");
+        Iterator it = userMgr.findAuthorizables(pPrincipalName, null, UserManager.SEARCH_TYPE_GROUP);
         while (it.hasNext()) {
             assertTrue(((Authorizable) it.next()).isGroup());
         }

Modified: jackrabbit/trunk/jackrabbit-core/src/test/repository/repository.xml
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/test/repository/repository.xml?rev=689499&r1=689498&r2=689499&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/test/repository/repository.xml (original)
+++ jackrabbit/trunk/jackrabbit-core/src/test/repository/repository.xml Wed Aug 27 08:12:04 2008
@@ -48,14 +48,14 @@
         </AccessManager>
 
         <LoginModule class="org.apache.jackrabbit.core.security.simple.SimpleLoginModule">
-           <!-- anonymous user name ('anonymous' is the default value) -->
+           <!-- 
+              anonymous user name ('anonymous' is the default value)
+            -->
            <param name="anonymousId" value="anonymous"/>
-           <param name="adminId" value="admin"/>
            <!--
-              default user name to be used instead of the anonymous user
-              when no login credentials are provided (unset by default)
-           -->
-           <!-- <param name="defaultUserId" value="superuser"/> -->
+              administrator user id (default value if param is missing is 'admin')
+            -->
+           <param name="adminId" value="admin"/>
         </LoginModule>
     </Security>
 

Modified: jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/conversion/NameParser.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/conversion/NameParser.java?rev=689499&r1=689498&r2=689499&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/conversion/NameParser.java (original)
+++ jackrabbit/trunk/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/conversion/NameParser.java Wed Aug 27 08:12:04 2008
@@ -34,11 +34,15 @@
     private static final int STATE_PREFIX = 1;
     private static final int STATE_NAME_START = 2;
     private static final int STATE_NAME = 3;
+    private static final int STATE_URI_START = 4;
+    private static final int STATE_URI = 5;
 
     /**
-     * Parses the <code>jcrName</code> and returns a new <code>Name</code>.
+     * Parses the <code>jcrName</code> (either qualified or expanded) and
+     * returns a new <code>Name</code>.
      *
-     * @param jcrName the name to be parsed
+     * @param jcrName the name to be parsed. The jcrName may either in the
+     * qualified or in the expanded form.
      * @param resolver <code>NamespaceResolver</code> use to retrieve the
      * namespace URI from the prefix contained in the given JCR name.
      * @return qName the new <code>Name</code>
@@ -59,6 +63,7 @@
 
         // parse the name
         String prefix = "";
+        String uri = null;
         int nameStart = 0;
         int state = STATE_PREFIX_START;
         boolean trailingSpaces = false;
@@ -77,6 +82,8 @@
                         throw new IllegalNameException("Invalid name prefix: "+ prefix);
                     }
                     state = STATE_NAME_START;
+                } else if (state == STATE_URI) {
+                    // ignore -> validation of uri later on.
                 } else {
                     throw new IllegalNameException("'" + c + "' not allowed in name");
                 }
@@ -86,19 +93,74 @@
                     throw new IllegalNameException("'" + c + "' not valid name start");
                 }
                 trailingSpaces = true;
-            } else if (Character.isWhitespace(c) || c == '/' || c == '[' || c == ']' || c == '*' || c == '\'' || c == '\"') {
+            } else if (Character.isWhitespace(c) || c == '[' || c == ']' || c == '*' || c == '\'' || c == '\"') {
                 throw new IllegalNameException("'" + c + "' not allowed in name");
+            } else if (c == '/') {
+                if (state == STATE_URI_START) {
+                    state = STATE_URI;
+                } else if (state != STATE_URI) {
+                    throw new IllegalNameException("'" + c + "' not allowed in name");
+                }
+                trailingSpaces = false;
+            } else if (c == '{') {
+                if (state == STATE_PREFIX_START) {
+                    state = STATE_URI_START;
+                } else if (state == STATE_URI_START || state == STATE_URI) {
+                    // second '{' in the uri-part -> no valid expanded jcr-name.
+                    // therefore reset the nameStart and change state.
+                    state = STATE_NAME;
+                    nameStart = 0;
+                } else if (state == STATE_NAME_START) {
+                    state = STATE_NAME;
+                    nameStart = i;
+                }
+                trailingSpaces = false;
+            } else if (c == '}') {
+                if (state == STATE_URI_START || state == STATE_URI) {
+                    String tmp = jcrName.substring(1, i);
+                    try {
+                        // make sure the uri is a known namespace uri
+                        // TODO: since namespace registration does not validate
+                        //       the URI format validation is omitted here
+                        resolver.getPrefix(tmp);
+                        uri = tmp;
+                        state = STATE_NAME_START;
+                    } catch (NamespaceException e) {
+                        // unknown uri -> apparently a localname starting with {
+                        // -> make sure there are no invalid characters
+                        if (tmp.indexOf(':') == -1 && tmp.indexOf('/') == -1) {
+                            state = STATE_NAME;
+                            nameStart = 0;
+                        } else {
+                            throw new IllegalNameException("Unknown uri " + tmp + ". But ':' and '/' are not allowed in a local name.");
+                        }
+                    }
+                } else if (state == STATE_PREFIX_START) {
+                    state = STATE_PREFIX; // prefix start -> validation later on will fail.
+                } else if (state == STATE_NAME_START) {
+                    state = STATE_NAME;
+                    nameStart = i;
+                }
+                trailingSpaces = false;
             } else {
                 if (state == STATE_PREFIX_START) {
                     state = STATE_PREFIX; // prefix start
                 } else if (state == STATE_NAME_START) {
                     state = STATE_NAME;
                     nameStart = i;
+                } else if (state == STATE_URI_START) {
+                    state = STATE_URI;
                 }
                 trailingSpaces = false;
             }
         }
 
+        // take care of qualified jcrNames starting with '{' that are not having
+        // a terminating '}' -> make sure there are no illegal characters present.
+        if (state == STATE_URI && (jcrName.indexOf(':') > -1 || jcrName.indexOf('/') > -1)) {
+            throw new IllegalNameException("Local name may not contain ':' nor '/'");
+        }
+
         if (nameStart == len || state == STATE_NAME_START) {
             throw new IllegalNameException("Local name must not be empty");
         }
@@ -113,8 +175,12 @@
         }
 
         // resolve prefix to uri
-        String uri = resolver.getURI(prefix);
-        return factory.create(uri, nameStart == 0 ? jcrName : jcrName.substring(nameStart, len));
+        if (uri == null) {
+            uri = resolver.getURI(prefix);
+        }
+
+        String localName = (nameStart == 0 ? jcrName : jcrName.substring(nameStart, len));
+        return factory.create(uri, localName);
     }
 
     /**

Modified: jackrabbit/trunk/jackrabbit-spi-commons/src/test/java/org/apache/jackrabbit/spi/commons/conversion/NameParserTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-spi-commons/src/test/java/org/apache/jackrabbit/spi/commons/conversion/NameParserTest.java?rev=689499&r1=689498&r2=689499&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-spi-commons/src/test/java/org/apache/jackrabbit/spi/commons/conversion/NameParserTest.java (original)
+++ jackrabbit/trunk/jackrabbit-spi-commons/src/test/java/org/apache/jackrabbit/spi/commons/conversion/NameParserTest.java Wed Aug 27 08:12:04 2008
@@ -24,6 +24,9 @@
 import junit.framework.TestCase;
 
 import javax.jcr.NamespaceException;
+import java.util.List;
+import java.util.ArrayList;
+import java.util.Iterator;
 
 /**
  * <code>NameParserTest</code>...
@@ -87,4 +90,114 @@
             }
         }
     }
+
+    public void testExpandedJcrNames() throws NamespaceException, IllegalNameException {
+        NamespaceResolver resolver = new TestNamespaceResolver();
+
+        List valid = new ArrayList();
+        // valid qualified jcr-names:
+        // String-array consisting of { jcrName , uri , localName }
+        valid.add(new String[] {"abc:{c}", "abc", "{c}"});
+        valid.add(new String[] {"abc:}c", "abc", "}c"});
+        valid.add(new String[] {"abc:c}", "abc", "c}"});
+        valid.add(new String[] {"{ab", "", "{ab"});
+        valid.add(new String[] {"ab}", "", "ab}"});
+        valid.add(new String[] {"a}bc", "", "a}bc"});
+        valid.add(new String[] {"{", "", "{"});
+        valid.add(new String[] {"}", "", "}"});
+        valid.add(new String[] {"abc", "", "abc"});
+        valid.add(new String[] {"abc{abc}", "", "abc{abc}"});
+        valid.add(new String[] {"{{abc}", "", "{{abc}"});
+        valid.add(new String[] {"{abc{abc}", "", "{abc{abc}"});
+        valid.add(new String[] {"abc {", "", "abc {"});
+        valid.add(new String[] {"abc { }", "", "abc { }"});
+        valid.add(new String[] {"{ ab }", "", "{ ab }"});
+        valid.add(new String[] {"{ }abc", "", "{ }abc"});
+        // unknown uri -> but valid non-prefixed jcr-name
+        valid.add(new String[] {"{test}abc", "", "{test}abc"});
+        valid.add(new String[] {"{ab}", "", "{ab}"});
+
+        // valid expanded jcr-names:
+        // String-array consisting of { jcrName , uri , localName }
+        valid.add(new String[] {"{http://jackrabbit.apache.org}abc", "http://jackrabbit.apache.org", "abc"});
+        valid.add(new String[] {"{http://jackrabbit.apache.org:80}abc", "http://jackrabbit.apache.org:80", "abc"});
+        valid.add(new String[] {"{http://jackrabbit.apache.org/info}abc", "http://jackrabbit.apache.org/info", "abc"});
+        valid.add(new String[] {"{jcr:jackrabbit}abc", "jcr:jackrabbit", "abc"});
+        valid.add(new String[] {"{/jackrabbit/a/b/c}abc", "/jackrabbit/a/b/c", "abc"});
+        valid.add(new String[] {"{abc}def", "abc", "def"});
+        valid.add(new String[] {"{}abc", "", "abc"});
+
+        for (Iterator it = valid.iterator(); it.hasNext();) {
+            String[] strs = (String[]) it.next();
+            try {
+                Name n = NameParser.parse(strs[0], resolver, factory);
+                assertEquals("URI mismatch", strs[1], n.getNamespaceURI());
+                assertEquals("Local name mismatch", strs[2], n.getLocalName());
+            } catch (Exception e) {
+                fail(e.getMessage() + " -> " + strs[0]);
+            }
+        }
+
+        // invalid jcr-names (neither expanded nor qualified form)
+        List invalid = new ArrayList();
+        // invalid prefix
+        invalid.add("{a:b");
+        invalid.add("}a:b");
+        invalid.add("a{b:c");
+        invalid.add("a}b:c");
+        // unknown uri -> but invalid local name with ':' and or '/'
+        invalid.add("{http//:test.apache.org}abc");
+        invalid.add("{test/test/test}abc");
+        // invalid local name containing '/'
+        invalid.add("{http://jackrabbit.apache.org}abc/dfg");
+        // invalid local name containing ':'
+        invalid.add("{http://jackrabbit.apache.org}abc:dfg");
+        // invalid local name containing ':' and '/'
+        invalid.add("{{http://jackrabbit.apache.org}abc:dfg}");
+        // invalid local name containing '/'
+        invalid.add("/a/b/c");
+        // known uri but local name missing -> must fail.
+        invalid.add("{abc}");
+        invalid.add("{http://jackrabbit.apache.org}");
+        invalid.add("{}");
+
+        for (Iterator it = invalid.iterator(); it.hasNext();) {
+            String jcrName = (String) it.next();
+            try {
+                NameParser.parse(jcrName, resolver, factory);
+                fail("Parsing '" + jcrName + "' should fail. Not a valid jcr name.");
+            } catch (IllegalNameException e) {
+                //ok
+            }
+        }
+    }
+
+    /**
+     * Dummy NamespaceResolver that only knows the empty namespace and
+     * namespaces containing either 'jackrabbit' or 'abc'. Used to test
+     * the parsing of the expanded jcr names, which should treat a jcr name with
+     * unknown namespace uri qualified jcr names.
+     */
+    private class TestNamespaceResolver implements NamespaceResolver {
+
+        public String getURI(String prefix) throws NamespaceException {
+            if (prefix.length() == 0 ||
+                prefix.indexOf("jackrabbit") > -1 ||
+                prefix.indexOf("abc") > -1 ){
+                return prefix;
+            } else {
+                throw new NamespaceException("Unknown namespace prefix " + prefix);
+            }
+        }
+
+        public String getPrefix(String uri) throws NamespaceException {
+            if (uri.length() == 0 ||
+                uri.indexOf("jackrabbit") > -1 ||
+                uri.indexOf("abc") > -1 ){
+                return uri;
+            } else {
+                throw new NamespaceException("Unknown namespace prefix " + uri);
+            }
+        }
+    }
 }
\ No newline at end of file

Modified: jackrabbit/trunk/jackrabbit-spi2jcr/src/test/resources/repository.xml
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-spi2jcr/src/test/resources/repository.xml?rev=689499&r1=689498&r2=689499&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-spi2jcr/src/test/resources/repository.xml (original)
+++ jackrabbit/trunk/jackrabbit-spi2jcr/src/test/resources/repository.xml Wed Aug 27 08:12:04 2008
@@ -51,11 +51,6 @@
            <!-- anonymous user name ('anonymous' is the default value) -->
            <param name="anonymousId" value="anonymous"/>
            <param name="adminId" value="admin"/>
-           <!--
-              default user name to be used instead of the anonymous user
-              when no login credentials are provided (unset by default)
-           -->
-           <!-- <param name="defaultUserId" value="superuser"/> -->
         </LoginModule>
     </Security>