Index: src/main/java/org/apache/jackrabbit/core/security/user/IndexNodeResolver.java =================================================================== --- src/main/java/org/apache/jackrabbit/core/security/user/IndexNodeResolver.java (revision 926354) +++ src/main/java/org/apache/jackrabbit/core/security/user/IndexNodeResolver.java (working copy) @@ -139,7 +139,7 @@ stmt.append(ISO9075.encode(pName)); if (exact) { stmt.append("='"); - stmt.append(value); + stmt.append(value.replaceAll("'", "''")); stmt.append("'"); } else { stmt.append(",'%"); @@ -164,7 +164,7 @@ if (c == '\\') { ret.append("\\\\"); } else if (c == '\'') { - ret.append("\\'"); + ret.append("''"); } else { ret.append(c); } Index: src/test/java/org/apache/jackrabbit/core/security/user/IndexNodeResolverTest.java =================================================================== --- src/test/java/org/apache/jackrabbit/core/security/user/IndexNodeResolverTest.java (revision 926354) +++ src/test/java/org/apache/jackrabbit/core/security/user/IndexNodeResolverTest.java (working copy) @@ -62,4 +62,47 @@ save(); } } + + public void testFindNodesNonExactWithApostrophe() + throws NotExecutableException, RepositoryException { + UserImpl currentUser = getCurrentUser(); + Value vs = superuser.getValueFactory().createValue("value ' with apostrophe"); + currentUser.setProperty(propertyName1, vs); + save(); + + Name propName = ((SessionImpl) superuser).getQName(propertyName1); + try { + NodeResolver nr = createNodeResolver(currentUser.getNode().getSession()); + + NodeIterator result = nr.findNodes(propName, "value ' with apostrophe", UserConstants.NT_REP_USER, false); + assertTrue("expected result", result.hasNext()); + assertEquals(currentUser.getNode().getPath(), result.nextNode().getPath()); + assertFalse("expected no more results", result.hasNext()); + } finally { + currentUser.removeProperty(propertyName1); + save(); + } + } + + + public void testFindNodesExactWithApostrophe() + throws NotExecutableException, RepositoryException { + UserImpl currentUser = getCurrentUser(); + Value vs = superuser.getValueFactory().createValue("value ' with apostrophe"); + currentUser.setProperty(propertyName1, vs); + save(); + + Name propName = ((SessionImpl) superuser).getQName(propertyName1); + try { + NodeResolver nr = createNodeResolver(currentUser.getNode().getSession()); + + NodeIterator result = nr.findNodes(propName, "value ' with apostrophe", UserConstants.NT_REP_USER, true); + assertTrue("expected result", result.hasNext()); + assertEquals(currentUser.getNode().getPath(), result.nextNode().getPath()); + assertFalse("expected no more results", result.hasNext()); + } finally { + currentUser.removeProperty(propertyName1); + save(); + } + } } \ No newline at end of file