diff options
author | James Moger <james.moger@gitblit.com> | 2014-03-19 12:11:53 -0400 |
---|---|---|
committer | James Moger <james.moger@gitblit.com> | 2014-04-10 18:58:09 -0400 |
commit | eec333e07be744bcc3a1fea4449000d48bd5234c (patch) | |
tree | d8580ae85a9214dda2fa773f5a183035953ba704 /src/main/java/com | |
parent | 74732a3b3ac1f48b97d9f58820e0d3de7fefa045 (diff) | |
download | gitblit-eec333e07be744bcc3a1fea4449000d48bd5234c.tar.gz gitblit-eec333e07be744bcc3a1fea4449000d48bd5234c.zip |
Refactor 'gitblit' commands into several nested dispatchers
Diffstat (limited to 'src/main/java/com')
8 files changed, 346 insertions, 313 deletions
diff --git a/src/main/java/com/gitblit/transport/ssh/gitblit/AddKeyCommand.java b/src/main/java/com/gitblit/transport/ssh/gitblit/AddKeyCommand.java deleted file mode 100644 index 6980834b..00000000 --- a/src/main/java/com/gitblit/transport/ssh/gitblit/AddKeyCommand.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * 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.transport.ssh.gitblit; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import org.kohsuke.args4j.Argument; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.gitblit.transport.ssh.commands.CommandMetaData; - -/** - * Add a key to the current user's authorized keys list. - * - * @author James Moger - * - */ -@CommandMetaData(name = "add-key", description = "Add an SSH public key to your account") -public class AddKeyCommand extends BaseKeyCommand { - - protected final Logger log = LoggerFactory.getLogger(getClass()); - - @Argument(metaVar = "<stdin>|KEY", usage = "the key to add") - private List<String> addKeys = new ArrayList<String>(); - - @Override - public void run() throws IOException, UnloggedFailure { - String username = getContext().getClient().getUsername(); - List<String> keys = readKeys(addKeys); - for (String key : keys) { - getKeyManager().addKey(username, key); - log.info("added SSH public key for {}", username); - } - } -} diff --git a/src/main/java/com/gitblit/transport/ssh/gitblit/GitblitDispatcher.java b/src/main/java/com/gitblit/transport/ssh/gitblit/GitblitDispatcher.java index eb3bb0c6..fe9075d2 100644 --- a/src/main/java/com/gitblit/transport/ssh/gitblit/GitblitDispatcher.java +++ b/src/main/java/com/gitblit/transport/ssh/gitblit/GitblitDispatcher.java @@ -24,16 +24,14 @@ public class GitblitDispatcher extends DispatchCommand { @Override protected void registerCommands(UserModel user) { - // normal usage commands + // commands in this dispatcher registerCommand(user, VersionCommand.class); - registerCommand(user, AddKeyCommand.class); - registerCommand(user, RemoveKeyCommand.class); - registerCommand(user, LsCommand.class); - registerCommand(user, ReviewCommand.class); - - // administrative commands - registerCommand(user, LsUsersCommand.class); registerCommand(user, CreateRepository.class); registerCommand(user, SetAccountCommand.class); + + // nested dispatchers + registerDispatcher(user, ListDispatcher.class); + registerDispatcher(user, KeysDispatcher.class); + registerDispatcher(user, TicketsDispatcher.class); } } diff --git a/src/main/java/com/gitblit/transport/ssh/gitblit/KeysDispatcher.java b/src/main/java/com/gitblit/transport/ssh/gitblit/KeysDispatcher.java new file mode 100644 index 00000000..4430c68d --- /dev/null +++ b/src/main/java/com/gitblit/transport/ssh/gitblit/KeysDispatcher.java @@ -0,0 +1,121 @@ +/* + * 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.transport.ssh.gitblit; + +import java.io.IOException; +import java.security.PublicKey; +import java.util.ArrayList; +import java.util.List; + +import org.apache.commons.codec.binary.Base64; +import org.apache.sshd.common.util.Buffer; +import org.kohsuke.args4j.Argument; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.gitblit.models.UserModel; +import com.gitblit.transport.ssh.IPublicKeyManager; +import com.gitblit.transport.ssh.commands.CommandMetaData; +import com.gitblit.transport.ssh.commands.DispatchCommand; +import com.gitblit.transport.ssh.commands.SshCommand; + +/** + * The dispatcher and it's commands for SSH public key management. + * + * @author James Moger + * + */ +@CommandMetaData(name = "keys", description = "SSH public key management commands") +public class KeysDispatcher extends DispatchCommand { + + @Override + protected void registerCommands(UserModel user) { + registerCommand(user, AddKey.class); + registerCommand(user, RemoveKey.class); + registerCommand(user, ListKeys.class); + } + + @CommandMetaData(name = "add", description = "Add an SSH public key to your account") + public static class AddKey extends BaseKeyCommand { + + protected final Logger log = LoggerFactory.getLogger(getClass()); + + @Argument(metaVar = "<stdin>|KEY", usage = "the key to add") + private List<String> addKeys = new ArrayList<String>(); + + @Override + public void run() throws IOException, UnloggedFailure { + String username = getContext().getClient().getUsername(); + List<String> keys = readKeys(addKeys); + for (String key : keys) { + getKeyManager().addKey(username, key); + log.info("added SSH public key for {}", username); + } + } + } + + @CommandMetaData(name = "remove", aliases = { "rm" }, description = "Remove an SSH public key from your account") + public static class RemoveKey extends BaseKeyCommand { + + protected final Logger log = LoggerFactory.getLogger(getClass()); + + private final String ALL = "ALL"; + + @Argument(metaVar = "<stdin>|<KEY>|ALL", usage = "the key to remove") + private List<String> removeKeys = new ArrayList<String>(); + + @Override + public void run() throws IOException, UnloggedFailure { + String username = getContext().getClient().getUsername(); + List<String> keys = readKeys(removeKeys); + if (keys.contains(ALL)) { + getKeyManager().removeAllKeys(username); + log.info("removed all SSH public keys from {}", username); + } else { + for (String key : keys) { + getKeyManager().removeKey(username, key); + log.info("removed SSH public key from {}", username); + } + } + } + } + + @CommandMetaData(name = "list", aliases = { "ls" }, description = "List your public keys") + public static class ListKeys extends SshCommand { + + @Override + public void run() { + IPublicKeyManager keyManager = getContext().getGitblit().getPublicKeyManager(); + List<PublicKey> keys = keyManager.getKeys(getContext().getClient().getUsername()); + + for (PublicKey key : keys) { + // two-steps - perhaps this could be improved + Buffer buf = new Buffer(); + + // 1: identify the algorithm + buf.putRawPublicKey(key); + String alg = buf.getString(); + + // 2: encode the key + buf.clear(); + buf.putPublicKey(key); + String b64 = Base64.encodeBase64String(buf.getBytes()); + + stdout.println(alg + " " + b64); + } + } + } +} diff --git a/src/main/java/com/gitblit/transport/ssh/gitblit/ListDispatcher.java b/src/main/java/com/gitblit/transport/ssh/gitblit/ListDispatcher.java new file mode 100644 index 00000000..0c372df0 --- /dev/null +++ b/src/main/java/com/gitblit/transport/ssh/gitblit/ListDispatcher.java @@ -0,0 +1,190 @@ +/* + * 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.transport.ssh.gitblit; + +import java.text.MessageFormat; +import java.text.SimpleDateFormat; +import java.util.List; + +import org.kohsuke.args4j.Option; +import org.parboiled.common.StringUtils; + +import com.gitblit.manager.IGitblit; +import com.gitblit.models.ProjectModel; +import com.gitblit.models.RepositoryModel; +import com.gitblit.models.UserModel; +import com.gitblit.transport.ssh.commands.CommandMetaData; +import com.gitblit.transport.ssh.commands.DispatchCommand; +import com.gitblit.transport.ssh.commands.SshCommand; + +/** + * The dispatcher and it's commands for Gitblit object listing. + * + * @author James Moger + * + */ +@CommandMetaData(name = "list", aliases = { "ls" }, description = "Gitblit object list commands") +public class ListDispatcher extends DispatchCommand { + + @Override + protected void registerCommands(UserModel user) { + registerCommand(user, ListRepositories.class); + registerCommand(user, ListProjects.class); + registerCommand(user, ListUsers.class); + registerCommand(user, ListKeys.class); + } + + /* List SSH public keys */ + @CommandMetaData(name = "keys", description = "List your public keys") + public static class ListKeys extends KeysDispatcher.ListKeys { + } + + /* List repositories */ + @CommandMetaData(name = "repositories", aliases = { "repos" }, description = "List repositories") + public static class ListRepositories extends SshCommand { + + @Option(name = "--verbose", aliases = { "-v" }, usage = "verbose") + private boolean verbose; + + @Override + public void run() { + IGitblit gitblit = getContext().getGitblit(); + UserModel user = getContext().getClient().getUser(); + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd"); + + List<RepositoryModel> repositories = gitblit.getRepositoryModels(user); + int nameLen = 0; + int descLen = 0; + for (RepositoryModel repo : repositories) { + int len = repo.name.length(); + if (len > nameLen) { + nameLen = len; + } + if (!StringUtils.isEmpty(repo.description)) { + len = repo.description.length(); + if (len > descLen) { + descLen = len; + } + } + } + + String pattern; + if (verbose) { + pattern = MessageFormat.format("%-{0,number,0}s\t%-{1,number,0}s\t%s", nameLen, descLen); + } else { + pattern = "%s"; + } + + for (RepositoryModel repo : repositories) { + stdout.println(String.format(pattern, + repo.name, + repo.description == null ? "" : repo.description, + df.format(repo.lastChange))); + } + } + } + + /* List projects */ + @CommandMetaData(name = "projects", description = "List projects") + public static class ListProjects extends SshCommand { + + @Option(name = "--verbose", aliases = { "-v" }, usage = "verbose") + private boolean verbose; + + @Override + public void run() { + IGitblit gitblit = getContext().getGitblit(); + UserModel user = getContext().getClient().getUser(); + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd"); + + List<ProjectModel> projects = gitblit.getProjectModels(user, false); + int nameLen = 0; + int descLen = 0; + for (ProjectModel project : projects) { + int len = project.name.length(); + if (len > nameLen) { + nameLen = len; + } + if (!StringUtils.isEmpty(project.description)) { + len = project.description.length(); + if (len > descLen) { + descLen = len; + } + } + } + + String pattern; + if (verbose) { + pattern = MessageFormat.format("%-{0,number,0}s\t%-{1,number,0}s\t%s", nameLen, descLen); + } else { + pattern = "%s"; + } + + for (ProjectModel project : projects) { + stdout.println(String.format(pattern, + project.name, + project.description == null ? "" : project.description, + df.format(project.lastChange))); + } + } + } + + /* List users */ + @CommandMetaData(name = "users", description = "List users", admin = true) + public static class ListUsers extends SshCommand { + + @Option(name = "--verbose", aliases = { "-v" }, usage = "verbose") + private boolean verbose; + + @Override + public void run() { + IGitblit gitblit = getContext().getGitblit(); + List<UserModel> users = gitblit.getAllUsers(); + int displaynameLen = 0; + int usernameLen = 0; + for (UserModel user : users) { + int len = user.getDisplayName().length(); + if (len > displaynameLen) { + displaynameLen = len; + } + if (!StringUtils.isEmpty(user.username)) { + len = user.username.length(); + if (len > usernameLen) { + usernameLen = len; + } + } + } + + String pattern; + if (verbose) { + pattern = MessageFormat.format("%-{0,number,0}s\t%-{1,number,0}s\t%-10s\t%s", displaynameLen, usernameLen); + } else { + pattern = MessageFormat.format("%-{0,number,0}s\t%-{1,number,0}s", displaynameLen, usernameLen); + } + + for (UserModel user : users) { + if (user.disabled) { + continue; + } + stdout.println(String.format(pattern, + user.getDisplayName(), + (user.canAdmin() ? "*":" ") + user.username, + user.accountType, + user.emailAddress == null ? "" : user.emailAddress)); + } + } + } +} diff --git a/src/main/java/com/gitblit/transport/ssh/gitblit/LsCommand.java b/src/main/java/com/gitblit/transport/ssh/gitblit/LsCommand.java deleted file mode 100644 index 1f0d06c6..00000000 --- a/src/main/java/com/gitblit/transport/ssh/gitblit/LsCommand.java +++ /dev/null @@ -1,122 +0,0 @@ -/* - * 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.transport.ssh.gitblit; - -import java.text.MessageFormat; -import java.text.SimpleDateFormat; -import java.util.List; - -import org.kohsuke.args4j.Option; -import org.parboiled.common.StringUtils; - -import com.gitblit.manager.IGitblit; -import com.gitblit.models.ProjectModel; -import com.gitblit.models.RepositoryModel; -import com.gitblit.models.UserModel; -import com.gitblit.transport.ssh.commands.CommandMetaData; -import com.gitblit.transport.ssh.commands.SshCommand; - -@CommandMetaData(name = "ls", description = "List repositories or projects") -public class LsCommand extends SshCommand { - - @Option(name = "--projects", aliases = { "-p" }, usage = "list projects") - private boolean projects; - - @Option(name = "--verbose", aliases = { "-v" }, usage = "verbose") - private boolean verbose; - - @Override - public void run() { - if (projects) { - listProjects(); - } else { - listRepositories(); - } - } - - protected void listProjects() { - IGitblit gitblit = getContext().getGitblit(); - UserModel user = getContext().getClient().getUser(); - SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd"); - - List<ProjectModel> projects = gitblit.getProjectModels(user, false); - int nameLen = 0; - int descLen = 0; - for (ProjectModel project : projects) { - int len = project.name.length(); - if (len > nameLen) { - nameLen = len; - } - if (!StringUtils.isEmpty(project.description)) { - len = project.description.length(); - if (len > descLen) { - descLen = len; - } - } - } - - String pattern; - if (verbose) { - pattern = MessageFormat.format("%-{0,number,0}s\t%-{1,number,0}s\t%s", nameLen, descLen); - } else { - pattern = "%s"; - } - - for (ProjectModel project : projects) { - stdout.println(String.format(pattern, - project.name, - project.description == null ? "" : project.description, - df.format(project.lastChange))); - } - } - - protected void listRepositories() { - IGitblit gitblit = getContext().getGitblit(); - UserModel user = getContext().getClient().getUser(); - SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd"); - - List<RepositoryModel> repositories = gitblit.getRepositoryModels(user); - int nameLen = 0; - int descLen = 0; - for (RepositoryModel repo : repositories) { - int len = repo.name.length(); - if (len > nameLen) { - nameLen = len; - } - if (!StringUtils.isEmpty(repo.description)) { - len = repo.description.length(); - if (len > descLen) { - descLen = len; - } - } - } - - String pattern; - if (verbose) { - pattern = MessageFormat.format("%-{0,number,0}s\t%-{1,number,0}s\t%s", nameLen, descLen); - } else { - pattern = "%s"; - } - - for (RepositoryModel repo : repositories) { - stdout.println(String.format(pattern, - repo.name, - repo.description == null ? "" : repo.description, - df.format(repo.lastChange))); - } - } -} diff --git a/src/main/java/com/gitblit/transport/ssh/gitblit/LsUsersCommand.java b/src/main/java/com/gitblit/transport/ssh/gitblit/LsUsersCommand.java deleted file mode 100644 index e59e8b97..00000000 --- a/src/main/java/com/gitblit/transport/ssh/gitblit/LsUsersCommand.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * 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.transport.ssh.gitblit; - -import java.text.MessageFormat; -import java.util.List; - -import org.kohsuke.args4j.Option; -import org.parboiled.common.StringUtils; - -import com.gitblit.manager.IGitblit; -import com.gitblit.models.UserModel; -import com.gitblit.transport.ssh.commands.CommandMetaData; -import com.gitblit.transport.ssh.commands.SshCommand; - -@CommandMetaData(name = "ls-users", description = "List users", admin = true) -public class LsUsersCommand extends SshCommand { - - @Option(name = "--verbose", aliases = { "-v" }, usage = "verbose") - private boolean verbose; - - @Override - public void run() { - IGitblit gitblit = getContext().getGitblit(); - List<UserModel> users = gitblit.getAllUsers(); - int displaynameLen = 0; - int usernameLen = 0; - for (UserModel user : users) { - int len = user.getDisplayName().length(); - if (len > displaynameLen) { - displaynameLen = len; - } - if (!StringUtils.isEmpty(user.username)) { - len = user.username.length(); - if (len > usernameLen) { - usernameLen = len; - } - } - } - - String pattern; - if (verbose) { - pattern = MessageFormat.format("%-{0,number,0}s\t%-{1,number,0}s\t%-10s\t%s", displaynameLen, usernameLen); - } else { - pattern = MessageFormat.format("%-{0,number,0}s\t%-{1,number,0}s", displaynameLen, usernameLen); - } - - for (UserModel user : users) { - if (user.disabled) { - continue; - } - stdout.println(String.format(pattern, - user.getDisplayName(), - (user.canAdmin() ? "*":" ") + user.username, - user.accountType, - user.emailAddress == null ? "" : user.emailAddress)); - } - } -} diff --git a/src/main/java/com/gitblit/transport/ssh/gitblit/RemoveKeyCommand.java b/src/main/java/com/gitblit/transport/ssh/gitblit/RemoveKeyCommand.java deleted file mode 100644 index 915dbc03..00000000 --- a/src/main/java/com/gitblit/transport/ssh/gitblit/RemoveKeyCommand.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * 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.transport.ssh.gitblit; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import org.kohsuke.args4j.Argument; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.gitblit.transport.ssh.commands.CommandMetaData; - - -/** - * Remove an SSH public key from the current user's authorized key list. - * - * @author James Moger - * - */ -@CommandMetaData(name = "rm-key", description = "Remove an SSH public key from your account") -public class RemoveKeyCommand extends BaseKeyCommand { - - protected final Logger log = LoggerFactory.getLogger(getClass()); - - private static final String ALL = "ALL"; - - @Argument(metaVar = "<stdin>|<KEY>|ALL", usage = "the key to remove") - private List<String> removeKeys = new ArrayList<String>(); - - @Override - public void run() throws IOException, UnloggedFailure { - String username = getContext().getClient().getUsername(); - List<String> keys = readKeys(removeKeys); - if (keys.contains(ALL)) { - getKeyManager().removeAllKeys(username); - log.info("removed all SSH public keys from {}", username); - } else { - for (String key : keys) { - getKeyManager().removeKey(username, key); - log.info("removed SSH public key from {}", username); - } - } - } -} diff --git a/src/main/java/com/gitblit/transport/ssh/gitblit/TicketsDispatcher.java b/src/main/java/com/gitblit/transport/ssh/gitblit/TicketsDispatcher.java new file mode 100644 index 00000000..ca75a6c3 --- /dev/null +++ b/src/main/java/com/gitblit/transport/ssh/gitblit/TicketsDispatcher.java @@ -0,0 +1,29 @@ +/* + * 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.transport.ssh.gitblit; + +import com.gitblit.models.UserModel; +import com.gitblit.transport.ssh.commands.CommandMetaData; +import com.gitblit.transport.ssh.commands.DispatchCommand; + +@CommandMetaData(name = "tickets", description = "Ticket commands", hidden = true) +public class TicketsDispatcher extends DispatchCommand { + + @Override + protected void registerCommands(UserModel user) { + registerCommand(user, ReviewCommand.class); + } +} |