From b8cf58c42617d035ff256e9ad70bbf5135b0e4c9 Mon Sep 17 00:00:00 2001 From: akwizgran <michael@briarproject.org> Date: Mon, 18 Feb 2013 15:55:41 +0000 Subject: [PATCH] Key manager should listen for TransportRemovedEvent and erase keys. --- .../api/transport/ConnectionRecogniser.java | 2 ++ .../transport/ConnectionRecogniserImpl.java | 4 ++++ .../sf/briar/transport/KeyManagerImpl.java | 23 +++++++++++++++++++ 3 files changed, 29 insertions(+) diff --git a/briar-api/src/net/sf/briar/api/transport/ConnectionRecogniser.java b/briar-api/src/net/sf/briar/api/transport/ConnectionRecogniser.java index 12f6ce1b7a..1114d848c8 100644 --- a/briar-api/src/net/sf/briar/api/transport/ConnectionRecogniser.java +++ b/briar-api/src/net/sf/briar/api/transport/ConnectionRecogniser.java @@ -23,5 +23,7 @@ public interface ConnectionRecogniser { void removeSecrets(ContactId c); + void removeSecrets(TransportId t); + void removeSecrets(); } diff --git a/briar-core/src/net/sf/briar/transport/ConnectionRecogniserImpl.java b/briar-core/src/net/sf/briar/transport/ConnectionRecogniserImpl.java index f86b651447..9a4af1ec5d 100644 --- a/briar-core/src/net/sf/briar/transport/ConnectionRecogniserImpl.java +++ b/briar-core/src/net/sf/briar/transport/ConnectionRecogniserImpl.java @@ -64,6 +64,10 @@ class ConnectionRecogniserImpl implements ConnectionRecogniser { r.removeSecrets(c); } + public synchronized void removeSecrets(TransportId t) { + recognisers.remove(t); + } + public synchronized void removeSecrets() { for(TransportConnectionRecogniser r : recognisers.values()) r.removeSecrets(); diff --git a/briar-core/src/net/sf/briar/transport/KeyManagerImpl.java b/briar-core/src/net/sf/briar/transport/KeyManagerImpl.java index d9abc385de..b80a3605b3 100644 --- a/briar-core/src/net/sf/briar/transport/KeyManagerImpl.java +++ b/briar-core/src/net/sf/briar/transport/KeyManagerImpl.java @@ -21,6 +21,7 @@ import net.sf.briar.api.db.DbException; import net.sf.briar.api.db.event.ContactRemovedEvent; import net.sf.briar.api.db.event.DatabaseEvent; import net.sf.briar.api.db.event.DatabaseListener; +import net.sf.briar.api.db.event.TransportRemovedEvent; import net.sf.briar.api.messaging.TransportId; import net.sf.briar.api.transport.ConnectionContext; import net.sf.briar.api.transport.ConnectionRecogniser; @@ -63,6 +64,7 @@ class KeyManagerImpl extends TimerTask implements KeyManager, DatabaseListener { } public synchronized boolean start() { + // Load the temporary secrets and the storage key from the database Collection<TemporarySecret> secrets; try { secrets = db.getSecrets(); @@ -322,6 +324,14 @@ class KeyManagerImpl extends TimerTask implements KeyManager, DatabaseListener { removeAndEraseSecrets(c, incomingOld); removeAndEraseSecrets(c, incomingNew); } + } else if(e instanceof TransportRemovedEvent) { + TransportId t = ((TransportRemovedEvent) e).getTransportId(); + recogniser.removeSecrets(t); + synchronized(this) { + removeAndEraseSecrets(t, outgoing); + removeAndEraseSecrets(t, incomingOld); + removeAndEraseSecrets(t, incomingNew); + } } } @@ -337,6 +347,19 @@ class KeyManagerImpl extends TimerTask implements KeyManager, DatabaseListener { } } + // Locking: this + private void removeAndEraseSecrets(TransportId t, + Map<?, TemporarySecret> m) { + Iterator<TemporarySecret> it = m.values().iterator(); + while(it.hasNext()) { + TemporarySecret s = it.next(); + if(s.getTransportId().equals(t)) { + ByteUtils.erase(s.getSecret()); + it.remove(); + } + } + } + private static class EndpointKey { private final ContactId contactId; -- GitLab