This commit is contained in:
Paul Schaub 2022-03-11 14:06:42 +01:00
parent 9efcae77de
commit dec37c4706
Signed by: vanitasvitae
GPG key ID: 62BEE9264BF17311
14 changed files with 98 additions and 49 deletions

View file

@ -4,13 +4,13 @@
package pgp.cert_d; package pgp.cert_d;
import pgp.certificate_store.CertificateReaderBackend; import pgp.CertificateMerger;
import pgp.certificate_store.MergeCallback; import pgp.CertificateReader;
public abstract class BackendProvider { public abstract class BackendProvider {
public abstract CertificateReaderBackend provideCertificateReaderBackend(); public abstract CertificateReader provideCertificateReaderBackend();
public abstract MergeCallback provideDefaultMergeCallback(); public abstract CertificateMerger provideDefaultMergeCallback();
} }

View file

@ -4,10 +4,10 @@
package pgp.cert_d; package pgp.cert_d;
import pgp.Certificate;
import pgp.CertificateMerger;
import pgp.certificate_store.exception.BadDataException; import pgp.certificate_store.exception.BadDataException;
import pgp.certificate_store.exception.BadNameException; import pgp.certificate_store.exception.BadNameException;
import pgp.certificate_store.Certificate;
import pgp.certificate_store.MergeCallback;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
@ -127,7 +127,7 @@ public class CachingSharedPGPCertificateDirectoryWrapper
} }
@Override @Override
public Certificate insert(InputStream data, MergeCallback merge) public Certificate insert(InputStream data, CertificateMerger merge)
throws IOException, BadDataException, InterruptedException { throws IOException, BadDataException, InterruptedException {
Certificate certificate = underlyingCertificateDirectory.insert(data, merge); Certificate certificate = underlyingCertificateDirectory.insert(data, merge);
remember(certificate.getFingerprint(), certificate); remember(certificate.getFingerprint(), certificate);
@ -135,7 +135,7 @@ public class CachingSharedPGPCertificateDirectoryWrapper
} }
@Override @Override
public Certificate tryInsert(InputStream data, MergeCallback merge) public Certificate tryInsert(InputStream data, CertificateMerger merge)
throws IOException, BadDataException { throws IOException, BadDataException {
Certificate certificate = underlyingCertificateDirectory.tryInsert(data, merge); Certificate certificate = underlyingCertificateDirectory.tryInsert(data, merge);
if (certificate != null) { if (certificate != null) {
@ -145,7 +145,7 @@ public class CachingSharedPGPCertificateDirectoryWrapper
} }
@Override @Override
public Certificate insertWithSpecialName(String specialName, InputStream data, MergeCallback merge) public Certificate insertWithSpecialName(String specialName, InputStream data, CertificateMerger merge)
throws IOException, BadDataException, BadNameException, InterruptedException { throws IOException, BadDataException, BadNameException, InterruptedException {
Certificate certificate = underlyingCertificateDirectory.insertWithSpecialName(specialName, data, merge); Certificate certificate = underlyingCertificateDirectory.insertWithSpecialName(specialName, data, merge);
remember(specialName, certificate); remember(specialName, certificate);
@ -153,7 +153,7 @@ public class CachingSharedPGPCertificateDirectoryWrapper
} }
@Override @Override
public Certificate tryInsertWithSpecialName(String specialName, InputStream data, MergeCallback merge) public Certificate tryInsertWithSpecialName(String specialName, InputStream data, CertificateMerger merge)
throws IOException, BadDataException, BadNameException { throws IOException, BadDataException, BadNameException {
Certificate certificate = underlyingCertificateDirectory.tryInsertWithSpecialName(specialName, data, merge); Certificate certificate = underlyingCertificateDirectory.tryInsertWithSpecialName(specialName, data, merge);
if (certificate != null) { if (certificate != null) {

View file

@ -4,15 +4,15 @@
package pgp.cert_d; package pgp.cert_d;
import pgp.Certificate;
import pgp.CertificateMerger;
import pgp.certificate_store.exception.BadDataException;
import pgp.certificate_store.exception.BadNameException;
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.certificate_store.exception.BadDataException;
import pgp.certificate_store.exception.BadNameException;
import pgp.certificate_store.Certificate;
import pgp.certificate_store.MergeCallback;
public interface SharedPGPCertificateDirectory { public interface SharedPGPCertificateDirectory {
LockingMechanism getLock(); LockingMechanism getLock();
@ -29,16 +29,16 @@ public interface SharedPGPCertificateDirectory {
Certificate getBySpecialNameIfChanged(String specialName, String tag) Certificate getBySpecialNameIfChanged(String specialName, String tag)
throws IOException, BadNameException, BadDataException; throws IOException, BadNameException, BadDataException;
Certificate insert(InputStream data, MergeCallback merge) Certificate insert(InputStream data, CertificateMerger merge)
throws IOException, BadDataException, InterruptedException; throws IOException, BadDataException, InterruptedException;
Certificate tryInsert(InputStream data, MergeCallback merge) Certificate tryInsert(InputStream data, CertificateMerger merge)
throws IOException, BadDataException; throws IOException, BadDataException;
Certificate insertWithSpecialName(String specialName, InputStream data, MergeCallback merge) Certificate insertWithSpecialName(String specialName, InputStream data, CertificateMerger merge)
throws IOException, BadDataException, BadNameException, InterruptedException; throws IOException, BadDataException, BadNameException, InterruptedException;
Certificate tryInsertWithSpecialName(String specialName, InputStream data, MergeCallback merge) Certificate tryInsertWithSpecialName(String specialName, InputStream data, CertificateMerger merge)
throws IOException, BadDataException, BadNameException; throws IOException, BadDataException, BadNameException;
Iterator<Certificate> items(); Iterator<Certificate> items();

View file

@ -16,32 +16,32 @@ import java.util.Collections;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import pgp.Certificate;
import pgp.CertificateMerger;
import pgp.CertificateReader;
import pgp.certificate_store.exception.BadDataException; import pgp.certificate_store.exception.BadDataException;
import pgp.certificate_store.exception.BadNameException; import pgp.certificate_store.exception.BadNameException;
import pgp.certificate_store.exception.NotAStoreException; import pgp.certificate_store.exception.NotAStoreException;
import pgp.certificate_store.Certificate;
import pgp.certificate_store.CertificateReaderBackend;
import pgp.certificate_store.MergeCallback;
public class SharedPGPCertificateDirectoryImpl implements SharedPGPCertificateDirectory { public class SharedPGPCertificateDirectoryImpl implements SharedPGPCertificateDirectory {
private final FilenameResolver resolver; private final FilenameResolver resolver;
private final LockingMechanism writeLock; private final LockingMechanism writeLock;
private final CertificateReaderBackend certificateReaderBackend; private final CertificateReader certificateReaderBackend;
public SharedPGPCertificateDirectoryImpl(BackendProvider backendProvider) public SharedPGPCertificateDirectoryImpl(BackendProvider backendProvider)
throws NotAStoreException { throws NotAStoreException {
this(backendProvider.provideCertificateReaderBackend()); this(backendProvider.provideCertificateReaderBackend());
} }
public SharedPGPCertificateDirectoryImpl(CertificateReaderBackend certificateReaderBackend) public SharedPGPCertificateDirectoryImpl(CertificateReader certificateReaderBackend)
throws NotAStoreException { throws NotAStoreException {
this( this(
BaseDirectoryProvider.getDefaultBaseDir(), BaseDirectoryProvider.getDefaultBaseDir(),
certificateReaderBackend); certificateReaderBackend);
} }
public SharedPGPCertificateDirectoryImpl(File baseDirectory, CertificateReaderBackend certificateReaderBackend) public SharedPGPCertificateDirectoryImpl(File baseDirectory, CertificateReader certificateReaderBackend)
throws NotAStoreException { throws NotAStoreException {
this( this(
certificateReaderBackend, certificateReaderBackend,
@ -50,7 +50,7 @@ public class SharedPGPCertificateDirectoryImpl implements SharedPGPCertificateDi
} }
public SharedPGPCertificateDirectoryImpl( public SharedPGPCertificateDirectoryImpl(
CertificateReaderBackend certificateReaderBackend, CertificateReader certificateReaderBackend,
FilenameResolver filenameResolver, FilenameResolver filenameResolver,
LockingMechanism writeLock) LockingMechanism writeLock)
throws NotAStoreException { throws NotAStoreException {
@ -131,7 +131,7 @@ public class SharedPGPCertificateDirectoryImpl implements SharedPGPCertificateDi
} }
@Override @Override
public Certificate insert(InputStream data, MergeCallback merge) public Certificate insert(InputStream data, CertificateMerger merge)
throws IOException, BadDataException, InterruptedException { throws IOException, BadDataException, InterruptedException {
writeLock.lockDirectory(); writeLock.lockDirectory();
@ -142,7 +142,7 @@ public class SharedPGPCertificateDirectoryImpl implements SharedPGPCertificateDi
} }
@Override @Override
public Certificate tryInsert(InputStream data, MergeCallback merge) public Certificate tryInsert(InputStream data, CertificateMerger merge)
throws IOException, BadDataException { throws IOException, BadDataException {
if (!writeLock.tryLockDirectory()) { if (!writeLock.tryLockDirectory()) {
return null; return null;
@ -154,7 +154,7 @@ public class SharedPGPCertificateDirectoryImpl implements SharedPGPCertificateDi
return certificate; return certificate;
} }
private Certificate _insert(InputStream data, MergeCallback merge) private Certificate _insert(InputStream data, CertificateMerger merge)
throws IOException, BadDataException { throws IOException, BadDataException {
Certificate newCertificate = certificateReaderBackend.readCertificate(data); Certificate newCertificate = certificateReaderBackend.readCertificate(data);
Certificate existingCertificate; Certificate existingCertificate;
@ -196,7 +196,7 @@ public class SharedPGPCertificateDirectoryImpl implements SharedPGPCertificateDi
} }
@Override @Override
public Certificate insertWithSpecialName(String specialName, InputStream data, MergeCallback merge) public Certificate insertWithSpecialName(String specialName, InputStream data, CertificateMerger merge)
throws IOException, BadNameException, BadDataException, InterruptedException { throws IOException, BadNameException, BadDataException, InterruptedException {
writeLock.lockDirectory(); writeLock.lockDirectory();
@ -207,7 +207,7 @@ public class SharedPGPCertificateDirectoryImpl implements SharedPGPCertificateDi
} }
@Override @Override
public Certificate tryInsertWithSpecialName(String specialName, InputStream data, MergeCallback merge) public Certificate tryInsertWithSpecialName(String specialName, InputStream data, CertificateMerger merge)
throws IOException, BadNameException, BadDataException { throws IOException, BadNameException, BadDataException {
if (!writeLock.tryLockDirectory()) { if (!writeLock.tryLockDirectory()) {
return null; return null;
@ -219,7 +219,7 @@ public class SharedPGPCertificateDirectoryImpl implements SharedPGPCertificateDi
return certificate; return certificate;
} }
private Certificate _insertSpecial(String specialName, InputStream data, MergeCallback merge) private Certificate _insertSpecial(String specialName, InputStream data, CertificateMerger merge)
throws IOException, BadNameException, BadDataException { throws IOException, BadNameException, BadDataException {
Certificate newCertificate = certificateReaderBackend.readCertificate(data); Certificate newCertificate = certificateReaderBackend.readCertificate(data);
Certificate existingCertificate = getBySpecialName(specialName); Certificate existingCertificate = getBySpecialName(specialName);

View file

@ -24,6 +24,8 @@ dependencies {
// Logging // Logging
api "org.slf4j:slf4j-api:$slf4jVersion" api "org.slf4j:slf4j-api:$slf4jVersion"
testImplementation "ch.qos.logback:logback-classic:$logbackVersion" testImplementation "ch.qos.logback:logback-classic:$logbackVersion"
api project(":pgp-certificates")
} }
animalsniffer { animalsniffer {

View file

@ -6,6 +6,7 @@ package pgp.certificate_store;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import pgp.Certificate;
import pgp.certificate_store.exception.BadDataException; import pgp.certificate_store.exception.BadDataException;
import pgp.certificate_store.exception.BadNameException; import pgp.certificate_store.exception.BadNameException;

View file

@ -4,6 +4,8 @@
package pgp.certificate_store; package pgp.certificate_store;
import pgp.Certificate;
import pgp.CertificateMerger;
import pgp.certificate_store.exception.BadDataException; import pgp.certificate_store.exception.BadDataException;
import pgp.certificate_store.exception.BadNameException; import pgp.certificate_store.exception.BadNameException;
@ -50,12 +52,12 @@ public interface CertificateDirectory {
/** /**
* Insert a certificate into the store. * Insert a certificate into the store.
* If an instance of the certificate is already present in the store, the given {@link MergeCallback} will be * If an instance of the certificate is already present in the store, the given {@link CertificateMerger} will be
* used to merge both the existing and the new instance of the {@link Certificate}. The resulting merged certificate * used to merge both the existing and the new instance of the {@link Certificate}. The resulting merged certificate
* will be stored in the store and returned. * will be stored in the store and returned.
* *
* This method will block until a write-lock on the store can be acquired. If you cannot afford blocking, * This method will block until a write-lock on the store can be acquired. If you cannot afford blocking,
* consider to use {@link #tryInsertCertificate(InputStream, MergeCallback)} instead. * consider to use {@link #tryInsertCertificate(InputStream, CertificateMerger)} instead.
* *
* @param data input stream containing the new certificate instance * @param data input stream containing the new certificate instance
* @param merge callback for merging with an existing certificate instance * @param merge callback for merging with an existing certificate instance
@ -64,12 +66,12 @@ public interface CertificateDirectory {
* @throws IOException in case of an IO-error * @throws IOException in case of an IO-error
* @throws InterruptedException in case the inserting thread gets interrupted * @throws InterruptedException in case the inserting thread gets interrupted
*/ */
Certificate insertCertificate(InputStream data, MergeCallback merge) Certificate insertCertificate(InputStream data, CertificateMerger merge)
throws IOException, InterruptedException, BadDataException; throws IOException, InterruptedException, BadDataException;
/** /**
* Insert a certificate into the store. * Insert a certificate into the store.
* If an instance of the certificate is already present in the store, the given {@link MergeCallback} will be * If an instance of the certificate is already present in the store, the given {@link CertificateMerger} will be
* used to merge both the existing and the new instance of the {@link Certificate}. The resulting merged certificate * used to merge both the existing and the new instance of the {@link Certificate}. The resulting merged certificate
* will be stored in the store and returned. * will be stored in the store and returned.
* *
@ -84,19 +86,19 @@ public interface CertificateDirectory {
* *
* @throws IOException in case of an IO-error * @throws IOException in case of an IO-error
*/ */
Certificate tryInsertCertificate(InputStream data, MergeCallback merge) Certificate tryInsertCertificate(InputStream data, CertificateMerger merge)
throws IOException, BadDataException; throws IOException, BadDataException;
/** /**
* Insert a certificate into the store. * Insert a certificate into the store.
* The certificate will be stored under the given special name instead of its fingerprint. * The certificate will be stored under the given special name instead of its fingerprint.
* *
* If an instance of the certificate is already present under the special name in the store, the given {@link MergeCallback} will be * If an instance of the certificate is already present under the special name in the store, the given {@link CertificateMerger} will be
* used to merge both the existing and the new instance of the {@link Certificate}. The resulting merged certificate * used to merge both the existing and the new instance of the {@link Certificate}. The resulting merged certificate
* will be stored in the store and returned. * will be stored in the store and returned.
* *
* This method will block until a write-lock on the store can be acquired. If you cannot afford blocking, * This method will block until a write-lock on the store can be acquired. If you cannot afford blocking,
* consider to use {@link #tryInsertCertificateBySpecialName(String, InputStream, MergeCallback)} instead. * consider to use {@link #tryInsertCertificateBySpecialName(String, InputStream, CertificateMerger)} instead.
* *
* @param data input stream containing the new certificate instance * @param data input stream containing the new certificate instance
* @param merge callback for merging with an existing certificate instance * @param merge callback for merging with an existing certificate instance
@ -104,14 +106,14 @@ public interface CertificateDirectory {
* *
* @throws IOException in case of an IO-error * @throws IOException in case of an IO-error
*/ */
Certificate insertCertificateBySpecialName(String specialName, InputStream data, MergeCallback merge) Certificate insertCertificateBySpecialName(String specialName, InputStream data, CertificateMerger merge)
throws IOException, InterruptedException, BadDataException, BadNameException; throws IOException, InterruptedException, BadDataException, BadNameException;
/** /**
* Insert a certificate into the store. * Insert a certificate into the store.
* The certificate will be stored under the given special name instead of its fingerprint. * The certificate will be stored under the given special name instead of its fingerprint.
* *
* If an instance of the certificate is already present under the special name in the store, the given {@link MergeCallback} will be * If an instance of the certificate is already present under the special name in the store, the given {@link CertificateMerger} will be
* used to merge both the existing and the new instance of the {@link Certificate}. The resulting merged certificate * used to merge both the existing and the new instance of the {@link Certificate}. The resulting merged certificate
* will be stored in the store and returned. * will be stored in the store and returned.
* *
@ -126,7 +128,7 @@ public interface CertificateDirectory {
* *
* @throws IOException in case of an IO-error * @throws IOException in case of an IO-error
*/ */
Certificate tryInsertCertificateBySpecialName(String specialName, InputStream data, MergeCallback merge) Certificate tryInsertCertificateBySpecialName(String specialName, InputStream data, CertificateMerger merge)
throws IOException, BadDataException, BadNameException; throws IOException, BadDataException, BadNameException;
/** /**

View file

@ -5,7 +5,7 @@
package pgp.certificate_store.exception; package pgp.certificate_store.exception;
/** /**
* Provided name was neither a valid fingerprint, nor a known special name. * Thrown when a bad name for a cert was used.
*/ */
public class BadNameException extends Exception { public class BadNameException extends Exception {

View file

@ -0,0 +1,35 @@
// SPDX-FileCopyrightText: 2021 Paul Schaub <vanitasvitae@fsfe.org>
//
// SPDX-License-Identifier: Apache-2.0
plugins {
id 'java-library'
}
group 'org.pgpainless'
repositories {
mavenCentral()
}
apply plugin: 'ru.vyarus.animalsniffer'
dependencies {
// animal sniffer
signature "net.sf.androidscents.signature:android-api-level-${minAndroidSdk}:2.3.3_r2@signature"
testImplementation "org.junit.jupiter:junit-jupiter-api:$junitVersion"
testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:$junitVersion"
// Logging
api "org.slf4j:slf4j-api:$slf4jVersion"
testImplementation "ch.qos.logback:logback-classic:$logbackVersion"
}
animalsniffer {
sourceSets = [sourceSets.main]
}
test {
useJUnitPlatform()
}

View file

@ -2,7 +2,7 @@
// //
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: Apache-2.0
package pgp.certificate_store; package pgp;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;

View file

@ -2,14 +2,14 @@
// //
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: Apache-2.0
package pgp.certificate_store; package pgp;
import java.io.IOException; import java.io.IOException;
/** /**
* Merge a given certificate (update) with an existing certificate. * Merge a given certificate (update) with an existing certificate.
*/ */
public interface MergeCallback { public interface CertificateMerger {
/** /**
* Merge the given certificate data with the existing certificate and return the result. * Merge the given certificate data with the existing certificate and return the result.

View file

@ -2,7 +2,7 @@
// //
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: Apache-2.0
package pgp.certificate_store; package pgp;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
@ -11,7 +11,7 @@ import java.io.InputStream;
* Interface definition for a class that can read {@link Certificate Certificates} from binary * Interface definition for a class that can read {@link Certificate Certificates} from binary
* {@link InputStream InputStreams}. * {@link InputStream InputStreams}.
*/ */
public interface CertificateReaderBackend { public interface CertificateReader {
/** /**
* Read a {@link Certificate} from the given {@link InputStream}. * Read a {@link Certificate} from the given {@link InputStream}.

View file

@ -0,0 +1,8 @@
// SPDX-FileCopyrightText: 2022 Paul Schaub <vanitasvitae@fsfe.org>
//
// SPDX-License-Identifier: Apache-2.0
/**
* OpenPGP Certificates.
*/
package pgp;

View file

@ -6,5 +6,6 @@ rootProject.name = 'cert-d-java'
include 'pgp-cert-d-java', include 'pgp-cert-d-java',
'pgp-cert-d-java-jdbc-sqlite-lookup', 'pgp-cert-d-java-jdbc-sqlite-lookup',
'pgp-certificate-store' 'pgp-certificate-store',
'pgp-certificates'