mirror of
https://github.com/vanitasvitae/Smack.git
synced 2024-11-23 20:42:06 +01:00
Improve store implementations
This commit is contained in:
parent
4e909abb7e
commit
bf92cec618
9 changed files with 182 additions and 40 deletions
|
@ -43,6 +43,14 @@ public abstract class AbstractOpenPgpKeyStore implements OpenPgpKeyStore {
|
|||
protected Map<BareJid, PGPPublicKeyRingCollection> publicKeys = new HashMap<>();
|
||||
protected Map<BareJid, PGPSecretKeyRingCollection> secretKeys = new HashMap<>();
|
||||
|
||||
protected abstract PGPPublicKeyRingCollection readPublicKeysOf(BareJid owner) throws IOException, PGPException;
|
||||
|
||||
protected abstract void writePublicKeysOf(BareJid owner, PGPPublicKeyRingCollection publicKeys) throws IOException;
|
||||
|
||||
protected abstract PGPSecretKeyRingCollection readSecretKeysOf(BareJid owner) throws IOException, PGPException;
|
||||
|
||||
protected abstract void writeSecretKeysOf(BareJid owner, PGPSecretKeyRingCollection secretKeys) throws IOException;
|
||||
|
||||
@Override
|
||||
public PGPPublicKeyRingCollection getPublicKeysOf(BareJid owner) throws IOException, PGPException {
|
||||
PGPPublicKeyRingCollection keys = publicKeys.get(owner);
|
||||
|
|
|
@ -38,4 +38,14 @@ public abstract class AbstractOpenPgpMetadataStore implements OpenPgpMetadataSto
|
|||
}
|
||||
return fingerprints;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setAnnouncedFingerprintsOf(BareJid contact, Map<OpenPgpV4Fingerprint, Date> data) throws IOException {
|
||||
announcedFingerprints.put(contact, data);
|
||||
writeAnnouncedFingerprintsOf(contact, data);
|
||||
}
|
||||
|
||||
protected abstract Map<OpenPgpV4Fingerprint, Date> readAnnouncedFingerprintsOf(BareJid contact) throws IOException;
|
||||
|
||||
protected abstract void writeAnnouncedFingerprintsOf(BareJid contact, Map<OpenPgpV4Fingerprint, Date> metadata) throws IOException;
|
||||
}
|
||||
|
|
|
@ -0,0 +1,55 @@
|
|||
package org.jivesoftware.smackx.ox.v2.store;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import org.jivesoftware.smackx.ox.OpenPgpV4Fingerprint;
|
||||
|
||||
import org.jxmpp.jid.BareJid;
|
||||
|
||||
public abstract class AbstractOpenPgpTrustStore implements OpenPgpTrustStore {
|
||||
|
||||
private final Map<BareJid, Map<OpenPgpV4Fingerprint, Trust>> trustCache = new HashMap<>();
|
||||
|
||||
protected abstract Trust readTrust(BareJid owner, OpenPgpV4Fingerprint fingerprint) throws IOException;
|
||||
|
||||
protected abstract void writeTrust(BareJid owner, OpenPgpV4Fingerprint fingerprint, Trust trust) throws IOException;
|
||||
|
||||
@Override
|
||||
public Trust getTrust(BareJid owner, OpenPgpV4Fingerprint fingerprint) throws IOException {
|
||||
Trust trust;
|
||||
Map<OpenPgpV4Fingerprint, Trust> trustMap = trustCache.get(owner);
|
||||
|
||||
if (trustMap != null) {
|
||||
trust = trustMap.get(fingerprint);
|
||||
if (trust != null) {
|
||||
return trust;
|
||||
}
|
||||
} else {
|
||||
trustMap = new HashMap<>();
|
||||
trustCache.put(owner, trustMap);
|
||||
}
|
||||
|
||||
trust = readTrust(owner, fingerprint);
|
||||
trustMap.put(fingerprint, trust);
|
||||
|
||||
return trust;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setTrust(BareJid owner, OpenPgpV4Fingerprint fingerprint, Trust trust) throws IOException {
|
||||
Map<OpenPgpV4Fingerprint, Trust> trustMap = trustCache.get(owner);
|
||||
if (trust == null) {
|
||||
trustMap = new HashMap<>();
|
||||
trustCache.put(owner, trustMap);
|
||||
}
|
||||
|
||||
if (trustMap.get(fingerprint) == trust) {
|
||||
return;
|
||||
}
|
||||
|
||||
trustMap.put(fingerprint, trust);
|
||||
writeTrust(owner, fingerprint, trust);
|
||||
}
|
||||
}
|
|
@ -32,16 +32,10 @@ import org.jxmpp.jid.BareJid;
|
|||
|
||||
public interface OpenPgpKeyStore {
|
||||
|
||||
PGPPublicKeyRingCollection readPublicKeysOf(BareJid owner) throws IOException, PGPException;
|
||||
|
||||
void writePublicKeysOf(BareJid owner, PGPPublicKeyRingCollection publicKeys) throws IOException;
|
||||
|
||||
PGPPublicKeyRingCollection getPublicKeysOf(BareJid owner) throws IOException, PGPException;
|
||||
|
||||
PGPSecretKeyRingCollection readSecretKeysOf(BareJid owner) throws IOException, PGPException;
|
||||
|
||||
void writeSecretKeysOf(BareJid owner, PGPSecretKeyRingCollection secretKeys) throws IOException;
|
||||
|
||||
PGPSecretKeyRingCollection getSecretKeysOf(BareJid owner) throws IOException, PGPException;
|
||||
|
||||
PGPPublicKeyRing getPublicKeyRing(BareJid owner, OpenPgpV4Fingerprint fingerprint) throws IOException, PGPException;
|
||||
|
|
|
@ -21,7 +21,6 @@ import java.util.Date;
|
|||
import java.util.Map;
|
||||
|
||||
import org.jivesoftware.smackx.ox.OpenPgpV4Fingerprint;
|
||||
import org.jivesoftware.smackx.ox.element.PublicKeysListElement;
|
||||
|
||||
import org.jxmpp.jid.BareJid;
|
||||
|
||||
|
@ -29,9 +28,5 @@ public interface OpenPgpMetadataStore {
|
|||
|
||||
Map<OpenPgpV4Fingerprint, Date> getAnnouncedFingerprintsOf(BareJid contact) throws IOException;
|
||||
|
||||
Map<OpenPgpV4Fingerprint, Date> readAnnouncedFingerprintsOf(BareJid contact) throws IOException;
|
||||
|
||||
void writeAnnouncedFingerprintsOf(BareJid contact, PublicKeysListElement metadata) throws IOException;
|
||||
|
||||
|
||||
void setAnnouncedFingerprintsOf(BareJid contact, Map<OpenPgpV4Fingerprint, Date> data) throws IOException;
|
||||
}
|
||||
|
|
|
@ -16,15 +16,17 @@
|
|||
*/
|
||||
package org.jivesoftware.smackx.ox.v2.store;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
import org.jivesoftware.smackx.ox.OpenPgpV4Fingerprint;
|
||||
|
||||
import org.jxmpp.jid.BareJid;
|
||||
|
||||
public interface OpenPgpTrustStore {
|
||||
|
||||
Trust getTrust(BareJid owner, OpenPgpV4Fingerprint fingerprint);
|
||||
Trust getTrust(BareJid owner, OpenPgpV4Fingerprint fingerprint) throws IOException;
|
||||
|
||||
void setTrust(BareJid owner, OpenPgpV4Fingerprint fingerprint, Trust trust);
|
||||
void setTrust(BareJid owner, OpenPgpV4Fingerprint fingerprint, Trust trust) throws IOException;
|
||||
|
||||
enum Trust {
|
||||
trusted,
|
||||
|
|
|
@ -21,6 +21,7 @@ import static org.jivesoftware.smackx.ox.util.FileUtils.prepareFileOutputStream;
|
|||
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.IOException;
|
||||
import java.io.OutputStream;
|
||||
|
||||
|
@ -48,17 +49,41 @@ public class FileBasedOpenPgpKeyStore extends AbstractOpenPgpKeyStore {
|
|||
@Override
|
||||
public void writePublicKeysOf(BareJid owner, PGPPublicKeyRingCollection publicKeys) throws IOException {
|
||||
File file = getPublicKeyRingPath(owner);
|
||||
OutputStream outputStream = prepareFileOutputStream(file);
|
||||
publicKeys.encode(outputStream);
|
||||
outputStream.close();
|
||||
OutputStream outputStream = null;
|
||||
try {
|
||||
outputStream = prepareFileOutputStream(file);
|
||||
publicKeys.encode(outputStream);
|
||||
outputStream.close();
|
||||
} catch (IOException e) {
|
||||
if (outputStream != null) {
|
||||
try {
|
||||
outputStream.close();
|
||||
} catch (IOException ignored) {
|
||||
// Don't care
|
||||
}
|
||||
}
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeSecretKeysOf(BareJid owner, PGPSecretKeyRingCollection secretKeys) throws IOException {
|
||||
File file = getSecretKeyRingPath(owner);
|
||||
OutputStream outputStream = prepareFileOutputStream(file);
|
||||
secretKeys.encode(outputStream);
|
||||
outputStream.close();
|
||||
OutputStream outputStream = null;
|
||||
try {
|
||||
outputStream = prepareFileOutputStream(file);
|
||||
secretKeys.encode(outputStream);
|
||||
outputStream.close();
|
||||
} catch (IOException e) {
|
||||
if (outputStream != null) {
|
||||
try {
|
||||
outputStream.close();
|
||||
} catch (IOException ignored) {
|
||||
// Don't care
|
||||
}
|
||||
}
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -69,7 +94,7 @@ public class FileBasedOpenPgpKeyStore extends AbstractOpenPgpKeyStore {
|
|||
FileInputStream inputStream;
|
||||
try {
|
||||
inputStream = prepareFileInputStream(file);
|
||||
} catch (IOException e) {
|
||||
} catch (FileNotFoundException e) {
|
||||
return null;
|
||||
}
|
||||
|
||||
|
@ -85,7 +110,7 @@ public class FileBasedOpenPgpKeyStore extends AbstractOpenPgpKeyStore {
|
|||
FileInputStream inputStream;
|
||||
try {
|
||||
inputStream = prepareFileInputStream(file);
|
||||
} catch (IOException e) {
|
||||
} catch (FileNotFoundException e) {
|
||||
return null;
|
||||
}
|
||||
|
||||
|
|
|
@ -29,7 +29,6 @@ import java.util.logging.Level;
|
|||
import java.util.logging.Logger;
|
||||
|
||||
import org.jivesoftware.smackx.ox.OpenPgpV4Fingerprint;
|
||||
import org.jivesoftware.smackx.ox.element.PublicKeysListElement;
|
||||
import org.jivesoftware.smackx.ox.util.Util;
|
||||
import org.jivesoftware.smackx.ox.v2.store.AbstractOpenPgpMetadataStore;
|
||||
|
||||
|
@ -55,15 +54,10 @@ public class FileBasedOpenPgpMetadataStore extends AbstractOpenPgpMetadataStore
|
|||
}
|
||||
|
||||
@Override
|
||||
public void writeAnnouncedFingerprintsOf(BareJid contact, PublicKeysListElement metadata)
|
||||
public void writeAnnouncedFingerprintsOf(BareJid contact, Map<OpenPgpV4Fingerprint, Date> metadata)
|
||||
throws IOException {
|
||||
File destination = getAnnouncedFingerprintsPath(contact);
|
||||
Map<OpenPgpV4Fingerprint, Date> fingerprintDateMap = new HashMap<>();
|
||||
for (OpenPgpV4Fingerprint fingerprint : metadata.getMetadata().keySet()) {
|
||||
fingerprintDateMap.put(fingerprint, metadata.getMetadata().get(fingerprint).getDate());
|
||||
}
|
||||
|
||||
writeFingerprintsAndDates(fingerprintDateMap, destination);
|
||||
writeFingerprintsAndDates(metadata, destination);
|
||||
}
|
||||
|
||||
private Map<OpenPgpV4Fingerprint, Date> readFingerprintsAndDates(File source) throws IOException {
|
||||
|
@ -120,6 +114,7 @@ public class FileBasedOpenPgpMetadataStore extends AbstractOpenPgpMetadataStore
|
|||
(date != null ? XmppDateTime.formatXEP0082Date(date) : XmppDateTime.formatXEP0082Date(new Date()));
|
||||
writer.write(line);
|
||||
}
|
||||
writer.flush();
|
||||
writer.close();
|
||||
} catch (IOException e) {
|
||||
if (writer != null) {
|
||||
|
|
|
@ -16,18 +16,24 @@
|
|||
*/
|
||||
package org.jivesoftware.smackx.ox.v2.store.filebased;
|
||||
|
||||
import static org.jivesoftware.smackx.ox.util.FileUtils.prepareFileInputStream;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.BufferedWriter;
|
||||
import java.io.File;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.nio.file.Files;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
import org.jivesoftware.smackx.ox.OpenPgpV4Fingerprint;
|
||||
import org.jivesoftware.smackx.ox.v2.store.OpenPgpTrustStore;
|
||||
import org.jivesoftware.smackx.ox.util.Util;
|
||||
import org.jivesoftware.smackx.ox.v2.store.AbstractOpenPgpTrustStore;
|
||||
|
||||
import org.jxmpp.jid.BareJid;
|
||||
|
||||
public class FileBasedOpenPgpTrustStore implements OpenPgpTrustStore {
|
||||
public class FileBasedOpenPgpTrustStore extends AbstractOpenPgpTrustStore {
|
||||
|
||||
private static final Logger LOGGER = Logger.getLogger(FileBasedOpenPgpTrustStore.class.getName());
|
||||
|
||||
private final File basePath;
|
||||
|
||||
|
@ -40,20 +46,72 @@ public class FileBasedOpenPgpTrustStore implements OpenPgpTrustStore {
|
|||
}
|
||||
|
||||
@Override
|
||||
public Trust getTrust(BareJid owner, OpenPgpV4Fingerprint fingerprint) {
|
||||
protected Trust readTrust(BareJid owner, OpenPgpV4Fingerprint fingerprint) throws IOException {
|
||||
File file = getTrustPath(owner, fingerprint);
|
||||
BufferedReader reader = null;
|
||||
try {
|
||||
InputStream inputStream = prepareFileInputStream(file);
|
||||
return Trust.trusted;
|
||||
reader = Files.newBufferedReader(file.toPath(), Util.UTF8);
|
||||
|
||||
Trust trust = null;
|
||||
String line; int lineNr = 0;
|
||||
while ((line = reader.readLine()) != null) {
|
||||
lineNr++;
|
||||
try {
|
||||
trust = Trust.valueOf(line);
|
||||
break;
|
||||
} catch (IllegalArgumentException e) {
|
||||
LOGGER.log(Level.WARNING, "Skipping invalid trust record in line " + lineNr + " of file " +
|
||||
file.getAbsolutePath());
|
||||
}
|
||||
}
|
||||
reader.close();
|
||||
return trust != null ? trust : Trust.undecided;
|
||||
} catch (IOException e) {
|
||||
return Trust.undecided;
|
||||
if (reader != null) {
|
||||
try {
|
||||
reader.close();
|
||||
} catch (IOException ignored) {
|
||||
// Don't care
|
||||
}
|
||||
}
|
||||
|
||||
if (e instanceof FileNotFoundException) {
|
||||
return Trust.undecided;
|
||||
}
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setTrust(BareJid owner, OpenPgpV4Fingerprint fingerprint, Trust trust) {
|
||||
protected void writeTrust(BareJid owner, OpenPgpV4Fingerprint fingerprint, Trust trust) throws IOException {
|
||||
File file = getTrustPath(owner, fingerprint);
|
||||
|
||||
if (!file.exists()) {
|
||||
if (!file.createNewFile()) {
|
||||
throw new IOException("Cannot create file " + file.getAbsolutePath());
|
||||
}
|
||||
} else {
|
||||
if (file.isDirectory()) {
|
||||
throw new IOException("File " + file.getAbsolutePath() + " is a directory.");
|
||||
}
|
||||
}
|
||||
|
||||
BufferedWriter writer = null;
|
||||
try {
|
||||
writer = Files.newBufferedWriter(file.toPath(), Util.UTF8);
|
||||
writer.write(trust.toString());
|
||||
writer.flush();
|
||||
writer.close();
|
||||
} catch (IOException e) {
|
||||
if (writer != null) {
|
||||
try {
|
||||
writer.close();
|
||||
} catch (IOException ignored) {
|
||||
// Don't care
|
||||
}
|
||||
}
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
|
||||
private File getTrustPath(BareJid owner, OpenPgpV4Fingerprint fingerprint) {
|
||||
|
|
Loading…
Reference in a new issue