001
014
015 package com.liferay.portal.sharepoint;
016
017 import com.liferay.portal.kernel.servlet.HttpHeaders;
018 import com.liferay.portal.kernel.servlet.HttpMethods;
019 import com.liferay.portal.kernel.util.GetterUtil;
020 import com.liferay.portal.servlet.filters.secure.SecureFilter;
021
022 import javax.servlet.FilterChain;
023 import javax.servlet.FilterConfig;
024 import javax.servlet.http.HttpServletRequest;
025 import javax.servlet.http.HttpServletResponse;
026
027
031 public class SharepointFilter extends SecureFilter {
032
033 @Override
034 public void init(FilterConfig filterConfig) {
035 super.init(filterConfig);
036
037 setUsePermissionChecker(true);
038 }
039
040 protected boolean isSharepointRequest(String uri) {
041 if (uri == null) {
042 return false;
043 }
044
045 if (uri.endsWith("*.asmx")) {
046 return true;
047 }
048
049 for (String prefix : _PREFIXES) {
050 if (uri.startsWith(prefix)) {
051 return true;
052 }
053 }
054
055 return false;
056 }
057
058 protected boolean isWebDAVRequest(String uri) {
059 if (uri.startsWith("/api/secure/webdav")) {
060 return true;
061 }
062
063 return false;
064 }
065
066 @Override
067 protected void processFilter(
068 HttpServletRequest request, HttpServletResponse response,
069 FilterChain filterChain)
070 throws Exception {
071
072 String method = request.getMethod();
073
074 String userAgent = GetterUtil.getString(
075 request.getHeader(HttpHeaders.USER_AGENT));
076
077 if ((userAgent.startsWith(
078 "Microsoft Data Access Internet Publishing") ||
079 userAgent.startsWith("Microsoft Office Protocol Discovery")) &&
080 method.equals(HttpMethods.OPTIONS)) {
081
082 setOptionsHeaders(request, response);
083
084 return;
085 }
086
087 if (!isSharepointRequest(request.getRequestURI())) {
088 processFilter(
089 SharepointFilter.class, request, response, filterChain);
090
091 return;
092 }
093
094 if (method.equals(HttpMethods.GET) || method.equals(HttpMethods.HEAD)) {
095 setGetHeaders(response);
096 }
097 else if (method.equals(HttpMethods.POST)) {
098 setPostHeaders(response);
099 }
100
101 super.processFilter(request, response, filterChain);
102 }
103
104 protected void setGetHeaders(HttpServletResponse response) {
105 response.setContentType("text/html");
106
107 response.setHeader(
108 "Public-Extension", "http:
109 response.setHeader(
110 "MicrosoftSharePointTeamServices", SharepointUtil.VERSION);
111 response.setHeader("Cache-Control", "no-cache");
112 }
113
114 protected void setOptionsHeaders(
115 HttpServletRequest request, HttpServletResponse response) {
116
117 if (isWebDAVRequest(request.getRequestURI())) {
118 response.setHeader("MS-Author-Via", "DAV,MS-FP/4.0");
119 }
120 else {
121 response.setHeader("MS-Author-Via", "MS-FP/4.0,DAV");
122 }
123
124 response.setHeader("MicrosoftOfficeWebServer", "5.0_Collab");
125 response.setHeader(
126 "MicrosoftSharePointTeamServices", SharepointUtil.VERSION);
127 response.setHeader("DAV", "1,2");
128 response.setHeader("Accept-Ranges", "none");
129 response.setHeader("Cache-Control", "no-cache");
130 response.setHeader(
131 "Allow",
132 "COPY, DELETE, GET, GETLIB, HEAD, LOCK, MKCOL, MOVE, OPTIONS, " +
133 "POST, PROPFIND, PROPPATCH, PUT, UNLOCK");
134 }
135
136 protected void setPostHeaders(HttpServletResponse response) {
137 response.setContentType("application/x-vermeer-rpc");
138
139 response.setHeader(
140 "MicrosoftSharePointTeamServices", SharepointUtil.VERSION);
141 response.setHeader("Cache-Control", "no-cache");
142 response.setHeader("Connection", "close");
143 }
144
145 private static final String[] _PREFIXES =
146 new String[] {
147 "/_vti_inf.html", "/_vti_bin", "/sharepoint", "/history",
148 "/resources"};
149
150 }