]> source.dussan.org Git - gitblit.git/commitdiff
Support admin commands that respect user permissions
authorJames Moger <james.moger@gitblit.com>
Fri, 14 Mar 2014 16:52:50 +0000 (12:52 -0400)
committerJames Moger <james.moger@gitblit.com>
Thu, 10 Apr 2014 22:58:08 +0000 (18:58 -0400)
src/main/java/com/gitblit/transport/ssh/CommandMetaData.java
src/main/java/com/gitblit/transport/ssh/commands/CreateRepository.java
src/main/java/com/gitblit/transport/ssh/commands/DispatchCommand.java
src/main/java/com/gitblit/transport/ssh/commands/SetAccountCommand.java

index 2dd189c19527d1fe8468ef5382ab4d6d97fad276..0d39f33fcc52cf518c9268d9b76ab5a3ff42a22f 100644 (file)
@@ -28,5 +28,6 @@ import java.lang.annotation.Target;
 public @interface CommandMetaData {
 String name();
 String description() default "";
+boolean admin() default false;
 boolean hidden() default false;
 }
index f422b18b469c0ec10a6f0f9d58479fa4adac48ec..20f69015168a2c887832ef71efaade14a7b4823a 100644 (file)
@@ -20,7 +20,7 @@ import org.kohsuke.args4j.Option;
 
 import com.gitblit.transport.ssh.CommandMetaData;
 
-@CommandMetaData(name = "create-repository", description = "Create new GIT repository", hidden = true)
+@CommandMetaData(name = "create-repository", description = "Create new GIT repository", admin = true, hidden = true)
 public class CreateRepository extends SshCommand {
 
   @Option(name = "--name", aliases = {"-n"}, required = true, metaVar = "NAME", usage = "name of repository to be created")
index 83707f77cc38f5f36d9c7ee0adabef3cadd2e53f..5c022732c2354d1badb3bbc05b65306ffae624cb 100644 (file)
@@ -93,6 +93,12 @@ public class DispatchCommand extends BaseCommand {
       }
 
       Command cmd = getCommand();
+      if (cmd.getClass().isAnnotationPresent(CommandMetaData.class)) {
+         CommandMetaData meta = cmd.getClass().getAnnotation(CommandMetaData.class);
+         if (meta.admin() && !ctx.getClient().getUser().canAdmin()) {
+                 throw new UnloggedFailure(1, MessageFormat.format("{0} requires admin permissions", commandName));
+         }
+      }
       if (cmd instanceof BaseCommand) {
         BaseCommand bc = (BaseCommand) cmd;
         if (getName().isEmpty()) {
@@ -162,6 +168,9 @@ public class DispatchCommand extends BaseCommand {
       final Class<? extends Command> c = m.get(name);
       CommandMetaData meta = c.getAnnotation(CommandMetaData.class);
       if (meta != null) {
+        if (meta.admin() && !ctx.getClient().getUser().canAdmin()) {
+         continue;
+        }
         if (meta.hidden()) {
                continue;
         }
index 0eabdce8bf9ae30d9355354e011d0c2a0c173199..a22ca8563315d3d471e732f9ef541eff5c968bef 100644 (file)
@@ -26,7 +26,7 @@ import com.gitblit.transport.ssh.CommandMetaData;
 import com.gitblit.transport.ssh.IKeyManager;
 
 /** Set a user's account settings. **/
-@CommandMetaData(name = "set-account", description = "Change an account's settings")
+@CommandMetaData(name = "set-account", description = "Change an account's settings", admin = true)
 public class SetAccountCommand extends BaseKeyCommand {
 
        private static final String ALL = "ALL";