From 52a31cb541e037a24476b87517216c3690086687 Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Fri, 26 Aug 2022 19:46:47 +0200 Subject: [PATCH 1/4] Delete DummyTest --- .../src/test/java/pgp/cert_d/cli/DummyTest.java | 17 ----------------- 1 file changed, 17 deletions(-) delete mode 100644 pgpainless-cert-d-cli/src/test/java/pgp/cert_d/cli/DummyTest.java diff --git a/pgpainless-cert-d-cli/src/test/java/pgp/cert_d/cli/DummyTest.java b/pgpainless-cert-d-cli/src/test/java/pgp/cert_d/cli/DummyTest.java deleted file mode 100644 index 0d3c58d..0000000 --- a/pgpainless-cert-d-cli/src/test/java/pgp/cert_d/cli/DummyTest.java +++ /dev/null @@ -1,17 +0,0 @@ -// SPDX-FileCopyrightText: 2022 Paul Schaub -// -// SPDX-License-Identifier: Apache-2.0 - -package pgp.cert_d.cli; - -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.assertTrue; - -public class DummyTest { - - @Test - public void test() { - assertTrue(true); - } -} From 27ae686d526362b0e6e27bece7b51ee86a0989df Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Sat, 27 Aug 2022 13:38:32 +0200 Subject: [PATCH 2/4] Bump cert-d-java to 0.2.1 and handle NoSuchElementExceptions --- .../src/main/java/pgp/cert_d/cli/commands/Get.java | 3 +++ .../test/java/pgp/cert_d/cli/commands/SetupTest.java | 11 ++++++----- .../cert_d/SharedPGPCertificateDirectoryTest.java | 11 ++++++----- version.gradle | 2 +- 4 files changed, 16 insertions(+), 11 deletions(-) diff --git a/pgpainless-cert-d-cli/src/main/java/pgp/cert_d/cli/commands/Get.java b/pgpainless-cert-d-cli/src/main/java/pgp/cert_d/cli/commands/Get.java index 9422d2e..b06361d 100644 --- a/pgpainless-cert-d-cli/src/main/java/pgp/cert_d/cli/commands/Get.java +++ b/pgpainless-cert-d-cli/src/main/java/pgp/cert_d/cli/commands/Get.java @@ -19,6 +19,7 @@ import pgp.certificate_store.exception.BadNameException; import picocli.CommandLine; import java.io.IOException; +import java.util.NoSuchElementException; @CommandLine.Command(name = "get", resourceBundle = "msg_get") @@ -57,6 +58,8 @@ public class Get implements Runnable { Streams.pipeAll(record.getInputStream(), System.out); } + } catch (NoSuchElementException e) { + LOGGER.debug("Certificate not found.", e); } catch (IOException e) { LOGGER.error("IO Error", e); System.exit(-1); diff --git a/pgpainless-cert-d-cli/src/test/java/pgp/cert_d/cli/commands/SetupTest.java b/pgpainless-cert-d-cli/src/test/java/pgp/cert_d/cli/commands/SetupTest.java index b4664c0..d3a505a 100644 --- a/pgpainless-cert-d-cli/src/test/java/pgp/cert_d/cli/commands/SetupTest.java +++ b/pgpainless-cert-d-cli/src/test/java/pgp/cert_d/cli/commands/SetupTest.java @@ -27,11 +27,12 @@ import java.io.InputStream; import java.nio.charset.Charset; import java.security.InvalidAlgorithmParameterException; import java.security.NoSuchAlgorithmException; +import java.util.NoSuchElementException; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; public class SetupTest { @@ -53,7 +54,7 @@ public class SetupTest { @Test public void testSetupGeneratesTrustRoot() throws BadDataException, IOException { - assertNull(store.getTrustRoot()); + assertThrows(NoSuchElementException.class, () -> store.getTrustRoot()); PGPCertDCli.main(new String[] {"setup"}); KeyMaterial trustRoot = store.getTrustRoot(); @@ -68,7 +69,7 @@ public class SetupTest { @Test public void testSetupWithPassword() throws BadDataException, IOException, PGPException { - assertNull(store.getTrustRoot()); + assertThrows(NoSuchElementException.class, () -> store.getTrustRoot()); PGPCertDCli.main(new String[] {"setup", "--with-password", "sw0rdf1sh"}); KeyMaterial trustRoot = store.getTrustRoot(); @@ -87,7 +88,7 @@ public class SetupTest { public void testSetupImportFromStdin() throws PGPException, InvalidAlgorithmParameterException, NoSuchAlgorithmException, BadDataException, IOException { - assertNull(store.getTrustRoot()); + assertThrows(NoSuchElementException.class, () -> store.getTrustRoot()); PGPSecretKeyRing trustRoot = PGPainless.generateKeyRing() .modernKeyRing("trust-root"); @@ -108,7 +109,7 @@ public class SetupTest { @Test public void testSetupOverridesExistingTrustRoot() throws BadDataException, IOException { - assertNull(store.getTrustRoot()); + assertThrows(NoSuchElementException.class, () -> store.getTrustRoot()); PGPCertDCli.main(new String[] {"setup"}); KeyMaterial trustRoot = store.getTrustRoot(); diff --git a/pgpainless-cert-d/src/test/java/org/pgpainless/cert_d/SharedPGPCertificateDirectoryTest.java b/pgpainless-cert-d/src/test/java/org/pgpainless/cert_d/SharedPGPCertificateDirectoryTest.java index 7b2521b..d3fc5ec 100644 --- a/pgpainless-cert-d/src/test/java/org/pgpainless/cert_d/SharedPGPCertificateDirectoryTest.java +++ b/pgpainless-cert-d/src/test/java/org/pgpainless/cert_d/SharedPGPCertificateDirectoryTest.java @@ -7,7 +7,7 @@ package org.pgpainless.cert_d; import static org.junit.jupiter.api.Assertions.assertArrayEquals; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertThrows; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; @@ -20,6 +20,7 @@ import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.Map; +import java.util.NoSuchElementException; import java.util.Set; import java.util.stream.Stream; @@ -74,8 +75,8 @@ public class SharedPGPCertificateDirectoryTest { OpenPgpFingerprint fingerprint = OpenPgpFingerprint.of(cert); ByteArrayInputStream certIn = new ByteArrayInputStream(cert.getEncoded()); - // standard case: get() is null - assertNull(directory.getByFingerprint(fingerprint.toString().toLowerCase())); + // standard case: no cert found + assertThrows(NoSuchElementException.class, () -> directory.getByFingerprint(fingerprint.toString().toLowerCase())); // insert and check returned certs fingerprint Certificate certificate = directory.insert(certIn, dummyMerge); @@ -99,8 +100,8 @@ public class SharedPGPCertificateDirectoryTest { OpenPgpFingerprint fingerprint = OpenPgpFingerprint.of(trustRoot); ByteArrayInputStream certIn = new ByteArrayInputStream(trustRoot.getEncoded()); - // standard case: get() is null - assertNull(directory.getBySpecialName("trust-root")); + // standard case: no cert found + assertThrows(NoSuchElementException.class, () -> directory.getBySpecialName("trust-root")); // insert and check returned certs fingerprint Certificate certificate = directory.insertWithSpecialName("trust-root", certIn, dummyMerge); diff --git a/version.gradle b/version.gradle index 982e05b..d7f242e 100644 --- a/version.gradle +++ b/version.gradle @@ -13,7 +13,7 @@ allprojects { junitVersion = '5.8.2' mockitoVersion = '4.5.1' pgpainlessVersion = '1.3.5' - pgpCertDJavaVersion = '0.2.0' + pgpCertDJavaVersion = '0.2.1' picocliVersion = '4.6.3' } } From d8a060d0dfd99310ff44108148957cace84f5a52 Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Sat, 27 Aug 2022 13:38:50 +0200 Subject: [PATCH 3/4] Fix typo --- .../src/main/java/pgp/cert_d/cli/commands/Get.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pgpainless-cert-d-cli/src/main/java/pgp/cert_d/cli/commands/Get.java b/pgpainless-cert-d-cli/src/main/java/pgp/cert_d/cli/commands/Get.java index b06361d..3a998e8 100644 --- a/pgpainless-cert-d-cli/src/main/java/pgp/cert_d/cli/commands/Get.java +++ b/pgpainless-cert-d-cli/src/main/java/pgp/cert_d/cli/commands/Get.java @@ -34,16 +34,16 @@ public class Get implements Runnable { paramLabel = "IDENTIFIER", arity = "1" ) - String identifer; + String identifier; @Override public void run() { try { KeyMaterial record; - if (SpecialNames.lookupSpecialName(identifer) != null) { - record = PGPCertDCli.getCertificateDirectory().getBySpecialName(identifer); + if (SpecialNames.lookupSpecialName(identifier) != null) { + record = PGPCertDCli.getCertificateDirectory().getBySpecialName(identifier); } else { - record = PGPCertDCli.getCertificateDirectory().getByFingerprint(identifer.toLowerCase()); + record = PGPCertDCli.getCertificateDirectory().getByFingerprint(identifier.toLowerCase()); } if (record == null) { return; From 76a5a91fe03cca7ba22685c351722181f1b8f1be Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Sat, 27 Aug 2022 13:45:00 +0200 Subject: [PATCH 4/4] Add exit codes for some failure modes --- .../src/main/java/pgp/cert_d/cli/PGPCertDCli.java | 5 ++++- .../src/main/java/pgp/cert_d/cli/commands/Get.java | 7 ++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/pgpainless-cert-d-cli/src/main/java/pgp/cert_d/cli/PGPCertDCli.java b/pgpainless-cert-d-cli/src/main/java/pgp/cert_d/cli/PGPCertDCli.java index 7fbac8f..b22d47f 100644 --- a/pgpainless-cert-d-cli/src/main/java/pgp/cert_d/cli/PGPCertDCli.java +++ b/pgpainless-cert-d-cli/src/main/java/pgp/cert_d/cli/PGPCertDCli.java @@ -42,11 +42,14 @@ public class PGPCertDCli { static PGPainlessCertD certificateDirectory; + // https://www.cyberciti.biz/faq/linux-bash-exit-status-set-exit-statusin-bash/ + public static final int EXIT_CODE_NOT_A_STORE = 30; + private int executionStrategy(CommandLine.ParseResult parseResult) { try { initStore(); } catch (NotAStoreException | SQLException e) { - return -1; + return EXIT_CODE_NOT_A_STORE; } return new CommandLine.RunLast().execute(parseResult); } diff --git a/pgpainless-cert-d-cli/src/main/java/pgp/cert_d/cli/commands/Get.java b/pgpainless-cert-d-cli/src/main/java/pgp/cert_d/cli/commands/Get.java index 3a998e8..6e35ecc 100644 --- a/pgpainless-cert-d-cli/src/main/java/pgp/cert_d/cli/commands/Get.java +++ b/pgpainless-cert-d-cli/src/main/java/pgp/cert_d/cli/commands/Get.java @@ -27,6 +27,10 @@ public class Get implements Runnable { private static final Logger LOGGER = LoggerFactory.getLogger(Get.class); + // https://www.cyberciti.biz/faq/linux-bash-exit-status-set-exit-statusin-bash/ + public static final int EXIT_CODE_NO_SUCH_ELEMENT = 2; + public static final int EXIT_CODE_IO_ERROR = 5; + @CommandLine.Option(names = {"-a", "--armor"}) boolean armor = false; @@ -60,9 +64,10 @@ public class Get implements Runnable { } catch (NoSuchElementException e) { LOGGER.debug("Certificate not found.", e); + System.exit(EXIT_CODE_NO_SUCH_ELEMENT); } catch (IOException e) { LOGGER.error("IO Error", e); - System.exit(-1); + System.exit(EXIT_CODE_IO_ERROR); } catch (BadDataException e) { LOGGER.error("Certificate file contains bad data.", e); System.exit(-1);