cmswebdavservlet.java
来自「找了很久才找到到源代码」· Java 代码 · 共 1,879 行 · 第 1/5 页
JAVA
1,879 行
/*
* File : $Source: /usr/local/cvs/opencms/src/org/opencms/webdav/CmsWebdavServlet.java,v $
* Date : $Date: 2007-08-13 16:29:51 $
* Version: $Revision: 1.5 $
*
* This library is part of OpenCms -
* the Open Source Content Management System
*
* Copyright (c) 2002 - 2007 Alkacon Software GmbH (http://www.alkacon.com)
*
* This library 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 2.1 of the License, or (at your option) any later version.
*
* This library 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.
*
* For further information about Alkacon Software GmbH, please see the
* company website: http://www.alkacon.com
*
* For further information about OpenCms, please see the
* project website: http://www.opencms.org
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* This file is based on:
* - org.apache.catalina.servlets.WebdavServlet
* - org.apache.catalina.servlets.DefaultServlet
* from the Apache Tomcat project.
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.opencms.webdav;
import org.opencms.file.CmsVfsResourceAlreadyExistsException;
import org.opencms.file.CmsVfsResourceNotFoundException;
import org.opencms.i18n.CmsEncoder;
import org.opencms.main.CmsException;
import org.opencms.main.CmsLog;
import org.opencms.main.OpenCms;
import org.opencms.repository.CmsRepositoryLockInfo;
import org.opencms.repository.I_CmsRepository;
import org.opencms.repository.I_CmsRepositoryItem;
import org.opencms.repository.I_CmsRepositorySession;
import org.opencms.security.CmsSecurityException;
import org.opencms.util.CmsRequestUtil;
import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.RandomAccessFile;
import java.io.Reader;
import java.io.UnsupportedEncodingException;
import java.io.Writer;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.BitSet;
import java.util.Date;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Stack;
import java.util.StringTokenizer;
import java.util.TimeZone;
import java.util.Vector;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.UnavailableException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.net.URLCodec;
import org.apache.commons.logging.Log;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.Namespace;
import org.dom4j.Node;
import org.dom4j.QName;
import org.dom4j.io.SAXReader;
import org.xml.sax.InputSource;
/**
* Servlet which adds support for WebDAV level 2.<p>
*
* @author Remy Maucherat
* @author Craig R. McClanahan
* @author Peter Bonrad
*
* @version $Revision: 1.5 $
*
* @since 6.5.6
*/
public class CmsWebdavServlet extends HttpServlet {
/** Basic authorization prefix constant. */
public static final String AUTHORIZATION_BASIC_PREFIX = "BASIC ";
/** Size of file transfer buffer in bytes. */
public static final int BUFFER_SIZE = 4096;
/** Credentials separator constant. */
public static final String SEPARATOR_CREDENTIALS = ":";
/** Date format for the last modified date. */
protected static final DateFormat HTTP_DATE_FORMAT;
/** Date format for the creation date. */
protected static final DateFormat ISO8601_FORMAT;
/** MD5 message digest provider. */
protected static MessageDigest m_md5Helper;
/** The MD5 helper object for this class. */
protected static final CmsMD5Encoder MD5_ENCODER = new CmsMD5Encoder();
/** WebDAV method: COPY. */
protected static final String METHOD_COPY = "COPY";
/** HTTP Method: DELETE. */
protected static final String METHOD_DELETE = "DELETE";
/** HTTP Method: GET. */
protected static final String METHOD_GET = "GET";
/** HTTP Method: HEAD. */
protected static final String METHOD_HEAD = "HEAD";
/** WebDAV method: LOCK. */
protected static final String METHOD_LOCK = "LOCK";
/** WebDAV method: MKCOL. */
protected static final String METHOD_MKCOL = "MKCOL";
/** WebDAV method: MOVE. */
protected static final String METHOD_MOVE = "MOVE";
/** HTTP Method: OPTIONS. */
protected static final String METHOD_OPTIONS = "OPTIONS";
/** HTTP Method: POST. */
protected static final String METHOD_POST = "POST";
/** WebDAV method: PROPFIND. */
protected static final String METHOD_PROPFIND = "PROPFIND";
/** WebDAV method: PROPPATCH. */
protected static final String METHOD_PROPPATCH = "PROPPATCH";
/** HTTP Method: PUT. */
protected static final String METHOD_PUT = "PUT";
/** HTTP Method: TRACE. */
protected static final String METHOD_TRACE = "TRACE";
/** WebDAV method: UNLOCK. */
protected static final String METHOD_UNLOCK = "UNLOCK";
/** MIME multipart separation string. */
protected static final String MIME_SEPARATION = "CATALINA_MIME_BOUNDARY";
/** Chars which are safe for urls. */
protected static final BitSet URL_SAFE_CHARS;
/** Name of the servlet attribute to get the path to the temp directory. */
private static final String ATT_SERVLET_TEMPDIR = "javax.servlet.context.tempdir";
/** The text to use as basic realm. */
private static final String BASIC_REALM = "OpenCms WebDAV Servlet";
/** Default namespace. */
private static final String DEFAULT_NAMESPACE = "DAV:";
/** The text to send if the depth is inifinity. */
private static final String DEPTH_INFINITY = "Infinity";
/** PROPFIND - Display all properties. */
private static final int FIND_ALL_PROP = 1;
/** PROPFIND - Specify a property mask. */
private static final int FIND_BY_PROPERTY = 0;
/** PROPFIND - Return property names. */
private static final int FIND_PROPERTY_NAMES = 2;
/** Full range marker. */
private static ArrayList FULL_RANGE = new ArrayList();
/** The name of the header "allow". */
private static final String HEADER_ALLOW = "Allow";
/** The name of the header "authorization". */
private static final String HEADER_AUTHORIZATION = "Authorization";
/** The name of the header "content-length". */
private static final String HEADER_CONTENTLENGTH = "content-length";
/** The name of the header "Content-Range". */
private static final String HEADER_CONTENTRANGE = "Content-Range";
/** The name of the header "Depth". */
private static final String HEADER_DEPTH = "Depth";
/** The name of the header "Destination". */
private static final String HEADER_DESTINATION = "Destination";
/** The name of the header "ETag". */
private static final String HEADER_ETAG = "ETag";
/** The name of the header "If-Range". */
private static final String HEADER_IFRANGE = "If-Range";
/** The name of the header "Last-Modified". */
private static final String HEADER_LASTMODIFIED = "Last-Modified";
/** The name of the header "Lock-Token". */
private static final String HEADER_LOCKTOKEN = "Lock-Token";
/** The name of the header "Overwrite". */
private static final String HEADER_OVERWRITE = "Overwrite";
/** The name of the header "Range". */
private static final String HEADER_RANGE = "Range";
/** The name of the init parameter in the web.xml to allow listing. */
private static final String INIT_PARAM_LIST = "listings";
/** The name of the init parameter in the web.xml to set read only. */
private static final String INIT_PARAM_READONLY = "readonly";
/** The name of the init-param where the repository class is defined. */
private static final String INIT_PARAM_REPOSITORY = "repository";
/** Create a new lock. */
private static final int LOCK_CREATION = 0;
/** Refresh lock. */
private static final int LOCK_REFRESH = 1;
/** The log object for this class. */
private static final Log LOG = CmsLog.getLog(CmsWebdavServlet.class);
/** The repository used from this servlet. */
private static I_CmsRepository m_repository;
/** The unique serial id for this class. */
private static final long serialVersionUID = -122598983283724306L;
/** The name of the tag "activelock" in the WebDAV protocol. */
private static final String TAG_ACTIVELOCK = "activelock";
/** The name of the tag "collection" in the WebDAV protocol. */
private static final String TAG_COLLECTION = "collection";
/** The name of the tag "getcontentlanguage" in the WebDAV protocol. */
private static final String TAG_CONTENTLANGUAGE = "getcontentlanguage";
/** The name of the tag "getcontentlength" in the WebDAV protocol. */
private static final String TAG_CONTENTLENGTH = "getcontentlength";
/** The name of the tag "getcontenttype" in the WebDAV protocol. */
private static final String TAG_CONTENTTYPE = "getcontenttype";
/** The name of the tag "creationdate" in the WebDAV protocol. */
private static final String TAG_CREATIONDATE = "creationdate";
/** The name of the tag "depth" in the WebDAV protocol. */
private static final String TAG_DEPTH = "depth";
/** The name of the tag "displayname" in the WebDAV protocol. */
private static final String TAG_DISPLAYNAME = "displayname";
/** The name of the tag "getetag" in the WebDAV protocol. */
private static final String TAG_ETAG = "getetag";
/** The name of the tag "href" in the WebDAV protocol. */
private static final String TAG_HREF = "href";
/** The name of the tag "getlastmodified" in the WebDAV protocol. */
private static final String TAG_LASTMODIFIED = "getlastmodified";
/** The name of the tag "lockdiscovery" in the WebDAV protocol. */
private static final String TAG_LOCKDISCOVERY = "lockdiscovery";
/** The name of the tag "lockentry" in the WebDAV protocol. */
private static final String TAG_LOCKENTRY = "lockentry";
/** The name of the tag "lockscope" in the WebDAV protocol. */
private static final String TAG_LOCKSCOPE = "lockscope";
/** The name of the tag "locktoken" in the WebDAV protocol. */
private static final String TAG_LOCKTOKEN = "locktoken";
/** The name of the tag "locktype" in the WebDAV protocol. */
private static final String TAG_LOCKTYPE = "locktype";
/** The name of the tag "multistatus" in the WebDAV protocol. */
private static final String TAG_MULTISTATUS = "multistatus";
/** The name of the tag "owner" in the WebDAV protocol. */
private static final String TAG_OWNER = "owner";
/** The name of the tag "prop" in the WebDAV protocol. */
private static final String TAG_PROP = "prop";
/** The name of the tag "propstat" in the WebDAV protocol. */
private static final String TAG_PROPSTAT = "propstat";
/** The name of the tag "resourcetype" in the WebDAV protocol. */
private static final String TAG_RESOURCETYPE = "resourcetype";
/** The name of the tag "response" in the WebDAV protocol. */
private static final String TAG_RESPONSE = "response";
/** The name of the tag "source" in the WebDAV protocol. */
private static final String TAG_SOURCE = "source";
/** The name of the tag "status" in the WebDAV protocol. */
private static final String TAG_STATUS = "status";
/** The name of the tag "supportedlock" in the WebDAV protocol. */
private static final String TAG_SUPPORTEDLOCK = "supportedlock";
/** The name of the tag "timeout" in the WebDAV protocol. */
private static final String TAG_TIMEOUT = "timeout";
/** The text to send if the timeout is infinite. */
private static final String TIMEOUT_INFINITE = "Infinite";
/** The input buffer size to use when serving resources. */
protected int m_input = 2048;
/** The output buffer size to use when serving resources. */
protected int m_output = 2048;
/** Should we generate directory listings? */
private boolean m_listings = false;
/** Read only flag. By default, it's set to true. */
private boolean m_readOnly = true;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?