mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-08-14 17:58:59 +00:00
19614: ALF-1890: Merged V2.2 to V3.2 17709: Merged DEV_TEMPORARY to V2.2 17700: ETWOTWO-1393: concurrent writes to webdav lead to data loss (0kb resulting file) 19613: Merged DEV/BELARUS/V2.2-2010_02_03 to V2.2 19157: ALF-1890: concurrent writes to webdav lead to data loss (0kb resulting file) 19562: Merged DEV/BELARUS/V3.2-2010_02_24 to V3.2 19244: ALF-1816: Email templates can no longer be selected when creating a rule for the action 'Send email to specified users' following an upgrade - New patch has been created to create invite email templates and notify email templates folders if those are absent. Also it moves default notify and invite templates into appropriate folders. 19561: Merged DEV/BELARUS/V3.2-2010_02_24 to V3.2 (With improvements) 19294: ALF-929: email to invite external users does not allow external users to login (no credentails) - Always create a password for created users if the authentication chain allows account creation git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@19615 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
202 lines
6.7 KiB
Java
202 lines
6.7 KiB
Java
/*
|
|
* Copyright (C) 2005-2010 Alfresco Software Limited.
|
|
*
|
|
* This file is part of Alfresco
|
|
*
|
|
* Alfresco is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU Lesser General Public License as published by
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* Alfresco is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public License
|
|
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
package org.alfresco.repo.webdav;
|
|
|
|
import java.io.BufferedInputStream;
|
|
import java.io.File;
|
|
import java.io.FileInputStream;
|
|
import java.io.FileOutputStream;
|
|
import java.io.IOException;
|
|
import java.io.InputStream;
|
|
import java.io.OutputStream;
|
|
import java.io.Serializable;
|
|
import java.nio.charset.Charset;
|
|
import java.util.HashMap;
|
|
import java.util.Map;
|
|
|
|
import javax.servlet.http.HttpServletResponse;
|
|
|
|
import org.alfresco.model.ContentModel;
|
|
import org.alfresco.repo.content.encoding.ContentCharsetFinder;
|
|
import org.alfresco.service.cmr.model.FileExistsException;
|
|
import org.alfresco.service.cmr.model.FileFolderService;
|
|
import org.alfresco.service.cmr.model.FileInfo;
|
|
import org.alfresco.service.cmr.model.FileNotFoundException;
|
|
import org.alfresco.service.cmr.repository.ContentWriter;
|
|
import org.alfresco.service.namespace.QName;
|
|
import org.alfresco.util.TempFileProvider;
|
|
import org.springframework.util.FileCopyUtils;
|
|
|
|
/**
|
|
* Implements the WebDAV PUT method
|
|
*
|
|
* @author Gavin Cornwell
|
|
*/
|
|
public class PutMethod extends WebDAVMethod
|
|
{
|
|
// Request parameters
|
|
private String m_strLockToken = null;
|
|
private String m_strContentType = null;
|
|
private boolean m_expectHeaderPresent = false;
|
|
|
|
private File requestBody = null;
|
|
|
|
/**
|
|
* Default constructor
|
|
*/
|
|
public PutMethod()
|
|
{
|
|
}
|
|
|
|
/**
|
|
* Parse the request headers
|
|
*
|
|
* @exception WebDAVServerException
|
|
*/
|
|
protected void parseRequestHeaders() throws WebDAVServerException
|
|
{
|
|
m_strContentType = m_request.getHeader(WebDAV.HEADER_CONTENT_TYPE);
|
|
String strExpect = m_request.getHeader(WebDAV.HEADER_EXPECT);
|
|
|
|
if (strExpect != null && strExpect.equals(WebDAV.HEADER_EXPECT_CONTENT))
|
|
{
|
|
m_expectHeaderPresent = true;
|
|
}
|
|
|
|
// Parse Lock tokens and ETags, if any
|
|
|
|
parseIfHeader();
|
|
}
|
|
|
|
/**
|
|
* Parse the request body
|
|
*
|
|
* @exception WebDAVServerException
|
|
*/
|
|
protected void parseRequestBody() throws WebDAVServerException
|
|
{
|
|
requestBody = TempFileProvider.createTempFile("webdav_PUT_", ".bin");
|
|
try
|
|
{
|
|
OutputStream out = new FileOutputStream(requestBody);
|
|
FileCopyUtils.copy(m_request.getInputStream(), out);
|
|
}
|
|
catch (IOException e)
|
|
{
|
|
throw new WebDAVServerException(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Exceute the WebDAV request
|
|
*
|
|
* @exception WebDAVServerException
|
|
*/
|
|
protected void executeImpl() throws WebDAVServerException, Exception
|
|
{
|
|
FileFolderService fileFolderService = getFileFolderService();
|
|
|
|
// Get the status for the request path
|
|
FileInfo contentNodeInfo = null;
|
|
boolean created = false;
|
|
try
|
|
{
|
|
contentNodeInfo = getDAVHelper().getNodeForPath(getRootNodeRef(), getPath(), getServletPath());
|
|
// make sure that we are not trying to use a folder
|
|
if (contentNodeInfo.isFolder())
|
|
{
|
|
throw new WebDAVServerException(HttpServletResponse.SC_BAD_REQUEST);
|
|
}
|
|
|
|
checkNode(contentNodeInfo);
|
|
|
|
}
|
|
catch (FileNotFoundException e)
|
|
{
|
|
// the file doesn't exist - create it
|
|
String[] paths = getDAVHelper().splitPath(getPath());
|
|
try
|
|
{
|
|
FileInfo parentNodeInfo = getDAVHelper().getNodeForPath(getRootNodeRef(), paths[0], getServletPath());
|
|
// create file
|
|
contentNodeInfo = fileFolderService.create(parentNodeInfo.getNodeRef(), paths[1], ContentModel.TYPE_CONTENT);
|
|
created = true;
|
|
|
|
// apply the titled aspect - title and description
|
|
Map<QName, Serializable> titledProps = new HashMap<QName, Serializable>(3, 1.0f);
|
|
titledProps.put(ContentModel.PROP_TITLE, paths[1]);
|
|
titledProps.put(ContentModel.PROP_DESCRIPTION, "");
|
|
getNodeService().addAspect(contentNodeInfo.getNodeRef(), ContentModel.ASPECT_TITLED, titledProps);
|
|
}
|
|
catch (FileNotFoundException ee)
|
|
{
|
|
// bad path
|
|
throw new WebDAVServerException(HttpServletResponse.SC_BAD_REQUEST);
|
|
}
|
|
catch (FileExistsException ee)
|
|
{
|
|
// bad path
|
|
throw new WebDAVServerException(HttpServletResponse.SC_BAD_REQUEST);
|
|
}
|
|
}
|
|
|
|
// Access the content
|
|
ContentWriter writer = fileFolderService.getWriter(contentNodeInfo.getNodeRef());
|
|
// set content properties
|
|
String mimetype = null;
|
|
if (m_strContentType != null)
|
|
{
|
|
mimetype = m_strContentType;
|
|
}
|
|
else
|
|
{
|
|
String guessedMimetype = getMimetypeService().guessMimetype(getPath());
|
|
mimetype = guessedMimetype;
|
|
}
|
|
writer.setMimetype(mimetype);
|
|
|
|
// Get the input stream from the request data
|
|
InputStream is = new FileInputStream(requestBody);
|
|
is = is.markSupported() ? is : new BufferedInputStream(is);
|
|
|
|
ContentCharsetFinder charsetFinder = getMimetypeService().getContentCharsetFinder();
|
|
Charset encoding = charsetFinder.getCharset(is, mimetype);
|
|
writer.setEncoding(encoding.name());
|
|
|
|
// Write the new data to the content node
|
|
writer.putContent(is);
|
|
|
|
// Set the response status, depending if the node existed or not
|
|
m_response.setStatus(created ? HttpServletResponse.SC_CREATED : HttpServletResponse.SC_NO_CONTENT);
|
|
}
|
|
|
|
@Override
|
|
protected void cleanup()
|
|
{
|
|
try
|
|
{
|
|
requestBody.delete();
|
|
}
|
|
catch (Throwable t)
|
|
{
|
|
logger.error("Failed to delete temp file", t);
|
|
}
|
|
}
|
|
}
|