mirror of
https://github.com/pgpainless/pgpainless.git
synced 2024-11-16 17:32:06 +01:00
Start working on PGP-Cert-D-CLI
This commit is contained in:
parent
4dbd2bad7e
commit
603c67127d
10 changed files with 256 additions and 2 deletions
49
pgp-cert-d-cli/build.gradle
Normal file
49
pgp-cert-d-cli/build.gradle
Normal file
|
@ -0,0 +1,49 @@
|
||||||
|
// SPDX-FileCopyrightText: 2021 Paul Schaub <vanitasvitae@fsfe.org>
|
||||||
|
//
|
||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
|
plugins {
|
||||||
|
id 'application'
|
||||||
|
}
|
||||||
|
|
||||||
|
group 'org.pgpainless'
|
||||||
|
|
||||||
|
repositories {
|
||||||
|
mavenCentral()
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
testImplementation "org.junit.jupiter:junit-jupiter-api:$junitVersion"
|
||||||
|
testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:$junitVersion"
|
||||||
|
|
||||||
|
// Logging
|
||||||
|
testImplementation "ch.qos.logback:logback-classic:$logbackVersion"
|
||||||
|
|
||||||
|
implementation project(":pgpainless-cert-d")
|
||||||
|
|
||||||
|
// picocli for cli
|
||||||
|
implementation "info.picocli:picocli:4.6.2"
|
||||||
|
}
|
||||||
|
|
||||||
|
test {
|
||||||
|
useJUnitPlatform()
|
||||||
|
}
|
||||||
|
|
||||||
|
mainClassName = 'pgp.cert_d.cli.PGPCertDCli'
|
||||||
|
|
||||||
|
jar {
|
||||||
|
manifest {
|
||||||
|
attributes 'Main-Class': "$mainClassName"
|
||||||
|
}
|
||||||
|
|
||||||
|
duplicatesStrategy(DuplicatesStrategy.EXCLUDE)
|
||||||
|
|
||||||
|
from {
|
||||||
|
configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) }
|
||||||
|
} {
|
||||||
|
exclude "META-INF/*.SF"
|
||||||
|
exclude "META-INF/*.DSA"
|
||||||
|
exclude "META-INF/*.RSA"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
71
pgp-cert-d-cli/src/main/java/pgp/cert_d/cli/PGPCertDCli.java
Normal file
71
pgp-cert-d-cli/src/main/java/pgp/cert_d/cli/PGPCertDCli.java
Normal file
|
@ -0,0 +1,71 @@
|
||||||
|
// SPDX-FileCopyrightText: 2022 Paul Schaub <vanitasvitae@fsfe.org>
|
||||||
|
//
|
||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
|
package pgp.cert_d.cli;
|
||||||
|
|
||||||
|
import org.pgpainless.certificate_store.CertificateCertificateReader;
|
||||||
|
import org.pgpainless.certificate_store.SharedPGPCertificateDirectoryAdapter;
|
||||||
|
import pgp.cert_d.SharedPGPCertificateDirectoryImpl;
|
||||||
|
import pgp.cert_d.cli.commands.Get;
|
||||||
|
import pgp.cert_d.cli.commands.Insert;
|
||||||
|
import pgp.cert_d.cli.commands.PrintDirectory;
|
||||||
|
import pgp.cert_d.exception.NotAStoreException;
|
||||||
|
import pgp.certificate_store.CertificateStore;
|
||||||
|
import picocli.CommandLine;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
|
||||||
|
@CommandLine.Command(
|
||||||
|
subcommands = {
|
||||||
|
Insert.class,
|
||||||
|
PrintDirectory.class,
|
||||||
|
Get.class,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
public class PGPCertDCli {
|
||||||
|
|
||||||
|
@CommandLine.Option(names = "--base-directory", paramLabel = "DIRECTORY", description = "Overwrite the default certificate directory")
|
||||||
|
File baseDirectory;
|
||||||
|
|
||||||
|
private static CertificateStore certificateStore;
|
||||||
|
private static String baseDir;
|
||||||
|
|
||||||
|
private int executionStrategy(CommandLine.ParseResult parseResult) {
|
||||||
|
try {
|
||||||
|
initStore();
|
||||||
|
} catch (NotAStoreException e) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return new CommandLine.RunLast().execute(parseResult);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void initStore() throws NotAStoreException {
|
||||||
|
SharedPGPCertificateDirectoryImpl certificateDirectory;
|
||||||
|
if (baseDirectory != null) {
|
||||||
|
certificateDirectory = new SharedPGPCertificateDirectoryImpl(
|
||||||
|
baseDirectory,
|
||||||
|
new CertificateCertificateReader());
|
||||||
|
} else {
|
||||||
|
certificateDirectory = new SharedPGPCertificateDirectoryImpl(
|
||||||
|
new CertificateCertificateReader());
|
||||||
|
}
|
||||||
|
baseDir = certificateDirectory.getBaseDirectory().getAbsolutePath();
|
||||||
|
certificateStore = new SharedPGPCertificateDirectoryAdapter(certificateDirectory);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
PGPCertDCli cli = new PGPCertDCli();
|
||||||
|
new CommandLine(cli)
|
||||||
|
.setExecutionStrategy(parserResult -> cli.executionStrategy(parserResult))
|
||||||
|
.execute(args);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static CertificateStore getCertificateDirectory() {
|
||||||
|
return certificateStore;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getBaseDir() {
|
||||||
|
return baseDir;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,43 @@
|
||||||
|
// SPDX-FileCopyrightText: 2022 Paul Schaub <vanitasvitae@fsfe.org>
|
||||||
|
//
|
||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
|
package pgp.cert_d.cli.commands;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import org.bouncycastle.util.io.Streams;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
import pgp.cert_d.cli.PGPCertDCli;
|
||||||
|
import pgp.certificate_store.Certificate;
|
||||||
|
import picocli.CommandLine;
|
||||||
|
|
||||||
|
@CommandLine.Command(name = "get",
|
||||||
|
description = "Retrieve certificates from the store")
|
||||||
|
public class Get implements Runnable {
|
||||||
|
|
||||||
|
private static final Logger LOGGER = LoggerFactory.getLogger(Get.class);
|
||||||
|
|
||||||
|
@CommandLine.Parameters(
|
||||||
|
paramLabel = "IDENTIFIER",
|
||||||
|
arity = "1",
|
||||||
|
description = "Certificate identifier (fingerprint or special name)"
|
||||||
|
)
|
||||||
|
String identifer;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
try {
|
||||||
|
Certificate certificate = PGPCertDCli.getCertificateDirectory()
|
||||||
|
.getCertificate(identifer);
|
||||||
|
if (certificate == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Streams.pipeAll(certificate.getInputStream(), System.out);
|
||||||
|
} catch (IOException e) {
|
||||||
|
LOGGER.info("IO Error", e);
|
||||||
|
System.exit(-1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,42 @@
|
||||||
|
// SPDX-FileCopyrightText: 2022 Paul Schaub <vanitasvitae@fsfe.org>
|
||||||
|
//
|
||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
|
package pgp.cert_d.cli.commands;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
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 picocli.CommandLine;
|
||||||
|
|
||||||
|
@CommandLine.Command(name = "insert",
|
||||||
|
description = "Insert or update a certificate")
|
||||||
|
public class Insert implements Runnable {
|
||||||
|
|
||||||
|
private static final Logger LOGGER = LoggerFactory.getLogger(Insert.class);
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
try {
|
||||||
|
Certificate certificate = PGPCertDCli.getCertificateDirectory().insertCertificate(System.in, new MergeCallback() {
|
||||||
|
@Override
|
||||||
|
public Certificate merge(Certificate data, Certificate existing) {
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
// CHECKSTYLE:OFF
|
||||||
|
System.out.println(certificate.getFingerprint());
|
||||||
|
// CHECKSTYLE:ON
|
||||||
|
} catch (IOException e) {
|
||||||
|
LOGGER.info("IO-Error", e);
|
||||||
|
System.exit(-1);
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
LOGGER.info("Thread interrupted.", e);
|
||||||
|
System.exit(-1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,22 @@
|
||||||
|
// SPDX-FileCopyrightText: 2022 Paul Schaub <vanitasvitae@fsfe.org>
|
||||||
|
//
|
||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
|
package pgp.cert_d.cli.commands;
|
||||||
|
|
||||||
|
import pgp.cert_d.cli.PGPCertDCli;
|
||||||
|
import picocli.CommandLine;
|
||||||
|
|
||||||
|
@CommandLine.Command(
|
||||||
|
name = "print-directory",
|
||||||
|
description = "Print the location of the certificate directory"
|
||||||
|
)
|
||||||
|
public class PrintDirectory implements Runnable {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
// CHECKSTYLE:OFF
|
||||||
|
System.out.println(PGPCertDCli.getBaseDir());
|
||||||
|
// CHECKSTYLE:ON
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,8 @@
|
||||||
|
// SPDX-FileCopyrightText: 2018 Paul Schaub <vanitasvitae@fsfe.org>
|
||||||
|
//
|
||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Subcommands.
|
||||||
|
*/
|
||||||
|
package pgp.cert_d.cli.commands;
|
|
@ -0,0 +1,8 @@
|
||||||
|
// SPDX-FileCopyrightText: 2018 Paul Schaub <vanitasvitae@fsfe.org>
|
||||||
|
//
|
||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Command Line Interface for the Shared PGP Certificate Directory.
|
||||||
|
*/
|
||||||
|
package pgp.cert_d.cli;
|
|
@ -2,12 +2,14 @@
|
||||||
//
|
//
|
||||||
// SPDX-License-Identifier: Apache-2.0
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
package pgp.cert_d;
|
package org.pgpainless.certificate_store;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
|
|
||||||
|
import pgp.cert_d.SharedPGPCertificateDirectory;
|
||||||
|
import pgp.cert_d.SpecialName;
|
||||||
import pgp.cert_d.exception.BadDataException;
|
import pgp.cert_d.exception.BadDataException;
|
||||||
import pgp.cert_d.exception.BadNameException;
|
import pgp.cert_d.exception.BadNameException;
|
||||||
import pgp.certificate_store.Certificate;
|
import pgp.certificate_store.Certificate;
|
|
@ -0,0 +1,8 @@
|
||||||
|
// SPDX-FileCopyrightText: 2018 Paul Schaub <vanitasvitae@fsfe.org>
|
||||||
|
//
|
||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PGPainless + Certificate Store.
|
||||||
|
*/
|
||||||
|
package org.pgpainless.certificate_store;
|
|
@ -9,5 +9,6 @@ include 'pgpainless-core',
|
||||||
'pgpainless-cli',
|
'pgpainless-cli',
|
||||||
'pgpainless-cert-d',
|
'pgpainless-cert-d',
|
||||||
'pgp-certificate-store',
|
'pgp-certificate-store',
|
||||||
'pgp-cert-d-java'
|
'pgp-cert-d-java',
|
||||||
|
'pgp-cert-d-cli'
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue