QChris has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/64301


Change subject: Add separate capability to rename projects
......................................................................

Add separate capability to rename projects

Change-Id: I1cd503bf778212f26fc40b9b43582967e21af30d
---
M Documentation/access-control.txt
M Documentation/cmd-rename-project.txt
M Documentation/rest-api-accounts.txt
M 
gerrit-common/src/main/java/com/google/gerrit/common/data/GlobalCapability.java
M gerrit-gwtui/src/main/java/com/google/gerrit/client/Gerrit.java
M 
gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AdminConstants.properties
M 
gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/RenameProjectScreen.java
M 
gerrit-server/src/main/java/com/google/gerrit/server/account/CapabilityControl.java
M 
gerrit-server/src/main/java/com/google/gerrit/server/account/GetCapabilities.java
M 
gerrit-server/src/main/java/com/google/gerrit/server/project/RenameProject.java
M gerrit-server/src/main/java/com/google/gerrit/server/project/SetName.java
M 
gerrit-server/src/test/java/com/google/gerrit/server/project/RenameProjectTest.java
M 
gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/RenameProjectCommand.java
13 files changed, 41 insertions(+), 12 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/gerrit refs/changes/01/64301/1

diff --git a/Documentation/access-control.txt b/Documentation/access-control.txt
index ec64e0b..39145bd 100644
--- a/Documentation/access-control.txt
+++ b/Documentation/access-control.txt
@@ -1265,6 +1265,14 @@
 Allow users to run the Git garbage collection for the repositories of
 all projects.
 
+[[capability_renameProject]]
+Rename Project
+~~~~~~~~~~~~~~
+
+Allow renaming of projects. This capability allows the granted group to rename
+projects either over link:cmd-rename-project.html[ssh], via
+link:rest-api-projects.html#rename-project[REST], or via the web UI.
+
 
 [[capability_startReplication]]
 Start Replication
diff --git a/Documentation/cmd-rename-project.txt 
b/Documentation/cmd-rename-project.txt
index c9612bf..e97334a 100644
--- a/Documentation/cmd-rename-project.txt
+++ b/Documentation/cmd-rename-project.txt
@@ -18,7 +18,9 @@
 
 ACCESS
 ------
-Caller must be a member of the privileged 'Administrators' group.
+Caller must be a member of the privileged 'Administrators' group,
+or have been granted
+link:access-control.html#capability_renameProject[the 'Rename Project' global 
capability].
 
 SCRIPTING
 ---------
diff --git a/Documentation/rest-api-accounts.txt 
b/Documentation/rest-api-accounts.txt
index 579eacd..35b997f 100644
--- a/Documentation/rest-api-accounts.txt
+++ b/Documentation/rest-api-accounts.txt
@@ -149,7 +149,8 @@
     "viewConnections": true,
     "viewQueue": true,
     "runGC": true,
-    "startReplication": true
+    "startReplication": true,
+    "renameProject": true
   }
 ----
 
@@ -512,6 +513,9 @@
 capability.
 |`killTask`          |not set if `false`|Whether the user has the
 link:access-control.html#capability_kill[Kill Task] capability.
+|`renameProject`     |not set if `false`|Whether the user has the
+link:access-control.html#capability_renameProject[Rename Project]
+capability.
 |`viewCaches`        |not set if `false`|Whether the user has the
 link:access-control.html#capability_viewCaches[View Caches] capability.
 |`flushCaches`       |not set if `false`|Whether the user has the
diff --git 
a/gerrit-common/src/main/java/com/google/gerrit/common/data/GlobalCapability.java
 
b/gerrit-common/src/main/java/com/google/gerrit/common/data/GlobalCapability.java
index 8c08feb..49ba56f 100644
--- 
a/gerrit-common/src/main/java/com/google/gerrit/common/data/GlobalCapability.java
+++ 
b/gerrit-common/src/main/java/com/google/gerrit/common/data/GlobalCapability.java
@@ -70,6 +70,9 @@
   /** Can run the Git garbage collection. */
   public static final String RUN_GC = "runGC";
 
+  /** Can rename projects on the server. */
+  public static final String RENAME_PROJECT = "renameProject";
+
   /** Forcefully restart replication to any configured destination. */
   public static final String START_REPLICATION = "startReplication";
 
@@ -101,6 +104,7 @@
     NAMES_ALL.add(PRIORITY);
     NAMES_ALL.add(QUERY_LIMIT);
     NAMES_ALL.add(RUN_GC);
+    NAMES_ALL.add(RENAME_PROJECT);
     NAMES_ALL.add(START_REPLICATION);
     NAMES_ALL.add(STREAM_EVENTS);
     NAMES_ALL.add(VIEW_CACHES);
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/Gerrit.java 
b/gerrit-gwtui/src/main/java/com/google/gerrit/client/Gerrit.java
index fffeff1..06cfd81 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/Gerrit.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/Gerrit.java
@@ -17,6 +17,7 @@
 import static 
