From 8283760e8ae6e8d212fc23ebf683673ba8fb6e6e Mon Sep 17 00:00:00 2001 From: akwizgran Date: Fri, 20 Jul 2018 13:55:30 +0100 Subject: [PATCH] Move local author creation into IdentityManager. --- .../bramble/api/contact/ContactManager.java | 2 +- .../bramble/api/db/DatabaseConfig.java | 5 -- .../bramble/api/identity/IdentityManager.java | 28 ++++++++--- .../api/lifecycle/LifecycleManager.java | 15 +++--- .../bramble/api/sync/ValidationManager.java | 5 +- .../versioning/ClientVersioningManager.java | 2 +- .../bramble/identity/IdentityManagerImpl.java | 43 +++++++++++++--- .../lifecycle/LifecycleManagerImpl.java | 34 +------------ .../bramble/lifecycle/LifecycleModule.java | 13 ++--- .../identity/IdentityManagerImplTest.java | 49 ++++++++++++++++--- .../bramble/test/TestDatabaseConfig.java | 10 ---- .../bramble/test/TestLifecycleModule.java | 9 ++-- .../briar/android/AndroidDatabaseConfig.java | 17 ------- .../briar/android/BriarService.java | 3 +- .../android/login/SetupControllerImpl.java | 15 ++++-- .../login/SetupControllerImplTest.java | 24 ++++++--- .../feed/FeedManagerIntegrationTest.java | 8 ++- .../FeedManagerIntegrationTestComponent.java | 3 ++ .../SimplexMessagingIntegrationTest.java | 16 +++--- .../briar/test/BriarIntegrationTest.java | 19 ++++--- 20 files changed, 177 insertions(+), 143 deletions(-) diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/contact/ContactManager.java b/bramble-api/src/main/java/org/briarproject/bramble/api/contact/ContactManager.java index 1f9daf48a..589fa53c2 100644 --- a/bramble-api/src/main/java/org/briarproject/bramble/api/contact/ContactManager.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/contact/ContactManager.java @@ -16,7 +16,7 @@ public interface ContactManager { /** * Registers a hook to be called whenever a contact is added or removed. * This method should be called before - * {@link LifecycleManager#startServices(String)}. + * {@link LifecycleManager#startServices()}. */ void registerContactHook(ContactHook hook); diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/db/DatabaseConfig.java b/bramble-api/src/main/java/org/briarproject/bramble/api/db/DatabaseConfig.java index 0be85eba9..e431c15f2 100644 --- a/bramble-api/src/main/java/org/briarproject/bramble/api/db/DatabaseConfig.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/db/DatabaseConfig.java @@ -21,10 +21,5 @@ public interface DatabaseConfig { @Nullable SecretKey getEncryptionKey(); - void setLocalAuthorName(String nickname); - - @Nullable - String getLocalAuthorName(); - long getMaxSize(); } diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/identity/IdentityManager.java b/bramble-api/src/main/java/org/briarproject/bramble/api/identity/IdentityManager.java index bb584fec4..8160eb06d 100644 --- a/bramble-api/src/main/java/org/briarproject/bramble/api/identity/IdentityManager.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/identity/IdentityManager.java @@ -1,5 +1,6 @@ package org.briarproject.bramble.api.identity; +import org.briarproject.bramble.api.crypto.CryptoExecutor; import org.briarproject.bramble.api.db.DbException; import org.briarproject.bramble.api.db.Transaction; import org.briarproject.bramble.api.identity.Author.Status; @@ -9,29 +10,40 @@ import org.briarproject.bramble.api.nullsafety.NotNullByDefault; public interface IdentityManager { /** - * Stores the local pseudonym. + * Creates a local identity with the given name. */ - void registerLocalAuthor(LocalAuthor a) throws DbException; + @CryptoExecutor + LocalAuthor createLocalAuthor(String name); /** - * Returns the cached main local identity, non-blocking, or loads it from - * the db, blocking + * Registers the given local identity with the manager. The identity is + * not stored until {@link #storeLocalAuthor()} is called. + */ + void registerLocalAuthor(LocalAuthor a); + + /** + * Stores the local identity registered with + * {@link #registerLocalAuthor(LocalAuthor)}, if any. + */ + void storeLocalAuthor() throws DbException; + + /** + * Returns the cached local identity or loads it from the database. */ LocalAuthor getLocalAuthor() throws DbException; /** - * Returns the cached main local identity, non-blocking, or loads it from - * the db, blocking, within the given Transaction. + * Returns the cached local identity or loads it from the database. */ LocalAuthor getLocalAuthor(Transaction txn) throws DbException; /** - * Returns the trust-level status of the author + * Returns the {@link Status} of the given author. */ Status getAuthorStatus(AuthorId a) throws DbException; /** - * Returns the trust-level status of the author + * Returns the {@link Status} of the given author. */ Status getAuthorStatus(Transaction txn, AuthorId a) throws DbException; diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/lifecycle/LifecycleManager.java b/bramble-api/src/main/java/org/briarproject/bramble/api/lifecycle/LifecycleManager.java index d3cd1bc24..c54910b62 100644 --- a/bramble-api/src/main/java/org/briarproject/bramble/api/lifecycle/LifecycleManager.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/lifecycle/LifecycleManager.java @@ -6,8 +6,6 @@ import org.briarproject.bramble.api.sync.Client; import java.util.concurrent.ExecutorService; -import javax.annotation.Nullable; - /** * Manages the lifecycle of the app, starting {@link Client Clients}, starting * and stopping {@link Service Services}, shutting down @@ -18,7 +16,7 @@ import javax.annotation.Nullable; public interface LifecycleManager { /** - * The result of calling {@link #startServices(String)}. + * The result of calling {@link #startServices()}. */ enum StartResult { ALREADY_RUNNING, @@ -44,28 +42,27 @@ public interface LifecycleManager { /** * Registers a {@link Service} to be started and stopped. This method - * should be called before {@link #startServices(String)}. + * should be called before {@link #startServices()}. */ void registerService(Service s); /** * Registers a {@link Client} to be started. This method should be called - * before {@link #startServices(String)}. + * before {@link #startServices()}. */ void registerClient(Client c); /** * Registers an {@link ExecutorService} to be shut down. This method - * should be called before {@link #startServices(String)}. + * should be called before {@link #startServices()}. */ void registerForShutdown(ExecutorService e); /** - * Opens the {@link DatabaseComponent}, optionally creates a local author - * with the provided nickname, and starts any registered + * Opens the {@link DatabaseComponent} and starts any registered * {@link Client Clients} and {@link Service Services}. */ - StartResult startServices(@Nullable String nickname); + StartResult startServices(); /** * Stops any registered {@link Service Services}, shuts down any diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/sync/ValidationManager.java b/bramble-api/src/main/java/org/briarproject/bramble/api/sync/ValidationManager.java index 1718cac81..5fe103ce8 100644 --- a/bramble-api/src/main/java/org/briarproject/bramble/api/sync/ValidationManager.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/sync/ValidationManager.java @@ -35,7 +35,7 @@ public interface ValidationManager { /** * Registers the message validator for the given client. This method - * should be called before {@link LifecycleManager#startServices(String)}. + * should be called before {@link LifecycleManager#startServices()}. */ void registerMessageValidator(ClientId c, int majorVersion, MessageValidator v); @@ -43,8 +43,7 @@ public interface ValidationManager { /** * Registers the incoming message hook for the given client. The hook will * be called once for each incoming message that passes validation. This - * method should be called before - * {@link LifecycleManager#startServices(String)}. + * method should be called before {@link LifecycleManager#startServices()}. */ void registerIncomingMessageHook(ClientId c, int majorVersion, IncomingMessageHook hook); diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/versioning/ClientVersioningManager.java b/bramble-api/src/main/java/org/briarproject/bramble/api/versioning/ClientVersioningManager.java index 0cb2fc478..f2e98ea2c 100644 --- a/bramble-api/src/main/java/org/briarproject/bramble/api/versioning/ClientVersioningManager.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/versioning/ClientVersioningManager.java @@ -25,7 +25,7 @@ public interface ClientVersioningManager { /** * Registers a client that will be advertised to contacts. The hook will * be called when the visibility of the client changes. This method should - * be called before {@link LifecycleManager#startServices(String)}. + * be called before {@link LifecycleManager#startServices()}. */ void registerClient(ClientId clientId, int majorVersion, int minorVersion, ClientVersioningHook hook); diff --git a/bramble-core/src/main/java/org/briarproject/bramble/identity/IdentityManagerImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/identity/IdentityManagerImpl.java index 11e8220c9..44bf94550 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/identity/IdentityManagerImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/identity/IdentityManagerImpl.java @@ -1,10 +1,13 @@ package org.briarproject.bramble.identity; import org.briarproject.bramble.api.contact.Contact; +import org.briarproject.bramble.api.crypto.CryptoComponent; +import org.briarproject.bramble.api.crypto.KeyPair; import org.briarproject.bramble.api.db.DatabaseComponent; import org.briarproject.bramble.api.db.DbException; import org.briarproject.bramble.api.db.Transaction; import org.briarproject.bramble.api.identity.Author.Status; +import org.briarproject.bramble.api.identity.AuthorFactory; import org.briarproject.bramble.api.identity.AuthorId; import org.briarproject.bramble.api.identity.IdentityManager; import org.briarproject.bramble.api.identity.LocalAuthor; @@ -21,6 +24,8 @@ import static org.briarproject.bramble.api.identity.Author.Status.OURSELVES; import static org.briarproject.bramble.api.identity.Author.Status.UNKNOWN; import static org.briarproject.bramble.api.identity.Author.Status.UNVERIFIED; import static org.briarproject.bramble.api.identity.Author.Status.VERIFIED; +import static org.briarproject.bramble.util.LogUtils.logDuration; +import static org.briarproject.bramble.util.LogUtils.now; @ThreadSafe @NotNullByDefault @@ -30,25 +35,51 @@ class IdentityManagerImpl implements IdentityManager { Logger.getLogger(IdentityManagerImpl.class.getName()); private final DatabaseComponent db; + private final CryptoComponent crypto; + private final AuthorFactory authorFactory; // The local author is immutable so we can cache it @Nullable private volatile LocalAuthor cachedAuthor; @Inject - IdentityManagerImpl(DatabaseComponent db) { + IdentityManagerImpl(DatabaseComponent db, CryptoComponent crypto, + AuthorFactory authorFactory) { this.db = db; + this.crypto = crypto; + this.authorFactory = authorFactory; } @Override - public void registerLocalAuthor(LocalAuthor localAuthor) - throws DbException { + public LocalAuthor createLocalAuthor(String name) { + long start = now(); + KeyPair keyPair = crypto.generateSignatureKeyPair(); + byte[] publicKey = keyPair.getPublic().getEncoded(); + byte[] privateKey = keyPair.getPrivate().getEncoded(); + LocalAuthor localAuthor = authorFactory.createLocalAuthor(name, + publicKey, privateKey); + logDuration(LOG, "Creating local author", start); + return localAuthor; + } + + @Override + public void registerLocalAuthor(LocalAuthor a) { + cachedAuthor = a; + LOG.info("Local author registered"); + } + + @Override + public void storeLocalAuthor() throws DbException { + LocalAuthor cached = cachedAuthor; + if (cached == null) { + LOG.info("No local author to store"); + return; + } Transaction txn = db.startTransaction(false); try { - db.addLocalAuthor(txn, localAuthor); + db.addLocalAuthor(txn, cached); db.commitTransaction(txn); - cachedAuthor = localAuthor; - LOG.info("Local author registered"); + LOG.info("Local author stored"); } finally { db.endTransaction(txn); } diff --git a/bramble-core/src/main/java/org/briarproject/bramble/lifecycle/LifecycleManagerImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/lifecycle/LifecycleManagerImpl.java index 68c694189..b99ab31e1 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/lifecycle/LifecycleManagerImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/lifecycle/LifecycleManagerImpl.java @@ -1,7 +1,5 @@ package org.briarproject.bramble.lifecycle; -import org.briarproject.bramble.api.crypto.CryptoComponent; -import org.briarproject.bramble.api.crypto.KeyPair; import org.briarproject.bramble.api.db.DataTooNewException; import org.briarproject.bramble.api.db.DataTooOldException; import org.briarproject.bramble.api.db.DatabaseComponent; @@ -9,9 +7,7 @@ import org.briarproject.bramble.api.db.DbException; import org.briarproject.bramble.api.db.MigrationListener; import org.briarproject.bramble.api.db.Transaction; import org.briarproject.bramble.api.event.EventBus; -import org.briarproject.bramble.api.identity.AuthorFactory; import org.briarproject.bramble.api.identity.IdentityManager; -import org.briarproject.bramble.api.identity.LocalAuthor; import org.briarproject.bramble.api.lifecycle.LifecycleManager; import org.briarproject.bramble.api.lifecycle.Service; import org.briarproject.bramble.api.lifecycle.ServiceException; @@ -26,7 +22,6 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Semaphore; import java.util.logging.Logger; -import javax.annotation.Nullable; import javax.annotation.concurrent.ThreadSafe; import javax.inject.Inject; @@ -60,8 +55,6 @@ class LifecycleManagerImpl implements LifecycleManager, MigrationListener { private final List services; private final List clients; private final List executors; - private final CryptoComponent crypto; - private final AuthorFactory authorFactory; private final IdentityManager identityManager; private final Semaphore startStopSemaphore = new Semaphore(1); private final CountDownLatch dbLatch = new CountDownLatch(1); @@ -72,12 +65,9 @@ class LifecycleManagerImpl implements LifecycleManager, MigrationListener { @Inject LifecycleManagerImpl(DatabaseComponent db, EventBus eventBus, - CryptoComponent crypto, AuthorFactory authorFactory, IdentityManager identityManager) { this.db = db; this.eventBus = eventBus; - this.crypto = crypto; - this.authorFactory = authorFactory; this.identityManager = identityManager; services = new CopyOnWriteArrayList<>(); clients = new CopyOnWriteArrayList<>(); @@ -104,25 +94,8 @@ class LifecycleManagerImpl implements LifecycleManager, MigrationListener { executors.add(e); } - private LocalAuthor createLocalAuthor(String nickname) { - long start = now(); - KeyPair keyPair = crypto.generateSignatureKeyPair(); - byte[] publicKey = keyPair.getPublic().getEncoded(); - byte[] privateKey = keyPair.getPrivate().getEncoded(); - LocalAuthor localAuthor = authorFactory - .createLocalAuthor(nickname, publicKey, privateKey); - logDuration(LOG, "Creating local author", start); - return localAuthor; - } - - private void registerLocalAuthor(LocalAuthor author) throws DbException { - long start = now(); - identityManager.registerLocalAuthor(author); - logDuration(LOG, "Registering local author", start); - } - @Override - public StartResult startServices(@Nullable String nickname) { + public StartResult startServices() { if (!startStopSemaphore.tryAcquire()) { LOG.info("Already starting or stopping"); return ALREADY_RUNNING; @@ -134,10 +107,7 @@ class LifecycleManagerImpl implements LifecycleManager, MigrationListener { boolean reopened = db.open(this); if (reopened) logDuration(LOG, "Reopening database", start); else logDuration(LOG, "Creating database", start); - - if (nickname != null) { - registerLocalAuthor(createLocalAuthor(nickname)); - } + identityManager.storeLocalAuthor(); state = STARTING_SERVICES; dbLatch.countDown(); diff --git a/bramble-core/src/main/java/org/briarproject/bramble/lifecycle/LifecycleModule.java b/bramble-core/src/main/java/org/briarproject/bramble/lifecycle/LifecycleModule.java index 8fcf789ed..43db266ef 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/lifecycle/LifecycleModule.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/lifecycle/LifecycleModule.java @@ -1,10 +1,5 @@ package org.briarproject.bramble.lifecycle; -import org.briarproject.bramble.api.crypto.CryptoComponent; -import org.briarproject.bramble.api.db.DatabaseComponent; -import org.briarproject.bramble.api.event.EventBus; -import org.briarproject.bramble.api.identity.AuthorFactory; -import org.briarproject.bramble.api.identity.IdentityManager; import org.briarproject.bramble.api.lifecycle.IoExecutor; import org.briarproject.bramble.api.lifecycle.LifecycleManager; import org.briarproject.bramble.api.lifecycle.ShutdownManager; @@ -54,11 +49,9 @@ public class LifecycleModule { @Provides @Singleton - LifecycleManager provideLifecycleManager(DatabaseComponent db, - EventBus eventBus, CryptoComponent crypto, - AuthorFactory authorFactory, IdentityManager identityManager) { - return new LifecycleManagerImpl(db, eventBus, crypto, authorFactory, - identityManager); + LifecycleManager provideLifecycleManager( + LifecycleManagerImpl lifecycleManager) { + return lifecycleManager; } @Provides diff --git a/bramble-core/src/test/java/org/briarproject/bramble/identity/IdentityManagerImplTest.java b/bramble-core/src/test/java/org/briarproject/bramble/identity/IdentityManagerImplTest.java index e24499ba7..2926cd3f3 100644 --- a/bramble-core/src/test/java/org/briarproject/bramble/identity/IdentityManagerImplTest.java +++ b/bramble-core/src/test/java/org/briarproject/bramble/identity/IdentityManagerImplTest.java @@ -2,15 +2,21 @@ package org.briarproject.bramble.identity; import org.briarproject.bramble.api.contact.Contact; import org.briarproject.bramble.api.contact.ContactId; +import org.briarproject.bramble.api.crypto.CryptoComponent; +import org.briarproject.bramble.api.crypto.KeyPair; +import org.briarproject.bramble.api.crypto.PrivateKey; +import org.briarproject.bramble.api.crypto.PublicKey; import org.briarproject.bramble.api.db.DatabaseComponent; import org.briarproject.bramble.api.db.DbException; import org.briarproject.bramble.api.db.Transaction; import org.briarproject.bramble.api.identity.Author; +import org.briarproject.bramble.api.identity.AuthorFactory; import org.briarproject.bramble.api.identity.AuthorId; import org.briarproject.bramble.api.identity.IdentityManager; import org.briarproject.bramble.api.identity.LocalAuthor; import org.briarproject.bramble.test.BrambleMockTestCase; import org.jmock.Expectations; +import org.junit.Before; import org.junit.Test; import java.util.ArrayList; @@ -27,24 +33,48 @@ import static org.junit.Assert.assertEquals; public class IdentityManagerImplTest extends BrambleMockTestCase { - private final IdentityManager identityManager; private final DatabaseComponent db = context.mock(DatabaseComponent.class); + private final CryptoComponent crypto = context.mock(CryptoComponent.class); + private final AuthorFactory authorFactory = + context.mock(AuthorFactory.class); + private final PublicKey publicKey = context.mock(PublicKey.class); + private final PrivateKey privateKey = context.mock(PrivateKey.class); + private final Transaction txn = new Transaction(null, false); private final LocalAuthor localAuthor = getLocalAuthor(); private final Collection localAuthors = Collections.singletonList(localAuthor); + private final String authorName = localAuthor.getName(); + private final KeyPair keyPair = new KeyPair(publicKey, privateKey); + private final byte[] publicKeyBytes = localAuthor.getPublicKey(); + private final byte[] privateKeyBytes = localAuthor.getPrivateKey(); + private IdentityManager identityManager; - public IdentityManagerImplTest() { - identityManager = new IdentityManagerImpl(db); + @Before + public void setUp() { + identityManager = new IdentityManagerImpl(db, crypto, authorFactory); } @Test - public void testRegisterLocalAuthor() throws DbException { - expectRegisterLocalAuthor(); - identityManager.registerLocalAuthor(localAuthor); + public void testCreateLocalAuthor() { + context.checking(new Expectations() {{ + oneOf(crypto).generateSignatureKeyPair(); + will(returnValue(keyPair)); + oneOf(publicKey).getEncoded(); + will(returnValue(publicKeyBytes)); + oneOf(privateKey).getEncoded(); + will(returnValue(privateKeyBytes)); + oneOf(authorFactory).createLocalAuthor(authorName, + publicKeyBytes, privateKeyBytes); + will(returnValue(localAuthor)); + }}); + + assertEquals(localAuthor, + identityManager.createLocalAuthor(authorName)); } - private void expectRegisterLocalAuthor() throws DbException { + @Test + public void testRegisterAndStoreLocalAuthor() throws DbException { context.checking(new Expectations() {{ oneOf(db).startTransaction(false); will(returnValue(txn)); @@ -52,6 +82,10 @@ public class IdentityManagerImplTest extends BrambleMockTestCase { oneOf(db).commitTransaction(txn); oneOf(db).endTransaction(txn); }}); + + identityManager.registerLocalAuthor(localAuthor); + assertEquals(localAuthor, identityManager.getLocalAuthor()); + identityManager.storeLocalAuthor(); } @Test @@ -69,7 +103,6 @@ public class IdentityManagerImplTest extends BrambleMockTestCase { @Test public void testGetCachedLocalAuthor() throws DbException { - expectRegisterLocalAuthor(); identityManager.registerLocalAuthor(localAuthor); assertEquals(localAuthor, identityManager.getLocalAuthor()); } diff --git a/bramble-core/src/test/java/org/briarproject/bramble/test/TestDatabaseConfig.java b/bramble-core/src/test/java/org/briarproject/bramble/test/TestDatabaseConfig.java index a830795f3..7e5ad34e7 100644 --- a/bramble-core/src/test/java/org/briarproject/bramble/test/TestDatabaseConfig.java +++ b/bramble-core/src/test/java/org/briarproject/bramble/test/TestDatabaseConfig.java @@ -46,16 +46,6 @@ public class TestDatabaseConfig implements DatabaseConfig { return key; } - @Override - public void setLocalAuthorName(String nickname) { - - } - - @Override - public String getLocalAuthorName() { - return null; - } - @Override public long getMaxSize() { return maxSize; diff --git a/bramble-core/src/test/java/org/briarproject/bramble/test/TestLifecycleModule.java b/bramble-core/src/test/java/org/briarproject/bramble/test/TestLifecycleModule.java index 15943adc2..01d97c52b 100644 --- a/bramble-core/src/test/java/org/briarproject/bramble/test/TestLifecycleModule.java +++ b/bramble-core/src/test/java/org/briarproject/bramble/test/TestLifecycleModule.java @@ -11,7 +11,6 @@ import java.util.concurrent.Executor; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; -import javax.annotation.Nullable; import javax.inject.Singleton; import dagger.Module; @@ -40,7 +39,7 @@ public class TestLifecycleModule { } @Override - public StartResult startServices(@Nullable String nickname) { + public StartResult startServices() { return StartResult.SUCCESS; } @@ -49,15 +48,15 @@ public class TestLifecycleModule { } @Override - public void waitForDatabase() throws InterruptedException { + public void waitForDatabase() { } @Override - public void waitForStartup() throws InterruptedException { + public void waitForStartup() { } @Override - public void waitForShutdown() throws InterruptedException { + public void waitForShutdown() { } @Override diff --git a/briar-android/src/main/java/org/briarproject/briar/android/AndroidDatabaseConfig.java b/briar-android/src/main/java/org/briarproject/briar/android/AndroidDatabaseConfig.java index e92a356ee..1f21acdb0 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/AndroidDatabaseConfig.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/AndroidDatabaseConfig.java @@ -21,8 +21,6 @@ class AndroidDatabaseConfig implements DatabaseConfig { @Nullable private volatile SecretKey key = null; - @Nullable - private volatile String nickname = null; AndroidDatabaseConfig(File dbDir, File keyDir) { this.dbDir = dbDir; @@ -70,21 +68,6 @@ class AndroidDatabaseConfig implements DatabaseConfig { this.key = key; } - @Override - public void setLocalAuthorName(String nickname) { - LOG.info("Setting local author name"); - this.nickname = nickname; - } - - @Override - @Nullable - public String getLocalAuthorName() { - String nickname = this.nickname; - if (LOG.isLoggable(INFO)) - LOG.info("Local author name has been set: " + (nickname != null)); - return nickname; - } - @Override @Nullable public SecretKey getEncryptionKey() { diff --git a/briar-android/src/main/java/org/briarproject/briar/android/BriarService.java b/briar-android/src/main/java/org/briarproject/briar/android/BriarService.java index 523935278..f40d2a42b 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/BriarService.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/BriarService.java @@ -141,8 +141,7 @@ public class BriarService extends Service { nm.cancel(REMINDER_NOTIFICATION_ID); // Start the services in a background thread new Thread(() -> { - String nickname = databaseConfig.getLocalAuthorName(); - StartResult result = lifecycleManager.startServices(nickname); + StartResult result = lifecycleManager.startServices(); if (result == SUCCESS) { started = true; } else if (result == ALREADY_RUNNING) { diff --git a/briar-android/src/main/java/org/briarproject/briar/android/login/SetupControllerImpl.java b/briar-android/src/main/java/org/briarproject/briar/android/login/SetupControllerImpl.java index 3923cce4a..4c56553ba 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/login/SetupControllerImpl.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/login/SetupControllerImpl.java @@ -8,6 +8,8 @@ import org.briarproject.bramble.api.crypto.CryptoExecutor; import org.briarproject.bramble.api.crypto.PasswordStrengthEstimator; import org.briarproject.bramble.api.crypto.SecretKey; import org.briarproject.bramble.api.db.DatabaseConfig; +import org.briarproject.bramble.api.identity.IdentityManager; +import org.briarproject.bramble.api.identity.LocalAuthor; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.briar.android.controller.handler.ResultHandler; import org.briarproject.briar.android.controller.handler.UiResultHandler; @@ -24,6 +26,8 @@ public class SetupControllerImpl extends PasswordControllerImpl private static final Logger LOG = Logger.getLogger(SetupControllerImpl.class.getName()); + private final IdentityManager identityManager; + @Nullable private volatile SetupActivity setupActivity; @@ -31,9 +35,11 @@ public class SetupControllerImpl extends PasswordControllerImpl SetupControllerImpl(SharedPreferences briarPrefs, DatabaseConfig databaseConfig, @CryptoExecutor Executor cryptoExecutor, CryptoComponent crypto, - PasswordStrengthEstimator strengthEstimator) { + PasswordStrengthEstimator strengthEstimator, + IdentityManager identityManager) { super(briarPrefs, databaseConfig, cryptoExecutor, crypto, strengthEstimator); + this.identityManager = identityManager; } @Override @@ -102,13 +108,14 @@ public class SetupControllerImpl extends PasswordControllerImpl if (password == null) throw new IllegalStateException(); cryptoExecutor.execute(() -> { LOG.info("Creating account"); - databaseConfig.setLocalAuthorName(authorName); + LocalAuthor localAuthor = + identityManager.createLocalAuthor(authorName); + identityManager.registerLocalAuthor(localAuthor); SecretKey key = crypto.generateSecretKey(); - databaseConfig.setEncryptionKey(key); String hex = encryptDatabaseKey(key, password); storeEncryptedDatabaseKey(hex); + databaseConfig.setEncryptionKey(key); resultHandler.onResult(null); }); } - } diff --git a/briar-android/src/test/java/org/briarproject/briar/android/login/SetupControllerImplTest.java b/briar-android/src/test/java/org/briarproject/briar/android/login/SetupControllerImplTest.java index b0df4cde8..f95aab6dd 100644 --- a/briar-android/src/test/java/org/briarproject/briar/android/login/SetupControllerImplTest.java +++ b/briar-android/src/test/java/org/briarproject/briar/android/login/SetupControllerImplTest.java @@ -7,6 +7,8 @@ import org.briarproject.bramble.api.crypto.CryptoComponent; import org.briarproject.bramble.api.crypto.PasswordStrengthEstimator; import org.briarproject.bramble.api.crypto.SecretKey; import org.briarproject.bramble.api.db.DatabaseConfig; +import org.briarproject.bramble.api.identity.IdentityManager; +import org.briarproject.bramble.api.identity.LocalAuthor; import org.briarproject.bramble.test.BrambleMockTestCase; import org.briarproject.bramble.test.ImmediateExecutor; import org.jmock.Expectations; @@ -23,6 +25,7 @@ import static junit.framework.Assert.assertFalse; import static junit.framework.Assert.assertTrue; import static org.briarproject.bramble.api.identity.AuthorConstants.MAX_AUTHOR_NAME_LENGTH; import static org.briarproject.bramble.test.TestUtils.deleteTestDirectory; +import static org.briarproject.bramble.test.TestUtils.getLocalAuthor; import static org.briarproject.bramble.test.TestUtils.getRandomBytes; import static org.briarproject.bramble.test.TestUtils.getSecretKey; import static org.briarproject.bramble.test.TestUtils.getTestDirectory; @@ -39,12 +42,15 @@ public class SetupControllerImplTest extends BrambleMockTestCase { private final CryptoComponent crypto = context.mock(CryptoComponent.class); private final PasswordStrengthEstimator estimator = context.mock(PasswordStrengthEstimator.class); + private final IdentityManager identityManager = + context.mock(IdentityManager.class); private final SetupActivity setupActivity; private final Executor cryptoExecutor = new ImmediateExecutor(); private final String authorName = getRandomString(MAX_AUTHOR_NAME_LENGTH); private final String password = "some.strong.pass"; + private final LocalAuthor localAuthor = getLocalAuthor(); private final byte[] encryptedKey = getRandomBytes(123); private final SecretKey key = getSecretKey(); private final File testDir = getTestDirectory(); @@ -74,25 +80,29 @@ public class SetupControllerImplTest extends BrambleMockTestCase { will(returnValue(authorName)); oneOf(setupActivity).getPassword(); will(returnValue(password)); + // Create and register the local author + oneOf(identityManager).createLocalAuthor(authorName); + will(returnValue(localAuthor)); + oneOf(identityManager).registerLocalAuthor(localAuthor); // Generate a database key oneOf(crypto).generateSecretKey(); will(returnValue(key)); - // Attach the author name and database key to the database config - oneOf(databaseConfig).setLocalAuthorName(authorName); - oneOf(databaseConfig).setEncryptionKey(key); // Encrypt the key with the password oneOf(crypto).encryptWithPassword(key.getBytes(), password); will(returnValue(encryptedKey)); // Store the encrypted key allowing(databaseConfig).getDatabaseKeyDirectory(); will(returnValue(keyDir)); + // Attach the database key to the database config + oneOf(databaseConfig).setEncryptionKey(key); }}); assertFalse(keyFile.exists()); assertFalse(keyBackupFile.exists()); SetupControllerImpl s = new SetupControllerImpl(briarPrefs, - databaseConfig, cryptoExecutor, crypto, estimator); + databaseConfig, cryptoExecutor, crypto, estimator, + identityManager); s.setSetupActivity(setupActivity); AtomicBoolean called = new AtomicBoolean(false); @@ -103,8 +113,10 @@ public class SetupControllerImplTest extends BrambleMockTestCase { assertTrue(keyFile.exists()); assertTrue(keyBackupFile.exists()); - assertEquals(toHexString(encryptedKey), loadDatabaseKey(keyFile)); - assertEquals(toHexString(encryptedKey), loadDatabaseKey(keyBackupFile)); + assertEquals(toHexString(encryptedKey), + loadDatabaseKey(keyFile)); + assertEquals(toHexString(encryptedKey), + loadDatabaseKey(keyBackupFile)); } @After diff --git a/briar-core/src/test/java/org/briarproject/briar/feed/FeedManagerIntegrationTest.java b/briar-core/src/test/java/org/briarproject/briar/feed/FeedManagerIntegrationTest.java index 24c7334e7..fec963b33 100644 --- a/briar-core/src/test/java/org/briarproject/briar/feed/FeedManagerIntegrationTest.java +++ b/briar-core/src/test/java/org/briarproject/briar/feed/FeedManagerIntegrationTest.java @@ -1,5 +1,7 @@ package org.briarproject.briar.feed; +import org.briarproject.bramble.api.identity.IdentityManager; +import org.briarproject.bramble.api.identity.LocalAuthor; import org.briarproject.bramble.api.lifecycle.LifecycleManager; import org.briarproject.bramble.contact.ContactModule; import org.briarproject.bramble.crypto.CryptoExecutorModule; @@ -47,8 +49,12 @@ public class FeedManagerIntegrationTest extends BriarTestCase { component.inject(this); injectEagerSingletons(component); + IdentityManager identityManager = component.getIdentityManager(); + LocalAuthor localAuthor = identityManager.createLocalAuthor("feedTest"); + identityManager.registerLocalAuthor(localAuthor); + lifecycleManager = component.getLifecycleManager(); - lifecycleManager.startServices("feedTest"); + lifecycleManager.startServices(); lifecycleManager.waitForStartup(); feedManager = component.getFeedManager(); diff --git a/briar-core/src/test/java/org/briarproject/briar/feed/FeedManagerIntegrationTestComponent.java b/briar-core/src/test/java/org/briarproject/briar/feed/FeedManagerIntegrationTestComponent.java index 76445fe03..685eedacb 100644 --- a/briar-core/src/test/java/org/briarproject/briar/feed/FeedManagerIntegrationTestComponent.java +++ b/briar-core/src/test/java/org/briarproject/briar/feed/FeedManagerIntegrationTestComponent.java @@ -1,5 +1,6 @@ package org.briarproject.briar.feed; +import org.briarproject.bramble.api.identity.IdentityManager; import org.briarproject.bramble.api.lifecycle.LifecycleManager; import org.briarproject.bramble.client.ClientModule; import org.briarproject.bramble.contact.ContactModule; @@ -76,6 +77,8 @@ interface FeedManagerIntegrationTestComponent { void inject(VersioningModule.EagerSingletons init); + IdentityManager getIdentityManager(); + LifecycleManager getLifecycleManager(); FeedManager getFeedManager(); diff --git a/briar-core/src/test/java/org/briarproject/briar/messaging/SimplexMessagingIntegrationTest.java b/briar-core/src/test/java/org/briarproject/briar/messaging/SimplexMessagingIntegrationTest.java index 1007afe5e..5c8b0ca65 100644 --- a/briar-core/src/test/java/org/briarproject/briar/messaging/SimplexMessagingIntegrationTest.java +++ b/briar-core/src/test/java/org/briarproject/briar/messaging/SimplexMessagingIntegrationTest.java @@ -44,7 +44,6 @@ import java.io.InputStream; import static org.briarproject.bramble.api.transport.TransportConstants.TAG_LENGTH; import static org.briarproject.bramble.test.TestPluginConfigModule.MAX_LATENCY; import static org.briarproject.bramble.test.TestPluginConfigModule.TRANSPORT_ID; -import static org.briarproject.bramble.test.TestUtils.getLocalAuthor; import static org.briarproject.bramble.test.TestUtils.getSecretKey; import static org.briarproject.bramble.test.TestUtils.getTestDirectory; import static org.junit.Assert.assertEquals; @@ -58,8 +57,6 @@ public class SimplexMessagingIntegrationTest extends BriarTestCase { private final File bobDir = new File(testDir, "bob"); private final SecretKey master = getSecretKey(); private final long timestamp = System.currentTimeMillis(); - private final LocalAuthor aliceAuthor = getLocalAuthor(); - private final LocalAuthor bobAuthor = getLocalAuthor(); private SimplexMessagingIntegrationTestComponent alice, bob; @@ -76,6 +73,11 @@ public class SimplexMessagingIntegrationTest extends BriarTestCase { @Test public void testWriteAndRead() throws Exception { + // Create the identities + LocalAuthor aliceAuthor = + alice.getIdentityManager().createLocalAuthor("Alice"); + LocalAuthor bobAuthor = + bob.getIdentityManager().createLocalAuthor("Bob"); // Set up the devices and get the contact IDs ContactId bobId = setUp(alice, aliceAuthor, bobAuthor, true); ContactId aliceId = setUp(bob, bobAuthor, aliceAuthor, false); @@ -98,13 +100,13 @@ public class SimplexMessagingIntegrationTest extends BriarTestCase { private ContactId setUp(SimplexMessagingIntegrationTestComponent device, LocalAuthor local, Author remote, boolean alice) throws Exception { - // Start the lifecycle manager - LifecycleManager lifecycleManager = device.getLifecycleManager(); - lifecycleManager.startServices(null); - lifecycleManager.waitForStartup(); // Add an identity for the user IdentityManager identityManager = device.getIdentityManager(); identityManager.registerLocalAuthor(local); + // Start the lifecycle manager + LifecycleManager lifecycleManager = device.getLifecycleManager(); + lifecycleManager.startServices(); + lifecycleManager.waitForStartup(); // Add the other user as a contact ContactManager contactManager = device.getContactManager(); return contactManager.addContact(remote, local.getId(), master, diff --git a/briar-core/src/test/java/org/briarproject/briar/test/BriarIntegrationTest.java b/briar-core/src/test/java/org/briarproject/briar/test/BriarIntegrationTest.java index 481a57486..9f2ecec4a 100644 --- a/briar-core/src/test/java/org/briarproject/briar/test/BriarIntegrationTest.java +++ b/briar-core/src/test/java/org/briarproject/briar/test/BriarIntegrationTest.java @@ -160,8 +160,8 @@ public abstract class BriarIntegrationTest