Author: angela
Date: Thu Nov 14 15:30:16 2013
New Revision: 1541933

URL: http://svn.apache.org/r1541933
Log:
OAK-527: permissions (wip)

Modified:
    
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/NodeImpl.java

Modified: 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/NodeImpl.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/NodeImpl.java?rev=1541933&r1=1541932&r2=1541933&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/NodeImpl.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/NodeImpl.java
 Thu Nov 14 15:30:16 2013
@@ -82,12 +82,14 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import static com.google.common.base.Preconditions.checkNotNull;
+import static com.google.common.collect.Sets.newLinkedHashSet;
 import static java.util.Arrays.asList;
 import static java.util.Collections.singleton;
 import static org.apache.jackrabbit.JcrConstants.JCR_MIXINTYPES;
 import static org.apache.jackrabbit.JcrConstants.JCR_PRIMARYTYPE;
 import static org.apache.jackrabbit.oak.api.Type.NAME;
 import static org.apache.jackrabbit.oak.api.Type.NAMES;
+import static org.apache.jackrabbit.oak.util.TreeUtil.getNames;
 
 /**
  * TODO document
@@ -928,7 +930,7 @@ public class NodeImpl<T extends NodeDele
     }
 
     @Override
-    public void removeMixin(String mixinName) throws RepositoryException {
+    public void removeMixin(final String mixinName) throws RepositoryException 
{
         final String oakTypeName = getOakName(checkNotNull(mixinName));
         perform(new ItemWriteOperation<Void>() {
             @Override
@@ -938,6 +940,16 @@ public class NodeImpl<T extends NodeDele
                     throw new VersionException(
                             "Cannot remove mixin type. Node is checked in.");
                 }
+
+                // check for NODE_TYPE_MANAGEMENT permission here as we cannot
+                // distinguish between a combination of removeMixin and 
addMixin
+                // and Node#remove plus subsequent addNode when it comes to
+                // autocreated properties like jcr:create, jcr:uuid and so 
forth.
+                Set<String> mixins = newLinkedHashSet(getNames(dlg.getTree(), 
JCR_MIXINTYPES));
+                if (!mixins.isEmpty() && mixins.remove(getOakName(mixinName))) 
{
+                    PropertyState prop = 
PropertyStates.createProperty(JCR_MIXINTYPES, mixins, NAMES);
+                    
sessionContext.getAccessManager().checkPermissions(dlg.getTree(), prop, 
Permissions.NODE_TYPE_MANAGEMENT);
+                }
             }
             @Override
             public Void perform() throws RepositoryException {


Reply via email to