From a55663b452b14f45b035cb455a2171915a13696f Mon Sep 17 00:00:00 2001 From: Derek Hulley Date: Fri, 7 Mar 2008 13:39:01 +0000 Subject: [PATCH] Merged V2.2 to HEAD 8049: Fix for WCM-1033: Only admin users can create web projects 8051: Merged V2.1 to V2.2 8006: Merged V2.1-A to V2.1 (Virtual Server fixes) 7723: The JMX server connector is now lazily instantiated in the server context. 7734: Fix for WCM-934. 7735: The linkvalidation service now provides a public API 7742: Possible fix for ACT #361 8012: Merged V2.1-A to V2.1 7749: Fix stack overflow 7955: Fix for issue ADB-18 Forward slash '/' in username causes Advanced Search failure 7975: AR-1832: Allow setting of timeout value in the Java webservices client 7995: Include the alf_child_assoc.type_qname in the check for duplicate children. 8052: Build fix 8054: Merged V2.1 to V2.2 8045: Patch fix to solve WCM-1051 - also reruns fixed patch on previously patched repos (see CHK-2143) 8058: Fixed compilation issues following merge git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@8466 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- config/alfresco/core-services-context.xml | 8 +++- .../alfresco/patch/patch-services-context.xml | 6 +-- config/alfresco/public-services-context.xml | 1 - .../linkvalidation/LinkValidationService.java | 43 +++++-------------- .../AVMWebProjectInheritPermissionsPatch.java | 23 +++++++++- .../repo/domain/hibernate/Node.hbm.xml | 3 +- .../HibernateNodeDaoServiceImpl.java | 38 +++------------- .../repo/policy/ServiceBehaviourBinding.java | 2 +- .../impl/PermissionServiceTest.java | 6 +-- .../util/RuntimeSystemPropertiesSetter.java | 34 +++++++++++++-- 10 files changed, 84 insertions(+), 80 deletions(-) diff --git a/config/alfresco/core-services-context.xml b/config/alfresco/core-services-context.xml index 417933cd6e..b07e5aee98 100644 --- a/config/alfresco/core-services-context.xml +++ b/config/alfresco/core-services-context.xml @@ -24,6 +24,7 @@ classpath:alfresco/repository.properties classpath:alfresco/version.properties classpath:alfresco/domain/transaction.properties + classpath:alfresco/jndi.properties @@ -54,14 +55,17 @@ - + + depends-on="registry" + lazy-init="true"> diff --git a/config/alfresco/patch/patch-services-context.xml b/config/alfresco/patch/patch-services-context.xml index ec605217eb..e6e658e4e3 100644 --- a/config/alfresco/patch/patch-services-context.xml +++ b/config/alfresco/patch/patch-services-context.xml @@ -1358,8 +1358,8 @@ - - patch.avmWebProjectInheritPermissions + + patch.avmWebProjectInheritPermissions02 patch.avmWebProjectInheritPermissions.description 0 122 @@ -1379,5 +1379,5 @@ - + diff --git a/config/alfresco/public-services-context.xml b/config/alfresco/public-services-context.xml index 629d9afc17..5e45bdd3b8 100644 --- a/config/alfresco/public-services-context.xml +++ b/config/alfresco/public-services-context.xml @@ -1418,7 +1418,6 @@ getHrefManifest getBrokenHrefManifest getHrefDifference - getHrefManifestBrokenByDelete getHrefManifestBrokenByNewOrMod getHrefsDependentUponFile diff --git a/source/java/org/alfresco/linkvalidation/LinkValidationService.java b/source/java/org/alfresco/linkvalidation/LinkValidationService.java index f0cfae4f62..6ce9ca34a5 100644 --- a/source/java/org/alfresco/linkvalidation/LinkValidationService.java +++ b/source/java/org/alfresco/linkvalidation/LinkValidationService.java @@ -39,6 +39,13 @@ public interface LinkValidationService public void onBootstrap(); public void onShutdown(); + /** + * Returns the poll interval (in milliseconds) used to check + * for new snapshots in staging. + */ + public int getPollInterval(); + + //------------------------------------------------------------------------- /** * This function is applied to a webapp in staging, and is just a @@ -105,43 +112,13 @@ public interface LinkValidationService throws AVMNotFoundException, SocketException; - //------------------------------------------------------------------------- - /** - * Fetches a manifest of all hyperlinks broken by files - * deleted in a HrefDifference. Files and hrefs in this - * manifest will be in the namespace of the src in the - * HrefDifference. For example, suppose the "test" - * web project had a ROOT webapp with a link within - * "moo.html" that pointed to: "hamlet.html". - * Now suppose that user 'alice' proposes to delete "hamlet.html". - * Because 'alice' is the 'src' and staging is the 'dst' - * in the HrefDifference, all files and hyperlinks appear from - * the perspective of the main working store within - * alice's sandbox. Thus, the broken link info is as follows: - * - *
-    *  File containing broken link:
-    *     test--alice:/www/avm_webapps/ROOT/moo.html
-    *
-    *  Broken link:
-    *   http://alice.test.www--sandbox.version--v-1.127-0-0-1.ip.alfrescodemo.net:8180/hamlet.html
-    * 
- * - * @param hdiff The difference between two webapps obtained - * by calling getHrefDifference(). - */ - //------------------------------------------------------------------------- - public HrefManifest getHrefManifestBrokenByDelete(HrefDifference hdiff); - - - //------------------------------------------------------------------------- /** * Fetches a manifest of all hyperlinks broken in new or modified files in - * an HrefDifference. Similar to getHrefManifestBrokenByDelete(), - * the entries in this manifest are in the 'src' namespace of the - * HrefDifference operation (i.e.: files & urls from alice, not staging). + * an HrefDifference. The entries in this manifest are in the 'src' + * namespace of the HrefDifference operation + * (i.e.: files & urls from alice, not staging). * * @param hdiff The difference between two webapps obtained * by calling getHrefDifference(). diff --git a/source/java/org/alfresco/repo/admin/patch/impl/AVMWebProjectInheritPermissionsPatch.java b/source/java/org/alfresco/repo/admin/patch/impl/AVMWebProjectInheritPermissionsPatch.java index 264e2e4331..3a0ea3d8a9 100644 --- a/source/java/org/alfresco/repo/admin/patch/impl/AVMWebProjectInheritPermissionsPatch.java +++ b/source/java/org/alfresco/repo/admin/patch/impl/AVMWebProjectInheritPermissionsPatch.java @@ -24,16 +24,21 @@ */ package org.alfresco.repo.admin.patch.impl; +import java.util.List; + import org.alfresco.i18n.I18NUtil; +import org.alfresco.model.WCMAppModel; import org.alfresco.repo.admin.patch.AbstractPatch; import org.alfresco.repo.importer.ImporterBootstrap; -import org.alfresco.repo.search.Indexer; import org.alfresco.repo.search.IndexerAndSearcher; +import org.alfresco.service.cmr.repository.ChildAssociationRef; +import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.search.ResultSet; import org.alfresco.service.cmr.search.ResultSetRow; import org.alfresco.service.cmr.search.SearchParameters; import org.alfresco.service.cmr.search.SearchService; import org.alfresco.service.cmr.security.PermissionService; +import org.alfresco.service.namespace.RegexQNamePattern; /** * Patch to break the inheritance of permissions on AVM Web Project Folders. @@ -81,7 +86,23 @@ public class AVMWebProjectInheritPermissionsPatch extends AbstractPatch rs = searchService.query(sp); for (ResultSetRow row : rs) { + // break permission inheritance for the Web Project nodes this.permissionService.setInheritParentPermissions(row.getNodeRef(), false); + + // ensure that permissions are explicitly assigned for all Content Manager roles + List userInfoRefs = this.nodeService.getChildAssocs( + row.getNodeRef(), WCMAppModel.ASSOC_WEBUSER, RegexQNamePattern.MATCH_ALL); + for (ChildAssociationRef ref : userInfoRefs) + { + NodeRef userInfoRef = ref.getChildRef(); + String username = (String)nodeService.getProperty(userInfoRef, WCMAppModel.PROP_WEBUSERNAME); + String userrole = (String)nodeService.getProperty(userInfoRef, WCMAppModel.PROP_WEBUSERROLE); + + if ("ContentManager".equals(userrole)) + { + this.permissionService.setPermission(row.getNodeRef(), username, "ContentManager", true); + } + } } } finally diff --git a/source/java/org/alfresco/repo/domain/hibernate/Node.hbm.xml b/source/java/org/alfresco/repo/domain/hibernate/Node.hbm.xml index 727627a5a4..b26f404e1f 100644 --- a/source/java/org/alfresco/repo/domain/hibernate/Node.hbm.xml +++ b/source/java/org/alfresco/repo/domain/hibernate/Node.hbm.xml @@ -327,13 +327,14 @@ assoc.id - + select assoc.id from org.alfresco.repo.domain.hibernate.ChildAssocImpl as assoc where assoc.parent = :parent and + assoc.typeQName = :typeQName and assoc.childNodeName = :childNodeName and assoc.childNodeNameCrc = :childNodeNameCrc diff --git a/source/java/org/alfresco/repo/node/db/hibernate/HibernateNodeDaoServiceImpl.java b/source/java/org/alfresco/repo/node/db/hibernate/HibernateNodeDaoServiceImpl.java index 325a7bc743..6529f13f4e 100644 --- a/source/java/org/alfresco/repo/node/db/hibernate/HibernateNodeDaoServiceImpl.java +++ b/source/java/org/alfresco/repo/node/db/hibernate/HibernateNodeDaoServiceImpl.java @@ -99,7 +99,7 @@ public class HibernateNodeDaoServiceImpl extends HibernateDaoSupport implements private static final String QUERY_GET_PRIMARY_CHILD_NODE_STATUSES = "node.GetPrimaryChildNodeStatuses"; private static final String QUERY_GET_CHILD_ASSOCS = "node.GetChildAssocs"; private static final String QUERY_GET_CHILD_ASSOCS_BY_ALL = "node.GetChildAssocsByAll"; - private static final String QUERY_GET_CHILD_ASSOC_ID_BY_NAME = "node.GetChildAssocIdByShortName"; + private static final String QUERY_GET_CHILD_ASSOC_ID_TYPE_AND_BY_NAME = "node.GetChildAssocIdByTypeAndName"; private static final String QUERY_GET_CHILD_ASSOC_BY_TYPE_AND_NAME = "node.GetChildAssocByTypeAndName"; private static final String QUERY_GET_CHILD_ASSOC_REFS = "node.GetChildAssocRefs"; private static final String QUERY_GET_CHILD_ASSOC_REFS_BY_QNAME = "node.GetChildAssocRefsByQName"; @@ -772,42 +772,17 @@ public class HibernateNodeDaoServiceImpl extends HibernateDaoSupport implements } } - /* - * The parent node is explicitly locked. A query is then issued to ensure that there - * are no duplicates in the index on the child assoc table. The child association is - * then modified, although not directly in the database. The lock guards against other - * transactions modifying the unique index without this transaction's knowledge. - */ final Node parentNode = childAssoc.getParent(); -// if (loggerChildAssoc.Enabled()) -// { -// loggerChildAssoc.debug( -// "Locking parent node for modifying child assoc: \n" + -// " Parent: " + parentNode + "\n" + -// " Child Assoc: " + childAssoc + "\n" + -// " New Name: " + childNameNew); -// } -// for (int i = 0; i < maxLockRetries; i++) -// { -// try -// { -// getSession().lock(parentNode, LockMode.UPGRADE); -// // The lock was good, proceed -// break; -// } -// catch (LockAcquisitionException e) {} -// catch (ConcurrencyFailureException e) {} -// // We can retry after a short pause that gets potentially longer each time -// try { Thread.sleep(randomWaitTime.nextInt(500 * i + 500)); } catch (InterruptedException ee) {} -// } + final QNameEntity assocTypeQName = childAssoc.getTypeQName(); // We have the lock, so issue the query to check HibernateCallback callback = new HibernateCallback() { public Object doInHibernate(Session session) { Query query = session - .getNamedQuery(HibernateNodeDaoServiceImpl.QUERY_GET_CHILD_ASSOC_ID_BY_NAME) + .getNamedQuery(HibernateNodeDaoServiceImpl.QUERY_GET_CHILD_ASSOC_ID_TYPE_AND_BY_NAME) .setParameter("parent", parentNode) + .setParameter("typeQName", assocTypeQName) .setParameter("childNodeName", childNameNewShort) .setLong("childNodeNameCrc", childNameNewCrc); return query.uniqueResult(); @@ -822,15 +797,14 @@ public class HibernateNodeDaoServiceImpl extends HibernateDaoSupport implements logger.debug( "Duplicate child association detected: \n" + " Existing Child Assoc: " + childAssocIdExisting + "\n" + - " Assoc Name: " + childName); + " Child Name: " + childName); } throw new DuplicateChildNodeNameException( parentNode.getNodeRef(), childAssoc.getTypeQName().getQName(), childName); } - // We got past that, so we can just update the entity and know that no other transaction - // can lock the parent. + // We got past that, so we can just update the entity childAssoc.setChildNodeName(childNameNewShort); childAssoc.setChildNodeNameCrc(childNameNewCrc); diff --git a/source/java/org/alfresco/repo/policy/ServiceBehaviourBinding.java b/source/java/org/alfresco/repo/policy/ServiceBehaviourBinding.java index 733db98bc3..1d244334c7 100644 --- a/source/java/org/alfresco/repo/policy/ServiceBehaviourBinding.java +++ b/source/java/org/alfresco/repo/policy/ServiceBehaviourBinding.java @@ -83,7 +83,7 @@ public class ServiceBehaviourBinding implements BehaviourBinding @Override public String toString() { - return "ServiceBinding[service=" + this + "]"; + return "ServiceBinding[service=" + service + "]"; } } diff --git a/source/java/org/alfresco/repo/security/permissions/impl/PermissionServiceTest.java b/source/java/org/alfresco/repo/security/permissions/impl/PermissionServiceTest.java index 9755df58e5..0aa7eceb31 100644 --- a/source/java/org/alfresco/repo/security/permissions/impl/PermissionServiceTest.java +++ b/source/java/org/alfresco/repo/security/permissions/impl/PermissionServiceTest.java @@ -112,13 +112,13 @@ public class PermissionServiceTest extends AbstractPermissionTest AuthenticationUtil.setSystemUserAsCurrentUser(); try { - assertFalse(serviceRegistry.getPermissionService().hasPermission(rootNodeRef, PermissionService.CONSUMER) == AccessStatus.ALLOWED); + assertTrue(serviceRegistry.getPermissionService().hasPermission(rootNodeRef, PermissionService.CONSUMER) == AccessStatus.ALLOWED); assertTrue(serviceRegistry.getPermissionService().hasPermission(rootNodeRef, PermissionService.DELETE) == AccessStatus.ALLOWED); assertTrue(serviceRegistry.getPermissionService().hasPermission(rootNodeRef, PermissionService.READ) == AccessStatus.ALLOWED); assertTrue(serviceRegistry.getPermissionService().hasPermission(rootNodeRef, PermissionService.ADD_CHILDREN) == AccessStatus.ALLOWED); - assertFalse(serviceRegistry.getPermissionService().hasPermission(rootNodeRef, PermissionService.CANCEL_CHECK_OUT) == AccessStatus.ALLOWED); + assertTrue(serviceRegistry.getPermissionService().hasPermission(rootNodeRef, PermissionService.CANCEL_CHECK_OUT) == AccessStatus.ALLOWED); assertTrue(serviceRegistry.getPermissionService().hasPermission(rootNodeRef, PermissionService.CHECK_OUT) == AccessStatus.ALLOWED); - assertFalse(serviceRegistry.getPermissionService().hasPermission(rootNodeRef, PermissionService.COORDINATOR) == AccessStatus.ALLOWED); + assertTrue(serviceRegistry.getPermissionService().hasPermission(rootNodeRef, PermissionService.COORDINATOR) == AccessStatus.ALLOWED); } finally { diff --git a/source/java/org/alfresco/util/RuntimeSystemPropertiesSetter.java b/source/java/org/alfresco/util/RuntimeSystemPropertiesSetter.java index 3397c1886d..afb66c27f6 100644 --- a/source/java/org/alfresco/util/RuntimeSystemPropertiesSetter.java +++ b/source/java/org/alfresco/util/RuntimeSystemPropertiesSetter.java @@ -49,6 +49,10 @@ import org.springframework.core.Ordered; public class RuntimeSystemPropertiesSetter implements BeanFactoryPostProcessor, Ordered { + private static org.apache.commons.logging.Log log= + org.apache.commons.logging.LogFactory.getLog( + RuntimeSystemPropertiesSetter.class ); + // default: just before PropertyPlaceholderConfigurer private int order = Integer.MAX_VALUE - 1; @@ -61,14 +65,38 @@ public class RuntimeSystemPropertiesSetter String path=null; try { + // Typically, the value of 'path' will be something like: + // + // $TOMCAT_HOME/webapps/alfresco/WEB-INF/classes/alfresco/alfresco-jmxrmi.password + // or: $TOMCAT_HOME/shared/classes/alfresco/alfresco-jmxrmi.password + // + // However, if WCM isn't installed there won't be a JMX password file. + // Therefore, while it's important to choke on bad paths, a missing + // password file must be acceptable -- it just means that WCM virtualization + // will be disabled later when org.alfresco.mbeans.VirtServerRegistry + // refuses to bring up the serverConnector bean. + path = loader.getResource("alfresco/alfresco-jmxrmi.password").toURI().getPath(); } catch (java.net.URISyntaxException e ) { e.printStackTrace(); } + catch (Exception e ) + { + if ( log.isWarnEnabled() ) + log.warn( + "Could not find alfresco-jmxrmi.password on classpath"); + } - String alfresco_jmx_dir = - path.substring(0,path.lastIndexOf("/alfresco-jmxrmi.password")); + if ( path == null ) { System.setProperty("alfresco.jmx.dir", ""); } + else + { + String alfresco_jmx_dir = + path.substring(0,path.lastIndexOf("/alfresco-jmxrmi.password")); - System.setProperty("alfresco.jmx.dir", alfresco_jmx_dir); + // The value of 'alfresco.jmx.dir' will be something like: + // $TOMCAT_HOME/webapps/alfresco/WEB-INF/classes/alfresco + + System.setProperty("alfresco.jmx.dir", alfresco_jmx_dir); + } } public void setOrder(int order) { this.order = order; } public int getOrder() { return order; }