diff --git a/source/java/org/alfresco/repo/cmis/ws/DMDiscoveryServicePort.java b/source/java/org/alfresco/repo/cmis/ws/DMDiscoveryServicePort.java index dc73a99903..9e2ef6de96 100644 --- a/source/java/org/alfresco/repo/cmis/ws/DMDiscoveryServicePort.java +++ b/source/java/org/alfresco/repo/cmis/ws/DMDiscoveryServicePort.java @@ -32,6 +32,7 @@ import org.alfresco.cmis.CMISChangeLog; import org.alfresco.cmis.CMISChangeType; import org.alfresco.cmis.CMISDataTypeEnum; import org.alfresco.cmis.CMISDictionaryModel; +import org.alfresco.cmis.CMISObjectNotFoundException; import org.alfresco.cmis.CMISQueryOptions; import org.alfresco.cmis.CMISRelationshipDirectionEnum; import org.alfresco.cmis.CMISResultSet; @@ -120,6 +121,24 @@ public class DMDiscoveryServicePort extends DMAbstractServicePort implements Dis break; } + Object identifier; + NodeRef nodeRef; + try + { + nodeRef = row.getNodeRef(); + identifier = cmisService.getReadableObject((String) nodeRef.toString(), Object.class); + } + catch (CMISObjectNotFoundException e) + { + // ALF-15001: Handle stale nodeRefs in the index + numItems--; + continue; + } + catch (CMISServiceException e) + { + throw ExceptionUtil.createCmisException(e); + } + CmisPropertiesType properties = new CmisPropertiesType(); Map values = row.getValues(); @@ -136,17 +155,6 @@ public class DMDiscoveryServicePort extends DMAbstractServicePort implements Dis CmisObjectType object = new CmisObjectType(); object.setProperties(properties); - Object identifier; - NodeRef nodeRef; - try - { - nodeRef = row.getNodeRef(); - identifier = cmisService.getReadableObject((String) nodeRef.toString(), Object.class); - } - catch (CMISServiceException e) - { - throw ExceptionUtil.createCmisException(e); - } if (includeAllowableActions) { object.setAllowableActions(determineObjectAllowableActions(identifier)); diff --git a/source/java/org/alfresco/repo/webdav/GetMethod.java b/source/java/org/alfresco/repo/webdav/GetMethod.java index c756cdcb9b..609757e45e 100644 --- a/source/java/org/alfresco/repo/webdav/GetMethod.java +++ b/source/java/org/alfresco/repo/webdav/GetMethod.java @@ -176,12 +176,38 @@ public class GetMethod extends WebDAVMethod } FileInfo realNodeInfo = nodeInfo; - if (nodeInfo.isLink()) + + // ALF-12008: Due to Windows Explorer's URL concatenation behaviour, we must present links as shortcuts to the real URL, rather than direct hrefs + // This is at least consistent with the way the CIFS server handles links. See org.alfresco.filesys.repo.ContentDiskDriver.openFile(). + if (realNodeInfo.isLink()) { - realNodeInfo = getFileFolderService().getFileInfo(nodeInfo.getLinkNodeRef()); + Path pathToNode = getNodeService().getPath(nodeInfo.getLinkNodeRef()); + if (pathToNode.size() > 2) + { + pathToNode = pathToNode.subPath(2, pathToNode.size() -1); + } + + String rootURL = WebDAV.getURLForPath(m_request, pathToNode.toDisplayPath(getNodeService(), getPermissionService()), true); + if (rootURL.endsWith(WebDAVHelper.PathSeperator) == false) + { + rootURL = rootURL + WebDAVHelper.PathSeperator; + } + + String fname = (String) getNodeService().getProperty(nodeInfo.getLinkNodeRef(), ContentModel.PROP_NAME); + String webDavUrl = m_request.getServerName() + ":" + m_request.getServerPort() + rootURL + WebDAVHelper.encodeURL(fname, m_userAgent); + + StringBuilder urlStr = new StringBuilder(); + urlStr.append("[InternetShortcut]\r\n"); + urlStr.append("URL=file://"); + urlStr.append(webDavUrl); + urlStr.append("\r\n"); + + m_response.setHeader(WebDAV.HEADER_CONTENT_TYPE, "text/plain; charset=ISO-8859-1"); + m_response.setHeader(WebDAV.HEADER_CONTENT_LENGTH, String.valueOf(urlStr.length())); + m_response.getWriter().write(urlStr.toString()); } // Check if the node is a folder - if (realNodeInfo.isFolder()) + else if (realNodeInfo.isFolder()) { // is content required if (!m_returnContent) diff --git a/source/java/org/alfresco/repo/webdav/PropFindMethod.java b/source/java/org/alfresco/repo/webdav/PropFindMethod.java index b646798f46..921c987e76 100644 --- a/source/java/org/alfresco/repo/webdav/PropFindMethod.java +++ b/source/java/org/alfresco/repo/webdav/PropFindMethod.java @@ -390,24 +390,6 @@ public class PropFindMethod extends WebDAVMethod // Build the href string for the current node String strHRef = getURLForPath(m_request, path, isFolder); - if (nodeInfo.isLink()) - { - Path pathToNode = getNodeService().getPath(nodeInfo.getLinkNodeRef()); - if (pathToNode.size() > 2) - { - pathToNode = pathToNode.subPath(2, pathToNode.size() - 1); - } - - String rootURL = getURLForPath(m_request, pathToNode.toDisplayPath(getNodeService(), getPermissionService()), true); - if (rootURL.endsWith(WebDAVHelper.PathSeperator) == false) - { - rootURL = rootURL + WebDAVHelper.PathSeperator; - } - - String fname = (String) getNodeService().getProperty(nodeInfo.getLinkNodeRef(), ContentModel.PROP_NAME); - strHRef = rootURL + WebDAVHelper.encodeURL(fname, m_userAgent) + WebDAVHelper.PathSeperator; - isFolder = getFileFolderService().getFileInfo(nodeInfo.getLinkNodeRef()).isFolder(); - } xml.startElement(WebDAV.DAV_NS, WebDAV.XML_HREF, WebDAV.XML_NS_HREF, getDAVHelper().getNullAttributes()); xml.write(strHRef); xml.endElement(WebDAV.DAV_NS, WebDAV.XML_HREF, WebDAV.XML_NS_HREF); diff --git a/source/java/org/alfresco/repo/webdav/auth/BaseSSOAuthenticationFilter.java b/source/java/org/alfresco/repo/webdav/auth/BaseSSOAuthenticationFilter.java index cb7669f837..e37ccc3b8b 100644 --- a/source/java/org/alfresco/repo/webdav/auth/BaseSSOAuthenticationFilter.java +++ b/source/java/org/alfresco/repo/webdav/auth/BaseSSOAuthenticationFilter.java @@ -172,6 +172,9 @@ public abstract class BaseSSOAuthenticationFilter extends BaseAuthenticationFilt protected void onValidateFailed(ServletContext sc, HttpServletRequest req, HttpServletResponse res, HttpSession session) throws IOException { + // Restart the login challenge process if validation fails + + restartLoginChallenge(sc, req, res); } /** diff --git a/source/java/org/alfresco/repo/webdav/auth/KerberosAuthenticationFilter.java b/source/java/org/alfresco/repo/webdav/auth/KerberosAuthenticationFilter.java index 007fe5ccf0..748f29a4f2 100644 --- a/source/java/org/alfresco/repo/webdav/auth/KerberosAuthenticationFilter.java +++ b/source/java/org/alfresco/repo/webdav/auth/KerberosAuthenticationFilter.java @@ -39,18 +39,6 @@ public class KerberosAuthenticationFilter extends BaseKerberosAuthenticationFilt private static Log logger = LogFactory.getLog(KerberosAuthenticationFilter.class); - /* (non-Javadoc) - * @see org.alfresco.repo.webdav.auth.BaseSSOAuthenticationFilter#onValidateFailed(javax.servlet.ServletContext, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, javax.servlet.http.HttpSession) - */ - @Override - protected void onValidateFailed(ServletContext sc, HttpServletRequest req, HttpServletResponse res, HttpSession session) - throws IOException - { - // Restart the login challenge process if validation fails - - restartLoginChallenge(sc, req, res); - } - /* (non-Javadoc) * @see org.alfresco.repo.webdav.auth.BaseSSOAuthenticationFilter#getLogger() */ diff --git a/source/java/org/alfresco/repo/webdav/auth/NTLMAuthenticationFilter.java b/source/java/org/alfresco/repo/webdav/auth/NTLMAuthenticationFilter.java index 131659a181..78e89af3a3 100644 --- a/source/java/org/alfresco/repo/webdav/auth/NTLMAuthenticationFilter.java +++ b/source/java/org/alfresco/repo/webdav/auth/NTLMAuthenticationFilter.java @@ -39,19 +39,6 @@ public class NTLMAuthenticationFilter extends BaseNTLMAuthenticationFilter // Debug logging private static Log logger = LogFactory.getLog(NTLMAuthenticationFilter.class); - - /* (non-Javadoc) - * @see org.alfresco.repo.webdav.auth.BaseSSOAuthenticationFilter#onValidateFailed(javax.servlet.ServletContext, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, javax.servlet.http.HttpSession) - */ - @Override - protected void onValidateFailed(ServletContext sc, HttpServletRequest req, HttpServletResponse res, HttpSession session) - throws IOException - { - // Restart the login challenge process if validation fails - - restartLoginChallenge(sc, req, res); - } - /* (non-Javadoc) * @see org.alfresco.repo.webdav.auth.BaseNTLMAuthenticationFilter#getLogger() */