diff --git a/config/alfresco/templates/webscripts/org/alfresco/repository/store/content.get.desc.xml b/config/alfresco/templates/webscripts/org/alfresco/repository/store/content.get.desc.xml index f8288a241a..3eae36fdaf 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/repository/store/content.get.desc.xml +++ b/config/alfresco/templates/webscripts/org/alfresco/repository/store/content.get.desc.xml @@ -3,6 +3,7 @@ Stream a content property from the Repository /api/node/content{property}/{store_type}/{store_id}/{node_id}?a={attach?} /api/path/content{property}/{store_type}/{store_id}/{path}?a={attach?} + /api/avmpath/content{property}/{store_id}/{path}?a={attach?} guest argument \ No newline at end of file diff --git a/config/alfresco/web-scripts-application-context.xml b/config/alfresco/web-scripts-application-context.xml index d36b9b0690..a8ecf9b1b3 100644 --- a/config/alfresco/web-scripts-application-context.xml +++ b/config/alfresco/web-scripts-application-context.xml @@ -85,6 +85,7 @@ + ${spaces.store} /${spaces.company_home.childname} @@ -139,7 +140,8 @@ - + + diff --git a/source/java/org/alfresco/repo/web/scripts/Repository.java b/source/java/org/alfresco/repo/web/scripts/Repository.java index 68fbf22068..dacc91f3b5 100644 --- a/source/java/org/alfresco/repo/web/scripts/Repository.java +++ b/source/java/org/alfresco/repo/web/scripts/Repository.java @@ -32,12 +32,15 @@ import java.util.Map; import javax.servlet.http.HttpServletResponse; import org.alfresco.model.ContentModel; +import org.alfresco.repo.avm.AVMNodeConverter; import org.alfresco.repo.security.authentication.AuthenticationUtil; import org.alfresco.repo.security.authentication.AuthenticationUtil.RunAsWork; import org.alfresco.repo.tenant.TenantDeployer; import org.alfresco.repo.tenant.TenantDeployerService; import org.alfresco.repo.transaction.RetryingTransactionHelper; import org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransactionCallback; +import org.alfresco.service.cmr.avm.AVMNodeDescriptor; +import org.alfresco.service.cmr.avm.AVMService; import org.alfresco.service.cmr.model.FileFolderService; import org.alfresco.service.cmr.model.FileInfo; import org.alfresco.service.cmr.model.FileNotFoundException; @@ -49,6 +52,8 @@ import org.alfresco.service.cmr.security.PersonService; import org.alfresco.service.namespace.NamespaceService; import org.alfresco.util.AbstractLifecycleBean; import org.alfresco.web.scripts.WebScriptException; +import org.apache.commons.lang.ArrayUtils; +import org.apache.commons.lang.StringUtils; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; @@ -72,6 +77,7 @@ public class Repository implements ApplicationContextAware, ApplicationListener, private NodeService nodeService; private FileFolderService fileFolderService; private PersonService personService; + private AVMService avmService; private TenantDeployerService tenantDeployerService; // company home @@ -168,6 +174,16 @@ public class Repository implements ApplicationContextAware, ApplicationListener, this.tenantDeployerService = tenantDeployerService; } + /** + * Sets the AVM service + * + * @param avmService + */ + public void setAvmService(AVMService avmService) + { + this.avmService = avmService; + } + /* (non-Javadoc) * @see org.springframework.context.ApplicationContextAware#setApplicationContext(org.springframework.context.ApplicationContext) */ @@ -299,66 +315,109 @@ public class Repository implements ApplicationContextAware, ApplicationListener, * 2) Path - {store_type}/{store_id}/{path} * * Resolve to node via its display path. + * + * 3) AVM Path - {store_id}/{path} + * + * Resolve to AVM node via its display path * - * 3) QName - {store_type}/{store_id}/{child_qname_path} TODO: Implement + * 4) QName - {store_type}/{store_id}/{child_qname_path} TODO: Implement * * Resolve to node via its child qname path. * - * @param referenceType one of node, path or qname + * @param referenceType one of node, path, avmpath or qname * @return reference array of reference segments (as described above for each reference type) */ public NodeRef findNodeRef(String referenceType, String[] reference) { NodeRef nodeRef = null; - // construct store reference - if (reference.length < 3) + if (referenceType.equals("avmpath")) { - throw new WebScriptException(HttpServletResponse.SC_BAD_REQUEST, "Reference " + Arrays.toString(reference) + " is not properly formed"); + if (reference.length == 0) + { + throw new WebScriptException(HttpServletResponse.SC_BAD_REQUEST, "Reference " + Arrays.toString(reference) + " is not properly formed"); + } + String path = reference[0] + ":/"; + if (reference.length > 1) + { + Object[] pathElements = ArrayUtils.subarray(reference, 1, reference.length); + path += StringUtils.join(pathElements, "/"); + } + AVMNodeDescriptor nodeDesc = avmService.lookup(-1, path); + if (nodeDesc != null) + { + nodeRef = AVMNodeConverter.ToNodeRef(-1, path); + } } - StoreRef storeRef = new StoreRef(reference[0], reference[1]); - if (nodeService.exists(storeRef)) + else { - if (referenceType.equals("node")) - { - NodeRef urlRef = new NodeRef(storeRef, reference[2]); - if (nodeService.exists(urlRef)) - { - nodeRef = urlRef; - } - } - - else if (referenceType.equals("path")) - { - // TODO: Allow a root path to be specified - for now, hard-code to Company Home -// NodeRef rootNodeRef = nodeService.getRootNode(storeRef); - NodeRef rootNodeRef = getCompanyHome(); - if (reference.length == 3) - { - nodeRef = rootNodeRef; - } - else - { - String[] path = new String[reference.length - /*2*/3]; - System.arraycopy(reference, /*2*/3, path, 0, path.length); - - try + // construct store reference + if (reference.length < 3) + { + throw new WebScriptException(HttpServletResponse.SC_BAD_REQUEST, "Reference " + Arrays.toString(reference) + " is not properly formed"); + } + StoreRef storeRef = new StoreRef(reference[0], reference[1]); + if (nodeService.exists(storeRef)) + { + if (referenceType.equals("node")) + { + NodeRef urlRef = new NodeRef(storeRef, reference[2]); + if (nodeService.exists(urlRef)) + { + nodeRef = urlRef; + } + } + + else if (referenceType.equals("path")) + { + // NOTE: special case for avm based path + if (reference[0].equals(StoreRef.PROTOCOL_AVM)) { - FileInfo fileInfo = fileFolderService.resolveNamePath(rootNodeRef, Arrays.asList(path)); - nodeRef = fileInfo.getNodeRef(); + String path = reference[1] + ":/"; + if (reference.length > 2) + { + Object[] pathElements = ArrayUtils.subarray(reference, 2, reference.length); + path += StringUtils.join(pathElements, "/"); + } + AVMNodeDescriptor nodeDesc = avmService.lookup(-1, path); + if (nodeDesc != null) + { + nodeRef = AVMNodeConverter.ToNodeRef(-1, path); + } } - catch (FileNotFoundException e) + else { - // NOTE: return null node ref + // TODO: Allow a root path to be specified - for now, hard-code to Company Home + // NodeRef rootNodeRef = nodeService.getRootNode(storeRef); + NodeRef rootNodeRef = getCompanyHome(); + if (reference.length == 3) + { + nodeRef = rootNodeRef; + } + else + { + String[] path = new String[reference.length - /*2*/3]; + System.arraycopy(reference, /*2*/3, path, 0, path.length); + + try + { + FileInfo fileInfo = fileFolderService.resolveNamePath(rootNodeRef, Arrays.asList(path)); + nodeRef = fileInfo.getNodeRef(); + } + catch (FileNotFoundException e) + { + // NOTE: return null node ref + } + } } - } - } - - else - { - // TODO: Implement 'qname' style - throw new WebScriptException(HttpServletResponse.SC_BAD_REQUEST, "Web Script Node URL specified an invalid reference style of '" + referenceType + "'"); - } + } + + else + { + // TODO: Implement 'qname' style + throw new WebScriptException(HttpServletResponse.SC_BAD_REQUEST, "Web Script Node URL specified an invalid reference style of '" + referenceType + "'"); + } + } } return nodeRef; diff --git a/source/java/org/alfresco/repo/web/scripts/portlet/JSR168PortletAuthenticatorFactory.java b/source/java/org/alfresco/repo/web/scripts/portlet/JSR168PortletAuthenticatorFactory.java index 353f6db7e8..d8ab2b7dc8 100644 --- a/source/java/org/alfresco/repo/web/scripts/portlet/JSR168PortletAuthenticatorFactory.java +++ b/source/java/org/alfresco/repo/web/scripts/portlet/JSR168PortletAuthenticatorFactory.java @@ -27,9 +27,12 @@ package org.alfresco.repo.web.scripts.portlet; import javax.portlet.RenderRequest; import javax.portlet.RenderResponse; import javax.servlet.http.HttpServletResponse; +import javax.transaction.UserTransaction; +import org.alfresco.error.AlfrescoRuntimeException; import org.alfresco.repo.security.authentication.AuthenticationUtil; import org.alfresco.service.cmr.security.AuthenticationService; +import org.alfresco.service.transaction.TransactionService; import org.alfresco.web.scripts.Authenticator; import org.alfresco.web.scripts.WebScriptException; import org.alfresco.web.scripts.Description.RequiredAuthentication; @@ -50,16 +53,25 @@ public class JSR168PortletAuthenticatorFactory implements PortletAuthenticatorFa private static final Log logger = LogFactory.getLog(JSR168PortletAuthenticatorFactory.class); // dependencies - private AuthenticationService authenticationService; + private AuthenticationService unprotAuthenticationService; + private TransactionService txnService; /** * @param authenticationService */ - public void setAuthenticationService(AuthenticationService authenticationService) + public void setUnprotAuthenticationService(AuthenticationService authenticationService) { - this.authenticationService = authenticationService; + this.unprotAuthenticationService = authenticationService; } + /** + * @param transactionService + */ + public void setTransactionService(TransactionService transactionService) + { + this.txnService = transactionService; + } + /* (non-Javadoc) * @see org.alfresco.web.scripts.portlet.PortletAuthenticatorFactory#create(javax.portlet.RenderRequest, javax.portlet.RenderResponse) */ @@ -78,7 +90,6 @@ public class JSR168PortletAuthenticatorFactory implements PortletAuthenticatorFa { // dependencies private RenderRequest req; - private RenderResponse res; /** * Construct @@ -90,7 +101,6 @@ public class JSR168PortletAuthenticatorFactory implements PortletAuthenticatorFa public JSR168PortletAuthenticator(RenderRequest req, RenderResponse res) { this.req = req; - this.res = res; } /*(non-Javadoc) @@ -123,12 +133,37 @@ public class JSR168PortletAuthenticatorFactory implements PortletAuthenticatorFa { if (logger.isDebugEnabled()) logger.debug("Authenticating as user " + portalUser); - - if (!authenticationService.authenticationExists(portalUser)) + + UserTransaction txn = null; + try { - throw new WebScriptException(HttpServletResponse.SC_FORBIDDEN, "User " + portalUser + " is not a known Alfresco user"); + txn = txnService.getUserTransaction(); + txn.begin(); + + if (!unprotAuthenticationService.authenticationExists(portalUser)) + { + throw new WebScriptException(HttpServletResponse.SC_FORBIDDEN, "User " + portalUser + " is not a known Alfresco user"); + } + AuthenticationUtil.setCurrentUser(portalUser); + } + catch (Throwable err) + { + throw new AlfrescoRuntimeException("Error authenticating user: " + portalUser, err); + } + finally + { + try + { + if (txn != null) + { + txn.rollback(); + } + } + catch (Exception tex) + { + // nothing useful we can do with this + } } - AuthenticationUtil.setCurrentUser(portalUser); } return true;