com.google.gerrit.common.data.GlobalCapability.ADMINISTRATE_SERVER;
 import static com.google.gerrit.common.data.GlobalCapability.CREATE_GROUP;
 import static com.google.gerrit.common.data.GlobalCapability.CREATE_PROJECT;
+import static com.google.gerrit.common.data.GlobalCapability.RENAME_PROJECT;
 
 import com.google.gerrit.client.account.AccountCapabilities;
 import com.google.gerrit.client.account.AccountInfo;
@@ -670,7 +671,7 @@
           if (result.canPerform(CREATE_PROJECT)) {
             addLink(projectsBar, C.menuProjectsCreate(), 
PageLinks.ADMIN_CREATE_PROJECT);
           }
-          if (result.canPerform(ADMINISTRATE_SERVER)) {
+          if (result.canPerform(RENAME_PROJECT)) {
             addLink(projectsBar, C.menuProjectsRename(), 
PageLinks.ADMIN_RENAME_PROJECT);
           }
           if (result.canPerform(CREATE_GROUP)) {
@@ -682,7 +683,7 @@
                 menuLeft.getWidgetIndex(peopleBar) + 1);
           }
         }
-      }, CREATE_PROJECT, CREATE_GROUP, ADMINISTRATE_SERVER);
+      }, RENAME_PROJECT, CREATE_PROJECT, CREATE_GROUP, ADMINISTRATE_SERVER);
     }
 
     if (getConfig().isDocumentationAvailable()) {
diff --git 
a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AdminConstants.properties
 
b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AdminConstants.properties
index c68c663..a35a46d 100644
--- 
a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AdminConstants.properties
+++ 
b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/AdminConstants.properties
@@ -160,6 +160,7 @@
   priority, \
   queryLimit, \
   runGC, \
+  renameProject, \
   startReplication, \
   streamEvents, \
   viewCaches, \
@@ -176,6 +177,7 @@
 priority = Priority
 queryLimit = Query Limit
 runGC = Run Garbage Collection
+renameProject = Rename Project
 startReplication = Start Replication
 streamEvents = Stream Events
 viewCaches = View Caches
diff --git 
a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/RenameProjectScreen.java
 
b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/RenameProjectScreen.java
index e288ab0..3e05eab 100644
--- 
a/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/RenameProjectScreen.java
+++ 
b/gerrit-gwtui/src/main/java/com/google/gerrit/client/admin/RenameProjectScreen.java
@@ -14,7 +14,7 @@
 
 package com.google.gerrit.client.admin;
 
-import static 
com.google.gerrit.common.data.GlobalCapability.ADMINISTRATE_SERVER;
+import static com.google.gerrit.common.data.GlobalCapability.RENAME_PROJECT;
 
 import com.google.gerrit.client.Dispatcher;
 import com.google.gerrit.client.ErrorDialog;
@@ -64,13 +64,13 @@
     AccountCapabilities.all(new GerritCallback<AccountCapabilities>() {
       @Override
       public void onSuccess(AccountCapabilities ac) {
-        if (ac.canPerform(ADMINISTRATE_SERVER)) {
+        if (ac.canPerform(RENAME_PROJECT)) {
           display();
         } else {
           Gerrit.display(PageLinks.ADMIN_RENAME_PROJECT, new NotFoundScreen());
         }
       }
-    }, ADMINISTRATE_SERVER);
+    }, RENAME_PROJECT);
   }
 
   @Override
diff --git 
a/gerrit-server/src/main/java/com/google/gerrit/server/account/CapabilityControl.java
 
b/gerrit-server/src/main/java/com/google/gerrit/server/account/CapabilityControl.java
index d2014ec..dc55f66 100644
--- 
a/gerrit-server/src/main/java/com/google/gerrit/server/account/CapabilityControl.java
+++ 
b/gerrit-server/src/main/java/com/google/gerrit/server/account/CapabilityControl.java
@@ -100,6 +100,12 @@
     return canEmailReviewers;
   }
 
