From 372810f48edc3bccb8378ab2cfa6ffd54acadd56 Mon Sep 17 00:00:00 2001 From: akwizgran Date: Tue, 16 Nov 2021 12:53:17 +0000 Subject: [PATCH] Add mailbox settings manager. --- .../api/mailbox/MailboxProperties.java | 32 ++++++++ .../api/mailbox/MailboxSettingsManager.java | 18 +++++ .../bramble/api/settings/SettingsManager.java | 7 ++ .../bramble/BrambleCoreModule.java | 2 + .../bramble/mailbox/MailboxModule.java | 16 ++++ .../mailbox/MailboxSettingsManagerImpl.java | 50 ++++++++++++ .../bramble/settings/SettingsManagerImpl.java | 6 ++ .../MailboxSettingsManagerImplTest.java | 79 +++++++++++++++++++ 8 files changed, 210 insertions(+) create mode 100644 bramble-api/src/main/java/org/briarproject/bramble/api/mailbox/MailboxProperties.java create mode 100644 bramble-api/src/main/java/org/briarproject/bramble/api/mailbox/MailboxSettingsManager.java create mode 100644 bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxModule.java create mode 100644 bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxSettingsManagerImpl.java create mode 100644 bramble-core/src/test/java/org/briarproject/bramble/mailbox/MailboxSettingsManagerImplTest.java diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/mailbox/MailboxProperties.java b/bramble-api/src/main/java/org/briarproject/bramble/api/mailbox/MailboxProperties.java new file mode 100644 index 000000000..723c5aabc --- /dev/null +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/mailbox/MailboxProperties.java @@ -0,0 +1,32 @@ +package org.briarproject.bramble.api.mailbox; + +import org.briarproject.bramble.api.nullsafety.NotNullByDefault; + +import javax.annotation.concurrent.Immutable; + +@Immutable +@NotNullByDefault +public class MailboxProperties { + + private final String onionAddress, authToken; + private final boolean owner; + + public MailboxProperties(String onionAddress, String authToken, + boolean owner) { + this.onionAddress = onionAddress; + this.authToken = authToken; + this.owner = owner; + } + + public String getOnionAddress() { + return onionAddress; + } + + public String getAuthToken() { + return authToken; + } + + public boolean isOwner() { + return owner; + } +} diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/mailbox/MailboxSettingsManager.java b/bramble-api/src/main/java/org/briarproject/bramble/api/mailbox/MailboxSettingsManager.java new file mode 100644 index 000000000..ab9e96d5e --- /dev/null +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/mailbox/MailboxSettingsManager.java @@ -0,0 +1,18 @@ +package org.briarproject.bramble.api.mailbox; + +import org.briarproject.bramble.api.db.DbException; +import org.briarproject.bramble.api.db.Transaction; +import org.briarproject.bramble.api.nullsafety.NotNullByDefault; + +import javax.annotation.Nullable; + +@NotNullByDefault +public interface MailboxSettingsManager { + + @Nullable + MailboxProperties getOwnMailboxProperties(Transaction txn) + throws DbException; + + void setOwnMailboxProperties(Transaction txn, MailboxProperties p) + throws DbException; +} diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/settings/SettingsManager.java b/bramble-api/src/main/java/org/briarproject/bramble/api/settings/SettingsManager.java index 56ec0c3f0..731664018 100644 --- a/bramble-api/src/main/java/org/briarproject/bramble/api/settings/SettingsManager.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/settings/SettingsManager.java @@ -22,4 +22,11 @@ public interface SettingsManager { * namespace. */ void mergeSettings(Settings s, String namespace) throws DbException; + + /** + * Merges the given settings with any existing settings in the given + * namespace. + */ + void mergeSettings(Transaction txn, Settings s, String namespace) + throws DbException; } diff --git a/bramble-core/src/main/java/org/briarproject/bramble/BrambleCoreModule.java b/bramble-core/src/main/java/org/briarproject/bramble/BrambleCoreModule.java index 51069c526..85ec0372a 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/BrambleCoreModule.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/BrambleCoreModule.java @@ -14,6 +14,7 @@ import org.briarproject.bramble.identity.IdentityModule; import org.briarproject.bramble.io.IoModule; import org.briarproject.bramble.keyagreement.KeyAgreementModule; import org.briarproject.bramble.lifecycle.LifecycleModule; +import org.briarproject.bramble.mailbox.MailboxModule; import org.briarproject.bramble.plugin.PluginModule; import org.briarproject.bramble.properties.PropertiesModule; import org.briarproject.bramble.record.RecordModule; @@ -43,6 +44,7 @@ import dagger.Module; IoModule.class, KeyAgreementModule.class, LifecycleModule.class, + MailboxModule.class, PluginModule.class, PropertiesModule.class, RecordModule.class, diff --git a/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxModule.java b/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxModule.java new file mode 100644 index 000000000..a01b15098 --- /dev/null +++ b/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxModule.java @@ -0,0 +1,16 @@ +package org.briarproject.bramble.mailbox; + +import org.briarproject.bramble.api.mailbox.MailboxSettingsManager; + +import dagger.Module; +import dagger.Provides; + +@Module +public class MailboxModule { + + @Provides + MailboxSettingsManager provideMailboxSettingsManager( + MailboxSettingsManagerImpl mailboxSettingsManager) { + return mailboxSettingsManager; + } +} diff --git a/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxSettingsManagerImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxSettingsManagerImpl.java new file mode 100644 index 000000000..f9b7c953e --- /dev/null +++ b/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxSettingsManagerImpl.java @@ -0,0 +1,50 @@ +package org.briarproject.bramble.mailbox; + +import org.briarproject.bramble.api.db.DbException; +import org.briarproject.bramble.api.db.Transaction; +import org.briarproject.bramble.api.mailbox.MailboxProperties; +import org.briarproject.bramble.api.mailbox.MailboxSettingsManager; +import org.briarproject.bramble.api.nullsafety.NotNullByDefault; +import org.briarproject.bramble.api.settings.Settings; +import org.briarproject.bramble.api.settings.SettingsManager; + +import javax.annotation.concurrent.Immutable; +import javax.inject.Inject; + +import static org.briarproject.bramble.util.StringUtils.isNullOrEmpty; + +@Immutable +@NotNullByDefault +class MailboxSettingsManagerImpl implements MailboxSettingsManager { + + // Package access for testing + static final String SETTINGS_NAMESPACE = "mailbox"; + static final String SETTINGS_KEY_ONION = "onion"; + static final String SETTINGS_KEY_TOKEN = "token"; + + private final SettingsManager settingsManager; + + @Inject + MailboxSettingsManagerImpl(SettingsManager settingsManager) { + this.settingsManager = settingsManager; + } + + @Override + public MailboxProperties getOwnMailboxProperties(Transaction txn) + throws DbException { + Settings s = settingsManager.getSettings(txn, SETTINGS_NAMESPACE); + String onion = s.get(SETTINGS_KEY_ONION); + String token = s.get(SETTINGS_KEY_TOKEN); + if (isNullOrEmpty(onion) || isNullOrEmpty(token)) return null; + return new MailboxProperties(onion, token, true); + } + + @Override + public void setOwnMailboxProperties(Transaction txn, MailboxProperties p) + throws DbException { + Settings s = new Settings(); + s.put(SETTINGS_KEY_ONION, p.getOnionAddress()); + s.put(SETTINGS_KEY_TOKEN, p.getAuthToken()); + settingsManager.mergeSettings(txn, s, SETTINGS_NAMESPACE); + } +} diff --git a/bramble-core/src/main/java/org/briarproject/bramble/settings/SettingsManagerImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/settings/SettingsManagerImpl.java index fa049a070..e4e03989c 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/settings/SettingsManagerImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/settings/SettingsManagerImpl.java @@ -37,4 +37,10 @@ class SettingsManagerImpl implements SettingsManager { public void mergeSettings(Settings s, String namespace) throws DbException { db.transaction(false, txn -> db.mergeSettings(txn, s, namespace)); } + + @Override + public void mergeSettings(Transaction txn, Settings s, String namespace) + throws DbException { + db.mergeSettings(txn, s, namespace); + } } diff --git a/bramble-core/src/test/java/org/briarproject/bramble/mailbox/MailboxSettingsManagerImplTest.java b/bramble-core/src/test/java/org/briarproject/bramble/mailbox/MailboxSettingsManagerImplTest.java new file mode 100644 index 000000000..7380bcc1a --- /dev/null +++ b/bramble-core/src/test/java/org/briarproject/bramble/mailbox/MailboxSettingsManagerImplTest.java @@ -0,0 +1,79 @@ +package org.briarproject.bramble.mailbox; + +import org.briarproject.bramble.api.db.Transaction; +import org.briarproject.bramble.api.mailbox.MailboxProperties; +import org.briarproject.bramble.api.mailbox.MailboxSettingsManager; +import org.briarproject.bramble.api.settings.Settings; +import org.briarproject.bramble.api.settings.SettingsManager; +import org.briarproject.bramble.test.BrambleMockTestCase; +import org.jmock.Expectations; +import org.junit.Test; + +import static org.briarproject.bramble.mailbox.MailboxSettingsManagerImpl.SETTINGS_KEY_ONION; +import static org.briarproject.bramble.mailbox.MailboxSettingsManagerImpl.SETTINGS_KEY_TOKEN; +import static org.briarproject.bramble.mailbox.MailboxSettingsManagerImpl.SETTINGS_NAMESPACE; +import static org.briarproject.bramble.util.StringUtils.getRandomString; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; + +public class MailboxSettingsManagerImplTest extends BrambleMockTestCase { + + private final SettingsManager settingsManager = + context.mock(SettingsManager.class); + + private final MailboxSettingsManager manager = + new MailboxSettingsManagerImpl(settingsManager); + private final String onion = getRandomString(64); + private final String token = getRandomString(64); + + @Test + public void testReturnsNullIfSettingsAreEmpty() throws Exception { + Transaction txn = new Transaction(null, true); + Settings emptySettings = new Settings(); + + context.checking(new Expectations() {{ + oneOf(settingsManager).getSettings(txn, SETTINGS_NAMESPACE); + will(returnValue(emptySettings)); + }}); + + assertNull(manager.getOwnMailboxProperties(txn)); + } + + @Test + public void testReturnsProperties() throws Exception { + Transaction txn = new Transaction(null, true); + Settings settings = new Settings(); + settings.put(SETTINGS_KEY_ONION, onion); + settings.put(SETTINGS_KEY_TOKEN, token); + + context.checking(new Expectations() {{ + oneOf(settingsManager).getSettings(txn, SETTINGS_NAMESPACE); + will(returnValue(settings)); + }}); + + MailboxProperties properties = manager.getOwnMailboxProperties(txn); + assertNotNull(properties); + assertEquals(onion, properties.getOnionAddress()); + assertEquals(token, properties.getAuthToken()); + assertTrue(properties.isOwner()); + } + + @Test + public void testStoresProperties() throws Exception { + Transaction txn = new Transaction(null, false); + Settings expectedSettings = new Settings(); + expectedSettings.put(SETTINGS_KEY_ONION, onion); + expectedSettings.put(SETTINGS_KEY_TOKEN, token); + MailboxProperties properties = + new MailboxProperties(onion, token, true); + + context.checking(new Expectations() {{ + oneOf(settingsManager).mergeSettings(txn, expectedSettings, + SETTINGS_NAMESPACE); + }}); + + manager.setOwnMailboxProperties(txn, properties); + } +}