You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

GitBlitServlet.java 3.1KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. package com.gitblit;
  2. import java.io.IOException;
  3. import java.text.MessageFormat;
  4. import javax.servlet.ServletException;
  5. import javax.servlet.http.HttpServletRequest;
  6. import javax.servlet.http.HttpServletResponse;
  7. import org.eclipse.jgit.http.server.GitServlet;
  8. import org.slf4j.Logger;
  9. import org.slf4j.LoggerFactory;
  10. import com.gitblit.Constants.AccessRestrictionType;
  11. import com.gitblit.wicket.models.RepositoryModel;
  12. public class GitBlitServlet extends GitServlet {
  13. private static final long serialVersionUID = 1L;
  14. private final Logger logger = LoggerFactory.getLogger(GitBlitServlet.class);
  15. public GitBlitServlet() {
  16. super();
  17. }
  18. @Override
  19. protected void service(final HttpServletRequest req, final HttpServletResponse rsp) throws ServletException, IOException {
  20. // admins have full git access to all repositories
  21. if (req.isUserInRole(Constants.ADMIN_ROLE)) {
  22. // admins can do whatever
  23. super.service(req, rsp);
  24. return;
  25. }
  26. // try to intercept repository names for authenticated access
  27. String url = req.getRequestURI().substring(req.getServletPath().length());
  28. if (url.charAt(0) == '/' && url.length() > 1) {
  29. url = url.substring(1);
  30. }
  31. int forwardSlash = url.indexOf('/');
  32. if (forwardSlash > -1) {
  33. String repository = url.substring(0, forwardSlash);
  34. String function = url.substring(forwardSlash + 1);
  35. String query = req.getQueryString();
  36. RepositoryModel model = GitBlit.self().getRepositoryModel(repository);
  37. if (model != null) {
  38. if (model.isFrozen || model.accessRestriction.atLeast(AccessRestrictionType.PUSH)) {
  39. boolean authorizedUser = req.isUserInRole(repository);
  40. if (function.startsWith("git-receive-pack") || (query.indexOf("service=git-receive-pack") > -1)) {
  41. // Push request
  42. if (!model.isFrozen && authorizedUser) {
  43. // clone-restricted or push-authorized
  44. super.service(req, rsp);
  45. return;
  46. } else {
  47. // user is unauthorized to push to this repository
  48. logger.warn(MessageFormat.format("user {0} is not authorized to push to {1} ", req.getUserPrincipal().getName(), repository));
  49. rsp.sendError(HttpServletResponse.SC_FORBIDDEN, MessageFormat.format("you are not authorized to push to {0} ", repository));
  50. return;
  51. }
  52. } else if (function.startsWith("git-upload-pack") || (query.indexOf("service=git-upload-pack") > -1)) {
  53. // Clone request
  54. boolean cloneRestricted = model.accessRestriction.atLeast(AccessRestrictionType.CLONE);
  55. if (!cloneRestricted || (cloneRestricted && authorizedUser)) {
  56. // push-restricted or clone-authorized
  57. super.service(req, rsp);
  58. return;
  59. } else {
  60. // user is unauthorized to clone this repository
  61. logger.warn(MessageFormat.format("user {0} is not authorized to clone {1} ", req.getUserPrincipal().getName(), repository));
  62. rsp.sendError(HttpServletResponse.SC_FORBIDDEN, MessageFormat.format("you are not authorized to clone {0} ", repository));
  63. return;
  64. }
  65. }
  66. }
  67. }
  68. }
  69. // pass-through to git servlet
  70. super.service(req, rsp);
  71. }
  72. }