+  /** @return true if the user can rename a project. */
+  public boolean canRenameProject() {
+    return canPerform(GlobalCapability.RENAME_PROJECT)
+      || canAdministrateServer();
+  }
+
   /** @return true if the user can kill any running task. */
   public boolean canKillTask() {
     return canPerform(GlobalCapability.KILL_TASK)
diff --git 
a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetCapabilities.java
 
b/gerrit-server/src/main/java/com/google/gerrit/server/account/GetCapabilities.java
index 54f1980..98bef03 100644
--- 
a/gerrit-server/src/main/java/com/google/gerrit/server/account/GetCapabilities.java
+++ 
b/gerrit-server/src/main/java/com/google/gerrit/server/account/GetCapabilities.java
@@ -23,6 +23,7 @@
 import static com.google.gerrit.common.data.GlobalCapability.KILL_TASK;
 import static com.google.gerrit.common.data.GlobalCapability.PRIORITY;
 import static com.google.gerrit.common.data.GlobalCapability.RUN_GC;
+import static com.google.gerrit.common.data.GlobalCapability.RENAME_PROJECT;
 import static com.google.gerrit.common.data.GlobalCapability.START_REPLICATION;
 import static com.google.gerrit.common.data.GlobalCapability.STREAM_EVENTS;
 import static com.google.gerrit.common.data.GlobalCapability.VIEW_CACHES;
@@ -107,6 +108,7 @@
     have.put(START_REPLICATION, cc.canStartReplication());
     have.put(STREAM_EVENTS, cc.canStreamEvents());
     have.put(ACCESS_DATABASE, cc.canAccessDatabase());
+    have.put(RENAME_PROJECT, cc.canRenameProject());
 
     QueueProvider.QueueType queue = cc.getQueueType();
     if (queue != QueueProvider.QueueType.INTERACTIVE
diff --git 
a/gerrit-server/src/main/java/com/google/gerrit/server/project/RenameProject.java
 
b/gerrit-server/src/main/java/com/google/gerrit/server/project/RenameProject.java
index 7999bc2..d43f605 100644
--- 
a/gerrit-server/src/main/java/com/google/gerrit/server/project/RenameProject.java
+++ 
b/gerrit-server/src/main/java/com/google/gerrit/server/project/RenameProject.java
@@ -91,7 +91,7 @@
     final ProjectState sourceProjectState;
     final Project sourceProject;
 
-    if (!currentUser.getCapabilities().canAdministrateServer()) {
+    if (!currentUser.getCapabilities().canRenameProject()) {
       throw new PermissionDeniedException(String.format(
           "%s does not have \"Rename Project\" capability.",
           currentUser.getUserName()));
diff --git 
a/gerrit-server/src/main/java/com/google/gerrit/server/project/SetName.java 
b/gerrit-server/src/main/java/com/google/gerrit/server/project/SetName.java
index ba99790..d9bee56 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/SetName.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/SetName.java
@@ -27,7 +27,7 @@
 
 import org.eclipse.jgit.errors.RepositoryNotFoundException;
 
-@RequiresCapability(GlobalCapability.ADMINISTRATE_SERVER)
+@RequiresCapability(GlobalCapability.RENAME_PROJECT)
 class SetName implements RestModifyView<ProjectResource, Input> {
   static class Input {
     @DefaultInput
diff --git 
a/gerrit-server/src/test/java/com/google/gerrit/server/project/RenameProjectTest.java
 
b/gerrit-server/src/test/java/com/google/gerrit/server/project/RenameProjectTest.java
index 9ab0dcc..f1a14b1 100644
--- 
a/gerrit-server/src/test/java/com/google/gerrit/server/project/RenameProjectTest.java
+++ 
b/gerrit-server/src/test/java/com/google/gerrit/server/project/RenameProjectTest.java
@@ -65,7 +65,7 @@
   public void testPermissionCheck() throws NameAlreadyUsedException,
       NoSuchProjectException, ProjectRenamingFailedException {
     reset(capabilityControl);
-    
expect(capabilityControl.canAdministrateServer()).andReturn(false).anyTimes();
+    expect(capabilityControl.canRenameProject()).andReturn(false).anyTimes();
 
     // Done with setting up mocks
     replayMocks();
@@ -416,7 +416,7 @@
     expect(identifiedUser.getCapabilities()).andReturn(capabilityControl)
         .anyTimes();
 
-    
expect(capabilityControl.canAdministrateServer()).andReturn(true).anyTimes();
+    expect(capabilityControl.canRenameProject()).andReturn(true).anyTimes();
 
     expect(projectCache.get(eq(new Project.NameKey("dummysource"))))
         .andReturn(sourceProjectState).anyTimes();
diff --git 
a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/RenameProjectCommand.java
 
b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/RenameProjectCommand.java
index f85f363..4164468 100644
--- 
a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/RenameProjectCommand.java
+++ 
b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/RenameProjectCommand.java
@@ -28,7 +28,7 @@
 import org.kohsuke.args4j.Argument;
 
 /** Rename a project. **/
-@RequiresCapability(GlobalCapability.ADMINISTRATE_SERVER)
+@RequiresCapability(GlobalCapability.RENAME_PROJECT)
 @CommandMetaData(name = "rename-project", descr = "Rename a project")
 final class RenameProjectCommand extends SshCommand {
   @Argument(index = 0, required = true, metaVar = "PROJECT",

-- 
To view, visit https://gerrit.wikimedia.org/r/64301
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I1cd503bf778212f26fc40b9b43582967e21af30d
Gerrit-PatchSet: 1
Gerrit-Project: gerrit
Gerrit-Branch: wmf
Gerrit-Owner: QChris <[email protected]>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to