From e751c878b04a6d4d341fb8f9492783a70e1ebe86 Mon Sep 17 00:00:00 2001 From: Gunnar Wagenknecht Date: Tue, 30 Oct 2018 13:44:24 +0100 Subject: [PATCH] New GpgConfig for typed access to GPG settings Change-Id: Ifece38132e0390931d33b5678bbbd4a43f9099da Signed-off-by: Gunnar Wagenknecht --- .../org/eclipse/jgit/lib/GpgConfigTest.java | 147 ++++++++++++++++++ .../org/eclipse/jgit/lib/ConfigConstants.java | 30 ++++ .../src/org/eclipse/jgit/lib/GpgConfig.java | 121 ++++++++++++++ 3 files changed, 298 insertions(+) create mode 100644 org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/GpgConfigTest.java create mode 100644 org.eclipse.jgit/src/org/eclipse/jgit/lib/GpgConfig.java diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/GpgConfigTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/GpgConfigTest.java new file mode 100644 index 000000000..2098b17f4 --- /dev/null +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/GpgConfigTest.java @@ -0,0 +1,147 @@ +/* + * Copyright (C) 2018, Salesforce. + * and other copyright owners as documented in the project's IP log. + * + * This program and the accompanying materials are made available + * under the terms of the Eclipse Distribution License v1.0 which + * accompanies this distribution, is reproduced below, and is + * available at http://www.eclipse.org/org/documents/edl-v10.php + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or + * without modification, are permitted provided that the following + * conditions are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - 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. + * + * - Neither the name of the Eclipse Foundation, Inc. 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 COPYRIGHT OWNER 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. + */ +package org.eclipse.jgit.lib; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import org.eclipse.jgit.errors.ConfigInvalidException; +import org.junit.Test; + +public class GpgConfigTest { + + private static Config parse(String content) throws ConfigInvalidException { + final Config c = new Config(null); + c.fromText(content); + return c; + } + + @Test + public void isSignCommits_defaultIsFalse() throws Exception { + Config c = parse(""); + + assertFalse(new GpgConfig(c).isSignCommits()); + } + + @Test + public void isSignCommits_false() throws Exception { + Config c = parse("" // + + "[gpg]\n" // + + " format = x509\n" // + + "[commit]\n" // + + " gpgSign = false\n" // + ); + + assertFalse(new GpgConfig(c).isSignCommits()); + } + + @Test + public void isSignCommits_true() throws Exception { + Config c = parse("" // + + "[commit]\n" // + + " gpgSign = true\n" // + ); + + assertTrue(new GpgConfig(c).isSignCommits()); + } + + @Test + public void testGetKeyFormat_defaultsToOpenpgp() throws Exception { + Config c = parse(""); + + assertEquals(GpgConfig.GpgFormat.OPENPGP, + new GpgConfig(c).getKeyFormat()); + } + + @Test(expected = IllegalArgumentException.class) + public void testGetKeyFormat_failsForInvalidValue() throws Exception { + Config c = parse("" // + + "[gpg]\n" // + + " format = invalid\n" // + ); + + new GpgConfig(c).getKeyFormat(); + fail("Call should not have succeeded!"); + } + + @Test + public void testGetKeyFormat_openpgp() throws Exception { + Config c = parse("" // + + "[gpg]\n" // + + " format = openpgp\n" // + ); + + assertEquals(GpgConfig.GpgFormat.OPENPGP, + new GpgConfig(c).getKeyFormat()); + } + + @Test + public void testGetKeyFormat_x509() throws Exception { + Config c = parse("" // + + "[gpg]\n" // + + " format = x509\n" // + ); + + assertEquals(GpgConfig.GpgFormat.X509, new GpgConfig(c).getKeyFormat()); + } + + @Test + public void testGetSigningKey() throws Exception { + Config c = parse("" // + + "[user]\n" // + + " signingKey = 0x2345\n" // + ); + + assertEquals("0x2345", new GpgConfig(c).getSigningKey()); + } + + @Test + public void testGetSigningKey_defaultToNull() throws Exception { + Config c = parse(""); + + assertNull(new GpgConfig(c).getSigningKey()); + } +} diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/ConfigConstants.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/ConfigConstants.java index 196ce64d0..9763fb72f 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/ConfigConstants.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/ConfigConstants.java @@ -119,6 +119,36 @@ public final class ConfigConstants { */ public static final String CONFIG_FILTER_SECTION = "filter"; + /** + * The "gpg" section + * @since 5.2 + */ + public static final String CONFIG_GPG_SECTION = "gpg"; + + /** + * The "format" key + * @since 5.2 + */ + public static final String CONFIG_KEY_FORMAT = "format"; + + /** + * The "signingKey" key + * @since 5.2 + */ + public static final String CONFIG_KEY_SIGNINGKEY = "signingKey"; + + /** + * The "commit" section + * @since 5.2 + */ + public static final String CONFIG_COMMIT_SECTION = "commit"; + + /** + * The "gpgSign" key + * @since 5.2 + */ + public static final String CONFIG_KEY_GPGSIGN = "gpgSign"; + /** The "algorithm" key */ public static final String CONFIG_KEY_ALGORITHM = "algorithm"; diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/GpgConfig.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/GpgConfig.java new file mode 100644 index 000000000..a09bc0078 --- /dev/null +++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/GpgConfig.java @@ -0,0 +1,121 @@ +/* + * Copyright (C) 2018, Salesforce. + * and other copyright owners as documented in the project's IP log. + * + * This program and the accompanying materials are made available + * under the terms of the Eclipse Distribution License v1.0 which + * accompanies this distribution, is reproduced below, and is + * available at http://www.eclipse.org/org/documents/edl-v10.php + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or + * without modification, are permitted provided that the following + * conditions are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - 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. + * + * - Neither the name of the Eclipse Foundation, Inc. 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 COPYRIGHT OWNER 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. + */ +package org.eclipse.jgit.lib; + +/** + * Typed access to GPG related configuration options. + * + * @since 5.2 + */ +public class GpgConfig { + + /** + * Config values for gpg.format. + */ + public enum GpgFormat implements Config.ConfigEnum { + + /** Value for openpgp */ + OPENPGP("openpgp"), //$NON-NLS-1$ + /** Value for x509 */ + X509("x509"); //$NON-NLS-1$ + + private final String configValue; + + private GpgFormat(String configValue) { + this.configValue = configValue; + } + + @Override + public boolean matchConfigValue(String s) { + return configValue.equals(s); + } + + @Override + public String toConfigValue() { + return configValue; + } + } + + private final Config config; + + /** + * Create a new GPG config, which will read configuration from config. + * + * @param config + * the config to read from + */ + public GpgConfig(Config config) { + this.config = config; + } + + /** + * Retrieves the config value of gpg.format. + * + * @return the {@link org.eclipse.jgit.lib.GpgConfig.GpgFormat} + */ + public GpgFormat getKeyFormat() { + return config.getEnum(GpgFormat.values(), + ConfigConstants.CONFIG_GPG_SECTION, null, + ConfigConstants.CONFIG_KEY_FORMAT, GpgFormat.OPENPGP); + } + + /** + * Retrieves the config value of user.signingKey. + * + * @return the value of user.signingKey (may be null) + */ + public String getSigningKey() { + return config.getString(ConfigConstants.CONFIG_USER_SECTION, null, + ConfigConstants.CONFIG_KEY_SIGNINGKEY); + } + + /** + * Retrieves the config value of commit.gpgSign. + * + * @return the value of commit.gpgSign (defaults to false) + */ + public boolean isSignCommits() { + return config.getBoolean(ConfigConstants.CONFIG_COMMIT_SECTION, + ConfigConstants.CONFIG_KEY_GPGSIGN, false); + } +}