1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44 package org.eclipse.jgit.http.server;
45
46 import static javax.servlet.http.HttpServletResponse.SC_FORBIDDEN;
47 import static javax.servlet.http.HttpServletResponse.SC_INTERNAL_SERVER_ERROR;
48 import static javax.servlet.http.HttpServletResponse.SC_NOT_FOUND;
49 import static javax.servlet.http.HttpServletResponse.SC_UNAUTHORIZED;
50 import static org.eclipse.jgit.http.server.GitSmartHttpTools.sendError;
51 import static org.eclipse.jgit.http.server.ServletUtils.ATTRIBUTE_REPOSITORY;
52
53 import java.io.IOException;
54 import java.text.MessageFormat;
55
56 import javax.servlet.Filter;
57 import javax.servlet.FilterChain;
58 import javax.servlet.FilterConfig;
59 import javax.servlet.ServletContext;
60 import javax.servlet.ServletException;
61 import javax.servlet.ServletRequest;
62 import javax.servlet.ServletResponse;
63 import javax.servlet.http.HttpServletRequest;
64 import javax.servlet.http.HttpServletResponse;
65
66 import org.eclipse.jgit.errors.RepositoryNotFoundException;
67 import org.eclipse.jgit.lib.Repository;
68 import org.eclipse.jgit.transport.ServiceMayNotContinueException;
69 import org.eclipse.jgit.transport.resolver.RepositoryResolver;
70 import org.eclipse.jgit.transport.resolver.ServiceNotAuthorizedException;
71 import org.eclipse.jgit.transport.resolver.ServiceNotEnabledException;
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89 public class RepositoryFilter implements Filter {
90 private final RepositoryResolver<HttpServletRequest> resolver;
91
92 private ServletContext context;
93
94
95
96
97
98
99
100
101
102
103 public RepositoryFilter(RepositoryResolver<HttpServletRequest> resolver) {
104 this.resolver = resolver;
105 }
106
107
108 @Override
109 public void init(FilterConfig config) throws ServletException {
110 context = config.getServletContext();
111 }
112
113
114 @Override
115 public void destroy() {
116 context = null;
117 }
118
119
120 @Override
121 public void doFilter(final ServletRequest request,
122 final ServletResponse response, final FilterChain chain)
123 throws IOException, ServletException {
124 HttpServletRequest req = (HttpServletRequest) request;
125 HttpServletResponse res = (HttpServletResponse) response;
126
127 if (request.getAttribute(ATTRIBUTE_REPOSITORY) != null) {
128 context.log(MessageFormat.format(HttpServerText.get().internalServerErrorRequestAttributeWasAlreadySet
129 , ATTRIBUTE_REPOSITORY
130 , getClass().getName()));
131 sendError(req, res, SC_INTERNAL_SERVER_ERROR);
132 return;
133 }
134
135 String name = req.getPathInfo();
136 while (name != null && 0 < name.length() && name.charAt(0) == '/')
137 name = name.substring(1);
138 if (name == null || name.length() == 0) {
139 sendError(req, res, SC_NOT_FOUND);
140 return;
141 }
142
143 try (Repository db = resolver.open(req, name)) {
144 request.setAttribute(ATTRIBUTE_REPOSITORY, db);
145 chain.doFilter(request, response);
146 } catch (RepositoryNotFoundException e) {
147 sendError(req, res, SC_NOT_FOUND);
148 return;
149 } catch (ServiceNotEnabledException e) {
150 sendError(req, res, SC_FORBIDDEN, e.getMessage());
151 return;
152 } catch (ServiceNotAuthorizedException e) {
153 res.sendError(SC_UNAUTHORIZED, e.getMessage());
154 return;
155 } catch (ServiceMayNotContinueException e) {
156 sendError(req, res, e.getStatusCode(), e.getMessage());
157 return;
158 } finally {
159 request.removeAttribute(ATTRIBUTE_REPOSITORY);
160 }
161 }
162 }