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.

DownloadZipServlet.java 4.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. /*
  2. * Copyright 2011 gitblit.com.
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. package com.gitblit;
  17. import java.util.Date;
  18. import javax.servlet.http.HttpServlet;
  19. import javax.servlet.http.HttpServletResponse;
  20. import org.eclipse.jgit.lib.Repository;
  21. import org.eclipse.jgit.revwalk.RevCommit;
  22. import org.slf4j.Logger;
  23. import org.slf4j.LoggerFactory;
  24. import com.gitblit.Constants.AccessRestrictionType;
  25. import com.gitblit.utils.JGitUtils;
  26. import com.gitblit.utils.StringUtils;
  27. import com.gitblit.wicket.models.RepositoryModel;
  28. public class DownloadZipServlet extends HttpServlet {
  29. public static String asLink(String baseURL, String repository, String objectId, String path) {
  30. return baseURL + (baseURL.endsWith("/") ? "" : "/") + "zip?r=" + repository + (path == null ? "" : ("&p=" + path)) + (objectId == null ? "" : ("&h=" + objectId));
  31. }
  32. private static final long serialVersionUID = 1L;
  33. private final static Logger logger = LoggerFactory.getLogger(DownloadZipServlet.class);
  34. public DownloadZipServlet() {
  35. super();
  36. }
  37. @Override
  38. protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, java.io.IOException {
  39. processRequest(request, response);
  40. }
  41. @Override
  42. protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, java.io.IOException {
  43. processRequest(request, response);
  44. }
  45. private void processRequest(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, java.io.IOException {
  46. if (!GitBlit.self().settings().getBoolean(Keys.web.allowZipDownloads, true)) {
  47. logger.warn("Zip downloads are disabled");
  48. response.sendError(HttpServletResponse.SC_FORBIDDEN);
  49. return;
  50. }
  51. String repository = request.getParameter("r");
  52. String basePath = request.getParameter("p");
  53. String objectId = request.getParameter("h");
  54. try {
  55. String name = repository;
  56. if (name.indexOf('/') > -1) {
  57. name = name.substring(name.lastIndexOf('/') + 1);
  58. }
  59. // check roles first
  60. boolean authorized = request.isUserInRole(Constants.ADMIN_ROLE);
  61. authorized |= request.isUserInRole(repository);
  62. if (!authorized) {
  63. RepositoryModel model = GitBlit.self().getRepositoryModel(repository);
  64. if (model.accessRestriction.atLeast(AccessRestrictionType.VIEW)) {
  65. logger.warn("Unauthorized access via zip servlet for " + model.name);
  66. response.sendError(HttpServletResponse.SC_FORBIDDEN);
  67. return;
  68. }
  69. }
  70. if (!StringUtils.isEmpty(basePath)) {
  71. name += "-" + basePath.replace('/', '_');
  72. }
  73. if (!StringUtils.isEmpty(objectId)) {
  74. name += "-" + objectId;
  75. }
  76. Repository r = GitBlit.self().getRepository(repository);
  77. RevCommit commit = JGitUtils.getCommit(r, objectId);
  78. Date date = JGitUtils.getCommitDate(commit);
  79. String contentType = "application/octet-stream";
  80. response.setContentType(contentType + "; charset=" + response.getCharacterEncoding());
  81. // response.setContentLength(attachment.getFileSize());
  82. response.setHeader("Content-Disposition", "attachment; filename=\"" + name + ".zip" + "\"");
  83. response.setDateHeader("Last-Modified", date.getTime());
  84. response.setHeader("Cache-Control", "no-cache");
  85. response.setHeader("Pragma", "no-cache");
  86. response.setDateHeader("Expires", 0);
  87. try {
  88. JGitUtils.zip(r, basePath, objectId, response.getOutputStream());
  89. response.flushBuffer();
  90. } catch (Throwable t) {
  91. logger.error("Failed to write attachment to client", t);
  92. }
  93. } catch (Throwable t) {
  94. logger.error("Failed to write attachment to client", t);
  95. }
  96. }
  97. }