--- /dev/null
+/**\r
+ * Copyright (c) 2000-2012 Liferay, Inc. All rights reserved.\r
+ *\r
+ * This library is free software; you can redistribute it and/or modify it under\r
+ * the terms of the GNU Lesser General Public License as published by the Free\r
+ * Software Foundation; either version 2.1 of the License, or (at your option)\r
+ * any later version.\r
+ *\r
+ * This library is distributed in the hope that it will be useful, but WITHOUT\r
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS\r
+ * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more\r
+ * details.\r
+ */\r
+\r
+package com.liferay.portal.kernel.webdav;\r
+\r
+import com.liferay.portal.NoSuchGroupException;\r
+import com.liferay.portal.NoSuchUserException;\r
+import com.liferay.portal.kernel.dao.orm.QueryUtil;\r
+import com.liferay.portal.kernel.log.Log;\r
+import com.liferay.portal.kernel.log.LogFactoryUtil;\r
+import com.liferay.portal.kernel.security.pacl.permission.PortalRuntimePermission;\r
+import com.liferay.portal.kernel.util.CharPool;\r
+import com.liferay.portal.kernel.util.GetterUtil;\r
+import com.liferay.portal.kernel.util.HttpUtil;\r
+import com.liferay.portal.kernel.util.OrderByComparator;\r
+import com.liferay.portal.kernel.util.StringPool;\r
+import com.liferay.portal.kernel.util.StringUtil;\r
+import com.liferay.portal.kernel.util.Time;\r
+import com.liferay.portal.kernel.util.UniqueList;\r
+import com.liferay.portal.kernel.util.Validator;\r
+import com.liferay.portal.kernel.xml.Namespace;\r
+import com.liferay.portal.kernel.xml.SAXReaderUtil;\r
+import com.liferay.portal.model.Group;\r
+import com.liferay.portal.model.GroupConstants;\r
+import com.liferay.portal.model.User;\r
+import com.liferay.portal.service.GroupLocalServiceUtil;\r
+import com.liferay.portal.service.UserLocalServiceUtil;\r
+import com.liferay.portal.util.comparator.GroupFriendlyURLComparator;\r
+\r
+import java.util.ArrayList;\r
+import java.util.Collection;\r
+import java.util.Collections;\r
+import java.util.LinkedHashMap;\r
+import java.util.List;\r
+import java.util.Map;\r
+import java.util.TreeMap;\r
+\r
+import javax.servlet.http.HttpServletRequest;\r
+\r
+/**\r
+ * @author Brian Wing Shun Chan\r
+ * @author Alexander Chow\r
+ * @author Raymond Augé\r
+ */\r
+public class WebDAVUtil {\r
+\r
+ public static final Namespace DAV_URI = SAXReaderUtil.createNamespace(\r
+ "D", "DAV:");\r
+\r
+ public static final int SC_LOCKED = 423;\r
+\r
+ public static final int SC_MULTI_STATUS = 207;\r
+\r
+ public static final String TOKEN_PREFIX = "opaquelocktoken:";\r
+\r
+ public static String fixPath(String path) {\r
+ if (path.endsWith(StringPool.SLASH)) {\r
+ path = path.substring(0, path.length() - 1);\r
+ }\r
+\r
+ return path;\r
+ }\r
+ \r
+ public static String encodeURL(String url) {\r
+ url = HttpUtil.encodeURL(url);\r
+ url = StringUtil.replace(url, StringPool.PLUS, StringPool.SPACE);\r
+\r
+ return url;\r
+ }\r
+ \r
+ public static void addStorage(WebDAVStorage storage) {\r
+ getInstance()._addStorage(storage);\r
+ }\r
+\r
+ public static Namespace createNamespace(String prefix, String uri) {\r
+ Namespace namespace = null;\r
+\r
+ if (uri.equals(WebDAVUtil.DAV_URI.getURI())) {\r
+ namespace = WebDAVUtil.DAV_URI;\r
+ }\r
+ else if (Validator.isNull(prefix)) {\r
+ namespace = SAXReaderUtil.createNamespace(uri);\r
+ }\r
+ else {\r
+ namespace = SAXReaderUtil.createNamespace(prefix, uri);\r
+ }\r
+\r
+ return namespace;\r
+ }\r
+\r
+ public static void deleteStorage(WebDAVStorage storage) {\r
+ getInstance()._deleteStorage(storage);\r
+ }\r
+\r
+ public static long getDepth(HttpServletRequest request) {\r
+ String value = GetterUtil.getString(request.getHeader("Depth"));\r
+\r
+ if (_log.isDebugEnabled()) {\r
+ _log.debug("\"Depth\" header is " + value);\r
+ }\r
+\r
+ if (value.equals("0")) {\r
+ return 0;\r
+ }\r
+ else {\r
+ return -1;\r
+ }\r
+ }\r
+\r
+ public static String getDestination(\r
+ HttpServletRequest request, String rootPath) {\r
+\r
+ String headerDestination = request.getHeader("Destination");\r
+ String[] pathSegments = StringUtil.split(headerDestination, rootPath);\r
+\r
+ String destination = pathSegments[pathSegments.length - 1];\r
+\r
+ destination = HttpUtil.decodePath(destination);\r
+\r
+ if (_log.isDebugEnabled()) {\r
+ _log.debug("Destination " + destination);\r
+ }\r
+\r
+ return destination;\r
+ }\r
+\r
+ public static long getGroupId(long companyId, String path)\r
+ throws WebDAVException {\r
+\r
+ String[] pathArray = getPathArray(path);\r
+\r
+ return getGroupId(companyId, pathArray);\r
+ }\r
+\r
+ public static long getGroupId(long companyId, String[] pathArray)\r
+ throws WebDAVException {\r
+\r
+ try {\r
+ if (pathArray.length == 0) {\r
+ return 0;\r
+ }\r
+\r
+ String name = pathArray[0];\r
+\r
+ try {\r
+ Group group = GroupLocalServiceUtil.getFriendlyURLGroup(\r
+ companyId, StringPool.SLASH + name);\r
+\r
+ return group.getGroupId();\r
+ }\r
+ catch (NoSuchGroupException nsge) {\r
+ }\r
+\r
+ try {\r
+ User user = UserLocalServiceUtil.getUserByScreenName(\r
+ companyId, name);\r
+\r
+ Group group = user.getGroup();\r
+\r
+ return group.getGroupId();\r
+ }\r
+ catch (NoSuchUserException nsue) {\r
+ }\r
+ }\r
+ catch (Exception e) {\r
+ throw new WebDAVException(e);\r
+ }\r
+\r
+ return 0;\r
+ }\r
+\r
+ public static List<Group> getGroups(long userId) throws Exception {\r
+ User user = UserLocalServiceUtil.getUser(userId);\r
+\r
+ return getGroups(user);\r
+ }\r
+\r
+ public static List<Group> getGroups(User user) throws Exception {\r
+\r
+ // Guest\r
+\r
+ if (user.isDefaultUser()) {\r
+ List<Group> groups = new ArrayList<Group>();\r
+\r
+ Group group = GroupLocalServiceUtil.getGroup(\r
+ user.getCompanyId(), GroupConstants.GUEST);\r
+\r
+ groups.add(group);\r
+\r
+ return groups;\r
+ }\r
+\r
+ // Communities\r
+\r
+ List<Group> groups = new UniqueList<Group>();\r
+\r
+ LinkedHashMap<String, Object> params =\r
+ new LinkedHashMap<String, Object>();\r
+\r
+ params.put("usersGroups", user.getUserId());\r
+\r
+ OrderByComparator orderByComparator = new GroupFriendlyURLComparator(\r
+ true);\r
+\r
+ groups.addAll(\r
+ GroupLocalServiceUtil.search(\r
+ user.getCompanyId(), null, null, params, QueryUtil.ALL_POS,\r
+ QueryUtil.ALL_POS, orderByComparator));\r
+\r
+ // Organizations\r
+\r
+ groups.addAll(\r
+ GroupLocalServiceUtil.getUserOrganizationsGroups(\r
+ user.getUserId(), QueryUtil.ALL_POS, QueryUtil.ALL_POS));\r
+\r
+ // User\r
+\r
+ if (!user.isDefaultUser()) {\r
+ groups.add(user.getGroup());\r
+ }\r
+\r
+ Collections.sort(groups, orderByComparator);\r
+\r
+ return groups;\r
+ }\r
+\r
+ public static WebDAVUtil getInstance() {\r
+ PortalRuntimePermission.checkGetBeanProperty(WebDAVUtil.class);\r
+\r
+ return _instance;\r
+ }\r
+\r
+ public static String getLockUuid(HttpServletRequest request)\r
+ throws WebDAVException {\r
+\r
+ String token = StringPool.BLANK;\r
+\r
+ String value = GetterUtil.getString(request.getHeader("If"));\r
+\r
+ if (_log.isDebugEnabled()) {\r
+ _log.debug("\"If\" header is " + value);\r
+ }\r
+\r
+ if (value.contains("(<DAV:no-lock>)")) {\r
+ if (_log.isWarnEnabled()) {\r
+ _log.warn("Lock tokens can never be <DAV:no-lock>");\r
+ }\r
+\r
+ throw new WebDAVException();\r
+ }\r
+\r
+ int beg = value.indexOf(TOKEN_PREFIX);\r
+\r
+ if (beg >= 0) {\r
+ beg += TOKEN_PREFIX.length();\r
+\r
+ if (beg < value.length()) {\r
+ int end = value.indexOf(CharPool.GREATER_THAN, beg);\r
+\r
+ token = GetterUtil.getString(value.substring(beg, end));\r
+ }\r
+ }\r
+\r
+ return token;\r
+ }\r
+\r
+ public static String[] getPathArray(String path) {\r
+ return getPathArray(path, false);\r
+ }\r
+\r
+ public static String[] getPathArray(String path, boolean fixTrailing) {\r
+ path = HttpUtil.fixPath(path, true, fixTrailing);\r
+\r
+ return StringUtil.split(path, CharPool.SLASH);\r
+ }\r
+\r
+ public static String getResourceName(String[] pathArray) {\r
+ if (pathArray.length <= 2) {\r
+ return StringPool.BLANK;\r
+ }\r
+ else {\r
+ return pathArray[pathArray.length - 1];\r
+ }\r
+ }\r
+\r
+ public static WebDAVStorage getStorage(String token) {\r
+ return getInstance()._getStorage(token);\r
+ }\r
+\r
+ public static Collection<String> getStorageTokens() {\r
+ return getInstance()._getStorageTokens();\r
+ }\r
+\r
+ public static long getTimeout(HttpServletRequest request) {\r
+ final String TIME_PREFIX = "Second-";\r
+\r
+ long timeout = 0;\r
+\r
+ String value = GetterUtil.getString(request.getHeader("Timeout"));\r
+\r
+ if (_log.isDebugEnabled()) {\r
+ _log.debug("\"Timeout\" header is " + value);\r
+ }\r
+\r
+ int index = value.indexOf(TIME_PREFIX);\r
+\r
+ if (index >= 0) {\r
+ index += TIME_PREFIX.length();\r
+\r
+ if (index < value.length()) {\r
+ timeout = GetterUtil.getLong(value.substring(index));\r
+ }\r
+ }\r
+\r
+ return timeout * Time.SECOND;\r
+ }\r
+\r
+ public static boolean isOverwrite(HttpServletRequest request) {\r
+ return getInstance()._isOverwrite(request);\r
+ }\r
+\r
+ private WebDAVUtil() {\r
+ _storageMap = new TreeMap<String, WebDAVStorage>();\r
+ }\r
+\r
+ private void _addStorage(WebDAVStorage storage) {\r
+ _storageMap.put(storage.getToken(), storage);\r
+ }\r
+\r
+ private void _deleteStorage(WebDAVStorage storage) {\r
+ if (storage != null) {\r
+ _storageMap.remove(storage.getToken());\r
+ }\r
+ }\r
+\r
+ private WebDAVStorage _getStorage(String token) {\r
+ return _storageMap.get(token);\r
+ }\r
+\r
+ private Collection<String> _getStorageTokens() {\r
+ return _storageMap.keySet();\r
+ }\r
+\r
+ private boolean _isOverwrite(HttpServletRequest request) {\r
+ String value = GetterUtil.getString(request.getHeader("Overwrite"));\r
+\r
+ if (value.equalsIgnoreCase("F") || !GetterUtil.getBoolean(value)) {\r
+ return false;\r
+ }\r
+ else {\r
+ return true;\r
+ }\r
+ }\r
+\r
+ private static Log _log = LogFactoryUtil.getLog(WebDAVUtil.class);\r
+\r
+ private static WebDAVUtil _instance = new WebDAVUtil();\r
+\r
+ private Map<String, WebDAVStorage> _storageMap;\r
+\r
+}
\ No newline at end of file