From 26746a2f77d377fd7cc6d9e9ef82291dd77eb7d2 Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Sun, 20 Jul 2014 14:22:36 +0200 Subject: [PATCH] added cli sub command to generate unique keys --- .../scm/cli/cmd/GenerateKeySubCommand.java | 55 +++++++++++ .../services/sonia.scm.cli.cmd.SubCommand | 1 + .../resources/sonia/resources/i18n.properties | 3 +- .../scm/client/SecurityClientHandler.java | 8 ++ .../client/JerseySecurityClientHandler.java | 15 +++ .../scm/url/RestSecurityUrlProvider.java | 15 +++ .../sonia/scm/url/SecurityUrlProvider.java | 10 ++ .../scm/api/rest/resources/KeyResource.java | 92 +++++++++++++++++++ 8 files changed, 198 insertions(+), 1 deletion(-) create mode 100644 scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/cmd/GenerateKeySubCommand.java create mode 100644 scm-webapp/src/main/java/sonia/scm/api/rest/resources/KeyResource.java diff --git a/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/cmd/GenerateKeySubCommand.java b/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/cmd/GenerateKeySubCommand.java new file mode 100644 index 0000000000..b8658391b0 --- /dev/null +++ b/scm-clients/scm-cli-client/src/main/java/sonia/scm/cli/cmd/GenerateKeySubCommand.java @@ -0,0 +1,55 @@ +/** + * Copyright (c) 2010, Sebastian Sdorra All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. 2. Redistributions in + * binary form must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. 3. Neither the name of SCM-Manager; + * nor the names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * http://bitbucket.org/sdorra/scm-manager + * + */ + + + +package sonia.scm.cli.cmd; + +/** + * + * @author Sebastian Sdorra + */ +@Command( + name = "generate-key", + usage = "usageGenerateKey", + group = "security" +) +public class GenerateKeySubCommand extends SubCommand +{ + + /** + * Method description + * + */ + @Override + protected void run() + { + output.println(createSession().getSecurityHandler().generateKey()); + } +} diff --git a/scm-clients/scm-cli-client/src/main/resources/META-INF/services/sonia.scm.cli.cmd.SubCommand b/scm-clients/scm-cli-client/src/main/resources/META-INF/services/sonia.scm.cli.cmd.SubCommand index e0d5d85e33..b4d344adae 100644 --- a/scm-clients/scm-cli-client/src/main/resources/META-INF/services/sonia.scm.cli.cmd.SubCommand +++ b/scm-clients/scm-cli-client/src/main/resources/META-INF/services/sonia.scm.cli.cmd.SubCommand @@ -62,6 +62,7 @@ sonia.scm.cli.cmd.DeleteMembersSubCommand # security sonia.scm.cli.cmd.EncryptSubCommand +sonia.scm.cli.cmd.GenerateKeySubCommand # misc sonia.scm.cli.cmd.VersionSubCommand diff --git a/scm-clients/scm-cli-client/src/main/resources/sonia/resources/i18n.properties b/scm-clients/scm-cli-client/src/main/resources/sonia/resources/i18n.properties index ce0fde03e9..69d88b2cfe 100644 --- a/scm-clients/scm-cli-client/src/main/resources/sonia/resources/i18n.properties +++ b/scm-clients/scm-cli-client/src/main/resources/sonia/resources/i18n.properties @@ -119,4 +119,5 @@ usageStoreConfig = Stores the current configuration usageVersion = Show the version of scm-cli-client usageServerVersion = Show the version of the scm-manager -usageEncrypt = Encrypts the given value \ No newline at end of file +usageEncrypt = Encrypts the given value +usageGenerateKey = Generates a unique key \ No newline at end of file diff --git a/scm-clients/scm-client-api/src/main/java/sonia/scm/client/SecurityClientHandler.java b/scm-clients/scm-client-api/src/main/java/sonia/scm/client/SecurityClientHandler.java index 01d6305cb3..a0131a7f1c 100644 --- a/scm-clients/scm-client-api/src/main/java/sonia/scm/client/SecurityClientHandler.java +++ b/scm-clients/scm-client-api/src/main/java/sonia/scm/client/SecurityClientHandler.java @@ -48,4 +48,12 @@ public interface SecurityClientHandler * @return */ public String encrypt(String value); + + /** + * Method description + * + * + * @return + */ + public String generateKey(); } diff --git a/scm-clients/scm-client-impl/src/main/java/sonia/scm/client/JerseySecurityClientHandler.java b/scm-clients/scm-client-impl/src/main/java/sonia/scm/client/JerseySecurityClientHandler.java index 31d3728184..5f24752078 100644 --- a/scm-clients/scm-client-impl/src/main/java/sonia/scm/client/JerseySecurityClientHandler.java +++ b/scm-clients/scm-client-impl/src/main/java/sonia/scm/client/JerseySecurityClientHandler.java @@ -68,6 +68,21 @@ public class JerseySecurityClientHandler implements SecurityClientHandler return session.getClient().resource(url).post(String.class, value); } + /** + * Method description + * + * + * @return + */ + @Override + public String generateKey() + { + String url = + session.getUrlProvider().getSecurityUrlProvider().getGenerateKeyUrl(); + + return session.getClient().resource(url).get(String.class); + } + //~--- fields --------------------------------------------------------------- /** Field description */ diff --git a/scm-core/src/main/java/sonia/scm/url/RestSecurityUrlProvider.java b/scm-core/src/main/java/sonia/scm/url/RestSecurityUrlProvider.java index 08bb2aff43..513f728708 100644 --- a/scm-core/src/main/java/sonia/scm/url/RestSecurityUrlProvider.java +++ b/scm-core/src/main/java/sonia/scm/url/RestSecurityUrlProvider.java @@ -46,6 +46,9 @@ public class RestSecurityUrlProvider implements SecurityUrlProvider /** Field description */ private static final String PATH_ENCRYPT = "security/cipher/encrypt"; + /** Field description */ + private static final String PATH_KEY = "security/key"; + //~--- constructors --------------------------------------------------------- /** @@ -73,6 +76,18 @@ public class RestSecurityUrlProvider implements SecurityUrlProvider return HttpUtil.append(baseUrl, PATH_ENCRYPT); } + /** + * Method description + * + * + * @return + */ + @Override + public String getGenerateKeyUrl() + { + return HttpUtil.append(baseUrl, PATH_KEY); + } + //~--- fields --------------------------------------------------------------- /** Field description */ diff --git a/scm-core/src/main/java/sonia/scm/url/SecurityUrlProvider.java b/scm-core/src/main/java/sonia/scm/url/SecurityUrlProvider.java index 69212ebd2d..e000c9b754 100644 --- a/scm-core/src/main/java/sonia/scm/url/SecurityUrlProvider.java +++ b/scm-core/src/main/java/sonia/scm/url/SecurityUrlProvider.java @@ -39,6 +39,16 @@ package sonia.scm.url; public interface SecurityUrlProvider { + /** + * Method description + * + * + * @return + */ + public String getGenerateKeyUrl(); + + //~--- get methods ---------------------------------------------------------- + /** * Method description * diff --git a/scm-webapp/src/main/java/sonia/scm/api/rest/resources/KeyResource.java b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/KeyResource.java new file mode 100644 index 0000000000..91f2214cd2 --- /dev/null +++ b/scm-webapp/src/main/java/sonia/scm/api/rest/resources/KeyResource.java @@ -0,0 +1,92 @@ +/** + * Copyright (c) 2010, Sebastian Sdorra All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. 2. Redistributions in + * binary form must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. 3. Neither the name of SCM-Manager; + * nor the names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * http://bitbucket.org/sdorra/scm-manager + * + */ + + + +package sonia.scm.api.rest.resources; + +//~--- non-JDK imports -------------------------------------------------------- + +import com.google.inject.Inject; + +import org.apache.shiro.SecurityUtils; + +import sonia.scm.security.KeyGenerator; +import sonia.scm.security.Role; + +//~--- JDK imports ------------------------------------------------------------ + +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; + +/** + * + * @author Sebastian Sdorra + * @since 1.41 + */ +@Path("security/key") +public class KeyResource +{ + + /** + * Constructs ... + * + * + * @param keyGenerator + */ + @Inject + public KeyResource(KeyGenerator keyGenerator) + { + this.keyGenerator = keyGenerator; + } + + //~--- methods -------------------------------------------------------------- + + /** + * Method description + * + * + * @return + */ + @GET + @Produces(MediaType.TEXT_PLAIN) + public String generateKey() + { + SecurityUtils.getSubject().checkRole(Role.ADMIN); + + return keyGenerator.createKey(); + } + + //~--- fields --------------------------------------------------------------- + + /** Field description */ + private final KeyGenerator keyGenerator; +}