From 2f4d6a3e27d7a4573cd2961b33ddd24a350883e2 Mon Sep 17 00:00:00 2001 From: Dave Ward Date: Fri, 29 Jun 2012 21:48:50 +0000 Subject: [PATCH] Merged V4.1-BUG-FIX to HEAD 38321: Removing unused installer resource file 38322: ALF-14652: Installation: Friendly message about busy Tomcat SSL port should be more exact - Translations from Gloria 38336: Merged DEV to V4.1-BUG-FIX 38212: ALF-13650: Double byte code white spaces in front and at the end of a file name should be removed as the same behaviour of Single byte code white space. Altered Alfresco.util.trim() in order to support double byte code white spaces. 38337: Fixed ALF-14117 "Unable to load 'old version' wiki page if the title is in Japanese" - Regression: The fixes for ALF-6737 & ALF-8427 provided 2 different solutions for the same problem resulting in a double encoding of the page title 38344: ALF-14674: Deployment installer still doesn't work - Use ${installdir.escape_backslashes} instead of ${installdir} 38345: ALF-14824 - About Share - animation on about dialog corrupts screen on iPad 38400: ALF-14438: Accepted patch from BRANCHES/DEV/BELARUS/... with some modifications and using activiti-naming-conventions 38415: ALF-14808 - patched YUI2.9.0 to handle 'touchend' event to correctly hide pop-up menus when a click/touch occurs outside the menu area. 38417: Fix for ALF-14812 and ALF-14813 - evaluator config for Edit Online and Edit Offline actions. 38421: Fix for ALF-14814 - correct height of previewer area when no preview is available. Also improved the handling of Previewer for iOS - skip the WebPreviewer plugin altogether - this removes the unhelpful message about Installing Adobe Flash etc. 38471: ALF-14674: Deployment installer still doesn't work - Correction to use of ${installdir.escape_backslashes} 38540: Corrected use of ?html and ?js_string operators for element ID 38548: ALF-14829 - Removed delay added iPad specific CSS to increase hit area of actions in main and more menus. 38549: ALF-11861: Maintain the same defuault root of WebDav for Alfresco 4.0 as was in pre-4.0 Removed overriding protocols.rootPath property from installer and enterprise overlay versions of alfresco-global.properties so that correct setting in repository.properties is used. 38575: ALF-14504: PostgreSQL: Schema differences upgrading from 3.4.8 to 4.0.2 Allow for primary key alf_node_assoc_pkey to have an optional '1' at the end of its name (PostgreSQL) - for upgrade path 3.4.8 to 4.0.2 38582: ALF-14504: PostgreSQL: Schema differences upgrading from 3.4.8 to 4.0.2 Ignore avm_child_entries PK name differences. 38585: ALF-14599 ftp.ipv6.enabled is configured in alfresco-global by default, but is not injected nor implemented for FTP 38586: Merged V3.4-BUG-FIX to V4.1-BUG-FIX 38354: ALF-14738: Add information to manifests in all war files 38393: ALF-10804: WCM - Using multiple instances of the same TinyMCE plugin in the same form causes configuration inheritance issues - TinyMCE initialization and configuration moved into _createTinyMCE:function() - TinyMCE initialization moved to onLoadContent event callback - TinyMCE settings application uses init() now 38406: ALF-14738: use correct property for build number 38438: ALF-14856: Documents uploaded via WebDAV mount from Windows 7, and copied by a jscript rule are zero-length - Simplified fix. Don't fire on-create-node-trigger if on-content-create-trigger would fire, so that policy.content.update.ignoreEmpty=true is respected - policy.content.update.ignoreEmpty=true now the default as it is required by OSX and Windows 7 38459: ALF-13567: "manager-osx" should be called "Application Manager" inside the installation folder - Fix from Bitrock 38460: ALF-11817: No versioning when modify/save file content via mapped Webdav network drive - parseRequestHeader() now trys harder to parse the "Microsoft-WebDAV-MiniRedir" client's buggy "Lock-Token" header. 38476: Merged DEV to V3.4-BUG-FIX 38475: ALF-14868:CLONE - 'Error 0x80070057: The parameter is incorrect' occurs often during upload of documents via WebDAV Port fix from ALF-14636: Make XML-streaming WebDAV Methods buffer their response in case of transaction retries 38502: ALF-14876: awe.log and share.log were left after uninstalling Alfresco - Fix by Bitrock 38561: Merged V3.4 to V3.4-BUG-FIX 38414: ALF-14402: Merged PATCHES/V3.4.6 to V3.4 38028: ALF-13827: Prevent excessive cache chatter by avoiding replicating the aspects, properties and parent associations caches 38416: (RECORD ONLY) ALF-14852: Merged V3.4-BUG-FIX to V3.4 37835: Fix for ALF-14429 - Recently Modified dashlet takes up to 30 seconds to load after upgrade to Alfresco 3.4.6.23 git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@38587 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../org/alfresco/repo/webdav/LockMethod.java | 2 + .../alfresco/repo/webdav/PropFindMethod.java | 15 ++---- .../alfresco/repo/webdav/UnlockMethod.java | 50 +++++++++++++---- .../alfresco/repo/webdav/WebDAVMethod.java | 54 ++++++++++++------- 4 files changed, 79 insertions(+), 42 deletions(-) diff --git a/source/java/org/alfresco/repo/webdav/LockMethod.java b/source/java/org/alfresco/repo/webdav/LockMethod.java index b07c56c162..4e86354d42 100644 --- a/source/java/org/alfresco/repo/webdav/LockMethod.java +++ b/source/java/org/alfresco/repo/webdav/LockMethod.java @@ -511,6 +511,8 @@ public class LockMethod extends WebDAVMethod // Close off the XML xml.endElement(WebDAV.DAV_NS, WebDAV.XML_PROP, WebDAV.XML_NS_PROP); + // Send remaining data + flushXML(xml); } diff --git a/source/java/org/alfresco/repo/webdav/PropFindMethod.java b/source/java/org/alfresco/repo/webdav/PropFindMethod.java index 7f9dffdf47..b646798f46 100644 --- a/source/java/org/alfresco/repo/webdav/PropFindMethod.java +++ b/source/java/org/alfresco/repo/webdav/PropFindMethod.java @@ -316,22 +316,15 @@ public class PropFindMethod extends WebDAVMethod xml.endElement(WebDAV.DAV_NS, WebDAV.XML_MULTI_STATUS, WebDAV.XML_NS_MULTI_STATUS); // Send remaining data - xml.flush(); + flushXML(xml); } @Override - protected XMLWriter createXMLWriter() throws IOException + protected OutputFormat getXMLOutputFormat() { String userAgent = m_request.getHeader("User-Agent"); - if ((null != userAgent) && userAgent.toLowerCase().startsWith("microsoft-webdav-miniredir/5.1.")) - { - // ALF-9952: XP requires compact XML for this response - return new XMLWriter(m_response.getOutputStream(), OutputFormat.createCompactFormat()); - } - else - { - return super.createXMLWriter(); - } + return ((null != userAgent) && userAgent.toLowerCase().startsWith("microsoft-webdav-miniredir/5.1.")) ? OutputFormat.createCompactFormat() : super.getXMLOutputFormat(); + } /** diff --git a/source/java/org/alfresco/repo/webdav/UnlockMethod.java b/source/java/org/alfresco/repo/webdav/UnlockMethod.java index 7095feb16d..4b6377c0cb 100644 --- a/source/java/org/alfresco/repo/webdav/UnlockMethod.java +++ b/source/java/org/alfresco/repo/webdav/UnlockMethod.java @@ -23,6 +23,7 @@ import java.util.Set; import javax.servlet.http.HttpServletResponse; import org.alfresco.model.ContentModel; +import org.alfresco.repo.security.authentication.AuthenticationException; import org.alfresco.service.cmr.model.FileInfo; import org.alfresco.service.cmr.model.FileNotFoundException; import org.alfresco.service.cmr.repository.NodeRef; @@ -77,20 +78,47 @@ public class UnlockMethod extends WebDAVMethod strLockTokenHeader = "<" + strLockTokenHeader + ">"; } if (strLockTokenHeader.startsWith("<" + WebDAV.OPAQUE_LOCK_TOKEN) && strLockTokenHeader.endsWith(">")) + { + try { - try - { - m_strLockToken = strLockTokenHeader.substring( - WebDAV.OPAQUE_LOCK_TOKEN.length() + 1, - strLockTokenHeader.length() - 1); - } - catch (IndexOutOfBoundsException e) - { - logger.warn("Failed to parse If header: " + strLockTokenHeader); - } + m_strLockToken = strLockTokenHeader.substring( + WebDAV.OPAQUE_LOCK_TOKEN.length() + 1, + strLockTokenHeader.length() - 1); } - } + catch (IndexOutOfBoundsException e) + { + logger.warn("Failed to parse If header: " + strLockTokenHeader); + } + } + } + // ALF-11817 If the header Lock-Token is incorrect (without < and >). + else + { + // Build the lock token. + FileInfo lockNodeInfo = null; + String userName = null; + try + { + userName = getDAVHelper().getAuthenticationService().getCurrentUserName(); + lockNodeInfo = getNodeForPath(getRootNodeRef(), getPath(), getServletPath()); + } + catch (AuthenticationException ex) + { + throw new WebDAVServerException(HttpServletResponse.SC_UNAUTHORIZED); + } + catch (FileNotFoundException e) + { + throw new WebDAVServerException(HttpServletResponse.SC_NOT_FOUND); + } + String buildLockToken = WebDAV.makeLockToken(lockNodeInfo.getNodeRef(), userName); + // End build. + if (strLockTokenHeader.equalsIgnoreCase(buildLockToken)) + { + m_strLockToken = strLockTokenHeader; + } + } + } // If there is no token this is a bad request so send an error back if (m_strLockToken == null) { diff --git a/source/java/org/alfresco/repo/webdav/WebDAVMethod.java b/source/java/org/alfresco/repo/webdav/WebDAVMethod.java index 07663f73d4..894989890d 100644 --- a/source/java/org/alfresco/repo/webdav/WebDAVMethod.java +++ b/source/java/org/alfresco/repo/webdav/WebDAVMethod.java @@ -19,6 +19,7 @@ package org.alfresco.repo.webdav; import java.io.BufferedReader; +import java.io.CharArrayWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; @@ -118,6 +119,7 @@ public abstract class WebDAVMethod protected HttpServletResponse m_response; private File m_requestBody; private ServletInputStream m_inputStream; + private CharArrayWriter m_xmlWriter; private BufferedReader m_reader; // WebDAV helper @@ -837,30 +839,26 @@ public abstract class WebDAVMethod return m_strPath; } + /** + * Returns the format required for an XML response. This may vary per method. + */ + protected OutputFormat getXMLOutputFormat() + { + // Check if debug output or XML pretty printing is enabled + return (XMLPrettyPrint || logger.isDebugEnabled()) ? OutputFormat.createPrettyPrint() : OutputFormat.createCompactFormat(); + } + /** * Create an XML writer for the response * * @return XMLWriter * @exception IOException */ - protected XMLWriter createXMLWriter() throws IOException + protected final XMLWriter createXMLWriter() throws IOException { - // Check if debug output or XML pretty printing is enabled - - XMLWriter writer = null; - - if (XMLPrettyPrint == true || logger.isDebugEnabled()) - { - writer = new XMLWriter(m_response.getWriter(), OutputFormat.createPrettyPrint()); - } - else - { - writer = new XMLWriter(m_response.getWriter(), OutputFormat.createCompactFormat()); - } - - // Return the writer - - return writer; + // Buffer the XML response, in case we have to reset mid-transaction + m_xmlWriter = new CharArrayWriter(1024); + return new XMLWriter(m_xmlWriter, getXMLOutputFormat()); } /** @@ -1446,13 +1444,29 @@ public abstract class WebDAVMethod } /** - * Flushs a XML Writer. + * Determines whether the XMLWriter should be flushed when XML is flushed. For some reason this is method specific. + * @return true if the XMLWriter should be flushed when XML is flushed + */ + protected boolean shouldFlushXMLWriter() + { + return true; + } + + /** + * Flushes all XML written so far to the response * * @param xml XMLWriter that should be flushed */ - protected void flushXML(XMLWriter xml) throws IOException + protected final void flushXML(XMLWriter writer) throws IOException { - xml.flush(); + if (shouldFlushXMLWriter()) + { + writer.flush(); + } + + m_response.getWriter().write(m_xmlWriter.toCharArray()); + + m_xmlWriter.reset(); } /**