Reuse other CLI components in PGPeasy

This commit is contained in:
Paul Schaub 2022-04-11 19:07:09 +02:00
parent a0c2fc468a
commit 76dde5c91f
14 changed files with 76 additions and 203 deletions

View file

@ -5,19 +5,27 @@ plugins {
group 'org.pgpainless' group 'org.pgpainless'
version '0.1.0-SNAPSHOT' version '0.1.0-SNAPSHOT'
apply from: 'version.gradle'
repositories { repositories {
mavenCentral() mavenCentral()
mavenLocal()
} }
dependencies { dependencies {
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1' testImplementation "org.junit.jupiter:junit-jupiter-api:$junitVersion"
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1' testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:$junitVersion"
// CLI // CLI
implementation 'info.picocli:picocli:4.6.3' implementation "info.picocli:picocli:$picocliVersion"
// PGPainless implementation "org.pgpainless:pgpainless-cli:$pgpainlessVersion"
implementation "org.pgpainless:pgpainless-core:1.1.2" implementation "org.pgpainless:sop-java-picocli:$sopJavaVersion"
implementation ("org.pgpainless:wkd-java-cli:$wkdVersion") {
exclude group:'rg.slf4j', module:'slf4j-nop'
}
implementation "org.pgpainless:vks-java-cli:$vksVersion"
implementation "org.pgpainless:pgpainless-cert-d-cli:$certDPgpainlessVersion"
} }
application { application {

View file

@ -1,28 +1,55 @@
package org.pgpainless.pgpeasy; package org.pgpainless.pgpeasy;
import org.pgpainless.pgpeasy.commands.Cert; import org.pgpainless.cli.PGPainlessCLI;
import org.pgpainless.pgpeasy.commands.Decrypt;
import org.pgpainless.pgpeasy.commands.Encrypt;
import org.pgpainless.pgpeasy.commands.Key;
import org.pgpainless.pgpeasy.commands.Packet; import org.pgpainless.pgpeasy.commands.Packet;
import org.pgpainless.pgpeasy.commands.Sign;
import org.pgpainless.pgpeasy.commands.Verify;
import org.pgpainless.pgpeasy.commands.WKD;
import org.pgpainless.pgpeasy.commands.WOT; import org.pgpainless.pgpeasy.commands.WOT;
import org.pgpainless.sop.SOPImpl;
import pgp.cert_d.cli.PGPCertDCli;
import pgp.vks.client.cli.VKSCLI;
import pgp.wkd.cli.WKDCLI;
import picocli.AutoComplete; import picocli.AutoComplete;
import picocli.CommandLine; import picocli.CommandLine;
import sop.cli.picocli.SopCLI;
import sop.cli.picocli.commands.ArmorCmd;
import sop.cli.picocli.commands.DearmorCmd;
import sop.cli.picocli.commands.DecryptCmd;
import sop.cli.picocli.commands.DetachInbandSignatureAndMessageCmd;
import sop.cli.picocli.commands.EncryptCmd;
import sop.cli.picocli.commands.ExtractCertCmd;
import sop.cli.picocli.commands.GenerateKeyCmd;
import sop.cli.picocli.commands.SignCmd;
import sop.cli.picocli.commands.VerifyCmd;
@CommandLine.Command( @CommandLine.Command(
subcommands = { subcommands = {
Encrypt.class, // Inherit from SOP
Decrypt.class, EncryptCmd.class,
Sign.class, DecryptCmd.class,
Verify.class, SignCmd.class,
Key.class, VerifyCmd.class,
Cert.class, ArmorCmd.class,
Packet.class, DearmorCmd.class,
WKD.class, ExtractCertCmd.class,
GenerateKeyCmd.class,
DetachInbandSignatureAndMessageCmd.class,
// SOP as subcommand
SopCLI.class,
// WKD
WKDCLI.class,
// VKS
VKSCLI.class,
// PGP-Cert-D
PGPCertDCli.class,
// PGPeasy
WOT.class, WOT.class,
Packet.class,
// Picocli
CommandLine.HelpCommand.class, CommandLine.HelpCommand.class,
AutoComplete.GenerateCompletion.class AutoComplete.GenerateCompletion.class
} }
@ -30,6 +57,7 @@ import picocli.CommandLine;
public class PGPeasy { public class PGPeasy {
public static void main(String[] args) { public static void main(String[] args) {
SopCLI.setSopInstance(new SOPImpl());
int exitCode = execute(args); int exitCode = execute(args);
if (exitCode != 0) { if (exitCode != 0) {
System.exit(exitCode); System.exit(exitCode);
@ -37,10 +65,13 @@ public class PGPeasy {
} }
public static int execute(String[] args) { public static int execute(String[] args) {
return new CommandLine(PGPeasy.class) CommandLine cmd = new CommandLine(PGPeasy.class);
// Hide generate-completion command
CommandLine gen = cmd.getSubcommands().get("generate-completion");
gen.getCommandSpec().usageMessage().hidden(true);
return cmd
.setCommandName("pgpeasy") .setCommandName("pgpeasy")
// .setExecutionExceptionHandler(new SOPExecutionExceptionHandler())
// .setExitCodeExceptionMapper(new SOPExceptionExitCodeMapper())
.setCaseInsensitiveEnumValuesAllowed(true) .setCaseInsensitiveEnumValuesAllowed(true)
.execute(args); .execute(args);
} }

View file

@ -1,21 +0,0 @@
package org.pgpainless.pgpeasy.commands;
import org.pgpainless.pgpeasy.commands.cert.Certify;
import org.pgpainless.pgpeasy.commands.key.ExtractCert;
import picocli.CommandLine;
@CommandLine.Command(
name = "cert",
description = "Execute operations related to OpenPGP certificates",
subcommands = {
ExtractCert.class,
Certify.class
}
)
public class Cert implements Runnable {
@Override
public void run() {
}
}

View file

@ -1,15 +0,0 @@
package org.pgpainless.pgpeasy.commands;
import picocli.CommandLine;
@CommandLine.Command(
name = "decrypt",
description = "Decrypt a message"
)
public class Decrypt implements Runnable {
@Override
public void run() {
}
}

View file

@ -1,14 +0,0 @@
package org.pgpainless.pgpeasy.commands;
import picocli.CommandLine;
@CommandLine.Command(
name = "encrypt",
description = "Encrypt a message"
)
public class Encrypt implements Runnable {
@Override
public void run() {
System.out.println("Not yet implemented.");
}
}

View file

@ -1,21 +0,0 @@
package org.pgpainless.pgpeasy.commands;
import org.pgpainless.pgpeasy.commands.key.ExtractCert;
import org.pgpainless.pgpeasy.commands.key.Generate;
import picocli.CommandLine;
@CommandLine.Command(
name = "key",
description = "Operations related to secret keys",
subcommands = {
ExtractCert.class,
Generate.class,
}
)
public class Key implements Runnable {
@Override
public void run() {
}
}

View file

@ -1,15 +0,0 @@
package org.pgpainless.pgpeasy.commands;
import picocli.CommandLine;
@CommandLine.Command(
name = "sign",
description = "Sign a message"
)
public class Sign implements Runnable {
@Override
public void run() {
}
}

View file

@ -1,15 +0,0 @@
package org.pgpainless.pgpeasy.commands;
import picocli.CommandLine;
@CommandLine.Command(
name = "verify",
description = "Verify a signed message."
)
public class Verify implements Runnable {
@Override
public void run() {
}
}

View file

@ -1,19 +0,0 @@
package org.pgpainless.pgpeasy.commands;
import org.pgpainless.pgpeasy.commands.wkd.Fetch;
import picocli.CommandLine;
@CommandLine.Command(
name = "wkd",
description = "Interact with the Web Key Directory",
subcommands = {
Fetch.class,
}
)
public class WKD implements Runnable {
@Override
public void run() {
}
}

View file

@ -1,15 +0,0 @@
package org.pgpainless.pgpeasy.commands.cert;
import picocli.CommandLine;
@CommandLine.Command(
name = "certify",
description = "Create a signature on a certificate."
)
public class Certify implements Runnable {
@Override
public void run() {
}
}

View file

@ -1,15 +0,0 @@
package org.pgpainless.pgpeasy.commands.key;
import picocli.CommandLine;
@CommandLine.Command(
name = "extract",
description = "Extract a certificate from a secret key"
)
public class ExtractCert implements Runnable {
@Override
public void run() {
}
}

View file

@ -1,15 +0,0 @@
package org.pgpainless.pgpeasy.commands.key;
import picocli.CommandLine;
@CommandLine.Command(
name = "generate",
description = "Generate a new OpenPGP key"
)
public class Generate implements Runnable {
@Override
public void run() {
}
}

View file

@ -1,15 +0,0 @@
package org.pgpainless.pgpeasy.commands.wkd;
import picocli.CommandLine;
@CommandLine.Command(
name = "fetch",
description = "Fetch a certificate from the Web Key Directory"
)
public class Fetch implements Runnable {
@Override
public void run() {
}
}

14
version.gradle Normal file
View file

@ -0,0 +1,14 @@
allprojects {
ext {
bouncyCastleVersion = '1.71'
slf4jVersion = '1.7.36'
logbackVersion = '1.2.11'
junitVersion = '5.8.2'
sopJavaVersion = '1.2.3'
picocliVersion = '4.6.3'
pgpainlessVersion = '1.2.1'
wkdVersion = '0.1.1'
vksVersion = '0.1.2'
certDPgpainlessVersion = '0.1.2'
}
}