diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/transport/KeyManager.java b/bramble-api/src/main/java/org/briarproject/bramble/api/transport/KeyManager.java index 086e46416..db906e649 100644 --- a/bramble-api/src/main/java/org/briarproject/bramble/api/transport/KeyManager.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/transport/KeyManager.java @@ -23,7 +23,7 @@ public interface KeyManager { /** * Derives and stores a set of rotation mode transport keys for * communicating with the given contact over the given transport and - * returns the key set ID. + * returns the key set ID, or null if the transport is not supported. *

* {@link StreamContext StreamContexts} for the contact can be created * after this method has returned. @@ -31,6 +31,7 @@ public interface KeyManager { * @param alice True if the local party is Alice * @param active Whether the derived keys can be used for outgoing streams */ + @Nullable KeySetId addRotationKeys(Transaction txn, ContactId c, TransportId t, SecretKey rootKey, long timestamp, boolean alice, boolean active) throws DbException; diff --git a/bramble-core/src/main/java/org/briarproject/bramble/transport/KeyManagerImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/transport/KeyManagerImpl.java index ded31ab50..8d6ce998c 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/transport/KeyManagerImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/transport/KeyManagerImpl.java @@ -51,7 +51,6 @@ class KeyManagerImpl implements KeyManager, Service, EventListener { private final DatabaseComponent db; private final Executor dbExecutor; private final PluginConfig pluginConfig; - private final TransportKeyManagerFactory transportKeyManagerFactory; private final TransportCrypto transportCrypto; private final ConcurrentHashMap managers; @@ -61,34 +60,39 @@ class KeyManagerImpl implements KeyManager, Service, EventListener { KeyManagerImpl(DatabaseComponent db, @DatabaseExecutor Executor dbExecutor, PluginConfig pluginConfig, - TransportKeyManagerFactory transportKeyManagerFactory, - TransportCrypto transportCrypto) { + TransportCrypto transportCrypto, + TransportKeyManagerFactory transportKeyManagerFactory) { this.db = db; this.dbExecutor = dbExecutor; this.pluginConfig = pluginConfig; - this.transportKeyManagerFactory = transportKeyManagerFactory; this.transportCrypto = transportCrypto; managers = new ConcurrentHashMap<>(); + for (SimplexPluginFactory f : pluginConfig.getSimplexFactories()) { + TransportKeyManager m = transportKeyManagerFactory. + createTransportKeyManager(f.getId(), f.getMaxLatency()); + managers.put(f.getId(), m); + } + for (DuplexPluginFactory f : pluginConfig.getDuplexFactories()) { + TransportKeyManager m = transportKeyManagerFactory. + createTransportKeyManager(f.getId(), f.getMaxLatency()); + managers.put(f.getId(), m); + } } @Override public void startService() throws ServiceException { if (used.getAndSet(true)) throw new IllegalStateException(); - Map transports = new HashMap<>(); - for (SimplexPluginFactory f : pluginConfig.getSimplexFactories()) - transports.put(f.getId(), f.getMaxLatency()); - for (DuplexPluginFactory f : pluginConfig.getDuplexFactories()) - transports.put(f.getId(), f.getMaxLatency()); try { db.transaction(false, txn -> { - for (Entry e : transports.entrySet()) - db.addTransport(txn, e.getKey(), e.getValue()); - for (Entry e : transports.entrySet()) { - TransportKeyManager m = transportKeyManagerFactory - .createTransportKeyManager(e.getKey(), - e.getValue()); - managers.put(e.getKey(), m); - m.start(txn); + for (SimplexPluginFactory f : + pluginConfig.getSimplexFactories()) { + db.addTransport(txn, f.getId(), f.getMaxLatency()); + managers.get(f.getId()).start(txn); + } + for (DuplexPluginFactory f : + pluginConfig.getDuplexFactories()) { + db.addTransport(txn, f.getId(), f.getMaxLatency()); + managers.get(f.getId()).start(txn); } }); } catch (DbException e) { diff --git a/bramble-core/src/test/java/org/briarproject/bramble/transport/KeyManagerImplTest.java b/bramble-core/src/test/java/org/briarproject/bramble/transport/KeyManagerImplTest.java index 142f06538..02bb20244 100644 --- a/bramble-core/src/test/java/org/briarproject/bramble/transport/KeyManagerImplTest.java +++ b/bramble-core/src/test/java/org/briarproject/bramble/transport/KeyManagerImplTest.java @@ -25,6 +25,7 @@ import java.util.Collection; import java.util.Map; import java.util.Random; +import static java.util.Collections.emptyList; import static java.util.Collections.singletonList; import static java.util.Collections.singletonMap; import static org.briarproject.bramble.api.transport.TransportConstants.TAG_LENGTH; @@ -71,8 +72,7 @@ public class KeyManagerImplTest extends BrambleMockTestCase { private final SecretKey rootKey = getSecretKey(); private final Random random = new Random(); - private final KeyManagerImpl keyManager = new KeyManagerImpl(db, executor, - pluginConfig, transportKeyManagerFactory, transportCrypto); + private KeyManagerImpl keyManager; @Before public void testStartService() throws Exception { @@ -83,18 +83,25 @@ public class KeyManagerImplTest extends BrambleMockTestCase { singletonList(pluginFactory); int maxLatency = 1337; - context.checking(new DbExpectations() {{ - oneOf(pluginConfig).getSimplexFactories(); + context.checking(new Expectations() {{ + allowing(pluginConfig).getSimplexFactories(); will(returnValue(factories)); - oneOf(pluginFactory).getId(); + allowing(pluginFactory).getId(); will(returnValue(transportId)); - oneOf(pluginFactory).getMaxLatency(); + allowing(pluginFactory).getMaxLatency(); will(returnValue(maxLatency)); - oneOf(db).addTransport(txn, transportId, maxLatency); + allowing(pluginConfig).getDuplexFactories(); + will(returnValue(emptyList())); oneOf(transportKeyManagerFactory) .createTransportKeyManager(transportId, maxLatency); will(returnValue(transportKeyManager)); - oneOf(pluginConfig).getDuplexFactories(); + }}); + + keyManager = new KeyManagerImpl(db, executor, + pluginConfig, transportCrypto, transportKeyManagerFactory); + + context.checking(new DbExpectations() {{ + oneOf(db).addTransport(txn, transportId, maxLatency); oneOf(db).transaction(with(false), withDbRunnable(txn)); oneOf(transportKeyManager).start(txn); }});