mirror of
https://github.com/pgpainless/pgpainless.git
synced 2024-11-16 17:32:06 +01:00
Wip
This commit is contained in:
parent
7aa48f458b
commit
a5d592a102
5 changed files with 167 additions and 0 deletions
|
@ -0,0 +1,75 @@
|
||||||
|
package org.pgpainless.key.storage;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
|
||||||
|
public class CertDStore {
|
||||||
|
|
||||||
|
private final File baseDirectory;
|
||||||
|
private static final String STORE_NAME = "pgp.cert.d";
|
||||||
|
|
||||||
|
public CertDStore() {
|
||||||
|
this(getDefaultBaseDir());
|
||||||
|
}
|
||||||
|
|
||||||
|
public CertDStore(File baseDirectory) {
|
||||||
|
this.baseDirectory = baseDirectory;
|
||||||
|
}
|
||||||
|
|
||||||
|
public File fingerprintToPrefixDir(String fingerprint) {
|
||||||
|
String dirName = fingerprint.toLowerCase().substring(0, 2);
|
||||||
|
return new File(baseDirectory, dirName);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String fingerprintToCertFileName(String fingerprint) {
|
||||||
|
String certFileName = fingerprint.toLowerCase().substring(2);
|
||||||
|
return certFileName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public File fingerprintToCertFile(String fingerprint) {
|
||||||
|
File dir = fingerprintToPrefixDir(fingerprint);
|
||||||
|
File certFile = new File(dir, fingerprintToCertFileName(fingerprint));
|
||||||
|
return certFile;
|
||||||
|
}
|
||||||
|
|
||||||
|
public File getBaseDirectory() {
|
||||||
|
return baseDirectory;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static File getDefaultBaseDir() {
|
||||||
|
// Check for environment variable
|
||||||
|
String baseDirFromEnv = System.getenv("PGP_CERT_D");
|
||||||
|
if (baseDirFromEnv != null) {
|
||||||
|
return new File(baseDirFromEnv);
|
||||||
|
}
|
||||||
|
|
||||||
|
// return OS-specific default dir
|
||||||
|
String osName = System.getProperty("os.name", "generic")
|
||||||
|
.toLowerCase();
|
||||||
|
return getDefaultBaseDirForOS(osName, File.separator);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static File getDefaultBaseDirForOS(String osName, String separator) {
|
||||||
|
if (osName.contains("win")) {
|
||||||
|
String appData = System.getenv("APPDATA");
|
||||||
|
String roaming = appData + separator + "Roaming";
|
||||||
|
return new File(roaming, STORE_NAME);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (osName.contains("nux")) {
|
||||||
|
String xdg_data_home = System.getenv("XDG_DATA_HOME");
|
||||||
|
String rootPath = xdg_data_home;
|
||||||
|
if (xdg_data_home == null) {
|
||||||
|
rootPath = System.getProperty("user.home") + separator + ".local" + separator + "share";
|
||||||
|
}
|
||||||
|
return new File(rootPath, STORE_NAME);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (osName.contains("mac")) {
|
||||||
|
String home = System.getenv("HOME");
|
||||||
|
return new File(home + separator + "Library" + separator + "Application Support", STORE_NAME);
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new IllegalArgumentException("Unknown OS " + osName);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,24 @@
|
||||||
|
package org.pgpainless.key.storage;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.util.Iterator;
|
||||||
|
|
||||||
|
public interface CertificateStore {
|
||||||
|
|
||||||
|
Item get(String identifier) throws IOException;
|
||||||
|
|
||||||
|
Item getIfChanged(String identifier, String tag) throws IOException;
|
||||||
|
<
|
||||||
|
Item insert(InputStream data, MergeCallback merge) throws IOException;
|
||||||
|
|
||||||
|
Item tryInsert(InputStream data, MergeCallback merge) throws IOException;
|
||||||
|
|
||||||
|
Item insertSpecial(String specialName, InputStream data, MergeCallback merge) throws IOException;
|
||||||
|
|
||||||
|
Item tryInsertSpecial(String specialName, InputStream data, MergeCallback merge) throws IOException;
|
||||||
|
|
||||||
|
Iterator<Item> items();
|
||||||
|
|
||||||
|
Iterator<String> fingerprints();
|
||||||
|
}
|
|
@ -0,0 +1,28 @@
|
||||||
|
package org.pgpainless.key.storage;
|
||||||
|
|
||||||
|
import java.io.InputStream;
|
||||||
|
|
||||||
|
public class Item {
|
||||||
|
|
||||||
|
private final String fingerprint;
|
||||||
|
private final String tag;
|
||||||
|
private final InputStream data;
|
||||||
|
|
||||||
|
public Item(String fingerprint, String tag, InputStream data) {
|
||||||
|
this.fingerprint = fingerprint;
|
||||||
|
this.tag = tag;
|
||||||
|
this.data = data;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getFingerprint() {
|
||||||
|
return fingerprint;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getTag() {
|
||||||
|
return tag;
|
||||||
|
}
|
||||||
|
|
||||||
|
public InputStream getData() {
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,23 @@
|
||||||
|
package org.pgpainless.key.storage;
|
||||||
|
|
||||||
|
import javax.annotation.Nullable;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.OutputStream;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Merge a given certificate (update) with an existing certificate.
|
||||||
|
*/
|
||||||
|
public interface MergeCallback {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Merge the given certificate data with the existing certificate and return the result.
|
||||||
|
*
|
||||||
|
* If no existing certificate is found (i.e. existing is null), this method returns the binary representation of data.
|
||||||
|
*
|
||||||
|
* @param data input stream containing the certificate
|
||||||
|
* @param existing optional input stream containing an already existing copy of the certificate
|
||||||
|
* @return output stream containing the binary representation of the merged certificate
|
||||||
|
*/
|
||||||
|
OutputStream merge(InputStream data, @Nullable InputStream existing);
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,17 @@
|
||||||
|
package org.pgpainless.key.storage;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
|
||||||
|
public class CertDStoreTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testGetDefaultBaseDir() {
|
||||||
|
CertDStore store = new CertDStore();
|
||||||
|
File baseDir = store.getBaseDirectory();
|
||||||
|
assertEquals("pgp.cert.d", baseDir.getName());
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue