From 46f33f87750573713509fbdbd0fc2ae51dc12044 Mon Sep 17 00:00:00 2001 From: Paul Martin Date: Fri, 25 Dec 2015 22:35:11 +0000 Subject: Fix for #976 - Filestore links via browser + GitLFS client support + FilestoreModel now parses meta file + Read meta heading from cache if available + Authentication based on accept headers for browser view filestore login + PathModel & PathChangeModel now understands filestore items + Zip & Rar downloads contain include filestore items + Filestore servlet returns LFS JSON error only if accepted by client + DiffStat now knows repository to allow identification of filestore items + Filestore items identified and returned via view, raw & blob links on blame, commitDiff, commit and Tree pages --- .../com/gitblit/servlet/AccessRestrictionFilter.java | 7 ++++--- .../java/com/gitblit/servlet/DownloadZipServlet.java | 18 ++++++++++++------ .../java/com/gitblit/servlet/FilestoreServlet.java | 5 ++++- src/main/java/com/gitblit/servlet/GitFilter.java | 14 +++++++++----- src/main/java/com/gitblit/servlet/RawServlet.java | 2 +- 5 files changed, 30 insertions(+), 16 deletions(-) (limited to 'src/main/java/com/gitblit/servlet') diff --git a/src/main/java/com/gitblit/servlet/AccessRestrictionFilter.java b/src/main/java/com/gitblit/servlet/AccessRestrictionFilter.java index b9cb0885..e1d76db0 100644 --- a/src/main/java/com/gitblit/servlet/AccessRestrictionFilter.java +++ b/src/main/java/com/gitblit/servlet/AccessRestrictionFilter.java @@ -133,10 +133,11 @@ public abstract class AccessRestrictionFilter extends AuthenticationFilter { /** * Allows authentication header to be altered based on the action requested * Default is WWW-Authenticate + * @param httpRequest * @param action * @return authentication type header */ - protected String getAuthenticationHeader(String action) { + protected String getAuthenticationHeader(HttpServletRequest httpRequest, String action) { return "WWW-Authenticate"; } @@ -192,7 +193,7 @@ public abstract class AccessRestrictionFilter extends AuthenticationFilter { logger.info(MessageFormat.format("ARF: CREATE CHALLENGE {0}", fullUrl)); } - httpResponse.setHeader(getAuthenticationHeader(urlRequestType), CHALLENGE); + httpResponse.setHeader(getAuthenticationHeader(httpRequest, urlRequestType), CHALLENGE); httpResponse.sendError(HttpServletResponse.SC_UNAUTHORIZED); return; } else { @@ -239,7 +240,7 @@ public abstract class AccessRestrictionFilter extends AuthenticationFilter { if (runtimeManager.isDebugMode()) { logger.info(MessageFormat.format("ARF: CHALLENGE {0}", fullUrl)); } - httpResponse.setHeader(getAuthenticationHeader(urlRequestType), CHALLENGE); + httpResponse.setHeader(getAuthenticationHeader(httpRequest, urlRequestType), CHALLENGE); httpResponse.sendError(HttpServletResponse.SC_UNAUTHORIZED); return; } else { diff --git a/src/main/java/com/gitblit/servlet/DownloadZipServlet.java b/src/main/java/com/gitblit/servlet/DownloadZipServlet.java index 07562561..319c4f91 100644 --- a/src/main/java/com/gitblit/servlet/DownloadZipServlet.java +++ b/src/main/java/com/gitblit/servlet/DownloadZipServlet.java @@ -22,6 +22,7 @@ import java.util.Date; import com.google.inject.Inject; import com.google.inject.Singleton; + import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletResponse; @@ -34,6 +35,7 @@ import org.slf4j.LoggerFactory; import com.gitblit.Constants; import com.gitblit.IStoredSettings; import com.gitblit.Keys; +import com.gitblit.manager.IFilestoreManager; import com.gitblit.manager.IRepositoryManager; import com.gitblit.utils.CompressionUtils; import com.gitblit.utils.JGitUtils; @@ -57,6 +59,8 @@ public class DownloadZipServlet extends HttpServlet { private IStoredSettings settings; private IRepositoryManager repositoryManager; + + private IFilestoreManager filestoreManager; public static enum Format { zip(".zip"), tar(".tar"), gz(".tar.gz"), xz(".tar.xz"), bzip2(".tar.bzip2"); @@ -78,9 +82,10 @@ public class DownloadZipServlet extends HttpServlet { } @Inject - public DownloadZipServlet(IStoredSettings settings, IRepositoryManager repositoryManager) { + public DownloadZipServlet(IStoredSettings settings, IRepositoryManager repositoryManager, IFilestoreManager filestoreManager) { this.settings = settings; this.repositoryManager = repositoryManager; + this.filestoreManager = filestoreManager; } /** @@ -169,22 +174,23 @@ public class DownloadZipServlet extends HttpServlet { response.setHeader("Pragma", "no-cache"); response.setDateHeader("Expires", 0); + try { switch (format) { case zip: - CompressionUtils.zip(r, basePath, objectId, response.getOutputStream()); + CompressionUtils.zip(r, filestoreManager, basePath, objectId, response.getOutputStream()); break; case tar: - CompressionUtils.tar(r, basePath, objectId, response.getOutputStream()); + CompressionUtils.tar(r, filestoreManager, basePath, objectId, response.getOutputStream()); break; case gz: - CompressionUtils.gz(r, basePath, objectId, response.getOutputStream()); + CompressionUtils.gz(r, filestoreManager, basePath, objectId, response.getOutputStream()); break; case xz: - CompressionUtils.xz(r, basePath, objectId, response.getOutputStream()); + CompressionUtils.xz(r, filestoreManager, basePath, objectId, response.getOutputStream()); break; case bzip2: - CompressionUtils.bzip2(r, basePath, objectId, response.getOutputStream()); + CompressionUtils.bzip2(r, filestoreManager, basePath, objectId, response.getOutputStream()); break; } diff --git a/src/main/java/com/gitblit/servlet/FilestoreServlet.java b/src/main/java/com/gitblit/servlet/FilestoreServlet.java index 8f303fcf..4af9084d 100644 --- a/src/main/java/com/gitblit/servlet/FilestoreServlet.java +++ b/src/main/java/com/gitblit/servlet/FilestoreServlet.java @@ -238,7 +238,10 @@ public class FilestoreServlet extends HttpServlet { } } else { response.setStatus(responseObject.error.code); - serialize(response, responseObject.error); + + if (isMetaRequest) { + serialize(response, responseObject.error); + } } }; diff --git a/src/main/java/com/gitblit/servlet/GitFilter.java b/src/main/java/com/gitblit/servlet/GitFilter.java index 27408f02..9522893e 100644 --- a/src/main/java/com/gitblit/servlet/GitFilter.java +++ b/src/main/java/com/gitblit/servlet/GitFilter.java @@ -102,8 +102,8 @@ public class GitFilter extends AccessRestrictionFilter { } /** - * Analyze the url and returns the action of the request. Return values are - * either "/git-receive-pack" or "/git-upload-pack". + * Analyze the url and returns the action of the request. Return values are: + * "/git-receive-pack", "/git-upload-pack" or "/info/lfs". * * @param serverUrl * @return action of the request @@ -316,18 +316,22 @@ public class GitFilter extends AccessRestrictionFilter { /** * Git lfs action uses an alternative authentication header, + * dependent on the viewing method. * + * @param httpRequest * @param action * @return */ @Override - protected String getAuthenticationHeader(String action) { + protected String getAuthenticationHeader(HttpServletRequest httpRequest, String action) { if (action.equals(gitLfs)) { - return "LFS-Authenticate"; + if (hasContentInRequestHeader(httpRequest, "Accept", FilestoreServlet.GIT_LFS_META_MIME)) { + return "LFS-Authenticate"; + } } - return super.getAuthenticationHeader(action); + return super.getAuthenticationHeader(httpRequest, action); } /** diff --git a/src/main/java/com/gitblit/servlet/RawServlet.java b/src/main/java/com/gitblit/servlet/RawServlet.java index 897047d8..dca57730 100644 --- a/src/main/java/com/gitblit/servlet/RawServlet.java +++ b/src/main/java/com/gitblit/servlet/RawServlet.java @@ -364,7 +364,7 @@ public class RawServlet extends HttpServlet { if (pathEntries.get(0).path.indexOf('/') > -1) { // we are in a subdirectory, add parent directory link String pp = URLEncoder.encode(requestedPath, Constants.ENCODING); - pathEntries.add(0, new PathModel("..", pp + "/..", 0, FileMode.TREE.getBits(), null, null)); + pathEntries.add(0, new PathModel("..", pp + "/..", null, 0, FileMode.TREE.getBits(), null, null)); } } -- cgit v1.2.3