diff --git a/.reuse/dep5 b/.reuse/dep5 index b8bb6be..b613adc 100644 --- a/.reuse/dep5 +++ b/.reuse/dep5 @@ -13,3 +13,8 @@ Source: https://pgpainless.org Files: gradle* Copyright: 2015 the original author or authors. License: Apache-2.0 + +# Woodpecker build files +Files: .woodpecker/* +Copyright: 2022 the original author or authors. +License: Apache-2.0 diff --git a/.woodpecker/.build.yml b/.woodpecker/.build.yml new file mode 100644 index 0000000..f504b44 --- /dev/null +++ b/.woodpecker/.build.yml @@ -0,0 +1,12 @@ +pipeline: + run: + image: gradle:7.5-jdk8 + commands: + - git checkout $CI_COMMIT_BRANCH + # Code works + - gradle test + # Code is clean + - gradle check javadocAll + # Code has coverage + - gradle jacocoRootReport coveralls + secrets: [COVERALLS_REPO_TOKEN] diff --git a/.woodpecker/.reuse.yml b/.woodpecker/.reuse.yml new file mode 100644 index 0000000..58f17e6 --- /dev/null +++ b/.woodpecker/.reuse.yml @@ -0,0 +1,7 @@ +# Code is licensed properly +# See https://reuse.software/ +pipeline: + reuse: + image: fsfe/reuse:latest + commands: + - reuse lint \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index a40aa7e..ea017bc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,8 +6,14 @@ SPDX-License-Identifier: Apache-2.0 # Changelog +## 0.1.2 +- Bump `pgpainless-core` to `1.5.6` +- Bump `cert-d-pgpainless` to `0.2.2` +- Bump `cert-d-java` to `0.2.2` + ## 0.1.1 - Bump `pgpainless-core` to `1.2.1` +- Bump `cert-d-pgpainless` to `0.1.2` - Bump `pgp-certificate-store` to `0.1.1` - Bump `slf4j` to `1.7.36` - Bump `logback` to `1.2.11` diff --git a/README.md b/README.md index 90e6132..98d25c6 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,10 @@ SPDX-License-Identifier: Apache-2.0 # Web Key Directory for Java +[![status-badge](https://ci.codeberg.org/api/badges/PGPainless/wkd-java/status.svg)](https://ci.codeberg.org/PGPainless/wkd-java) +[![Coverage Status](https://coveralls.io/repos/github/pgpainless/wkd-java/badge.svg?branch=main)](https://coveralls.io/github/pgpainless/wkd-java?branch=main) +[![REUSE status](https://api.reuse.software/badge/github.com/pgpainless/wkd-java)](https://api.reuse.software/info/github.com/pgpainless/wkd-java) + Client-side API for fetching OpenPGP certificates via the [Web Key Directory](https://www.ietf.org/archive/id/draft-koch-openpgp-webkey-service-13.html) protocol. ## Modules diff --git a/version.gradle b/version.gradle index ec704c3..b13e945 100644 --- a/version.gradle +++ b/version.gradle @@ -4,22 +4,22 @@ allprojects { ext { - shortVersion = '0.1.1' - isSnapshot = false + shortVersion = '0.1.3' + isSnapshot = true minAndroidSdk = 10 javaSourceCompatibility = 1.8 - jacksonDataBindVersion = '2.13.2.2' - jacksonDataFormatXmlVersion = '2.13.2' + jacksonDataBindVersion = '2.15.2' + jacksonDataFormatXmlVersion = '2.15.2' junitVersion = '5.8.2' junitSysExitVersion = '1.1.2' jsrVersion = '3.0.2' slf4jVersion = '1.7.36' logbackVersion = '1.2.11' mockitoVersion = '4.5.1' - pgpainlessVersion = '1.2.1' - pgpainlessCertDVersion = '0.1.2' + pgpainlessVersion = '1.5.6' + pgpainlessCertDVersion = '0.2.2' picocliVersion = '4.6.3' - certDJavaVersion = '0.1.1' + certDJavaVersion = '0.2.2' zbase32Version = '1.0.0' } } diff --git a/wkd-java-cli/src/main/java/pgp/wkd/cli/PGPainlessCertificateParser.java b/wkd-java-cli/src/main/java/pgp/wkd/cli/PGPainlessCertificateParser.java index 8aeb723..245ca33 100644 --- a/wkd-java-cli/src/main/java/pgp/wkd/cli/PGPainlessCertificateParser.java +++ b/wkd-java-cli/src/main/java/pgp/wkd/cli/PGPainlessCertificateParser.java @@ -6,11 +6,11 @@ package pgp.wkd.cli; import org.bouncycastle.openpgp.PGPException; import org.bouncycastle.openpgp.PGPPublicKeyRing; -import org.bouncycastle.openpgp.PGPPublicKeyRingCollection; import org.pgpainless.PGPainless; import org.pgpainless.certificate_store.CertificateFactory; +import org.pgpainless.key.collection.PGPKeyRingCollection; import org.pgpainless.key.info.KeyRingInfo; -import pgp.certificate_store.Certificate; +import pgp.certificate_store.certificate.Certificate; import pgp.wkd.CertificateAndUserIds; import pgp.wkd.discovery.CertificateParser; @@ -24,10 +24,13 @@ public class PGPainlessCertificateParser implements CertificateParser { public List read(InputStream inputStream) throws IOException { List certificatesAndUserIds = new ArrayList<>(); try { - PGPPublicKeyRingCollection certificates = PGPainless.readKeyRing().publicKeyRingCollection(inputStream); - for (PGPPublicKeyRing certificate : certificates) { + PGPKeyRingCollection keyMaterial = PGPainless.readKeyRing().keyRingCollection(inputStream, true); + if (keyMaterial.getPGPSecretKeyRingCollection().size() != 0) { + throw new PGPException("Secret key material encountered!"); + } + for (PGPPublicKeyRing certificate : keyMaterial.getPgpPublicKeyRingCollection()) { KeyRingInfo info = PGPainless.inspectKeyRing(certificate); - Certificate parsedCert = CertificateFactory.certificateFromPublicKeyRing(certificate); + Certificate parsedCert = CertificateFactory.certificateFromPublicKeyRing(certificate, 0L); List userIds = info.getValidAndExpiredUserIds(); certificatesAndUserIds.add(new CertificateAndUserIds(parsedCert, userIds)); } diff --git a/wkd-java-cli/src/main/java/pgp/wkd/cli/WKDCLI.java b/wkd-java-cli/src/main/java/pgp/wkd/cli/WKDCLI.java index 4fed57d..9615cc4 100644 --- a/wkd-java-cli/src/main/java/pgp/wkd/cli/WKDCLI.java +++ b/wkd-java-cli/src/main/java/pgp/wkd/cli/WKDCLI.java @@ -11,7 +11,7 @@ import picocli.CommandLine; @CommandLine.Command( name = "wkd", - description = "Interact with the Web Key Directory", + resourceBundle = "msg_wkd", subcommands = { CommandLine.HelpCommand.class, GetCmd.class diff --git a/wkd-java-cli/src/main/java/pgp/wkd/cli/command/GetCmd.java b/wkd-java-cli/src/main/java/pgp/wkd/cli/command/GetCmd.java index b5d7c05..1606897 100644 --- a/wkd-java-cli/src/main/java/pgp/wkd/cli/command/GetCmd.java +++ b/wkd-java-cli/src/main/java/pgp/wkd/cli/command/GetCmd.java @@ -21,22 +21,18 @@ import java.io.OutputStream; @CommandLine.Command( name = "get", - description = "Get an OpenPGP Certificate via the Web Key Directory" + resourceBundle = "msg_get" ) public class GetCmd implements Runnable { @CommandLine.Parameters( index = "0", arity = "1", - paramLabel = "USERID", - description = "Certificate User-ID" - ) + paramLabel = "USERID") String userId; @CommandLine.Option( - names = {"-a", "--armor"}, - description = "ASCII Armor the output" - ) + names = {"-a", "--armor"}) boolean armor = false; public static final CertificateDiscoverer DEFAULT_DISCOVERER = new ValidatingCertificateDiscoverer( diff --git a/wkd-java-cli/src/main/resources/msg_get.properties b/wkd-java-cli/src/main/resources/msg_get.properties new file mode 100644 index 0000000..e3d5714 --- /dev/null +++ b/wkd-java-cli/src/main/resources/msg_get.properties @@ -0,0 +1,12 @@ +# SPDX-FileCopyrightText: 2022 Paul Schaub +# +# SPDX-License-Identifier: Apache-2.0 +usage.header=Get an OpenPGP Certificate via the Web Key Directory +USERID[0]=Certificate User-ID +armor=ASCII Armor the output + +# Generic TODO: Remove when bumping picocli to 4.7.0 +usage.synopsisHeading=Usage:\u0020 +usage.commandListHeading = %nCommands:%n +usage.optionListHeading = %nOptions:%n +usage.footerHeading=Powered by picocli%n diff --git a/wkd-java-cli/src/main/resources/msg_get_de.properties b/wkd-java-cli/src/main/resources/msg_get_de.properties new file mode 100644 index 0000000..dc1e396 --- /dev/null +++ b/wkd-java-cli/src/main/resources/msg_get_de.properties @@ -0,0 +1,12 @@ +# SPDX-FileCopyrightText: 2022 Paul Schaub +# +# SPDX-License-Identifier: Apache-2.0 +usage.header=Empfange ein OpenPGP Zertifikat mithilfe des Web Key Directory +USERID[0]=Nutzeridentität des Zertifikats +armor=Schütze die Ausgabe mit ASCII Armor + +# Generic TODO: Remove when bumping picocli to 4.7.0 +usage.synopsisHeading=Aufruf:\u0020 +usage.commandListHeading=%nBefehle:%n +usage.optionListHeading = %nOptionen:%n +usage.footerHeading=Powered by Picocli%n diff --git a/wkd-java-cli/src/main/resources/msg_wkd.properties b/wkd-java-cli/src/main/resources/msg_wkd.properties new file mode 100644 index 0000000..cd73615 --- /dev/null +++ b/wkd-java-cli/src/main/resources/msg_wkd.properties @@ -0,0 +1,10 @@ +# SPDX-FileCopyrightText: 2022 Paul Schaub +# +# SPDX-License-Identifier: Apache-2.0 +usage.header=Interact with the Web Key Directory + +# Generic TODO: Remove when bumping picocli to 4.7.0 +usage.synopsisHeading=Usage:\u0020 +usage.commandListHeading = %nCommands:%n +usage.optionListHeading = %nOptions:%n +usage.footerHeading=Powered by picocli%n diff --git a/wkd-java-cli/src/main/resources/msg_wkd_de.properties b/wkd-java-cli/src/main/resources/msg_wkd_de.properties new file mode 100644 index 0000000..b87f2a8 --- /dev/null +++ b/wkd-java-cli/src/main/resources/msg_wkd_de.properties @@ -0,0 +1,10 @@ +# SPDX-FileCopyrightText: 2022 Paul Schaub +# +# SPDX-License-Identifier: Apache-2.0 +usage.header=Interagiere mit dem Web Key Directory + +# Generic TODO: Remove when bumping picocli to 4.7.0 +usage.synopsisHeading=Aufruf:\u0020 +usage.commandListHeading=%nBefehle:%n +usage.optionListHeading = %nOptionen:%n +usage.footerHeading=Powered by Picocli%n diff --git a/wkd-java-cli/src/test/java/pgp/wkd/cli/online_test_vectors/TestGetKeysFromGithubPages.java b/wkd-java-cli/src/test/java/pgp/wkd/cli/online_test_vectors/TestGetKeysFromGithubPages.java index fa96e4a..25bcd55 100644 --- a/wkd-java-cli/src/test/java/pgp/wkd/cli/online_test_vectors/TestGetKeysFromGithubPages.java +++ b/wkd-java-cli/src/test/java/pgp/wkd/cli/online_test_vectors/TestGetKeysFromGithubPages.java @@ -16,7 +16,7 @@ public class TestGetKeysFromGithubPages extends RedirectSystemStreamsTest { // Valid WKD publication. // Cert is available at https://pgpainless.github.io/.well-known/openpgpkey/hu/eprjcbeppbna3f6xabhtpddzpn41nknw - private static final String USERID_BASE = "WKD Test [Base Case - Valid User-ID]"; + private static final String USERID_BASE = "WKD Test (Base Case - Valid User-ID) "; private static final String MAIL_BASE = "wkd-test-base@pgpainless.github.io"; @Test diff --git a/wkd-java/src/main/java/pgp/wkd/CertificateAndUserIds.java b/wkd-java/src/main/java/pgp/wkd/CertificateAndUserIds.java index 5c0b606..f964805 100644 --- a/wkd-java/src/main/java/pgp/wkd/CertificateAndUserIds.java +++ b/wkd-java/src/main/java/pgp/wkd/CertificateAndUserIds.java @@ -4,7 +4,7 @@ package pgp.wkd; -import pgp.certificate_store.Certificate; +import pgp.certificate_store.certificate.Certificate; import java.util.ArrayList; import java.util.List; diff --git a/wkd-java/src/main/java/pgp/wkd/RejectedCertificate.java b/wkd-java/src/main/java/pgp/wkd/RejectedCertificate.java index 7a227b4..f96b85e 100644 --- a/wkd-java/src/main/java/pgp/wkd/RejectedCertificate.java +++ b/wkd-java/src/main/java/pgp/wkd/RejectedCertificate.java @@ -4,7 +4,8 @@ package pgp.wkd; -import pgp.certificate_store.Certificate; + +import pgp.certificate_store.certificate.Certificate; /** * A rejected OpenPGP certificate. diff --git a/wkd-java/src/main/java/pgp/wkd/discovery/DiscoveryResponse.java b/wkd-java/src/main/java/pgp/wkd/discovery/DiscoveryResponse.java index e1b6ac1..d48a2ce 100644 --- a/wkd-java/src/main/java/pgp/wkd/discovery/DiscoveryResponse.java +++ b/wkd-java/src/main/java/pgp/wkd/discovery/DiscoveryResponse.java @@ -4,7 +4,7 @@ package pgp.wkd.discovery; -import pgp.certificate_store.Certificate; +import pgp.certificate_store.certificate.Certificate; import pgp.wkd.RejectedCertificate; import pgp.wkd.WKDAddress; import pgp.wkd.exception.MissingPolicyFileException; @@ -12,6 +12,7 @@ import pgp.wkd.exception.MissingPolicyFileException; import javax.annotation.Nonnull; import javax.annotation.Nullable; import java.net.URI; +import java.util.ArrayList; import java.util.List; /** @@ -170,8 +171,8 @@ public final class DiscoveryResponse { private DiscoveryMethod discoveryMethod; private WKDAddress address; - private List acceptableCertificates; - private List rejectedCertificates; + private List acceptableCertificates = new ArrayList<>(); + private List rejectedCertificates = new ArrayList<>(); private Throwable fetchingFailure; private WKDPolicy policy; private MissingPolicyFileException missingPolicyFileException; diff --git a/wkd-java/src/main/java/pgp/wkd/discovery/DiscoveryResult.java b/wkd-java/src/main/java/pgp/wkd/discovery/DiscoveryResult.java index 0030812..6946891 100644 --- a/wkd-java/src/main/java/pgp/wkd/discovery/DiscoveryResult.java +++ b/wkd-java/src/main/java/pgp/wkd/discovery/DiscoveryResult.java @@ -4,7 +4,7 @@ package pgp.wkd.discovery; -import pgp.certificate_store.Certificate; +import pgp.certificate_store.certificate.Certificate; import pgp.wkd.exception.CertNotFetchableException; import javax.annotation.Nonnull; diff --git a/wkd-java/src/main/java/pgp/wkd/discovery/ValidatingCertificateDiscoverer.java b/wkd-java/src/main/java/pgp/wkd/discovery/ValidatingCertificateDiscoverer.java index 2613ce8..09f6984 100644 --- a/wkd-java/src/main/java/pgp/wkd/discovery/ValidatingCertificateDiscoverer.java +++ b/wkd-java/src/main/java/pgp/wkd/discovery/ValidatingCertificateDiscoverer.java @@ -4,7 +4,7 @@ package pgp.wkd.discovery; -import pgp.certificate_store.Certificate; +import pgp.certificate_store.certificate.Certificate; import pgp.wkd.CertificateAndUserIds; import pgp.wkd.exception.MissingPolicyFileException; import pgp.wkd.exception.RejectedCertificateException; diff --git a/wkd-test-suite/src/main/java/pgp/wkd/test_suite/AbstractTestSuiteGenerator.java b/wkd-test-suite/src/main/java/pgp/wkd/test_suite/AbstractTestSuiteGenerator.java index a27af24..99ad9b5 100644 --- a/wkd-test-suite/src/main/java/pgp/wkd/test_suite/AbstractTestSuiteGenerator.java +++ b/wkd-test-suite/src/main/java/pgp/wkd/test_suite/AbstractTestSuiteGenerator.java @@ -38,7 +38,7 @@ public class AbstractTestSuiteGenerator { } protected PGPSecretKeyRing secretKey(String userId) throws PGPException, InvalidAlgorithmParameterException, NoSuchAlgorithmException { - PGPSecretKeyRing secretKeys = PGPainless.generateKeyRing().modernKeyRing(userId, null); + PGPSecretKeyRing secretKeys = PGPainless.generateKeyRing().modernKeyRing(userId); return secretKeys; }