From 540dca6a249d4296294382d36527b407d1028f56 Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Sat, 27 Sep 2025 12:11:34 +0200 Subject: [PATCH] Upgrade build system and depdencies --- .woodpecker/.build.yml | 12 ++++++--- .woodpecker/.reuse.yml | 4 ++- build.gradle | 27 +++++++------------ config/checkstyle/checkstyle.xml | 11 -------- gradle/wrapper/gradle-wrapper.properties | 2 +- pgpainless-cert-d-cli/build.gradle | 6 +++-- .../java/pgp/cert_d/cli/commands/Import.java | 26 +++++++++--------- .../java/pgp/cert_d/cli/commands/Setup.java | 11 ++------ pgpainless-cert-d/build.gradle | 9 +------ .../SharedPGPCertificateDirectoryTest.java | 4 +-- version.gradle | 7 ++--- 11 files changed, 48 insertions(+), 71 deletions(-) diff --git a/.woodpecker/.build.yml b/.woodpecker/.build.yml index f504b44..c40f8ae 100644 --- a/.woodpecker/.build.yml +++ b/.woodpecker/.build.yml @@ -1,6 +1,8 @@ -pipeline: - run: - image: gradle:7.5-jdk8 +steps: + build: + image: gradle:8.8-jdk11 + when: + branch: main commands: - git checkout $CI_COMMIT_BRANCH # Code works @@ -9,4 +11,6 @@ pipeline: - gradle check javadocAll # Code has coverage - gradle jacocoRootReport coveralls - secrets: [COVERALLS_REPO_TOKEN] + environment: + COVERALLS_REPO_TOKEN: + from_secret: COVERALLS_REPO_TOKEN diff --git a/.woodpecker/.reuse.yml b/.woodpecker/.reuse.yml index 58f17e6..7eb6ab9 100644 --- a/.woodpecker/.reuse.yml +++ b/.woodpecker/.reuse.yml @@ -1,7 +1,9 @@ # Code is licensed properly # See https://reuse.software/ -pipeline: +steps: reuse: + when: + branch: main image: fsfe/reuse:latest commands: - reuse lint \ No newline at end of file diff --git a/build.gradle b/build.gradle index da3d624..5088134 100644 --- a/build.gradle +++ b/build.gradle @@ -16,10 +16,6 @@ buildscript { } } -plugins { - id 'ru.vyarus.animalsniffer' version '1.5.3' -} - apply from: 'version.gradle' allprojects { @@ -38,7 +34,7 @@ allprojects { // checkstyle checkstyle { - toolVersion = '8.18' + toolVersion = '10.26.0' } group 'org.pgpainless' @@ -65,8 +61,7 @@ allprojects { isReleaseVersion = !isSnapshot signingRequired = !(isSnapshot || isContinuousIntegrationEnvironment) sonatypeCredentialsAvailable = project.hasProperty('sonatypeUsername') && project.hasProperty('sonatypePassword') - sonatypeSnapshotUrl = 'https://oss.sonatype.org/content/repositories/snapshots' - sonatypeStagingUrl = 'https://oss.sonatype.org/service/local/staging/deploy/maven2' + sonatypeStagingUrl = 'https://ossrh-staging-api.central.sonatype.com/service/local/staging/deploy/maven2/' } if (isSnapshot) { @@ -83,7 +78,7 @@ allprojects { } jacoco { - toolVersion = "0.8.7" + toolVersion = "0.8.13" } jacocoTestReport { @@ -91,7 +86,7 @@ allprojects { sourceDirectories.setFrom(project.files(sourceSets.main.allSource.srcDirs)) classDirectories.setFrom(project.files(sourceSets.main.output)) reports { - xml.enabled true + xml.required = true } } @@ -109,15 +104,15 @@ subprojects { apply plugin: 'signing' task sourcesJar(type: Jar, dependsOn: classes) { - classifier = 'sources' + archiveClassifier = 'sources' from sourceSets.main.allSource } task javadocJar(type: Jar, dependsOn: javadoc) { - classifier = 'javadoc' + archiveClassifier = 'javadoc' from javadoc.destinationDir } task testsJar(type: Jar, dependsOn: testClasses) { - classifier = 'tests' + archiveClassifier = 'tests' from sourceSets.test.output } @@ -161,7 +156,7 @@ subprojects { repositories { if (sonatypeCredentialsAvailable) { maven { - url isSnapshot ? sonatypeSnapshotUrl : sonatypeStagingUrl + url sonatypeStagingUrl credentials { username = sonatypeUsername password = sonatypePassword @@ -214,7 +209,7 @@ task jacocoRootReport(type: JacocoReport) { classDirectories.setFrom(files(subprojects.sourceSets.main.output)) executionData.setFrom(files(subprojects.jacocoTestReport.executionData)) reports { - xml.enabled true + xml.required = true xml.destination file("${buildDir}/reports/jacoco/test/jacocoTestReport.xml") } // We could remove the following setOnlyIf line, but then @@ -225,10 +220,6 @@ task jacocoRootReport(type: JacocoReport) { } task javadocAll(type: Javadoc) { - def currentJavaVersion = JavaVersion.current() - if (currentJavaVersion.compareTo(JavaVersion.VERSION_1_9) >= 0) { - options.addStringOption("-release", "8"); - } source subprojects.collect {project -> project.sourceSets.main.allJava } destinationDir = new File(buildDir, 'javadoc') diff --git a/config/checkstyle/checkstyle.xml b/config/checkstyle/checkstyle.xml index 531fde9..73313cc 100644 --- a/config/checkstyle/checkstyle.xml +++ b/config/checkstyle/checkstyle.xml @@ -113,17 +113,6 @@ SPDX-License-Identifier: CC0-1.0 - - - - - - - - - - - diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 69a9715..0d18421 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/pgpainless-cert-d-cli/build.gradle b/pgpainless-cert-d-cli/build.gradle index 4c64b45..dac8fdc 100644 --- a/pgpainless-cert-d-cli/build.gradle +++ b/pgpainless-cert-d-cli/build.gradle @@ -4,13 +4,14 @@ plugins { id 'application' - id "com.github.johnrengelman.shadow" version "6.1.0" + id 'com.gradleup.shadow' version '8.3.6' } group 'org.pgpainless' repositories { mavenCentral() + mavenLocal() } dependencies { @@ -19,7 +20,8 @@ dependencies { testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:$junitVersion" // Logging - implementation ("org.slf4j:slf4j-nop:$slf4jVersion") + // implementation ("org.slf4j:slf4j-nop:$slf4jVersion") + implementation "ch.qos.logback:logback-classic:$logbackVersion" // pgp.cert.d using PGPainless implementation project(":pgpainless-cert-d") diff --git a/pgpainless-cert-d-cli/src/main/java/pgp/cert_d/cli/commands/Import.java b/pgpainless-cert-d-cli/src/main/java/pgp/cert_d/cli/commands/Import.java index 9e92e9f..16c7850 100644 --- a/pgpainless-cert-d-cli/src/main/java/pgp/cert_d/cli/commands/Import.java +++ b/pgpainless-cert-d-cli/src/main/java/pgp/cert_d/cli/commands/Import.java @@ -7,6 +7,7 @@ package pgp.cert_d.cli.commands; import org.bouncycastle.openpgp.PGPPublicKeyRing; import org.bouncycastle.openpgp.PGPPublicKeyRingCollection; import org.pgpainless.PGPainless; +import org.pgpainless.key.OpenPgpFingerprint; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.pgpainless.certificate_store.MergeCallbacks; @@ -30,21 +31,22 @@ public class Import implements Runnable { PGPPublicKeyRingCollection certificates = PGPainless.readKeyRing().publicKeyRingCollection(System.in); for (PGPPublicKeyRing cert : certificates) { ByteArrayInputStream certIn = new ByteArrayInputStream(cert.getEncoded()); - Certificate certificate = PGPCertDCli.getCertificateDirectory() - .insert(certIn, MergeCallbacks.mergeWithExisting()); - // CHECKSTYLE:OFF - System.out.println(certificate.getFingerprint()); - // CHECKSTYLE:ON + try { + Certificate certificate = PGPCertDCli.getCertificateDirectory() + .insert(certIn, MergeCallbacks.mergeWithExisting()); + LOGGER.info(certificate.getFingerprint()); + } catch (BadDataException e) { + LOGGER.error("Certificate " + OpenPgpFingerprint.of(cert) + " contains bad data.", e); + } catch (IOException e) { + LOGGER.error("IO error importing certificate " + OpenPgpFingerprint.of(cert), e); + } catch (InterruptedException e) { + LOGGER.error("Thread interrupted while importing certificate " + OpenPgpFingerprint.of(cert), e); + System.exit(1); + } } } 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); + System.exit(1); } } } diff --git a/pgpainless-cert-d-cli/src/main/java/pgp/cert_d/cli/commands/Setup.java b/pgpainless-cert-d-cli/src/main/java/pgp/cert_d/cli/commands/Setup.java index 070c284..7c762f1 100644 --- a/pgpainless-cert-d-cli/src/main/java/pgp/cert_d/cli/commands/Setup.java +++ b/pgpainless-cert-d-cli/src/main/java/pgp/cert_d/cli/commands/Setup.java @@ -4,14 +4,13 @@ package pgp.cert_d.cli.commands; -import org.bouncycastle.openpgp.PGPException; import org.bouncycastle.openpgp.PGPSecretKeyRing; import org.pgpainless.PGPainless; import org.pgpainless.algorithm.KeyFlag; import org.pgpainless.key.generation.KeyRingBuilder; import org.pgpainless.key.generation.KeySpec; import org.pgpainless.key.generation.type.KeyType; -import org.pgpainless.key.generation.type.eddsa.EdDSACurve; +import org.pgpainless.key.generation.type.eddsa_legacy.EdDSALegacyCurve; import org.pgpainless.util.Passphrase; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -24,8 +23,6 @@ import picocli.CommandLine; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; -import java.security.InvalidAlgorithmParameterException; -import java.security.NoSuchAlgorithmException; @CommandLine.Command(name = "setup", resourceBundle = "msg_setup") @@ -86,12 +83,8 @@ public class Setup implements Runnable { if (passphrase != null) { builder.setPassphrase(passphrase); } - builder.setPrimaryKey(KeySpec.getBuilder(KeyType.EDDSA(EdDSACurve._Ed25519), KeyFlag.CERTIFY_OTHER)); - try { + builder.setPrimaryKey(KeySpec.getBuilder(KeyType.EDDSA_LEGACY(EdDSALegacyCurve._Ed25519), KeyFlag.CERTIFY_OTHER)); trustRoot = builder.build(); - } catch (NoSuchAlgorithmException | PGPException | InvalidAlgorithmParameterException e) { - throw new RuntimeException("Cannot generate trust-root OpenPGP key", e); - } return trustRoot; } diff --git a/pgpainless-cert-d/build.gradle b/pgpainless-cert-d/build.gradle index ed891ec..c4617d0 100644 --- a/pgpainless-cert-d/build.gradle +++ b/pgpainless-cert-d/build.gradle @@ -10,13 +10,10 @@ group 'org.pgpainless' repositories { mavenCentral() + mavenLocal() } -apply plugin: 'ru.vyarus.animalsniffer' - dependencies { - // animal sniffer for ensuring Android API compatibility - signature "net.sf.androidscents.signature:android-api-level-${minAndroidSdk}:2.3.3_r2@signature" // JUnit testImplementation "org.junit.jupiter:junit-jupiter-api:$junitVersion" @@ -37,10 +34,6 @@ dependencies { api "org.pgpainless:pgp-certificate-store:$pgpCertDJavaVersion" } -animalsniffer { - sourceSets = [sourceSets.main] -} - test { useJUnitPlatform() } 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 d3fc5ec..38fd992 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 @@ -36,7 +36,7 @@ import org.pgpainless.certificate_store.PGPainlessCertD; import org.pgpainless.key.OpenPgpFingerprint; import org.pgpainless.key.generation.KeySpec; import org.pgpainless.key.generation.type.KeyType; -import org.pgpainless.key.generation.type.eddsa.EdDSACurve; +import org.pgpainless.key.generation.type.eddsa_legacy.EdDSALegacyCurve; import pgp.cert_d.subkey_lookup.InMemorySubkeyLookupFactory; import pgp.certificate_store.certificate.Certificate; import pgp.certificate_store.certificate.KeyMaterial; @@ -94,7 +94,7 @@ public class SharedPGPCertificateDirectoryTest { BadDataException, InterruptedException, BadNameException { PGPSecretKeyRing key = PGPainless.buildKeyRing() .addUserId("trust-root") - .setPrimaryKey(KeySpec.getBuilder(KeyType.EDDSA(EdDSACurve._Ed25519), KeyFlag.CERTIFY_OTHER)) + .setPrimaryKey(KeySpec.getBuilder(KeyType.EDDSA_LEGACY(EdDSALegacyCurve._Ed25519), KeyFlag.CERTIFY_OTHER)) .build(); PGPPublicKeyRing trustRoot = PGPainless.extractCertificate(key); OpenPgpFingerprint fingerprint = OpenPgpFingerprint.of(trustRoot); diff --git a/version.gradle b/version.gradle index beeb5c3..de6b8dc 100644 --- a/version.gradle +++ b/version.gradle @@ -7,12 +7,13 @@ allprojects { shortVersion = '0.2.3' isSnapshot = true minAndroidSdk = 10 - javaSourceCompatibility = 1.8 + javaSourceCompatibility = "11" slf4jVersion = '1.7.36' - logbackVersion = '1.2.11' + logbackVersion = '1.5.13' junitVersion = '5.8.2' mockitoVersion = '4.5.1' - pgpainlessVersion = '1.5.6' + bouncyCastleVersion = '1.82' + pgpainlessVersion = '1.7.7' pgpCertDJavaVersion = '0.2.2' picocliVersion = '4.6.3' }