From 4e3f42d47a2fed44e97c7387f0e5c0572ed90afd Mon Sep 17 00:00:00 2001 From: David Caruana Date: Thu, 12 Jan 2006 18:40:15 +0000 Subject: [PATCH] Export permissions and permission inheritance. git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@2106 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- config/alfresco/core-services-context.xml | 3 + .../repo/exporter/ChainedExporter.java | 34 +++++++ .../repo/exporter/ExporterComponent.java | 27 +++++- .../repo/exporter/ExporterComponentTest.java | 16 ++++ .../alfresco/repo/exporter/URLExporter.java | 25 +++++ .../repo/exporter/ViewXMLExporter.java | 94 ++++++++++++++++++- .../alfresco/service/cmr/view/Exporter.java | 10 ++ source/java/org/alfresco/tools/Export.java | 23 +++++ 8 files changed, 230 insertions(+), 2 deletions(-) diff --git a/config/alfresco/core-services-context.xml b/config/alfresco/core-services-context.xml index ab868cf28c..2a5bcbf55d 100644 --- a/config/alfresco/core-services-context.xml +++ b/config/alfresco/core-services-context.xml @@ -794,6 +794,9 @@ + + + diff --git a/source/java/org/alfresco/repo/exporter/ChainedExporter.java b/source/java/org/alfresco/repo/exporter/ChainedExporter.java index 79d61f44ec..778eee786c 100644 --- a/source/java/org/alfresco/repo/exporter/ChainedExporter.java +++ b/source/java/org/alfresco/repo/exporter/ChainedExporter.java @@ -23,6 +23,7 @@ import java.util.List; import org.alfresco.service.cmr.repository.ContentData; import org.alfresco.service.cmr.repository.NodeRef; +import org.alfresco.service.cmr.security.AccessPermission; import org.alfresco.service.cmr.view.Exporter; import org.alfresco.service.cmr.view.ExporterContext; import org.alfresco.service.namespace.QName; @@ -156,6 +157,39 @@ import org.alfresco.service.namespace.QName; } } + /* (non-Javadoc) + * @see org.alfresco.service.cmr.view.Exporter#startACL(org.alfresco.service.cmr.repository.NodeRef) + */ + public void startACL(NodeRef nodeRef) + { + for (Exporter exporter : exporters) + { + exporter.startACL(nodeRef); + } + } + + /* (non-Javadoc) + * @see org.alfresco.service.cmr.view.Exporter#permission(org.alfresco.service.cmr.repository.NodeRef, org.alfresco.service.cmr.security.AccessPermission) + */ + public void permission(NodeRef nodeRef, AccessPermission permission) + { + for (Exporter exporter : exporters) + { + exporter.permission(nodeRef, permission); + } + } + + /* (non-Javadoc) + * @see org.alfresco.service.cmr.view.Exporter#endACL(org.alfresco.service.cmr.repository.NodeRef) + */ + public void endACL(NodeRef nodeRef) + { + for (Exporter exporter : exporters) + { + exporter.endACL(nodeRef); + } + } + /* (non-Javadoc) * @see org.alfresco.service.cmr.view.Exporter#startProperties(org.alfresco.service.cmr.repository.NodeRef) */ diff --git a/source/java/org/alfresco/repo/exporter/ExporterComponent.java b/source/java/org/alfresco/repo/exporter/ExporterComponent.java index 5bdedba33d..e08749bea3 100644 --- a/source/java/org/alfresco/repo/exporter/ExporterComponent.java +++ b/source/java/org/alfresco/repo/exporter/ExporterComponent.java @@ -38,7 +38,9 @@ import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeService; import org.alfresco.service.cmr.repository.datatype.TypeConversionException; import org.alfresco.service.cmr.search.SearchService; +import org.alfresco.service.cmr.security.AccessPermission; import org.alfresco.service.cmr.security.AuthenticationService; +import org.alfresco.service.cmr.security.PermissionService; import org.alfresco.service.cmr.view.ExportPackageHandler; import org.alfresco.service.cmr.view.Exporter; import org.alfresco.service.cmr.view.ExporterContext; @@ -72,6 +74,8 @@ public class ExporterComponent private ContentService contentService; private DescriptorService descriptorService; private AuthenticationService authenticationService; + private PermissionService permissionService; + /** Indent Size */ private int indentSize = 2; @@ -133,6 +137,15 @@ public class ExporterComponent this.authenticationService = authenticationService; } + /** + * @param permissionService the permission service + */ + public void setPermissionService(PermissionService permissionService) + { + this.permissionService = permissionService; + } + + /* (non-Javadoc) * @see org.alfresco.service.cmr.view.ExporterService#exportView(java.io.OutputStream, org.alfresco.service.cmr.view.ExporterCrawlerParameters, org.alfresco.service.cmr.view.Exporter) */ @@ -198,7 +211,7 @@ public class ExporterComponent try { XMLWriter writer = new XMLWriter(viewWriter, format); - return new ViewXMLExporter(namespaceService, nodeService, dictionaryService, writer); + return new ViewXMLExporter(namespaceService, nodeService, dictionaryService, permissionService, writer); } catch (UnsupportedEncodingException e) { @@ -319,6 +332,18 @@ public class ExporterComponent } exporter.endAspects(nodeRef); + // Export node permissions + Set permissions = permissionService.getAllSetPermissions(nodeRef); + if (permissions.size() > 0) + { + exporter.startACL(nodeRef); + for (AccessPermission permission : permissions) + { + exporter.permission(nodeRef, permission); + } + exporter.endACL(nodeRef); + } + // Export node properties exporter.startProperties(nodeRef); Map properties = nodeService.getProperties(nodeRef); diff --git a/source/java/org/alfresco/repo/exporter/ExporterComponentTest.java b/source/java/org/alfresco/repo/exporter/ExporterComponentTest.java index 434aaacbad..c80c2d2a0f 100644 --- a/source/java/org/alfresco/repo/exporter/ExporterComponentTest.java +++ b/source/java/org/alfresco/repo/exporter/ExporterComponentTest.java @@ -28,6 +28,7 @@ import org.alfresco.service.cmr.repository.ContentData; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeService; import org.alfresco.service.cmr.repository.StoreRef; +import org.alfresco.service.cmr.security.AccessPermission; import org.alfresco.service.cmr.view.Exporter; import org.alfresco.service.cmr.view.ExporterContext; import org.alfresco.service.cmr.view.ExporterCrawlerParameters; @@ -215,6 +216,21 @@ public class ExporterComponentTest extends BaseSpringTest // System.out.println("TestProgress: endAssocs: " + nodeRef); } + public void startACL(NodeRef nodeRef) + { +// System.out.println("TestProgress: startACL: " + nodeRef); + } + + public void permission(NodeRef nodeRef, AccessPermission permission) + { +// System.out.println("TestProgress: permission: " + permission); + } + + public void endACL(NodeRef nodeRef) + { +// System.out.println("TestProgress: endACL: " + nodeRef); + } + } } diff --git a/source/java/org/alfresco/repo/exporter/URLExporter.java b/source/java/org/alfresco/repo/exporter/URLExporter.java index 8eaf5561ec..649ca2f530 100644 --- a/source/java/org/alfresco/repo/exporter/URLExporter.java +++ b/source/java/org/alfresco/repo/exporter/URLExporter.java @@ -21,6 +21,7 @@ import java.util.Collection; import org.alfresco.service.cmr.repository.ContentData; import org.alfresco.service.cmr.repository.NodeRef; +import org.alfresco.service.cmr.security.AccessPermission; import org.alfresco.service.cmr.view.ExportPackageHandler; import org.alfresco.service.cmr.view.Exporter; import org.alfresco.service.cmr.view.ExporterContext; @@ -129,6 +130,30 @@ import org.alfresco.util.ParameterCheck; exporter.endAspect(nodeRef, aspect); } + /* (non-Javadoc) + * @see org.alfresco.service.cmr.view.Exporter#startACL(org.alfresco.service.cmr.repository.NodeRef) + */ + public void startACL(NodeRef nodeRef) + { + exporter.startACL(nodeRef); + } + + /* (non-Javadoc) + * @see org.alfresco.service.cmr.view.Exporter#permission(org.alfresco.service.cmr.repository.NodeRef, org.alfresco.service.cmr.security.AccessPermission) + */ + public void permission(NodeRef nodeRef, AccessPermission permission) + { + exporter.permission(nodeRef, permission); + } + + /* (non-Javadoc) + * @see org.alfresco.service.cmr.view.Exporter#endACL(org.alfresco.service.cmr.repository.NodeRef) + */ + public void endACL(NodeRef nodeRef) + { + exporter.endACL(nodeRef); + } + /* (non-Javadoc) * @see org.alfresco.service.cmr.view.Exporter#startProperties(org.alfresco.service.cmr.repository.NodeRef) */ diff --git a/source/java/org/alfresco/repo/exporter/ViewXMLExporter.java b/source/java/org/alfresco/repo/exporter/ViewXMLExporter.java index 40d7b97e39..bf079e238e 100644 --- a/source/java/org/alfresco/repo/exporter/ViewXMLExporter.java +++ b/source/java/org/alfresco/repo/exporter/ViewXMLExporter.java @@ -28,6 +28,8 @@ import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeService; import org.alfresco.service.cmr.repository.Path; import org.alfresco.service.cmr.repository.datatype.DefaultTypeConverter; +import org.alfresco.service.cmr.security.AccessPermission; +import org.alfresco.service.cmr.security.PermissionService; import org.alfresco.service.cmr.view.Exporter; import org.alfresco.service.cmr.view.ExporterContext; import org.alfresco.service.cmr.view.ExporterException; @@ -61,6 +63,12 @@ import org.xml.sax.helpers.AttributesImpl; private static final String EXPORTEDDATE_LOCALNAME = "exportDate"; private static final String EXPORTERVERSION_LOCALNAME = "exporterVersion"; private static final String EXPORTOF_LOCALNAME = "exportOf"; + private static final String ACL_LOCALNAME = "acl"; + private static final String ACE_LOCALNAME = "ace"; + private static final String ACCESS_LOCALNAME = "access"; + private static final String AUTHORITY_LOCALNAME = "authority"; + private static final String PERMISSION_LOCALNAME = "permission"; + private static final String INHERITPERMISSIONS_LOCALNAME = "inherit"; private static QName VIEW_QNAME; private static QName VALUES_QNAME; private static QName VALUE_QNAME; @@ -75,12 +83,19 @@ import org.xml.sax.helpers.AttributesImpl; private static QName EXPORTEDDATE_QNAME; private static QName EXPORTERVERSION_QNAME; private static QName EXPORTOF_QNAME; + private static QName ACL_QNAME; + private static QName ACE_QNAME; + private static QName ACCESS_QNAME; + private static QName AUTHORITY_QNAME; + private static QName PERMISSION_QNAME; + private static QName INHERITPERMISSIONS_QNAME; private static final AttributesImpl EMPTY_ATTRIBUTES = new AttributesImpl(); // Service dependencies private NamespaceService namespaceService; private NodeService nodeService; private DictionaryService dictionaryService; + private PermissionService permissionService; // View context private ContentHandler contentHandler; @@ -94,11 +109,13 @@ import org.xml.sax.helpers.AttributesImpl; * @param nodeService node service * @param contentHandler content handler */ - ViewXMLExporter(NamespaceService namespaceService, NodeService nodeService, DictionaryService dictionaryService, ContentHandler contentHandler) + ViewXMLExporter(NamespaceService namespaceService, NodeService nodeService, + DictionaryService dictionaryService, PermissionService permissionService, ContentHandler contentHandler) { this.namespaceService = namespaceService; this.nodeService = nodeService; this.dictionaryService = dictionaryService; + this.permissionService = permissionService; this.contentHandler = contentHandler; VIEW_QNAME = QName.createQName(NamespaceService.REPOSITORY_VIEW_PREFIX, VIEW_LOCALNAME, namespaceService); @@ -115,6 +132,12 @@ import org.xml.sax.helpers.AttributesImpl; EXPORTEDDATE_QNAME = QName.createQName(NamespaceService.REPOSITORY_VIEW_PREFIX, EXPORTEDDATE_LOCALNAME, namespaceService); EXPORTERVERSION_QNAME = QName.createQName(NamespaceService.REPOSITORY_VIEW_PREFIX, EXPORTERVERSION_LOCALNAME, namespaceService); EXPORTOF_QNAME = QName.createQName(NamespaceService.REPOSITORY_VIEW_PREFIX, EXPORTOF_LOCALNAME, namespaceService); + ACL_QNAME = QName.createQName(NamespaceService.REPOSITORY_VIEW_PREFIX, ACL_LOCALNAME, namespaceService); + ACE_QNAME = QName.createQName(NamespaceService.REPOSITORY_VIEW_PREFIX, ACE_LOCALNAME, namespaceService); + ACCESS_QNAME = QName.createQName(NamespaceService.REPOSITORY_VIEW_PREFIX, ACCESS_LOCALNAME, namespaceService); + AUTHORITY_QNAME = QName.createQName(NamespaceService.REPOSITORY_VIEW_PREFIX, AUTHORITY_LOCALNAME, namespaceService); + PERMISSION_QNAME = QName.createQName(NamespaceService.REPOSITORY_VIEW_PREFIX, PERMISSION_LOCALNAME, namespaceService); + INHERITPERMISSIONS_QNAME = QName.createQName(NamespaceService.REPOSITORY_VIEW_PREFIX, INHERITPERMISSIONS_LOCALNAME, namespaceService); } @@ -299,6 +322,75 @@ import org.xml.sax.helpers.AttributesImpl; } } + /* (non-Javadoc) + * @see org.alfresco.service.cmr.view.Exporter#startACL(org.alfresco.service.cmr.repository.NodeRef) + */ + public void startACL(NodeRef nodeRef) + { + try + { + AttributesImpl attrs = new AttributesImpl(); + boolean inherit = permissionService.getInheritParentPermissions(nodeRef); + if (!inherit) + { + attrs.addAttribute(NamespaceService.REPOSITORY_VIEW_1_0_URI, INHERITPERMISSIONS_LOCALNAME, INHERITPERMISSIONS_QNAME.toPrefixString(), null, "false"); + } + contentHandler.startElement(ACL_QNAME.getNamespaceURI(), ACL_QNAME.getLocalName(), toPrefixString(ACL_QNAME), attrs); + } + catch (SAXException e) + { + throw new ExporterException("Failed to process start ACL event - node ref " + nodeRef.toString()); + } + } + + /* (non-Javadoc) + * @see org.alfresco.service.cmr.view.Exporter#permission(org.alfresco.service.cmr.repository.NodeRef, org.alfresco.service.cmr.security.AccessPermission) + */ + public void permission(NodeRef nodeRef, AccessPermission permission) + { + try + { + // output access control entry + AttributesImpl attrs = new AttributesImpl(); + attrs.addAttribute(NamespaceService.REPOSITORY_VIEW_1_0_URI, ACCESS_LOCALNAME, ACCESS_QNAME.toPrefixString(), null, permission.getAccessStatus().toString()); + contentHandler.startElement(ACE_QNAME.getNamespaceURI(), ACE_QNAME.getLocalName(), toPrefixString(ACE_QNAME), attrs); + + // output authority + contentHandler.startElement(AUTHORITY_QNAME.getNamespaceURI(), AUTHORITY_QNAME.getLocalName(), toPrefixString(AUTHORITY_QNAME), EMPTY_ATTRIBUTES); + String authority = permission.getAuthority(); + contentHandler.characters(authority.toCharArray(), 0, authority.length()); + contentHandler.endElement(AUTHORITY_QNAME.getNamespaceURI(), AUTHORITY_QNAME.getLocalName(), toPrefixString(AUTHORITY_QNAME)); + + // output permission + contentHandler.startElement(PERMISSION_QNAME.getNamespaceURI(), PERMISSION_QNAME.getLocalName(), toPrefixString(PERMISSION_QNAME), EMPTY_ATTRIBUTES); + String strPermission = permission.getPermission(); + contentHandler.characters(strPermission.toCharArray(), 0, strPermission.length()); + contentHandler.endElement(PERMISSION_QNAME.getNamespaceURI(), PERMISSION_QNAME.getLocalName(), toPrefixString(PERMISSION_QNAME)); + + // end access control entry + contentHandler.endElement(ACE_QNAME.getNamespaceURI(), ACE_QNAME.getLocalName(), toPrefixString(ACE_QNAME)); + } + catch (SAXException e) + { + throw new ExporterException("Failed to process permission event - node ref " + nodeRef.toString() + "; permission " + permission); + } + } + + /* (non-Javadoc) + * @see org.alfresco.service.cmr.view.Exporter#endACL(org.alfresco.service.cmr.repository.NodeRef) + */ + public void endACL(NodeRef nodeRef) + { + try + { + contentHandler.endElement(ACL_QNAME.getNamespaceURI(), ACL_QNAME.getLocalName(), toPrefixString(ACL_QNAME)); + } + catch (SAXException e) + { + throw new ExporterException("Failed to process end ACL event - node ref " + nodeRef.toString()); + } + } + /* (non-Javadoc) * @see org.alfresco.service.cmr.view.Exporter#startProperties(org.alfresco.service.cmr.repository.NodeRef) */ diff --git a/source/java/org/alfresco/service/cmr/view/Exporter.java b/source/java/org/alfresco/service/cmr/view/Exporter.java index 8aedd7c22d..f8180aa1c2 100644 --- a/source/java/org/alfresco/service/cmr/view/Exporter.java +++ b/source/java/org/alfresco/service/cmr/view/Exporter.java @@ -21,6 +21,7 @@ import java.util.Collection; import org.alfresco.service.cmr.repository.ContentData; import org.alfresco.service.cmr.repository.NodeRef; +import org.alfresco.service.cmr.security.AccessPermission; import org.alfresco.service.namespace.QName; @@ -95,6 +96,15 @@ public interface Exporter * @param nodeRef */ public void endAspects(NodeRef nodeRef); + + + public void startACL(NodeRef nodeRef); + + public void permission(NodeRef nodeRef, AccessPermission permission); + + public void endACL(NodeRef nodeRef); + + /** * Start export of properties diff --git a/source/java/org/alfresco/tools/Export.java b/source/java/org/alfresco/tools/Export.java index ba8050b8c8..32669796a1 100644 --- a/source/java/org/alfresco/tools/Export.java +++ b/source/java/org/alfresco/tools/Export.java @@ -26,6 +26,7 @@ import org.alfresco.service.cmr.repository.ContentData; import org.alfresco.service.cmr.repository.MimetypeService; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.StoreRef; +import org.alfresco.service.cmr.security.AccessPermission; import org.alfresco.service.cmr.view.ExportPackageHandler; import org.alfresco.service.cmr.view.Exporter; import org.alfresco.service.cmr.view.ExporterContext; @@ -501,6 +502,27 @@ public final class Export extends Tool { } + /* (non-Javadoc) + * @see org.alfresco.service.cmr.view.Exporter#startACL(org.alfresco.service.cmr.repository.NodeRef) + */ + public void startACL(NodeRef nodeRef) + { + } + + /* (non-Javadoc) + * @see org.alfresco.service.cmr.view.Exporter#permission(org.alfresco.service.cmr.repository.NodeRef, org.alfresco.service.cmr.security.AccessPermission) + */ + public void permission(NodeRef nodeRef, AccessPermission permission) + { + } + + /* (non-Javadoc) + * @see org.alfresco.service.cmr.view.Exporter#endACL(org.alfresco.service.cmr.repository.NodeRef) + */ + public void endACL(NodeRef nodeRef) + { + } + /* (non-Javadoc) * @see org.alfresco.service.cmr.view.Exporter#startProperties(org.alfresco.service.cmr.repository.NodeRef) */ @@ -592,6 +614,7 @@ public final class Export extends Tool public void end() { } + } }