diff --git a/briar-android-tests/src/test/java/org/briarproject/BlogManagerTest.java b/briar-android-tests/src/test/java/org/briarproject/BlogManagerTest.java index 758a94595714bcc74fd07bd10fdadb51def36770..8fd7479f457fc4f331e17d264da2817c782014ce 100644 --- a/briar-android-tests/src/test/java/org/briarproject/BlogManagerTest.java +++ b/briar-android-tests/src/test/java/org/briarproject/BlogManagerTest.java @@ -12,7 +12,6 @@ import org.briarproject.api.blogs.BlogPostHeader; import org.briarproject.api.contact.ContactId; import org.briarproject.api.contact.ContactManager; import org.briarproject.api.crypto.CryptoComponent; -import org.briarproject.api.crypto.KeyPair; import org.briarproject.api.crypto.SecretKey; import org.briarproject.api.db.DbException; import org.briarproject.api.event.Event; @@ -455,6 +454,7 @@ public class BlogManagerTest extends BriarIntegrationTest { @Test public void testCommentOnOwnComment() throws Exception { + startLifecycles(); defaultInit(); @@ -526,26 +526,15 @@ public class BlogManagerTest extends BriarIntegrationTest { } private void defaultInit() throws DbException { - addDefaultIdentities(); + getDefaultIdentities(); addDefaultContacts(); listenToEvents(); } - private void addDefaultIdentities() throws DbException { - KeyPair keyPair0 = crypto.generateSignatureKeyPair(); - byte[] publicKey0 = keyPair0.getPublic().getEncoded(); - byte[] privateKey0 = keyPair0.getPrivate().getEncoded(); - author0 = authorFactory - .createLocalAuthor(AUTHOR1, publicKey0, privateKey0); - identityManager0.addLocalAuthor(author0); + private void getDefaultIdentities() throws DbException { + author0 = identityManager0.getLocalAuthor(); + author1 = identityManager1.getLocalAuthor(); blog0 = blogFactory.createBlog(author0); - - KeyPair keyPair1 = crypto.generateSignatureKeyPair(); - byte[] publicKey1 = keyPair1.getPublic().getEncoded(); - byte[] privateKey1 = keyPair1.getPrivate().getEncoded(); - author1 = authorFactory - .createLocalAuthor(AUTHOR2, publicKey1, privateKey1); - identityManager1.addLocalAuthor(author1); blog1 = blogFactory.createBlog(author1); } @@ -603,8 +592,8 @@ public class BlogManagerTest extends BriarIntegrationTest { // Start the lifecycle manager and wait for it to finish lifecycleManager0 = t0.getLifecycleManager(); lifecycleManager1 = t1.getLifecycleManager(); - lifecycleManager0.startServices(); - lifecycleManager1.startServices(); + lifecycleManager0.startServices(AUTHOR1); + lifecycleManager1.startServices(AUTHOR2); lifecycleManager0.waitForStartup(); lifecycleManager1.waitForStartup(); } diff --git a/briar-android-tests/src/test/java/org/briarproject/BlogSharingIntegrationTest.java b/briar-android-tests/src/test/java/org/briarproject/BlogSharingIntegrationTest.java index 0dc2e877c575fce332569cf3822980833936c29d..92bbedd71b774b22b9abc16e25a6717d115e074b 100644 --- a/briar-android-tests/src/test/java/org/briarproject/BlogSharingIntegrationTest.java +++ b/briar-android-tests/src/test/java/org/briarproject/BlogSharingIntegrationTest.java @@ -13,7 +13,6 @@ import org.briarproject.api.contact.Contact; import org.briarproject.api.contact.ContactId; import org.briarproject.api.contact.ContactManager; import org.briarproject.api.crypto.CryptoComponent; -import org.briarproject.api.crypto.KeyPair; import org.briarproject.api.crypto.SecretKey; import org.briarproject.api.db.DbException; import org.briarproject.api.event.BlogInvitationReceivedEvent; @@ -617,9 +616,9 @@ public class BlogSharingIntegrationTest extends BriarIntegrationTest { lifecycleManager0 = t0.getLifecycleManager(); lifecycleManager1 = t1.getLifecycleManager(); lifecycleManager2 = t2.getLifecycleManager(); - lifecycleManager0.startServices(); - lifecycleManager1.startServices(); - lifecycleManager2.startServices(); + lifecycleManager0.startServices(SHARER); + lifecycleManager1.startServices(INVITEE); + lifecycleManager2.startServices(CONTACT2); lifecycleManager0.waitForStartup(); lifecycleManager1.waitForStartup(); lifecycleManager2.waitForStartup(); @@ -636,30 +635,16 @@ public class BlogSharingIntegrationTest extends BriarIntegrationTest { } private void defaultInit(boolean accept) throws DbException { - addDefaultIdentities(); + getDefaultIdentities(); addDefaultContacts(); getPersonalBlogOfSharer(); listenToEvents(accept); } - private void addDefaultIdentities() throws DbException { - KeyPair keyPair = cryptoComponent.generateSignatureKeyPair(); - author0 = authorFactory.createLocalAuthor(SHARER, - keyPair.getPublic().getEncoded(), - keyPair.getPrivate().getEncoded()); - identityManager0.addLocalAuthor(author0); - - keyPair = cryptoComponent.generateSignatureKeyPair(); - author1 = authorFactory.createLocalAuthor(INVITEE, - keyPair.getPublic().getEncoded(), - keyPair.getPrivate().getEncoded()); - identityManager1.addLocalAuthor(author1); - - keyPair = cryptoComponent.generateSignatureKeyPair(); - author2 = authorFactory.createLocalAuthor(CONTACT2, - keyPair.getPublic().getEncoded(), - keyPair.getPrivate().getEncoded()); - identityManager2.addLocalAuthor(author2); + private void getDefaultIdentities() throws DbException { + author0 = identityManager0.getLocalAuthor(); + author1 = identityManager1.getLocalAuthor(); + author2 = identityManager2.getLocalAuthor(); } private void addDefaultContacts() throws DbException { diff --git a/briar-android-tests/src/test/java/org/briarproject/ForumManagerTest.java b/briar-android-tests/src/test/java/org/briarproject/ForumManagerTest.java index 059f3912e6e8fa45935f0bfa86181f30ef982674..07e11e038f93ba4cc85908a71e33d2f384616e04 100644 --- a/briar-android-tests/src/test/java/org/briarproject/ForumManagerTest.java +++ b/briar-android-tests/src/test/java/org/briarproject/ForumManagerTest.java @@ -140,7 +140,7 @@ public class ForumManagerTest extends BriarIntegrationTest { @Test public void testForumPost() throws Exception { startLifecycles(); - addDefaultIdentities(); + getDefaultIdentities(); Forum forum = forumManager0.addForum("TestForum"); assertEquals(1, forumManager0.getForums().size()); final long ms1 = clock.currentTimeMillis() - 1000L; @@ -362,26 +362,15 @@ public class ForumManagerTest extends BriarIntegrationTest { } private void defaultInit() throws DbException { - addDefaultIdentities(); + getDefaultIdentities(); addDefaultContacts(); addForum(); listenToEvents(); } - private void addDefaultIdentities() throws DbException { - KeyPair keyPair0 = crypto.generateSignatureKeyPair(); - byte[] publicKey0 = keyPair0.getPublic().getEncoded(); - byte[] privateKey0 = keyPair0.getPrivate().getEncoded(); - author0 = authorFactory - .createLocalAuthor(SHARER, publicKey0, privateKey0); - identityManager0.addLocalAuthor(author0); - - KeyPair keyPair1 = crypto.generateSignatureKeyPair(); - byte[] publicKey1 = keyPair1.getPublic().getEncoded(); - byte[] privateKey1 = keyPair1.getPrivate().getEncoded(); - author1 = authorFactory - .createLocalAuthor(INVITEE, publicKey1, privateKey1); - identityManager1.addLocalAuthor(author1); + private void getDefaultIdentities() throws DbException { + author0 = identityManager0.getLocalAuthor(); + author1 = identityManager1.getLocalAuthor(); } private void addDefaultContacts() throws DbException { @@ -442,8 +431,8 @@ public class ForumManagerTest extends BriarIntegrationTest { // Start the lifecycle manager and wait for it to finish lifecycleManager0 = t0.getLifecycleManager(); lifecycleManager1 = t1.getLifecycleManager(); - lifecycleManager0.startServices(); - lifecycleManager1.startServices(); + lifecycleManager0.startServices(SHARER); + lifecycleManager1.startServices(INVITEE); lifecycleManager0.waitForStartup(); lifecycleManager1.waitForStartup(); } diff --git a/briar-android-tests/src/test/java/org/briarproject/ForumSharingIntegrationTest.java b/briar-android-tests/src/test/java/org/briarproject/ForumSharingIntegrationTest.java index a30be29ce8d3da4e35fd4367235e0e7be1e57ba0..ccf25040a1b7c66911ae681353739780f64f7138 100644 --- a/briar-android-tests/src/test/java/org/briarproject/ForumSharingIntegrationTest.java +++ b/briar-android-tests/src/test/java/org/briarproject/ForumSharingIntegrationTest.java @@ -10,7 +10,6 @@ import org.briarproject.api.contact.Contact; import org.briarproject.api.contact.ContactId; import org.briarproject.api.contact.ContactManager; import org.briarproject.api.crypto.CryptoComponent; -import org.briarproject.api.crypto.KeyPair; import org.briarproject.api.crypto.SecretKey; import org.briarproject.api.data.BdfList; import org.briarproject.api.db.DatabaseComponent; @@ -729,7 +728,7 @@ public class ForumSharingIntegrationTest extends BriarTestCase { startLifecycles(); try { // initialize - addDefaultIdentities(); + getDefaultIdentities(); addDefaultContacts(); addForumForSharer(); @@ -1017,9 +1016,9 @@ public class ForumSharingIntegrationTest extends BriarTestCase { lifecycleManager0 = t0.getLifecycleManager(); lifecycleManager1 = t1.getLifecycleManager(); lifecycleManager2 = t2.getLifecycleManager(); - lifecycleManager0.startServices(); - lifecycleManager1.startServices(); - lifecycleManager2.startServices(); + lifecycleManager0.startServices(SHARER); + lifecycleManager1.startServices(INVITEE); + lifecycleManager2.startServices(SHARER2); lifecycleManager0.waitForStartup(); lifecycleManager1.waitForStartup(); lifecycleManager2.waitForStartup(); @@ -1036,30 +1035,16 @@ public class ForumSharingIntegrationTest extends BriarTestCase { } private void defaultInit(boolean accept) throws DbException { - addDefaultIdentities(); + getDefaultIdentities(); addDefaultContacts(); addForumForSharer(); listenToEvents(accept); } - private void addDefaultIdentities() throws DbException { - KeyPair keyPair = cryptoComponent.generateSignatureKeyPair(); - author0 = authorFactory.createLocalAuthor(SHARER, - keyPair.getPublic().getEncoded(), - keyPair.getPrivate().getEncoded()); - identityManager0.addLocalAuthor(author0); - - keyPair = cryptoComponent.generateSignatureKeyPair(); - author1 = authorFactory.createLocalAuthor(INVITEE, - keyPair.getPublic().getEncoded(), - keyPair.getPrivate().getEncoded()); - identityManager1.addLocalAuthor(author1); - - keyPair = cryptoComponent.generateSignatureKeyPair(); - author2 = authorFactory.createLocalAuthor(SHARER2, - keyPair.getPublic().getEncoded(), - keyPair.getPrivate().getEncoded()); - identityManager2.addLocalAuthor(author2); + private void getDefaultIdentities() throws DbException { + author0 = identityManager0.getLocalAuthor(); + author1 = identityManager1.getLocalAuthor(); + author2 = identityManager2.getLocalAuthor(); } private void addDefaultContacts() throws DbException { diff --git a/briar-android-tests/src/test/java/org/briarproject/PrivateGroupManagerTest.java b/briar-android-tests/src/test/java/org/briarproject/PrivateGroupManagerTest.java index 18a6d5eb438981b0dd3a3731e787a37c106fa5e1..409d4af7feea64f15c857d8a7a89ccbdb837dcc5 100644 --- a/briar-android-tests/src/test/java/org/briarproject/PrivateGroupManagerTest.java +++ b/briar-android-tests/src/test/java/org/briarproject/PrivateGroupManagerTest.java @@ -416,7 +416,7 @@ public class PrivateGroupManagerTest extends BriarIntegrationTest { byte[] privateKey0 = keyPair0.getPrivate().getEncoded(); author0 = authorFactory .createLocalAuthor(AUTHOR1, publicKey0, privateKey0); - identityManager0.addLocalAuthor(author0); + identityManager0.registerLocalAuthor(author0); privateGroup0 = privateGroupFactory.createPrivateGroup("Testgroup", author0); groupId0 = privateGroup0.getId(); @@ -426,7 +426,7 @@ public class PrivateGroupManagerTest extends BriarIntegrationTest { byte[] privateKey1 = keyPair1.getPrivate().getEncoded(); author1 = authorFactory .createLocalAuthor(AUTHOR2, publicKey1, privateKey1); - identityManager1.addLocalAuthor(author1); + identityManager1.registerLocalAuthor(author1); } private void addDefaultContacts() throws DbException { @@ -531,8 +531,8 @@ public class PrivateGroupManagerTest extends BriarIntegrationTest { // Start the lifecycle manager and wait for it to finish lifecycleManager0 = t0.getLifecycleManager(); lifecycleManager1 = t1.getLifecycleManager(); - lifecycleManager0.startServices(); - lifecycleManager1.startServices(); + lifecycleManager0.startServices(AUTHOR1); + lifecycleManager1.startServices(AUTHOR2); lifecycleManager0.waitForStartup(); lifecycleManager1.waitForStartup(); } diff --git a/briar-android-tests/src/test/java/org/briarproject/SimplexMessagingIntegrationTest.java b/briar-android-tests/src/test/java/org/briarproject/SimplexMessagingIntegrationTest.java index 295b41c41b28b7a9acce371ec5fed12d6bd2cda3..cc98b42c0347af7622f2954ef26d2e672b0babc8 100644 --- a/briar-android-tests/src/test/java/org/briarproject/SimplexMessagingIntegrationTest.java +++ b/briar-android-tests/src/test/java/org/briarproject/SimplexMessagingIntegrationTest.java @@ -43,6 +43,9 @@ import static org.junit.Assert.assertTrue; public class SimplexMessagingIntegrationTest extends BriarTestCase { + private final static String ALICE = "Alice"; + private final static String BOB = "Bob"; + private final File testDir = TestUtils.getTestDirectory(); private final File aliceDir = new File(testDir, "alice"); private final File bobDir = new File(testDir, "bob"); @@ -69,6 +72,7 @@ public class SimplexMessagingIntegrationTest extends BriarTestCase { read(write()); } + private byte[] write() throws Exception { // Instantiate Alice's services LifecycleManager lifecycleManager = alice.getLifecycleManager(); @@ -83,17 +87,17 @@ public class SimplexMessagingIntegrationTest extends BriarTestCase { SyncSessionFactory syncSessionFactory = alice.getSyncSessionFactory(); // Start the lifecycle manager - lifecycleManager.startServices(); + lifecycleManager.startServices(null); lifecycleManager.waitForStartup(); // Add an identity for Alice LocalAuthor aliceAuthor = new LocalAuthor(aliceId, "Alice", new byte[MAX_PUBLIC_KEY_LENGTH], new byte[123], timestamp); - identityManager.addLocalAuthor(aliceAuthor); + identityManager.registerLocalAuthor(aliceAuthor); // Add Bob as a contact - Author bobAuthor = new Author(bobId, "Bob", + Author bobAuthor = new Author(bobId, BOB, new byte[MAX_PUBLIC_KEY_LENGTH]); - ContactId contactId = contactManager.addContact(bobAuthor, aliceId, - master, timestamp, true, true, true); + ContactId contactId = contactManager.addContact(bobAuthor, + aliceAuthor.getId(), master, timestamp, true, true, true); // Send Bob a message GroupId groupId = messagingManager.getConversationId(contactId); @@ -136,18 +140,17 @@ public class SimplexMessagingIntegrationTest extends BriarTestCase { bob.getMessagingManager(); // Start the lifecyle manager - lifecycleManager.startServices(); + lifecycleManager.startServices(null); lifecycleManager.waitForStartup(); // Add an identity for Bob - LocalAuthor bobAuthor = new LocalAuthor(bobId, "Bob", + LocalAuthor bobAuthor = new LocalAuthor(bobId, BOB, new byte[MAX_PUBLIC_KEY_LENGTH], new byte[123], timestamp); - identityManager.addLocalAuthor(bobAuthor); + identityManager.registerLocalAuthor(bobAuthor); // Add Alice as a contact - Author aliceAuthor = new Author(aliceId, "Alice", + Author aliceAuthor = new Author(aliceId, ALICE, new byte[MAX_PUBLIC_KEY_LENGTH]); - ContactId contactId = contactManager.addContact(aliceAuthor, bobId, - master, timestamp, false, true, true); - + ContactId contactId = contactManager.addContact(aliceAuthor, + bobAuthor.getId(), master, timestamp, false, true, true); // Set up an event listener MessageListener listener = new MessageListener(); bob.getEventBus().addListener(listener); diff --git a/briar-android-tests/src/test/java/org/briarproject/introduction/IntroductionIntegrationTest.java b/briar-android-tests/src/test/java/org/briarproject/introduction/IntroductionIntegrationTest.java index e9c4487a4e6047ad64b368e42de288aa196f5698..cc1560291fcd007a9af47feb04b17dd48a16a19a 100644 --- a/briar-android-tests/src/test/java/org/briarproject/introduction/IntroductionIntegrationTest.java +++ b/briar-android-tests/src/test/java/org/briarproject/introduction/IntroductionIntegrationTest.java @@ -188,7 +188,7 @@ public class IntroductionIntegrationTest extends BriarIntegrationTest { public void testIntroductionSession() throws Exception { startLifecycles(); try { - addDefaultIdentities(); + getDefaultIdentities(); addDefaultContacts(); addListeners(true, true); addTransportProperties(); @@ -282,7 +282,7 @@ public class IntroductionIntegrationTest extends BriarIntegrationTest { public void testIntroductionSessionFirstDecline() throws Exception { startLifecycles(); try { - addDefaultIdentities(); + getDefaultIdentities(); addDefaultContacts(); addListeners(false, true); addTransportProperties(); @@ -349,7 +349,7 @@ public class IntroductionIntegrationTest extends BriarIntegrationTest { public void testIntroductionSessionSecondDecline() throws Exception { startLifecycles(); try { - addDefaultIdentities(); + getDefaultIdentities(); addDefaultContacts(); addListeners(true, false); addTransportProperties(); @@ -411,7 +411,7 @@ public class IntroductionIntegrationTest extends BriarIntegrationTest { public void testIntroductionSessionDelayedFirstDecline() throws Exception { startLifecycles(); try { - addDefaultIdentities(); + getDefaultIdentities(); addDefaultContacts(); addListeners(false, false); addTransportProperties(); @@ -464,7 +464,7 @@ public class IntroductionIntegrationTest extends BriarIntegrationTest { public void testResponseAndAckInOneSession() throws Exception { startLifecycles(); - addDefaultIdentities(); + getDefaultIdentities(); addDefaultContacts(); addListeners(true, true); addTransportProperties(); @@ -512,7 +512,7 @@ public class IntroductionIntegrationTest extends BriarIntegrationTest { public void testIntroductionToSameContact() throws Exception { startLifecycles(); try { - addDefaultIdentities(); + getDefaultIdentities(); addDefaultContacts(); addListeners(true, false); addTransportProperties(); @@ -541,19 +541,12 @@ public class IntroductionIntegrationTest extends BriarIntegrationTest { public void testIntroductionToIdentitiesOfSameContact() throws Exception { startLifecycles(); try { - // Add Identities - author0 = authorFactory.createLocalAuthor(INTRODUCER, - TestUtils.getRandomBytes(MAX_PUBLIC_KEY_LENGTH), - TestUtils.getRandomBytes(123)); - identityManager0.addLocalAuthor(author0); - author1 = authorFactory.createLocalAuthor(INTRODUCEE1, - TestUtils.getRandomBytes(MAX_PUBLIC_KEY_LENGTH), - TestUtils.getRandomBytes(123)); - identityManager1.addLocalAuthor(author1); + // Get Identities + getDefaultIdentities(); author2 = authorFactory.createLocalAuthor(INTRODUCEE2, TestUtils.getRandomBytes(MAX_PUBLIC_KEY_LENGTH), TestUtils.getRandomBytes(123)); - identityManager1.addLocalAuthor(author2); + identityManager1.registerLocalAuthor(author2); // Add introducees' authors as contacts contactId1 = contactManager0.addContact(author1, @@ -651,7 +644,7 @@ public class IntroductionIntegrationTest extends BriarIntegrationTest { public void testSessionIdReuse() throws Exception { startLifecycles(); try { - addDefaultIdentities(); + getDefaultIdentities(); addDefaultContacts(); addListeners(true, true); addTransportProperties(); @@ -719,7 +712,7 @@ public class IntroductionIntegrationTest extends BriarIntegrationTest { public void testIntroducerRemovedCleanup() throws Exception { startLifecycles(); try { - addDefaultIdentities(); + getDefaultIdentities(); addDefaultContacts(); addListeners(true, true); addTransportProperties(); @@ -776,7 +769,7 @@ public class IntroductionIntegrationTest extends BriarIntegrationTest { public void testIntroduceesRemovedCleanup() throws Exception { startLifecycles(); try { - addDefaultIdentities(); + getDefaultIdentities(); addDefaultContacts(); addListeners(true, true); addTransportProperties(); @@ -847,7 +840,7 @@ public class IntroductionIntegrationTest extends BriarIntegrationTest { throws Exception { startLifecycles(); try { - addDefaultIdentities(); + getDefaultIdentities(); addDefaultContacts(); addListeners(true, true); addTransportProperties(); @@ -1091,9 +1084,9 @@ public class IntroductionIntegrationTest extends BriarIntegrationTest { lifecycleManager0 = t0.getLifecycleManager(); lifecycleManager1 = t1.getLifecycleManager(); lifecycleManager2 = t2.getLifecycleManager(); - lifecycleManager0.startServices(); - lifecycleManager1.startServices(); - lifecycleManager2.startServices(); + lifecycleManager0.startServices(INTRODUCER); + lifecycleManager1.startServices(INTRODUCEE1); + lifecycleManager2.startServices(INTRODUCEE2); lifecycleManager0.waitForStartup(); lifecycleManager1.waitForStartup(); lifecycleManager2.waitForStartup(); @@ -1138,25 +1131,11 @@ public class IntroductionIntegrationTest extends BriarIntegrationTest { t2.getEventBus().addListener(listener2); } - private void addDefaultIdentities() throws DbException { - KeyPair keyPair0 = crypto.generateSignatureKeyPair(); - byte[] publicKey0 = keyPair0.getPublic().getEncoded(); - byte[] privateKey0 = keyPair0.getPrivate().getEncoded(); - author0 = authorFactory - .createLocalAuthor(INTRODUCER, publicKey0, privateKey0); - identityManager0.addLocalAuthor(author0); - KeyPair keyPair1 = crypto.generateSignatureKeyPair(); - byte[] publicKey1 = keyPair1.getPublic().getEncoded(); - byte[] privateKey1 = keyPair1.getPrivate().getEncoded(); - author1 = authorFactory - .createLocalAuthor(INTRODUCEE1, publicKey1, privateKey1); - identityManager1.addLocalAuthor(author1); - KeyPair keyPair2 = crypto.generateSignatureKeyPair(); - byte[] publicKey2 = keyPair2.getPublic().getEncoded(); - byte[] privateKey2 = keyPair2.getPrivate().getEncoded(); - author2 = authorFactory - .createLocalAuthor(INTRODUCEE2, publicKey2, privateKey2); - identityManager2.addLocalAuthor(author2); + private void getDefaultIdentities() throws DbException { + author0 = identityManager0.getLocalAuthor(); + author1 = identityManager1.getLocalAuthor(); + author2 = identityManager2.getLocalAuthor(); + } private void addDefaultContacts() throws DbException { diff --git a/briar-android/src/org/briarproject/android/AppModule.java b/briar-android/src/org/briarproject/android/AppModule.java index 5060b5f31bfd05c8ad89d1bf3e685fd9823a28d4..2ad15515cec97ef8be2917063c0a8e39d89f9819 100644 --- a/briar-android/src/org/briarproject/android/AppModule.java +++ b/briar-android/src/org/briarproject/android/AppModule.java @@ -77,6 +77,7 @@ public class AppModule { return new DatabaseConfig() { private volatile SecretKey key = null; + private volatile String nickName; @Override public boolean databaseExists() { @@ -95,6 +96,16 @@ public class AppModule { this.key = key; } + @Override + public void setAuthorNick(String nickName) { + this.nickName = nickName; + } + + @Override + public String getAuthorNick() { + return nickName; + } + @Override public SecretKey getEncryptionKey() { return key; diff --git a/briar-android/src/org/briarproject/android/BriarActivity.java b/briar-android/src/org/briarproject/android/BriarActivity.java index c0bda36a8a722b6526e075fa7bf73ea2526f1544..9d162b62d6702b4863c888f1afafd51041235d14 100644 --- a/briar-android/src/org/briarproject/android/BriarActivity.java +++ b/briar-android/src/org/briarproject/android/BriarActivity.java @@ -22,8 +22,6 @@ import static android.content.Intent.FLAG_ACTIVITY_SINGLE_TOP; @SuppressLint("Registered") public abstract class BriarActivity extends BaseActivity { - public static final String KEY_LOCAL_AUTHOR_HANDLE = - "briar.LOCAL_AUTHOR_HANDLE"; public static final String KEY_STARTUP_FAILED = "briar.STARTUP_FAILED"; public static final String GROUP_ID = "briar.GROUP_ID"; public static final String GROUP_NAME = "briar.GROUP_NAME"; diff --git a/briar-android/src/org/briarproject/android/BriarService.java b/briar-android/src/org/briarproject/android/BriarService.java index f03751821ddcc5886cb31715e32ffc9f1896140e..812399e56a5cde3e60d6734563060abde056ce99 100644 --- a/briar-android/src/org/briarproject/android/BriarService.java +++ b/briar-android/src/org/briarproject/android/BriarService.java @@ -45,11 +45,13 @@ public class BriarService extends Service { private final AtomicBoolean created = new AtomicBoolean(false); private final Binder binder = new BriarBinder(); - @Inject protected DatabaseConfig databaseConfig; - + @Inject + protected DatabaseConfig databaseConfig; // Fields that are accessed from background threads must be volatile - @Inject protected volatile LifecycleManager lifecycleManager; - @Inject protected volatile AndroidExecutor androidExecutor; + @Inject + protected volatile LifecycleManager lifecycleManager; + @Inject + protected volatile AndroidExecutor androidExecutor; private volatile boolean started = false; @Override @@ -91,7 +93,8 @@ public class BriarService extends Service { new Thread() { @Override public void run() { - StartResult result = lifecycleManager.startServices(); + StartResult result = lifecycleManager + .startServices(databaseConfig.getAuthorNick()); if (result == SUCCESS) { started = true; } else if (result == ALREADY_RUNNING) { @@ -169,24 +172,32 @@ public class BriarService extends Service { // FIXME: Work out what to do about it } - /** Waits for all services to start before returning. */ + /** + * Waits for all services to start before returning. + */ public void waitForStartup() throws InterruptedException { lifecycleManager.waitForStartup(); } - /** Waits for all services to stop before returning. */ + /** + * Waits for all services to stop before returning. + */ public void waitForShutdown() throws InterruptedException { lifecycleManager.waitForShutdown(); } - /** Starts the shutdown process. */ + /** + * Starts the shutdown process. + */ public void shutdown() { stopSelf(); // This will call onDestroy() } public class BriarBinder extends Binder { - /** Returns the bound service. */ + /** + * Returns the bound service. + */ public BriarService getService() { return BriarService.this; } @@ -205,9 +216,12 @@ public class BriarService extends Service { } @Override - public void onServiceDisconnected(ComponentName name) {} + public void onServiceDisconnected(ComponentName name) { + } - /** Waits for the service to connect and returns its binder. */ + /** + * Waits for the service to connect and returns its binder. + */ public IBinder waitForBinder() throws InterruptedException { binderLatch.await(); return binder; diff --git a/briar-android/src/org/briarproject/android/NavDrawerActivity.java b/briar-android/src/org/briarproject/android/NavDrawerActivity.java index 5d69216a75ed1eafb08890864033c8b93587a399..16b3700cdaded5fa6e3e66781ca5b03554614eb2 100644 --- a/briar-android/src/org/briarproject/android/NavDrawerActivity.java +++ b/briar-android/src/org/briarproject/android/NavDrawerActivity.java @@ -25,12 +25,10 @@ import org.briarproject.android.blogs.FeedFragment; import org.briarproject.android.contact.ContactListFragment; import org.briarproject.android.controller.NavDrawerController; import org.briarproject.android.controller.TransportStateListener; -import org.briarproject.android.controller.handler.UiResultHandler; import org.briarproject.android.forum.ForumListFragment; import org.briarproject.android.fragment.BaseFragment.BaseFragmentListener; import org.briarproject.android.privategroup.list.GroupListFragment; import org.briarproject.api.TransportId; -import org.briarproject.api.identity.LocalAuthor; import java.util.ArrayList; import java.util.List; @@ -72,7 +70,6 @@ public class NavDrawerActivity extends BriarFragmentActivity implements protected void onNewIntent(Intent intent) { super.onNewIntent(intent); exitIfStartupFailed(intent); - checkAuthorHandle(intent); // FIXME why was the stack cleared here? // This prevents state from being restored properly // clearBackStack(); @@ -115,7 +112,6 @@ public class NavDrawerActivity extends BriarFragmentActivity implements R.string.nav_drawer_close_description); drawerLayout.addDrawerListener(drawerToggle); navigation.setNavigationItemSelectedListener(this); - checkAuthorHandle(getIntent()); initializeTransports(getLayoutInflater()); transportsView.setAdapter(transportsAdapter); @@ -146,18 +142,6 @@ public class NavDrawerActivity extends BriarFragmentActivity implements updateTransports(); } - private void checkAuthorHandle(Intent intent) { - long handle = intent.getLongExtra(KEY_LOCAL_AUTHOR_HANDLE, -1); - if (handle != -1) { - LocalAuthor a = controller.removeAuthorHandle(handle); - // The activity was launched from the setup wizard - if (a != null) { - showLoadingScreen(true, R.string.progress_title_please_wait); - storeLocalAuthor(a); - } - } - } - private void exitIfStartupFailed(Intent intent) { if (intent.getBooleanExtra(KEY_STARTUP_FAILED, false)) { finish(); @@ -166,15 +150,6 @@ public class NavDrawerActivity extends BriarFragmentActivity implements } } - private void storeLocalAuthor(LocalAuthor a) { - controller.storeLocalAuthor(a, new UiResultHandler<Void>(this) { - @Override - public void onResultUi(Void result) { - hideLoadingScreen(); - } - }); - } - private void loadFragment(int fragmentId) { // TODO re-use fragments from the manager when possible switch (fragmentId) { diff --git a/briar-android/src/org/briarproject/android/SetupActivity.java b/briar-android/src/org/briarproject/android/SetupActivity.java index db57956c503039d6047279fe5a9cd8a4e19e5257..e5c1b4b7c1608f2779e09aa8db216d10502617a1 100644 --- a/briar-android/src/org/briarproject/android/SetupActivity.java +++ b/briar-android/src/org/briarproject/android/SetupActivity.java @@ -2,7 +2,6 @@ package org.briarproject.android; import android.content.Intent; import android.os.Bundle; -import android.support.annotation.NonNull; import android.support.design.widget.TextInputLayout; import android.text.Editable; import android.text.TextWatcher; @@ -135,18 +134,18 @@ public class SetupActivity extends BaseActivity implements OnClickListener, progress.setVisibility(VISIBLE); String nickname = nicknameEntry.getText().toString(); String password = passwordEntry.getText().toString(); - setupController.createIdentity(nickname, password, - new UiResultHandler<Long>(this) { + + setupController.storeAuthorInfo(password, nickname, + new UiResultHandler<Void>(this) { @Override - public void onResultUi(@NonNull Long result) { - showMain(result); + public void onResultUi(Void result) { + showMain(); } }); } - private void showMain(final long handle) { + private void showMain() { Intent i = new Intent(this, NavDrawerActivity.class); - i.putExtra(BriarActivity.KEY_LOCAL_AUTHOR_HANDLE, handle); i.setFlags(FLAG_ACTIVITY_NEW_TASK); startActivity(i); finish(); diff --git a/briar-android/src/org/briarproject/android/blogs/WriteBlogPostActivity.java b/briar-android/src/org/briarproject/android/blogs/WriteBlogPostActivity.java index 0a10acdbf02c69aa8962e249cfd5c7438817dbe7..6dccc168564b19f1e803ff11518a629ae1fe181f 100644 --- a/briar-android/src/org/briarproject/android/blogs/WriteBlogPostActivity.java +++ b/briar-android/src/org/briarproject/android/blogs/WriteBlogPostActivity.java @@ -27,7 +27,6 @@ import org.briarproject.api.sync.GroupId; import org.briarproject.util.StringUtils; import java.security.GeneralSecurityException; -import java.util.Collection; import java.util.logging.Logger; import javax.inject.Inject; @@ -147,9 +146,7 @@ public class WriteBlogPostActivity extends BriarActivity public void run() { long now = System.currentTimeMillis(); try { - Collection<LocalAuthor> authors = - identityManager.getLocalAuthors(); - LocalAuthor author = authors.iterator().next(); + LocalAuthor author = identityManager.getLocalAuthor(); BlogPost p = blogPostFactory .createBlogPost(groupId, now, null, author, body); blogManager.addLocalPost(p); diff --git a/briar-android/src/org/briarproject/android/controller/ConfigController.java b/briar-android/src/org/briarproject/android/controller/ConfigController.java index b8b7d7d17dff300b6a8a01a8ae51f46311e7eb55..7ce5233033d1726246102e0601524435bf72c1fa 100644 --- a/briar-android/src/org/briarproject/android/controller/ConfigController.java +++ b/briar-android/src/org/briarproject/android/controller/ConfigController.java @@ -6,7 +6,7 @@ public interface ConfigController { String getEncryptedDatabaseKey(); - void setEncryptedDatabaseKey(String hex); + void storeEncryptedDatabaseKey(String hex); void deleteAccount(Context ctx); diff --git a/briar-android/src/org/briarproject/android/controller/ConfigControllerImpl.java b/briar-android/src/org/briarproject/android/controller/ConfigControllerImpl.java index 3ed26016f4e32f161bf578a9daf7ca2f1b1b6ce3..33ca3253266ee188052b85790222f2460cb79176 100644 --- a/briar-android/src/org/briarproject/android/controller/ConfigControllerImpl.java +++ b/briar-android/src/org/briarproject/android/controller/ConfigControllerImpl.java @@ -29,7 +29,7 @@ public class ConfigControllerImpl implements ConfigController { } @Override - public void setEncryptedDatabaseKey(String hex) { + public void storeEncryptedDatabaseKey(String hex) { SharedPreferences.Editor editor = briarPrefs.edit(); editor.putString(PREF_DB_KEY, hex); editor.apply(); diff --git a/briar-android/src/org/briarproject/android/controller/NavDrawerController.java b/briar-android/src/org/briarproject/android/controller/NavDrawerController.java index 8d25d45b30bb36b5d938fc34aafb6dced50c2196..869ec8bc0950597ab6aae2e5ae202d78aa0740cb 100644 --- a/briar-android/src/org/briarproject/android/controller/NavDrawerController.java +++ b/briar-android/src/org/briarproject/android/controller/NavDrawerController.java @@ -1,15 +1,9 @@ package org.briarproject.android.controller; -import org.briarproject.android.controller.handler.ResultHandler; import org.briarproject.api.TransportId; -import org.briarproject.api.identity.LocalAuthor; public interface NavDrawerController extends ActivityLifecycleController { boolean isTransportRunning(TransportId transportId); - void storeLocalAuthor(LocalAuthor author, - ResultHandler<Void> resultHandler); - - LocalAuthor removeAuthorHandle(long handle); } diff --git a/briar-android/src/org/briarproject/android/controller/NavDrawerControllerImpl.java b/briar-android/src/org/briarproject/android/controller/NavDrawerControllerImpl.java index 55d5d267f74c8fb16b8befdae50ee54c5ba61c48..ce1bb1e3e0675f8e508015eb57a938e507f5ef2a 100644 --- a/briar-android/src/org/briarproject/android/controller/NavDrawerControllerImpl.java +++ b/briar-android/src/org/briarproject/android/controller/NavDrawerControllerImpl.java @@ -2,18 +2,14 @@ package org.briarproject.android.controller; import android.app.Activity; -import org.briarproject.android.api.ReferenceManager; -import org.briarproject.android.controller.handler.ResultHandler; import org.briarproject.api.TransportId; import org.briarproject.api.db.DatabaseExecutor; -import org.briarproject.api.db.DbException; import org.briarproject.api.event.Event; import org.briarproject.api.event.EventBus; import org.briarproject.api.event.EventListener; import org.briarproject.api.event.TransportDisabledEvent; import org.briarproject.api.event.TransportEnabledEvent; import org.briarproject.api.identity.IdentityManager; -import org.briarproject.api.identity.LocalAuthor; import org.briarproject.api.lifecycle.LifecycleManager; import org.briarproject.api.plugins.Plugin; import org.briarproject.api.plugins.PluginManager; @@ -24,7 +20,6 @@ import java.util.logging.Logger; import javax.inject.Inject; import static java.util.logging.Level.INFO; -import static java.util.logging.Level.WARNING; public class NavDrawerControllerImpl extends DbControllerImpl implements NavDrawerController, EventListener { @@ -32,7 +27,6 @@ public class NavDrawerControllerImpl extends DbControllerImpl private static final Logger LOG = Logger.getLogger(NavDrawerControllerImpl.class.getName()); - private final ReferenceManager referenceManager; private final PluginManager pluginManager; private final EventBus eventBus; private final IdentityManager identityManager; @@ -42,10 +36,9 @@ public class NavDrawerControllerImpl extends DbControllerImpl @Inject NavDrawerControllerImpl(@DatabaseExecutor Executor dbExecutor, LifecycleManager lifecycleManager, - ReferenceManager referenceManager, PluginManager pluginManager, - EventBus eventBus, IdentityManager identityManager) { + PluginManager pluginManager, EventBus eventBus, + IdentityManager identityManager) { super(dbExecutor, lifecycleManager); - this.referenceManager = referenceManager; this.pluginManager = pluginManager; this.eventBus = eventBus; this.identityManager = identityManager; @@ -101,33 +94,8 @@ public class NavDrawerControllerImpl extends DbControllerImpl @Override public boolean isTransportRunning(TransportId transportId) { Plugin plugin = pluginManager.getPlugin(transportId); - return plugin != null && plugin.isRunning(); - } - @Override - public void storeLocalAuthor(final LocalAuthor author, - final ResultHandler<Void> resultHandler) { - runOnDbThread(new Runnable() { - @Override - public void run() { - try { - long now = System.currentTimeMillis(); - identityManager.addLocalAuthor(author); - long duration = System.currentTimeMillis() - now; - if (LOG.isLoggable(INFO)) - LOG.info("Storing author took " + duration + " ms"); - resultHandler.onResult(null); - } catch (final DbException e) { - if (LOG.isLoggable(WARNING)) - LOG.log(WARNING, e.toString(), e); - } - } - }); - } - - @Override - public LocalAuthor removeAuthorHandle(long handle) { - return referenceManager.removeReference(handle, LocalAuthor.class); + return plugin != null && plugin.isRunning(); } } diff --git a/briar-android/src/org/briarproject/android/controller/PasswordControllerImpl.java b/briar-android/src/org/briarproject/android/controller/PasswordControllerImpl.java index 76768b49a7ab38c4ae017f28a270049c4df57fe5..9ea926474c97ab82c91d997e2be10344f2846d1c 100644 --- a/briar-android/src/org/briarproject/android/controller/PasswordControllerImpl.java +++ b/briar-android/src/org/briarproject/android/controller/PasswordControllerImpl.java @@ -65,7 +65,7 @@ public class PasswordControllerImpl extends ConfigControllerImpl } else { String hex = encryptDatabaseKey(new SecretKey(key), newPassword); - setEncryptedDatabaseKey(hex); + storeEncryptedDatabaseKey(hex); resultHandler.onResult(true); } } diff --git a/briar-android/src/org/briarproject/android/controller/SetupController.java b/briar-android/src/org/briarproject/android/controller/SetupController.java index 567d34b43ebbd0857ceda6b792cb447c5e97d1ff..b77a541fbe44b50238b51ffcfe52b6b6c0177284 100644 --- a/briar-android/src/org/briarproject/android/controller/SetupController.java +++ b/briar-android/src/org/briarproject/android/controller/SetupController.java @@ -6,6 +6,7 @@ public interface SetupController { float estimatePasswordStrength(String password); - void createIdentity(String nickname, String password, - ResultHandler<Long> resultHandler); + void storeAuthorInfo(String password, String nickName, + ResultHandler<Void> resultHandler); + } diff --git a/briar-android/src/org/briarproject/android/controller/SetupControllerImpl.java b/briar-android/src/org/briarproject/android/controller/SetupControllerImpl.java index b60d1072a81c1224e5f339997f91cadc452d90ce..e62e6800deb0b0f284027a2bcdb83abab85e3cb8 100644 --- a/briar-android/src/org/briarproject/android/controller/SetupControllerImpl.java +++ b/briar-android/src/org/briarproject/android/controller/SetupControllerImpl.java @@ -2,24 +2,18 @@ package org.briarproject.android.controller; import android.content.SharedPreferences; -import org.briarproject.android.api.ReferenceManager; import org.briarproject.android.controller.handler.ResultHandler; import org.briarproject.api.crypto.CryptoComponent; import org.briarproject.api.crypto.CryptoExecutor; -import org.briarproject.api.crypto.KeyPair; import org.briarproject.api.crypto.PasswordStrengthEstimator; import org.briarproject.api.crypto.SecretKey; import org.briarproject.api.db.DatabaseConfig; -import org.briarproject.api.identity.AuthorFactory; -import org.briarproject.api.identity.LocalAuthor; import java.util.concurrent.Executor; import java.util.logging.Logger; import javax.inject.Inject; -import static java.util.logging.Level.INFO; - public class SetupControllerImpl extends PasswordControllerImpl implements SetupController { @@ -27,33 +21,14 @@ public class SetupControllerImpl extends PasswordControllerImpl Logger.getLogger(SetupControllerImpl.class.getName()); private final PasswordStrengthEstimator strengthEstimator; - private final AuthorFactory authorFactory; - private final ReferenceManager referenceManager; @Inject SetupControllerImpl(SharedPreferences briarPrefs, DatabaseConfig databaseConfig, @CryptoExecutor Executor cryptoExecutor, CryptoComponent crypto, - PasswordStrengthEstimator strengthEstimator, - AuthorFactory authorFactory, ReferenceManager referenceManager) { + PasswordStrengthEstimator strengthEstimator) { super(briarPrefs, databaseConfig, cryptoExecutor, crypto); this.strengthEstimator = strengthEstimator; - this.authorFactory = authorFactory; - this.referenceManager = referenceManager; - - } - - private LocalAuthor createLocalAuthor(String nickname) { - long now = System.currentTimeMillis(); - KeyPair keyPair = crypto.generateSignatureKeyPair(); - byte[] publicKey = keyPair.getPublic().getEncoded(); - byte[] privateKey = keyPair.getPrivate().getEncoded(); - LocalAuthor localAuthor = authorFactory.createLocalAuthor(nickname, - publicKey, privateKey); - long duration = System.currentTimeMillis() - now; - if (LOG.isLoggable(INFO)) - LOG.info("Identity creation took " + duration + " ms"); - return localAuthor; } @Override @@ -62,20 +37,19 @@ public class SetupControllerImpl extends PasswordControllerImpl } @Override - public void createIdentity(final String nickname, final String password, - final ResultHandler<Long> resultHandler) { + public void storeAuthorInfo(final String password, final String nickName, + final ResultHandler<Void> resultHandler) { cryptoExecutor.execute(new Runnable() { @Override public void run() { SecretKey key = crypto.generateSecretKey(); databaseConfig.setEncryptionKey(key); String hex = encryptDatabaseKey(key, password); - setEncryptedDatabaseKey(hex); - LocalAuthor localAuthor = createLocalAuthor(nickname); - long handle = referenceManager.putReference(localAuthor, - LocalAuthor.class); - resultHandler.onResult(handle); + storeEncryptedDatabaseKey(hex); + databaseConfig.setAuthorNick(nickName); + resultHandler.onResult(null); } }); } + } diff --git a/briar-android/src/org/briarproject/android/invitation/AddContactActivity.java b/briar-android/src/org/briarproject/android/invitation/AddContactActivity.java index 9a8f592e17243a71c1d9512aff68ca08fcd11b08..543b2c988d9af95148d060d474b69d7052752c75 100644 --- a/briar-android/src/org/briarproject/android/invitation/AddContactActivity.java +++ b/briar-android/src/org/briarproject/android/invitation/AddContactActivity.java @@ -254,8 +254,7 @@ public class AddContactActivity extends BriarActivity // change UI to show a progress indicator setView(new InvitationCodeView(this, true)); - task = invitationTaskFactory.createTask(localAuthorId, - localInvitationCode, code); + task = invitationTaskFactory.createTask(localInvitationCode, code); taskHandle = referenceManager.putReference(task, InvitationTask.class); task.addListener(AddContactActivity.this); // Add a second listener so we can remove the first in onDestroy(), diff --git a/briar-android/test/java/org/briarproject/android/ChangePasswordActivityTest.java b/briar-android/test/java/org/briarproject/android/ChangePasswordActivityTest.java index 123616bc613d72734d88df572a94680060e3fb8e..820b4bf251886f09fb2da02c77f49dbc1c785d33 100644 --- a/briar-android/test/java/org/briarproject/android/ChangePasswordActivityTest.java +++ b/briar-android/test/java/org/briarproject/android/ChangePasswordActivityTest.java @@ -114,7 +114,6 @@ public class ChangePasswordActivityTest { @Test public void testChangePasswordUI() { - PasswordController mockedPasswordController = this.passwordController; SetupController mockedSetupController = this.setupController; changePasswordActivity.setPasswordController(mockedPasswordController); @@ -135,7 +134,7 @@ public class ChangePasswordActivityTest { verify(mockedPasswordController, times(1)) .changePassword(eq(curPass), eq(safePass), resultCaptor.capture()); - // execute the callback + // execute the callbacks resultCaptor.getValue().onResult(true); assertEquals(changePasswordActivity.isFinishing(), true); } @@ -147,12 +146,14 @@ public class ChangePasswordActivityTest { SetupController setupController = changePasswordActivity.getSetupController(); // mock a resulthandler - ResultHandler<Long> resultHandler = - (ResultHandler<Long>) mock(ResultHandler.class); - setupController.createIdentity("nick", "some.old.pass", resultHandler); + ResultHandler<Void> resultHandler = + (ResultHandler<Void>) mock(ResultHandler.class); + setupController + .storeAuthorInfo("nick", "some.old.pass", resultHandler); // blocking verification call with timeout that waits until the mocked // result gets called with handle 0L, the expected value - verify(resultHandler, timeout(2000).times(1)).onResult(0L); + verify(resultHandler, timeout(2000).times(1)) + .onResult(null); SharedPreferences prefs = changePasswordActivity .getSharedPreferences("db", Context.MODE_PRIVATE); diff --git a/briar-android/test/java/org/briarproject/android/SetupActivityTest.java b/briar-android/test/java/org/briarproject/android/SetupActivityTest.java index 1b84a05ae4533efa2885c2633609ae2133b0942f..f06c4f90c236267476f25e0c40aac477572dbba8 100644 --- a/briar-android/test/java/org/briarproject/android/SetupActivityTest.java +++ b/briar-android/test/java/org/briarproject/android/SetupActivityTest.java @@ -63,7 +63,7 @@ public class SetupActivityTest { @Mock private SetupController setupController; @Captor - private ArgumentCaptor<ResultHandler<Long>> resultCaptor; + private ArgumentCaptor<ResultHandler<Void>> authorCaptor; @Before public void setUp() { @@ -114,7 +114,6 @@ public class SetupActivityTest { @Test public void testCreateAccountUI() { - SetupController mockedController = this.setupController; setupActivity.setController(mockedController); // Mock strong password strength answer @@ -131,9 +130,10 @@ public class SetupActivityTest { // Verify that the controller's method was called with the correct // params and get the callback verify(mockedController, times(1)) - .createIdentity(eq(nick), eq(safePass), resultCaptor.capture()); + .storeAuthorInfo(eq(safePass), eq(nick), + authorCaptor.capture()); + authorCaptor.getValue().onResult(null); // execute the callback - resultCaptor.getValue().onResult(1L); assertEquals(setupActivity.isFinishing(), true); // Confirm that the correct Activity has been started ShadowActivity shadowActivity = shadowOf(setupActivity); @@ -158,13 +158,13 @@ public class SetupActivityTest { public void testAccountCreation() { SetupController controller = setupActivity.getController(); // mock a resulthandler - ResultHandler<Long> resultHandler = - (ResultHandler<Long>) mock(ResultHandler.class); + ResultHandler<Void> resultHandler = + (ResultHandler<Void>) mock(ResultHandler.class); controller - .createIdentity("nick", "some.strong.pass", resultHandler); + .storeAuthorInfo("nick", "some.strong.pass", resultHandler); // blocking verification call with timeout that waits until the mocked // result gets called with handle 0L, the expected value - verify(resultHandler, timeout(2000).times(1)).onResult(0L); + verify(resultHandler, timeout(2000).times(1)).onResult(null); SharedPreferences prefs = setupActivity.getSharedPreferences("db", Context.MODE_PRIVATE); // Confirm database key diff --git a/briar-api/src/org/briarproject/api/db/DatabaseConfig.java b/briar-api/src/org/briarproject/api/db/DatabaseConfig.java index 862afe1c8d8e271f3d411a5c6a6c8307af3add92..50484b41661e2a61a191997dd017fbe83da41a8a 100644 --- a/briar-api/src/org/briarproject/api/db/DatabaseConfig.java +++ b/briar-api/src/org/briarproject/api/db/DatabaseConfig.java @@ -1,9 +1,9 @@ package org.briarproject.api.db; -import java.io.File; - import org.briarproject.api.crypto.SecretKey; +import java.io.File; + public interface DatabaseConfig { boolean databaseExists(); @@ -14,5 +14,9 @@ public interface DatabaseConfig { SecretKey getEncryptionKey(); + void setAuthorNick(String nickName); + + String getAuthorNick(); + long getMaxSize(); } diff --git a/briar-api/src/org/briarproject/api/identity/IdentityManager.java b/briar-api/src/org/briarproject/api/identity/IdentityManager.java index 398ec4b4b53de221ffd067a3009e6bfeb28f4195..9a27c3e38be419b30ca1f60e85721691254b9308 100644 --- a/briar-api/src/org/briarproject/api/identity/IdentityManager.java +++ b/briar-api/src/org/briarproject/api/identity/IdentityManager.java @@ -4,49 +4,23 @@ import org.briarproject.api.db.DbException; import org.briarproject.api.db.Transaction; import org.briarproject.api.identity.Author.Status; -import java.util.Collection; - public interface IdentityManager { - /** Registers a hook to be called whenever a local pseudonym is added. */ - void registerAddIdentityHook(AddIdentityHook hook); - - /** Registers a hook to be called whenever a local pseudonym is removed. */ - void registerRemoveIdentityHook(RemoveIdentityHook hook); - - /** Stores a local pseudonym. */ - void addLocalAuthor(LocalAuthor a) throws DbException; - - /** Returns the local pseudonym with the given ID. */ - LocalAuthor getLocalAuthor(AuthorId a) throws DbException; + /** Stores the local pseudonym. */ + void registerLocalAuthor(LocalAuthor a) throws DbException; - /** Returns the local pseudonym with the given ID. */ - LocalAuthor getLocalAuthor(Transaction txn, AuthorId a) throws DbException; - - /** Returns the main local identity. */ + /** Returns the cached main local identity, non-blocking, or loads it from + * the db, blocking*/ LocalAuthor getLocalAuthor() throws DbException; - /** Returns the main local identity within the given Transaction. */ + /** Returns the cached main local identity, non-blocking, or loads it from + * the db, blocking, within the given Transaction. */ LocalAuthor getLocalAuthor(Transaction txn) throws DbException; - /** Returns all local pseudonyms. */ - Collection<LocalAuthor> getLocalAuthors() throws DbException; - - /** Removes a local pseudonym and all associated state. */ - void removeLocalAuthor(AuthorId a) throws DbException; - /** Returns the trust-level status of the author */ Status getAuthorStatus(AuthorId a) throws DbException; /** Returns the trust-level status of the author */ Status getAuthorStatus(Transaction txn, AuthorId a) throws DbException; - interface AddIdentityHook { - void addingIdentity(Transaction txn, LocalAuthor a) throws DbException; - } - - interface RemoveIdentityHook { - void removingIdentity(Transaction txn, LocalAuthor a) - throws DbException; - } } diff --git a/briar-api/src/org/briarproject/api/invitation/InvitationTaskFactory.java b/briar-api/src/org/briarproject/api/invitation/InvitationTaskFactory.java index 35053ff6157b6e75129c42e979757e1d1511507b..feea2d8126a7d63152655bc486dfd147a1962fe9 100644 --- a/briar-api/src/org/briarproject/api/invitation/InvitationTaskFactory.java +++ b/briar-api/src/org/briarproject/api/invitation/InvitationTaskFactory.java @@ -1,11 +1,8 @@ package org.briarproject.api.invitation; -import org.briarproject.api.identity.AuthorId; - /** Creates tasks for exchanging invitations with remote peers. */ public interface InvitationTaskFactory { - /** Creates a task using the given pseudonym and invitation codes. */ - InvitationTask createTask(AuthorId localAuthorId, int localCode, - int remoteCode); + /** Creates a task using the local author and invitation codes. */ + InvitationTask createTask(int localCode, int remoteCode); } diff --git a/briar-api/src/org/briarproject/api/lifecycle/LifecycleManager.java b/briar-api/src/org/briarproject/api/lifecycle/LifecycleManager.java index 536c9c30937266cc17409218217b0ff4ed3bbff9..5ee3a559d4723c28ae3b8003a79d5ae172295487 100644 --- a/briar-api/src/org/briarproject/api/lifecycle/LifecycleManager.java +++ b/briar-api/src/org/briarproject/api/lifecycle/LifecycleManager.java @@ -4,6 +4,8 @@ import org.briarproject.api.clients.Client; import java.util.concurrent.ExecutorService; +import javax.annotation.Nullable; + /** * Manages the lifecycle of the app, starting {@link * org.briarproject.api.clients.Client Clients}, starting and stopping {@link @@ -14,7 +16,7 @@ import java.util.concurrent.ExecutorService; public interface LifecycleManager { /** - * The result of calling {@link LifecycleManager#startServices()}. + * The result of calling {@link LifecycleManager#startServices(String)}. */ enum StartResult { ALREADY_RUNNING, DB_ERROR, SERVICE_ERROR, SUCCESS @@ -39,11 +41,11 @@ public interface LifecycleManager { /** * Opens the {@link org.briarproject.api.db.DatabaseComponent - * DatabaseComponent} and starts any registered {@link - * org.briarproject.api.clients.Client Clients} and {@link Service - * Services}. + * DatabaseComponent}, creates a local author with the provided nick, and + * starts any registered {@link org.briarproject.api.clients.Client Clients} + * and {@link Service Services}. */ - StartResult startServices(); + StartResult startServices(@Nullable String authorNick); /** * Stops any registered {@link Service Services}, shuts down any diff --git a/briar-core/src/org/briarproject/blogs/BlogManagerImpl.java b/briar-core/src/org/briarproject/blogs/BlogManagerImpl.java index 29fb1b5d1a4ac82dd93a300613fba63884a1c1d2..dfb8066b95c3776372144e6099513e20b63dd673 100644 --- a/briar-core/src/org/briarproject/blogs/BlogManagerImpl.java +++ b/briar-core/src/org/briarproject/blogs/BlogManagerImpl.java @@ -26,8 +26,6 @@ import org.briarproject.api.identity.Author; import org.briarproject.api.identity.Author.Status; import org.briarproject.api.identity.AuthorId; import org.briarproject.api.identity.IdentityManager; -import org.briarproject.api.identity.IdentityManager.AddIdentityHook; -import org.briarproject.api.identity.IdentityManager.RemoveIdentityHook; import org.briarproject.api.identity.LocalAuthor; import org.briarproject.api.sync.ClientId; import org.briarproject.api.sync.Group; @@ -75,8 +73,7 @@ import static org.briarproject.api.contact.ContactManager.RemoveContactHook; import static org.briarproject.blogs.BlogPostValidator.authorToBdfDictionary; class BlogManagerImpl extends BdfIncomingMessageHook implements BlogManager, - AddContactHook, RemoveContactHook, Client, - AddIdentityHook, RemoveIdentityHook { + AddContactHook, RemoveContactHook, Client { private static final Logger LOG = Logger.getLogger(BlogManagerImpl.class.getName()); @@ -151,25 +148,6 @@ class BlogManagerImpl extends BdfIncomingMessageHook implements BlogManager, } } - @Override - public void addingIdentity(Transaction txn, LocalAuthor a) - throws DbException { - - // add a personal blog for the new identity - LOG.info("New Personal Blog Added."); - Blog b = blogFactory.createBlog(a); - db.addGroup(txn, b.getGroup()); - } - - @Override - public void removingIdentity(Transaction txn, LocalAuthor a) - throws DbException { - - // remove the personal blog of that identity - Blog b = blogFactory.createBlog(a); - db.removeGroup(txn, b.getGroup()); - } - @Override protected boolean incomingMessage(Transaction txn, Message m, BdfList list, BdfDictionary meta) throws DbException, FormatException { diff --git a/briar-core/src/org/briarproject/blogs/BlogsModule.java b/briar-core/src/org/briarproject/blogs/BlogsModule.java index e8927d5afc374a7c4b29d8593b9214810f922150..0ba7eaa0d51362543aae7615ccd37204c4c08fe6 100644 --- a/briar-core/src/org/briarproject/blogs/BlogsModule.java +++ b/briar-core/src/org/briarproject/blogs/BlogsModule.java @@ -7,7 +7,6 @@ import org.briarproject.api.clients.ClientHelper; import org.briarproject.api.contact.ContactManager; import org.briarproject.api.data.MetadataEncoder; import org.briarproject.api.identity.AuthorFactory; -import org.briarproject.api.identity.IdentityManager; import org.briarproject.api.lifecycle.LifecycleManager; import org.briarproject.api.sync.GroupFactory; import org.briarproject.api.sync.MessageFactory; @@ -36,14 +35,11 @@ public class BlogsModule { @Singleton BlogManager provideBlogManager(BlogManagerImpl blogManager, LifecycleManager lifecycleManager, ContactManager contactManager, - IdentityManager identityManager, ValidationManager validationManager) { lifecycleManager.registerClient(blogManager); contactManager.registerAddContactHook(blogManager); contactManager.registerRemoveContactHook(blogManager); - identityManager.registerAddIdentityHook(blogManager); - identityManager.registerRemoveIdentityHook(blogManager); validationManager.registerIncomingMessageHook(CLIENT_ID, blogManager); return blogManager; } diff --git a/briar-core/src/org/briarproject/contact/ContactManagerImpl.java b/briar-core/src/org/briarproject/contact/ContactManagerImpl.java index 44bc5979e6b8725109dede1b22783d10a1a097a1..d8137fcba547f97b8ca28a11377aa9bfeb547cbd 100644 --- a/briar-core/src/org/briarproject/contact/ContactManagerImpl.java +++ b/briar-core/src/org/briarproject/contact/ContactManagerImpl.java @@ -9,8 +9,6 @@ import org.briarproject.api.db.DbException; import org.briarproject.api.db.Transaction; import org.briarproject.api.identity.Author; import org.briarproject.api.identity.AuthorId; -import org.briarproject.api.identity.IdentityManager.RemoveIdentityHook; -import org.briarproject.api.identity.LocalAuthor; import org.briarproject.api.transport.KeyManager; import java.util.ArrayList; @@ -21,7 +19,7 @@ import java.util.concurrent.CopyOnWriteArrayList; import javax.inject.Inject; -class ContactManagerImpl implements ContactManager, RemoveIdentityHook { +class ContactManagerImpl implements ContactManager { private final DatabaseComponent db; private final KeyManager keyManager; @@ -148,11 +146,4 @@ class ContactManagerImpl implements ContactManager, RemoveIdentityHook { db.removeContact(txn, c); } - @Override - public void removingIdentity(Transaction txn, LocalAuthor a) - throws DbException { - // Remove any contacts of the local pseudonym that's being removed - for (ContactId c : db.getContacts(txn, a.getId())) - removeContact(txn, c); - } } diff --git a/briar-core/src/org/briarproject/contact/ContactModule.java b/briar-core/src/org/briarproject/contact/ContactModule.java index 3599eb0ddbfc79cf8d37855b3d18167d79aea945..800b8e57f9c0134bc5ca0802a33ecb4c014d54ac 100644 --- a/briar-core/src/org/briarproject/contact/ContactModule.java +++ b/briar-core/src/org/briarproject/contact/ContactModule.java @@ -2,17 +2,6 @@ package org.briarproject.contact; import org.briarproject.api.contact.ContactExchangeTask; import org.briarproject.api.contact.ContactManager; -import org.briarproject.api.crypto.CryptoComponent; -import org.briarproject.api.data.BdfReaderFactory; -import org.briarproject.api.data.BdfWriterFactory; -import org.briarproject.api.db.DatabaseComponent; -import org.briarproject.api.identity.AuthorFactory; -import org.briarproject.api.identity.IdentityManager; -import org.briarproject.api.plugins.ConnectionManager; -import org.briarproject.api.properties.TransportPropertyManager; -import org.briarproject.api.system.Clock; -import org.briarproject.api.transport.StreamReaderFactory; -import org.briarproject.api.transport.StreamWriterFactory; import javax.inject.Inject; import javax.inject.Singleton; @@ -30,9 +19,7 @@ public class ContactModule { @Provides @Singleton - ContactManager getContactManager(IdentityManager identityManager, - ContactManagerImpl contactManager) { - identityManager.registerRemoveIdentityHook(contactManager); + ContactManager getContactManager(ContactManagerImpl contactManager) { return contactManager; } diff --git a/briar-core/src/org/briarproject/feed/FeedManagerImpl.java b/briar-core/src/org/briarproject/feed/FeedManagerImpl.java index e3daef72e5abe558994e59a91c8a944131617031..1d9eebea9c3734ae7e3fa73845ce6ef98ca3672a 100644 --- a/briar-core/src/org/briarproject/feed/FeedManagerImpl.java +++ b/briar-core/src/org/briarproject/feed/FeedManagerImpl.java @@ -9,7 +9,6 @@ import com.rometools.rome.io.XmlReader; import org.briarproject.api.FormatException; import org.briarproject.api.TransportId; -import org.briarproject.api.blogs.Blog; import org.briarproject.api.blogs.BlogManager; import org.briarproject.api.blogs.BlogPost; import org.briarproject.api.blogs.BlogPostFactory; @@ -27,7 +26,6 @@ import org.briarproject.api.event.EventListener; import org.briarproject.api.event.TransportEnabledEvent; import org.briarproject.api.feed.Feed; import org.briarproject.api.feed.FeedManager; -import org.briarproject.api.identity.AuthorId; import org.briarproject.api.identity.IdentityManager; import org.briarproject.api.identity.LocalAuthor; import org.briarproject.api.lifecycle.IoExecutor; @@ -459,9 +457,7 @@ class FeedManagerImpl implements FeedManager, Client, EventListener { String body = getPostBody(b.toString()); try { // create and store post - Blog blog = blogManager.getBlog(txn, groupId); - AuthorId authorId = blog.getAuthor().getId(); - LocalAuthor author = identityManager.getLocalAuthor(txn, authorId); + LocalAuthor author = identityManager.getLocalAuthor(txn); BlogPost post = blogPostFactory .createBlogPost(groupId, time, null, author, body); blogManager.addLocalPost(txn, post); diff --git a/briar-core/src/org/briarproject/identity/IdentityManagerImpl.java b/briar-core/src/org/briarproject/identity/IdentityManagerImpl.java index 0901025840a0e0155deebfa7a4431d5deca99b7d..48b5b2d129d98ae755ac3954132e7390e980e133 100644 --- a/briar-core/src/org/briarproject/identity/IdentityManagerImpl.java +++ b/briar-core/src/org/briarproject/identity/IdentityManagerImpl.java @@ -10,8 +10,7 @@ import org.briarproject.api.identity.IdentityManager; import org.briarproject.api.identity.LocalAuthor; import java.util.Collection; -import java.util.List; -import java.util.concurrent.CopyOnWriteArrayList; +import java.util.logging.Logger; import javax.inject.Inject; @@ -22,104 +21,62 @@ import static org.briarproject.api.identity.Author.Status.VERIFIED; class IdentityManagerImpl implements IdentityManager { private final DatabaseComponent db; - private final List<AddIdentityHook> addHooks; - private final List<RemoveIdentityHook> removeHooks; + + private static final Logger LOG = + Logger.getLogger(IdentityManagerImpl.class.getName()); + + // Make sure that this variable is immutable + private volatile LocalAuthor cachedAuthor; @Inject IdentityManagerImpl(DatabaseComponent db) { this.db = db; - addHooks = new CopyOnWriteArrayList<AddIdentityHook>(); - removeHooks = new CopyOnWriteArrayList<RemoveIdentityHook>(); - } - - @Override - public void registerAddIdentityHook(AddIdentityHook hook) { - addHooks.add(hook); } @Override - public void registerRemoveIdentityHook(RemoveIdentityHook hook) { - removeHooks.add(hook); - } - - @Override - public void addLocalAuthor(LocalAuthor localAuthor) throws DbException { + public void registerLocalAuthor(LocalAuthor localAuthor) throws DbException { Transaction txn = db.startTransaction(false); try { db.addLocalAuthor(txn, localAuthor); - for (AddIdentityHook hook : addHooks) - hook.addingIdentity(txn, localAuthor); txn.setComplete(); + cachedAuthor = localAuthor; + LOG.info("Local Author created"); } finally { db.endTransaction(txn); } } @Override - public LocalAuthor getLocalAuthor(AuthorId a) throws DbException { - LocalAuthor author; - Transaction txn = db.startTransaction(true); - try { - author = getLocalAuthor(txn, a); - txn.setComplete(); - } finally { - db.endTransaction(txn); + public LocalAuthor getLocalAuthor() throws DbException { + if (cachedAuthor == null) { + Transaction txn = db.startTransaction(true); + try { + cachedAuthor = loadLocalAuthor(txn); + LOG.info("Author loaded from db"); + txn.setComplete(); + } finally { + db.endTransaction(txn); + } } - return author; + return cachedAuthor; } - @Override - public LocalAuthor getLocalAuthor(Transaction txn, AuthorId a) - throws DbException { - return db.getLocalAuthor(txn, a); - } - - @Override - public LocalAuthor getLocalAuthor() throws DbException { - return getLocalAuthors().iterator().next(); - } @Override public LocalAuthor getLocalAuthor(Transaction txn) throws DbException { - return getLocalAuthors(txn).iterator().next(); - } - - @Override - public Collection<LocalAuthor> getLocalAuthors() throws DbException { - Collection<LocalAuthor> authors; - Transaction txn = db.startTransaction(true); - try { - authors = getLocalAuthors(txn); - txn.setComplete(); - } finally { - db.endTransaction(txn); + if (cachedAuthor == null) { + cachedAuthor = loadLocalAuthor(txn); } - return authors; + return cachedAuthor; } - private Collection<LocalAuthor> getLocalAuthors(Transaction txn) - throws DbException { - - return db.getLocalAuthors(txn); - } - - @Override - public void removeLocalAuthor(AuthorId a) throws DbException { - Transaction txn = db.startTransaction(false); - try { - LocalAuthor localAuthor = db.getLocalAuthor(txn, a); - for (RemoveIdentityHook hook : removeHooks) - hook.removingIdentity(txn, localAuthor); - db.removeLocalAuthor(txn, a); - txn.setComplete(); - } finally { - db.endTransaction(txn); - } + private LocalAuthor loadLocalAuthor(Transaction txn) throws DbException{ + return db.getLocalAuthors(txn).iterator().next(); } @Override public Status getAuthorStatus(AuthorId authorId) throws DbException { - Transaction txn = db.startTransaction(false); + Transaction txn = db.startTransaction(true); try { return getAuthorStatus(txn, authorId); } finally { @@ -131,10 +88,8 @@ class IdentityManagerImpl implements IdentityManager { public Status getAuthorStatus(Transaction txn, AuthorId authorId) throws DbException { - // Compare to the IDs of the user's identities - for (LocalAuthor a : db.getLocalAuthors(txn)) { - if (a.getId().equals(authorId)) return OURSELVES; - } + // Compare to the IDs of the user's identity + if (getLocalAuthor(txn).getId().equals(authorId)) return OURSELVES; Collection<Contact> contacts = db.getContactsByAuthorId(txn, authorId); if (contacts.isEmpty()) return UNKNOWN; diff --git a/briar-core/src/org/briarproject/identity/IdentityModule.java b/briar-core/src/org/briarproject/identity/IdentityModule.java index c03ee24efb563ed121cbbf5139a68303a30e0ad2..3caa856fccfd644e1fbfde52169b38c089ef3cc1 100644 --- a/briar-core/src/org/briarproject/identity/IdentityModule.java +++ b/briar-core/src/org/briarproject/identity/IdentityModule.java @@ -31,7 +31,7 @@ public class IdentityModule { @Provides @Singleton - IdentityManager provideIdendityModule(DatabaseComponent db) { + IdentityManager provideIdentityModule(DatabaseComponent db) { return new IdentityManagerImpl(db); } diff --git a/briar-core/src/org/briarproject/introduction/IntroduceeManager.java b/briar-core/src/org/briarproject/introduction/IntroduceeManager.java index 4456a5671cb682d7af55bc2e50b597ea7a893525..01ac71211ff08b49ef5f6227a65f42fea11a2feb 100644 --- a/briar-core/src/org/briarproject/introduction/IntroduceeManager.java +++ b/briar-core/src/org/briarproject/introduction/IntroduceeManager.java @@ -305,10 +305,8 @@ class IntroduceeManager { boolean alice = comp < 0; // get our local author - AuthorId localAuthorId = - new AuthorId(localState.getRaw(LOCAL_AUTHOR_ID)); LocalAuthor author = - identityManager.getLocalAuthor(txn, localAuthorId); + identityManager.getLocalAuthor(txn); SecretKey secretKey; byte[] privateKeyBytes = localState.getRaw(OUR_PRIVATE_KEY); @@ -336,7 +334,7 @@ class IntroduceeManager { .createAuthor(localState.getString(NAME), localState.getRaw(PUBLIC_KEY)); ContactId contactId = contactManager - .addContact(txn, remoteAuthor, localAuthorId, secretKey, + .addContact(txn, remoteAuthor, author.getId(), secretKey, timestamp, alice, false, false); // Update local state with ContactId, so we know what to activate diff --git a/briar-core/src/org/briarproject/invitation/ConnectorGroup.java b/briar-core/src/org/briarproject/invitation/ConnectorGroup.java index 7b2545789e076a070c0d8da8b02528977baf6fe9..a88163f52bd3a84335a4a0528b78940c8d61f4a9 100644 --- a/briar-core/src/org/briarproject/invitation/ConnectorGroup.java +++ b/briar-core/src/org/briarproject/invitation/ConnectorGroup.java @@ -2,26 +2,19 @@ package org.briarproject.invitation; import org.briarproject.api.contact.ContactExchangeListener; import org.briarproject.api.contact.ContactExchangeTask; -import org.briarproject.api.contact.ContactManager; import org.briarproject.api.crypto.CryptoComponent; import org.briarproject.api.crypto.PseudoRandom; import org.briarproject.api.data.BdfReaderFactory; import org.briarproject.api.data.BdfWriterFactory; import org.briarproject.api.db.DbException; import org.briarproject.api.identity.Author; -import org.briarproject.api.identity.AuthorFactory; -import org.briarproject.api.identity.AuthorId; import org.briarproject.api.identity.IdentityManager; import org.briarproject.api.identity.LocalAuthor; import org.briarproject.api.invitation.InvitationListener; import org.briarproject.api.invitation.InvitationState; import org.briarproject.api.invitation.InvitationTask; -import org.briarproject.api.plugins.ConnectionManager; import org.briarproject.api.plugins.PluginManager; import org.briarproject.api.plugins.duplex.DuplexPlugin; -import org.briarproject.api.system.Clock; -import org.briarproject.api.transport.StreamReaderFactory; -import org.briarproject.api.transport.StreamWriterFactory; import java.util.ArrayList; import java.util.Collection; @@ -51,7 +44,6 @@ class ConnectorGroup extends Thread implements InvitationTask, private final ContactExchangeTask contactExchangeTask; private final IdentityManager identityManager; private final PluginManager pluginManager; - private final AuthorId localAuthorId; private final int localInvitationCode, remoteInvitationCode; private final Collection<InvitationListener> listeners; private final AtomicBoolean connected; @@ -66,11 +58,9 @@ class ConnectorGroup extends Thread implements InvitationTask, private String remoteName = null; ConnectorGroup(CryptoComponent crypto, BdfReaderFactory bdfReaderFactory, - BdfWriterFactory bdfWriterFactory, - ContactExchangeTask contactExchangeTask, + BdfWriterFactory bdfWriterFactory, ContactExchangeTask contactExchangeTask, IdentityManager identityManager, PluginManager pluginManager, - AuthorId localAuthorId, int localInvitationCode, - int remoteInvitationCode) { + int localInvitationCode, int remoteInvitationCode) { super("ConnectorGroup"); this.crypto = crypto; this.bdfReaderFactory = bdfReaderFactory; @@ -78,7 +68,6 @@ class ConnectorGroup extends Thread implements InvitationTask, this.contactExchangeTask = contactExchangeTask; this.identityManager = identityManager; this.pluginManager = pluginManager; - this.localAuthorId = localAuthorId; this.localInvitationCode = localInvitationCode; this.remoteInvitationCode = remoteInvitationCode; listeners = new CopyOnWriteArrayList<InvitationListener>(); @@ -113,7 +102,7 @@ class ConnectorGroup extends Thread implements InvitationTask, LocalAuthor localAuthor; // Load the local pseudonym try { - localAuthor = identityManager.getLocalAuthor(localAuthorId); + localAuthor = identityManager.getLocalAuthor(); } catch (DbException e) { if (LOG.isLoggable(WARNING)) LOG.log(WARNING, e.toString(), e); lock.lock(); diff --git a/briar-core/src/org/briarproject/invitation/InvitationTaskFactoryImpl.java b/briar-core/src/org/briarproject/invitation/InvitationTaskFactoryImpl.java index 750153956d63fe692162301caf52291dc5c8875a..5c18deddc0c4332ed98e5a2c75fb8632228ccc57 100644 --- a/briar-core/src/org/briarproject/invitation/InvitationTaskFactoryImpl.java +++ b/briar-core/src/org/briarproject/invitation/InvitationTaskFactoryImpl.java @@ -4,7 +4,6 @@ import org.briarproject.api.contact.ContactExchangeTask; import org.briarproject.api.crypto.CryptoComponent; import org.briarproject.api.data.BdfReaderFactory; import org.briarproject.api.data.BdfWriterFactory; -import org.briarproject.api.identity.AuthorId; import org.briarproject.api.identity.IdentityManager; import org.briarproject.api.invitation.InvitationTask; import org.briarproject.api.invitation.InvitationTaskFactory; @@ -35,10 +34,9 @@ class InvitationTaskFactoryImpl implements InvitationTaskFactory { this.pluginManager = pluginManager; } - public InvitationTask createTask(AuthorId localAuthorId, int localCode, - int remoteCode) { + public InvitationTask createTask(int localCode, int remoteCode) { return new ConnectorGroup(crypto, bdfReaderFactory, bdfWriterFactory, contactExchangeTask, identityManager, pluginManager, - localAuthorId, localCode, remoteCode); + localCode, remoteCode); } } diff --git a/briar-core/src/org/briarproject/lifecycle/LifecycleManagerImpl.java b/briar-core/src/org/briarproject/lifecycle/LifecycleManagerImpl.java index 3abfa4cbc3ac732a2cff9c66bf5c2f9395580350..895f80c284e0426354464164cb2cda38c9d3a17a 100644 --- a/briar-core/src/org/briarproject/lifecycle/LifecycleManagerImpl.java +++ b/briar-core/src/org/briarproject/lifecycle/LifecycleManagerImpl.java @@ -1,11 +1,16 @@ package org.briarproject.lifecycle; import org.briarproject.api.clients.Client; +import org.briarproject.api.crypto.CryptoComponent; +import org.briarproject.api.crypto.KeyPair; import org.briarproject.api.db.DatabaseComponent; import org.briarproject.api.db.DbException; import org.briarproject.api.db.Transaction; import org.briarproject.api.event.EventBus; import org.briarproject.api.event.ShutdownEvent; +import org.briarproject.api.identity.AuthorFactory; +import org.briarproject.api.identity.IdentityManager; +import org.briarproject.api.identity.LocalAuthor; import org.briarproject.api.lifecycle.LifecycleManager; import org.briarproject.api.lifecycle.Service; import org.briarproject.api.lifecycle.ServiceException; @@ -17,6 +22,7 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Semaphore; import java.util.logging.Logger; +import javax.annotation.Nullable; import javax.inject.Inject; import static java.util.logging.Level.INFO; @@ -36,15 +42,23 @@ class LifecycleManagerImpl implements LifecycleManager { private final List<Service> services; private final List<Client> clients; private final List<ExecutorService> 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); private final CountDownLatch startupLatch = new CountDownLatch(1); private final CountDownLatch shutdownLatch = new CountDownLatch(1); @Inject - LifecycleManagerImpl(DatabaseComponent db, EventBus eventBus) { + 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<Service>(); clients = new CopyOnWriteArrayList<Client>(); executors = new CopyOnWriteArrayList<ExecutorService>(); @@ -70,8 +84,30 @@ class LifecycleManagerImpl implements LifecycleManager { executors.add(e); } + private LocalAuthor createLocalAuthor(final String nickname) { + long now = System.currentTimeMillis(); + KeyPair keyPair = crypto.generateSignatureKeyPair(); + byte[] publicKey = keyPair.getPublic().getEncoded(); + byte[] privateKey = keyPair.getPrivate().getEncoded(); + LocalAuthor localAuthor = authorFactory + .createLocalAuthor(nickname, publicKey, privateKey); + long duration = System.currentTimeMillis() - now; + if (LOG.isLoggable(INFO)) + LOG.info("Identity creation took " + duration + " ms"); + return localAuthor; + } + + private void registerLocalAuthor(LocalAuthor author) throws DbException { + long now = System.currentTimeMillis(); + identityManager.registerLocalAuthor(author); + long duration = System.currentTimeMillis() - now; + if (LOG.isLoggable(INFO)) + LOG.info("Author registration took " + duration + + " ms"); + } + @Override - public StartResult startServices() { + public StartResult startServices(@Nullable String authorNick) { if (!startStopSemaphore.tryAcquire()) { LOG.info("Already starting or stopping"); return ALREADY_RUNNING; @@ -79,6 +115,7 @@ class LifecycleManagerImpl implements LifecycleManager { try { LOG.info("Starting services"); long start = System.currentTimeMillis(); + boolean reopened = db.open(); long duration = System.currentTimeMillis() - start; if (LOG.isLoggable(INFO)) { @@ -86,6 +123,11 @@ class LifecycleManagerImpl implements LifecycleManager { LOG.info("Reopening database took " + duration + " ms"); else LOG.info("Creating database took " + duration + " ms"); } + + if (authorNick != null) { + registerLocalAuthor(createLocalAuthor(authorNick)); + } + dbLatch.countDown(); Transaction txn = db.startTransaction(false); try { @@ -181,4 +223,5 @@ class LifecycleManagerImpl implements LifecycleManager { public void waitForShutdown() throws InterruptedException { shutdownLatch.await(); } + } diff --git a/briar-core/src/org/briarproject/lifecycle/LifecycleModule.java b/briar-core/src/org/briarproject/lifecycle/LifecycleModule.java index 7ad4cb6b0cb27f48c5e8a6fa6253ed0ee3176c07..67c94c1a841ac59e59e6a0944ee638bedf6d36b3 100644 --- a/briar-core/src/org/briarproject/lifecycle/LifecycleModule.java +++ b/briar-core/src/org/briarproject/lifecycle/LifecycleModule.java @@ -1,7 +1,10 @@ package org.briarproject.lifecycle; +import org.briarproject.api.crypto.CryptoComponent; import org.briarproject.api.db.DatabaseComponent; import org.briarproject.api.event.EventBus; +import org.briarproject.api.identity.AuthorFactory; +import org.briarproject.api.identity.IdentityManager; import org.briarproject.api.lifecycle.IoExecutor; import org.briarproject.api.lifecycle.LifecycleManager; import org.briarproject.api.lifecycle.ShutdownManager; @@ -26,7 +29,8 @@ public class LifecycleModule { public static class EagerSingletons { @Inject - @IoExecutor Executor executor; + @IoExecutor + Executor executor; } private final ExecutorService ioExecutor; @@ -51,8 +55,10 @@ public class LifecycleModule { @Provides @Singleton LifecycleManager provideLifecycleManager(DatabaseComponent db, - EventBus eventBus) { - return new LifecycleManagerImpl(db, eventBus); + EventBus eventBus, CryptoComponent crypto, + AuthorFactory authorFactory, IdentityManager identityManager) { + return new LifecycleManagerImpl(db, eventBus, crypto, authorFactory, + identityManager); } @Provides diff --git a/briar-tests/src/org/briarproject/TestDatabaseConfig.java b/briar-tests/src/org/briarproject/TestDatabaseConfig.java index 03bfb4b1e9d783d2e3654d2e8b23ced15e764e4f..3954a2a20be0eb5417a6f3390a0c7301c9963ff2 100644 --- a/briar-tests/src/org/briarproject/TestDatabaseConfig.java +++ b/briar-tests/src/org/briarproject/TestDatabaseConfig.java @@ -38,6 +38,16 @@ public class TestDatabaseConfig implements DatabaseConfig { return key; } + @Override + public void setAuthorNick(String nickName) { + + } + + @Override + public String getAuthorNick() { + return null; + } + @Override public long getMaxSize() { return maxSize; diff --git a/briar-tests/src/org/briarproject/TestLifecycleModule.java b/briar-tests/src/org/briarproject/TestLifecycleModule.java index 04137713c0315464ffbb0e3e5989959ce3abc437..02813eb76df71fe0d1477a3fa43a2706b2fac46b 100644 --- a/briar-tests/src/org/briarproject/TestLifecycleModule.java +++ b/briar-tests/src/org/briarproject/TestLifecycleModule.java @@ -38,7 +38,7 @@ public class TestLifecycleModule { } @Override - public StartResult startServices() { + public StartResult startServices(String authorNick) { return StartResult.SUCCESS; } diff --git a/briar-tests/src/org/briarproject/blogs/BlogManagerImplTest.java b/briar-tests/src/org/briarproject/blogs/BlogManagerImplTest.java index 34c9749b5650911fe3909c484702a7c90931a042..ac7d27cd1332bc1e847d4fdf021cc606a25f23ed 100644 --- a/briar-tests/src/org/briarproject/blogs/BlogManagerImplTest.java +++ b/briar-tests/src/org/briarproject/blogs/BlogManagerImplTest.java @@ -93,7 +93,6 @@ public class BlogManagerImplTest extends BriarTestCase { @Test public void testCreateLocalState() throws DbException { final Transaction txn = new Transaction(null, false); - final LocalAuthor localAuthor = (LocalAuthor) blog1.getAuthor(); final ContactId contactId = new ContactId(0); final Collection<ContactId> contactIds = @@ -105,7 +104,7 @@ public class BlogManagerImplTest extends BriarTestCase { context.checking(new Expectations() {{ oneOf(identityManager).getLocalAuthor(txn); - will(returnValue(localAuthor)); + will(returnValue(blog1.getAuthor())); oneOf(blogFactory).createBlog(blog1.getAuthor()); will(returnValue(blog1)); oneOf(db).containsGroup(txn, blog1.getId()); @@ -151,42 +150,6 @@ public class BlogManagerImplTest extends BriarTestCase { context.assertIsSatisfied(); } - @Test - public void testAddingIdentity() throws DbException { - final Transaction txn = new Transaction(null, false); - Author a = blog1.getAuthor(); - final LocalAuthor localAuthor = - new LocalAuthor(a.getId(), a.getName(), a.getPublicKey(), - a.getPublicKey(), 0); - - context.checking(new Expectations() {{ - oneOf(blogFactory).createBlog(localAuthor); - will(returnValue(blog1)); - oneOf(db).addGroup(txn, blog1.getGroup()); - }}); - - blogManager.addingIdentity(txn, localAuthor); - context.assertIsSatisfied(); - } - - @Test - public void testRemovingIdentity() throws DbException { - final Transaction txn = new Transaction(null, false); - Author a = blog1.getAuthor(); - final LocalAuthor localAuthor = - new LocalAuthor(a.getId(), a.getName(), a.getPublicKey(), - a.getPublicKey(), 0); - - context.checking(new Expectations() {{ - oneOf(blogFactory).createBlog(localAuthor); - will(returnValue(blog1)); - oneOf(db).removeGroup(txn, blog1.getGroup()); - }}); - - blogManager.removingIdentity(txn, localAuthor); - context.assertIsSatisfied(); - } - @Test public void testIncomingMessage() throws DbException, FormatException { final Transaction txn = new Transaction(null, false); diff --git a/briar-tests/src/org/briarproject/db/DatabaseComponentImplTest.java b/briar-tests/src/org/briarproject/db/DatabaseComponentImplTest.java index 87603e76ef7b50084fc9addd1242927180c6f2fe..0b5016b8d9870cdd2a4600eea0e51a295365f730 100644 --- a/briar-tests/src/org/briarproject/db/DatabaseComponentImplTest.java +++ b/briar-tests/src/org/briarproject/db/DatabaseComponentImplTest.java @@ -136,7 +136,7 @@ public class DatabaseComponentImplTest extends BriarTestCase { // startTransaction() oneOf(database).startTransaction(); will(returnValue(txn)); - // addLocalAuthor() + // registerLocalAuthor() oneOf(database).containsLocalAuthor(txn, localAuthorId); will(returnValue(false)); oneOf(database).addLocalAuthor(txn, localAuthor); @@ -813,7 +813,7 @@ public class DatabaseComponentImplTest extends BriarTestCase { // startTransaction() oneOf(database).startTransaction(); will(returnValue(txn)); - // addLocalAuthor() + // registerLocalAuthor() oneOf(database).containsLocalAuthor(txn, localAuthorId); will(returnValue(false)); oneOf(database).addLocalAuthor(txn, localAuthor); diff --git a/briar-tests/src/org/briarproject/identity/IdentityManagerImplTest.java b/briar-tests/src/org/briarproject/identity/IdentityManagerImplTest.java index 9939e8f023c319c3eee6884e72d1ce10b7687186..ec73a0c1a5ec7258f1aa32572db3e73fdfc38759 100644 --- a/briar-tests/src/org/briarproject/identity/IdentityManagerImplTest.java +++ b/briar-tests/src/org/briarproject/identity/IdentityManagerImplTest.java @@ -46,7 +46,7 @@ public class IdentityManagerImplTest extends BriarTestCase { @Test public void testGetAuthorStatus() throws DbException { - AuthorId authorId = new AuthorId(TestUtils.getRandomId()); + final AuthorId authorId = new AuthorId(TestUtils.getRandomId()); final Collection<LocalAuthor> localAuthors = new ArrayList<>(); LocalAuthor localAuthor = new LocalAuthor(new AuthorId(TestUtils.getRandomId()), @@ -54,9 +54,17 @@ public class IdentityManagerImplTest extends BriarTestCase { TestUtils.getRandomBytes(42), TestUtils.getRandomBytes(42), 0); localAuthors.add(localAuthor); - Collection<Contact> contacts = new ArrayList<>(); + final Collection<Contact> contacts = new ArrayList<>(); - checkAuthorStatusContext(localAuthors, authorId, contacts); + context.checking(new Expectations() {{ + oneOf(db).startTransaction(true); + will(returnValue(txn)); + oneOf(db).getLocalAuthors(txn); + will(returnValue(localAuthors)); + oneOf(db).getContactsByAuthorId(txn, authorId); + will(returnValue(contacts)); + oneOf(db).endTransaction(txn); + }}); assertEquals(UNKNOWN, identityManager.getAuthorStatus(authorId)); // add one unverified contact @@ -67,7 +75,7 @@ public class IdentityManagerImplTest extends BriarTestCase { false, true); contacts.add(contact); - checkAuthorStatusContext(localAuthors, authorId, contacts); + checkAuthorStatusContext(authorId, contacts); assertEquals(UNVERIFIED, identityManager.getAuthorStatus(authorId)); // add one verified contact @@ -76,37 +84,28 @@ public class IdentityManagerImplTest extends BriarTestCase { true, true); contacts.add(contact2); - checkAuthorStatusContext(localAuthors, authorId, contacts); + checkAuthorStatusContext(authorId, contacts); assertEquals(VERIFIED, identityManager.getAuthorStatus(authorId)); - // add ourselves to the local authors - LocalAuthor localAuthor2 = - new LocalAuthor(authorId, - TestUtils.getRandomString(8), - TestUtils.getRandomBytes(42), - TestUtils.getRandomBytes(42), 0); - localAuthors.add(localAuthor2); - context.checking(new Expectations() {{ - oneOf(db).startTransaction(false); + oneOf(db).startTransaction(true); will(returnValue(txn)); - oneOf(db).getLocalAuthors(txn); - will(returnValue(localAuthors)); + never(db).getLocalAuthors(txn); + never(db).getContactsByAuthorId(txn, authorId); oneOf(db).endTransaction(txn); }}); - assertEquals(OURSELVES, identityManager.getAuthorStatus(authorId)); + assertEquals(OURSELVES, + identityManager.getAuthorStatus(localAuthor.getId())); context.assertIsSatisfied(); } - private void checkAuthorStatusContext( - final Collection<LocalAuthor> localAuthors, final AuthorId authorId, + private void checkAuthorStatusContext(final AuthorId authorId, final Collection<Contact> contacts) throws DbException { context.checking(new Expectations() {{ - oneOf(db).startTransaction(false); + oneOf(db).startTransaction(true); will(returnValue(txn)); - oneOf(db).getLocalAuthors(txn); - will(returnValue(localAuthors)); + never(db).getLocalAuthors(txn); oneOf(db).getContactsByAuthorId(txn, authorId); will(returnValue(contacts)); oneOf(db).endTransaction(txn); diff --git a/build.gradle b/build.gradle index a494e68f297f5217c2a3255c1772031563f7ca1d..eddf2bc6a583d821c4da4a361f51b04287ab3b81 100644 --- a/build.gradle +++ b/build.gradle @@ -14,7 +14,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:2.2.1' + classpath 'com.android.tools.build:gradle:2.2.2' classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' classpath 'de.undercouch:gradle-download-task:2.1.0' classpath files('briar-core/libs/gradle-witness.jar')