From f76fee63ed9cb3a30d3c0c092d860b1cb93a481b Mon Sep 17 00:00:00 2001
From: Gerard Smyth <gerard.smyth@gmail.com>
Date: Thu, 08 May 2014 13:09:30 -0400
Subject: [PATCH] Updated the SyndicationServlet to provide an additional option to return details of the tags in the repository instead of the commits. This uses a new 'ot' request parameter to indicate the object type of the content to return, which can be ither TAG or COMMIT. If this is not provided, then COMMIT is assumed to maintain backwards compatability. If tags are returned, then the paging parameters, 'l' and 'pg' are still supported, but searching options are currently ignored.
---
src/main/java/com/gitblit/servlet/RpcServlet.java | 202 +++++++++++++++++++++++++++-----------------------
1 files changed, 110 insertions(+), 92 deletions(-)
diff --git a/src/main/java/com/gitblit/servlet/RpcServlet.java b/src/main/java/com/gitblit/servlet/RpcServlet.java
index 3a115b1..b8cdfb0 100644
--- a/src/main/java/com/gitblit/servlet/RpcServlet.java
+++ b/src/main/java/com/gitblit/servlet/RpcServlet.java
@@ -23,8 +23,6 @@
import java.util.List;
import java.util.Map;
-import javax.inject.Inject;
-import javax.inject.Singleton;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@@ -32,18 +30,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;
@@ -56,47 +47,27 @@
import com.gitblit.utils.RpcUtils;
import com.gitblit.utils.StringUtils;
+import dagger.ObjectGraph;
+
/**
* 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 IGitblit gitblit;
- private final IUserManager userManager;
-
- private final IRepositoryManager repositoryManager;
-
- private final IFederationManager federationManager;
-
- private final IGitblitManager gitblitManager;
-
- @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;
+ @Override
+ protected void inject(ObjectGraph dagger) {
+ this.settings = dagger.get(IStoredSettings.class);
+ this.gitblit = dagger.get(IGitblit.class);
}
/**
@@ -108,12 +79,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 +99,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 +120,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 +128,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 +161,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 +173,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 +231,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 +256,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 +283,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 +391,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