From f2bd36502f5cda8ea2821068593ea99a4775ad15 Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Thu, 20 Mar 2025 20:17:50 +0100 Subject: [PATCH] Policy is no longer a Singleton --- .../main/kotlin/org/pgpainless/PGPainless.kt | 5 +++- .../pgpainless/bouncycastle/PolicyAdapter.kt | 2 +- .../key/certification/CertifyCertificate.kt | 27 ++++++++++--------- .../kotlin/org/pgpainless/policy/Policy.kt | 9 ------- .../pgpainless/policy/PolicySetterTest.java | 14 +++++----- 5 files changed, 26 insertions(+), 31 deletions(-) diff --git a/pgpainless-core/src/main/kotlin/org/pgpainless/PGPainless.kt b/pgpainless-core/src/main/kotlin/org/pgpainless/PGPainless.kt index 3344a004..e15c285a 100644 --- a/pgpainless-core/src/main/kotlin/org/pgpainless/PGPainless.kt +++ b/pgpainless-core/src/main/kotlin/org/pgpainless/PGPainless.kt @@ -17,6 +17,7 @@ import org.bouncycastle.openpgp.api.OpenPGPKey import org.bouncycastle.openpgp.api.OpenPGPKeyGenerator import org.bouncycastle.openpgp.api.OpenPGPKeyReader import org.bouncycastle.openpgp.api.bc.BcOpenPGPApi +import org.bouncycastle.openpgp.api.bc.BcOpenPGPImplementation import org.pgpainless.algorithm.OpenPGPKeyVersion import org.pgpainless.bouncycastle.PolicyAdapter import org.pgpainless.bouncycastle.extensions.setAlgorithmSuite @@ -34,7 +35,7 @@ import org.pgpainless.util.ArmorUtils class PGPainless( val implementation: OpenPGPImplementation = OpenPGPImplementation.getInstance(), - var algorithmPolicy: Policy = Policy.getInstance() + var algorithmPolicy: Policy = Policy() ) { private var api: OpenPGPApi @@ -107,6 +108,8 @@ class PGPainless( @Volatile private var instance: PGPainless? = null + @JvmStatic fun newInstance(): PGPainless = PGPainless(BcOpenPGPImplementation(), Policy()) + @JvmStatic fun getInstance(): PGPainless = instance ?: synchronized(this) { instance ?: PGPainless().also { instance = it } } diff --git a/pgpainless-core/src/main/kotlin/org/pgpainless/bouncycastle/PolicyAdapter.kt b/pgpainless-core/src/main/kotlin/org/pgpainless/bouncycastle/PolicyAdapter.kt index bb8e9f0f..7a6f4bcb 100644 --- a/pgpainless-core/src/main/kotlin/org/pgpainless/bouncycastle/PolicyAdapter.kt +++ b/pgpainless-core/src/main/kotlin/org/pgpainless/bouncycastle/PolicyAdapter.kt @@ -10,7 +10,7 @@ import org.bouncycastle.openpgp.api.OpenPGPPolicy.OpenPGPNotationRegistry import org.pgpainless.policy.Policy /** Adapter class that adapts a PGPainless [Policy] object to Bouncy Castles [OpenPGPPolicy]. */ -class PolicyAdapter(val policy: Policy = Policy.getInstance()) : OpenPGPPolicy { +class PolicyAdapter(val policy: Policy) : OpenPGPPolicy { /** * Determine, whether the hash algorithm of a document signature is acceptable. diff --git a/pgpainless-core/src/main/kotlin/org/pgpainless/key/certification/CertifyCertificate.kt b/pgpainless-core/src/main/kotlin/org/pgpainless/key/certification/CertifyCertificate.kt index f30b7539..dffde49c 100644 --- a/pgpainless-core/src/main/kotlin/org/pgpainless/key/certification/CertifyCertificate.kt +++ b/pgpainless-core/src/main/kotlin/org/pgpainless/key/certification/CertifyCertificate.kt @@ -139,7 +139,7 @@ class CertifyCertificate(private val api: PGPainless) { ThirdPartyCertificationSignatureBuilder( certificationType.asSignatureType(), secretKey, protector, api) - return CertificationOnUserIdWithSubpackets(certificate, userId, sigBuilder) + return CertificationOnUserIdWithSubpackets(certificate, userId, sigBuilder, api) } /** @@ -154,14 +154,14 @@ class CertifyCertificate(private val api: PGPainless) { fun withKey( certificationKey: PGPSecretKeyRing, protector: SecretKeyRingProtector - ): CertificationOnUserIdWithSubpackets = - withKey(PGPainless.getInstance().toKey(certificationKey), protector) + ): CertificationOnUserIdWithSubpackets = withKey(api.toKey(certificationKey), protector) } class CertificationOnUserIdWithSubpackets( val certificate: OpenPGPCertificate, val userId: CharSequence, - val sigBuilder: ThirdPartyCertificationSignatureBuilder + val sigBuilder: ThirdPartyCertificationSignatureBuilder, + private val api: PGPainless ) { @Deprecated("Pass in an OpenPGPCertificate instead of a PGPPublicKeyRing.") @@ -170,7 +170,7 @@ class CertifyCertificate(private val api: PGPainless) { userId: String, sigBuilder: ThirdPartyCertificationSignatureBuilder, api: PGPainless - ) : this(api.toCertificate(certificate), userId, sigBuilder) + ) : this(api.toCertificate(certificate), userId, sigBuilder, api) /** * Apply the given signature subpackets and build the certification. @@ -195,7 +195,7 @@ class CertifyCertificate(private val api: PGPainless) { fun build(): CertificationResult { val signature = sigBuilder.build(certificate, userId) val certifiedCertificate = - OpenPGPCertificate( + api.toCertificate( KeyRingUtils.injectCertification( certificate.pgpPublicKeyRing, userId, signature.signature)) @@ -226,7 +226,7 @@ class CertifyCertificate(private val api: PGPainless) { sigBuilder.hashedSubpackets.setTrust( true, trustworthiness.depth, trustworthiness.amount) } - return DelegationOnCertificateWithSubpackets(certificate, sigBuilder) + return DelegationOnCertificateWithSubpackets(certificate, sigBuilder, api) } /** @@ -241,20 +241,21 @@ class CertifyCertificate(private val api: PGPainless) { fun withKey( certificationKey: PGPSecretKeyRing, protector: SecretKeyRingProtector - ): DelegationOnCertificateWithSubpackets = - withKey(PGPainless.getInstance().toKey(certificationKey), protector) + ): DelegationOnCertificateWithSubpackets = withKey(api.toKey(certificationKey), protector) } class DelegationOnCertificateWithSubpackets( val certificate: OpenPGPCertificate, - val sigBuilder: ThirdPartyDirectKeySignatureBuilder + val sigBuilder: ThirdPartyDirectKeySignatureBuilder, + private val api: PGPainless ) { @Deprecated("Pass in an OpenPGPCertificate instead of a PGPPublicKeyRing.") constructor( certificate: PGPPublicKeyRing, - sigBuilder: ThirdPartyDirectKeySignatureBuilder - ) : this(PGPainless.getInstance().toCertificate(certificate), sigBuilder) + sigBuilder: ThirdPartyDirectKeySignatureBuilder, + api: PGPainless + ) : this(api.toCertificate(certificate), sigBuilder, api) /** * Apply the given signature subpackets and build the delegation signature. @@ -280,7 +281,7 @@ class CertifyCertificate(private val api: PGPainless) { val delegatedKey = certificate.primaryKey val delegation = sigBuilder.build(delegatedKey) val delegatedCertificate = - OpenPGPCertificate( + api.toCertificate( KeyRingUtils.injectCertification( certificate.pgpPublicKeyRing, delegatedKey.pgpPublicKey, diff --git a/pgpainless-core/src/main/kotlin/org/pgpainless/policy/Policy.kt b/pgpainless-core/src/main/kotlin/org/pgpainless/policy/Policy.kt index a82875ec..a2339bec 100644 --- a/pgpainless-core/src/main/kotlin/org/pgpainless/policy/Policy.kt +++ b/pgpainless-core/src/main/kotlin/org/pgpainless/policy/Policy.kt @@ -411,15 +411,6 @@ class Policy( DISABLED } - companion object { - - @Volatile private var INSTANCE: Policy? = null - - @JvmStatic - fun getInstance() = - INSTANCE ?: synchronized(this) { INSTANCE ?: Policy().also { INSTANCE = it } } - } - class Builder(private val origin: Policy) { private var certificationSignatureHashAlgorithmPolicy: HashAlgorithmPolicy = origin.certificationSignatureHashAlgorithmPolicy diff --git a/pgpainless-core/src/test/java/org/pgpainless/policy/PolicySetterTest.java b/pgpainless-core/src/test/java/org/pgpainless/policy/PolicySetterTest.java index bd044b3b..42d7e7b5 100644 --- a/pgpainless-core/src/test/java/org/pgpainless/policy/PolicySetterTest.java +++ b/pgpainless-core/src/test/java/org/pgpainless/policy/PolicySetterTest.java @@ -17,43 +17,43 @@ public class PolicySetterTest { @Test public void testSetCertificationSignatureHashAlgorithmPolicy_NullFails() { - Policy policy = Policy.getInstance(); + Policy policy = new Policy(); assertThrows(NullPointerException.class, () -> policy.copy().withCertificationSignatureHashAlgorithmPolicy(null)); } @Test public void testSetDataSignatureHashAlgorithmPolicy_NullFails() { - Policy policy = Policy.getInstance(); + Policy policy = new Policy(); assertThrows(NullPointerException.class, () -> policy.copy().withDataSignatureHashAlgorithmPolicy(null)); } @Test public void testSetRevocationSignatureHashAlgorithmPolicy_NullFails() { - Policy policy = Policy.getInstance(); + Policy policy = new Policy(); assertThrows(NullPointerException.class, () -> policy.copy().withRevocationSignatureHashAlgorithmPolicy(null)); } @Test public void testSetSymmetricKeyEncryptionAlgorithmPolicy_NullFails() { - Policy policy = Policy.getInstance(); + Policy policy = new Policy(); assertThrows(NullPointerException.class, () -> policy.copy().withSymmetricKeyEncryptionAlgorithmPolicy(null)); } @Test public void testSetSymmetricKeyDecryptionAlgorithmPolicy_NullFails() { - Policy policy = Policy.getInstance(); + Policy policy = new Policy(); assertThrows(NullPointerException.class, () -> policy.copy().withSymmetricKeyDecryptionAlgorithmPolicy(null)); } @Test public void testSetCompressionAlgorithmPolicy_NullFails() { - Policy policy = Policy.getInstance(); + Policy policy = new Policy(); assertThrows(NullPointerException.class, () -> policy.copy().withCompressionAlgorithmPolicy(null)); } @Test public void testSetPublicKeyAlgorithmPolicy_NullFails() { - Policy policy = Policy.getInstance(); + Policy policy = new Policy(); assertThrows(NullPointerException.class, () -> policy.copy().withPublicKeyAlgorithmPolicy(null)); }