From 366bec6ae90ef4adadb5df0e2e9232ba7b954f8e Mon Sep 17 00:00:00 2001 From: James Moger <james.moger@gitblit.com> Date: Wed, 15 May 2013 15:55:19 -0400 Subject: [PATCH] Allow client apps to specify a minimum required access permission --- src/main/java/com/gitblit/SparkleShareInviteServlet.java | 151 +++++++++----------------------------------------- 1 files changed, 27 insertions(+), 124 deletions(-) diff --git a/src/main/java/com/gitblit/SparkleShareInviteServlet.java b/src/main/java/com/gitblit/SparkleShareInviteServlet.java index 3cabb41..14d281a 100644 --- a/src/main/java/com/gitblit/SparkleShareInviteServlet.java +++ b/src/main/java/com/gitblit/SparkleShareInviteServlet.java @@ -17,14 +17,12 @@ import java.io.IOException; import java.text.MessageFormat; -import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import com.gitblit.Constants.AccessRestrictionType; import com.gitblit.models.RepositoryModel; import com.gitblit.models.UserModel; import com.gitblit.utils.StringUtils; @@ -41,27 +39,6 @@ public SparkleShareInviteServlet() { super(); - } - - /** - * Returns an Sparkleshare invite url to this servlet for the repository. - * https://github.com/hbons/SparkleShare/wiki/Invites - * - * @param baseURL - * @param repository - * @param username - * @return an url - */ - public static String asLink(String baseURL, String repository, String username) { - if (baseURL.length() > 0 && baseURL.charAt(baseURL.length() - 1) == '/') { - baseURL = baseURL.substring(0, baseURL.length() - 1); - } - String url = baseURL + Constants.SPARKLESHARE_INVITE_PATH - + ((StringUtils.isEmpty(username) ? "" : (username + "@"))) - + repository + ".xml"; - url = url.replace("https://", "sparkleshare://"); - url = url.replace("http://", "sparkleshare-unsafe://"); - return url; } @Override @@ -81,22 +58,22 @@ java.io.IOException { // extract repo name from request - String path = request.getPathInfo(); - if (path != null && path.length() > 1) { - if (path.charAt(0) == '/') { - path = path.substring(1); - } - } + String repoUrl = request.getPathInfo().substring(1); + // trim trailing .xml - if (path.endsWith(".xml")) { - path = path.substring(0, path.length() - 4); + if (repoUrl.endsWith(".xml")) { + repoUrl = repoUrl.substring(0, repoUrl.length() - 4); } + String servletPath = Constants.GIT_PATH; + + int schemeIndex = repoUrl.indexOf("://") + 3; + String host = repoUrl.substring(0, repoUrl.indexOf('/', schemeIndex)); + String path = repoUrl.substring(repoUrl.indexOf(servletPath) + servletPath.length()); String username = null; - int fetch = path.indexOf('@'); - if (fetch > -1) { - username = path.substring(0, fetch); - path = path.substring(fetch + 1); + int fetchIndex = repoUrl.indexOf('@'); + if (fetchIndex > -1) { + username = repoUrl.substring(schemeIndex, fetchIndex); } UserModel user; if (StringUtils.isEmpty(username)) { @@ -109,102 +86,28 @@ username = ""; } - // ensure that the requested repository exists and is sparkleshared + // ensure that the requested repository exists RepositoryModel model = GitBlit.self().getRepositoryModel(path); if (model == null) { response.setStatus(HttpServletResponse.SC_NOT_FOUND); response.getWriter().append(MessageFormat.format("Repository \"{0}\" not found!", path)); return; - } else if (!model.isSparkleshared()) { - response.setStatus(HttpServletResponse.SC_FORBIDDEN); - response.getWriter().append(MessageFormat.format("Repository \"{0}\" is not sparkleshared!", path)); - return; } - if (GitBlit.getBoolean(Keys.git.enableGitServlet, true) - || GitBlit.getInteger(Keys.git.daemonPort, 0) > 0) { - // Gitblit as server - // determine username for repository url - if (model.accessRestriction.exceeds(AccessRestrictionType.NONE)) { - if (!user.canRewindRef(model)) { - response.setStatus(HttpServletResponse.SC_FORBIDDEN); - response.getWriter().append(MessageFormat.format("\"{0}\" does not have RW+ permissions for {1}!", user.username, path)); - return; - } - } - - if (model.accessRestriction.exceeds(AccessRestrictionType.NONE)) { - username = user.username + "@"; - } else { - username = ""; - } - - String serverPort = ""; - if (request.getScheme().equals("https")) { - if (request.getServerPort() != 443) { - serverPort = ":" + request.getServerPort(); - } - } else if (request.getScheme().equals("http")) { - if (request.getServerPort() != 80) { - serverPort = ":" + request.getServerPort(); - } - } - - // assume http/https serving - String scheme = request.getScheme(); - String servletPath = Constants.GIT_PATH; - - // try to switch to git://, if git servlet disabled and repo has no restrictions - if (!GitBlit.getBoolean(Keys.git.enableGitServlet, true) - && (GitBlit.getInteger(Keys.git.daemonPort, 0) > 0) - && AccessRestrictionType.NONE == model.accessRestriction) { - scheme = "git"; - servletPath = "/"; - serverPort = GitBlit.getString(Keys.git.daemonPort, ""); - } - - // construct Sparkleshare invite - StringBuilder sb = new StringBuilder(); - sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"); - sb.append("<sparkleshare><invite>\n"); - sb.append(MessageFormat.format("<address>{0}://{1}{2}{3}{4}</address>\n", scheme, username, request.getServerName(), serverPort, request.getContextPath())); - sb.append(MessageFormat.format("<remote_path>{0}{1}</remote_path>\n", servletPath, model.name)); - if (GitBlit.getInteger(Keys.fanout.port, 0) > 0) { - // Gitblit is running it's own fanout service for pubsub notifications - sb.append(MessageFormat.format("<announcements_url>tcp://{0}:{1}</announcements_url>\n", request.getServerName(), GitBlit.getString(Keys.fanout.port, ""))); - } - sb.append("</invite></sparkleshare>\n"); - - // write invite to client - response.setContentType("application/xml"); - response.setContentLength(sb.length()); - response.getWriter().append(sb.toString()); - } else { - // Gitblit as viewer, repository access handled externally so - // assume RW+ permission - List<String> others = GitBlit.getStrings(Keys.web.otherUrls); - if (others.size() == 0) { - return; - } - - String address = MessageFormat.format(others.get(0), "", username); - - StringBuilder sb = new StringBuilder(); - sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"); - sb.append("<sparkleshare><invite>\n"); - - sb.append(MessageFormat.format("<address>{0}</address>\n", address)); - sb.append(MessageFormat.format("<remote_path>{0}</remote_path>\n", model.name)); - if (GitBlit.getInteger(Keys.fanout.port, 0) > 0) { - // Gitblit is running it's own fanout service for pubsub notifications - sb.append(MessageFormat.format("<announcements_url>tcp://{0}:{1}</announcements_url>\n", request.getServerName(), GitBlit.getString(Keys.fanout.port, ""))); - } - sb.append("</invite></sparkleshare>\n"); - - // write invite to client - response.setContentType("application/xml"); - response.setContentLength(sb.length()); - response.getWriter().append(sb.toString()); + StringBuilder sb = new StringBuilder(); + sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"); + sb.append("<sparkleshare><invite>\n"); + sb.append(MessageFormat.format("<address>{0}</address>\n", host)); + sb.append(MessageFormat.format("<remote_path>{0}{1}</remote_path>\n", servletPath, model.name)); + if (GitBlit.getInteger(Keys.fanout.port, 0) > 0) { + // Gitblit is running it's own fanout service for pubsub notifications + sb.append(MessageFormat.format("<announcements_url>tcp://{0}:{1}</announcements_url>\n", request.getServerName(), GitBlit.getString(Keys.fanout.port, ""))); } + sb.append("</invite></sparkleshare>\n"); + + // write invite to client + response.setContentType("application/xml"); + response.setContentLength(sb.length()); + response.getWriter().append(sb.toString()); } } -- Gitblit v1.9.1