From d53d62a6e9048d0e4e9c5ea90c5e66506394f29c Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Wed, 16 Feb 2022 15:21:39 +0100 Subject: [PATCH] pgpainless-cert-d-cli: Add experimental multi-import command. This command can be used to import GnuPG key rings by calling gpg --export | java -jar pgpainless-cert-d-cli.jar multi-import --- .../main/java/pgp/cert_d/cli/PGPCertDCli.java | 2 + .../pgp/cert_d/cli/commands/MultiImport.java | 62 +++++++++++++++++++ 2 files changed, 64 insertions(+) create mode 100644 pgpainless-cert-d-cli/src/main/java/pgp/cert_d/cli/commands/MultiImport.java 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 8966c2e6..8115caed 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 @@ -10,6 +10,7 @@ import pgp.cert_d.BaseDirectoryProvider; import pgp.cert_d.SharedPGPCertificateDirectoryImpl; import pgp.cert_d.cli.commands.Get; import pgp.cert_d.cli.commands.Import; +import pgp.cert_d.cli.commands.MultiImport; import pgp.cert_d.jdbc.sqlite.SqliteSubkeyLookup; import pgp.certificate_store.SubkeyLookup; import pgp.certificate_store.exception.NotAStoreException; @@ -22,6 +23,7 @@ import java.sql.SQLException; @CommandLine.Command( subcommands = { Import.class, + MultiImport.class, Get.class, } ) diff --git a/pgpainless-cert-d-cli/src/main/java/pgp/cert_d/cli/commands/MultiImport.java b/pgpainless-cert-d-cli/src/main/java/pgp/cert_d/cli/commands/MultiImport.java new file mode 100644 index 00000000..112403df --- /dev/null +++ b/pgpainless-cert-d-cli/src/main/java/pgp/cert_d/cli/commands/MultiImport.java @@ -0,0 +1,62 @@ +// SPDX-FileCopyrightText: 2022 Paul Schaub +// +// SPDX-License-Identifier: Apache-2.0 + +package pgp.cert_d.cli.commands; + +import org.bouncycastle.openpgp.PGPException; +import org.bouncycastle.openpgp.PGPPublicKeyRing; +import org.bouncycastle.openpgp.PGPPublicKeyRingCollection; +import org.pgpainless.PGPainless; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import pgp.cert_d.cli.PGPCertDCli; +import pgp.certificate_store.Certificate; +import pgp.certificate_store.MergeCallback; +import pgp.certificate_store.exception.BadDataException; +import picocli.CommandLine; + +import java.io.ByteArrayInputStream; +import java.io.IOException; + +@CommandLine.Command(name = "multi-import", + description = "Import or update multiple certificates") +public class MultiImport implements Runnable { + + private static final Logger LOGGER = LoggerFactory.getLogger(MultiImport.class); + + // TODO: Replace with proper merge callback + private final MergeCallback dummyMerge = new MergeCallback() { + @Override + public Certificate merge(Certificate data, Certificate existing) throws IOException { + return data; + } + }; + + @Override + public void run() { + try { + PGPPublicKeyRingCollection certificates = PGPainless.readKeyRing().publicKeyRingCollection(System.in); + for (PGPPublicKeyRing cert : certificates) { + ByteArrayInputStream certIn = new ByteArrayInputStream(cert.getEncoded()); + Certificate certificate = PGPCertDCli.getCertificateDirectory() + .insertCertificate(certIn, dummyMerge); + // CHECKSTYLE:OFF + System.out.println(certificate.getFingerprint()); + // CHECKSTYLE:ON + } + } catch (IOException e) { + LOGGER.error("IO-Error.", e); + System.exit(-1); + } catch (InterruptedException e) { + LOGGER.error("Thread interrupted.", e); + System.exit(-1); + } catch (BadDataException e) { + LOGGER.error("Certificate contains bad data.", e); + System.exit(-1); + } catch (PGPException e) { + LOGGER.error("PGP Exception.", e); + System.exit(-1); + } + } +}