From a502d96a860456ec5e8c96761db70f7cabb74751 Mon Sep 17 00:00:00 2001 From: Paul Martin <paul@paulsputer.com> Date: Sat, 30 Apr 2016 04:19:14 -0400 Subject: [PATCH] Merge pull request #1073 from gitblit/1062-DocEditorUpdates --- src/main/java/com/gitblit/servlet/RpcServlet.java | 95 ++++++++++++++++++++++++++++++++++------------- 1 files changed, 69 insertions(+), 26 deletions(-) diff --git a/src/main/java/com/gitblit/servlet/RpcServlet.java b/src/main/java/com/gitblit/servlet/RpcServlet.java index 481a8ba..9809a25 100644 --- a/src/main/java/com/gitblit/servlet/RpcServlet.java +++ b/src/main/java/com/gitblit/servlet/RpcServlet.java @@ -23,8 +23,8 @@ import java.util.List; import java.util.Map; -import javax.inject.Inject; -import javax.inject.Singleton; +import com.google.inject.Inject; +import com.google.inject.Singleton; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -53,25 +53,21 @@ * Handles remote procedure calls. * * @author James Moger - * */ @Singleton public class RpcServlet extends JsonServlet { private static final long serialVersionUID = 1L; - public static final int PROTOCOL_VERSION = 6; + public static final int PROTOCOL_VERSION = 8; - private final IStoredSettings settings; + private IStoredSettings settings; - private final IGitblit gitblit; + private IGitblit gitblit; @Inject - public RpcServlet(IGitblit gitblit) { - - super(); - - this.settings = gitblit.getSettings(); + public RpcServlet(IStoredSettings settings, IGitblit gitblit) { + this.settings = settings; this.gitblit = gitblit; } @@ -84,12 +80,11 @@ * @throws java.io.IOException */ @Override - protected void processRequest(HttpServletRequest request, HttpServletResponse response) - throws ServletException, IOException { + protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, + IOException { RpcRequest reqType = RpcRequest.fromName(request.getParameter("req")); String objectName = request.getParameter("name"); - logger.info(MessageFormat.format("Rpc {0} request from {1}", reqType, - request.getRemoteAddr())); + logger.info(MessageFormat.format("Rpc {0} request from {1}", reqType, request.getRemoteAddr())); UserModel user = (UserModel) request.getUserPrincipal(); @@ -105,7 +100,10 @@ result = PROTOCOL_VERSION; } else if (RpcRequest.LIST_REPOSITORIES.equals(reqType)) { // Determine the Gitblit clone url - String gitblitUrl = HttpUtils.getGitblitURL(request); + String gitblitUrl = settings.getString(Keys.web.canonicalUrl, null); + if (StringUtils.isEmpty(gitblitUrl)) { + gitblitUrl = HttpUtils.getGitblitURL(request); + } StringBuilder sb = new StringBuilder(); sb.append(gitblitUrl); sb.append(Constants.R_PATH); @@ -131,7 +129,8 @@ } if (model.isCollectingGarbage) { // skip garbage collecting repository - logger.warn(MessageFormat.format("Temporarily excluding {0} from RPC, busy collecting garbage", model.name)); + logger.warn(MessageFormat.format("Temporarily excluding {0} from RPC, busy collecting garbage", + model.name)); continue; } // get local branches @@ -197,6 +196,33 @@ } catch (GitBlitException e) { response.setStatus(failureCode); } + } else if (RpcRequest.FORK_REPOSITORY.equals(reqType)) { + // fork repository + RepositoryModel origin = gitblit.getRepositoryModel(objectName); + if (origin == null) { + // failed to find repository, error is logged by the repository + // manager + response.setStatus(failureCode); + } else { + if (user == null || !user.canFork(origin)) { + logger.error("User {} is not permitted to fork '{}'!", user == null ? "anonymous" : user.username, + objectName); + response.setStatus(failureCode); + } else { + try { + // fork the origin + RepositoryModel fork = gitblit.fork(origin, user); + if (fork == null) { + logger.error("Failed to fork repository '{}'!", objectName); + response.setStatus(failureCode); + } else { + logger.info("User {} has forked '{}'!", user.username, objectName); + } + } catch (GitBlitException e) { + response.setStatus(failureCode); + } + } + } } else if (RpcRequest.EDIT_REPOSITORY.equals(reqType)) { // edit repository RepositoryModel model = deserialize(request, response, RepositoryModel.class); @@ -218,7 +244,7 @@ // create user UserModel model = deserialize(request, response, UserModel.class); try { - gitblit.updateUserModel(model.username, model, true); + gitblit.addUser(model); } catch (GitBlitException e) { response.setStatus(failureCode); } @@ -231,7 +257,7 @@ username = model.username; } try { - gitblit.updateUserModel(username, model, false); + gitblit.reviseUser(username, model); } catch (GitBlitException e) { response.setStatus(failureCode); } @@ -245,7 +271,7 @@ // create team TeamModel model = deserialize(request, response, TeamModel.class); try { - gitblit.updateTeamModel(model.name, model, true); + gitblit.addTeam(model); } catch (GitBlitException e) { response.setStatus(failureCode); } @@ -258,7 +284,7 @@ teamname = model.name; } try { - gitblit.updateTeamModel(teamname, model, false); + gitblit.reviseTeam(teamname, model); } catch (GitBlitException e) { response.setStatus(failureCode); } @@ -282,7 +308,8 @@ } else if (RpcRequest.SET_REPOSITORY_MEMBER_PERMISSIONS.equals(reqType)) { // set the repository permissions for the specified users RepositoryModel model = gitblit.getRepositoryModel(objectName); - Collection<RegistrantAccessPermission> permissions = deserialize(request, response, RpcUtils.REGISTRANT_PERMISSIONS_TYPE); + Collection<RegistrantAccessPermission> permissions = deserialize(request, response, + RpcUtils.REGISTRANT_PERMISSIONS_TYPE); result = gitblit.setUserAccessPermissions(model, permissions); } else if (RpcRequest.LIST_REPOSITORY_TEAMS.equals(reqType)) { // get repository teams @@ -298,7 +325,8 @@ } else if (RpcRequest.SET_REPOSITORY_TEAM_PERMISSIONS.equals(reqType)) { // set the repository permissions for the specified teams RepositoryModel model = gitblit.getRepositoryModel(objectName); - Collection<RegistrantAccessPermission> permissions = deserialize(request, response, RpcUtils.REGISTRANT_PERMISSIONS_TYPE); + Collection<RegistrantAccessPermission> permissions = deserialize(request, response, + RpcUtils.REGISTRANT_PERMISSIONS_TYPE); result = gitblit.setTeamAccessPermissions(model, permissions); } else if (RpcRequest.LIST_FEDERATION_REGISTRATIONS.equals(reqType)) { // return the list of federation registrations @@ -324,7 +352,10 @@ } else if (RpcRequest.LIST_FEDERATION_SETS.equals(reqType)) { // return the list of federation sets if (allowAdmin && gitblit.canFederate()) { - String gitblitUrl = HttpUtils.getGitblitURL(request); + String gitblitUrl = settings.getString(Keys.web.canonicalUrl, null); + if (StringUtils.isEmpty(gitblitUrl)) { + gitblitUrl = HttpUtils.getGitblitURL(request); + } result = gitblit.getFederationSets(gitblitUrl); } else { response.sendError(notAllowedCode); @@ -361,8 +392,7 @@ } else if (RpcRequest.EDIT_SETTINGS.equals(reqType)) { // update settings on the server if (allowAdmin) { - Map<String, String> map = deserialize(request, response, - RpcUtils.SETTINGS_TYPE); + Map<String, String> map = deserialize(request, response, RpcUtils.SETTINGS_TYPE); gitblit.updateSettings(map); } else { response.sendError(notAllowedCode); @@ -381,6 +411,19 @@ } else { response.sendError(notAllowedCode); } + } else if (RpcRequest.REINDEX_TICKETS.equals(reqType)) { + if (allowManagement) { + if (StringUtils.isEmpty(objectName)) { + // reindex all tickets + gitblit.getTicketService().reindex(); + } else { + // reindex tickets in a specific repository + RepositoryModel model = gitblit.getRepositoryModel(objectName); + gitblit.getTicketService().reindex(model); + } + } else { + response.sendError(notAllowedCode); + } } // send the result of the request -- Gitblit v1.9.1