diff --git a/config/alfresco/model/sitePermissionDefinitions.xml b/config/alfresco/model/sitePermissionDefinitions.xml
index 839bc43bf3..f9f195f0d8 100644
--- a/config/alfresco/model/sitePermissionDefinitions.xml
+++ b/config/alfresco/model/sitePermissionDefinitions.xml
@@ -16,17 +16,21 @@
-
+
+
+
+
+
-
+
\ No newline at end of file
diff --git a/source/java/org/alfresco/repo/site/SiteModel.java b/source/java/org/alfresco/repo/site/SiteModel.java
index f93eaa1ed3..00e12b0613 100644
--- a/source/java/org/alfresco/repo/site/SiteModel.java
+++ b/source/java/org/alfresco/repo/site/SiteModel.java
@@ -48,6 +48,6 @@ public interface SiteModel
/** Site Permission */
public static final String SITE_MANAGER = "SiteManager";
public static final String SITE_COLLABORATOR = "SiteCollaborator";
+ public static final String SITE_CONTRIBUTOR = "SiteContributor";
public static final String SITE_CONSUMER = "SiteConsumer";
-}
-
+}
\ No newline at end of file
diff --git a/source/java/org/alfresco/repo/site/script/Site.java b/source/java/org/alfresco/repo/site/script/Site.java
index b0438e6f85..934dc8c925 100644
--- a/source/java/org/alfresco/repo/site/script/Site.java
+++ b/source/java/org/alfresco/repo/site/script/Site.java
@@ -33,12 +33,12 @@ import org.alfresco.repo.jscript.ScriptNode;
import org.alfresco.repo.jscript.ScriptableHashMap;
import org.alfresco.repo.security.authentication.AuthenticationUtil;
import org.alfresco.repo.security.authentication.AuthenticationUtil.RunAsWork;
+import org.alfresco.repo.security.permissions.AccessDeniedException;
import org.alfresco.repo.site.SiteInfo;
import org.alfresco.repo.site.SiteModel;
import org.alfresco.repo.site.SiteService;
import org.alfresco.service.ServiceRegistry;
import org.alfresco.service.cmr.repository.NodeRef;
-import org.alfresco.service.cmr.security.AccessStatus;
import org.alfresco.service.cmr.security.PermissionService;
import org.alfresco.service.namespace.QName;
import org.mozilla.javascript.Scriptable;
@@ -451,6 +451,62 @@ public class Site implements Serializable
return hasContainer;
}
+ /**
+ * Apply a set of permissions to the node.
+ *
+ * @param nodeRef node reference
+ */
+ public void setPermissions(final ScriptNode node, final Object permissions)
+ {
+ final NodeRef nodeRef = node.getNodeRef();
+
+ if (permissions != null && permissions instanceof ScriptableObject)
+ {
+ // Get the permission service
+ final PermissionService permissionService = this.serviceRegistry.getPermissionService();
+
+ if (!permissionService.getInheritParentPermissions(nodeRef))
+ {
+ // remove existing permissions
+ permissionService.deletePermissions(nodeRef);
+ }
+
+ // Assign the correct permissions
+ ScriptableObject scriptable = (ScriptableObject)permissions;
+ Object[] propIds = scriptable.getIds();
+ for (int i = 0; i < propIds.length; i++)
+ {
+ // Work on each key in turn
+ Object propId = propIds[i];
+
+ // Only interested in keys that are formed of Strings
+ if (propId instanceof String)
+ {
+ // Get the value out for the specified key - it must be String
+ final String key = (String)propId;
+ final Object value = scriptable.get(key, scriptable);
+ if (value instanceof String)
+ {
+ // Set the permission on the node
+ permissionService.setPermission(nodeRef, key, (String)value, true);
+ }
+ }
+ }
+
+ // always add the site managers group with SiteManager permission
+ String managers = this.siteService.getSiteRoleGroup(getShortName(), SiteModel.SITE_MANAGER);
+ permissionService.setPermission(nodeRef, managers, SiteModel.SITE_MANAGER, true);
+
+ // now turn off inherit to finalize our permission changes
+ permissionService.setInheritParentPermissions(nodeRef, false);
+ }
+ else
+ {
+ // No permissions passed-in
+ this.resetAllPermissions(node);
+ }
+ }
+
/**
* Reset any permissions that have been set on the node.
*
@@ -462,187 +518,19 @@ public class Site implements Serializable
{
final NodeRef nodeRef = node.getNodeRef();
- // TODO Check that the node is indeed a child of the site
-
- // Check that the user has permissions to change permissions on the node
- if (AccessStatus.ALLOWED.equals(this.serviceRegistry.getPermissionService().hasPermission(nodeRef, PermissionService.CHANGE_PERMISSIONS)) == true)
- {
- // Do the work as system as we are messing about with permissions
- AuthenticationUtil.runAs(
- new AuthenticationUtil.RunAsWork