From 4d81c92b668bce79d7db7bc278f0d399fe693e65 Mon Sep 17 00:00:00 2001 From: James Moger Date: Mon, 28 Apr 2014 14:56:15 -0400 Subject: Implementation of a ticket mgration tool --- src/test/java/com/gitblit/tests/TicketServiceTest.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'src/test/java/com/gitblit') diff --git a/src/test/java/com/gitblit/tests/TicketServiceTest.java b/src/test/java/com/gitblit/tests/TicketServiceTest.java index d91ce533..1676e341 100644 --- a/src/test/java/com/gitblit/tests/TicketServiceTest.java +++ b/src/test/java/com/gitblit/tests/TicketServiceTest.java @@ -95,7 +95,7 @@ public abstract class TicketServiceTest extends GitblitUnitTest { // query non-existent ticket TicketModel nonExistent = service.getTicket(getRepository(), 0); assertNull(nonExistent); - + // create and insert a ticket Change c1 = newChange("testCreation() " + Long.toHexString(System.currentTimeMillis())); TicketModel ticket = service.createTicket(getRepository(), c1); @@ -205,6 +205,9 @@ public abstract class TicketServiceTest extends GitblitUnitTest { assertEquals(1, results.size()); assertTrue(results.get(0).title.startsWith("testUpdates")); + // check the ids + assertEquals("[1, 2]", service.getIds(getRepository()).toString()); + // delete all tickets for (TicketModel aTicket : allTickets) { assertTrue(service.deleteTicket(getRepository(), aTicket.number, "D")); -- cgit v1.2.3 From 03d5ee0bcc4b9d7b6814d7212d19d1126638810d Mon Sep 17 00:00:00 2001 From: manisha Date: Fri, 21 Mar 2014 14:27:02 +0530 Subject: Implement FORK RPC request type --- src/main/java/com/gitblit/Constants.java | 2 +- .../models/UserRepositoryCompositeModel.java | 47 ++ src/main/java/com/gitblit/servlet/RpcServlet.java | 689 +++++++++++---------- src/main/java/com/gitblit/utils/RpcUtils.java | 31 +- src/test/config/test-users.conf | 1 - src/test/java/com/gitblit/tests/RpcTests.java | 6 + src/test/java/com/gitblit/tests/Test.java | 11 + 7 files changed, 435 insertions(+), 352 deletions(-) create mode 100644 src/main/java/com/gitblit/models/UserRepositoryCompositeModel.java create mode 100644 src/test/java/com/gitblit/tests/Test.java (limited to 'src/test/java/com/gitblit') diff --git a/src/main/java/com/gitblit/Constants.java b/src/main/java/com/gitblit/Constants.java index a5e76a51..cbbc0cac 100644 --- a/src/main/java/com/gitblit/Constants.java +++ b/src/main/java/com/gitblit/Constants.java @@ -353,7 +353,7 @@ public class Constants { // Order is important here. anything above LIST_SETTINGS requires // administrator privileges and web.allowRpcManagement. CLEAR_REPOSITORY_CACHE, REINDEX_TICKETS, GET_PROTOCOL, LIST_REPOSITORIES, LIST_BRANCHES, GET_USER, LIST_SETTINGS, - CREATE_REPOSITORY, EDIT_REPOSITORY, DELETE_REPOSITORY, + CREATE_REPOSITORY, FORK_REPOSITORY, EDIT_REPOSITORY, DELETE_REPOSITORY, LIST_USERS, CREATE_USER, EDIT_USER, DELETE_USER, LIST_TEAMS, CREATE_TEAM, EDIT_TEAM, DELETE_TEAM, LIST_REPOSITORY_MEMBERS, SET_REPOSITORY_MEMBERS, LIST_REPOSITORY_TEAMS, SET_REPOSITORY_TEAMS, diff --git a/src/main/java/com/gitblit/models/UserRepositoryCompositeModel.java b/src/main/java/com/gitblit/models/UserRepositoryCompositeModel.java new file mode 100644 index 00000000..122bb3ba --- /dev/null +++ b/src/main/java/com/gitblit/models/UserRepositoryCompositeModel.java @@ -0,0 +1,47 @@ +package com.gitblit.models; + +/* + * Copyright 2011 gitblit.com. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +import com.gitblit.utils.StringUtils; + +import java.io.Serializable; + +public class UserRepositoryCompositeModel implements Serializable { + + private static final long serialVersionUID = 1L; + + public UserModel userModel; + public RepositoryModel repositoryModel; + + public UserModel getUserModel() { + return userModel; + } + + public void setUserModel(UserModel userModel) { + this.userModel = userModel; + } + + public RepositoryModel getRepositoryModel() { + return repositoryModel; + } + + public void setRepositoryModel(RepositoryModel repositoryModel) { + this.repositoryModel = repositoryModel; + } + +} \ No newline at end of file diff --git a/src/main/java/com/gitblit/servlet/RpcServlet.java b/src/main/java/com/gitblit/servlet/RpcServlet.java index 2d59ebd7..80c50714 100644 --- a/src/main/java/com/gitblit/servlet/RpcServlet.java +++ b/src/main/java/com/gitblit/servlet/RpcServlet.java @@ -27,6 +27,7 @@ import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import com.gitblit.models.*; import org.eclipse.jgit.lib.Repository; import com.gitblit.Constants; @@ -35,12 +36,6 @@ import com.gitblit.GitBlitException; import com.gitblit.IStoredSettings; import com.gitblit.Keys; import com.gitblit.manager.IGitblit; -import com.gitblit.models.RefModel; -import com.gitblit.models.RegistrantAccessPermission; -import com.gitblit.models.RepositoryModel; -import com.gitblit.models.ServerSettings; -import com.gitblit.models.TeamModel; -import com.gitblit.models.UserModel; import com.gitblit.utils.DeepCopier; import com.gitblit.utils.HttpUtils; import com.gitblit.utils.JGitUtils; @@ -53,352 +48,368 @@ import dagger.ObjectGraph; * Handles remote procedure calls. * * @author James Moger - * */ public class RpcServlet extends JsonServlet { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; + + public static final int PROTOCOL_VERSION = 7; - public static final int PROTOCOL_VERSION = 7; + private IStoredSettings settings; - private IStoredSettings settings; + private IGitblit gitblit; - private IGitblit gitblit; + @Override + protected void inject(ObjectGraph dagger) { + this.settings = dagger.get(IStoredSettings.class); + this.gitblit = dagger.get(IGitblit.class); + } - @Override - protected void inject(ObjectGraph dagger) { - this.settings = dagger.get(IStoredSettings.class); - this.gitblit = dagger.get(IGitblit.class); - } + /** + * Processes an rpc request. + * + * @param request + * @param response + * @throws javax.servlet.ServletException + * @throws java.io.IOException + */ + @Override + 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())); - /** - * Processes an rpc request. - * - * @param request - * @param response - * @throws javax.servlet.ServletException - * @throws java.io.IOException - */ - @Override - 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())); + UserModel user = (UserModel) request.getUserPrincipal(); - UserModel user = (UserModel) request.getUserPrincipal(); + boolean allowManagement = user != null && user.canAdmin() + && settings.getBoolean(Keys.web.enableRpcManagement, false); - boolean allowManagement = user != null && user.canAdmin() - && settings.getBoolean(Keys.web.enableRpcManagement, false); + boolean allowAdmin = user != null && user.canAdmin() + && settings.getBoolean(Keys.web.enableRpcAdministration, false); - boolean allowAdmin = user != null && user.canAdmin() - && settings.getBoolean(Keys.web.enableRpcAdministration, false); + Object result = null; + if (RpcRequest.GET_PROTOCOL.equals(reqType)) { + // Return the protocol version + result = PROTOCOL_VERSION; + } else if (RpcRequest.LIST_REPOSITORIES.equals(reqType)) { + // Determine the Gitblit clone url + 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); + sb.append("{0}"); + String cloneUrl = sb.toString(); - Object result = null; - if (RpcRequest.GET_PROTOCOL.equals(reqType)) { - // Return the protocol version - result = PROTOCOL_VERSION; - } else if (RpcRequest.LIST_REPOSITORIES.equals(reqType)) { - // Determine the Gitblit clone url - 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); - sb.append("{0}"); - String cloneUrl = sb.toString(); + // list repositories + List list = gitblit.getRepositoryModels(user); + Map repositories = new HashMap(); + for (RepositoryModel model : list) { + String url = MessageFormat.format(cloneUrl, model.name); + repositories.put(url, model); + } + result = repositories; + } else if (RpcRequest.LIST_BRANCHES.equals(reqType)) { + // list all local branches in all repositories accessible to user + Map> localBranches = new HashMap>(); + List models = gitblit.getRepositoryModels(user); + for (RepositoryModel model : models) { + if (!model.hasCommits) { + // skip empty repository + continue; + } + if (model.isCollectingGarbage) { + // skip garbage collecting repository + logger.warn(MessageFormat.format("Temporarily excluding {0} from RPC, busy collecting garbage", model.name)); + continue; + } + // get local branches + Repository repository = gitblit.getRepository(model.name); + List refs = JGitUtils.getLocalBranches(repository, false, -1); + if (model.showRemoteBranches) { + // add remote branches if repository displays them + refs.addAll(JGitUtils.getRemoteBranches(repository, false, -1)); + } + if (refs.size() > 0) { + List branches = new ArrayList(); + for (RefModel ref : refs) { + branches.add(ref.getName()); + } + localBranches.put(model.name, branches); + } + repository.close(); + } + result = localBranches; + } else if (RpcRequest.GET_USER.equals(reqType)) { + if (StringUtils.isEmpty(objectName)) { + if (UserModel.ANONYMOUS.equals(user)) { + response.sendError(forbiddenCode); + } else { + // return the current user, reset credentials + UserModel requestedUser = DeepCopier.copy(user); + result = requestedUser; + } + } else { + if (user.canAdmin() || objectName.equals(user.username)) { + // return the specified user + UserModel requestedUser = gitblit.getUserModel(objectName); + if (requestedUser == null) { + response.setStatus(failureCode); + } else { + result = requestedUser; + } + } else { + response.sendError(forbiddenCode); + } + } + } else if (RpcRequest.LIST_USERS.equals(reqType)) { + // list users + List names = gitblit.getAllUsernames(); + List users = new ArrayList(); + for (String name : names) { + users.add(gitblit.getUserModel(name)); + } + result = users; + } else if (RpcRequest.LIST_TEAMS.equals(reqType)) { + // list teams + List names = gitblit.getAllTeamNames(); + List teams = new ArrayList(); + for (String name : names) { + teams.add(gitblit.getTeamModel(name)); + } + result = teams; + } else if (RpcRequest.CREATE_REPOSITORY.equals(reqType)) { + // create repository + RepositoryModel model = deserialize(request, response, RepositoryModel.class); + try { + gitblit.updateRepositoryModel(model.name, model, true); + } catch (GitBlitException e) { + response.setStatus(failureCode); + } + } else if (RpcRequest.FORK_REPOSITORY.equals(reqType)) { + // fork repository + UserRepositoryCompositeModel userRepositoryCompositeModel = deserialize(request, response, + UserRepositoryCompositeModel.class); + RepositoryModel repoModel = userRepositoryCompositeModel.getRepositoryModel(); + UserModel userModel = userRepositoryCompositeModel.getUserModel(); + try { + if (repoModel != null && userModel != null) { + gitblit.fork(repoModel, userModel); + } else { + System.out.println("Non existing user model or repo model"); + response.setStatus(failureCode); + } - // list repositories - List list = gitblit.getRepositoryModels(user); - Map repositories = new HashMap(); - for (RepositoryModel model : list) { - String url = MessageFormat.format(cloneUrl, model.name); - repositories.put(url, model); - } - result = repositories; - } else if (RpcRequest.LIST_BRANCHES.equals(reqType)) { - // list all local branches in all repositories accessible to user - Map> localBranches = new HashMap>(); - List models = gitblit.getRepositoryModels(user); - for (RepositoryModel model : models) { - if (!model.hasCommits) { - // skip empty repository - continue; - } - if (model.isCollectingGarbage) { - // skip garbage collecting repository - logger.warn(MessageFormat.format("Temporarily excluding {0} from RPC, busy collecting garbage", model.name)); - continue; - } - // get local branches - Repository repository = gitblit.getRepository(model.name); - List refs = JGitUtils.getLocalBranches(repository, false, -1); - if (model.showRemoteBranches) { - // add remote branches if repository displays them - refs.addAll(JGitUtils.getRemoteBranches(repository, false, -1)); - } - if (refs.size() > 0) { - List branches = new ArrayList(); - for (RefModel ref : refs) { - branches.add(ref.getName()); - } - localBranches.put(model.name, branches); - } - repository.close(); - } - result = localBranches; - } else if (RpcRequest.GET_USER.equals(reqType)) { - if (StringUtils.isEmpty(objectName)) { - if (UserModel.ANONYMOUS.equals(user)) { - response.sendError(forbiddenCode); - } else { - // return the current user, reset credentials - UserModel requestedUser = DeepCopier.copy(user); - result = requestedUser; - } - } else { - if (user.canAdmin() || objectName.equals(user.username)) { - // return the specified user - UserModel requestedUser = gitblit.getUserModel(objectName); - if (requestedUser == null) { - response.setStatus(failureCode); - } else { - result = requestedUser; - } - } else { - response.sendError(forbiddenCode); - } - } - } else if (RpcRequest.LIST_USERS.equals(reqType)) { - // list users - List names = gitblit.getAllUsernames(); - List users = new ArrayList(); - for (String name : names) { - users.add(gitblit.getUserModel(name)); - } - result = users; - } else if (RpcRequest.LIST_TEAMS.equals(reqType)) { - // list teams - List names = gitblit.getAllTeamNames(); - List teams = new ArrayList(); - for (String name : names) { - teams.add(gitblit.getTeamModel(name)); - } - result = teams; - } else if (RpcRequest.CREATE_REPOSITORY.equals(reqType)) { - // create repository - RepositoryModel model = deserialize(request, response, RepositoryModel.class); - try { - gitblit.updateRepositoryModel(model.name, model, true); - } catch (GitBlitException e) { - response.setStatus(failureCode); - } - } else if (RpcRequest.EDIT_REPOSITORY.equals(reqType)) { - // edit repository - RepositoryModel model = deserialize(request, response, RepositoryModel.class); - // name specifies original repository name in event of rename - String repoName = objectName; - if (repoName == null) { - repoName = model.name; - } - try { - 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); - gitblit.deleteRepositoryModel(model); - } else if (RpcRequest.CREATE_USER.equals(reqType)) { - // create user - UserModel model = deserialize(request, response, UserModel.class); - try { - gitblit.addUser(model); - } catch (GitBlitException e) { - response.setStatus(failureCode); - } - } else if (RpcRequest.EDIT_USER.equals(reqType)) { - // edit user - UserModel model = deserialize(request, response, UserModel.class); - // name parameter specifies original user name in event of rename - String username = objectName; - if (username == null) { - username = model.username; - } - try { - 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 (!gitblit.deleteUser(model.username)) { - response.setStatus(failureCode); - } - } else if (RpcRequest.CREATE_TEAM.equals(reqType)) { - // create team - TeamModel model = deserialize(request, response, TeamModel.class); - try { - gitblit.addTeam(model); - } catch (GitBlitException e) { - response.setStatus(failureCode); - } - } else if (RpcRequest.EDIT_TEAM.equals(reqType)) { - // edit team - TeamModel model = deserialize(request, response, TeamModel.class); - // name parameter specifies original team name in event of rename - String teamname = objectName; - if (teamname == null) { - teamname = model.name; - } - try { - 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 (!gitblit.deleteTeam(model.name)) { - response.setStatus(failureCode); - } - } else if (RpcRequest.LIST_REPOSITORY_MEMBERS.equals(reqType)) { - // get repository members - 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 = 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 = gitblit.getRepositoryModel(objectName); - Collection 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 = 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 = 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 = gitblit.getRepositoryModel(objectName); - Collection 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 = gitblit.getFederationRegistrations(); - } else { - response.sendError(notAllowedCode); - } - } else if (RpcRequest.LIST_FEDERATION_RESULTS.equals(reqType)) { - // return the list of federation result registrations - 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 && 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 && 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 = gitblit.getSettingsModel(); - if (allowAdmin) { - // return all settings - result = serverSettings; - } else { - // anonymous users get a few settings to allow browser launching - List keys = new ArrayList(); - keys.add(Keys.web.siteName); - keys.add(Keys.web.mountParameters); - keys.add(Keys.web.syndicationEntries); + } catch (GitBlitException e) { + response.setStatus(failureCode); + } + } else if (RpcRequest.EDIT_REPOSITORY.equals(reqType)) { + // edit repository + RepositoryModel model = deserialize(request, response, RepositoryModel.class); + // name specifies original repository name in event of rename + String repoName = objectName; + if (repoName == null) { + repoName = model.name; + } + try { + 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); + gitblit.deleteRepositoryModel(model); + } else if (RpcRequest.CREATE_USER.equals(reqType)) { + // create user + UserModel model = deserialize(request, response, UserModel.class); + try { + gitblit.addUser(model); + } catch (GitBlitException e) { + response.setStatus(failureCode); + } + } else if (RpcRequest.EDIT_USER.equals(reqType)) { + // edit user + UserModel model = deserialize(request, response, UserModel.class); + // name parameter specifies original user name in event of rename + String username = objectName; + if (username == null) { + username = model.username; + } + try { + 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 (!gitblit.deleteUser(model.username)) { + response.setStatus(failureCode); + } + } else if (RpcRequest.CREATE_TEAM.equals(reqType)) { + // create team + TeamModel model = deserialize(request, response, TeamModel.class); + try { + gitblit.addTeam(model); + } catch (GitBlitException e) { + response.setStatus(failureCode); + } + } else if (RpcRequest.EDIT_TEAM.equals(reqType)) { + // edit team + TeamModel model = deserialize(request, response, TeamModel.class); + // name parameter specifies original team name in event of rename + String teamname = objectName; + if (teamname == null) { + teamname = model.name; + } + try { + 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 (!gitblit.deleteTeam(model.name)) { + response.setStatus(failureCode); + } + } else if (RpcRequest.LIST_REPOSITORY_MEMBERS.equals(reqType)) { + // get repository members + 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 = 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 = gitblit.getRepositoryModel(objectName); + Collection 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 = 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 = 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 = gitblit.getRepositoryModel(objectName); + Collection 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 = gitblit.getFederationRegistrations(); + } else { + response.sendError(notAllowedCode); + } + } else if (RpcRequest.LIST_FEDERATION_RESULTS.equals(reqType)) { + // return the list of federation result registrations + 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 && 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 && 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 = gitblit.getSettingsModel(); + if (allowAdmin) { + // return all settings + result = serverSettings; + } else { + // anonymous users get a few settings to allow browser launching + List keys = new ArrayList(); + keys.add(Keys.web.siteName); + keys.add(Keys.web.mountParameters); + keys.add(Keys.web.syndicationEntries); - if (allowManagement) { - // keys necessary for repository and/or user management - keys.add(Keys.realm.minPasswordLength); - keys.add(Keys.realm.passwordStorage); - keys.add(Keys.federation.sets); - } - // build the settings - ServerSettings managementSettings = new ServerSettings(); - for (String key : keys) { - managementSettings.add(serverSettings.get(key)); - } - if (allowManagement) { - managementSettings.pushScripts = serverSettings.pushScripts; - } - result = managementSettings; - } - } else if (RpcRequest.EDIT_SETTINGS.equals(reqType)) { - // update settings on the server - if (allowAdmin) { - Map 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 = gitblit.getStatus(); - } else { - response.sendError(notAllowedCode); - } - } else if (RpcRequest.CLEAR_REPOSITORY_CACHE.equals(reqType)) { - // clear the repository list cache - if (allowManagement) { - 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); - } - } + if (allowManagement) { + // keys necessary for repository and/or user management + keys.add(Keys.realm.minPasswordLength); + keys.add(Keys.realm.passwordStorage); + keys.add(Keys.federation.sets); + } + // build the settings + ServerSettings managementSettings = new ServerSettings(); + for (String key : keys) { + managementSettings.add(serverSettings.get(key)); + } + if (allowManagement) { + managementSettings.pushScripts = serverSettings.pushScripts; + } + result = managementSettings; + } + } else if (RpcRequest.EDIT_SETTINGS.equals(reqType)) { + // update settings on the server + if (allowAdmin) { + Map 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 = gitblit.getStatus(); + } else { + response.sendError(notAllowedCode); + } + } else if (RpcRequest.CLEAR_REPOSITORY_CACHE.equals(reqType)) { + // clear the repository list cache + if (allowManagement) { + 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); + } + } - // send the result of the request - serialize(response, result); - } + // send the result of the request + serialize(response, result); + } } diff --git a/src/main/java/com/gitblit/utils/RpcUtils.java b/src/main/java/com/gitblit/utils/RpcUtils.java index 5e577fb6..904461c8 100644 --- a/src/main/java/com/gitblit/utils/RpcUtils.java +++ b/src/main/java/com/gitblit/utils/RpcUtils.java @@ -25,16 +25,7 @@ import java.util.Map; import com.gitblit.Constants; import com.gitblit.Constants.RpcRequest; import com.gitblit.GitBlitException.UnknownRequestException; -import com.gitblit.models.FederationModel; -import com.gitblit.models.FederationProposal; -import com.gitblit.models.FederationSet; -import com.gitblit.models.FeedModel; -import com.gitblit.models.RegistrantAccessPermission; -import com.gitblit.models.RepositoryModel; -import com.gitblit.models.ServerSettings; -import com.gitblit.models.ServerStatus; -import com.gitblit.models.TeamModel; -import com.gitblit.models.UserModel; +import com.gitblit.models.*; import com.google.gson.reflect.TypeToken; /** @@ -203,7 +194,25 @@ public class RpcUtils { } - /** + /** + * Create a fork of an already existing repo + * + * @param repository + * @param user + + * @return true if the action succeeded + * @throws IOException + */ + public static boolean forkRpository(RepositoryModel repository, UserModel user, String serverUrl, + String account, char[] password) throws IOException { + UserRepositoryCompositeModel userRepositoryCompositeModel = new UserRepositoryCompositeModel(); + userRepositoryCompositeModel.setRepositoryModel(repository); + userRepositoryCompositeModel.setUserModel(user); + return doAction(RpcRequest.FORK_REPOSITORY, null, userRepositoryCompositeModel, serverUrl, account, password); + } + + + /** * Send a revised version of the repository model to the Gitblit server. * * @param repository diff --git a/src/test/config/test-users.conf b/src/test/config/test-users.conf index 1d01f846..4e00903b 100644 --- a/src/test/config/test-users.conf +++ b/src/test/config/test-users.conf @@ -6,7 +6,6 @@ role = "#notfederated" [user "sampleuser"] password = sampleuser - cookie = 6e07ed42149fc166206319faffdfba2e2ec82e43 accountType = LOCAL role = "#none" [team "admins"] diff --git a/src/test/java/com/gitblit/tests/RpcTests.java b/src/test/java/com/gitblit/tests/RpcTests.java index ced1a130..943153de 100644 --- a/src/test/java/com/gitblit/tests/RpcTests.java +++ b/src/test/java/com/gitblit/tests/RpcTests.java @@ -191,6 +191,12 @@ public class RpcTests extends GitblitUnitTest { assertEquals(AccessRestrictionType.VIEW, retrievedRepository.accessRestriction); assertEquals(AuthorizationControl.AUTHENTICATED, retrievedRepository.authorizationControl); + //fork repo + UserModel userModel = new UserModel("garbageUser"); + assertTrue("Failed to create Fork Repository!", + RpcUtils.forkRpository(model, userModel, url, account, password.toCharArray())); + + // rename and change access restriciton String originalName = model.name; model.name = "garbagerepo2.git"; diff --git a/src/test/java/com/gitblit/tests/Test.java b/src/test/java/com/gitblit/tests/Test.java new file mode 100644 index 00000000..275c6b4c --- /dev/null +++ b/src/test/java/com/gitblit/tests/Test.java @@ -0,0 +1,11 @@ +package com.gitblit.tests; + +/** + * Created with IntelliJ IDEA. + * User: manisha + * Date: 3/21/14 + * Time: 12:03 PM + * To change this template use File | Settings | File Templates. + */ +public @interface Test { +} -- cgit v1.2.3 From 813a1fab72a462bdd9387ac3f137055853a69710 Mon Sep 17 00:00:00 2001 From: James Moger Date: Thu, 8 May 2014 11:11:04 -0400 Subject: Revise, complete, and fully test the FORK rpc --- releases.moxie | 6 +- src/main/java/com/gitblit/Constants.java | 7 ++- .../models/UserRepositoryCompositeModel.java | 47 --------------- src/main/java/com/gitblit/servlet/RpcServlet.java | 50 ++++++++++------ src/main/java/com/gitblit/utils/RpcUtils.java | 21 ++++--- src/site/rpc.mkd | 8 ++- src/test/config/test-users.conf | 1 + src/test/java/com/gitblit/tests/RpcTests.java | 69 ++++++++++++++++++++-- src/test/java/com/gitblit/tests/Test.java | 11 ---- 9 files changed, 122 insertions(+), 98 deletions(-) delete mode 100644 src/main/java/com/gitblit/models/UserRepositoryCompositeModel.java delete mode 100644 src/test/java/com/gitblit/tests/Test.java (limited to 'src/test/java/com/gitblit') diff --git a/releases.moxie b/releases.moxie index aac46f0c..228fc7e6 100644 --- a/releases.moxie +++ b/releases.moxie @@ -11,9 +11,11 @@ r24: { security: ~ fixes: ~ changes: ~ - additions: ~ + additions: + - Add FORK_REPOSITORY RPC request type (issue-371, pr-161, ticket-65) dependencyChanges: ~ - contributors: ~ + contributors: + - Manisha Gayathri } # diff --git a/src/main/java/com/gitblit/Constants.java b/src/main/java/com/gitblit/Constants.java index cbbc0cac..c8ce83c1 100644 --- a/src/main/java/com/gitblit/Constants.java +++ b/src/main/java/com/gitblit/Constants.java @@ -350,10 +350,11 @@ public class Constants { * a client. */ public static enum RpcRequest { - // Order is important here. anything above LIST_SETTINGS requires + // Order is important here. anything after LIST_SETTINGS requires // administrator privileges and web.allowRpcManagement. - CLEAR_REPOSITORY_CACHE, REINDEX_TICKETS, GET_PROTOCOL, LIST_REPOSITORIES, LIST_BRANCHES, GET_USER, LIST_SETTINGS, - CREATE_REPOSITORY, FORK_REPOSITORY, EDIT_REPOSITORY, DELETE_REPOSITORY, + CLEAR_REPOSITORY_CACHE, REINDEX_TICKETS, GET_PROTOCOL, LIST_REPOSITORIES, LIST_BRANCHES, GET_USER, + FORK_REPOSITORY, LIST_SETTINGS, + CREATE_REPOSITORY, EDIT_REPOSITORY, DELETE_REPOSITORY, LIST_USERS, CREATE_USER, EDIT_USER, DELETE_USER, LIST_TEAMS, CREATE_TEAM, EDIT_TEAM, DELETE_TEAM, LIST_REPOSITORY_MEMBERS, SET_REPOSITORY_MEMBERS, LIST_REPOSITORY_TEAMS, SET_REPOSITORY_TEAMS, diff --git a/src/main/java/com/gitblit/models/UserRepositoryCompositeModel.java b/src/main/java/com/gitblit/models/UserRepositoryCompositeModel.java deleted file mode 100644 index 122bb3ba..00000000 --- a/src/main/java/com/gitblit/models/UserRepositoryCompositeModel.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.gitblit.models; - -/* - * Copyright 2011 gitblit.com. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -import com.gitblit.utils.StringUtils; - -import java.io.Serializable; - -public class UserRepositoryCompositeModel implements Serializable { - - private static final long serialVersionUID = 1L; - - public UserModel userModel; - public RepositoryModel repositoryModel; - - public UserModel getUserModel() { - return userModel; - } - - public void setUserModel(UserModel userModel) { - this.userModel = userModel; - } - - public RepositoryModel getRepositoryModel() { - return repositoryModel; - } - - public void setRepositoryModel(RepositoryModel repositoryModel) { - this.repositoryModel = repositoryModel; - } - -} \ No newline at end of file diff --git a/src/main/java/com/gitblit/servlet/RpcServlet.java b/src/main/java/com/gitblit/servlet/RpcServlet.java index 80c50714..b3016ad6 100644 --- a/src/main/java/com/gitblit/servlet/RpcServlet.java +++ b/src/main/java/com/gitblit/servlet/RpcServlet.java @@ -27,7 +27,6 @@ import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import com.gitblit.models.*; import org.eclipse.jgit.lib.Repository; import com.gitblit.Constants; @@ -36,6 +35,12 @@ import com.gitblit.GitBlitException; import com.gitblit.IStoredSettings; import com.gitblit.Keys; import com.gitblit.manager.IGitblit; +import com.gitblit.models.RefModel; +import com.gitblit.models.RegistrantAccessPermission; +import com.gitblit.models.RepositoryModel; +import com.gitblit.models.ServerSettings; +import com.gitblit.models.TeamModel; +import com.gitblit.models.UserModel; import com.gitblit.utils.DeepCopier; import com.gitblit.utils.HttpUtils; import com.gitblit.utils.JGitUtils; @@ -53,7 +58,7 @@ public class RpcServlet extends JsonServlet { private static final long serialVersionUID = 1L; - public static final int PROTOCOL_VERSION = 7; + public static final int PROTOCOL_VERSION = 8; private IStoredSettings settings; @@ -191,22 +196,31 @@ public class RpcServlet extends JsonServlet { response.setStatus(failureCode); } } else if (RpcRequest.FORK_REPOSITORY.equals(reqType)) { - // fork repository - UserRepositoryCompositeModel userRepositoryCompositeModel = deserialize(request, response, - UserRepositoryCompositeModel.class); - RepositoryModel repoModel = userRepositoryCompositeModel.getRepositoryModel(); - UserModel userModel = userRepositoryCompositeModel.getUserModel(); - try { - if (repoModel != null && userModel != null) { - gitblit.fork(repoModel, userModel); - } else { - System.out.println("Non existing user model or repo model"); - response.setStatus(failureCode); - } - - } catch (GitBlitException e) { - response.setStatus(failureCode); - } + // 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); diff --git a/src/main/java/com/gitblit/utils/RpcUtils.java b/src/main/java/com/gitblit/utils/RpcUtils.java index 904461c8..82202154 100644 --- a/src/main/java/com/gitblit/utils/RpcUtils.java +++ b/src/main/java/com/gitblit/utils/RpcUtils.java @@ -25,7 +25,16 @@ import java.util.Map; import com.gitblit.Constants; import com.gitblit.Constants.RpcRequest; import com.gitblit.GitBlitException.UnknownRequestException; -import com.gitblit.models.*; +import com.gitblit.models.FederationModel; +import com.gitblit.models.FederationProposal; +import com.gitblit.models.FederationSet; +import com.gitblit.models.FeedModel; +import com.gitblit.models.RegistrantAccessPermission; +import com.gitblit.models.RepositoryModel; +import com.gitblit.models.ServerSettings; +import com.gitblit.models.ServerStatus; +import com.gitblit.models.TeamModel; +import com.gitblit.models.UserModel; import com.google.gson.reflect.TypeToken; /** @@ -195,20 +204,16 @@ public class RpcUtils { } /** - * Create a fork of an already existing repo + * Create a fork of a repository. * * @param repository - * @param user * @return true if the action succeeded * @throws IOException */ - public static boolean forkRpository(RepositoryModel repository, UserModel user, String serverUrl, + public static boolean forkRepository(RepositoryModel repository, String serverUrl, String account, char[] password) throws IOException { - UserRepositoryCompositeModel userRepositoryCompositeModel = new UserRepositoryCompositeModel(); - userRepositoryCompositeModel.setRepositoryModel(repository); - userRepositoryCompositeModel.setUserModel(user); - return doAction(RpcRequest.FORK_REPOSITORY, null, userRepositoryCompositeModel, serverUrl, account, password); + return doAction(RpcRequest.FORK_REPOSITORY, repository.name, null, serverUrl, account, password); } diff --git a/src/site/rpc.mkd b/src/site/rpc.mkd index b86fd9ad..2e502e2c 100644 --- a/src/site/rpc.mkd +++ b/src/site/rpc.mkd @@ -57,9 +57,10 @@ The Gitblit API includes methods for retrieving and interpreting RSS feeds. The Gitblit v0.8.02 Gitblit v0.9.0 - v1.0.03 Gitblit v1.1.04 -Gitblit v1.2.0+5 -Gitblit v1.3.1+6 -Gitblit v1.4.0+7 +Gitblit v1.2.05 +Gitblit v1.3.16 +Gitblit v1.4.07 +Gitblit v1.6.08 @@ -81,6 +82,7 @@ Use *SET_REPOSITORY_TEAM_PERMISSIONS* instead. LIST_BRANCHES--1-Map<String, List<String>> LIST_SETTINGS--1-ServerSettings (basic keys) GET_USERuser name-6-UserModel +FORK_REPOSITORYrepository name-8-- web.enableRpcManagement=true CREATE_REPOSITORYrepository nameadmin1RepositoryModel- EDIT_REPOSITORYrepository nameadmin1RepositoryModel- diff --git a/src/test/config/test-users.conf b/src/test/config/test-users.conf index 4e00903b..1d01f846 100644 --- a/src/test/config/test-users.conf +++ b/src/test/config/test-users.conf @@ -6,6 +6,7 @@ role = "#notfederated" [user "sampleuser"] password = sampleuser + cookie = 6e07ed42149fc166206319faffdfba2e2ec82e43 accountType = LOCAL role = "#none" [team "admins"] diff --git a/src/test/java/com/gitblit/tests/RpcTests.java b/src/test/java/com/gitblit/tests/RpcTests.java index 943153de..51b4671b 100644 --- a/src/test/java/com/gitblit/tests/RpcTests.java +++ b/src/test/java/com/gitblit/tests/RpcTests.java @@ -191,12 +191,6 @@ public class RpcTests extends GitblitUnitTest { assertEquals(AccessRestrictionType.VIEW, retrievedRepository.accessRestriction); assertEquals(AuthorizationControl.AUTHENTICATED, retrievedRepository.authorizationControl); - //fork repo - UserModel userModel = new UserModel("garbageUser"); - assertTrue("Failed to create Fork Repository!", - RpcUtils.forkRpository(model, userModel, url, account, password.toCharArray())); - - // rename and change access restriciton String originalName = model.name; model.name = "garbagerepo2.git"; @@ -403,4 +397,67 @@ public class RpcTests extends GitblitUnitTest { assertNotNull(branches); assertTrue(branches.size() > 0); } + + @Test + public void testFork() throws Exception { + // test forking by an administrator + // admins are all-powerful and can fork the unforakable :) + testFork(account, password, true, true); + testFork(account, password, false, true); + + // test forking by a permitted normal user + UserModel forkUser = new UserModel("forkuser"); + forkUser.password = forkUser.username; + forkUser.canFork = true; + RpcUtils.deleteUser(forkUser, url, account, password.toCharArray()); + RpcUtils.createUser(forkUser, url, account, password.toCharArray()); + testFork(forkUser.username, forkUser.password, true, true); + testFork(forkUser.username, forkUser.password, false, false); + RpcUtils.deleteUser(forkUser, url, account, password.toCharArray()); + + // test forking by a non-permitted normal user + UserModel noForkUser = new UserModel("noforkuser"); + noForkUser.password = noForkUser.username; + noForkUser.canFork = false; + RpcUtils.deleteUser(noForkUser, url, account, password.toCharArray()); + RpcUtils.createUser(noForkUser, url, account, password.toCharArray()); + testFork(forkUser.username, forkUser.password, true, false); + testFork(forkUser.username, forkUser.password, false, false); + RpcUtils.deleteUser(noForkUser, url, account, password.toCharArray()); + } + + private void testFork(String forkAcct, String forkAcctPassword, boolean allowForks, boolean expectSuccess) throws Exception { + // test does not exist + RepositoryModel dne = new RepositoryModel(); + dne.name = "doesNotExist.git"; + assertFalse(String.format("Successfully forked %s!", dne.name), + RpcUtils.forkRepository(dne, url, forkAcct, forkAcctPassword.toCharArray())); + + // delete any previous fork + RepositoryModel fork = findRepository(String.format("~%s/helloworld.git", forkAcct)); + if (fork != null) { + RpcUtils.deleteRepository(fork, url, account, password.toCharArray()); + } + + // update the origin to allow forks or not + RepositoryModel origin = findRepository("helloworld.git"); + origin.allowForks = allowForks; + RpcUtils.updateRepository(origin.name, origin, url, account, password.toCharArray()); + + // fork the repository + if (expectSuccess) { + assertTrue(String.format("Failed to fork %s!", origin.name), + RpcUtils.forkRepository(origin, url, forkAcct, forkAcctPassword.toCharArray())); + } else { + assertFalse(String.format("Successfully forked %s!", origin.name), + RpcUtils.forkRepository(origin, url, forkAcct, forkAcctPassword.toCharArray())); + } + + // attempt another fork + assertFalse(String.format("Successfully forked %s!", origin.name), + RpcUtils.forkRepository(origin, url, forkAcct, forkAcctPassword.toCharArray())); + + // delete the fork repository + RpcUtils.deleteRepository(fork, url, account, password.toCharArray()); + } } diff --git a/src/test/java/com/gitblit/tests/Test.java b/src/test/java/com/gitblit/tests/Test.java deleted file mode 100644 index 275c6b4c..00000000 --- a/src/test/java/com/gitblit/tests/Test.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.gitblit.tests; - -/** - * Created with IntelliJ IDEA. - * User: manisha - * Date: 3/21/14 - * Time: 12:03 PM - * To change this template use File | Settings | File Templates. - */ -public @interface Test { -} -- cgit v1.2.3 From 9ff0c16b05cb0eb7c3cc63eda763b0f75d84853c Mon Sep 17 00:00:00 2001 From: James Moger Date: Thu, 8 May 2014 13:09:08 -0400 Subject: Change enum name and unit test RSS tag queries --- releases.moxie | 2 + src/main/java/com/gitblit/Constants.java | 6 +-- .../com/gitblit/servlet/SyndicationServlet.java | 6 +-- .../java/com/gitblit/utils/SyndicationUtils.java | 57 ++++++++++++++++++++++ src/site/rpc.mkd | 1 + .../com/gitblit/tests/SyndicationUtilsTest.java | 36 +++++++++++++- 6 files changed, 101 insertions(+), 7 deletions(-) (limited to 'src/test/java/com/gitblit') diff --git a/releases.moxie b/releases.moxie index 228fc7e6..96a0ae91 100644 --- a/releases.moxie +++ b/releases.moxie @@ -13,9 +13,11 @@ r24: { changes: ~ additions: - Add FORK_REPOSITORY RPC request type (issue-371, pr-161, ticket-65) + - Add object type (ot) parameter for RSS queries to retrieve tag details (pr-165, ticket-66) dependencyChanges: ~ contributors: - Manisha Gayathri + - Gerard Smyth } # diff --git a/src/main/java/com/gitblit/Constants.java b/src/main/java/com/gitblit/Constants.java index 2007c0a8..95eb944a 100644 --- a/src/main/java/com/gitblit/Constants.java +++ b/src/main/java/com/gitblit/Constants.java @@ -405,11 +405,11 @@ public class Constants { /** * Enumeration of the feed content object types. */ - public static enum FeedContentObjectType { + public static enum FeedObjectType { COMMIT, TAG; - public static FeedContentObjectType forName(String name) { - for (FeedContentObjectType type : values()) { + public static FeedObjectType forName(String name) { + for (FeedObjectType type : values()) { if (type.name().equalsIgnoreCase(name)) { return type; } diff --git a/src/main/java/com/gitblit/servlet/SyndicationServlet.java b/src/main/java/com/gitblit/servlet/SyndicationServlet.java index 9650ee3a..631df781 100644 --- a/src/main/java/com/gitblit/servlet/SyndicationServlet.java +++ b/src/main/java/com/gitblit/servlet/SyndicationServlet.java @@ -164,9 +164,9 @@ public class SyndicationServlet extends DaggerServlet { } } - Constants.FeedContentObjectType objectType = Constants.FeedContentObjectType.COMMIT; + Constants.FeedObjectType objectType = Constants.FeedObjectType.COMMIT; if (!StringUtils.isEmpty(request.getParameter("ot"))) { - Constants.FeedContentObjectType type = Constants.FeedContentObjectType.forName(request.getParameter("ot")); + Constants.FeedObjectType type = Constants.FeedObjectType.forName(request.getParameter("ot")); if (type != null) { objectType = type; } @@ -249,7 +249,7 @@ public class SyndicationServlet extends DaggerServlet { feedDescription = model.description; } - if (objectType == Constants.FeedContentObjectType.TAG) { + if (objectType == Constants.FeedObjectType.TAG) { String urlPattern; if (mountParameters) { diff --git a/src/main/java/com/gitblit/utils/SyndicationUtils.java b/src/main/java/com/gitblit/utils/SyndicationUtils.java index 2ee1cf69..93e9321a 100644 --- a/src/main/java/com/gitblit/utils/SyndicationUtils.java +++ b/src/main/java/com/gitblit/utils/SyndicationUtils.java @@ -25,6 +25,7 @@ import java.util.ArrayList; import java.util.List; import com.gitblit.Constants; +import com.gitblit.Constants.FeedObjectType; import com.gitblit.GitBlitException; import com.gitblit.models.FeedEntryModel; import com.sun.syndication.feed.synd.SyndCategory; @@ -137,6 +138,59 @@ public class SyndicationUtils { */ public static List readFeed(String url, String repository, String branch, int numberOfEntries, int page, String username, char[] password) throws IOException { + return readFeed(url, repository, branch, FeedObjectType.COMMIT, numberOfEntries, + page, username, password); + } + + /** + * Reads tags from the specified repository. + * + * @param url + * the url of the Gitblit server + * @param repository + * the repository name + * @param branch + * the branch name (optional) + * @param numberOfEntries + * the number of entries to retrieve. if <= 0 the server default + * is used. + * @param page + * 0-indexed. used to paginate the results. + * @param username + * @param password + * @return a list of SyndicationModel entries + * @throws {@link IOException} + */ + public static List readTags(String url, String repository, + int numberOfEntries, int page, String username, char[] password) throws IOException { + return readFeed(url, repository, null, FeedObjectType.TAG, numberOfEntries, + page, username, password); + } + + /** + * Reads a Gitblit RSS feed. + * + * @param url + * the url of the Gitblit server + * @param repository + * the repository name + * @param branch + * the branch name (optional) + * @param objectType + * the object type to return (optional, COMMIT assummed) + * @param numberOfEntries + * the number of entries to retrieve. if <= 0 the server default + * is used. + * @param page + * 0-indexed. used to paginate the results. + * @param username + * @param password + * @return a list of SyndicationModel entries + * @throws {@link IOException} + */ + private static List readFeed(String url, String repository, String branch, + FeedObjectType objectType, int numberOfEntries, int page, String username, + char[] password) throws IOException { // build feed url List parameters = new ArrayList(); if (numberOfEntries > 0) { @@ -148,6 +202,9 @@ public class SyndicationUtils { if (!StringUtils.isEmpty(branch)) { parameters.add("h=" + branch); } + if (objectType != null) { + parameters.add("ot=" + objectType.name()); + } return readFeed(url, parameters, repository, branch, username, password); } diff --git a/src/site/rpc.mkd b/src/site/rpc.mkd index 2e502e2c..302084fb 100644 --- a/src/site/rpc.mkd +++ b/src/site/rpc.mkd @@ -32,6 +32,7 @@ The Gitblit API includes methods for retrieving and interpreting RSS feeds. The url parameterdefaultdescription standard query repositoryrequiredrepository name is part of the url (see examples below) +ot=optional
default: COMMITobject type to return in results. COMMIT or TAG h=optional
default: HEADstarting branch, ref, or commit id l=optional
default: web.syndicationEntriesmaximum return count pg=optional
default: 0page number for paging
(offset into history = pagenumber*maximum return count) diff --git a/src/test/java/com/gitblit/tests/SyndicationUtilsTest.java b/src/test/java/com/gitblit/tests/SyndicationUtilsTest.java index d206bbdb..b4bb044f 100644 --- a/src/test/java/com/gitblit/tests/SyndicationUtilsTest.java +++ b/src/test/java/com/gitblit/tests/SyndicationUtilsTest.java @@ -21,7 +21,10 @@ import java.util.Date; import java.util.HashSet; import java.util.List; import java.util.Set; +import java.util.concurrent.atomic.AtomicBoolean; +import org.junit.AfterClass; +import org.junit.BeforeClass; import org.junit.Test; import com.gitblit.Constants.SearchType; @@ -30,6 +33,20 @@ import com.gitblit.utils.SyndicationUtils; public class SyndicationUtilsTest extends GitblitUnitTest { + private static final AtomicBoolean started = new AtomicBoolean(false); + + @BeforeClass + public static void startGitblit() throws Exception { + started.set(GitBlitSuite.startGitblit()); + } + + @AfterClass + public static void stopGitblit() throws Exception { + if (started.get()) { + GitBlitSuite.stopGitblit(); + } + } + @Test public void testSyndication() throws Exception { List entries = new ArrayList(); @@ -60,7 +77,7 @@ public class SyndicationUtilsTest extends GitblitUnitTest { } @Test - public void testFeedRead() throws Exception { + public void testFeedReadCommits() throws Exception { Set links = new HashSet(); for (int i = 0; i < 2; i++) { List feed = SyndicationUtils.readFeed(GitBlitSuite.url, "ticgit.git", @@ -76,6 +93,23 @@ public class SyndicationUtilsTest extends GitblitUnitTest { assertEquals("Feed pagination failed", 10, links.size()); } + @Test + public void testFeedReadTags() throws Exception { + Set links = new HashSet(); + for (int i = 0; i < 2; i++) { + List feed = SyndicationUtils.readTags(GitBlitSuite.url, "test/gitective.git", + 5, i, GitBlitSuite.account, GitBlitSuite.password.toCharArray()); + assertTrue(feed != null); + assertTrue(feed.size() > 0); + assertEquals(5, feed.size()); + for (FeedEntryModel entry : feed) { + links.add(entry.link); + } + } + // confirm we have 10 unique tags + assertEquals("Feed pagination failed", 10, links.size()); + } + @Test public void testSearchFeedRead() throws Exception { List feed = SyndicationUtils -- cgit v1.2.3 From 05f229883c4e15e044c5c103acf69265cfb8806e Mon Sep 17 00:00:00 2001 From: James Moger Date: Thu, 5 Jun 2014 08:38:35 -0400 Subject: Add a basic SSH public key management UI --- src/main/java/com/gitblit/GitBlit.java | 15 ++ .../java/com/gitblit/manager/GitblitManager.java | 15 ++ .../java/com/gitblit/manager/IRuntimeManager.java | 27 ++++ .../java/com/gitblit/manager/RuntimeManager.java | 39 ++++- .../java/com/gitblit/manager/ServicesManager.java | 18 ++- .../com/gitblit/wicket/GitBlitWebApp.properties | 10 +- .../java/com/gitblit/wicket/pages/UserPage.html | 14 ++ .../java/com/gitblit/wicket/pages/UserPage.java | 22 +++ .../com/gitblit/wicket/panels/SshKeysPanel.html | 46 ++++++ .../com/gitblit/wicket/panels/SshKeysPanel.java | 161 +++++++++++++++++++++ .../com/gitblit/wicket/panels/TextAreaOption.html | 20 +++ .../com/gitblit/wicket/panels/TextAreaOption.java | 54 +++++++ .../com/gitblit/tests/mock/MockRuntimeManager.java | 15 ++ 13 files changed, 449 insertions(+), 7 deletions(-) create mode 100644 src/main/java/com/gitblit/wicket/panels/SshKeysPanel.html create mode 100644 src/main/java/com/gitblit/wicket/panels/SshKeysPanel.java create mode 100644 src/main/java/com/gitblit/wicket/panels/TextAreaOption.html create mode 100644 src/main/java/com/gitblit/wicket/panels/TextAreaOption.java (limited to 'src/test/java/com/gitblit') diff --git a/src/main/java/com/gitblit/GitBlit.java b/src/main/java/com/gitblit/GitBlit.java index 3db5f087..81793850 100644 --- a/src/main/java/com/gitblit/GitBlit.java +++ b/src/main/java/com/gitblit/GitBlit.java @@ -117,6 +117,21 @@ public class GitBlit extends GitblitManager { return servicesManager.isServingRepositories(); } + @Override + public boolean isServingHTTP() { + return servicesManager.isServingHTTP(); + } + + @Override + public boolean isServingGIT() { + return servicesManager.isServingGIT(); + } + + @Override + public boolean isServingSSH() { + return servicesManager.isServingSSH(); + } + protected Object [] getModules() { return new Object [] { new GitBlitModule()}; } diff --git a/src/main/java/com/gitblit/manager/GitblitManager.java b/src/main/java/com/gitblit/manager/GitblitManager.java index 16c71ba6..ef2433dd 100644 --- a/src/main/java/com/gitblit/manager/GitblitManager.java +++ b/src/main/java/com/gitblit/manager/GitblitManager.java @@ -601,6 +601,21 @@ public class GitblitManager implements IGitblit { return runtimeManager.isServingRepositories(); } + @Override + public boolean isServingHTTP() { + return runtimeManager.isServingHTTP(); + } + + @Override + public boolean isServingGIT() { + return runtimeManager.isServingGIT(); + } + + @Override + public boolean isServingSSH() { + return runtimeManager.isServingSSH(); + } + @Override public TimeZone getTimezone() { return runtimeManager.getTimezone(); diff --git a/src/main/java/com/gitblit/manager/IRuntimeManager.java b/src/main/java/com/gitblit/manager/IRuntimeManager.java index 29e7368f..b2d7a2b3 100644 --- a/src/main/java/com/gitblit/manager/IRuntimeManager.java +++ b/src/main/java/com/gitblit/manager/IRuntimeManager.java @@ -56,6 +56,33 @@ public interface IRuntimeManager extends IManager { */ boolean isServingRepositories(); + /** + * Determine if this Gitblit instance is actively serving git repositories + * over HTTP. + * + * @return true if Gitblit is serving repositories over HTTP + * @since 1.6.0 + */ + boolean isServingHTTP(); + + /** + * Determine if this Gitblit instance is actively serving git repositories + * over the GIT Daemon protocol. + * + * @return true if Gitblit is serving repositories over the GIT Daemon protocol + * @since 1.6.0 + */ + boolean isServingGIT(); + + /** + * Determine if this Gitblit instance is actively serving git repositories + * over the SSH protocol. + * + * @return true if Gitblit is serving repositories over the SSH protocol + * @since 1.6.0 + */ + boolean isServingSSH(); + /** * Determine if this Gitblit instance is running in debug mode * diff --git a/src/main/java/com/gitblit/manager/RuntimeManager.java b/src/main/java/com/gitblit/manager/RuntimeManager.java index 52f4d67b..9cdc64eb 100644 --- a/src/main/java/com/gitblit/manager/RuntimeManager.java +++ b/src/main/java/com/gitblit/manager/RuntimeManager.java @@ -119,9 +119,42 @@ public class RuntimeManager implements IRuntimeManager { */ @Override public boolean isServingRepositories() { - return settings.getBoolean(Keys.git.enableGitServlet, true) - || (settings.getInteger(Keys.git.daemonPort, 0) > 0) - || (settings.getInteger(Keys.git.sshPort, 0) > 0); + return isServingHTTP() + || isServingGIT() + || isServingSSH(); + } + + /** + * Determine if this Gitblit instance is actively serving git repositories + * over the HTTP protocol. + * + * @return true if Gitblit is serving repositories over the HTTP protocol + */ + @Override + public boolean isServingHTTP() { + return settings.getBoolean(Keys.git.enableGitServlet, true); + } + + /** + * Determine if this Gitblit instance is actively serving git repositories + * over the Git Daemon protocol. + * + * @return true if Gitblit is serving repositories over the Git Daemon protocol + */ + @Override + public boolean isServingGIT() { + return settings.getInteger(Keys.git.daemonPort, 0) > 0; + } + + /** + * Determine if this Gitblit instance is actively serving git repositories + * over the SSH protocol. + * + * @return true if Gitblit is serving repositories over the SSH protocol + */ + @Override + public boolean isServingSSH() { + return settings.getInteger(Keys.git.sshPort, 0) > 0; } /** diff --git a/src/main/java/com/gitblit/manager/ServicesManager.java b/src/main/java/com/gitblit/manager/ServicesManager.java index 755d8bac..37215786 100644 --- a/src/main/java/com/gitblit/manager/ServicesManager.java +++ b/src/main/java/com/gitblit/manager/ServicesManager.java @@ -112,9 +112,21 @@ public class ServicesManager implements IManager { } public boolean isServingRepositories() { - return settings.getBoolean(Keys.git.enableGitServlet, true) - || (gitDaemon != null && gitDaemon.isRunning()) - || (sshDaemon != null && sshDaemon.isRunning()); + return isServingHTTP() + || isServingGIT() + || isServingSSH(); + } + + public boolean isServingHTTP() { + return settings.getBoolean(Keys.git.enableGitServlet, true); + } + + public boolean isServingGIT() { + return gitDaemon != null && gitDaemon.isRunning(); + } + + public boolean isServingSSH() { + return sshDaemon != null && sshDaemon.isRunning(); } protected void configureFederation() { diff --git a/src/main/java/com/gitblit/wicket/GitBlitWebApp.properties b/src/main/java/com/gitblit/wicket/GitBlitWebApp.properties index 81171799..7dc0f9b6 100644 --- a/src/main/java/com/gitblit/wicket/GitBlitWebApp.properties +++ b/src/main/java/com/gitblit/wicket/GitBlitWebApp.properties @@ -729,4 +729,12 @@ gb.accountPreferencesDescription = Specify your account preferences gb.languagePreference = Language Preference gb.languagePreferenceDescription = Select your preferred translation for the Gitblit UI gb.displayNameDescription = The preferred name for display -gb.emailAddressDescription = The primary email address for receiving notifications \ No newline at end of file +gb.emailAddressDescription = The primary email address for receiving notifications +gb.sshKeys = SSH Keys +gb.sshKeysDescription = SSH public key authentication is a secure alternative to password authentication +gb.addSshKey = Add SSH Key +gb.key = Key +gb.comment = Comment +gb.sshKeyCommentDescription = Enter an optional comment. If blank, the comment will be extracted from the key data. +gb.permission = Permission +gb.sshKeyPermissionDescription = Specify the access permission for the SSH key \ No newline at end of file diff --git a/src/main/java/com/gitblit/wicket/pages/UserPage.html b/src/main/java/com/gitblit/wicket/pages/UserPage.html index 09267873..d71cb2b5 100644 --- a/src/main/java/com/gitblit/wicket/pages/UserPage.html +++ b/src/main/java/com/gitblit/wicket/pages/UserPage.html @@ -20,6 +20,7 @@ @@ -37,6 +38,9 @@
+ +
+ @@ -47,6 +51,10 @@
  • + +
  • +
    +

    @@ -63,6 +71,12 @@
    + +
    +
    +
    +
    + \ No newline at end of file diff --git a/src/main/java/com/gitblit/wicket/pages/UserPage.java b/src/main/java/com/gitblit/wicket/pages/UserPage.java index baad4a06..4a955c7c 100644 --- a/src/main/java/com/gitblit/wicket/pages/UserPage.java +++ b/src/main/java/com/gitblit/wicket/pages/UserPage.java @@ -50,6 +50,7 @@ import com.gitblit.wicket.GitblitRedirectException; import com.gitblit.wicket.WicketUtils; import com.gitblit.wicket.panels.ChoiceOption; import com.gitblit.wicket.panels.ProjectRepositoryPanel; +import com.gitblit.wicket.panels.SshKeysPanel; import com.gitblit.wicket.panels.TextOption; import com.gitblit.wicket.panels.UserTitlePanel; @@ -100,10 +101,22 @@ public class UserPage extends RootPage { if (isMyProfile) { addPreferences(user); + + if (app().gitblit().isServingSSH()) { + // show the SSH key management tab + addSshKeys(user); + } else { + // SSH daemon is disabled, hide keys tab + add(new Label("sshKeysLink").setVisible(false)); + add(new Label("sshKeysTab").setVisible(false)); + } } else { // visiting user add(new Label("preferencesLink").setVisible(false)); add(new Label("preferencesTab").setVisible(false)); + + add(new Label("sshKeysLink").setVisible(false)); + add(new Label("sshKeysTab").setVisible(false)); } List repositories = getRepositories(params); @@ -251,6 +264,15 @@ public class UserPage extends RootPage { add(fragment.setRenderBodyOnly(true)); } + private void addSshKeys(final UserModel user) { + Fragment keysTab = new Fragment("sshKeysTab", "sshKeysTabFragment", this); + keysTab.add(new SshKeysPanel("sshKeysPanel", user, getClass(), getPageParameters())); + + // add the SSH keys tab + add(new Fragment("sshKeysLink", "sshKeysLinkFragment", this).setRenderBodyOnly(true)); + add(keysTab.setRenderBodyOnly(true)); + } + private class Language implements Serializable { private static final long serialVersionUID = 1L; diff --git a/src/main/java/com/gitblit/wicket/panels/SshKeysPanel.html b/src/main/java/com/gitblit/wicket/panels/SshKeysPanel.html new file mode 100644 index 00000000..d67b704a --- /dev/null +++ b/src/main/java/com/gitblit/wicket/panels/SshKeysPanel.html @@ -0,0 +1,46 @@ + + + + + +

    +

    +
    + +
    +
    + +
    +
    +
    +
    
    +		
    + +
    +
    +
    +
    + +
    + +
    + +
    +
    + +
    +
    +

    +
    +
    +
    + +
    +
    +
    +
    + + \ No newline at end of file diff --git a/src/main/java/com/gitblit/wicket/panels/SshKeysPanel.java b/src/main/java/com/gitblit/wicket/panels/SshKeysPanel.java new file mode 100644 index 00000000..03cb93ca --- /dev/null +++ b/src/main/java/com/gitblit/wicket/panels/SshKeysPanel.java @@ -0,0 +1,161 @@ +/* + * Copyright 2014 gitblit.com. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.gitblit.wicket.panels; + +import java.util.Arrays; +import java.util.List; + +import org.apache.wicket.PageParameters; +import org.apache.wicket.ajax.AjaxRequestTarget; +import org.apache.wicket.ajax.markup.html.form.AjaxButton; +import org.apache.wicket.markup.html.WebPage; +import org.apache.wicket.markup.html.basic.Label; +import org.apache.wicket.markup.html.form.Form; +import org.apache.wicket.markup.html.link.Link; +import org.apache.wicket.markup.repeater.Item; +import org.apache.wicket.markup.repeater.data.DataView; +import org.apache.wicket.markup.repeater.data.ListDataProvider; +import org.apache.wicket.model.IModel; +import org.apache.wicket.model.Model; + +import com.gitblit.Constants.AccessPermission; +import com.gitblit.models.UserModel; +import com.gitblit.transport.ssh.SshKey; +import com.gitblit.utils.StringUtils; +import com.gitblit.wicket.GitBlitWebSession; + + +/** + * A panel that enumerates and manages SSH public keys. + * + * @author James Moger + * + */ +public class SshKeysPanel extends BasePanel { + + private static final long serialVersionUID = 1L; + + private final UserModel user; + + private final Class pageClass; + + private final PageParameters params; + + public SshKeysPanel(String wicketId, UserModel user, Class pageClass, PageParameters params) { + super(wicketId); + + this.user = user; + this.pageClass = pageClass; + this.params = params; + } + + @Override + protected void onInitialize() { + super.onInitialize(); + List keys = app().keys().getKeys(user.username); + + final ListDataProvider dp = new ListDataProvider(keys); + DataView keysView = new DataView("keys", dp) { + private static final long serialVersionUID = 1L; + + @Override + public void populateItem(final Item item) { + final SshKey key = item.getModelObject(); + item.add(new Label("comment", key.getComment())); + item.add(new Label("fingerprint", key.getFingerprint())); + item.add(new Label("permission", key.getPermission().toString())); + item.add(new Label("algorithm", key.getAlgorithm())); + + Link delete = new Link("delete") { + + private static final long serialVersionUID = 1L; + + @Override + public void onClick() { + if (app().keys().removeKey(user.username, key)) { + setRedirect(true); + setResponsePage(pageClass, params); + } + } + }; + item.add(delete); + } + }; + add(keysView); + + Form addKeyForm = new Form("addKeyForm"); + + final IModel keyData = Model.of(""); + addKeyForm.add(new TextAreaOption("addKeyData", + getString("gb.key"), + null, + "span5", + keyData)); + + final IModel keyPermission = Model.of(AccessPermission.PUSH); + addKeyForm.add(new ChoiceOption("addKeyPermission", + getString("gb.permission"), + getString("gb.sshKeyPermissionDescription"), + keyPermission, + Arrays.asList(AccessPermission.SSHPERMISSIONS))); + + final IModel keyComment = Model.of(""); + addKeyForm.add(new TextOption("addKeyComment", + getString("gb.comment"), + getString("gb.sshKeyCommentDescription"), + "span5", + keyComment)); + + addKeyForm.add(new AjaxButton("addKeyButton") { + + private static final long serialVersionUID = 1L; + + @Override + protected void onSubmit(AjaxRequestTarget target, Form form) { + + UserModel user = GitBlitWebSession.get().getUser(); + String data = keyData.getObject(); + if (StringUtils.isEmpty(data)) { + // do not submit empty key + return; + } + + SshKey key = new SshKey(data); + try { + key.getPublicKey(); + } catch (Exception e) { + // failed to parse the key + return; + } + + AccessPermission permission = keyPermission.getObject(); + key.setPermission(permission); + + String comment = keyComment.getObject(); + if (!StringUtils.isEmpty(comment)) { + key.setComment(comment); + } + + if (app().keys().addKey(user.username, key)) { + setRedirect(true); + setResponsePage(pageClass, params); + } + } + }); + + add(addKeyForm); + } +} diff --git a/src/main/java/com/gitblit/wicket/panels/TextAreaOption.html b/src/main/java/com/gitblit/wicket/panels/TextAreaOption.html new file mode 100644 index 00000000..bb7dc7c6 --- /dev/null +++ b/src/main/java/com/gitblit/wicket/panels/TextAreaOption.html @@ -0,0 +1,20 @@ + + + + + +
    +
    + +
    + + +
    +
    + + \ No newline at end of file diff --git a/src/main/java/com/gitblit/wicket/panels/TextAreaOption.java b/src/main/java/com/gitblit/wicket/panels/TextAreaOption.java new file mode 100644 index 00000000..d2c74a06 --- /dev/null +++ b/src/main/java/com/gitblit/wicket/panels/TextAreaOption.java @@ -0,0 +1,54 @@ +/* + * Copyright 2014 gitblit.com. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.gitblit.wicket.panels; + +import org.apache.wicket.markup.html.basic.Label; +import org.apache.wicket.markup.html.form.TextArea; +import org.apache.wicket.model.IModel; + +import com.gitblit.utils.StringUtils; +import com.gitblit.wicket.WicketUtils; + +/** + * A re-usable textarea option panel. + * + * title + * description + * [text + * area] + * + * @author James Moger + * + */ +public class TextAreaOption extends BasePanel { + + private static final long serialVersionUID = 1L; + + public TextAreaOption(String wicketId, String title, String description, IModel model) { + this(wicketId, title, description, null, model); + } + + public TextAreaOption(String wicketId, String title, String description, String css, IModel model) { + super(wicketId); + add(new Label("name", title)); + add(new Label("description", description).setVisible(!StringUtils.isEmpty(description))); + TextArea tf = new TextArea("text", model); + if (!StringUtils.isEmpty(css)) { + WicketUtils.setCssClass(tf, css); + } + add(tf); + } +} diff --git a/src/test/java/com/gitblit/tests/mock/MockRuntimeManager.java b/src/test/java/com/gitblit/tests/mock/MockRuntimeManager.java index 6e56a873..54be539f 100644 --- a/src/test/java/com/gitblit/tests/mock/MockRuntimeManager.java +++ b/src/test/java/com/gitblit/tests/mock/MockRuntimeManager.java @@ -81,6 +81,21 @@ public class MockRuntimeManager implements IRuntimeManager { return true; } + @Override + public boolean isServingHTTP() { + return true; + } + + @Override + public boolean isServingGIT() { + return true; + } + + @Override + public boolean isServingSSH() { + return true; + } + @Override public boolean isDebugMode() { return true; -- cgit v1.2.3 From ca4d98678c20e4033fdaca09ecbbf0f5952e0b84 Mon Sep 17 00:00:00 2001 From: James Moger Date: Mon, 9 Jun 2014 14:10:51 -0400 Subject: Add repository and user/team lifecycle listener extension points --- src/main/java/com/gitblit/DaggerModule.java | 9 +- src/main/java/com/gitblit/FederationClient.java | 4 +- src/main/java/com/gitblit/MigrateTickets.java | 2 +- src/main/java/com/gitblit/ReindexTickets.java | 2 +- .../extensions/RepositoryLifeCycleListener.java | 45 ++++++++ .../extensions/UserTeamLifeCycleListener.java | 62 +++++++++++ .../com/gitblit/manager/RepositoryManager.java | 25 +++++ src/main/java/com/gitblit/manager/UserManager.java | 124 +++++++++++++++++++-- .../java/com/gitblit/servlet/GitblitContext.java | 10 +- src/site/plugins_extensions.mkd | 75 ++++++++++++- src/test/config/test-users.conf | 6 +- .../gitblit/tests/AuthenticationManagerTest.java | 2 +- .../com/gitblit/tests/BranchTicketServiceTest.java | 4 +- .../com/gitblit/tests/FileTicketServiceTest.java | 4 +- .../gitblit/tests/HtpasswdAuthenticationTest.java | 8 +- .../com/gitblit/tests/LdapAuthenticationTest.java | 10 +- .../java/com/gitblit/tests/LuceneExecutorTest.java | 4 +- .../com/gitblit/tests/RedisTicketServiceTest.java | 4 +- .../gitblit/tests/RedmineAuthenticationTest.java | 6 +- 19 files changed, 362 insertions(+), 44 deletions(-) create mode 100644 src/main/java/com/gitblit/extensions/RepositoryLifeCycleListener.java create mode 100644 src/main/java/com/gitblit/extensions/UserTeamLifeCycleListener.java (limited to 'src/test/java/com/gitblit') diff --git a/src/main/java/com/gitblit/DaggerModule.java b/src/main/java/com/gitblit/DaggerModule.java index b89f8c44..6ad3fe63 100644 --- a/src/main/java/com/gitblit/DaggerModule.java +++ b/src/main/java/com/gitblit/DaggerModule.java @@ -91,8 +91,11 @@ public class DaggerModule { return new NotificationManager(settings); } - @Provides @Singleton IUserManager provideUserManager(IRuntimeManager runtimeManager) { - return new UserManager(runtimeManager); + @Provides @Singleton IUserManager provideUserManager( + IRuntimeManager runtimeManager, + IPluginManager pluginManager) { + + return new UserManager(runtimeManager, pluginManager); } @Provides @Singleton IAuthenticationManager provideAuthenticationManager( @@ -131,10 +134,12 @@ public class DaggerModule { @Provides @Singleton IRepositoryManager provideRepositoryManager( IRuntimeManager runtimeManager, + IPluginManager pluginManager, IUserManager userManager) { return new RepositoryManager( runtimeManager, + pluginManager, userManager); } diff --git a/src/main/java/com/gitblit/FederationClient.java b/src/main/java/com/gitblit/FederationClient.java index cd06c3cb..29cdefe6 100644 --- a/src/main/java/com/gitblit/FederationClient.java +++ b/src/main/java/com/gitblit/FederationClient.java @@ -94,8 +94,8 @@ public class FederationClient { // configure the Gitblit singleton for minimal, non-server operation RuntimeManager runtime = new RuntimeManager(settings, baseFolder).start(); NoopNotificationManager notifications = new NoopNotificationManager().start(); - UserManager users = new UserManager(runtime).start(); - RepositoryManager repositories = new RepositoryManager(runtime, users).start(); + UserManager users = new UserManager(runtime, null).start(); + RepositoryManager repositories = new RepositoryManager(runtime, null, users).start(); FederationManager federation = new FederationManager(runtime, notifications, repositories).start(); IGitblit gitblit = new GitblitManager(runtime, null, notifications, users, null, null, repositories, null, federation); diff --git a/src/main/java/com/gitblit/MigrateTickets.java b/src/main/java/com/gitblit/MigrateTickets.java index b6d72376..ad1c63ea 100644 --- a/src/main/java/com/gitblit/MigrateTickets.java +++ b/src/main/java/com/gitblit/MigrateTickets.java @@ -135,7 +135,7 @@ public class MigrateTickets { settings.overrideSetting(ITicketService.SETTING_UPDATE_DIFFSTATS, false); IRuntimeManager runtimeManager = new RuntimeManager(settings, baseFolder).start(); - IRepositoryManager repositoryManager = new RepositoryManager(runtimeManager, null).start(); + IRepositoryManager repositoryManager = new RepositoryManager(runtimeManager, null, null).start(); String inputServiceName = settings.getString(Keys.tickets.service, BranchTicketService.class.getSimpleName()); if (StringUtils.isEmpty(inputServiceName)) { diff --git a/src/main/java/com/gitblit/ReindexTickets.java b/src/main/java/com/gitblit/ReindexTickets.java index 51ca1657..5a614481 100644 --- a/src/main/java/com/gitblit/ReindexTickets.java +++ b/src/main/java/com/gitblit/ReindexTickets.java @@ -127,7 +127,7 @@ public class ReindexTickets { settings.overrideSetting(Keys.web.activityCacheDays, 0); IRuntimeManager runtimeManager = new RuntimeManager(settings, baseFolder).start(); - IRepositoryManager repositoryManager = new RepositoryManager(runtimeManager, null).start(); + IRepositoryManager repositoryManager = new RepositoryManager(runtimeManager, null, null).start(); String serviceName = settings.getString(Keys.tickets.service, BranchTicketService.class.getSimpleName()); if (StringUtils.isEmpty(serviceName)) { diff --git a/src/main/java/com/gitblit/extensions/RepositoryLifeCycleListener.java b/src/main/java/com/gitblit/extensions/RepositoryLifeCycleListener.java new file mode 100644 index 00000000..5ef03af7 --- /dev/null +++ b/src/main/java/com/gitblit/extensions/RepositoryLifeCycleListener.java @@ -0,0 +1,45 @@ +/* + * Copyright 2014 gitblit.com. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.gitblit.extensions; + +import ro.fortsoft.pf4j.ExtensionPoint; + +import com.gitblit.models.RepositoryModel; + +/** + * Extension point to allow plugins to listen to major repository lifecycle events. + * + * @author James Moger + * @since 1.6.0 + */ +public abstract class RepositoryLifeCycleListener implements ExtensionPoint { + + /** + * Called after a repository has been created. + * + * @param repository + * @since 1.6.0 + */ + public abstract void onCreation(RepositoryModel repository); + + /** + * Called after a repository has been deleted. + * + * @param repository + * @since 1.6.0 + */ + public abstract void onDeletion(RepositoryModel repository); +} diff --git a/src/main/java/com/gitblit/extensions/UserTeamLifeCycleListener.java b/src/main/java/com/gitblit/extensions/UserTeamLifeCycleListener.java new file mode 100644 index 00000000..6f4cd9ba --- /dev/null +++ b/src/main/java/com/gitblit/extensions/UserTeamLifeCycleListener.java @@ -0,0 +1,62 @@ +/* + * Copyright 2014 gitblit.com. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.gitblit.extensions; + +import ro.fortsoft.pf4j.ExtensionPoint; + +import com.gitblit.models.TeamModel; +import com.gitblit.models.UserModel; + +/** + * Extension point to allow plugins to listen to major user and team lifecycle events. + * + * @author James Moger + * @since 1.6.0 + */ +public abstract class UserTeamLifeCycleListener implements ExtensionPoint { + + /** + * Called after a user has been created. + * + * @param user + * @since 1.6.0 + */ + public abstract void onCreation(UserModel user); + + /** + * Called after a user has been deleted. + * + * @param user + * @since 1.6.0 + */ + public abstract void onDeletion(UserModel user); + + /** + * Called after a team has been created. + * + * @param team + * @since 1.6.0 + */ + public abstract void onCreation(TeamModel team); + + /** + * Called after a team has been deleted. + * + * @param team + * @since 1.6.0 + */ + public abstract void onDeletion(TeamModel team); +} diff --git a/src/main/java/com/gitblit/manager/RepositoryManager.java b/src/main/java/com/gitblit/manager/RepositoryManager.java index 31d6b341..e0721c7c 100644 --- a/src/main/java/com/gitblit/manager/RepositoryManager.java +++ b/src/main/java/com/gitblit/manager/RepositoryManager.java @@ -66,6 +66,7 @@ import com.gitblit.Constants.RegistrantType; import com.gitblit.GitBlitException; import com.gitblit.IStoredSettings; import com.gitblit.Keys; +import com.gitblit.extensions.RepositoryLifeCycleListener; import com.gitblit.models.ForkModel; import com.gitblit.models.Metric; import com.gitblit.models.RefModel; @@ -114,6 +115,8 @@ public class RepositoryManager implements IRepositoryManager { private final IRuntimeManager runtimeManager; + private final IPluginManager pluginManager; + private final IUserManager userManager; private final File repositoriesFolder; @@ -126,10 +129,12 @@ public class RepositoryManager implements IRepositoryManager { public RepositoryManager( IRuntimeManager runtimeManager, + IPluginManager pluginManager, IUserManager userManager) { this.settings = runtimeManager.getSettings(); this.runtimeManager = runtimeManager; + this.pluginManager = pluginManager; this.userManager = userManager; this.repositoriesFolder = runtimeManager.getFileOrFolder(Keys.git.repositoriesFolder, "${baseFolder}/git"); } @@ -1420,6 +1425,16 @@ public class RepositoryManager implements IRepositoryManager { removeFromCachedRepositoryList(repositoryName); // model will actually be replaced on next load because config is stale addToCachedRepositoryList(repository); + + if (isCreate && pluginManager != null) { + for (RepositoryLifeCycleListener listener : pluginManager.getExtensions(RepositoryLifeCycleListener.class)) { + try { + listener.onCreation(repository); + } catch (Throwable t) { + logger.error(String.format("failed to call plugin onCreation %s", repositoryName), t); + } + } + } } /** @@ -1588,6 +1603,16 @@ public class RepositoryManager implements IRepositoryManager { FileUtils.delete(folder, FileUtils.RECURSIVE | FileUtils.RETRY); if (userManager.deleteRepositoryRole(repositoryName)) { logger.info(MessageFormat.format("Repository \"{0}\" deleted", repositoryName)); + + if (pluginManager != null) { + for (RepositoryLifeCycleListener listener : pluginManager.getExtensions(RepositoryLifeCycleListener.class)) { + try { + listener.onDeletion(repository); + } catch (Throwable t) { + logger.error(String.format("failed to call plugin onDeletion %s", repositoryName), t); + } + } + } return true; } } diff --git a/src/main/java/com/gitblit/manager/UserManager.java b/src/main/java/com/gitblit/manager/UserManager.java index 67b1d68f..2b82ffb6 100644 --- a/src/main/java/com/gitblit/manager/UserManager.java +++ b/src/main/java/com/gitblit/manager/UserManager.java @@ -32,6 +32,7 @@ import com.gitblit.Constants; import com.gitblit.IStoredSettings; import com.gitblit.IUserService; import com.gitblit.Keys; +import com.gitblit.extensions.UserTeamLifeCycleListener; import com.gitblit.models.TeamModel; import com.gitblit.models.UserModel; import com.gitblit.utils.StringUtils; @@ -50,13 +51,16 @@ public class UserManager implements IUserManager { private final IRuntimeManager runtimeManager; + private final IPluginManager pluginManager; + private final Map legacyBackingServices; private IUserService userService; - public UserManager(IRuntimeManager runtimeManager) { + public UserManager(IRuntimeManager runtimeManager, IPluginManager pluginManager) { this.settings = runtimeManager.getSettings(); this.runtimeManager = runtimeManager; + this.pluginManager = pluginManager; // map of legacy realm backing user services legacyBackingServices = new HashMap(); @@ -209,7 +213,14 @@ public class UserManager implements IUserManager { */ @Override public boolean updateUserModel(UserModel model) { - return userService.updateUserModel(model); + final boolean isCreate = null == userService.getUserModel(model.username); + if (userService.updateUserModel(model)) { + if (isCreate) { + callCreateUserListeners(model); + } + return true; + } + return false; } /** @@ -236,7 +247,14 @@ public class UserManager implements IUserManager { */ @Override public boolean updateUserModel(String username, UserModel model) { - return userService.updateUserModel(username, model); + final boolean isCreate = null == userService.getUserModel(username); + if (userService.updateUserModel(username, model)) { + if (isCreate) { + callCreateUserListeners(model); + } + return true; + } + return false; } /** @@ -247,7 +265,11 @@ public class UserManager implements IUserManager { */ @Override public boolean deleteUserModel(UserModel model) { - return userService.deleteUserModel(model); + if (userService.deleteUserModel(model)) { + callDeleteUserListeners(model); + return true; + } + return false; } /** @@ -262,7 +284,12 @@ public class UserManager implements IUserManager { return false; } String usernameDecoded = StringUtils.decodeUsername(username); - return userService.deleteUser(usernameDecoded); + UserModel user = getUserModel(usernameDecoded); + if (userService.deleteUser(usernameDecoded)) { + callDeleteUserListeners(user); + return true; + } + return false; } /** @@ -349,7 +376,14 @@ public class UserManager implements IUserManager { */ @Override public boolean updateTeamModel(TeamModel model) { - return userService.updateTeamModel(model); + final boolean isCreate = null == userService.getTeamModel(model.name); + if (userService.updateTeamModel(model)) { + if (isCreate) { + callCreateTeamListeners(model); + } + return true; + } + return false; } /** @@ -377,7 +411,14 @@ public class UserManager implements IUserManager { */ @Override public boolean updateTeamModel(String teamname, TeamModel model) { - return userService.updateTeamModel(teamname, model); + final boolean isCreate = null == userService.getTeamModel(teamname); + if (userService.updateTeamModel(teamname, model)) { + if (isCreate) { + callCreateTeamListeners(model); + } + return true; + } + return false; } /** @@ -389,7 +430,11 @@ public class UserManager implements IUserManager { */ @Override public boolean deleteTeamModel(TeamModel model) { - return userService.deleteTeamModel(model); + if (userService.deleteTeamModel(model)) { + callDeleteTeamListeners(model); + return true; + } + return false; } /** @@ -401,7 +446,12 @@ public class UserManager implements IUserManager { */ @Override public boolean deleteTeam(String teamname) { - return userService.deleteTeam(teamname); + TeamModel team = userService.getTeamModel(teamname); + if (userService.deleteTeam(teamname)) { + callDeleteTeamListeners(team); + return true; + } + return false; } /** @@ -440,4 +490,60 @@ public class UserManager implements IUserManager { public boolean deleteRepositoryRole(String role) { return userService.deleteRepositoryRole(role); } + + protected void callCreateUserListeners(UserModel user) { + if (pluginManager == null || user == null) { + return; + } + + for (UserTeamLifeCycleListener listener : pluginManager.getExtensions(UserTeamLifeCycleListener.class)) { + try { + listener.onCreation(user); + } catch (Throwable t) { + logger.error(String.format("failed to call plugin.onCreation%s", user.username), t); + } + } + } + + protected void callCreateTeamListeners(TeamModel team) { + if (pluginManager == null || team == null) { + return; + } + + for (UserTeamLifeCycleListener listener : pluginManager.getExtensions(UserTeamLifeCycleListener.class)) { + try { + listener.onCreation(team); + } catch (Throwable t) { + logger.error(String.format("failed to call plugin.onCreation %s", team.name), t); + } + } + } + + protected void callDeleteUserListeners(UserModel user) { + if (pluginManager == null || user == null) { + return; + } + + for (UserTeamLifeCycleListener listener : pluginManager.getExtensions(UserTeamLifeCycleListener.class)) { + try { + listener.onDeletion(user); + } catch (Throwable t) { + logger.error(String.format("failed to call plugin.onDeletion %s", user.username), t); + } + } + } + + protected void callDeleteTeamListeners(TeamModel team) { + if (pluginManager == null || team == null) { + return; + } + + for (UserTeamLifeCycleListener listener : pluginManager.getExtensions(UserTeamLifeCycleListener.class)) { + try { + listener.onDeletion(team); + } catch (Throwable t) { + logger.error(String.format("failed to call plugin.onDeletion %s", team.name), t); + } + } + } } diff --git a/src/main/java/com/gitblit/servlet/GitblitContext.java b/src/main/java/com/gitblit/servlet/GitblitContext.java index 50f22d5a..d5b4092c 100644 --- a/src/main/java/com/gitblit/servlet/GitblitContext.java +++ b/src/main/java/com/gitblit/servlet/GitblitContext.java @@ -175,6 +175,9 @@ public class GitblitContext extends DaggerContext { runtime.start(); managers.add(runtime); + // create the plugin manager instance but do not start it + loadManager(injector, IPluginManager.class); + // start all other managers startManager(injector, INotificationManager.class); startManager(injector, IUserManager.class); @@ -215,9 +218,14 @@ public class GitblitContext extends DaggerContext { return null; } + protected X loadManager(ObjectGraph injector, Class clazz) { + X x = injector.get(clazz); + return x; + } + protected X startManager(ObjectGraph injector, Class clazz) { + X x = loadManager(injector, clazz); logManager(clazz); - X x = injector.get(clazz); x.start(); managers.add(x); return x; diff --git a/src/site/plugins_extensions.mkd b/src/site/plugins_extensions.mkd index 99b6400f..0e066438 100644 --- a/src/site/plugins_extensions.mkd +++ b/src/site/plugins_extensions.mkd @@ -286,7 +286,7 @@ public class MyNavLink extends NavLinkExtension { } ``` -### Lifecycle Listener +### Server Lifecycle Listener *SINCE 1.6.0* @@ -313,4 +313,75 @@ public class MyLifeCycleListener extends LifeCycleListener { log.info("Gitblit is Going Down!!"); } } -``` \ No newline at end of file +``` + +### Repository Lifecycle Listener + +*SINCE 1.6.0* + +You can provide a lifecycle listener to be notified when Gitblit has created or deleted a repository. + +```java +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import ro.fortsoft.pf4j.Extension; +import com.gitblit.extensions.RepositoryLifeCycleListener; +import com.gitblit.models.RepositoryModel; + +@Extension +public class MyRepoLifeCycleListener extends RepositoryLifeCycleListener { + + final Logger log = LoggerFactory.getLogger(getClass()); + + @Override + public void onCreation(RepositoryModel repo) { + log.info("Gitblit created {}", repo); + } + + @Override + public void onDeletion(RepositoryModel repo) { + log.info("Gitblit deleted {}", repo); + } +} +``` + +### User/Team Lifecycle Listener + +*SINCE 1.6.0* + +You can provide a lifecycle listener to be notified when Gitblit has created or deleted a user or a team. + +```java +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import ro.fortsoft.pf4j.Extension; +import com.gitblit.extensions.UserTeamLifeCycleListener; +import com.gitblit.models.TeamModel; +import com.gitblit.models.UserModel; + +@Extension +public class MyUserTeamLifeCycleListener extends UserTeamLifeCycleListener { + + final Logger log = LoggerFactory.getLogger(getClass()); + + @Override + public void onCreation(UserModel user) { + log.info("Gitblit created user {}", user); + } + + @Override + public void onDeletion(UserModel user) { + log.info("Gitblit deleted user {}", user); + } + + @Override + public void onCreation(TeamModel team) { + log.info("Gitblit created team {}", team); + } + + @Override + public void onDeletion(TeamModel team) { + log.info("Gitblit deleted team {}", team); + } +} +``` diff --git a/src/test/config/test-users.conf b/src/test/config/test-users.conf index 1d01f846..4361410c 100644 --- a/src/test/config/test-users.conf +++ b/src/test/config/test-users.conf @@ -2,13 +2,9 @@ password = admin cookie = dd94709528bb1c83d08f3088d4043f4742891f4f accountType = LOCAL + emailMeOnMyTicketChanges = true role = "#admin" role = "#notfederated" -[user "sampleuser"] - password = sampleuser - cookie = 6e07ed42149fc166206319faffdfba2e2ec82e43 - accountType = LOCAL - role = "#none" [team "admins"] role = "#none" accountType = LOCAL diff --git a/src/test/java/com/gitblit/tests/AuthenticationManagerTest.java b/src/test/java/com/gitblit/tests/AuthenticationManagerTest.java index 84a2b749..f1d2711e 100644 --- a/src/test/java/com/gitblit/tests/AuthenticationManagerTest.java +++ b/src/test/java/com/gitblit/tests/AuthenticationManagerTest.java @@ -43,7 +43,7 @@ public class AuthenticationManagerTest extends GitblitUnitTest { IAuthenticationManager newAuthenticationManager() { RuntimeManager runtime = new RuntimeManager(getSettings(), GitBlitSuite.BASEFOLDER).start(); - users = new UserManager(runtime).start(); + users = new UserManager(runtime, null).start(); AuthenticationManager auth = new AuthenticationManager(runtime, users).start(); return auth; } diff --git a/src/test/java/com/gitblit/tests/BranchTicketServiceTest.java b/src/test/java/com/gitblit/tests/BranchTicketServiceTest.java index 6119b8db..cc404abf 100644 --- a/src/test/java/com/gitblit/tests/BranchTicketServiceTest.java +++ b/src/test/java/com/gitblit/tests/BranchTicketServiceTest.java @@ -54,8 +54,8 @@ public class BranchTicketServiceTest extends TicketServiceTest { IRuntimeManager runtimeManager = new RuntimeManager(settings).start(); IPluginManager pluginManager = new PluginManager(runtimeManager).start(); INotificationManager notificationManager = new NotificationManager(settings).start(); - IUserManager userManager = new UserManager(runtimeManager).start(); - IRepositoryManager repositoryManager = new RepositoryManager(runtimeManager, userManager).start(); + IUserManager userManager = new UserManager(runtimeManager, pluginManager).start(); + IRepositoryManager repositoryManager = new RepositoryManager(runtimeManager, pluginManager, userManager).start(); BranchTicketService service = new BranchTicketService( runtimeManager, diff --git a/src/test/java/com/gitblit/tests/FileTicketServiceTest.java b/src/test/java/com/gitblit/tests/FileTicketServiceTest.java index 20cde26b..6ede042a 100644 --- a/src/test/java/com/gitblit/tests/FileTicketServiceTest.java +++ b/src/test/java/com/gitblit/tests/FileTicketServiceTest.java @@ -53,8 +53,8 @@ public class FileTicketServiceTest extends TicketServiceTest { IRuntimeManager runtimeManager = new RuntimeManager(settings).start(); IPluginManager pluginManager = new PluginManager(runtimeManager).start(); INotificationManager notificationManager = new NotificationManager(settings).start(); - IUserManager userManager = new UserManager(runtimeManager).start(); - IRepositoryManager repositoryManager = new RepositoryManager(runtimeManager, userManager).start(); + IUserManager userManager = new UserManager(runtimeManager, pluginManager).start(); + IRepositoryManager repositoryManager = new RepositoryManager(runtimeManager, pluginManager, userManager).start(); FileTicketService service = new FileTicketService( runtimeManager, diff --git a/src/test/java/com/gitblit/tests/HtpasswdAuthenticationTest.java b/src/test/java/com/gitblit/tests/HtpasswdAuthenticationTest.java index 4e1c3ac1..f4e24d4e 100644 --- a/src/test/java/com/gitblit/tests/HtpasswdAuthenticationTest.java +++ b/src/test/java/com/gitblit/tests/HtpasswdAuthenticationTest.java @@ -75,15 +75,15 @@ public class HtpasswdAuthenticationTest extends GitblitUnitTest { private HtpasswdAuthProvider newHtpasswdAuthentication(IStoredSettings settings) { RuntimeManager runtime = new RuntimeManager(settings, GitBlitSuite.BASEFOLDER).start(); - UserManager users = new UserManager(runtime).start(); + UserManager users = new UserManager(runtime, null).start(); HtpasswdAuthProvider htpasswd = new HtpasswdAuthProvider(); htpasswd.setup(runtime, users); return htpasswd; } - + private AuthenticationManager newAuthenticationManager(IStoredSettings settings) { RuntimeManager runtime = new RuntimeManager(settings, GitBlitSuite.BASEFOLDER).start(); - UserManager users = new UserManager(runtime).start(); + UserManager users = new UserManager(runtime, null).start(); HtpasswdAuthProvider htpasswd = new HtpasswdAuthProvider(); htpasswd.setup(runtime, users); AuthenticationManager auth = new AuthenticationManager(runtime, users); @@ -191,7 +191,7 @@ public class HtpasswdAuthenticationTest extends GitblitUnitTest { assertEquals("leading", user.username); } - + @Test public void testAuthenticationManager() { diff --git a/src/test/java/com/gitblit/tests/LdapAuthenticationTest.java b/src/test/java/com/gitblit/tests/LdapAuthenticationTest.java index 21063d58..646f7e9f 100644 --- a/src/test/java/com/gitblit/tests/LdapAuthenticationTest.java +++ b/src/test/java/com/gitblit/tests/LdapAuthenticationTest.java @@ -68,7 +68,7 @@ public class LdapAuthenticationTest extends GitblitUnitTest { private static InMemoryDirectoryServer ds; private IUserManager userManager; - + private AuthenticationManager auth; private MemorySettings settings; @@ -97,12 +97,12 @@ public class LdapAuthenticationTest extends GitblitUnitTest { private LdapAuthProvider newLdapAuthentication(IStoredSettings settings) { RuntimeManager runtime = new RuntimeManager(settings, GitBlitSuite.BASEFOLDER).start(); - userManager = new UserManager(runtime).start(); + userManager = new UserManager(runtime, null).start(); LdapAuthProvider ldap = new LdapAuthProvider(); ldap.setup(runtime, userManager); return ldap; } - + private AuthenticationManager newAuthenticationManager(IStoredSettings settings) { RuntimeManager runtime = new RuntimeManager(settings, GitBlitSuite.BASEFOLDER).start(); AuthenticationManager auth = new AuthenticationManager(runtime, userManager); @@ -258,7 +258,7 @@ public class LdapAuthenticationTest extends GitblitUnitTest { assertNull(userThreeModel.getTeam("git_admins")); assertTrue(userThreeModel.canAdmin); } - + @Test public void testBindWithUser() { settings.put(Keys.realm.ldap.bindpattern, "CN=${username},OU=US,OU=Users,OU=UserControl,OU=MyOrganization,DC=MyDomain"); @@ -267,7 +267,7 @@ public class LdapAuthenticationTest extends GitblitUnitTest { UserModel userOneModel = auth.authenticate("UserOne", "userOnePassword".toCharArray()); assertNotNull(userOneModel); - + UserModel userOneModelFailedAuth = auth.authenticate("UserOne", "userTwoPassword".toCharArray()); assertNull(userOneModelFailedAuth); } diff --git a/src/test/java/com/gitblit/tests/LuceneExecutorTest.java b/src/test/java/com/gitblit/tests/LuceneExecutorTest.java index 319c09c1..5c319e65 100644 --- a/src/test/java/com/gitblit/tests/LuceneExecutorTest.java +++ b/src/test/java/com/gitblit/tests/LuceneExecutorTest.java @@ -49,8 +49,8 @@ public class LuceneExecutorTest extends GitblitUnitTest { MemorySettings settings = new MemorySettings(); settings.put(Keys.git.repositoriesFolder, GitBlitSuite.REPOSITORIES); RuntimeManager runtime = new RuntimeManager(settings, GitBlitSuite.BASEFOLDER).start(); - UserManager users = new UserManager(runtime).start(); - RepositoryManager repos = new RepositoryManager(runtime, users); + UserManager users = new UserManager(runtime, null).start(); + RepositoryManager repos = new RepositoryManager(runtime, null, users); return new LuceneService(settings, repos); } diff --git a/src/test/java/com/gitblit/tests/RedisTicketServiceTest.java b/src/test/java/com/gitblit/tests/RedisTicketServiceTest.java index 94391a15..b782b449 100644 --- a/src/test/java/com/gitblit/tests/RedisTicketServiceTest.java +++ b/src/test/java/com/gitblit/tests/RedisTicketServiceTest.java @@ -61,8 +61,8 @@ public class RedisTicketServiceTest extends TicketServiceTest { IRuntimeManager runtimeManager = new RuntimeManager(settings).start(); IPluginManager pluginManager = new PluginManager(runtimeManager).start(); INotificationManager notificationManager = new NotificationManager(settings).start(); - IUserManager userManager = new UserManager(runtimeManager).start(); - IRepositoryManager repositoryManager = new RepositoryManager(runtimeManager, userManager).start(); + IUserManager userManager = new UserManager(runtimeManager, pluginManager).start(); + IRepositoryManager repositoryManager = new RepositoryManager(runtimeManager, pluginManager, userManager).start(); RedisTicketService service = new RedisTicketService( runtimeManager, diff --git a/src/test/java/com/gitblit/tests/RedmineAuthenticationTest.java b/src/test/java/com/gitblit/tests/RedmineAuthenticationTest.java index 6ede8313..3b6b7bba 100644 --- a/src/test/java/com/gitblit/tests/RedmineAuthenticationTest.java +++ b/src/test/java/com/gitblit/tests/RedmineAuthenticationTest.java @@ -26,7 +26,7 @@ public class RedmineAuthenticationTest extends GitblitUnitTest { RedmineAuthProvider newRedmineAuthentication(IStoredSettings settings) { RuntimeManager runtime = new RuntimeManager(settings, GitBlitSuite.BASEFOLDER).start(); - UserManager users = new UserManager(runtime).start(); + UserManager users = new UserManager(runtime, null).start(); RedmineAuthProvider redmine = new RedmineAuthProvider(); redmine.setup(runtime, users); return redmine; @@ -35,10 +35,10 @@ public class RedmineAuthenticationTest extends GitblitUnitTest { RedmineAuthProvider newRedmineAuthentication() { return newRedmineAuthentication(getSettings()); } - + AuthenticationManager newAuthenticationManager() { RuntimeManager runtime = new RuntimeManager(getSettings(), GitBlitSuite.BASEFOLDER).start(); - UserManager users = new UserManager(runtime).start(); + UserManager users = new UserManager(runtime, null).start(); RedmineAuthProvider redmine = new RedmineAuthProvider(); redmine.setup(runtime, users); redmine.setTestingCurrentUserAsJson(JSON); -- cgit v1.2.3