Index: oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/lock/LockManagerImpl.java =================================================================== --- oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/lock/LockManagerImpl.java (revision 1589630) +++ oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/lock/LockManagerImpl.java (working copy) @@ -30,6 +30,8 @@ import javax.jcr.lock.LockException; import javax.jcr.lock.LockManager; +import org.apache.jackrabbit.api.security.user.Authorizable; +import org.apache.jackrabbit.api.security.user.User; import org.apache.jackrabbit.oak.api.Tree.Status; import org.apache.jackrabbit.oak.jcr.session.SessionContext; import org.apache.jackrabbit.oak.jcr.delegate.NodeDelegate; @@ -186,7 +188,7 @@ return true; } else if (sessionContext.getAttributes().get(RELAXED_LOCKING) == TRUE) { String user = sessionContext.getSessionDelegate().getAuthInfo().getUserID(); - return node.isLockOwner(user); + return node.isLockOwner(user) || isAdmin(sessionContext, user); } else { return false; } @@ -194,6 +196,19 @@ }); } + private boolean isAdmin(SessionContext sessionContext, String user) { + try { + Authorizable a = sessionContext.getUserManager().getAuthorizable( + user); + if (a != null && !a.isGroup()) { + return ((User) a).isAdmin(); + } + } catch (RepositoryException e) { + // ? + } + return false; + } + private T perform(SessionOperation operation) throws RepositoryException { return delegate.perform(operation);