From cb11b55a9ab9a43e0d4179c638f96e7896b1ca89 Mon Sep 17 00:00:00 2001 From: akwizgran <michael@briarproject.org> Date: Mon, 16 Apr 2018 15:09:16 +0100 Subject: [PATCH] Use client versioning for transport properties. --- .../bramble/properties/PropertiesModule.java | 5 +++ .../TransportPropertyManagerImpl.java | 34 ++++++++++++++++--- .../TransportPropertyManagerImplTest.java | 12 ++++++- 3 files changed, 46 insertions(+), 5 deletions(-) diff --git a/bramble-core/src/main/java/org/briarproject/bramble/properties/PropertiesModule.java b/bramble-core/src/main/java/org/briarproject/bramble/properties/PropertiesModule.java index 93cbf28eb5..1fca633dea 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/properties/PropertiesModule.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/properties/PropertiesModule.java @@ -5,6 +5,7 @@ import org.briarproject.bramble.api.contact.ContactManager; import org.briarproject.bramble.api.data.MetadataEncoder; import org.briarproject.bramble.api.lifecycle.LifecycleManager; import org.briarproject.bramble.api.properties.TransportPropertyManager; +import org.briarproject.bramble.api.sync.ClientVersioningManager; import org.briarproject.bramble.api.sync.ValidationManager; import org.briarproject.bramble.api.system.Clock; @@ -44,11 +45,15 @@ public class PropertiesModule { TransportPropertyManager getTransportPropertyManager( LifecycleManager lifecycleManager, ValidationManager validationManager, ContactManager contactManager, + ClientVersioningManager clientVersioningManager, TransportPropertyManagerImpl transportPropertyManager) { lifecycleManager.registerClient(transportPropertyManager); validationManager.registerIncomingMessageHook(CLIENT_ID, CLIENT_VERSION, transportPropertyManager); contactManager.registerContactHook(transportPropertyManager); + clientVersioningManager.registerClient(CLIENT_ID, CLIENT_VERSION); + clientVersioningManager.registerClientVersioningHook(CLIENT_ID, + CLIENT_VERSION, transportPropertyManager); return transportPropertyManager; } } diff --git a/bramble-core/src/main/java/org/briarproject/bramble/properties/TransportPropertyManagerImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/properties/TransportPropertyManagerImpl.java index f3b62bb220..c9e0662b41 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/properties/TransportPropertyManagerImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/properties/TransportPropertyManagerImpl.java @@ -18,7 +18,10 @@ import org.briarproject.bramble.api.plugin.TransportId; import org.briarproject.bramble.api.properties.TransportProperties; import org.briarproject.bramble.api.properties.TransportPropertyManager; import org.briarproject.bramble.api.sync.Client; +import org.briarproject.bramble.api.sync.ClientVersioningManager; +import org.briarproject.bramble.api.sync.ClientVersioningManager.ClientVersioningHook; import org.briarproject.bramble.api.sync.Group; +import org.briarproject.bramble.api.sync.Group.Visibility; import org.briarproject.bramble.api.sync.GroupId; import org.briarproject.bramble.api.sync.InvalidMessageException; import org.briarproject.bramble.api.sync.Message; @@ -29,20 +32,25 @@ import org.briarproject.bramble.api.system.Clock; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; +import java.util.logging.Logger; import javax.annotation.Nullable; import javax.annotation.concurrent.Immutable; import javax.inject.Inject; -import static org.briarproject.bramble.api.sync.Group.Visibility.SHARED; +import static java.util.logging.Level.INFO; @Immutable @NotNullByDefault class TransportPropertyManagerImpl implements TransportPropertyManager, - Client, ContactHook, IncomingMessageHook { + Client, ContactHook, ClientVersioningHook, IncomingMessageHook { + + private static final Logger LOG = + Logger.getLogger(TransportPropertyManagerImpl.class.getName()); private final DatabaseComponent db; private final ClientHelper clientHelper; + private final ClientVersioningManager clientVersioningManager; private final MetadataParser metadataParser; private final ContactGroupFactory contactGroupFactory; private final Clock clock; @@ -50,10 +58,13 @@ class TransportPropertyManagerImpl implements TransportPropertyManager, @Inject TransportPropertyManagerImpl(DatabaseComponent db, - ClientHelper clientHelper, MetadataParser metadataParser, + ClientHelper clientHelper, + ClientVersioningManager clientVersioningManager, + MetadataParser metadataParser, ContactGroupFactory contactGroupFactory, Clock clock) { this.db = db; this.clientHelper = clientHelper; + this.clientVersioningManager = clientVersioningManager; this.metadataParser = metadataParser; this.contactGroupFactory = contactGroupFactory; this.clock = clock; @@ -75,7 +86,12 @@ class TransportPropertyManagerImpl implements TransportPropertyManager, Group g = getContactGroup(c); // Store the group and share it with the contact db.addGroup(txn, g); - db.setGroupVisibility(txn, c.getId(), g.getId(), SHARED); + // Apply the client's visibility to the contact group + Visibility client = clientVersioningManager.getClientVisibility(txn, + c.getId(), CLIENT_ID, CLIENT_VERSION); + if (LOG.isLoggable(INFO)) + LOG.info("Applying visibility " + client + " to new contact group"); + db.setGroupVisibility(txn, c.getId(), g.getId(), client); // Copy the latest local properties into the group Map<TransportId, TransportProperties> local = getLocalProperties(txn); for (Entry<TransportId, TransportProperties> e : local.entrySet()) { @@ -89,6 +105,16 @@ class TransportPropertyManagerImpl implements TransportPropertyManager, db.removeGroup(txn, getContactGroup(c)); } + @Override + public void onClientVisibilityChanging(Transaction txn, Contact c, + Visibility v) throws DbException { + // Apply the client's visibility to the contact group + Group g = getContactGroup(c); + if (LOG.isLoggable(INFO)) + LOG.info("Applying visibility " + v + " to contact group"); + db.setGroupVisibility(txn, c.getId(), g.getId(), v); + } + @Override public boolean incomingMessage(Transaction txn, Message m, Metadata meta) throws DbException, InvalidMessageException { diff --git a/bramble-core/src/test/java/org/briarproject/bramble/properties/TransportPropertyManagerImplTest.java b/bramble-core/src/test/java/org/briarproject/bramble/properties/TransportPropertyManagerImplTest.java index 6f12898b9d..e0a84d6c6b 100644 --- a/bramble-core/src/test/java/org/briarproject/bramble/properties/TransportPropertyManagerImplTest.java +++ b/bramble-core/src/test/java/org/briarproject/bramble/properties/TransportPropertyManagerImplTest.java @@ -14,6 +14,7 @@ import org.briarproject.bramble.api.db.Transaction; import org.briarproject.bramble.api.identity.LocalAuthor; import org.briarproject.bramble.api.plugin.TransportId; import org.briarproject.bramble.api.properties.TransportProperties; +import org.briarproject.bramble.api.sync.ClientVersioningManager; import org.briarproject.bramble.api.sync.Group; import org.briarproject.bramble.api.sync.GroupId; import org.briarproject.bramble.api.sync.Message; @@ -46,6 +47,8 @@ public class TransportPropertyManagerImplTest extends BrambleMockTestCase { private final DatabaseComponent db = context.mock(DatabaseComponent.class); private final ClientHelper clientHelper = context.mock(ClientHelper.class); + private final ClientVersioningManager clientVersioningManager = + context.mock(ClientVersioningManager.class); private final MetadataParser metadataParser = context.mock(MetadataParser.class); private final ContactGroupFactory contactGroupFactory = @@ -82,7 +85,8 @@ public class TransportPropertyManagerImplTest extends BrambleMockTestCase { will(returnValue(localGroup)); }}); return new TransportPropertyManagerImpl(db, clientHelper, - metadataParser, contactGroupFactory, clock); + clientVersioningManager, metadataParser, contactGroupFactory, + clock); } @Test @@ -101,6 +105,9 @@ public class TransportPropertyManagerImplTest extends BrambleMockTestCase { CLIENT_VERSION, contact); will(returnValue(contactGroup)); oneOf(db).addGroup(txn, contactGroup); + oneOf(clientVersioningManager).getClientVisibility(txn, + contact.getId(), CLIENT_ID, CLIENT_VERSION); + will(returnValue(SHARED)); oneOf(db).setGroupVisibility(txn, contact.getId(), contactGroup.getId(), SHARED); }}); @@ -141,6 +148,9 @@ public class TransportPropertyManagerImplTest extends BrambleMockTestCase { CLIENT_VERSION, contact); will(returnValue(contactGroup)); oneOf(db).addGroup(txn, contactGroup); + oneOf(clientVersioningManager).getClientVisibility(txn, + contact.getId(), CLIENT_ID, CLIENT_VERSION); + will(returnValue(SHARED)); oneOf(db).setGroupVisibility(txn, contact.getId(), contactGroup.getId(), SHARED); }}); -- GitLab