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 | 199 +++++++++++++++++++++++++++---------------------- 1 files changed, 109 insertions(+), 90 deletions(-) diff --git a/src/main/java/com/gitblit/servlet/RpcServlet.java b/src/main/java/com/gitblit/servlet/RpcServlet.java index 3a115b1..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; @@ -32,18 +32,11 @@ import org.eclipse.jgit.lib.Repository; import com.gitblit.Constants; +import com.gitblit.Constants.RpcRequest; import com.gitblit.GitBlitException; import com.gitblit.IStoredSettings; import com.gitblit.Keys; -import com.gitblit.Constants.RpcRequest; -import com.gitblit.Keys.federation; -import com.gitblit.Keys.realm; -import com.gitblit.Keys.web; -import com.gitblit.manager.IFederationManager; -import com.gitblit.manager.IGitblitManager; -import com.gitblit.manager.IRepositoryManager; -import com.gitblit.manager.IRuntimeManager; -import com.gitblit.manager.IUserManager; +import com.gitblit.manager.IGitblit; import com.gitblit.models.RefModel; import com.gitblit.models.RegistrantAccessPermission; import com.gitblit.models.RepositoryModel; @@ -60,43 +53,22 @@ * 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 IRuntimeManager runtimeManager; - - private final IUserManager userManager; - - private final IRepositoryManager repositoryManager; - - private final IFederationManager federationManager; - - private final IGitblitManager gitblitManager; + private IGitblit gitblit; @Inject - public RpcServlet( - IRuntimeManager runtimeManager, - IUserManager userManager, - IRepositoryManager repositoryManager, - IFederationManager federationManager, - IGitblitManager gitblitManager) { - - super(); - - this.settings = runtimeManager.getSettings(); - this.runtimeManager = runtimeManager; - this.userManager = userManager; - this.repositoryManager = repositoryManager; - this.federationManager = federationManager; - this.gitblitManager = gitblitManager; + public RpcServlet(IStoredSettings settings, IGitblit gitblit) { + this.settings = settings; + this.gitblit = gitblit; } /** @@ -108,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(); @@ -129,15 +100,18 @@ 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.GIT_PATH); + sb.append(Constants.R_PATH); sb.append("{0}"); String cloneUrl = sb.toString(); // list repositories - List<RepositoryModel> list = repositoryManager.getRepositoryModels(user); + List<RepositoryModel> list = gitblit.getRepositoryModels(user); Map<String, RepositoryModel> repositories = new HashMap<String, RepositoryModel>(); for (RepositoryModel model : list) { String url = MessageFormat.format(cloneUrl, model.name); @@ -147,7 +121,7 @@ } else if (RpcRequest.LIST_BRANCHES.equals(reqType)) { // list all local branches in all repositories accessible to user Map<String, List<String>> localBranches = new HashMap<String, List<String>>(); - List<RepositoryModel> models = repositoryManager.getRepositoryModels(user); + List<RepositoryModel> models = gitblit.getRepositoryModels(user); for (RepositoryModel model : models) { if (!model.hasCommits) { // skip empty repository @@ -155,11 +129,12 @@ } 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 - Repository repository = repositoryManager.getRepository(model.name); + Repository repository = gitblit.getRepository(model.name); List<RefModel> refs = JGitUtils.getLocalBranches(repository, false, -1); if (model.showRemoteBranches) { // add remote branches if repository displays them @@ -187,7 +162,7 @@ } else { if (user.canAdmin() || objectName.equals(user.username)) { // return the specified user - UserModel requestedUser = userManager.getUserModel(objectName); + UserModel requestedUser = gitblit.getUserModel(objectName); if (requestedUser == null) { response.setStatus(failureCode); } else { @@ -199,27 +174,54 @@ } } else if (RpcRequest.LIST_USERS.equals(reqType)) { // list users - List<String> names = userManager.getAllUsernames(); + List<String> names = gitblit.getAllUsernames(); List<UserModel> users = new ArrayList<UserModel>(); for (String name : names) { - users.add(userManager.getUserModel(name)); + users.add(gitblit.getUserModel(name)); } result = users; } else if (RpcRequest.LIST_TEAMS.equals(reqType)) { // list teams - List<String> names = userManager.getAllTeamNames(); + List<String> names = gitblit.getAllTeamNames(); List<TeamModel> teams = new ArrayList<TeamModel>(); for (String name : names) { - teams.add(userManager.getTeamModel(name)); + teams.add(gitblit.getTeamModel(name)); } result = teams; } else if (RpcRequest.CREATE_REPOSITORY.equals(reqType)) { // create repository RepositoryModel model = deserialize(request, response, RepositoryModel.class); try { - repositoryManager.updateRepositoryModel(model.name, model, true); + gitblit.updateRepositoryModel(model.name, model, true); } 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 @@ -230,19 +232,19 @@ repoName = model.name; } try { - repositoryManager.updateRepositoryModel(repoName, model, false); + gitblit.updateRepositoryModel(repoName, model, false); } catch (GitBlitException e) { response.setStatus(failureCode); } } else if (RpcRequest.DELETE_REPOSITORY.equals(reqType)) { // delete repository RepositoryModel model = deserialize(request, response, RepositoryModel.class); - repositoryManager.deleteRepositoryModel(model); + gitblit.deleteRepositoryModel(model); } else if (RpcRequest.CREATE_USER.equals(reqType)) { // create user UserModel model = deserialize(request, response, UserModel.class); try { - gitblitManager.updateUserModel(model.username, model, true); + gitblit.addUser(model); } catch (GitBlitException e) { response.setStatus(failureCode); } @@ -255,21 +257,21 @@ username = model.username; } try { - gitblitManager.updateUserModel(username, model, false); + gitblit.reviseUser(username, model); } catch (GitBlitException e) { response.setStatus(failureCode); } } else if (RpcRequest.DELETE_USER.equals(reqType)) { // delete user UserModel model = deserialize(request, response, UserModel.class); - if (!userManager.deleteUser(model.username)) { + if (!gitblit.deleteUser(model.username)) { response.setStatus(failureCode); } } else if (RpcRequest.CREATE_TEAM.equals(reqType)) { // create team TeamModel model = deserialize(request, response, TeamModel.class); try { - gitblitManager.updateTeamModel(model.name, model, true); + gitblit.addTeam(model); } catch (GitBlitException e) { response.setStatus(failureCode); } @@ -282,80 +284,85 @@ teamname = model.name; } try { - gitblitManager.updateTeamModel(teamname, model, false); + gitblit.reviseTeam(teamname, model); } catch (GitBlitException e) { response.setStatus(failureCode); } } else if (RpcRequest.DELETE_TEAM.equals(reqType)) { // delete team TeamModel model = deserialize(request, response, TeamModel.class); - if (!userManager.deleteTeam(model.name)) { + if (!gitblit.deleteTeam(model.name)) { response.setStatus(failureCode); } } else if (RpcRequest.LIST_REPOSITORY_MEMBERS.equals(reqType)) { // get repository members - RepositoryModel model = repositoryManager.getRepositoryModel(objectName); - result = repositoryManager.getRepositoryUsers(model); + RepositoryModel model = gitblit.getRepositoryModel(objectName); + result = gitblit.getRepositoryUsers(model); } else if (RpcRequest.SET_REPOSITORY_MEMBERS.equals(reqType)) { // rejected since 1.2.0 response.setStatus(failureCode); } else if (RpcRequest.LIST_REPOSITORY_MEMBER_PERMISSIONS.equals(reqType)) { // get repository member permissions - RepositoryModel model = repositoryManager.getRepositoryModel(objectName); - result = repositoryManager.getUserAccessPermissions(model); + RepositoryModel model = gitblit.getRepositoryModel(objectName); + result = gitblit.getUserAccessPermissions(model); } else if (RpcRequest.SET_REPOSITORY_MEMBER_PERMISSIONS.equals(reqType)) { // set the repository permissions for the specified users - RepositoryModel model = repositoryManager.getRepositoryModel(objectName); - Collection<RegistrantAccessPermission> permissions = deserialize(request, response, RpcUtils.REGISTRANT_PERMISSIONS_TYPE); - result = repositoryManager.setUserAccessPermissions(model, permissions); + RepositoryModel model = gitblit.getRepositoryModel(objectName); + 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 - RepositoryModel model = repositoryManager.getRepositoryModel(objectName); - result = repositoryManager.getRepositoryTeams(model); + RepositoryModel model = gitblit.getRepositoryModel(objectName); + result = gitblit.getRepositoryTeams(model); } else if (RpcRequest.SET_REPOSITORY_TEAMS.equals(reqType)) { // rejected since 1.2.0 response.setStatus(failureCode); } else if (RpcRequest.LIST_REPOSITORY_TEAM_PERMISSIONS.equals(reqType)) { // get repository team permissions - RepositoryModel model = repositoryManager.getRepositoryModel(objectName); - result = repositoryManager.getTeamAccessPermissions(model); + RepositoryModel model = gitblit.getRepositoryModel(objectName); + result = gitblit.getTeamAccessPermissions(model); } else if (RpcRequest.SET_REPOSITORY_TEAM_PERMISSIONS.equals(reqType)) { // set the repository permissions for the specified teams - RepositoryModel model = repositoryManager.getRepositoryModel(objectName); - Collection<RegistrantAccessPermission> permissions = deserialize(request, response, RpcUtils.REGISTRANT_PERMISSIONS_TYPE); - result = repositoryManager.setTeamAccessPermissions(model, permissions); + RepositoryModel model = gitblit.getRepositoryModel(objectName); + 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 if (allowAdmin) { - result = federationManager.getFederationRegistrations(); + result = gitblit.getFederationRegistrations(); } else { response.sendError(notAllowedCode); } } else if (RpcRequest.LIST_FEDERATION_RESULTS.equals(reqType)) { // return the list of federation result registrations - if (allowAdmin && federationManager.canFederate()) { - result = federationManager.getFederationResultRegistrations(); + if (allowAdmin && gitblit.canFederate()) { + result = gitblit.getFederationResultRegistrations(); } else { response.sendError(notAllowedCode); } } else if (RpcRequest.LIST_FEDERATION_PROPOSALS.equals(reqType)) { // return the list of federation proposals - if (allowAdmin && federationManager.canFederate()) { - result = federationManager.getPendingFederationProposals(); + if (allowAdmin && gitblit.canFederate()) { + result = gitblit.getPendingFederationProposals(); } else { response.sendError(notAllowedCode); } } else if (RpcRequest.LIST_FEDERATION_SETS.equals(reqType)) { // return the list of federation sets - if (allowAdmin && federationManager.canFederate()) { - String gitblitUrl = HttpUtils.getGitblitURL(request); - result = federationManager.getFederationSets(gitblitUrl); + if (allowAdmin && gitblit.canFederate()) { + String gitblitUrl = settings.getString(Keys.web.canonicalUrl, null); + if (StringUtils.isEmpty(gitblitUrl)) { + gitblitUrl = HttpUtils.getGitblitURL(request); + } + result = gitblit.getFederationSets(gitblitUrl); } else { response.sendError(notAllowedCode); } } else if (RpcRequest.LIST_SETTINGS.equals(reqType)) { // return the server's settings - ServerSettings serverSettings = runtimeManager.getSettingsModel(); + ServerSettings serverSettings = gitblit.getSettingsModel(); if (allowAdmin) { // return all settings result = serverSettings; @@ -385,23 +392,35 @@ } else if (RpcRequest.EDIT_SETTINGS.equals(reqType)) { // update settings on the server if (allowAdmin) { - Map<String, String> map = deserialize(request, response, - RpcUtils.SETTINGS_TYPE); - runtimeManager.updateSettings(map); + Map<String, String> map = deserialize(request, response, RpcUtils.SETTINGS_TYPE); + gitblit.updateSettings(map); } else { response.sendError(notAllowedCode); } } else if (RpcRequest.LIST_STATUS.equals(reqType)) { // return the server's status information if (allowAdmin) { - result = runtimeManager.getStatus(); + result = gitblit.getStatus(); } else { response.sendError(notAllowedCode); } } else if (RpcRequest.CLEAR_REPOSITORY_CACHE.equals(reqType)) { // clear the repository list cache if (allowManagement) { - repositoryManager.resetRepositoryListCache(); + gitblit.resetRepositoryListCache(); + } 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); } -- Gitblit v1.9.1