/**
* Copyright (c) 2000-present Liferay, Inc. All rights reserved.
*
* 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.
*/
package com.liferay.portal.sharepoint;
import com.liferay.portal.kernel.servlet.HttpHeaders;
import com.liferay.portal.kernel.servlet.HttpMethods;
import com.liferay.portal.kernel.util.GetterUtil;
import com.liferay.portal.servlet.filters.secure.SecureFilter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @author Bruno Farache
* @author Alexander Chow
*/
public class SharepointFilter extends SecureFilter {
@Override
public void init(FilterConfig filterConfig) {
super.init(filterConfig);
setUsePermissionChecker(true);
}
protected boolean isSharepointRequest(String uri) {
if (uri == null) {
return false;
}
if (uri.endsWith("*.asmx")) {
return true;
}
for (String prefix : _PREFIXES) {
if (uri.startsWith(prefix)) {
return true;
}
}
return false;
}
protected boolean isWebDAVRequest(String uri) {
if (uri.startsWith("/webdav")) {
return true;
}
return false;
}
@Override
protected void processFilter(
HttpServletRequest request, HttpServletResponse response,
FilterChain filterChain)
throws Exception {
String method = request.getMethod();
String userAgent = GetterUtil.getString(
request.getHeader(HttpHeaders.USER_AGENT));
if ((userAgent.startsWith(
"Microsoft Data Access Internet Publishing") ||
userAgent.startsWith("Microsoft Office Protocol Discovery")) &&
method.equals(HttpMethods.OPTIONS)) {
setOptionsHeaders(request, response);
return;
}
if (!isSharepointRequest(request.getRequestURI())) {
processFilter(
SharepointFilter.class.getName(), request, response,
filterChain);
return;
}
if (method.equals(HttpMethods.GET) || method.equals(HttpMethods.HEAD)) {
setGetHeaders(response);
}
else if (method.equals(HttpMethods.POST)) {
setPostHeaders(response);
}
super.processFilter(request, response, filterChain);
}
protected void setGetHeaders(HttpServletResponse response) {
response.setContentType("text/html");
response.setHeader(
"Public-Extension", "http://schemas.microsoft.com/repl-2");
response.setHeader(
"MicrosoftSharePointTeamServices", SharepointUtil.VERSION);
response.setHeader("Cache-Control", "no-cache");
}
protected void setOptionsHeaders(
HttpServletRequest request, HttpServletResponse response) {
if (isWebDAVRequest(request.getRequestURI())) {
response.setHeader("MS-Author-Via", "DAV,MS-FP/4.0");
}
else {
response.setHeader("MS-Author-Via", "MS-FP/4.0,DAV");
}
response.setHeader("MicrosoftOfficeWebServer", "5.0_Collab");
response.setHeader(
"MicrosoftSharePointTeamServices", SharepointUtil.VERSION);
response.setHeader("DAV", "1,2");
response.setHeader("Accept-Ranges", "none");
response.setHeader("Cache-Control", "no-cache");
response.setHeader(
"Allow",
"COPY, DELETE, GET, GETLIB, HEAD, LOCK, MKCOL, MOVE, OPTIONS, " +
"POST, PROPFIND, PROPPATCH, PUT, UNLOCK");
}
protected void setPostHeaders(HttpServletResponse response) {
response.setContentType("application/x-vermeer-rpc");
response.setHeader(
"MicrosoftSharePointTeamServices", SharepointUtil.VERSION);
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Connection", "close");
}
private static final String[] _PREFIXES = new String[] {
"/_vti_inf.html", "/_vti_bin", "/sharepoint", "/history", "/resources"
};
}