From 3fd6ce231338e139a0336d8a5e605f2723c6ba00 Mon Sep 17 00:00:00 2001 From: akwizgran Date: Mon, 2 Apr 2018 15:25:00 +0100 Subject: [PATCH 01/33] Fix javadoc. --- .../bramble/api/properties/TransportPropertyManager.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/properties/TransportPropertyManager.java b/bramble-api/src/main/java/org/briarproject/bramble/api/properties/TransportPropertyManager.java index fe33328a3..edc73f79e 100644 --- a/bramble-api/src/main/java/org/briarproject/bramble/api/properties/TransportPropertyManager.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/properties/TransportPropertyManager.java @@ -37,8 +37,8 @@ public interface TransportPropertyManager { /** * Returns the local transport properties for all transports. - *
- * TODO: Transaction can be read-only when code is simplified + *

+ * Read-only. */ Map getLocalProperties(Transaction txn) throws DbException; From 196caa7b45db8ab2e32343787c8d5cee561cd325 Mon Sep 17 00:00:00 2001 From: akwizgran Date: Mon, 2 Apr 2018 15:26:09 +0100 Subject: [PATCH 02/33] Update ID of transport properties client. --- .../bramble/api/properties/TransportPropertyManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/properties/TransportPropertyManager.java b/bramble-api/src/main/java/org/briarproject/bramble/api/properties/TransportPropertyManager.java index edc73f79e..ed18409bf 100644 --- a/bramble-api/src/main/java/org/briarproject/bramble/api/properties/TransportPropertyManager.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/properties/TransportPropertyManager.java @@ -15,7 +15,7 @@ public interface TransportPropertyManager { /** * The unique ID of the transport property client. */ - ClientId CLIENT_ID = new ClientId("org.briarproject.briar.properties"); + ClientId CLIENT_ID = new ClientId("org.briarproject.bramble.properties"); /** * The current version of the transport property client. From b7874365a311055cdfd578776c8552cf5f5f7cfc Mon Sep 17 00:00:00 2001 From: akwizgran Date: Thu, 12 Apr 2018 14:22:27 +0100 Subject: [PATCH 03/33] Expose getMessageIds() through DatabaseComponent interface. --- .../briarproject/bramble/api/db/DatabaseComponent.java | 8 ++++++++ .../briarproject/bramble/db/DatabaseComponentImpl.java | 9 +++++++++ 2 files changed, 17 insertions(+) diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/db/DatabaseComponent.java b/bramble-api/src/main/java/org/briarproject/bramble/api/db/DatabaseComponent.java index ea05938d4..8835b7526 100644 --- a/bramble-api/src/main/java/org/briarproject/bramble/api/db/DatabaseComponent.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/db/DatabaseComponent.java @@ -266,6 +266,14 @@ public interface DatabaseComponent { */ Collection getLocalAuthors(Transaction txn) throws DbException; + /** + * Returns the IDs of all messages in the given group. + *

+ * Read-only. + */ + Collection getMessageIds(Transaction txn, GroupId g) + throws DbException; + /** * Returns the IDs of any messages that need to be validated. *

diff --git a/bramble-core/src/main/java/org/briarproject/bramble/db/DatabaseComponentImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/db/DatabaseComponentImpl.java index aaab4b9dd..3661039aa 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/db/DatabaseComponentImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/db/DatabaseComponentImpl.java @@ -466,6 +466,15 @@ class DatabaseComponentImpl implements DatabaseComponent { return db.getLocalAuthors(txn); } + @Override + public Collection getMessageIds(Transaction transaction, + GroupId g) throws DbException { + T txn = unbox(transaction); + if (!db.containsGroup(txn, g)) + throw new NoSuchGroupException(); + return db.getMessageIds(txn, g); + } + @Override public Collection getMessagesToValidate(Transaction transaction) throws DbException { From a38f39207f6a6d8d6454450214f56a2289f9fca4 Mon Sep 17 00:00:00 2001 From: akwizgran Date: Thu, 12 Apr 2018 14:23:03 +0100 Subject: [PATCH 04/33] Initial implementation of client versioning client. --- .../api/sync/ClientVersioningManager.java | 32 + .../bramble/api/sync/SyncConstants.java | 4 +- .../sync/ClientVersioningConstants.java | 10 + .../sync/ClientVersioningManagerImpl.java | 566 ++++++++++++++++++ .../sync/ClientVersioningValidator.java | 59 ++ .../briarproject/bramble/sync/SyncModule.java | 35 ++ .../briar/test/BriarIntegrationTest.java | 19 +- 7 files changed, 719 insertions(+), 6 deletions(-) create mode 100644 bramble-api/src/main/java/org/briarproject/bramble/api/sync/ClientVersioningManager.java create mode 100644 bramble-core/src/main/java/org/briarproject/bramble/sync/ClientVersioningConstants.java create mode 100644 bramble-core/src/main/java/org/briarproject/bramble/sync/ClientVersioningManagerImpl.java create mode 100644 bramble-core/src/main/java/org/briarproject/bramble/sync/ClientVersioningValidator.java diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/sync/ClientVersioningManager.java b/bramble-api/src/main/java/org/briarproject/bramble/api/sync/ClientVersioningManager.java new file mode 100644 index 000000000..a44923373 --- /dev/null +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/sync/ClientVersioningManager.java @@ -0,0 +1,32 @@ +package org.briarproject.bramble.api.sync; + +import org.briarproject.bramble.api.contact.Contact; +import org.briarproject.bramble.api.db.DbException; +import org.briarproject.bramble.api.db.Transaction; +import org.briarproject.bramble.api.nullsafety.NotNullByDefault; +import org.briarproject.bramble.api.sync.Group.Visibility; + +@NotNullByDefault +public interface ClientVersioningManager { + + /** + * The unique ID of the versioning client. + */ + ClientId CLIENT_ID = new ClientId("org.briarproject.bramble.versioning"); + + /** + * The current version of the versioning client. + */ + int CLIENT_VERSION = 0; + + void registerClient(ClientId clientId, int clientVersion); + + void registerClientVersioningHook(ClientId clientId, int clientVersion, + ClientVersioningHook hook); + + interface ClientVersioningHook { + + void onClientVisibilityChanging(Transaction txn, Contact c, + Visibility v) throws DbException; + } +} diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/sync/SyncConstants.java b/bramble-api/src/main/java/org/briarproject/bramble/api/sync/SyncConstants.java index 80f48da66..5f196f147 100644 --- a/bramble-api/src/main/java/org/briarproject/bramble/api/sync/SyncConstants.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/sync/SyncConstants.java @@ -19,7 +19,9 @@ public interface SyncConstants { */ int MAX_RECORD_PAYLOAD_LENGTH = 48 * 1024; // 48 KiB - /** The maximum length of a group descriptor in bytes. */ + /** + * The maximum length of a group descriptor in bytes. + */ int MAX_GROUP_DESCRIPTOR_LENGTH = 16 * 1024; // 16 KiB /** diff --git a/bramble-core/src/main/java/org/briarproject/bramble/sync/ClientVersioningConstants.java b/bramble-core/src/main/java/org/briarproject/bramble/sync/ClientVersioningConstants.java new file mode 100644 index 000000000..4578fa88d --- /dev/null +++ b/bramble-core/src/main/java/org/briarproject/bramble/sync/ClientVersioningConstants.java @@ -0,0 +1,10 @@ +package org.briarproject.bramble.sync; + +interface ClientVersioningConstants { + + // Metadata keys + String MSG_KEY_UPDATE_VERSION = "version"; + String MSG_KEY_LOCAL = "local"; + String GROUP_KEY_CONTACT_ID = "contactId"; +} + diff --git a/bramble-core/src/main/java/org/briarproject/bramble/sync/ClientVersioningManagerImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/sync/ClientVersioningManagerImpl.java new file mode 100644 index 000000000..9cb4d9c63 --- /dev/null +++ b/bramble-core/src/main/java/org/briarproject/bramble/sync/ClientVersioningManagerImpl.java @@ -0,0 +1,566 @@ +package org.briarproject.bramble.sync; + +import org.briarproject.bramble.api.FormatException; +import org.briarproject.bramble.api.client.ClientHelper; +import org.briarproject.bramble.api.client.ContactGroupFactory; +import org.briarproject.bramble.api.contact.Contact; +import org.briarproject.bramble.api.contact.ContactId; +import org.briarproject.bramble.api.contact.ContactManager.ContactHook; +import org.briarproject.bramble.api.data.BdfDictionary; +import org.briarproject.bramble.api.data.BdfList; +import org.briarproject.bramble.api.db.DatabaseComponent; +import org.briarproject.bramble.api.db.DbException; +import org.briarproject.bramble.api.db.Metadata; +import org.briarproject.bramble.api.db.Transaction; +import org.briarproject.bramble.api.lifecycle.Service; +import org.briarproject.bramble.api.lifecycle.ServiceException; +import org.briarproject.bramble.api.nullsafety.NotNullByDefault; +import org.briarproject.bramble.api.sync.Client; +import org.briarproject.bramble.api.sync.ClientId; +import org.briarproject.bramble.api.sync.ClientVersioningManager; +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; +import org.briarproject.bramble.api.sync.MessageId; +import org.briarproject.bramble.api.sync.ValidationManager.IncomingMessageHook; +import org.briarproject.bramble.api.system.Clock; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; +import java.util.TreeSet; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.CopyOnWriteArrayList; + +import javax.annotation.Nullable; +import javax.inject.Inject; + +import static java.util.Collections.emptyList; +import static org.briarproject.bramble.api.sync.Group.Visibility.INVISIBLE; +import static org.briarproject.bramble.api.sync.Group.Visibility.SHARED; +import static org.briarproject.bramble.api.sync.Group.Visibility.VISIBLE; +import static org.briarproject.bramble.sync.ClientVersioningConstants.GROUP_KEY_CONTACT_ID; +import static org.briarproject.bramble.sync.ClientVersioningConstants.MSG_KEY_LOCAL; +import static org.briarproject.bramble.sync.ClientVersioningConstants.MSG_KEY_UPDATE_VERSION; + +@NotNullByDefault +class ClientVersioningManagerImpl implements ClientVersioningManager, Client, + Service, ContactHook, IncomingMessageHook { + + private final DatabaseComponent db; + private final ClientHelper clientHelper; + private final ContactGroupFactory contactGroupFactory; + private final Clock clock; + private final Group localGroup; + + private final Collection clients = + new CopyOnWriteArrayList<>(); + private final Map hooks = + new ConcurrentHashMap<>(); + + @Inject + ClientVersioningManagerImpl(DatabaseComponent db, + ClientHelper clientHelper, ContactGroupFactory contactGroupFactory, + Clock clock) { + this.db = db; + this.clientHelper = clientHelper; + this.contactGroupFactory = contactGroupFactory; + this.clock = clock; + localGroup = contactGroupFactory.createLocalGroup(CLIENT_ID, + CLIENT_VERSION); + } + + @Override + public void registerClient(ClientId clientId, int clientVersion) { + clients.add(new ClientVersion(clientId, clientVersion)); + } + + @Override + public void registerClientVersioningHook(ClientId clientId, + int clientVersion, ClientVersioningHook hook) { + hooks.put(new ClientVersion(clientId, clientVersion), hook); + } + + @Override + public void createLocalState(Transaction txn) throws DbException { + if (db.containsGroup(txn, localGroup.getId())) return; + db.addGroup(txn, localGroup); + // Set things up for any pre-existing contacts + for (Contact c : db.getContacts(txn)) addingContact(txn, c); + } + + @Override + public void startService() throws ServiceException { + List versions = new ArrayList<>(clients); + Collections.sort(versions); + try { + Transaction txn = db.startTransaction(false); + try { + if (updateClientVersions(txn, versions)) { + for (Contact c : db.getContacts(txn)) + clientVersionsUpdated(txn, c, versions); + } + db.commitTransaction(txn); + } finally { + db.endTransaction(txn); + } + } catch (DbException e) { + throw new ServiceException(e); + } + } + + @Override + public void stopService() throws ServiceException { + } + + @Override + public void addingContact(Transaction txn, Contact c) throws DbException { + // Create a group and share it with the contact + Group g = getContactGroup(c); + db.addGroup(txn, g); + db.setGroupVisibility(txn, c.getId(), g.getId(), SHARED); + // Attach the contact ID to the group + BdfDictionary meta = new BdfDictionary(); + meta.put(GROUP_KEY_CONTACT_ID, c.getId().getInt()); + try { + clientHelper.mergeGroupMetadata(txn, g.getId(), meta); + } catch (FormatException e) { + throw new AssertionError(e); + } + // Create and store the first local update + List versions = new ArrayList<>(clients); + Collections.sort(versions); + storeFirstUpdate(txn, g.getId(), versions); + } + + @Override + public void removingContact(Transaction txn, Contact c) throws DbException { + db.removeGroup(txn, getContactGroup(c)); + } + + @Override + public boolean incomingMessage(Transaction txn, Message m, Metadata meta) + throws DbException, InvalidMessageException { + try { + // Parse the new remote update + Update newRemoteUpdate = parseUpdate(clientHelper.toList(m)); + List newRemoteStates = newRemoteUpdate.states; + long newRemoteUpdateVersion = newRemoteUpdate.updateVersion; + // Find the latest local and remote updates, if any + LatestUpdates latest = findLatestUpdates(txn, m.getGroupId()); + // If this update is obsolete, delete it and return + if (latest.remote != null + && latest.remote.updateVersion > newRemoteUpdateVersion) { + db.deleteMessage(txn, m.getId()); + db.deleteMessageMetadata(txn, m.getId()); + return false; + } + // Load and parse the latest local update + if (latest.local == null) throw new DbException(); + Update oldLocalUpdate = loadUpdate(txn, latest.local.messageId); + List oldLocalStates = oldLocalUpdate.states; + long oldLocalUpdateVersion = oldLocalUpdate.updateVersion; + // Load and parse the previous remote update, if any + List oldRemoteStates; + if (latest.remote == null) { + oldRemoteStates = emptyList(); + } else { + oldRemoteStates = + loadUpdate(txn, latest.remote.messageId).states; + // Delete the previous remote update + db.deleteMessage(txn, latest.remote.messageId); + db.deleteMessageMetadata(txn, latest.remote.messageId); + } + // Update the local states from the remote states if necessary + List newLocalStates = updateStatesFromRemoteStates( + oldLocalStates, newRemoteStates); + if (!oldLocalStates.equals(newLocalStates)) { + // Delete the latest local update + db.deleteMessage(txn, latest.local.messageId); + db.deleteMessageMetadata(txn, latest.local.messageId); + // Store a new local update + storeUpdate(txn, m.getGroupId(), newLocalStates, + oldLocalUpdateVersion + 1); + } + // Calculate the old and new client visibilities + Map before = + getVisibilities(oldLocalStates, oldRemoteStates); + Map after = + getVisibilities(newLocalStates, newRemoteStates); + // Call hooks for any visibilities that have changed + Contact c = getContact(txn, m.getGroupId()); + callVisibilityHooks(txn, c, before, after); + } catch (FormatException e) { + throw new InvalidMessageException(e); + } + return false; + } + + private void storeClientVersions(Transaction txn, + List versions) throws DbException { + long now = clock.currentTimeMillis(); + BdfList body = encodeClientVersions(versions); + try { + Message m = clientHelper.createMessage(localGroup.getId(), now, + body); + db.addLocalMessage(txn, m, new Metadata(), false); + } catch (FormatException e) { + throw new AssertionError(e); + } + } + + private BdfList encodeClientVersions(List versions) { + BdfList encoded = new BdfList(); + for (ClientVersion cv : versions) + encoded.add(BdfList.of(cv.clientId.getString(), cv.clientVersion)); + return encoded; + } + + private boolean updateClientVersions(Transaction txn, + List newVersions) throws DbException { + Collection ids = db.getMessageIds(txn, localGroup.getId()); + if (ids.isEmpty()) { + storeClientVersions(txn, newVersions); + return true; + } + MessageId m = ids.iterator().next(); + List oldVersions = loadClientVersions(txn, m); + if (oldVersions.equals(newVersions)) return false; + db.removeMessage(txn, m); + storeClientVersions(txn, newVersions); + return true; + } + + private List loadClientVersions(Transaction txn, MessageId m) + throws DbException { + try { + BdfList body = clientHelper.getMessageAsList(txn, m); + if (body == null) throw new DbException(); + return parseClientVersions(body); + } catch (FormatException e) { + throw new DbException(e); + } + } + + private List parseClientVersions(BdfList body) + throws FormatException { + int size = body.size(); + List parsed = new ArrayList<>(size); + for (int i = 0; i < size; i++) { + BdfList cv = body.getList(i); + ClientId clientId = new ClientId(cv.getString(0)); + int clientVersion = cv.getLong(1).intValue(); + parsed.add(new ClientVersion(clientId, clientVersion)); + } + return parsed; + } + + private void clientVersionsUpdated(Transaction txn, Contact c, + List versions) throws DbException { + try { + // Find the latest local and remote updates + Group g = getContactGroup(c); + LatestUpdates latest = findLatestUpdates(txn, g.getId()); + // Load and parse the latest local update + if (latest.local == null) throw new DbException(); + Update oldLocalUpdate = loadUpdate(txn, latest.local.messageId); + List oldLocalStates = oldLocalUpdate.states; + long oldLocalUpdateVersion = oldLocalUpdate.updateVersion; + // Delete the latest local update + db.deleteMessage(txn, latest.local.messageId); + db.deleteMessageMetadata(txn, latest.local.messageId); + // Store a new local update + List newLocalStates = + updateStatesFromLocalVersions(oldLocalStates, versions); + storeUpdate(txn, g.getId(), newLocalStates, + oldLocalUpdateVersion + 1); + // Load and parse the latest remote update, if any + List remoteStates; + if (latest.remote == null) remoteStates = emptyList(); + else remoteStates = loadUpdate(txn, latest.remote.messageId).states; + // Calculate the old and new client visibilities + Map before = + getVisibilities(oldLocalStates, remoteStates); + Map after = + getVisibilities(newLocalStates, remoteStates); + // Call hooks for any visibilities that have changed + callVisibilityHooks(txn, c, before, after); + } catch (FormatException e) { + throw new DbException(e); + } + } + + private Group getContactGroup(Contact c) { + return contactGroupFactory.createContactGroup(CLIENT_ID, + CLIENT_VERSION, c); + } + + private LatestUpdates findLatestUpdates(Transaction txn, GroupId g) + throws DbException, FormatException { + Map metadata = + clientHelper.getMessageMetadataAsDictionary(txn, g); + LatestUpdate local = null, remote = null; + for (Entry e : metadata.entrySet()) { + BdfDictionary meta = e.getValue(); + long updateVersion = meta.getLong(MSG_KEY_UPDATE_VERSION); + if (meta.getBoolean(MSG_KEY_LOCAL)) + local = new LatestUpdate(e.getKey(), updateVersion); + else remote = new LatestUpdate(e.getKey(), updateVersion); + } + return new LatestUpdates(local, remote); + } + + private Update loadUpdate(Transaction txn, MessageId m) throws DbException { + try { + BdfList body = clientHelper.getMessageAsList(txn, m); + if (body == null) throw new DbException(); + return parseUpdate(body); + } catch (FormatException e) { + throw new DbException(e); + } + } + + private Update parseUpdate(BdfList body) throws FormatException { + List states = parseClientStates(body); + long updateVersion = parseUpdateVersion(body); + return new Update(states, updateVersion); + } + + private List parseClientStates(BdfList body) + throws FormatException { + // Client states, update version + BdfList states = body.getList(0); + int size = states.size(); + List parsed = new ArrayList<>(size); + for (int i = 0; i < size; i++) + parsed.add(parseClientState(states.getList(i))); + return parsed; + } + + private ClientState parseClientState(BdfList clientState) + throws FormatException { + // Client ID, client version, active + ClientId clientId = new ClientId(clientState.getString(0)); + int clientVersion = clientState.getLong(1).intValue(); + boolean active = clientState.getBoolean(2); + return new ClientState(clientId, clientVersion, active); + } + + private long parseUpdateVersion(BdfList body) throws FormatException { + // Client states, update version + return body.getLong(1); + } + + private List updateStatesFromLocalVersions( + List oldStates, List newVersions) { + Map oldMap = new HashMap<>(); + for (ClientState cs : oldStates) oldMap.put(cs.version, cs); + List newStates = new ArrayList<>(newVersions.size()); + for (ClientVersion newVersion : newVersions) { + ClientState oldState = oldMap.get(newVersion); + boolean active = oldState != null && oldState.active; + newStates.add(new ClientState(newVersion, active)); + } + return newStates; + } + + private void storeUpdate(Transaction txn, GroupId g, + List states, long updateVersion) throws DbException { + try { + BdfList body = encodeUpdate(states, updateVersion); + long now = clock.currentTimeMillis(); + Message m = clientHelper.createMessage(g, now, body); + BdfDictionary meta = new BdfDictionary(); + meta.put(MSG_KEY_UPDATE_VERSION, updateVersion); + meta.put(MSG_KEY_LOCAL, true); + clientHelper.addLocalMessage(txn, m, meta, true); + } catch (FormatException e) { + throw new RuntimeException(e); + } + } + + private BdfList encodeUpdate(List states, long updateVersion) { + BdfList encoded = new BdfList(); + for (ClientState cs : states) encoded.add(encodeClientState(cs)); + return BdfList.of(encoded, updateVersion); + } + + private BdfList encodeClientState(ClientState cs) { + return BdfList.of(cs.version.clientId.getString(), + cs.version.clientVersion, cs.active); + } + + private Map getVisibilities( + List localStates, List remoteStates) { + Map remoteMap = new HashMap<>(); + for (ClientState remote : remoteStates) + remoteMap.put(remote.version, remote); + Map visibilities = new HashMap<>(); + for (ClientState local : localStates) { + ClientState remote = remoteMap.get(local.version); + if (remote == null) visibilities.put(local.version, INVISIBLE); + else if (remote.active) visibilities.put(local.version, SHARED); + else visibilities.put(local.version, VISIBLE); + } + return visibilities; + } + + private void callVisibilityHooks(Transaction txn, Contact c, + Map before, + Map after) throws DbException { + Set keys = new TreeSet<>(); + keys.addAll(before.keySet()); + keys.addAll(after.keySet()); + for (ClientVersion cv : keys) { + Visibility vBefore = before.get(cv), vAfter = after.get(cv); + if (vAfter == null) { + callVisibilityHook(txn, cv, c, INVISIBLE); + } else if (vBefore == null || !vBefore.equals(vAfter)) { + callVisibilityHook(txn, cv, c, vAfter); + } + } + } + + private void callVisibilityHook(Transaction txn, ClientVersion cv, + Contact c, Visibility v) throws DbException { + ClientVersioningHook hook = hooks.get(cv); + if (hook != null) hook.onClientVisibilityChanging(txn, c, v); + } + + private void storeFirstUpdate(Transaction txn, GroupId g, + List versions) throws DbException { + List states = new ArrayList<>(versions.size()); + for (ClientVersion cv : versions) + states.add(new ClientState(cv, false)); + storeUpdate(txn, g, states, 1); + } + + private Contact getContact(Transaction txn, GroupId g) throws DbException { + try { + BdfDictionary meta = + clientHelper.getGroupMetadataAsDictionary(txn, g); + int id = meta.getLong(GROUP_KEY_CONTACT_ID).intValue(); + return db.getContact(txn, new ContactId(id)); + } catch (FormatException e) { + throw new DbException(e); + } + } + + private List updateStatesFromRemoteStates( + List oldLocalStates, List remoteStates) { + Set remoteSet = new HashSet<>(); + for (ClientState remote : remoteStates) remoteSet.add(remote.version); + List newLocalStates = + new ArrayList<>(oldLocalStates.size()); + for (ClientState oldState : oldLocalStates) { + boolean active = remoteSet.contains(oldState.version); + newLocalStates.add(new ClientState(oldState.version, active)); + } + return newLocalStates; + } + + private static class Update { + + private final List states; + private final long updateVersion; + + private Update(List states, long updateVersion) { + this.states = states; + this.updateVersion = updateVersion; + } + } + + private static class LatestUpdate { + + private final MessageId messageId; + private final long updateVersion; + + private LatestUpdate(MessageId messageId, long updateVersion) { + this.messageId = messageId; + this.updateVersion = updateVersion; + } + } + + private static class LatestUpdates { + + @Nullable + private final LatestUpdate local, remote; + + private LatestUpdates(@Nullable LatestUpdate local, + @Nullable LatestUpdate remote) { + this.local = local; + this.remote = remote; + } + } + + private static class ClientVersion implements Comparable { + + private final ClientId clientId; + private final int clientVersion; + + private ClientVersion(ClientId clientId, int clientVersion) { + this.clientId = clientId; + this.clientVersion = clientVersion; + } + + @Override + public boolean equals(Object o) { + if (o instanceof ClientVersion) { + ClientVersion cv = (ClientVersion) o; + return clientId.equals(cv.clientId) + && clientVersion == cv.clientVersion; + } + return false; + } + + @Override + public int hashCode() { + return (clientId.hashCode() << 16) + clientVersion; + } + + @Override + public int compareTo(ClientVersion c) { + int compare = clientId.compareTo(c.clientId); + if (compare != 0) return compare; + return clientVersion - c.clientVersion; + } + } + + private static class ClientState { + + private final ClientVersion version; + private final boolean active; + + private ClientState(ClientVersion version, boolean active) { + this.version = version; + this.active = active; + } + + private ClientState(ClientId clientId, int clientVersion, + boolean active) { + this(new ClientVersion(clientId, clientVersion), active); + } + + @Override + public boolean equals(Object o) { + if (o instanceof ClientState) { + ClientState cs = (ClientState) o; + return version.equals(cs.version) && active == cs.active; + } + return false; + } + + @Override + public int hashCode() { + return version.hashCode(); + } + } +} diff --git a/bramble-core/src/main/java/org/briarproject/bramble/sync/ClientVersioningValidator.java b/bramble-core/src/main/java/org/briarproject/bramble/sync/ClientVersioningValidator.java new file mode 100644 index 000000000..2795523a1 --- /dev/null +++ b/bramble-core/src/main/java/org/briarproject/bramble/sync/ClientVersioningValidator.java @@ -0,0 +1,59 @@ +package org.briarproject.bramble.sync; + +import org.briarproject.bramble.api.FormatException; +import org.briarproject.bramble.api.client.BdfMessageContext; +import org.briarproject.bramble.api.client.BdfMessageValidator; +import org.briarproject.bramble.api.client.ClientHelper; +import org.briarproject.bramble.api.data.BdfDictionary; +import org.briarproject.bramble.api.data.BdfList; +import org.briarproject.bramble.api.data.MetadataEncoder; +import org.briarproject.bramble.api.nullsafety.NotNullByDefault; +import org.briarproject.bramble.api.sync.Group; +import org.briarproject.bramble.api.sync.Message; +import org.briarproject.bramble.api.system.Clock; + +import javax.annotation.concurrent.Immutable; + +import static org.briarproject.bramble.api.sync.ClientId.MAX_CLIENT_ID_LENGTH; +import static org.briarproject.bramble.sync.ClientVersioningConstants.MSG_KEY_LOCAL; +import static org.briarproject.bramble.sync.ClientVersioningConstants.MSG_KEY_UPDATE_VERSION; +import static org.briarproject.bramble.util.ValidationUtils.checkLength; +import static org.briarproject.bramble.util.ValidationUtils.checkSize; + +@Immutable +@NotNullByDefault +class ClientVersioningValidator extends BdfMessageValidator { + + ClientVersioningValidator(ClientHelper clientHelper, + MetadataEncoder metadataEncoder, Clock clock) { + super(clientHelper, metadataEncoder, clock); + } + + @Override + protected BdfMessageContext validateMessage(Message m, Group g, + BdfList body) throws FormatException { + // Client states, update version + checkSize(body, 2); + // Client states + BdfList states = body.getList(0); + int size = states.size(); + for (int i = 0; i < size; i++) { + BdfList clientState = states.getList(i); + // Client ID, client version, active + checkSize(clientState, 3); + String clientId = clientState.getString(0); + checkLength(clientId, 1, MAX_CLIENT_ID_LENGTH); + int clientVersion = clientState.getLong(1).intValue(); + if (clientVersion < 0) throw new FormatException(); + boolean active = clientState.getBoolean(2); + } + // Update version + long updateVersion = body.getLong(1); + if (updateVersion < 0) throw new FormatException(); + // Return the metadata + BdfDictionary meta = new BdfDictionary(); + meta.put(MSG_KEY_UPDATE_VERSION, updateVersion); + meta.put(MSG_KEY_LOCAL, false); + return new BdfMessageContext(meta); + } +} diff --git a/bramble-core/src/main/java/org/briarproject/bramble/sync/SyncModule.java b/bramble-core/src/main/java/org/briarproject/bramble/sync/SyncModule.java index ca6ec897a..0acf9e4e8 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/sync/SyncModule.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/sync/SyncModule.java @@ -1,12 +1,16 @@ package org.briarproject.bramble.sync; import org.briarproject.bramble.PoliteExecutor; +import org.briarproject.bramble.api.client.ClientHelper; +import org.briarproject.bramble.api.contact.ContactManager; import org.briarproject.bramble.api.crypto.CryptoComponent; import org.briarproject.bramble.api.crypto.CryptoExecutor; +import org.briarproject.bramble.api.data.MetadataEncoder; import org.briarproject.bramble.api.db.DatabaseComponent; import org.briarproject.bramble.api.db.DatabaseExecutor; import org.briarproject.bramble.api.event.EventBus; import org.briarproject.bramble.api.lifecycle.LifecycleManager; +import org.briarproject.bramble.api.sync.ClientVersioningManager; import org.briarproject.bramble.api.sync.GroupFactory; import org.briarproject.bramble.api.sync.MessageFactory; import org.briarproject.bramble.api.sync.RecordReaderFactory; @@ -23,12 +27,18 @@ import javax.inject.Singleton; import dagger.Module; import dagger.Provides; +import static org.briarproject.bramble.api.sync.ClientVersioningManager.CLIENT_ID; + @Module public class SyncModule { public static class EagerSingletons { @Inject ValidationManager validationManager; + @Inject + ClientVersioningManager clientVersioningManager; + @Inject + ClientVersioningValidator clientVersioningValidator; } /** @@ -90,4 +100,29 @@ public class SyncModule { return new PoliteExecutor("ValidationExecutor", cryptoExecutor, MAX_CONCURRENT_VALIDATION_TASKS); } + + @Provides + @Singleton + ClientVersioningManager provideClientVersioningManager( + ClientVersioningManagerImpl clientVersioningManager, + LifecycleManager lifecycleManager, ContactManager contactManager, + ValidationManager validationManager) { + lifecycleManager.registerClient(clientVersioningManager); + lifecycleManager.registerService(clientVersioningManager); + contactManager.registerContactHook(clientVersioningManager); + validationManager.registerIncomingMessageHook(CLIENT_ID, + clientVersioningManager); + return clientVersioningManager; + } + + @Provides + @Singleton + ClientVersioningValidator provideClientVersioningValidator( + ClientHelper clientHelper, MetadataEncoder metadataEncoder, + Clock clock, ValidationManager validationManager) { + ClientVersioningValidator validator = new ClientVersioningValidator( + clientHelper, metadataEncoder, clock); + validationManager.registerMessageValidator(CLIENT_ID, validator); + return validator; + } } diff --git a/briar-core/src/test/java/org/briarproject/briar/test/BriarIntegrationTest.java b/briar-core/src/test/java/org/briarproject/briar/test/BriarIntegrationTest.java index 3c2138b61..ebd3f2238 100644 --- a/briar-core/src/test/java/org/briarproject/briar/test/BriarIntegrationTest.java +++ b/briar-core/src/test/java/org/briarproject/briar/test/BriarIntegrationTest.java @@ -159,10 +159,9 @@ public abstract class BriarIntegrationTest Date: Fri, 13 Apr 2018 13:10:02 +0100 Subject: [PATCH 05/33] Add client version to groups table. --- .../bramble/api/db/DatabaseComponent.java | 3 +- .../briarproject/bramble/api/sync/Group.java | 12 ++++++- .../briarproject/bramble/test/TestUtils.java | 9 ++--- .../org/briarproject/bramble/db/Database.java | 3 +- .../bramble/db/DatabaseComponentImpl.java | 6 ++-- .../briarproject/bramble/db/JdbcDatabase.java | 35 +++++++++++-------- .../bramble/sync/GroupFactoryImpl.java | 2 +- .../bramble/db/DatabaseComponentImplTest.java | 8 +++-- .../bramble/db/DatabasePerformanceTest.java | 6 ++-- .../bramble/db/JdbcDatabaseTest.java | 22 ++++++++++-- .../TransportPropertyManagerImplTest.java | 20 +++++------ .../TransportPropertyValidatorTest.java | 5 +-- .../sync/ValidationManagerImplTest.java | 2 +- .../briar/blog/BlogManagerImpl.java | 2 +- .../briar/forum/ForumManagerImpl.java | 2 +- .../privategroup/PrivateGroupManagerImpl.java | 2 +- .../GroupInvitationManagerImpl.java | 3 +- .../briar/blog/BlogManagerImplTest.java | 5 ++- .../briar/blog/BlogPostValidatorTest.java | 2 +- .../briar/feed/FeedManagerImplTest.java | 5 +-- .../AbstractProtocolEngineTest.java | 4 ++- .../GroupInvitationManagerImplTest.java | 13 +++---- .../sharing/BlogSharingManagerImplTest.java | 12 ++++--- 23 files changed, 116 insertions(+), 67 deletions(-) diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/db/DatabaseComponent.java b/bramble-api/src/main/java/org/briarproject/bramble/api/db/DatabaseComponent.java index 8835b7526..5e50efdc2 100644 --- a/bramble-api/src/main/java/org/briarproject/bramble/api/db/DatabaseComponent.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/db/DatabaseComponent.java @@ -241,7 +241,8 @@ public interface DatabaseComponent { *

* Read-only. */ - Collection getGroups(Transaction txn, ClientId c) throws DbException; + Collection getGroups(Transaction txn, ClientId c, int clientVersion) + throws DbException; /** * Returns the given group's visibility to the given contact, or diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/sync/Group.java b/bramble-api/src/main/java/org/briarproject/bramble/api/sync/Group.java index 5ffe422c2..40d2da6ff 100644 --- a/bramble-api/src/main/java/org/briarproject/bramble/api/sync/Group.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/sync/Group.java @@ -17,13 +17,16 @@ public class Group { private final GroupId id; private final ClientId clientId; + private final int clientVersion; private final byte[] descriptor; - public Group(GroupId id, ClientId clientId, byte[] descriptor) { + public Group(GroupId id, ClientId clientId, int clientVersion, + byte[] descriptor) { if (descriptor.length > MAX_GROUP_DESCRIPTOR_LENGTH) throw new IllegalArgumentException(); this.id = id; this.clientId = clientId; + this.clientVersion = clientVersion; this.descriptor = descriptor; } @@ -41,6 +44,13 @@ public class Group { return clientId; } + /** + * Returns the version of the client to which the group belongs. + */ + public int getClientVersion() { + return clientVersion; + } + /** * Returns the group's descriptor. */ diff --git a/bramble-api/src/test/java/org/briarproject/bramble/test/TestUtils.java b/bramble-api/src/test/java/org/briarproject/bramble/test/TestUtils.java index 3ce8d1549..0bff1a547 100644 --- a/bramble-api/src/test/java/org/briarproject/bramble/test/TestUtils.java +++ b/bramble-api/src/test/java/org/briarproject/bramble/test/TestUtils.java @@ -117,15 +117,16 @@ public class TestUtils { return new Author(id, FORMAT_VERSION, name, publicKey); } - public static Group getGroup(ClientId clientId) { + public static Group getGroup(ClientId clientId, int clientVersion) { int descriptorLength = 1 + random.nextInt(MAX_GROUP_DESCRIPTOR_LENGTH); - return getGroup(clientId, descriptorLength); + return getGroup(clientId, clientVersion, descriptorLength); } - public static Group getGroup(ClientId clientId, int descriptorLength) { + public static Group getGroup(ClientId clientId, int clientVersion, + int descriptorLength) { GroupId groupId = new GroupId(getRandomId()); byte[] descriptor = getRandomBytes(descriptorLength); - return new Group(groupId, clientId, descriptor); + return new Group(groupId, clientId, clientVersion, descriptor); } public static Message getMessage(GroupId groupId) { diff --git a/bramble-core/src/main/java/org/briarproject/bramble/db/Database.java b/bramble-core/src/main/java/org/briarproject/bramble/db/Database.java index 0c3b2b1bc..7a132510f 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/db/Database.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/db/Database.java @@ -266,7 +266,8 @@ interface Database { *

* Read-only. */ - Collection getGroups(T txn, ClientId c) throws DbException; + Collection getGroups(T txn, ClientId c, int clientVersion) + throws DbException; /** * Returns the given group's visibility to the given contact, or diff --git a/bramble-core/src/main/java/org/briarproject/bramble/db/DatabaseComponentImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/db/DatabaseComponentImpl.java index 3661039aa..b24567bf3 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/db/DatabaseComponentImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/db/DatabaseComponentImpl.java @@ -435,10 +435,10 @@ class DatabaseComponentImpl implements DatabaseComponent { } @Override - public Collection getGroups(Transaction transaction, ClientId c) - throws DbException { + public Collection getGroups(Transaction transaction, ClientId c, + int clientVersion) throws DbException { T txn = unbox(transaction); - return db.getGroups(txn, c); + return db.getGroups(txn, c, clientVersion); } @Override diff --git a/bramble-core/src/main/java/org/briarproject/bramble/db/JdbcDatabase.java b/bramble-core/src/main/java/org/briarproject/bramble/db/JdbcDatabase.java index dd0e928a8..3bffa8529 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/db/JdbcDatabase.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/db/JdbcDatabase.java @@ -117,6 +117,7 @@ abstract class JdbcDatabase implements Database { "CREATE TABLE groups" + " (groupId _HASH NOT NULL," + " clientId _STRING NOT NULL," + + " clientVersion INT NOT NULL," + " descriptor _BINARY NOT NULL," + " PRIMARY KEY (groupId))"; @@ -275,9 +276,9 @@ abstract class JdbcDatabase implements Database { "CREATE INDEX IF NOT EXISTS contactsByAuthorId" + " ON contacts (authorId)"; - private static final String INDEX_GROUPS_BY_CLIENT_ID = - "CREATE INDEX IF NOT EXISTS groupsByClientId" - + " ON groups (clientId)"; + private static final String INDEX_GROUPS_BY_CLIENT_ID_CLIENT_VERSION = + "CREATE INDEX IF NOT EXISTS groupsByClientIdClientVersion" + + " ON groups (clientId, clientVersion)"; private static final String INDEX_MESSAGE_METADATA_BY_GROUP_ID_STATE = "CREATE INDEX IF NOT EXISTS messageMetadataByGroupIdState" @@ -444,7 +445,7 @@ abstract class JdbcDatabase implements Database { try { s = txn.createStatement(); s.executeUpdate(INDEX_CONTACTS_BY_AUTHOR_ID); - s.executeUpdate(INDEX_GROUPS_BY_CLIENT_ID); + s.executeUpdate(INDEX_GROUPS_BY_CLIENT_ID_CLIENT_VERSION); s.executeUpdate(INDEX_MESSAGE_METADATA_BY_GROUP_ID_STATE); s.executeUpdate(INDEX_MESSAGE_DEPENDENCIES_BY_DEPENDENCY_ID); s.executeUpdate(INDEX_STATUSES_BY_CONTACT_ID_GROUP_ID); @@ -612,12 +613,14 @@ abstract class JdbcDatabase implements Database { public void addGroup(Connection txn, Group g) throws DbException { PreparedStatement ps = null; try { - String sql = "INSERT INTO groups (groupId, clientId, descriptor)" - + " VALUES (?, ?, ?)"; + String sql = "INSERT INTO groups" + + " (groupId, clientId, clientVersion, descriptor)" + + " VALUES (?, ?, ?, ?)"; ps = txn.prepareStatement(sql); ps.setBytes(1, g.getId().getBytes()); ps.setString(2, g.getClientId().getString()); - ps.setBytes(3, g.getDescriptor()); + ps.setInt(3, g.getClientVersion()); + ps.setBytes(4, g.getDescriptor()); int affected = ps.executeUpdate(); if (affected != 1) throw new DbStateException(); ps.close(); @@ -1346,17 +1349,18 @@ abstract class JdbcDatabase implements Database { PreparedStatement ps = null; ResultSet rs = null; try { - String sql = "SELECT clientId, descriptor FROM groups" - + " WHERE groupId = ?"; + String sql = "SELECT clientId, clientVersion, descriptor" + + " FROM groups WHERE groupId = ?"; ps = txn.prepareStatement(sql); ps.setBytes(1, g.getBytes()); rs = ps.executeQuery(); if (!rs.next()) throw new DbStateException(); ClientId clientId = new ClientId(rs.getString(1)); - byte[] descriptor = rs.getBytes(2); + int clientVersion = rs.getInt(2); + byte[] descriptor = rs.getBytes(3); rs.close(); ps.close(); - return new Group(g, clientId, descriptor); + return new Group(g, clientId, clientVersion, descriptor); } catch (SQLException e) { tryToClose(rs); tryToClose(ps); @@ -1365,21 +1369,22 @@ abstract class JdbcDatabase implements Database { } @Override - public Collection getGroups(Connection txn, ClientId c) - throws DbException { + public Collection getGroups(Connection txn, ClientId c, + int clientVersion) throws DbException { PreparedStatement ps = null; ResultSet rs = null; try { String sql = "SELECT groupId, descriptor FROM groups" - + " WHERE clientId = ?"; + + " WHERE clientId = ? AND clientVersion = ?"; ps = txn.prepareStatement(sql); ps.setString(1, c.getString()); + ps.setInt(2, clientVersion); rs = ps.executeQuery(); List groups = new ArrayList<>(); while (rs.next()) { GroupId id = new GroupId(rs.getBytes(1)); byte[] descriptor = rs.getBytes(2); - groups.add(new Group(id, c, descriptor)); + groups.add(new Group(id, c, clientVersion, descriptor)); } rs.close(); ps.close(); diff --git a/bramble-core/src/main/java/org/briarproject/bramble/sync/GroupFactoryImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/sync/GroupFactoryImpl.java index e7bc4e16e..6f12e6ff8 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/sync/GroupFactoryImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/sync/GroupFactoryImpl.java @@ -34,6 +34,6 @@ class GroupFactoryImpl implements GroupFactory { byte[] hash = crypto.hash(LABEL, new byte[] {FORMAT_VERSION}, StringUtils.toUtf8(c.getString()), clientVersionBytes, descriptor); - return new Group(new GroupId(hash), c, descriptor); + return new Group(new GroupId(hash), c, clientVersion, descriptor); } } diff --git a/bramble-core/src/test/java/org/briarproject/bramble/db/DatabaseComponentImplTest.java b/bramble-core/src/test/java/org/briarproject/bramble/db/DatabaseComponentImplTest.java index ae3e20340..5d08264f7 100644 --- a/bramble-core/src/test/java/org/briarproject/bramble/db/DatabaseComponentImplTest.java +++ b/bramble-core/src/test/java/org/briarproject/bramble/db/DatabaseComponentImplTest.java @@ -89,6 +89,7 @@ public class DatabaseComponentImplTest extends BrambleMockTestCase { private final Object txn = new Object(); private final ClientId clientId; + private final int clientVersion; private final GroupId groupId; private final Group group; private final Author author; @@ -106,7 +107,8 @@ public class DatabaseComponentImplTest extends BrambleMockTestCase { public DatabaseComponentImplTest() { clientId = getClientId(); - group = getGroup(clientId); + clientVersion = 123; + group = getGroup(clientId, clientVersion); groupId = group.getId(); author = getAuthor(); localAuthor = getLocalAuthor(); @@ -175,7 +177,7 @@ public class DatabaseComponentImplTest extends BrambleMockTestCase { oneOf(database).containsGroup(txn, groupId); will(returnValue(true)); // getGroups() - oneOf(database).getGroups(txn, clientId); + oneOf(database).getGroups(txn, clientId, clientVersion); will(returnValue(singletonList(group))); // removeGroup() oneOf(database).containsGroup(txn, groupId); @@ -215,7 +217,7 @@ public class DatabaseComponentImplTest extends BrambleMockTestCase { db.addGroup(transaction, group); // First time - listeners called db.addGroup(transaction, group); // Second time - not called assertEquals(singletonList(group), - db.getGroups(transaction, clientId)); + db.getGroups(transaction, clientId, clientVersion)); db.removeGroup(transaction, group); db.removeContact(transaction, contactId); db.removeLocalAuthor(transaction, localAuthor.getId()); diff --git a/bramble-core/src/test/java/org/briarproject/bramble/db/DatabasePerformanceTest.java b/bramble-core/src/test/java/org/briarproject/bramble/db/DatabasePerformanceTest.java index 389f7c1c3..e46a75b68 100644 --- a/bramble-core/src/test/java/org/briarproject/bramble/db/DatabasePerformanceTest.java +++ b/bramble-core/src/test/java/org/briarproject/bramble/db/DatabasePerformanceTest.java @@ -267,7 +267,7 @@ public abstract class DatabasePerformanceTest extends BrambleTestCase { String name = "getGroups(T, ClientId)"; benchmark(name, db -> { Connection txn = db.startTransaction(); - db.getGroups(txn, pickRandom(clientIds)); + db.getGroups(txn, pickRandom(clientIds), 123); db.commitTransaction(txn); }); } @@ -550,7 +550,7 @@ public abstract class DatabasePerformanceTest extends BrambleTestCase { contacts.add(db.getContact(txn, c)); contactGroups.put(c, new ArrayList<>()); for (int j = 0; j < GROUPS_PER_CONTACT; j++) { - Group g = getGroup(clientIds.get(j % CLIENTS)); + Group g = getGroup(clientIds.get(j % CLIENTS), 123); groups.add(g); messageMeta.put(g.getId(), new ArrayList<>()); contactGroups.get(c).add(g); @@ -584,7 +584,7 @@ public abstract class DatabasePerformanceTest extends BrambleTestCase { } } for (int i = 0; i < LOCAL_GROUPS; i++) { - Group g = getGroup(clientIds.get(i % CLIENTS)); + Group g = getGroup(clientIds.get(i % CLIENTS), 123); groups.add(g); messageMeta.put(g.getId(), new ArrayList<>()); groupMessages.put(g.getId(), new ArrayList<>()); diff --git a/bramble-core/src/test/java/org/briarproject/bramble/db/JdbcDatabaseTest.java b/bramble-core/src/test/java/org/briarproject/bramble/db/JdbcDatabaseTest.java index 97268d16b..71f7b2985 100644 --- a/bramble-core/src/test/java/org/briarproject/bramble/db/JdbcDatabaseTest.java +++ b/bramble-core/src/test/java/org/briarproject/bramble/db/JdbcDatabaseTest.java @@ -82,6 +82,7 @@ public abstract class JdbcDatabaseTest extends BrambleTestCase { private final File testDir = TestUtils.getTestDirectory(); private final GroupId groupId; private final ClientId clientId; + private final int clientVersion; private final Group group; private final Author author; private final LocalAuthor localAuthor; @@ -96,7 +97,8 @@ public abstract class JdbcDatabaseTest extends BrambleTestCase { JdbcDatabaseTest() throws Exception { clientId = getClientId(); - group = getGroup(clientId); + clientVersion = 123; + group = getGroup(clientId, clientVersion); groupId = group.getId(); author = getAuthor(); localAuthor = getLocalAuthor(); @@ -1460,7 +1462,7 @@ public abstract class JdbcDatabaseTest extends BrambleTestCase { db.addMessage(txn, message, PENDING, true, contactId); // Add a second group - Group group1 = getGroup(clientId); + Group group1 = getGroup(clientId, 123); GroupId groupId1 = group1.getId(); db.addGroup(txn, group1); @@ -1828,6 +1830,22 @@ public abstract class JdbcDatabaseTest extends BrambleTestCase { db.close(); } + @Test + public void testGetGroups() throws Exception { + Database db = open(false); + Connection txn = db.startTransaction(); + + assertEquals(emptyList(), db.getGroups(txn, clientId, clientVersion)); + db.addGroup(txn, group); + assertEquals(singletonList(group), + db.getGroups(txn, clientId, clientVersion)); + db.removeGroup(txn, groupId); + assertEquals(emptyList(), db.getGroups(txn, clientId, clientVersion)); + + db.commitTransaction(txn); + db.close(); + } + @Test public void testExceptionHandling() throws Exception { Database db = open(false); 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 9702c2d51..1f690b14e 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 @@ -51,7 +51,7 @@ public class TransportPropertyManagerImplTest extends BrambleMockTestCase { context.mock(ContactGroupFactory.class); private final Clock clock = context.mock(Clock.class); - private final Group localGroup = getGroup(CLIENT_ID); + private final Group localGroup = getGroup(CLIENT_ID, CLIENT_VERSION); private final LocalAuthor localAuthor = getLocalAuthor(); private final BdfDictionary fooPropertiesDict = BdfDictionary.of( new BdfEntry("fooKey1", "fooValue1"), @@ -90,8 +90,8 @@ public class TransportPropertyManagerImplTest extends BrambleMockTestCase { Contact contact1 = getContact(true); Contact contact2 = getContact(true); List contacts = Arrays.asList(contact1, contact2); - Group contactGroup1 = getGroup(CLIENT_ID); - Group contactGroup2 = getGroup(CLIENT_ID); + Group contactGroup1 = getGroup(CLIENT_ID, CLIENT_VERSION); + Group contactGroup2 = getGroup(CLIENT_ID, CLIENT_VERSION); context.checking(new Expectations() {{ oneOf(db).containsGroup(txn, localGroup.getId()); @@ -144,7 +144,7 @@ public class TransportPropertyManagerImplTest extends BrambleMockTestCase { public void testCreatesContactGroupWhenAddingContact() throws Exception { Transaction txn = new Transaction(null, false); Contact contact = getContact(true); - Group contactGroup = getGroup(CLIENT_ID); + Group contactGroup = getGroup(CLIENT_ID, CLIENT_VERSION); context.checking(new Expectations() {{ // Create the group and share it with the contact @@ -172,7 +172,7 @@ public class TransportPropertyManagerImplTest extends BrambleMockTestCase { public void testRemovesGroupWhenRemovingContact() throws Exception { Transaction txn = new Transaction(null, false); Contact contact = getContact(true); - Group contactGroup = getGroup(CLIENT_ID); + Group contactGroup = getGroup(CLIENT_ID, CLIENT_VERSION); context.checking(new Expectations() {{ oneOf(contactGroupFactory).createContactGroup(CLIENT_ID, @@ -307,7 +307,7 @@ public class TransportPropertyManagerImplTest extends BrambleMockTestCase { @Test public void testStoresRemotePropertiesWithVersion0() throws Exception { Contact contact = getContact(true); - Group contactGroup = getGroup(CLIENT_ID); + Group contactGroup = getGroup(CLIENT_ID, CLIENT_VERSION); Transaction txn = new Transaction(null, false); Map properties = new LinkedHashMap<>(); @@ -421,8 +421,8 @@ public class TransportPropertyManagerImplTest extends BrambleMockTestCase { Contact contact3 = getContact(true); List contacts = Arrays.asList(contact1, contact2, contact3); - Group contactGroup2 = getGroup(CLIENT_ID); - Group contactGroup3 = getGroup(CLIENT_ID); + Group contactGroup2 = getGroup(CLIENT_ID, CLIENT_VERSION); + Group contactGroup3 = getGroup(CLIENT_ID, CLIENT_VERSION); Map messageMetadata3 = new LinkedHashMap<>(); // A remote update for another transport should be ignored @@ -524,7 +524,7 @@ public class TransportPropertyManagerImplTest extends BrambleMockTestCase { public void testMergingNewPropertiesCreatesUpdate() throws Exception { Transaction txn = new Transaction(null, false); Contact contact = getContact(true); - Group contactGroup = getGroup(CLIENT_ID); + Group contactGroup = getGroup(CLIENT_ID, CLIENT_VERSION); context.checking(new Expectations() {{ oneOf(db).startTransaction(false); @@ -559,7 +559,7 @@ public class TransportPropertyManagerImplTest extends BrambleMockTestCase { public void testMergingUpdatedPropertiesCreatesUpdate() throws Exception { Transaction txn = new Transaction(null, false); Contact contact = getContact(true); - Group contactGroup = getGroup(CLIENT_ID); + Group contactGroup = getGroup(CLIENT_ID, CLIENT_VERSION); BdfDictionary oldMetadata = BdfDictionary.of( new BdfEntry("transportId", "foo"), new BdfEntry("version", 1), diff --git a/bramble-core/src/test/java/org/briarproject/bramble/properties/TransportPropertyValidatorTest.java b/bramble-core/src/test/java/org/briarproject/bramble/properties/TransportPropertyValidatorTest.java index cd8424897..600fb2ef8 100644 --- a/bramble-core/src/test/java/org/briarproject/bramble/properties/TransportPropertyValidatorTest.java +++ b/bramble-core/src/test/java/org/briarproject/bramble/properties/TransportPropertyValidatorTest.java @@ -18,7 +18,8 @@ import org.junit.Test; import java.io.IOException; import static org.briarproject.bramble.api.plugin.TransportId.MAX_TRANSPORT_ID_LENGTH; -import static org.briarproject.bramble.test.TestUtils.getClientId; +import static org.briarproject.bramble.api.properties.TransportPropertyManager.CLIENT_ID; +import static org.briarproject.bramble.api.properties.TransportPropertyManager.CLIENT_VERSION; import static org.briarproject.bramble.test.TestUtils.getGroup; import static org.briarproject.bramble.test.TestUtils.getMessage; import static org.briarproject.bramble.test.TestUtils.getTransportId; @@ -42,7 +43,7 @@ public class TransportPropertyValidatorTest extends BrambleMockTestCase { transportProperties = new TransportProperties(); transportProperties.put("foo", "bar"); - group = getGroup(getClientId()); + group = getGroup(CLIENT_ID, CLIENT_VERSION); message = getMessage(group.getId()); MetadataEncoder metadataEncoder = context.mock(MetadataEncoder.class); diff --git a/bramble-core/src/test/java/org/briarproject/bramble/sync/ValidationManagerImplTest.java b/bramble-core/src/test/java/org/briarproject/bramble/sync/ValidationManagerImplTest.java index a3a23d4ae..c6be26f21 100644 --- a/bramble-core/src/test/java/org/briarproject/bramble/sync/ValidationManagerImplTest.java +++ b/bramble-core/src/test/java/org/briarproject/bramble/sync/ValidationManagerImplTest.java @@ -56,7 +56,7 @@ public class ValidationManagerImplTest extends BrambleMockTestCase { private final MessageId messageId = new MessageId(getRandomId()); private final MessageId messageId1 = new MessageId(getRandomId()); private final MessageId messageId2 = new MessageId(getRandomId()); - private final Group group = getGroup(clientId); + private final Group group = getGroup(clientId, 123); private final GroupId groupId = group.getId(); private final long timestamp = System.currentTimeMillis(); private final byte[] raw = new byte[123]; diff --git a/briar-core/src/main/java/org/briarproject/briar/blog/BlogManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/blog/BlogManagerImpl.java index c7b119ef0..dab2efccb 100644 --- a/briar-core/src/main/java/org/briarproject/briar/blog/BlogManagerImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/blog/BlogManagerImpl.java @@ -425,7 +425,7 @@ class BlogManagerImpl extends BdfIncomingMessageHook implements BlogManager, Collection groups; Transaction txn = db.startTransaction(true); try { - groups = db.getGroups(txn, CLIENT_ID); + groups = db.getGroups(txn, CLIENT_ID, CLIENT_VERSION); for (Group g : groups) { blogs.add(blogFactory.parseBlog(g)); } diff --git a/briar-core/src/main/java/org/briarproject/briar/forum/ForumManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/forum/ForumManagerImpl.java index cdd2ba064..edac994cd 100644 --- a/briar-core/src/main/java/org/briarproject/briar/forum/ForumManagerImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/forum/ForumManagerImpl.java @@ -188,7 +188,7 @@ class ForumManagerImpl extends BdfIncomingMessageHook implements ForumManager { Collection groups; Transaction txn = db.startTransaction(true); try { - groups = db.getGroups(txn, CLIENT_ID); + groups = db.getGroups(txn, CLIENT_ID, CLIENT_VERSION); db.commitTransaction(txn); } finally { db.endTransaction(txn); diff --git a/briar-core/src/main/java/org/briarproject/briar/privategroup/PrivateGroupManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/privategroup/PrivateGroupManagerImpl.java index 20ea827a3..63b6807d1 100644 --- a/briar-core/src/main/java/org/briarproject/briar/privategroup/PrivateGroupManagerImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/privategroup/PrivateGroupManagerImpl.java @@ -271,7 +271,7 @@ class PrivateGroupManagerImpl extends BdfIncomingMessageHook Collection groups; Transaction txn = db.startTransaction(true); try { - groups = db.getGroups(txn, CLIENT_ID); + groups = db.getGroups(txn, CLIENT_ID, CLIENT_VERSION); db.commitTransaction(txn); } finally { db.endTransaction(txn); diff --git a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImpl.java index 3c02de9f4..a03c38409 100644 --- a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImpl.java @@ -122,7 +122,8 @@ class GroupInvitationManagerImpl extends ConversationClientImpl throw new AssertionError(e); } // If the contact belongs to any private groups, create a peer session - for (Group pg : db.getGroups(txn, PrivateGroupManager.CLIENT_ID)) { + for (Group pg : db.getGroups(txn, PrivateGroupManager.CLIENT_ID, + PrivateGroupManager.CLIENT_VERSION)) { if (privateGroupManager.isMember(txn, pg.getId(), c.getAuthor())) addingMember(txn, pg.getId(), c); } diff --git a/briar-core/src/test/java/org/briarproject/briar/blog/BlogManagerImplTest.java b/briar-core/src/test/java/org/briarproject/briar/blog/BlogManagerImplTest.java index bbd905705..3f636748a 100644 --- a/briar-core/src/test/java/org/briarproject/briar/blog/BlogManagerImplTest.java +++ b/briar-core/src/test/java/org/briarproject/briar/blog/BlogManagerImplTest.java @@ -14,6 +14,7 @@ import org.briarproject.bramble.api.db.Transaction; import org.briarproject.bramble.api.identity.Author; import org.briarproject.bramble.api.identity.IdentityManager; import org.briarproject.bramble.api.identity.LocalAuthor; +import org.briarproject.bramble.api.sync.Group; import org.briarproject.bramble.api.sync.Message; import org.briarproject.bramble.api.sync.MessageId; import org.briarproject.briar.api.blog.Blog; @@ -49,6 +50,7 @@ import static org.briarproject.briar.api.blog.BlogConstants.KEY_TIME_RECEIVED; import static org.briarproject.briar.api.blog.BlogConstants.KEY_TYPE; import static org.briarproject.briar.api.blog.BlogConstants.MAX_BLOG_COMMENT_LENGTH; import static org.briarproject.briar.api.blog.BlogManager.CLIENT_ID; +import static org.briarproject.briar.api.blog.BlogManager.CLIENT_VERSION; import static org.briarproject.briar.api.blog.MessageType.COMMENT; import static org.briarproject.briar.api.blog.MessageType.POST; import static org.briarproject.briar.api.blog.MessageType.WRAPPED_COMMENT; @@ -866,7 +868,8 @@ public class BlogManagerImplTest extends BriarTestCase { } private Blog createBlog(LocalAuthor localAuthor, boolean rssFeed) { - return new Blog(getGroup(CLIENT_ID), localAuthor, rssFeed); + Group group = getGroup(CLIENT_ID, CLIENT_VERSION); + return new Blog(group, localAuthor, rssFeed); } private BdfList authorToBdfList(Author a) { diff --git a/briar-core/src/test/java/org/briarproject/briar/blog/BlogPostValidatorTest.java b/briar-core/src/test/java/org/briarproject/briar/blog/BlogPostValidatorTest.java index f2ca321d7..77290aa7a 100644 --- a/briar-core/src/test/java/org/briarproject/briar/blog/BlogPostValidatorTest.java +++ b/briar-core/src/test/java/org/briarproject/briar/blog/BlogPostValidatorTest.java @@ -64,7 +64,7 @@ public class BlogPostValidatorTest extends BriarTestCase { private final String body = getRandomString(42); public BlogPostValidatorTest() { - group = getGroup(CLIENT_ID); + group = getGroup(CLIENT_ID, CLIENT_VERSION); descriptor = group.getDescriptor(); author = getAuthor(); authorList = BdfList.of( diff --git a/briar-core/src/test/java/org/briarproject/briar/feed/FeedManagerImplTest.java b/briar-core/src/test/java/org/briarproject/briar/feed/FeedManagerImplTest.java index 05a17fee5..4074cebe6 100644 --- a/briar-core/src/test/java/org/briarproject/briar/feed/FeedManagerImplTest.java +++ b/briar-core/src/test/java/org/briarproject/briar/feed/FeedManagerImplTest.java @@ -61,9 +61,10 @@ public class FeedManagerImplTest extends BrambleMockTestCase { private final Clock clock = context.mock(Clock.class); private final Dns noDnsLookups = context.mock(Dns.class); - private final Group localGroup = getGroup(CLIENT_ID); + private final Group localGroup = getGroup(CLIENT_ID, CLIENT_VERSION); private final GroupId localGroupId = localGroup.getId(); - private final Group blogGroup = getGroup(BlogManager.CLIENT_ID); + private final Group blogGroup = + getGroup(BlogManager.CLIENT_ID, BlogManager.CLIENT_VERSION); private final GroupId blogGroupId = blogGroup.getId(); private final LocalAuthor localAuthor = getLocalAuthor(); private final Blog blog = new Blog(blogGroup, localAuthor, true); diff --git a/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/AbstractProtocolEngineTest.java b/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/AbstractProtocolEngineTest.java index f7c630f65..3ae2fb61e 100644 --- a/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/AbstractProtocolEngineTest.java +++ b/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/AbstractProtocolEngineTest.java @@ -33,6 +33,7 @@ import static org.briarproject.briar.api.privategroup.PrivateGroupConstants.GROU import static org.briarproject.briar.api.privategroup.PrivateGroupConstants.MAX_GROUP_INVITATION_MSG_LENGTH; import static org.briarproject.briar.api.privategroup.PrivateGroupConstants.MAX_GROUP_NAME_LENGTH; import static org.briarproject.briar.api.privategroup.PrivateGroupManager.CLIENT_ID; +import static org.briarproject.briar.api.privategroup.PrivateGroupManager.CLIENT_VERSION; import static org.briarproject.briar.privategroup.invitation.GroupInvitationConstants.GROUP_KEY_CONTACT_ID; import static org.briarproject.briar.privategroup.invitation.MessageType.ABORT; import static org.briarproject.briar.privategroup.invitation.MessageType.INVITE; @@ -64,7 +65,8 @@ public abstract class AbstractProtocolEngineTest extends BrambleMockTestCase { protected final Transaction txn = new Transaction(null, false); protected final GroupId contactGroupId = new GroupId(getRandomId()); - protected final Group privateGroupGroup = getGroup(CLIENT_ID); + protected final Group privateGroupGroup = + getGroup(CLIENT_ID, CLIENT_VERSION); protected final GroupId privateGroupId = privateGroupGroup.getId(); protected final Author author = getAuthor(); protected final PrivateGroup privateGroup = diff --git a/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImplTest.java b/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImplTest.java index c225d056d..543af95b1 100644 --- a/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImplTest.java +++ b/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImplTest.java @@ -99,9 +99,9 @@ public class GroupInvitationManagerImplTest extends BrambleMockTestCase { private final Author author = getAuthor(); private final Contact contact = new Contact(contactId, author, new AuthorId(getRandomId()), true, true); - private final Group localGroup = getGroup(CLIENT_ID); - private final Group contactGroup = getGroup(CLIENT_ID); - private final Group privateGroup = getGroup(CLIENT_ID); + private final Group localGroup = getGroup(CLIENT_ID, CLIENT_VERSION); + private final Group contactGroup = getGroup(CLIENT_ID, CLIENT_VERSION); + private final Group privateGroup = getGroup(CLIENT_ID, CLIENT_VERSION); private final BdfDictionary meta = BdfDictionary.of(new BdfEntry("m", "e")); private final Message message = new Message(new MessageId(getRandomId()), contactGroup.getId(), @@ -194,7 +194,8 @@ public class GroupInvitationManagerImplTest extends BrambleMockTestCase { SHARED); oneOf(clientHelper) .mergeGroupMetadata(txn, contactGroup.getId(), meta); - oneOf(db).getGroups(txn, PrivateGroupManager.CLIENT_ID); + oneOf(db).getGroups(txn, PrivateGroupManager.CLIENT_ID, + PrivateGroupManager.CLIENT_VERSION); will(returnValue(Collections.singletonList(privateGroup))); oneOf(privateGroupManager) .isMember(txn, privateGroup.getId(), c.getAuthor()); @@ -854,8 +855,8 @@ public class GroupInvitationManagerImplTest extends BrambleMockTestCase { Collection contacts = Arrays.asList(contact, contact2, contact3); - Group contactGroup2 = getGroup(CLIENT_ID); - Group contactGroup3 = getGroup(CLIENT_ID); + Group contactGroup2 = getGroup(CLIENT_ID, CLIENT_VERSION); + Group contactGroup3 = getGroup(CLIENT_ID, CLIENT_VERSION); MessageId storageId2 = new MessageId(getRandomId()); MessageId storageId3 = new MessageId(getRandomId()); diff --git a/briar-core/src/test/java/org/briarproject/briar/sharing/BlogSharingManagerImplTest.java b/briar-core/src/test/java/org/briarproject/briar/sharing/BlogSharingManagerImplTest.java index 46a9cb5e9..db3b6af2c 100644 --- a/briar-core/src/test/java/org/briarproject/briar/sharing/BlogSharingManagerImplTest.java +++ b/briar-core/src/test/java/org/briarproject/briar/sharing/BlogSharingManagerImplTest.java @@ -65,11 +65,13 @@ public class BlogSharingManagerImplTest extends BrambleMockTestCase { new Contact(contactId, author, localAuthor.getId(), true, true); private final Collection contacts = Collections.singletonList(contact); - private final Group localGroup = getGroup(CLIENT_ID); - private final Group contactGroup = getGroup(CLIENT_ID); - private final Group blogGroup = getGroup(BlogManager.CLIENT_ID); + private final Group localGroup = getGroup(CLIENT_ID, CLIENT_VERSION); + private final Group contactGroup = getGroup(CLIENT_ID, CLIENT_VERSION); + private final Group blogGroup = + getGroup(BlogManager.CLIENT_ID, BlogManager.CLIENT_VERSION); private final Blog blog = new Blog(blogGroup, author, false); - private final Group localBlogGroup = getGroup(BlogManager.CLIENT_ID); + private final Group localBlogGroup = + getGroup(BlogManager.CLIENT_ID, BlogManager.CLIENT_VERSION); private final Blog localBlog = new Blog(localBlogGroup, localAuthor, false); @SuppressWarnings("unchecked") private final ProtocolEngine engine = @@ -225,7 +227,7 @@ public class BlogSharingManagerImplTest extends BrambleMockTestCase { private void expectPreShareShareable(Transaction txn, Contact contact, Blog blog, Map sessions) throws Exception { - Group contactGroup = getGroup(CLIENT_ID); + Group contactGroup = getGroup(CLIENT_ID, CLIENT_VERSION); BdfDictionary sessionDict = new BdfDictionary(); Message message = new Message(new MessageId(getRandomId()), contactGroup.getId(), 42L, getRandomBytes(1337)); From 85c11f8e1f74d7b00e940d1ca23a976e3c6820d9 Mon Sep 17 00:00:00 2001 From: akwizgran Date: Fri, 13 Apr 2018 15:40:39 +0100 Subject: [PATCH 06/33] Remove redundant checks when adding contacts. Hooks are now called exactly once per contact. --- .../TransportPropertyManagerImpl.java | 4 +- .../TransportPropertyManagerImplTest.java | 39 ++++++---------- .../briar/messaging/MessagingManagerImpl.java | 4 +- .../GroupInvitationManagerImpl.java | 4 +- .../briar/sharing/BlogSharingManagerImpl.java | 12 ++--- .../briar/sharing/SharingManagerImpl.java | 10 ++--- .../GroupInvitationManagerImplTest.java | 22 ++++------ .../sharing/BlogSharingManagerImplTest.java | 44 ++----------------- 8 files changed, 35 insertions(+), 104 deletions(-) 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 1296f03bc..f3b62bb22 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 @@ -65,7 +65,7 @@ class TransportPropertyManagerImpl implements TransportPropertyManager, public void createLocalState(Transaction txn) throws DbException { if (db.containsGroup(txn, localGroup.getId())) return; db.addGroup(txn, localGroup); - // Ensure we've set things up for any pre-existing contacts + // Set things up for any pre-existing contacts for (Contact c : db.getContacts(txn)) addingContact(txn, c); } @@ -73,8 +73,6 @@ class TransportPropertyManagerImpl implements TransportPropertyManager, public void addingContact(Transaction txn, Contact c) throws DbException { // Create a group to share with the contact Group g = getContactGroup(c); - // Return if we've already set things up for this contact - if (db.containsGroup(txn, g.getId())) return; // Store the group and share it with the contact db.addGroup(txn, g); db.setGroupVisibility(txn, c.getId(), g.getId(), SHARED); 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 1f690b14e..6f12898b9 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 @@ -29,6 +29,7 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import static java.util.Collections.singletonList; import static org.briarproject.bramble.api.properties.TransportPropertyManager.CLIENT_ID; import static org.briarproject.bramble.api.properties.TransportPropertyManager.CLIENT_VERSION; import static org.briarproject.bramble.api.sync.Group.Visibility.SHARED; @@ -87,39 +88,27 @@ public class TransportPropertyManagerImplTest extends BrambleMockTestCase { @Test public void testCreatesGroupsAtStartup() throws Exception { Transaction txn = new Transaction(null, false); - Contact contact1 = getContact(true); - Contact contact2 = getContact(true); - List contacts = Arrays.asList(contact1, contact2); - Group contactGroup1 = getGroup(CLIENT_ID, CLIENT_VERSION); - Group contactGroup2 = getGroup(CLIENT_ID, CLIENT_VERSION); + Contact contact = getContact(true); + Group contactGroup = getGroup(CLIENT_ID, CLIENT_VERSION); context.checking(new Expectations() {{ oneOf(db).containsGroup(txn, localGroup.getId()); will(returnValue(false)); oneOf(db).addGroup(txn, localGroup); oneOf(db).getContacts(txn); - will(returnValue(contacts)); - // The first contact's group has already been set up + will(returnValue(singletonList(contact))); oneOf(contactGroupFactory).createContactGroup(CLIENT_ID, - CLIENT_VERSION, contact1); - will(returnValue(contactGroup1)); - oneOf(db).containsGroup(txn, contactGroup1.getId()); - will(returnValue(true)); - // The second contact's group hasn't been set up - oneOf(contactGroupFactory).createContactGroup(CLIENT_ID, - CLIENT_VERSION, contact2); - will(returnValue(contactGroup2)); - oneOf(db).containsGroup(txn, contactGroup2.getId()); - will(returnValue(false)); - oneOf(db).addGroup(txn, contactGroup2); - oneOf(db).setGroupVisibility(txn, contact2.getId(), - contactGroup2.getId(), SHARED); + CLIENT_VERSION, contact); + will(returnValue(contactGroup)); + oneOf(db).addGroup(txn, contactGroup); + oneOf(db).setGroupVisibility(txn, contact.getId(), + contactGroup.getId(), SHARED); }}); // Copy the latest local properties into the group expectGetLocalProperties(txn); - expectStoreMessage(txn, contactGroup2.getId(), "foo", fooPropertiesDict, + expectStoreMessage(txn, contactGroup.getId(), "foo", fooPropertiesDict, 1, true, true); - expectStoreMessage(txn, contactGroup2.getId(), "bar", barPropertiesDict, + expectStoreMessage(txn, contactGroup.getId(), "bar", barPropertiesDict, 1, true, true); TransportPropertyManagerImpl t = createInstance(); @@ -151,8 +140,6 @@ public class TransportPropertyManagerImplTest extends BrambleMockTestCase { oneOf(contactGroupFactory).createContactGroup(CLIENT_ID, CLIENT_VERSION, contact); will(returnValue(contactGroup)); - oneOf(db).containsGroup(txn, contactGroup.getId()); - will(returnValue(false)); oneOf(db).addGroup(txn, contactGroup); oneOf(db).setGroupVisibility(txn, contact.getId(), contactGroup.getId(), SHARED); @@ -538,7 +525,7 @@ public class TransportPropertyManagerImplTest extends BrambleMockTestCase { fooPropertiesDict, 1, true, false); // Store the new properties in each contact's group, version 1 oneOf(db).getContacts(txn); - will(returnValue(Collections.singletonList(contact))); + will(returnValue(singletonList(contact))); oneOf(contactGroupFactory).createContactGroup(CLIENT_ID, CLIENT_VERSION, contact); will(returnValue(contactGroup)); @@ -597,7 +584,7 @@ public class TransportPropertyManagerImplTest extends BrambleMockTestCase { oneOf(db).removeMessage(txn, localGroupUpdateId); // Store the merged properties in each contact's group, version 2 oneOf(db).getContacts(txn); - will(returnValue(Collections.singletonList(contact))); + will(returnValue(singletonList(contact))); oneOf(contactGroupFactory).createContactGroup(CLIENT_ID, CLIENT_VERSION, contact); will(returnValue(contactGroup)); diff --git a/briar-core/src/main/java/org/briarproject/briar/messaging/MessagingManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/messaging/MessagingManagerImpl.java index c81766492..804dbeccf 100644 --- a/briar-core/src/main/java/org/briarproject/briar/messaging/MessagingManagerImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/messaging/MessagingManagerImpl.java @@ -58,7 +58,7 @@ class MessagingManagerImpl extends ConversationClientImpl CLIENT_VERSION); if (db.containsGroup(txn, localGroup.getId())) return; db.addGroup(txn, localGroup); - // Ensure we've set things up for any pre-existing contacts + // Set things up for any pre-existing contacts for (Contact c : db.getContacts(txn)) addingContact(txn, c); } @@ -67,8 +67,6 @@ class MessagingManagerImpl extends ConversationClientImpl try { // Create a group to share with the contact Group g = getContactGroup(c); - // Return if we've already set things up for this contact - if (db.containsGroup(txn, g.getId())) return; // Store the group and share it with the contact db.addGroup(txn, g); db.setGroupVisibility(txn, c.getId(), g.getId(), SHARED); diff --git a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImpl.java index a03c38409..5ae9a3f81 100644 --- a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImpl.java @@ -100,7 +100,7 @@ class GroupInvitationManagerImpl extends ConversationClientImpl CLIENT_VERSION); if (db.containsGroup(txn, localGroup.getId())) return; db.addGroup(txn, localGroup); - // Ensure we've set things up for any pre-existing contacts + // Set things up for any pre-existing contacts for (Contact c : db.getContacts(txn)) addingContact(txn, c); } @@ -108,8 +108,6 @@ class GroupInvitationManagerImpl extends ConversationClientImpl public void addingContact(Transaction txn, Contact c) throws DbException { // Create a group to share with the contact Group g = getContactGroup(c); - // Return if we've already set things up for this contact - if (db.containsGroup(txn, g.getId())) return; // Store the group and share it with the contact db.addGroup(txn, g); db.setGroupVisibility(txn, c.getId(), g.getId(), SHARED); diff --git a/briar-core/src/main/java/org/briarproject/briar/sharing/BlogSharingManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/sharing/BlogSharingManagerImpl.java index f0086e856..7a92f1c5f 100644 --- a/briar-core/src/main/java/org/briarproject/briar/sharing/BlogSharingManagerImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/sharing/BlogSharingManagerImpl.java @@ -56,23 +56,17 @@ class BlogSharingManagerImpl extends SharingManagerImpl return CLIENT_VERSION; } - /** - * This is called during each startup for each existing Contact. - */ @Override public void addingContact(Transaction txn, Contact c) throws DbException { - // Return if we've already set things up for this contact - if (db.containsGroup(txn, getContactGroup(c).getId())) return; - - // creates a group to share with the contact + // Create a group to share with the contact super.addingContact(txn, c); - // get our blog and that of Contact c + // Get our blog and that of the contact LocalAuthor localAuthor = identityManager.getLocalAuthor(txn); Blog ourBlog = blogManager.getPersonalBlog(localAuthor); Blog theirBlog = blogManager.getPersonalBlog(c.getAuthor()); - // pre-share both blogs, if they have not been shared already + // Pre-share both blogs, if they have not been shared already try { preShareShareable(txn, c, ourBlog); preShareShareable(txn, c, theirBlog); diff --git a/briar-core/src/main/java/org/briarproject/briar/sharing/SharingManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/sharing/SharingManagerImpl.java index f26996438..711e3875e 100644 --- a/briar-core/src/main/java/org/briarproject/briar/sharing/SharingManagerImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/sharing/SharingManagerImpl.java @@ -87,7 +87,7 @@ abstract class SharingManagerImpl getClientVersion()); if (db.containsGroup(txn, localGroup.getId())) return; db.addGroup(txn, localGroup); - // Ensure we've set things up for any pre-existing contacts + // Set things up for any pre-existing contacts for (Contact c : db.getContacts(txn)) addingContact(txn, c); } @@ -96,8 +96,6 @@ abstract class SharingManagerImpl try { // Create a group to share with the contact Group g = getContactGroup(c); - // Return if we've already set things up for this contact - if (db.containsGroup(txn, g.getId())) return; // Store the group and share it with the contact db.addGroup(txn, g); db.setGroupVisibility(txn, c.getId(), g.getId(), SHARED); @@ -152,17 +150,17 @@ abstract class SharingManagerImpl */ void preShareShareable(Transaction txn, Contact c, S shareable) throws DbException, FormatException { - // return if a session already exists with that Contact + // Return if a session already exists with the contact GroupId contactGroupId = getContactGroup(c).getId(); StoredSession existingSession = getSession(txn, contactGroupId, getSessionId(shareable.getId())); if (existingSession != null) return; - // add and shares the shareable with the Contact + // Add and share the shareable with the contact db.addGroup(txn, shareable.getGroup()); db.setGroupVisibility(txn, c.getId(), shareable.getId(), SHARED); - // initialize session in sharing state + // Initialize session in sharing state Session session = new Session(SHARING, contactGroupId, shareable.getId(), null, null, 0, 0); MessageId storageId = createStorageId(txn, contactGroupId); diff --git a/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImplTest.java b/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImplTest.java index 543af95b1..1a7ae0857 100644 --- a/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImplTest.java +++ b/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImplTest.java @@ -159,7 +159,7 @@ public class GroupInvitationManagerImplTest extends BrambleMockTestCase { oneOf(db).getContacts(txn); will(returnValue(Collections.singletonList(contact))); }}); - expectAddingContact(contact, true); + expectAddingContact(contact); groupInvitationManager.createLocalState(txn); } @@ -175,20 +175,14 @@ public class GroupInvitationManagerImplTest extends BrambleMockTestCase { groupInvitationManager.createLocalState(txn); } - private void expectAddingContact(Contact c, boolean contactExists) - throws Exception { + private void expectAddingContact(Contact c) throws Exception { + BdfDictionary meta = BdfDictionary + .of(new BdfEntry(GROUP_KEY_CONTACT_ID, c.getId().getInt())); + context.checking(new Expectations() {{ oneOf(contactGroupFactory).createContactGroup(CLIENT_ID, CLIENT_VERSION, c); will(returnValue(contactGroup)); - oneOf(db).containsGroup(txn, contactGroup.getId()); - will(returnValue(contactExists)); - }}); - if (contactExists) return; - - BdfDictionary meta = BdfDictionary - .of(new BdfEntry(GROUP_KEY_CONTACT_ID, c.getId().getInt())); - context.checking(new Expectations() {{ oneOf(db).addGroup(txn, contactGroup); oneOf(db).setGroupVisibility(txn, c.getId(), contactGroup.getId(), SHARED); @@ -197,8 +191,8 @@ public class GroupInvitationManagerImplTest extends BrambleMockTestCase { oneOf(db).getGroups(txn, PrivateGroupManager.CLIENT_ID, PrivateGroupManager.CLIENT_VERSION); will(returnValue(Collections.singletonList(privateGroup))); - oneOf(privateGroupManager) - .isMember(txn, privateGroup.getId(), c.getAuthor()); + oneOf(privateGroupManager).isMember(txn, privateGroup.getId(), + c.getAuthor()); will(returnValue(true)); }}); expectAddingMember(privateGroup.getId(), c); @@ -255,7 +249,7 @@ public class GroupInvitationManagerImplTest extends BrambleMockTestCase { @Test public void testAddingContact() throws Exception { - expectAddingContact(contact, false); + expectAddingContact(contact); groupInvitationManager.addingContact(txn, contact); } diff --git a/briar-core/src/test/java/org/briarproject/briar/sharing/BlogSharingManagerImplTest.java b/briar-core/src/test/java/org/briarproject/briar/sharing/BlogSharingManagerImplTest.java index db3b6af2c..8a7a3775f 100644 --- a/briar-core/src/test/java/org/briarproject/briar/sharing/BlogSharingManagerImplTest.java +++ b/briar-core/src/test/java/org/briarproject/briar/sharing/BlogSharingManagerImplTest.java @@ -91,7 +91,7 @@ public class BlogSharingManagerImplTest extends BrambleMockTestCase { } @Test - public void testCreateLocalStateFirstTimeWithExistingContactNotSetUp() + public void testCreateLocalStateFirstTimeWithExistingContact() throws Exception { Transaction txn = new Transaction(null, false); @@ -119,19 +119,10 @@ public class BlogSharingManagerImplTest extends BrambleMockTestCase { Map sessions = Collections.emptyMap(); context.checking(new Expectations() {{ - // Check for contact group in BlogSharingManagerImpl - oneOf(contactGroupFactory).createContactGroup(CLIENT_ID, - CLIENT_VERSION, contact); - will(returnValue(contactGroup)); - oneOf(db).containsGroup(txn, contactGroup.getId()); - will(returnValue(false)); - // Check for contact group again in SharingManagerImpl - oneOf(contactGroupFactory).createContactGroup(CLIENT_ID, - CLIENT_VERSION, contact); - will(returnValue(contactGroup)); - oneOf(db).containsGroup(txn, contactGroup.getId()); - will(returnValue(false)); // Create the contact group and share it with the contact + oneOf(contactGroupFactory).createContactGroup(CLIENT_ID, + CLIENT_VERSION, contact); + will(returnValue(contactGroup)); oneOf(db).addGroup(txn, contactGroup); oneOf(db).setGroupVisibility(txn, contactId, contactGroup.getId(), SHARED); @@ -151,33 +142,6 @@ public class BlogSharingManagerImplTest extends BrambleMockTestCase { expectPreShareShareable(txn, contact, blog, sessions); } - @Test - public void testCreateLocalStateFirstTimeWithExistingContactAlreadySetUp() - throws Exception { - Transaction txn = new Transaction(null, false); - - context.checking(new Expectations() {{ - // The local group doesn't exist - we need to set things up - oneOf(contactGroupFactory).createLocalGroup(CLIENT_ID, - CLIENT_VERSION); - will(returnValue(localGroup)); - oneOf(db).containsGroup(txn, localGroup.getId()); - will(returnValue(false)); - oneOf(db).addGroup(txn, localGroup); - // Get contacts - oneOf(db).getContacts(txn); - will(returnValue(contacts)); - // The contact has already been set up - oneOf(contactGroupFactory).createContactGroup(CLIENT_ID, - CLIENT_VERSION, contact); - will(returnValue(contactGroup)); - oneOf(db).containsGroup(txn, contactGroup.getId()); - will(returnValue(true)); - }}); - - blogSharingManager.createLocalState(txn); - } - @Test public void testCreateLocalStateSubsequentTime() throws Exception { Transaction txn = new Transaction(null, false); From 1197d65d8da51f0048ca85fa9700fb9204432e8f Mon Sep 17 00:00:00 2001 From: akwizgran Date: Fri, 13 Apr 2018 15:45:03 +0100 Subject: [PATCH 07/33] Extract ClientVersion inner class. --- .../bramble/sync/ClientVersion.java | 42 +++++++++++++++++++ .../sync/ClientVersioningManagerImpl.java | 33 --------------- 2 files changed, 42 insertions(+), 33 deletions(-) create mode 100644 bramble-core/src/main/java/org/briarproject/bramble/sync/ClientVersion.java diff --git a/bramble-core/src/main/java/org/briarproject/bramble/sync/ClientVersion.java b/bramble-core/src/main/java/org/briarproject/bramble/sync/ClientVersion.java new file mode 100644 index 000000000..36a51a4e3 --- /dev/null +++ b/bramble-core/src/main/java/org/briarproject/bramble/sync/ClientVersion.java @@ -0,0 +1,42 @@ +package org.briarproject.bramble.sync; + +import org.briarproject.bramble.api.nullsafety.NotNullByDefault; +import org.briarproject.bramble.api.sync.ClientId; + +import javax.annotation.concurrent.Immutable; + +@Immutable +@NotNullByDefault +class ClientVersion implements Comparable { + + final ClientId clientId; + final int clientVersion; + + ClientVersion(ClientId clientId, int clientVersion) { + this.clientId = clientId; + this.clientVersion = clientVersion; + } + + @Override + public boolean equals(Object o) { + if (o instanceof ClientVersion) { + ClientVersion cv = (ClientVersion) o; + return clientId.equals(cv.clientId) + && clientVersion == cv.clientVersion; + } + return false; + } + + @Override + public int hashCode() { + return (clientId.hashCode() << 16) + clientVersion; + } + + @Override + public int compareTo(ClientVersion c) { + int compare = clientId.compareTo(c.clientId); + if (compare != 0) return compare; + return clientVersion - c.clientVersion; + } +} + diff --git a/bramble-core/src/main/java/org/briarproject/bramble/sync/ClientVersioningManagerImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/sync/ClientVersioningManagerImpl.java index 9cb4d9c63..5594ac5e5 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/sync/ClientVersioningManagerImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/sync/ClientVersioningManagerImpl.java @@ -501,39 +501,6 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, Client, } } - private static class ClientVersion implements Comparable { - - private final ClientId clientId; - private final int clientVersion; - - private ClientVersion(ClientId clientId, int clientVersion) { - this.clientId = clientId; - this.clientVersion = clientVersion; - } - - @Override - public boolean equals(Object o) { - if (o instanceof ClientVersion) { - ClientVersion cv = (ClientVersion) o; - return clientId.equals(cv.clientId) - && clientVersion == cv.clientVersion; - } - return false; - } - - @Override - public int hashCode() { - return (clientId.hashCode() << 16) + clientVersion; - } - - @Override - public int compareTo(ClientVersion c) { - int compare = clientId.compareTo(c.clientId); - if (compare != 0) return compare; - return clientVersion - c.clientVersion; - } - } - private static class ClientState { private final ClientVersion version; From 114044ee5f0983877d1f5c3d55511a97006f1e66 Mon Sep 17 00:00:00 2001 From: akwizgran Date: Fri, 13 Apr 2018 16:11:03 +0100 Subject: [PATCH 08/33] Use client version to register validators, delivery hooks. --- .../bramble/api/sync/ValidationManager.java | 6 ++- .../bramble/properties/PropertiesModule.java | 6 ++- .../bramble/sync/ClientVersion.java | 5 +++ .../briarproject/bramble/sync/SyncModule.java | 6 ++- .../bramble/sync/ValidationManagerImpl.java | 42 +++++++++++-------- .../sync/ValidationManagerImplTest.java | 7 ++-- .../briarproject/briar/blog/BlogModule.java | 12 +++--- .../briarproject/briar/forum/ForumModule.java | 6 ++- .../introduction/IntroductionModule.java | 8 ++-- .../briar/messaging/MessagingModule.java | 10 +++-- .../privategroup/PrivateGroupModule.java | 7 +++- .../invitation/GroupInvitationModule.java | 6 ++- .../briar/sharing/SharingModule.java | 29 +++++++------ 13 files changed, 88 insertions(+), 62 deletions(-) diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/sync/ValidationManager.java b/bramble-api/src/main/java/org/briarproject/bramble/api/sync/ValidationManager.java index d80042b41..bc73714b7 100644 --- a/bramble-api/src/main/java/org/briarproject/bramble/api/sync/ValidationManager.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/sync/ValidationManager.java @@ -35,13 +35,15 @@ public interface ValidationManager { /** * Sets the message validator for the given client. */ - void registerMessageValidator(ClientId c, MessageValidator v); + void registerMessageValidator(ClientId c, int clientVersion, + MessageValidator v); /** * Sets the incoming message hook for the given client. The hook will be * called once for each incoming message that passes validation. */ - void registerIncomingMessageHook(ClientId c, IncomingMessageHook hook); + void registerIncomingMessageHook(ClientId c, int clientVersion, + IncomingMessageHook hook); interface MessageValidator { 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 7f7da60ce..93cbf28eb 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 @@ -15,6 +15,7 @@ import dagger.Module; import dagger.Provides; import static org.briarproject.bramble.api.properties.TransportPropertyManager.CLIENT_ID; +import static org.briarproject.bramble.api.properties.TransportPropertyManager.CLIENT_VERSION; @Module public class PropertiesModule { @@ -33,7 +34,8 @@ public class PropertiesModule { Clock clock) { TransportPropertyValidator validator = new TransportPropertyValidator( clientHelper, metadataEncoder, clock); - validationManager.registerMessageValidator(CLIENT_ID, validator); + validationManager.registerMessageValidator(CLIENT_ID, CLIENT_VERSION, + validator); return validator; } @@ -44,7 +46,7 @@ public class PropertiesModule { ValidationManager validationManager, ContactManager contactManager, TransportPropertyManagerImpl transportPropertyManager) { lifecycleManager.registerClient(transportPropertyManager); - validationManager.registerIncomingMessageHook(CLIENT_ID, + validationManager.registerIncomingMessageHook(CLIENT_ID, CLIENT_VERSION, transportPropertyManager); contactManager.registerContactHook(transportPropertyManager); return transportPropertyManager; diff --git a/bramble-core/src/main/java/org/briarproject/bramble/sync/ClientVersion.java b/bramble-core/src/main/java/org/briarproject/bramble/sync/ClientVersion.java index 36a51a4e3..202176a65 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/sync/ClientVersion.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/sync/ClientVersion.java @@ -38,5 +38,10 @@ class ClientVersion implements Comparable { if (compare != 0) return compare; return clientVersion - c.clientVersion; } + + @Override + public String toString() { + return clientId.getString() + ":" + clientVersion; + } } diff --git a/bramble-core/src/main/java/org/briarproject/bramble/sync/SyncModule.java b/bramble-core/src/main/java/org/briarproject/bramble/sync/SyncModule.java index 0acf9e4e8..f83e4d64c 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/sync/SyncModule.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/sync/SyncModule.java @@ -28,6 +28,7 @@ import dagger.Module; import dagger.Provides; import static org.briarproject.bramble.api.sync.ClientVersioningManager.CLIENT_ID; +import static org.briarproject.bramble.api.sync.ClientVersioningManager.CLIENT_VERSION; @Module public class SyncModule { @@ -110,7 +111,7 @@ public class SyncModule { lifecycleManager.registerClient(clientVersioningManager); lifecycleManager.registerService(clientVersioningManager); contactManager.registerContactHook(clientVersioningManager); - validationManager.registerIncomingMessageHook(CLIENT_ID, + validationManager.registerIncomingMessageHook(CLIENT_ID, CLIENT_VERSION, clientVersioningManager); return clientVersioningManager; } @@ -122,7 +123,8 @@ public class SyncModule { Clock clock, ValidationManager validationManager) { ClientVersioningValidator validator = new ClientVersioningValidator( clientHelper, metadataEncoder, clock); - validationManager.registerMessageValidator(CLIENT_ID, validator); + validationManager.registerMessageValidator(CLIENT_ID, CLIENT_VERSION, + validator); return validator; } } diff --git a/bramble-core/src/main/java/org/briarproject/bramble/sync/ValidationManagerImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/sync/ValidationManagerImpl.java index a9c79c332..16ce78a43 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/sync/ValidationManagerImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/sync/ValidationManagerImpl.java @@ -51,8 +51,8 @@ class ValidationManagerImpl implements ValidationManager, Service, private final DatabaseComponent db; private final Executor dbExecutor, validationExecutor; private final MessageFactory messageFactory; - private final Map validators; - private final Map hooks; + private final Map validators; + private final Map hooks; private final AtomicBoolean used = new AtomicBoolean(false); @Inject @@ -81,14 +81,15 @@ class ValidationManagerImpl implements ValidationManager, Service, } @Override - public void registerMessageValidator(ClientId c, MessageValidator v) { - validators.put(c, v); + public void registerMessageValidator(ClientId c, int clientVersion, + MessageValidator v) { + validators.put(new ClientVersion(c, clientVersion), v); } @Override - public void registerIncomingMessageHook(ClientId c, + public void registerIncomingMessageHook(ClientId c, int clientVersion, IncomingMessageHook hook) { - hooks.put(c, hook); + hooks.put(new ClientVersion(c, clientVersion), hook); } private void validateOutstandingMessagesAsync() { @@ -199,9 +200,11 @@ class ValidationManagerImpl implements ValidationManager, Service, Message m = messageFactory.createMessage(id, raw); Group g = db.getGroup(txn, m.getGroupId()); ClientId c = g.getClientId(); + int clientVersion = g.getClientVersion(); Metadata meta = db.getMessageMetadataForValidator(txn, id); - DeliveryResult result = deliverMessage(txn, m, c, meta); + DeliveryResult result = + deliverMessage(txn, m, c, clientVersion, meta); if (result.valid) { pending.addAll(getPendingDependents(txn, id)); if (result.share) { @@ -237,14 +240,16 @@ class ValidationManagerImpl implements ValidationManager, Service, @ValidationExecutor private void validateMessage(Message m, Group g) { - MessageValidator v = validators.get(g.getClientId()); + ClientVersion cv = + new ClientVersion(g.getClientId(), g.getClientVersion()); + MessageValidator v = validators.get(cv); if (v == null) { - if (LOG.isLoggable(WARNING)) - LOG.warning("No validator for " + g.getClientId().getString()); + if (LOG.isLoggable(WARNING)) LOG.warning("No validator for " + cv); } else { try { MessageContext context = v.validateMessage(m, g); - storeMessageContextAsync(m, g.getClientId(), context); + storeMessageContextAsync(m, g.getClientId(), + g.getClientVersion(), context); } catch (InvalidMessageException e) { if (LOG.isLoggable(INFO)) LOG.log(INFO, e.toString(), e); @@ -256,12 +261,13 @@ class ValidationManagerImpl implements ValidationManager, Service, } private void storeMessageContextAsync(Message m, ClientId c, - MessageContext result) { - dbExecutor.execute(() -> storeMessageContext(m, c, result)); + int clientVersion, MessageContext result) { + dbExecutor.execute(() -> + storeMessageContext(m, c, clientVersion, result)); } @DatabaseExecutor - private void storeMessageContext(Message m, ClientId c, + private void storeMessageContext(Message m, ClientId c, int clientVersion, MessageContext context) { try { MessageId id = m.getId(); @@ -292,7 +298,8 @@ class ValidationManagerImpl implements ValidationManager, Service, Metadata meta = context.getMetadata(); db.mergeMessageMetadata(txn, id, meta); if (allDelivered) { - DeliveryResult result = deliverMessage(txn, m, c, meta); + DeliveryResult result = + deliverMessage(txn, m, c, clientVersion, meta); if (result.valid) { pending = getPendingDependents(txn, id); if (result.share) { @@ -324,10 +331,11 @@ class ValidationManagerImpl implements ValidationManager, Service, @DatabaseExecutor private DeliveryResult deliverMessage(Transaction txn, Message m, - ClientId c, Metadata meta) throws DbException { + ClientId c, int clientVersion, Metadata meta) throws DbException { // Deliver the message to the client if it's registered a hook boolean shareMsg = false; - IncomingMessageHook hook = hooks.get(c); + ClientVersion cv = new ClientVersion(c, clientVersion); + IncomingMessageHook hook = hooks.get(cv); if (hook != null) { try { shareMsg = hook.incomingMessage(txn, m, meta); diff --git a/bramble-core/src/test/java/org/briarproject/bramble/sync/ValidationManagerImplTest.java b/bramble-core/src/test/java/org/briarproject/bramble/sync/ValidationManagerImplTest.java index c6be26f21..3131c4fb5 100644 --- a/bramble-core/src/test/java/org/briarproject/bramble/sync/ValidationManagerImplTest.java +++ b/bramble-core/src/test/java/org/briarproject/bramble/sync/ValidationManagerImplTest.java @@ -53,10 +53,11 @@ public class ValidationManagerImplTest extends BrambleMockTestCase { private final Executor dbExecutor = new ImmediateExecutor(); private final Executor validationExecutor = new ImmediateExecutor(); private final ClientId clientId = getClientId(); + private final int clientVersion = 123; private final MessageId messageId = new MessageId(getRandomId()); private final MessageId messageId1 = new MessageId(getRandomId()); private final MessageId messageId2 = new MessageId(getRandomId()); - private final Group group = getGroup(clientId, 123); + private final Group group = getGroup(clientId, clientVersion); private final GroupId groupId = group.getId(); private final long timestamp = System.currentTimeMillis(); private final byte[] raw = new byte[123]; @@ -85,8 +86,8 @@ public class ValidationManagerImplTest extends BrambleMockTestCase { public void setUp() { vm = new ValidationManagerImpl(db, dbExecutor, validationExecutor, messageFactory); - vm.registerMessageValidator(clientId, validator); - vm.registerIncomingMessageHook(clientId, hook); + vm.registerMessageValidator(clientId, clientVersion, validator); + vm.registerIncomingMessageHook(clientId, clientVersion, hook); } @Test diff --git a/briar-core/src/main/java/org/briarproject/briar/blog/BlogModule.java b/briar-core/src/main/java/org/briarproject/briar/blog/BlogModule.java index af39a8fcd..54f8b9614 100644 --- a/briar-core/src/main/java/org/briarproject/briar/blog/BlogModule.java +++ b/briar-core/src/main/java/org/briarproject/briar/blog/BlogModule.java @@ -18,7 +18,8 @@ import javax.inject.Singleton; import dagger.Module; import dagger.Provides; -import static org.briarproject.briar.blog.BlogManagerImpl.CLIENT_ID; +import static org.briarproject.briar.api.blog.BlogManager.CLIENT_ID; +import static org.briarproject.briar.api.blog.BlogManager.CLIENT_VERSION; @Module public class BlogModule { @@ -35,10 +36,10 @@ public class BlogModule { BlogManager provideBlogManager(BlogManagerImpl blogManager, LifecycleManager lifecycleManager, ContactManager contactManager, ValidationManager validationManager) { - lifecycleManager.registerClient(blogManager); contactManager.registerContactHook(blogManager); - validationManager.registerIncomingMessageHook(CLIENT_ID, blogManager); + validationManager.registerIncomingMessageHook(CLIENT_ID, CLIENT_VERSION, + blogManager); return blogManager; } @@ -60,12 +61,11 @@ public class BlogModule { MessageFactory messageFactory, BlogFactory blogFactory, ClientHelper clientHelper, MetadataEncoder metadataEncoder, Clock clock) { - BlogPostValidator validator = new BlogPostValidator(groupFactory, messageFactory, blogFactory, clientHelper, metadataEncoder, clock); - validationManager.registerMessageValidator(CLIENT_ID, validator); - + validationManager.registerMessageValidator(CLIENT_ID, CLIENT_VERSION, + validator); return validator; } diff --git a/briar-core/src/main/java/org/briarproject/briar/forum/ForumModule.java b/briar-core/src/main/java/org/briarproject/briar/forum/ForumModule.java index 9050dc272..a6732fadb 100644 --- a/briar-core/src/main/java/org/briarproject/briar/forum/ForumModule.java +++ b/briar-core/src/main/java/org/briarproject/briar/forum/ForumModule.java @@ -15,6 +15,7 @@ import dagger.Module; import dagger.Provides; import static org.briarproject.briar.api.forum.ForumManager.CLIENT_ID; +import static org.briarproject.briar.api.forum.ForumManager.CLIENT_VERSION; @Module public class ForumModule { @@ -30,7 +31,7 @@ public class ForumModule { @Singleton ForumManager provideForumManager(ForumManagerImpl forumManager, ValidationManager validationManager) { - validationManager.registerIncomingMessageHook(CLIENT_ID, + validationManager.registerIncomingMessageHook(CLIENT_ID, CLIENT_VERSION, forumManager); return forumManager; } @@ -53,7 +54,8 @@ public class ForumModule { MetadataEncoder metadataEncoder, Clock clock) { ForumPostValidator validator = new ForumPostValidator(clientHelper, metadataEncoder, clock); - validationManager.registerMessageValidator(CLIENT_ID, validator); + validationManager.registerMessageValidator(CLIENT_ID, CLIENT_VERSION, + validator); return validator; } diff --git a/briar-core/src/main/java/org/briarproject/briar/introduction/IntroductionModule.java b/briar-core/src/main/java/org/briarproject/briar/introduction/IntroductionModule.java index 24c649c5f..a41215ae2 100644 --- a/briar-core/src/main/java/org/briarproject/briar/introduction/IntroductionModule.java +++ b/briar-core/src/main/java/org/briarproject/briar/introduction/IntroductionModule.java @@ -16,6 +16,7 @@ import dagger.Module; import dagger.Provides; import static org.briarproject.briar.api.introduction.IntroductionManager.CLIENT_ID; +import static org.briarproject.briar.api.introduction.IntroductionManager.CLIENT_VERSION; @Module public class IntroductionModule { @@ -32,13 +33,11 @@ public class IntroductionModule { IntroductionValidator provideValidator(ValidationManager validationManager, MessageEncoder messageEncoder, MetadataEncoder metadataEncoder, ClientHelper clientHelper, Clock clock) { - IntroductionValidator introductionValidator = new IntroductionValidator(messageEncoder, clientHelper, metadataEncoder, clock); - validationManager.registerMessageValidator(CLIENT_ID, + validationManager.registerMessageValidator(CLIENT_ID, CLIENT_VERSION, introductionValidator); - return introductionValidator; } @@ -52,9 +51,8 @@ public class IntroductionModule { lifecycleManager.registerClient(introductionManager); contactManager.registerContactHook(introductionManager); validationManager.registerIncomingMessageHook(CLIENT_ID, - introductionManager); + CLIENT_VERSION, introductionManager); conversationManager.registerConversationClient(introductionManager); - return introductionManager; } diff --git a/briar-core/src/main/java/org/briarproject/briar/messaging/MessagingModule.java b/briar-core/src/main/java/org/briarproject/briar/messaging/MessagingModule.java index 492d3c4fa..c6c6bd1e6 100644 --- a/briar-core/src/main/java/org/briarproject/briar/messaging/MessagingModule.java +++ b/briar-core/src/main/java/org/briarproject/briar/messaging/MessagingModule.java @@ -16,7 +16,8 @@ import javax.inject.Singleton; import dagger.Module; import dagger.Provides; -import static org.briarproject.briar.messaging.MessagingManagerImpl.CLIENT_ID; +import static org.briarproject.briar.api.messaging.MessagingManager.CLIENT_ID; +import static org.briarproject.briar.api.messaging.MessagingManager.CLIENT_VERSION; @Module public class MessagingModule { @@ -43,7 +44,8 @@ public class MessagingModule { Clock clock) { PrivateMessageValidator validator = new PrivateMessageValidator( clientHelper, metadataEncoder, clock); - validationManager.registerMessageValidator(CLIENT_ID, validator); + validationManager.registerMessageValidator(CLIENT_ID, CLIENT_VERSION, + validator); return validator; } @@ -55,8 +57,8 @@ public class MessagingModule { MessagingManagerImpl messagingManager) { lifecycleManager.registerClient(messagingManager); contactManager.registerContactHook(messagingManager); - validationManager - .registerIncomingMessageHook(CLIENT_ID, messagingManager); + validationManager.registerIncomingMessageHook(CLIENT_ID, CLIENT_VERSION, + messagingManager); conversationManager.registerConversationClient(messagingManager); return messagingManager; } diff --git a/briar-core/src/main/java/org/briarproject/briar/privategroup/PrivateGroupModule.java b/briar-core/src/main/java/org/briarproject/briar/privategroup/PrivateGroupModule.java index 8b2bb3b66..c105df88d 100644 --- a/briar-core/src/main/java/org/briarproject/briar/privategroup/PrivateGroupModule.java +++ b/briar-core/src/main/java/org/briarproject/briar/privategroup/PrivateGroupModule.java @@ -16,6 +16,7 @@ import dagger.Module; import dagger.Provides; import static org.briarproject.briar.api.privategroup.PrivateGroupManager.CLIENT_ID; +import static org.briarproject.briar.api.privategroup.PrivateGroupManager.CLIENT_VERSION; @Module public class PrivateGroupModule { @@ -32,7 +33,8 @@ public class PrivateGroupModule { PrivateGroupManager provideGroupManager( PrivateGroupManagerImpl groupManager, ValidationManager validationManager) { - validationManager.registerIncomingMessageHook(CLIENT_ID, groupManager); + validationManager.registerIncomingMessageHook(CLIENT_ID, CLIENT_VERSION, + groupManager); return groupManager; } @@ -58,7 +60,8 @@ public class PrivateGroupModule { GroupMessageValidator validator = new GroupMessageValidator( privateGroupFactory, clientHelper, metadataEncoder, clock, groupInvitationFactory); - validationManager.registerMessageValidator(CLIENT_ID, validator); + validationManager.registerMessageValidator(CLIENT_ID, CLIENT_VERSION, + validator); return validator; } diff --git a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationModule.java b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationModule.java index fbd5efbc1..178cafdd0 100644 --- a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationModule.java +++ b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationModule.java @@ -19,6 +19,7 @@ import dagger.Module; import dagger.Provides; import static org.briarproject.briar.api.privategroup.invitation.GroupInvitationManager.CLIENT_ID; +import static org.briarproject.briar.api.privategroup.invitation.GroupInvitationManager.CLIENT_VERSION; @Module public class GroupInvitationModule { @@ -39,7 +40,7 @@ public class GroupInvitationModule { PrivateGroupManager privateGroupManager, ConversationManager conversationManager) { lifecycleManager.registerClient(groupInvitationManager); - validationManager.registerIncomingMessageHook(CLIENT_ID, + validationManager.registerIncomingMessageHook(CLIENT_ID, CLIENT_VERSION, groupInvitationManager); contactManager.registerContactHook(groupInvitationManager); privateGroupManager.registerPrivateGroupHook(groupInvitationManager); @@ -57,7 +58,8 @@ public class GroupInvitationModule { GroupInvitationValidator validator = new GroupInvitationValidator( clientHelper, metadataEncoder, clock, privateGroupFactory, messageEncoder); - validationManager.registerMessageValidator(CLIENT_ID, validator); + validationManager.registerMessageValidator(CLIENT_ID, CLIENT_VERSION, + validator); return validator; } diff --git a/briar-core/src/main/java/org/briarproject/briar/sharing/SharingModule.java b/briar-core/src/main/java/org/briarproject/briar/sharing/SharingModule.java index 64d4d0d37..4dfe78d8d 100644 --- a/briar-core/src/main/java/org/briarproject/briar/sharing/SharingModule.java +++ b/briar-core/src/main/java/org/briarproject/briar/sharing/SharingModule.java @@ -59,11 +59,11 @@ public class SharingModule { ValidationManager validationManager, MessageEncoder messageEncoder, ClientHelper clientHelper, MetadataEncoder metadataEncoder, Clock clock, BlogFactory blogFactory) { - BlogSharingValidator validator = - new BlogSharingValidator(messageEncoder, clientHelper, - metadataEncoder, clock, blogFactory); + BlogSharingValidator validator = new BlogSharingValidator( + messageEncoder, clientHelper, metadataEncoder, clock, + blogFactory); validationManager.registerMessageValidator(BlogSharingManager.CLIENT_ID, - validator); + BlogSharingManager.CLIENT_VERSION, validator); return validator; } @@ -77,10 +77,10 @@ public class SharingModule { lifecycleManager.registerClient(blogSharingManager); contactManager.registerContactHook(blogSharingManager); validationManager.registerIncomingMessageHook( - BlogSharingManager.CLIENT_ID, blogSharingManager); + BlogSharingManager.CLIENT_ID, BlogSharingManager.CLIENT_VERSION, + blogSharingManager); conversationManager.registerConversationClient(blogSharingManager); blogManager.registerRemoveBlogHook(blogSharingManager); - return blogSharingManager; } @@ -108,12 +108,12 @@ public class SharingModule { ValidationManager validationManager, MessageEncoder messageEncoder, ClientHelper clientHelper, MetadataEncoder metadataEncoder, Clock clock, ForumFactory forumFactory) { - ForumSharingValidator validator = - new ForumSharingValidator(messageEncoder, clientHelper, - metadataEncoder, clock, forumFactory); - validationManager - .registerMessageValidator(ForumSharingManager.CLIENT_ID, - validator); + ForumSharingValidator validator = new ForumSharingValidator( + messageEncoder, clientHelper, metadataEncoder, clock, + forumFactory); + validationManager.registerMessageValidator( + ForumSharingManager.CLIENT_ID, + ForumSharingManager.CLIENT_VERSION, validator); return validator; } @@ -124,14 +124,13 @@ public class SharingModule { ValidationManager validationManager, ConversationManager conversationManager, ForumManager forumManager, ForumSharingManagerImpl forumSharingManager) { - lifecycleManager.registerClient(forumSharingManager); contactManager.registerContactHook(forumSharingManager); validationManager.registerIncomingMessageHook( - ForumSharingManager.CLIENT_ID, forumSharingManager); + ForumSharingManager.CLIENT_ID, + ForumSharingManager.CLIENT_VERSION, forumSharingManager); conversationManager.registerConversationClient(forumSharingManager); forumManager.registerRemoveForumHook(forumSharingManager); - return forumSharingManager; } From 66137d4cfac1589046f8472dca3e460fdec580eb Mon Sep 17 00:00:00 2001 From: akwizgran Date: Fri, 13 Apr 2018 16:18:09 +0100 Subject: [PATCH 09/33] Add method for comparing visibilities. --- .../briarproject/bramble/api/sync/Group.java | 21 ++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/sync/Group.java b/bramble-api/src/main/java/org/briarproject/bramble/api/sync/Group.java index 40d2da6ff..d44423cbc 100644 --- a/bramble-api/src/main/java/org/briarproject/bramble/api/sync/Group.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/sync/Group.java @@ -5,9 +5,24 @@ import static org.briarproject.bramble.api.sync.SyncConstants.MAX_GROUP_DESCRIPT public class Group { public enum Visibility { - INVISIBLE, // The group is not visible - VISIBLE, // The group is visible but messages are not shared - SHARED // The group is visible and messages are shared + + INVISIBLE(0), // The group is not visible + VISIBLE(1), // The group is visible, messages are accepted but not sent + SHARED(2); // The group is visible, messages are accepted and sent + + private final int value; + + Visibility(int value) { + this.value = value; + } + + public int getValue() { + return value; + } + + public static Visibility min(Visibility a, Visibility b) { + return a.getValue() < b.getValue() ? a : b; + } } /** From cc6fed0298acf27c8fdde4e776eb2b46fa84dcdb Mon Sep 17 00:00:00 2001 From: akwizgran Date: Fri, 13 Apr 2018 16:27:30 +0100 Subject: [PATCH 10/33] Add javadocs. --- .../bramble/api/lifecycle/LifecycleManager.java | 9 ++++++--- .../bramble/api/sync/ClientVersioningManager.java | 10 ++++++++++ .../bramble/api/sync/ValidationManager.java | 10 +++++++--- 3 files changed, 23 insertions(+), 6 deletions(-) diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/lifecycle/LifecycleManager.java b/bramble-api/src/main/java/org/briarproject/bramble/api/lifecycle/LifecycleManager.java index 5a036a3b6..d3cd1bc24 100644 --- a/bramble-api/src/main/java/org/briarproject/bramble/api/lifecycle/LifecycleManager.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/lifecycle/LifecycleManager.java @@ -43,17 +43,20 @@ public interface LifecycleManager { } /** - * Registers a {@link Service} to be started and stopped. + * Registers a {@link Service} to be started and stopped. This method + * should be called before {@link #startServices(String)}. */ void registerService(Service s); /** - * Registers a {@link Client} to be started. + * Registers a {@link Client} to be started. This method should be called + * before {@link #startServices(String)}. */ void registerClient(Client c); /** - * Registers an {@link ExecutorService} to be shut down. + * Registers an {@link ExecutorService} to be shut down. This method + * should be called before {@link #startServices(String)}. */ void registerForShutdown(ExecutorService e); diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/sync/ClientVersioningManager.java b/bramble-api/src/main/java/org/briarproject/bramble/api/sync/ClientVersioningManager.java index a44923373..8a374b288 100644 --- a/bramble-api/src/main/java/org/briarproject/bramble/api/sync/ClientVersioningManager.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/sync/ClientVersioningManager.java @@ -3,6 +3,7 @@ package org.briarproject.bramble.api.sync; import org.briarproject.bramble.api.contact.Contact; import org.briarproject.bramble.api.db.DbException; import org.briarproject.bramble.api.db.Transaction; +import org.briarproject.bramble.api.lifecycle.LifecycleManager; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.sync.Group.Visibility; @@ -19,8 +20,17 @@ public interface ClientVersioningManager { */ int CLIENT_VERSION = 0; + /** + * Registers a client that will be advertised to contacts. This method + * should be called before {@link LifecycleManager#startServices(String)}. + */ void registerClient(ClientId clientId, int clientVersion); + /** + * Registers a hook that will be called when the visibility of the given + * client changes. This method should be called before + * {@link LifecycleManager#startServices(String)}. + */ void registerClientVersioningHook(ClientId clientId, int clientVersion, ClientVersioningHook hook); diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/sync/ValidationManager.java b/bramble-api/src/main/java/org/briarproject/bramble/api/sync/ValidationManager.java index bc73714b7..56571ad97 100644 --- a/bramble-api/src/main/java/org/briarproject/bramble/api/sync/ValidationManager.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/sync/ValidationManager.java @@ -3,6 +3,7 @@ package org.briarproject.bramble.api.sync; import org.briarproject.bramble.api.db.DbException; import org.briarproject.bramble.api.db.Metadata; import org.briarproject.bramble.api.db.Transaction; +import org.briarproject.bramble.api.lifecycle.LifecycleManager; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; /** @@ -33,14 +34,17 @@ public interface ValidationManager { } /** - * Sets the message validator for the given client. + * Registers the message validator for the given client. This method + * should be called before {@link LifecycleManager#startServices(String)}. */ void registerMessageValidator(ClientId c, int clientVersion, MessageValidator v); /** - * Sets the incoming message hook for the given client. The hook will be - * called once for each incoming message that passes validation. + * Registers the incoming message hook for the given client. The hook will + * be called once for each incoming message that passes validation. This + * method should be called before + * {@link LifecycleManager#startServices(String)}. */ void registerIncomingMessageHook(ClientId c, int clientVersion, IncomingMessageHook hook); From a9f77f0f9016229201babff098427991a9109f16 Mon Sep 17 00:00:00 2001 From: akwizgran Date: Fri, 13 Apr 2018 16:51:44 +0100 Subject: [PATCH 11/33] Add a method for getting a client's visibility. --- .../api/sync/ClientVersioningManager.java | 8 +++++++ .../sync/ClientVersioningManagerImpl.java | 22 +++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/sync/ClientVersioningManager.java b/bramble-api/src/main/java/org/briarproject/bramble/api/sync/ClientVersioningManager.java index 8a374b288..781ce4b4e 100644 --- a/bramble-api/src/main/java/org/briarproject/bramble/api/sync/ClientVersioningManager.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/sync/ClientVersioningManager.java @@ -1,6 +1,7 @@ package org.briarproject.bramble.api.sync; import org.briarproject.bramble.api.contact.Contact; +import org.briarproject.bramble.api.contact.ContactId; import org.briarproject.bramble.api.db.DbException; import org.briarproject.bramble.api.db.Transaction; import org.briarproject.bramble.api.lifecycle.LifecycleManager; @@ -34,6 +35,13 @@ public interface ClientVersioningManager { void registerClientVersioningHook(ClientId clientId, int clientVersion, ClientVersioningHook hook); + /** + * Returns the visibility of the given client with respect to the given + * contact. + */ + Visibility getClientVisibility(Transaction txn, ContactId contactId, + ClientId clientId, int clientVersion) throws DbException; + interface ClientVersioningHook { void onClientVisibilityChanging(Transaction txn, Contact c, diff --git a/bramble-core/src/main/java/org/briarproject/bramble/sync/ClientVersioningManagerImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/sync/ClientVersioningManagerImpl.java index 5594ac5e5..5f51690a3 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/sync/ClientVersioningManagerImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/sync/ClientVersioningManagerImpl.java @@ -89,6 +89,28 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, Client, hooks.put(new ClientVersion(clientId, clientVersion), hook); } + @Override + public Visibility getClientVisibility(Transaction txn, + ContactId contactId, ClientId clientId, int clientVersion) + throws DbException { + try { + Contact contact = db.getContact(txn, contactId); + Group g = getContactGroup(contact); + LatestUpdates latest = findLatestUpdates(txn, g.getId()); + if (latest.local == null) throw new DbException(); + if (latest.remote == null) return INVISIBLE; + Update localUpdate = loadUpdate(txn, latest.local.messageId); + Update remoteUpdate = loadUpdate(txn, latest.remote.messageId); + Map visibilities = + getVisibilities(localUpdate.states, remoteUpdate.states); + ClientVersion cv = new ClientVersion(clientId, clientVersion); + Visibility v = visibilities.get(cv); + return v == null ? INVISIBLE : v; + } catch (FormatException e) { + throw new DbException(e); + } + } + @Override public void createLocalState(Transaction txn) throws DbException { if (db.containsGroup(txn, localGroup.getId())) return; From cf396c2ce202288a5270d41520814e8796a0e777 Mon Sep 17 00:00:00 2001 From: akwizgran Date: Mon, 16 Apr 2018 14:50:52 +0100 Subject: [PATCH 12/33] Check whether contact group exists before using it. --- .../briarproject/bramble/sync/ClientVersioningManagerImpl.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/bramble-core/src/main/java/org/briarproject/bramble/sync/ClientVersioningManagerImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/sync/ClientVersioningManagerImpl.java index 5f51690a3..0e9d79989 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/sync/ClientVersioningManagerImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/sync/ClientVersioningManagerImpl.java @@ -96,6 +96,9 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, Client, try { Contact contact = db.getContact(txn, contactId); Group g = getContactGroup(contact); + // Contact may be in the process of being added or removed, so + // contact group may not exist + if (!db.containsGroup(txn, g.getId())) return INVISIBLE; LatestUpdates latest = findLatestUpdates(txn, g.getId()); if (latest.local == null) throw new DbException(); if (latest.remote == null) return INVISIBLE; From be309057cd02b0417e794e8d58bdf47473ac5ecf Mon Sep 17 00:00:00 2001 From: akwizgran Date: Mon, 16 Apr 2018 14:53:48 +0100 Subject: [PATCH 13/33] Use client versioning for blogs and forums. --- .../briar/sharing/BlogProtocolEngineImpl.java | 23 ++-- .../briar/sharing/BlogSharingManagerImpl.java | 18 +++- .../sharing/ForumProtocolEngineImpl.java | 23 ++-- .../sharing/ForumSharingManagerImpl.java | 19 +++- .../briar/sharing/ProtocolEngineImpl.java | 19 +++- .../briar/sharing/SessionEncoderImpl.java | 2 + .../briar/sharing/SessionParser.java | 2 + .../briar/sharing/SessionParserImpl.java | 6 ++ .../briar/sharing/SharingConstants.java | 1 + .../briar/sharing/SharingManagerImpl.java | 101 +++++++++++++++--- .../briar/sharing/SharingModule.java | 27 +++++ .../org/briarproject/briar/sharing/State.java | 21 +++- .../sharing/BlogSharingManagerImplTest.java | 21 ++-- .../briar/test/BriarIntegrationTest.java | 3 + 14 files changed, 239 insertions(+), 47 deletions(-) diff --git a/briar-core/src/main/java/org/briarproject/briar/sharing/BlogProtocolEngineImpl.java b/briar-core/src/main/java/org/briarproject/briar/sharing/BlogProtocolEngineImpl.java index 3083387b6..3ab61521d 100644 --- a/briar-core/src/main/java/org/briarproject/briar/sharing/BlogProtocolEngineImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/sharing/BlogProtocolEngineImpl.java @@ -9,6 +9,7 @@ import org.briarproject.bramble.api.db.Transaction; import org.briarproject.bramble.api.event.Event; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.sync.ClientId; +import org.briarproject.bramble.api.sync.ClientVersioningManager; import org.briarproject.bramble.api.sync.MessageId; import org.briarproject.bramble.api.system.Clock; import org.briarproject.briar.api.blog.Blog; @@ -22,6 +23,9 @@ import org.briarproject.briar.api.sharing.InvitationRequest; import javax.annotation.concurrent.Immutable; import javax.inject.Inject; +import static org.briarproject.briar.api.blog.BlogManager.CLIENT_ID; +import static org.briarproject.briar.api.blog.BlogManager.CLIENT_VERSION; + @Immutable @NotNullByDefault class BlogProtocolEngineImpl extends ProtocolEngineImpl { @@ -31,13 +35,14 @@ class BlogProtocolEngineImpl extends ProtocolEngineImpl { invitationFactory; @Inject - BlogProtocolEngineImpl(DatabaseComponent db, - ClientHelper clientHelper, MessageEncoder messageEncoder, - MessageParser messageParser, MessageTracker messageTracker, - Clock clock, BlogManager blogManager, + BlogProtocolEngineImpl(DatabaseComponent db, ClientHelper clientHelper, + ClientVersioningManager clientVersioningManager, + MessageEncoder messageEncoder, MessageParser messageParser, + MessageTracker messageTracker, Clock clock, BlogManager blogManager, InvitationFactory invitationFactory) { - super(db, clientHelper, messageEncoder, messageParser, messageTracker, - clock); + super(db, clientHelper, clientVersioningManager, messageEncoder, + messageParser, messageTracker, clock, CLIENT_ID, + CLIENT_VERSION); this.blogManager = blogManager; this.invitationFactory = invitationFactory; } @@ -46,8 +51,8 @@ class BlogProtocolEngineImpl extends ProtocolEngineImpl { Event getInvitationRequestReceivedEvent(InviteMessage m, ContactId contactId, boolean available, boolean canBeOpened) { InvitationRequest request = invitationFactory - .createInvitationRequest(false, false, true, false, m, - contactId, available, canBeOpened); + .createInvitationRequest(false, false, true, false, m, + contactId, available, canBeOpened); return new BlogInvitationRequestReceivedEvent(m.getShareable(), contactId, request); } @@ -74,7 +79,7 @@ class BlogProtocolEngineImpl extends ProtocolEngineImpl { @Override protected ClientId getShareableClientId() { - return BlogManager.CLIENT_ID; + return CLIENT_ID; } @Override diff --git a/briar-core/src/main/java/org/briarproject/briar/sharing/BlogSharingManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/sharing/BlogSharingManagerImpl.java index 7a92f1c5f..41554bcf4 100644 --- a/briar-core/src/main/java/org/briarproject/briar/sharing/BlogSharingManagerImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/sharing/BlogSharingManagerImpl.java @@ -12,6 +12,7 @@ import org.briarproject.bramble.api.identity.IdentityManager; import org.briarproject.bramble.api.identity.LocalAuthor; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.sync.ClientId; +import org.briarproject.bramble.api.sync.ClientVersioningManager; import org.briarproject.briar.api.blog.Blog; import org.briarproject.briar.api.blog.BlogInvitationResponse; import org.briarproject.briar.api.blog.BlogManager; @@ -32,6 +33,7 @@ class BlogSharingManagerImpl extends SharingManagerImpl @Inject BlogSharingManagerImpl(DatabaseComponent db, ClientHelper clientHelper, + ClientVersioningManager clientVersioningManager, MetadataParser metadataParser, MessageParser messageParser, SessionEncoder sessionEncoder, SessionParser sessionParser, MessageTracker messageTracker, @@ -39,9 +41,9 @@ class BlogSharingManagerImpl extends SharingManagerImpl ProtocolEngine engine, InvitationFactory invitationFactory, IdentityManager identityManager, BlogManager blogManager) { - super(db, clientHelper, metadataParser, messageParser, sessionEncoder, - sessionParser, messageTracker, contactGroupFactory, engine, - invitationFactory); + super(db, clientHelper, clientVersioningManager, metadataParser, + messageParser, sessionEncoder, sessionParser, messageTracker, + contactGroupFactory, engine, invitationFactory); this.identityManager = identityManager; this.blogManager = blogManager; } @@ -56,6 +58,16 @@ class BlogSharingManagerImpl extends SharingManagerImpl return CLIENT_VERSION; } + @Override + protected ClientId getShareableClientId() { + return BlogManager.CLIENT_ID; + } + + @Override + protected int getShareableClientVersion() { + return BlogManager.CLIENT_VERSION; + } + @Override public void addingContact(Transaction txn, Contact c) throws DbException { // Create a group to share with the contact diff --git a/briar-core/src/main/java/org/briarproject/briar/sharing/ForumProtocolEngineImpl.java b/briar-core/src/main/java/org/briarproject/briar/sharing/ForumProtocolEngineImpl.java index 9fb695e50..90ad6888d 100644 --- a/briar-core/src/main/java/org/briarproject/briar/sharing/ForumProtocolEngineImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/sharing/ForumProtocolEngineImpl.java @@ -9,6 +9,7 @@ import org.briarproject.bramble.api.db.Transaction; import org.briarproject.bramble.api.event.Event; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.sync.ClientId; +import org.briarproject.bramble.api.sync.ClientVersioningManager; import org.briarproject.bramble.api.sync.MessageId; import org.briarproject.bramble.api.system.Clock; import org.briarproject.briar.api.client.MessageTracker; @@ -22,6 +23,9 @@ import org.briarproject.briar.api.sharing.InvitationRequest; import javax.annotation.concurrent.Immutable; import javax.inject.Inject; +import static org.briarproject.briar.api.forum.ForumManager.CLIENT_ID; +import static org.briarproject.briar.api.forum.ForumManager.CLIENT_VERSION; + @Immutable @NotNullByDefault class ForumProtocolEngineImpl extends ProtocolEngineImpl { @@ -32,12 +36,15 @@ class ForumProtocolEngineImpl extends ProtocolEngineImpl { @Inject ForumProtocolEngineImpl(DatabaseComponent db, - ClientHelper clientHelper, MessageEncoder messageEncoder, - MessageParser messageParser, MessageTracker messageTracker, - Clock clock, ForumManager forumManager, + ClientHelper clientHelper, + ClientVersioningManager clientVersioningManager, + MessageEncoder messageEncoder, MessageParser messageParser, + MessageTracker messageTracker, Clock clock, + ForumManager forumManager, InvitationFactory invitationFactory) { - super(db, clientHelper, messageEncoder, messageParser, messageTracker, - clock); + super(db, clientHelper, clientVersioningManager, messageEncoder, + messageParser, messageTracker, clock, CLIENT_ID, + CLIENT_VERSION); this.forumManager = forumManager; this.invitationFactory = invitationFactory; } @@ -46,8 +53,8 @@ class ForumProtocolEngineImpl extends ProtocolEngineImpl { Event getInvitationRequestReceivedEvent(InviteMessage m, ContactId contactId, boolean available, boolean canBeOpened) { InvitationRequest request = invitationFactory - .createInvitationRequest(false, false, true, false, m, - contactId, available, canBeOpened); + .createInvitationRequest(false, false, true, false, m, + contactId, available, canBeOpened); return new ForumInvitationRequestReceivedEvent(m.getShareable(), contactId, request); } @@ -74,7 +81,7 @@ class ForumProtocolEngineImpl extends ProtocolEngineImpl { @Override protected ClientId getShareableClientId() { - return ForumManager.CLIENT_ID; + return CLIENT_ID; } @Override diff --git a/briar-core/src/main/java/org/briarproject/briar/sharing/ForumSharingManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/sharing/ForumSharingManagerImpl.java index 528743b9c..2f1ac5efb 100644 --- a/briar-core/src/main/java/org/briarproject/briar/sharing/ForumSharingManagerImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/sharing/ForumSharingManagerImpl.java @@ -8,9 +8,11 @@ import org.briarproject.bramble.api.db.DbException; import org.briarproject.bramble.api.db.Transaction; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.sync.ClientId; +import org.briarproject.bramble.api.sync.ClientVersioningManager; import org.briarproject.briar.api.client.MessageTracker; import org.briarproject.briar.api.forum.Forum; import org.briarproject.briar.api.forum.ForumInvitationResponse; +import org.briarproject.briar.api.forum.ForumManager; import org.briarproject.briar.api.forum.ForumManager.RemoveForumHook; import org.briarproject.briar.api.forum.ForumSharingManager; @@ -22,15 +24,16 @@ class ForumSharingManagerImpl extends SharingManagerImpl @Inject ForumSharingManagerImpl(DatabaseComponent db, ClientHelper clientHelper, + ClientVersioningManager clientVersioningManager, MetadataParser metadataParser, MessageParser messageParser, SessionEncoder sessionEncoder, SessionParser sessionParser, MessageTracker messageTracker, ContactGroupFactory contactGroupFactory, ProtocolEngine engine, InvitationFactory invitationFactory) { - super(db, clientHelper, metadataParser, messageParser, sessionEncoder, - sessionParser, messageTracker, contactGroupFactory, engine, - invitationFactory); + super(db, clientHelper, clientVersioningManager, metadataParser, + messageParser, sessionEncoder, sessionParser, messageTracker, + contactGroupFactory, engine, invitationFactory); } @Override @@ -43,6 +46,16 @@ class ForumSharingManagerImpl extends SharingManagerImpl return CLIENT_VERSION; } + @Override + protected ClientId getShareableClientId() { + return ForumManager.CLIENT_ID; + } + + @Override + protected int getShareableClientVersion() { + return ForumManager.CLIENT_VERSION; + } + @Override public void removingForum(Transaction txn, Forum f) throws DbException { removingShareable(txn, f); diff --git a/briar-core/src/main/java/org/briarproject/briar/sharing/ProtocolEngineImpl.java b/briar-core/src/main/java/org/briarproject/briar/sharing/ProtocolEngineImpl.java index e6a7976d5..6097c61aa 100644 --- a/briar-core/src/main/java/org/briarproject/briar/sharing/ProtocolEngineImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/sharing/ProtocolEngineImpl.java @@ -11,6 +11,7 @@ import org.briarproject.bramble.api.db.Transaction; import org.briarproject.bramble.api.event.Event; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.sync.ClientId; +import org.briarproject.bramble.api.sync.ClientVersioningManager; import org.briarproject.bramble.api.sync.Group; import org.briarproject.bramble.api.sync.Group.Visibility; import org.briarproject.bramble.api.sync.GroupId; @@ -52,19 +53,27 @@ abstract class ProtocolEngineImpl protected final ClientHelper clientHelper; protected final MessageParser messageParser; + private final ClientVersioningManager clientVersioningManager; private final MessageEncoder messageEncoder; private final MessageTracker messageTracker; private final Clock clock; + private final ClientId shareableClientId; + private final int shareableClientVersion; ProtocolEngineImpl(DatabaseComponent db, ClientHelper clientHelper, + ClientVersioningManager clientVersioningManager, MessageEncoder messageEncoder, MessageParser messageParser, - MessageTracker messageTracker, Clock clock) { + MessageTracker messageTracker, Clock clock, + ClientId shareableClientId, int shareableClientVersion) { this.db = db; this.clientHelper = clientHelper; + this.clientVersioningManager = clientVersioningManager; this.messageEncoder = messageEncoder; this.messageParser = messageParser; this.messageTracker = messageTracker; this.clock = clock; + this.shareableClientId = shareableClientId; + this.shareableClientVersion = shareableClientVersion; } @Override @@ -598,9 +607,13 @@ abstract class ProtocolEngineImpl } private void setShareableVisibility(Transaction txn, Session session, - Visibility v) throws DbException, FormatException { + Visibility preferred) throws DbException, FormatException { + // Apply min of preferred visibility and client's visibility ContactId contactId = getContactId(txn, session.getContactGroupId()); - db.setGroupVisibility(txn, contactId, session.getShareableId(), v); + Visibility client = clientVersioningManager.getClientVisibility(txn, + contactId, shareableClientId, shareableClientVersion); + Visibility min = Visibility.min(preferred, client); + db.setGroupVisibility(txn, contactId, session.getShareableId(), min); } private ContactId getContactId(Transaction txn, GroupId contactGroupId) diff --git a/briar-core/src/main/java/org/briarproject/briar/sharing/SessionEncoderImpl.java b/briar-core/src/main/java/org/briarproject/briar/sharing/SessionEncoderImpl.java index 7cf2bf139..641731a4a 100644 --- a/briar-core/src/main/java/org/briarproject/briar/sharing/SessionEncoderImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/sharing/SessionEncoderImpl.java @@ -9,6 +9,7 @@ import javax.inject.Inject; import static org.briarproject.bramble.api.data.BdfDictionary.NULL_VALUE; import static org.briarproject.briar.sharing.SharingConstants.SESSION_KEY_INVITE_TIMESTAMP; +import static org.briarproject.briar.sharing.SharingConstants.SESSION_KEY_IS_SESSION; import static org.briarproject.briar.sharing.SharingConstants.SESSION_KEY_LAST_LOCAL_MESSAGE_ID; import static org.briarproject.briar.sharing.SharingConstants.SESSION_KEY_LAST_REMOTE_MESSAGE_ID; import static org.briarproject.briar.sharing.SharingConstants.SESSION_KEY_LOCAL_TIMESTAMP; @@ -27,6 +28,7 @@ class SessionEncoderImpl implements SessionEncoder { @Override public BdfDictionary encodeSession(Session s) { BdfDictionary d = new BdfDictionary(); + d.put(SESSION_KEY_IS_SESSION, true); d.put(SESSION_KEY_SESSION_ID, s.getShareableId()); d.put(SESSION_KEY_SHAREABLE_ID, s.getShareableId()); MessageId lastLocalMessageId = s.getLastLocalMessageId(); diff --git a/briar-core/src/main/java/org/briarproject/briar/sharing/SessionParser.java b/briar-core/src/main/java/org/briarproject/briar/sharing/SessionParser.java index a82aed3ec..eec97355f 100644 --- a/briar-core/src/main/java/org/briarproject/briar/sharing/SessionParser.java +++ b/briar-core/src/main/java/org/briarproject/briar/sharing/SessionParser.java @@ -11,6 +11,8 @@ interface SessionParser { BdfDictionary getSessionQuery(SessionId s); + BdfDictionary getAllSessionsQuery(); + Session parseSession(GroupId contactGroupId, BdfDictionary d) throws FormatException; diff --git a/briar-core/src/main/java/org/briarproject/briar/sharing/SessionParserImpl.java b/briar-core/src/main/java/org/briarproject/briar/sharing/SessionParserImpl.java index 62d9c44b1..ee0c06f61 100644 --- a/briar-core/src/main/java/org/briarproject/briar/sharing/SessionParserImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/sharing/SessionParserImpl.java @@ -13,6 +13,7 @@ import javax.annotation.concurrent.Immutable; import javax.inject.Inject; import static org.briarproject.briar.sharing.SharingConstants.SESSION_KEY_INVITE_TIMESTAMP; +import static org.briarproject.briar.sharing.SharingConstants.SESSION_KEY_IS_SESSION; import static org.briarproject.briar.sharing.SharingConstants.SESSION_KEY_LAST_LOCAL_MESSAGE_ID; import static org.briarproject.briar.sharing.SharingConstants.SESSION_KEY_LAST_REMOTE_MESSAGE_ID; import static org.briarproject.briar.sharing.SharingConstants.SESSION_KEY_LOCAL_TIMESTAMP; @@ -33,6 +34,11 @@ class SessionParserImpl implements SessionParser { return BdfDictionary.of(new BdfEntry(SESSION_KEY_SESSION_ID, s)); } + @Override + public BdfDictionary getAllSessionsQuery() { + return BdfDictionary.of(new BdfEntry(SESSION_KEY_IS_SESSION, true)); + } + @Override public Session parseSession(GroupId contactGroupId, BdfDictionary d) throws FormatException { diff --git a/briar-core/src/main/java/org/briarproject/briar/sharing/SharingConstants.java b/briar-core/src/main/java/org/briarproject/briar/sharing/SharingConstants.java index d98099e27..f2522d1a9 100644 --- a/briar-core/src/main/java/org/briarproject/briar/sharing/SharingConstants.java +++ b/briar-core/src/main/java/org/briarproject/briar/sharing/SharingConstants.java @@ -18,6 +18,7 @@ interface SharingConstants { String MSG_KEY_INVITATION_ACCEPTED = "invitationAccepted"; // Session keys + String SESSION_KEY_IS_SESSION = "isSession"; String SESSION_KEY_STATE = "state"; String SESSION_KEY_SESSION_ID = "sessionId"; String SESSION_KEY_SHAREABLE_ID = "shareableId"; diff --git a/briar-core/src/main/java/org/briarproject/briar/sharing/SharingManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/sharing/SharingManagerImpl.java index 711e3875e..d249fc1f6 100644 --- a/briar-core/src/main/java/org/briarproject/briar/sharing/SharingManagerImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/sharing/SharingManagerImpl.java @@ -16,7 +16,10 @@ import org.briarproject.bramble.api.db.Transaction; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.sync.Client; import org.briarproject.bramble.api.sync.ClientId; +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.Message; import org.briarproject.bramble.api.sync.MessageId; @@ -37,9 +40,11 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; +import java.util.logging.Logger; import javax.annotation.Nullable; +import static java.util.logging.Level.INFO; import static org.briarproject.bramble.api.sync.Group.Visibility.SHARED; import static org.briarproject.briar.sharing.MessageType.ABORT; import static org.briarproject.briar.sharing.MessageType.ACCEPT; @@ -52,8 +57,13 @@ import static org.briarproject.briar.sharing.State.SHARING; @NotNullByDefault abstract class SharingManagerImpl extends ConversationClientImpl - implements SharingManager, Client, ContactHook { + implements SharingManager, Client, ContactHook, + ClientVersioningHook { + private static final Logger LOG = + Logger.getLogger(SharingManagerImpl.class.getName()); + + private final ClientVersioningManager clientVersioningManager; private final MessageParser messageParser; private final SessionEncoder sessionEncoder; private final SessionParser sessionParser; @@ -62,12 +72,14 @@ abstract class SharingManagerImpl private final InvitationFactory invitationFactory; SharingManagerImpl(DatabaseComponent db, ClientHelper clientHelper, + ClientVersioningManager clientVersioningManager, MetadataParser metadataParser, MessageParser messageParser, SessionEncoder sessionEncoder, SessionParser sessionParser, MessageTracker messageTracker, ContactGroupFactory contactGroupFactory, ProtocolEngine engine, InvitationFactory invitationFactory) { super(db, clientHelper, metadataParser, messageTracker); + this.clientVersioningManager = clientVersioningManager; this.messageParser = messageParser; this.sessionEncoder = sessionEncoder; this.sessionParser = sessionParser; @@ -80,6 +92,10 @@ abstract class SharingManagerImpl protected abstract int getClientVersion(); + protected abstract ClientId getShareableClientId(); + + protected abstract int getShareableClientVersion(); + @Override public void createLocalState(Transaction txn) throws DbException { // Create a local group to indicate that we've set this client up @@ -93,18 +109,22 @@ abstract class SharingManagerImpl @Override public void addingContact(Transaction txn, Contact c) throws DbException { + // Create a group to share with the contact + Group g = getContactGroup(c); + // Store the group and share it with the contact + db.addGroup(txn, g); + Visibility client = clientVersioningManager.getClientVisibility(txn, + c.getId(), getClientId(), getClientVersion()); + if (LOG.isLoggable(INFO)) + LOG.info("Applying visibility " + client + " to new contact group"); + db.setGroupVisibility(txn, c.getId(), g.getId(), client); + // Attach the contact ID to the group + BdfDictionary meta = new BdfDictionary(); + meta.put(GROUP_KEY_CONTACT_ID, c.getId().getInt()); try { - // Create a group to share with the contact - 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); - // Attach the contact ID to the group - BdfDictionary meta = new BdfDictionary(); - meta.put(GROUP_KEY_CONTACT_ID, c.getId().getInt()); clientHelper.mergeGroupMetadata(txn, g.getId(), meta); } catch (FormatException e) { - throw new DbException(e); + throw new AssertionError(e); } } @@ -156,9 +176,13 @@ abstract class SharingManagerImpl getSessionId(shareable.getId())); if (existingSession != null) return; - // Add and share the shareable with the contact + // Add the shareable db.addGroup(txn, shareable.getGroup()); - db.setGroupVisibility(txn, c.getId(), shareable.getId(), SHARED); + + // Apply the client's visibility + Visibility client = clientVersioningManager.getClientVisibility(txn, + c.getId(), getShareableClientId(), getShareableClientVersion()); + db.setGroupVisibility(txn, c.getId(), shareable.getId(), client); // Initialize session in sharing state Session session = new Session(SHARING, contactGroupId, @@ -420,6 +444,7 @@ abstract class SharingManagerImpl Transaction txn = db.startTransaction(true); try { for (Contact c : db.getContacts(txn)) { + // FIXME: Check the session for the preferred visibility? if (db.getGroupVisibility(txn, c.getId(), g) == SHARED) contacts.add(c); } @@ -480,6 +505,58 @@ abstract class SharingManagerImpl } } + @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); + } + + ClientVersioningHook getShareableClientVersioningHook() { + return this::onShareableClientVisibilityChanging; + } + + // Versioning hook for the shareable client + private void onShareableClientVisibilityChanging(Transaction txn, Contact c, + Visibility client) throws DbException { + try { + Collection shareables = db.getGroups(txn, + getShareableClientId(), getShareableClientVersion()); + Map m = getPreferredVisibilities(txn, c); + for (Group g : shareables) { + Visibility preferred = m.get(g.getId()); + if (preferred == null) continue; // No session for this group + // Apply min of preferred visibility and client's visibility + Visibility min = Visibility.min(preferred, client); + if (LOG.isLoggable(INFO)) { + LOG.info("Applying visibility " + min + + " to shareable, preferred " + preferred + + ", client" + client); + } + db.setGroupVisibility(txn, c.getId(), g.getId(), min); + } + } catch (FormatException e) { + throw new DbException(e); + } + } + + private Map getPreferredVisibilities(Transaction txn, + Contact c) throws DbException, FormatException { + GroupId contactGroupId = getContactGroup(c).getId(); + BdfDictionary query = sessionParser.getAllSessionsQuery(); + Map results = clientHelper + .getMessageMetadataAsDictionary(txn, contactGroupId, query); + Map m = new HashMap<>(); + for (BdfDictionary d : results.values()) { + Session s = sessionParser.parseSession(contactGroupId, d); + m.put(s.getShareableId(), s.getState().getVisibility()); + } + return m; + } + private static class StoredSession { private final MessageId storageId; diff --git a/briar-core/src/main/java/org/briarproject/briar/sharing/SharingModule.java b/briar-core/src/main/java/org/briarproject/briar/sharing/SharingModule.java index 4dfe78d8d..b31bfe68c 100644 --- a/briar-core/src/main/java/org/briarproject/briar/sharing/SharingModule.java +++ b/briar-core/src/main/java/org/briarproject/briar/sharing/SharingModule.java @@ -4,6 +4,7 @@ import org.briarproject.bramble.api.client.ClientHelper; 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.sync.ClientVersioningManager; import org.briarproject.bramble.api.sync.ValidationManager; import org.briarproject.bramble.api.system.Clock; import org.briarproject.briar.api.blog.Blog; @@ -73,6 +74,7 @@ public class SharingModule { LifecycleManager lifecycleManager, ContactManager contactManager, ValidationManager validationManager, ConversationManager conversationManager, BlogManager blogManager, + ClientVersioningManager clientVersioningManager, BlogSharingManagerImpl blogSharingManager) { lifecycleManager.registerClient(blogSharingManager); contactManager.registerContactHook(blogSharingManager); @@ -81,6 +83,18 @@ public class SharingModule { blogSharingManager); conversationManager.registerConversationClient(blogSharingManager); blogManager.registerRemoveBlogHook(blogSharingManager); + clientVersioningManager.registerClient(BlogSharingManager.CLIENT_ID, + BlogSharingManager.CLIENT_VERSION); + clientVersioningManager.registerClientVersioningHook( + BlogSharingManager.CLIENT_ID, BlogSharingManager.CLIENT_VERSION, + blogSharingManager); + // The blog sharing manager handles client visibility changes for the + // blog manager + clientVersioningManager.registerClient(BlogManager.CLIENT_ID, + BlogManager.CLIENT_VERSION); + clientVersioningManager.registerClientVersioningHook( + BlogManager.CLIENT_ID, BlogManager.CLIENT_VERSION, + blogSharingManager.getShareableClientVersioningHook()); return blogSharingManager; } @@ -123,6 +137,7 @@ public class SharingModule { LifecycleManager lifecycleManager, ContactManager contactManager, ValidationManager validationManager, ConversationManager conversationManager, ForumManager forumManager, + ClientVersioningManager clientVersioningManager, ForumSharingManagerImpl forumSharingManager) { lifecycleManager.registerClient(forumSharingManager); contactManager.registerContactHook(forumSharingManager); @@ -131,6 +146,18 @@ public class SharingModule { ForumSharingManager.CLIENT_VERSION, forumSharingManager); conversationManager.registerConversationClient(forumSharingManager); forumManager.registerRemoveForumHook(forumSharingManager); + clientVersioningManager.registerClient(ForumSharingManager.CLIENT_ID, + ForumSharingManager.CLIENT_VERSION); + clientVersioningManager.registerClientVersioningHook( + ForumSharingManager.CLIENT_ID, + ForumSharingManager.CLIENT_VERSION, forumSharingManager); + // The forum sharing manager handles client visibility changes for the + // forum manager + clientVersioningManager.registerClient(ForumManager.CLIENT_ID, + ForumManager.CLIENT_VERSION); + clientVersioningManager.registerClientVersioningHook( + ForumManager.CLIENT_ID, ForumManager.CLIENT_VERSION, + forumSharingManager.getShareableClientVersioningHook()); return forumSharingManager; } diff --git a/briar-core/src/main/java/org/briarproject/briar/sharing/State.java b/briar-core/src/main/java/org/briarproject/briar/sharing/State.java index ade7d7a24..2d0ed9766 100644 --- a/briar-core/src/main/java/org/briarproject/briar/sharing/State.java +++ b/briar-core/src/main/java/org/briarproject/briar/sharing/State.java @@ -2,26 +2,41 @@ package org.briarproject.briar.sharing; import org.briarproject.bramble.api.FormatException; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; +import org.briarproject.bramble.api.sync.Group.Visibility; import javax.annotation.concurrent.Immutable; +import static org.briarproject.bramble.api.sync.Group.Visibility.INVISIBLE; +import static org.briarproject.bramble.api.sync.Group.Visibility.SHARED; +import static org.briarproject.bramble.api.sync.Group.Visibility.VISIBLE; + @Immutable @NotNullByDefault enum State { - START(0), LOCAL_INVITED(1), REMOTE_INVITED(2), SHARING(3), LOCAL_LEFT(4), - REMOTE_HANGING(5); + START(0, INVISIBLE), + LOCAL_INVITED(1, INVISIBLE), + REMOTE_INVITED(2, VISIBLE), + SHARING(3, SHARED), + LOCAL_LEFT(4, INVISIBLE), + REMOTE_HANGING(5, INVISIBLE); private final int value; + private final Visibility visibility; - State(int value) { + State(int value, Visibility visibility) { this.value = value; + this.visibility = visibility; } public int getValue() { return value; } + public Visibility getVisibility() { + return visibility; + } + public boolean canInvite() { return this == START; } diff --git a/briar-core/src/test/java/org/briarproject/briar/sharing/BlogSharingManagerImplTest.java b/briar-core/src/test/java/org/briarproject/briar/sharing/BlogSharingManagerImplTest.java index 8a7a3775f..5b109533c 100644 --- a/briar-core/src/test/java/org/briarproject/briar/sharing/BlogSharingManagerImplTest.java +++ b/briar-core/src/test/java/org/briarproject/briar/sharing/BlogSharingManagerImplTest.java @@ -14,6 +14,7 @@ import org.briarproject.bramble.api.db.Transaction; import org.briarproject.bramble.api.identity.Author; import org.briarproject.bramble.api.identity.IdentityManager; import org.briarproject.bramble.api.identity.LocalAuthor; +import org.briarproject.bramble.api.sync.ClientVersioningManager; import org.briarproject.bramble.api.sync.Group; import org.briarproject.bramble.api.sync.Message; import org.briarproject.bramble.api.sync.MessageId; @@ -24,7 +25,6 @@ import org.briarproject.briar.api.blog.BlogManager; import org.briarproject.briar.api.client.MessageTracker; import org.briarproject.briar.api.client.SessionId; import org.jmock.Expectations; -import org.jmock.Mockery; import org.junit.Test; import java.util.Collection; @@ -44,12 +44,13 @@ import static org.briarproject.briar.sharing.SharingConstants.GROUP_KEY_CONTACT_ public class BlogSharingManagerImplTest extends BrambleMockTestCase { - private final Mockery context = new Mockery(); private final BlogSharingManagerImpl blogSharingManager; private final DatabaseComponent db = context.mock(DatabaseComponent.class); private final IdentityManager identityManager = context.mock(IdentityManager.class); private final ClientHelper clientHelper = context.mock(ClientHelper.class); + private final ClientVersioningManager clientVersioningManager = + context.mock(ClientVersioningManager.class); private final SessionEncoder sessionEncoder = context.mock(SessionEncoder.class); private final SessionParser sessionParser = @@ -80,14 +81,15 @@ public class BlogSharingManagerImplTest extends BrambleMockTestCase { @SuppressWarnings("unchecked") public BlogSharingManagerImplTest() { MetadataParser metadataParser = context.mock(MetadataParser.class); - MessageTracker messageTracker = context.mock(MessageTracker.class); MessageParser messageParser = context.mock(MessageParser.class); + MessageTracker messageTracker = context.mock(MessageTracker.class); InvitationFactory invitationFactory = context.mock(InvitationFactory.class); blogSharingManager = new BlogSharingManagerImpl(db, clientHelper, - metadataParser, messageParser, sessionEncoder, sessionParser, - messageTracker, contactGroupFactory, engine, invitationFactory, - identityManager, blogManager); + clientVersioningManager, metadataParser, messageParser, + sessionEncoder, sessionParser, messageTracker, + contactGroupFactory, engine, invitationFactory, identityManager, + blogManager); } @Test @@ -124,6 +126,9 @@ public class BlogSharingManagerImplTest extends BrambleMockTestCase { CLIENT_VERSION, contact); will(returnValue(contactGroup)); oneOf(db).addGroup(txn, contactGroup); + oneOf(clientVersioningManager).getClientVisibility(txn, contactId, + CLIENT_ID, CLIENT_VERSION); + will(returnValue(SHARED)); oneOf(db).setGroupVisibility(txn, contactId, contactGroup.getId(), SHARED); // Attach the contact ID to the group @@ -207,6 +212,10 @@ public class BlogSharingManagerImplTest extends BrambleMockTestCase { will(returnValue(sessions)); if (sessions.size() == 0) { oneOf(db).addGroup(txn, blog.getGroup()); + oneOf(clientVersioningManager).getClientVisibility(txn, + contactId, BlogManager.CLIENT_ID, + BlogManager.CLIENT_VERSION); + will(returnValue(SHARED)); oneOf(db).setGroupVisibility(txn, contact.getId(), blog.getGroup().getId(), SHARED); oneOf(clientHelper) diff --git a/briar-core/src/test/java/org/briarproject/briar/test/BriarIntegrationTest.java b/briar-core/src/test/java/org/briarproject/briar/test/BriarIntegrationTest.java index ebd3f2238..bb955313b 100644 --- a/briar-core/src/test/java/org/briarproject/briar/test/BriarIntegrationTest.java +++ b/briar-core/src/test/java/org/briarproject/briar/test/BriarIntegrationTest.java @@ -256,6 +256,8 @@ public abstract class BriarIntegrationTest Date: Mon, 16 Apr 2018 14:55:02 +0100 Subject: [PATCH 14/33] Use client versioning for private groups. --- .../invitation/AbstractProtocolEngine.java | 16 +++- .../invitation/CreatorProtocolEngine.java | 8 +- .../privategroup/invitation/CreatorState.java | 20 +++- .../invitation/GroupInvitationConstants.java | 1 + .../GroupInvitationManagerImpl.java | 91 ++++++++++++++++++- .../invitation/GroupInvitationModule.java | 15 ++- .../invitation/InviteeProtocolEngine.java | 14 ++- .../privategroup/invitation/InviteeState.java | 23 ++++- .../invitation/PeerProtocolEngine.java | 8 +- .../privategroup/invitation/PeerState.java | 23 ++++- .../invitation/ProtocolEngineFactoryImpl.java | 13 ++- .../invitation/SessionEncoderImpl.java | 2 + .../invitation/SessionParser.java | 2 + .../invitation/SessionParserImpl.java | 6 ++ .../briar/privategroup/invitation/State.java | 4 + .../AbstractProtocolEngineTest.java | 10 +- .../invitation/CreatorProtocolEngineTest.java | 7 +- .../GroupInvitationManagerImplTest.java | 16 +++- .../invitation/InviteeProtocolEngineTest.java | 9 +- .../invitation/PeerProtocolEngineTest.java | 7 +- 20 files changed, 251 insertions(+), 44 deletions(-) diff --git a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/AbstractProtocolEngine.java b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/AbstractProtocolEngine.java index c68f7b662..c37c26725 100644 --- a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/AbstractProtocolEngine.java +++ b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/AbstractProtocolEngine.java @@ -10,6 +10,7 @@ import org.briarproject.bramble.api.db.Transaction; import org.briarproject.bramble.api.identity.IdentityManager; import org.briarproject.bramble.api.identity.LocalAuthor; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; +import org.briarproject.bramble.api.sync.ClientVersioningManager; import org.briarproject.bramble.api.sync.Group; import org.briarproject.bramble.api.sync.Group.Visibility; import org.briarproject.bramble.api.sync.GroupId; @@ -28,6 +29,8 @@ import java.util.Map; import javax.annotation.Nullable; import javax.annotation.concurrent.Immutable; +import static org.briarproject.briar.api.privategroup.PrivateGroupManager.CLIENT_ID; +import static org.briarproject.briar.api.privategroup.PrivateGroupManager.CLIENT_VERSION; import static org.briarproject.briar.privategroup.invitation.GroupInvitationConstants.GROUP_KEY_CONTACT_ID; import static org.briarproject.briar.privategroup.invitation.MessageType.ABORT; import static org.briarproject.briar.privategroup.invitation.MessageType.INVITE; @@ -45,6 +48,7 @@ abstract class AbstractProtocolEngine protected final PrivateGroupFactory privateGroupFactory; protected final MessageTracker messageTracker; + private final ClientVersioningManager clientVersioningManager; private final GroupMessageFactory groupMessageFactory; private final IdentityManager identityManager; private final MessageParser messageParser; @@ -52,6 +56,7 @@ abstract class AbstractProtocolEngine private final Clock clock; AbstractProtocolEngine(DatabaseComponent db, ClientHelper clientHelper, + ClientVersioningManager clientVersioningManager, PrivateGroupManager privateGroupManager, PrivateGroupFactory privateGroupFactory, GroupMessageFactory groupMessageFactory, @@ -60,6 +65,7 @@ abstract class AbstractProtocolEngine Clock clock) { this.db = db; this.clientHelper = clientHelper; + this.clientVersioningManager = clientVersioningManager; this.privateGroupManager = privateGroupManager; this.privateGroupFactory = privateGroupFactory; this.groupMessageFactory = groupMessageFactory; @@ -90,10 +96,14 @@ abstract class AbstractProtocolEngine return expected != null && dependency.equals(expected); } - void setPrivateGroupVisibility(Transaction txn, S session, Visibility v) - throws DbException, FormatException { + void setPrivateGroupVisibility(Transaction txn, S session, + Visibility preferred) throws DbException, FormatException { + // Apply min of preferred visibility and client's visibility ContactId contactId = getContactId(txn, session.getContactGroupId()); - db.setGroupVisibility(txn, contactId, session.getPrivateGroupId(), v); + Visibility client = clientVersioningManager.getClientVisibility(txn, + contactId, CLIENT_ID, CLIENT_VERSION); + Visibility min = Visibility.min(preferred, client); + db.setGroupVisibility(txn, contactId, session.getPrivateGroupId(), min); } Message sendInviteMessage(Transaction txn, S session, diff --git a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/CreatorProtocolEngine.java b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/CreatorProtocolEngine.java index ec5315a6d..62030a09b 100644 --- a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/CreatorProtocolEngine.java +++ b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/CreatorProtocolEngine.java @@ -8,6 +8,7 @@ import org.briarproject.bramble.api.db.DbException; import org.briarproject.bramble.api.db.Transaction; import org.briarproject.bramble.api.identity.IdentityManager; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; +import org.briarproject.bramble.api.sync.ClientVersioningManager; import org.briarproject.bramble.api.sync.Message; import org.briarproject.bramble.api.system.Clock; import org.briarproject.briar.api.client.MessageTracker; @@ -36,15 +37,16 @@ import static org.briarproject.briar.privategroup.invitation.CreatorState.START; class CreatorProtocolEngine extends AbstractProtocolEngine { CreatorProtocolEngine(DatabaseComponent db, ClientHelper clientHelper, + ClientVersioningManager clientVersioningManager, PrivateGroupManager privateGroupManager, PrivateGroupFactory privateGroupFactory, GroupMessageFactory groupMessageFactory, IdentityManager identityManager, MessageParser messageParser, MessageEncoder messageEncoder, MessageTracker messageTracker, Clock clock) { - super(db, clientHelper, privateGroupManager, privateGroupFactory, - groupMessageFactory, identityManager, messageParser, - messageEncoder, messageTracker, clock); + super(db, clientHelper, clientVersioningManager, privateGroupManager, + privateGroupFactory, groupMessageFactory, identityManager, + messageParser, messageEncoder, messageTracker, clock); } @Override diff --git a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/CreatorState.java b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/CreatorState.java index 4afe89c4d..6fe69a08c 100644 --- a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/CreatorState.java +++ b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/CreatorState.java @@ -2,19 +2,30 @@ package org.briarproject.briar.privategroup.invitation; import org.briarproject.bramble.api.FormatException; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; +import org.briarproject.bramble.api.sync.Group.Visibility; import javax.annotation.concurrent.Immutable; +import static org.briarproject.bramble.api.sync.Group.Visibility.INVISIBLE; +import static org.briarproject.bramble.api.sync.Group.Visibility.SHARED; + @Immutable @NotNullByDefault enum CreatorState implements State { - START(0), INVITED(1), JOINED(2), LEFT(3), DISSOLVED(4), ERROR(5); + START(0, INVISIBLE), + INVITED(1, INVISIBLE), + JOINED(2, SHARED), + LEFT(3, INVISIBLE), + DISSOLVED(4, INVISIBLE), + ERROR(5, INVISIBLE); private final int value; + private final Visibility visibility; - CreatorState(int value) { + CreatorState(int value, Visibility visibility) { this.value = value; + this.visibility = visibility; } @Override @@ -22,6 +33,11 @@ enum CreatorState implements State { return value; } + @Override + public Visibility getVisibility() { + return visibility; + } + static CreatorState fromValue(int value) throws FormatException { for (CreatorState s : values()) if (s.value == value) return s; throw new FormatException(); diff --git a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationConstants.java b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationConstants.java index a9a6ef092..90c0fcd29 100644 --- a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationConstants.java +++ b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationConstants.java @@ -15,6 +15,7 @@ interface GroupInvitationConstants { String MSG_KEY_INVITATION_ACCEPTED = "invitationAccepted"; // Session keys + String SESSION_KEY_IS_SESSION = "isSession"; String SESSION_KEY_SESSION_ID = "sessionId"; String SESSION_KEY_PRIVATE_GROUP_ID = "privateGroupId"; String SESSION_KEY_LAST_LOCAL_MESSAGE_ID = "lastLocalMessageId"; diff --git a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImpl.java index 5ae9a3f81..6275fad70 100644 --- a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImpl.java @@ -16,7 +16,10 @@ import org.briarproject.bramble.api.db.Transaction; import org.briarproject.bramble.api.identity.Author; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; 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.Message; import org.briarproject.bramble.api.sync.MessageId; @@ -36,15 +39,17 @@ import org.briarproject.briar.client.ConversationClientImpl; import java.util.ArrayList; import java.util.Collection; +import java.util.HashMap; import java.util.List; 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; import static org.briarproject.briar.privategroup.invitation.CreatorState.START; import static org.briarproject.briar.privategroup.invitation.GroupInvitationConstants.GROUP_KEY_CONTACT_ID; import static org.briarproject.briar.privategroup.invitation.MessageType.ABORT; @@ -59,8 +64,12 @@ import static org.briarproject.briar.privategroup.invitation.Role.PEER; @NotNullByDefault class GroupInvitationManagerImpl extends ConversationClientImpl implements GroupInvitationManager, Client, ContactHook, - PrivateGroupHook { + PrivateGroupHook, ClientVersioningHook { + private static final Logger LOG = + Logger.getLogger(GroupInvitationManagerImpl.class.getName()); + + private final ClientVersioningManager clientVersioningManager; private final ContactGroupFactory contactGroupFactory; private final PrivateGroupFactory privateGroupFactory; private final PrivateGroupManager privateGroupManager; @@ -73,8 +82,9 @@ class GroupInvitationManagerImpl extends ConversationClientImpl @Inject GroupInvitationManagerImpl(DatabaseComponent db, - ClientHelper clientHelper, MetadataParser metadataParser, - MessageTracker messageTracker, + ClientHelper clientHelper, + ClientVersioningManager clientVersioningManager, + MetadataParser metadataParser, MessageTracker messageTracker, ContactGroupFactory contactGroupFactory, PrivateGroupFactory privateGroupFactory, PrivateGroupManager privateGroupManager, @@ -82,6 +92,7 @@ class GroupInvitationManagerImpl extends ConversationClientImpl SessionEncoder sessionEncoder, ProtocolEngineFactory engineFactory) { super(db, clientHelper, metadataParser, messageTracker); + this.clientVersioningManager = clientVersioningManager; this.contactGroupFactory = contactGroupFactory; this.privateGroupFactory = privateGroupFactory; this.privateGroupManager = privateGroupManager; @@ -110,7 +121,11 @@ class GroupInvitationManagerImpl extends ConversationClientImpl 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); + 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); // Attach the contact ID to the group BdfDictionary meta = new BdfDictionary(); meta.put(GROUP_KEY_CONTACT_ID, c.getId().getInt()); @@ -565,6 +580,72 @@ class GroupInvitationManagerImpl extends ConversationClientImpl } } + @Override + public void onClientVisibilityChanging(Transaction txn, Contact c, + Visibility v) throws DbException { + // Apply the client's visibility to the contact group + if (LOG.isLoggable(INFO)) + LOG.info("Applying visibility " + v + " to contact group"); + Group g = getContactGroup(c); + db.setGroupVisibility(txn, c.getId(), g.getId(), v); + } + + ClientVersioningHook getPrivateGroupClientVersioningHook() { + return this::onPrivateGroupClientVisibilityChanging; + } + + private void onPrivateGroupClientVisibilityChanging(Transaction txn, + Contact c, Visibility client) throws DbException { + try { + Collection shareables = + db.getGroups(txn, PrivateGroupManager.CLIENT_ID, + PrivateGroupManager.CLIENT_VERSION); + Map m = getPreferredVisibilities(txn, c); + for (Group g : shareables) { + Visibility preferred = m.get(g.getId()); + if (preferred == null) continue; // No session for this group + // Apply min of preferred visibility and client's visibility + Visibility min = Visibility.min(preferred, client); + if (LOG.isLoggable(INFO)) { + LOG.info("Applying visibility " + min + + " to private group, preferred " + preferred + + ", client " + client); + } + db.setGroupVisibility(txn, c.getId(), g.getId(), min); + } + } catch (FormatException e) { + throw new DbException(e); + } + } + + private Map getPreferredVisibilities(Transaction txn, + Contact c) throws DbException, FormatException { + GroupId contactGroupId = getContactGroup(c).getId(); + BdfDictionary query = sessionParser.getAllSessionsQuery(); + Map results = clientHelper + .getMessageMetadataAsDictionary(txn, contactGroupId, query); + Map m = new HashMap<>(); + for (BdfDictionary d : results.values()) { + Role role = sessionParser.getRole(d); + if (role == CREATOR) { + CreatorSession s = + sessionParser.parseCreatorSession(contactGroupId, d); + m.put(s.getPrivateGroupId(), s.getState().getVisibility()); + } else if (role == INVITEE) { + InviteeSession s = + sessionParser.parseInviteeSession(contactGroupId, d); + m.put(s.getPrivateGroupId(), s.getState().getVisibility()); + } else if (role == PEER) { + PeerSession s = + sessionParser.parsePeerSession(contactGroupId, d); + m.put(s.getPrivateGroupId(), s.getState().getVisibility()); + } else { + throw new AssertionError(); + } + } + return m; + } + private static class StoredSession { private final MessageId storageId; diff --git a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationModule.java b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationModule.java index 178cafdd0..f02287574 100644 --- a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationModule.java +++ b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationModule.java @@ -4,6 +4,7 @@ import org.briarproject.bramble.api.client.ClientHelper; 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.sync.ClientVersioningManager; import org.briarproject.bramble.api.sync.ValidationManager; import org.briarproject.bramble.api.system.Clock; import org.briarproject.briar.api.messaging.ConversationManager; @@ -38,13 +39,25 @@ public class GroupInvitationModule { LifecycleManager lifecycleManager, ValidationManager validationManager, ContactManager contactManager, PrivateGroupManager privateGroupManager, - ConversationManager conversationManager) { + ConversationManager conversationManager, + ClientVersioningManager clientVersioningManager) { lifecycleManager.registerClient(groupInvitationManager); validationManager.registerIncomingMessageHook(CLIENT_ID, CLIENT_VERSION, groupInvitationManager); contactManager.registerContactHook(groupInvitationManager); privateGroupManager.registerPrivateGroupHook(groupInvitationManager); conversationManager.registerConversationClient(groupInvitationManager); + clientVersioningManager.registerClient(CLIENT_ID, CLIENT_VERSION); + clientVersioningManager.registerClientVersioningHook(CLIENT_ID, + CLIENT_VERSION, groupInvitationManager); + // The group invitation manager handles client visibility changes for + // the private group manager + clientVersioningManager.registerClient(PrivateGroupManager.CLIENT_ID, + PrivateGroupManager.CLIENT_VERSION); + clientVersioningManager.registerClientVersioningHook( + PrivateGroupManager.CLIENT_ID, + PrivateGroupManager.CLIENT_VERSION, + groupInvitationManager.getPrivateGroupClientVersioningHook()); return groupInvitationManager; } diff --git a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/InviteeProtocolEngine.java b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/InviteeProtocolEngine.java index f181d1f77..064c1d593 100644 --- a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/InviteeProtocolEngine.java +++ b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/InviteeProtocolEngine.java @@ -9,6 +9,7 @@ import org.briarproject.bramble.api.db.Transaction; import org.briarproject.bramble.api.identity.Author; import org.briarproject.bramble.api.identity.IdentityManager; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; +import org.briarproject.bramble.api.sync.ClientVersioningManager; import org.briarproject.bramble.api.sync.Message; import org.briarproject.bramble.api.sync.MessageId; import org.briarproject.bramble.api.system.Clock; @@ -41,15 +42,16 @@ import static org.briarproject.briar.privategroup.invitation.InviteeState.START; class InviteeProtocolEngine extends AbstractProtocolEngine { InviteeProtocolEngine(DatabaseComponent db, ClientHelper clientHelper, + ClientVersioningManager clientVersioningManager, PrivateGroupManager privateGroupManager, PrivateGroupFactory privateGroupFactory, GroupMessageFactory groupMessageFactory, IdentityManager identityManager, MessageParser messageParser, MessageEncoder messageEncoder, MessageTracker messageTracker, Clock clock) { - super(db, clientHelper, privateGroupManager, privateGroupFactory, - groupMessageFactory, identityManager, messageParser, - messageEncoder, messageTracker, clock); + super(db, clientHelper, clientVersioningManager, privateGroupManager, + privateGroupFactory, groupMessageFactory, identityManager, + messageParser, messageEncoder, messageTracker, clock); } @Override @@ -212,6 +214,12 @@ class InviteeProtocolEngine extends AbstractProtocolEngine { throws DbException { // Send a LEAVE message Message sent = sendLeaveMessage(txn, s, false); + try { + // Make the private group invisible to the contact + setPrivateGroupVisibility(txn, s, INVISIBLE); + } catch (FormatException e) { + throw new DbException(e); // Invalid group metadata + } // Move to the LEFT state return new InviteeSession(s.getContactGroupId(), s.getPrivateGroupId(), sent.getId(), s.getLastRemoteMessageId(), sent.getTimestamp(), diff --git a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/InviteeState.java b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/InviteeState.java index 7fa69e6af..f347ca061 100644 --- a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/InviteeState.java +++ b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/InviteeState.java @@ -2,20 +2,32 @@ package org.briarproject.briar.privategroup.invitation; import org.briarproject.bramble.api.FormatException; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; +import org.briarproject.bramble.api.sync.Group.Visibility; import javax.annotation.concurrent.Immutable; +import static org.briarproject.bramble.api.sync.Group.Visibility.INVISIBLE; +import static org.briarproject.bramble.api.sync.Group.Visibility.SHARED; +import static org.briarproject.bramble.api.sync.Group.Visibility.VISIBLE; + @Immutable @NotNullByDefault enum InviteeState implements State { - START(0), INVITED(1), ACCEPTED(2), JOINED(3), LEFT(4), DISSOLVED(5), - ERROR(6); + START(0, INVISIBLE), + INVITED(1, INVISIBLE), + ACCEPTED(2, VISIBLE), + JOINED(3, SHARED), + LEFT(4, INVISIBLE), + DISSOLVED(5, INVISIBLE), + ERROR(6, INVISIBLE); private final int value; + private final Visibility visibility; - InviteeState(int value) { + InviteeState(int value, Visibility visibility) { this.value = value; + this.visibility = visibility; } @Override @@ -23,6 +35,11 @@ enum InviteeState implements State { return value; } + @Override + public Visibility getVisibility() { + return visibility; + } + static InviteeState fromValue(int value) throws FormatException { for (InviteeState s : values()) if (s.value == value) return s; throw new FormatException(); diff --git a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/PeerProtocolEngine.java b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/PeerProtocolEngine.java index c1908735f..5a7f1c6c3 100644 --- a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/PeerProtocolEngine.java +++ b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/PeerProtocolEngine.java @@ -9,6 +9,7 @@ import org.briarproject.bramble.api.db.DbException; import org.briarproject.bramble.api.db.Transaction; import org.briarproject.bramble.api.identity.IdentityManager; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; +import org.briarproject.bramble.api.sync.ClientVersioningManager; import org.briarproject.bramble.api.sync.Message; import org.briarproject.bramble.api.system.Clock; import org.briarproject.briar.api.client.MessageTracker; @@ -36,15 +37,16 @@ import static org.briarproject.briar.privategroup.invitation.PeerState.START; class PeerProtocolEngine extends AbstractProtocolEngine { PeerProtocolEngine(DatabaseComponent db, ClientHelper clientHelper, + ClientVersioningManager clientVersioningManager, PrivateGroupManager privateGroupManager, PrivateGroupFactory privateGroupFactory, GroupMessageFactory groupMessageFactory, IdentityManager identityManager, MessageParser messageParser, MessageEncoder messageEncoder, MessageTracker messageTracker, Clock clock) { - super(db, clientHelper, privateGroupManager, privateGroupFactory, - groupMessageFactory, identityManager, messageParser, - messageEncoder, messageTracker, clock); + super(db, clientHelper, clientVersioningManager, privateGroupManager, + privateGroupFactory, groupMessageFactory, identityManager, + messageParser, messageEncoder, messageTracker, clock); } @Override diff --git a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/PeerState.java b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/PeerState.java index 94f9d19af..041528266 100644 --- a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/PeerState.java +++ b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/PeerState.java @@ -2,20 +2,32 @@ package org.briarproject.briar.privategroup.invitation; import org.briarproject.bramble.api.FormatException; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; +import org.briarproject.bramble.api.sync.Group.Visibility; import javax.annotation.concurrent.Immutable; +import static org.briarproject.bramble.api.sync.Group.Visibility.INVISIBLE; +import static org.briarproject.bramble.api.sync.Group.Visibility.SHARED; +import static org.briarproject.bramble.api.sync.Group.Visibility.VISIBLE; + @Immutable @NotNullByDefault enum PeerState implements State { - START(0), AWAIT_MEMBER(1), NEITHER_JOINED(2), LOCAL_JOINED(3), - BOTH_JOINED(4), LOCAL_LEFT(5), ERROR(6); + START(0, INVISIBLE), + AWAIT_MEMBER(1, INVISIBLE), + NEITHER_JOINED(2, INVISIBLE), + LOCAL_JOINED(3, VISIBLE), + BOTH_JOINED(4, SHARED), + LOCAL_LEFT(5, INVISIBLE), + ERROR(6, INVISIBLE); private final int value; + private final Visibility visibility; - PeerState(int value) { + PeerState(int value, Visibility visibility) { this.value = value; + this.visibility = visibility; } @Override @@ -23,6 +35,11 @@ enum PeerState implements State { return value; } + @Override + public Visibility getVisibility() { + return visibility; + } + static PeerState fromValue(int value) throws FormatException { for (PeerState s : values()) if (s.value == value) return s; throw new FormatException(); diff --git a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/ProtocolEngineFactoryImpl.java b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/ProtocolEngineFactoryImpl.java index af3bbe816..801d16d06 100644 --- a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/ProtocolEngineFactoryImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/ProtocolEngineFactoryImpl.java @@ -4,6 +4,7 @@ import org.briarproject.bramble.api.client.ClientHelper; import org.briarproject.bramble.api.db.DatabaseComponent; import org.briarproject.bramble.api.identity.IdentityManager; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; +import org.briarproject.bramble.api.sync.ClientVersioningManager; import org.briarproject.bramble.api.system.Clock; import org.briarproject.briar.api.client.MessageTracker; import org.briarproject.briar.api.privategroup.GroupMessageFactory; @@ -19,6 +20,7 @@ class ProtocolEngineFactoryImpl implements ProtocolEngineFactory { private final DatabaseComponent db; private final ClientHelper clientHelper; + private final ClientVersioningManager clientVersioningManager; private final PrivateGroupManager privateGroupManager; private final PrivateGroupFactory privateGroupFactory; private final GroupMessageFactory groupMessageFactory; @@ -30,6 +32,7 @@ class ProtocolEngineFactoryImpl implements ProtocolEngineFactory { @Inject ProtocolEngineFactoryImpl(DatabaseComponent db, ClientHelper clientHelper, + ClientVersioningManager clientVersioningManager, PrivateGroupManager privateGroupManager, PrivateGroupFactory privateGroupFactory, GroupMessageFactory groupMessageFactory, @@ -38,6 +41,7 @@ class ProtocolEngineFactoryImpl implements ProtocolEngineFactory { Clock clock) { this.db = db; this.clientHelper = clientHelper; + this.clientVersioningManager = clientVersioningManager; this.privateGroupManager = privateGroupManager; this.privateGroupFactory = privateGroupFactory; this.groupMessageFactory = groupMessageFactory; @@ -50,21 +54,24 @@ class ProtocolEngineFactoryImpl implements ProtocolEngineFactory { @Override public ProtocolEngine createCreatorEngine() { - return new CreatorProtocolEngine(db, clientHelper, privateGroupManager, + return new CreatorProtocolEngine(db, clientHelper, + clientVersioningManager, privateGroupManager, privateGroupFactory, groupMessageFactory, identityManager, messageParser, messageEncoder, messageTracker, clock); } @Override public ProtocolEngine createInviteeEngine() { - return new InviteeProtocolEngine(db, clientHelper, privateGroupManager, + return new InviteeProtocolEngine(db, clientHelper, + clientVersioningManager, privateGroupManager, privateGroupFactory, groupMessageFactory, identityManager, messageParser, messageEncoder, messageTracker, clock); } @Override public ProtocolEngine createPeerEngine() { - return new PeerProtocolEngine(db, clientHelper, privateGroupManager, + return new PeerProtocolEngine(db, clientHelper, + clientVersioningManager, privateGroupManager, privateGroupFactory, groupMessageFactory, identityManager, messageParser, messageEncoder, messageTracker, clock); } diff --git a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/SessionEncoderImpl.java b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/SessionEncoderImpl.java index 78e36bf3a..86fe5e3a0 100644 --- a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/SessionEncoderImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/SessionEncoderImpl.java @@ -9,6 +9,7 @@ import javax.inject.Inject; import static org.briarproject.bramble.api.data.BdfDictionary.NULL_VALUE; import static org.briarproject.briar.privategroup.invitation.GroupInvitationConstants.SESSION_KEY_INVITE_TIMESTAMP; +import static org.briarproject.briar.privategroup.invitation.GroupInvitationConstants.SESSION_KEY_IS_SESSION; import static org.briarproject.briar.privategroup.invitation.GroupInvitationConstants.SESSION_KEY_LAST_LOCAL_MESSAGE_ID; import static org.briarproject.briar.privategroup.invitation.GroupInvitationConstants.SESSION_KEY_LAST_REMOTE_MESSAGE_ID; import static org.briarproject.briar.privategroup.invitation.GroupInvitationConstants.SESSION_KEY_LOCAL_TIMESTAMP; @@ -28,6 +29,7 @@ class SessionEncoderImpl implements SessionEncoder { @Override public BdfDictionary encodeSession(Session s) { BdfDictionary d = new BdfDictionary(); + d.put(SESSION_KEY_IS_SESSION, true); d.put(SESSION_KEY_SESSION_ID, s.getPrivateGroupId()); d.put(SESSION_KEY_PRIVATE_GROUP_ID, s.getPrivateGroupId()); MessageId lastLocalMessageId = s.getLastLocalMessageId(); diff --git a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/SessionParser.java b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/SessionParser.java index baf0de80e..152ed067e 100644 --- a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/SessionParser.java +++ b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/SessionParser.java @@ -11,6 +11,8 @@ interface SessionParser { BdfDictionary getSessionQuery(SessionId s); + BdfDictionary getAllSessionsQuery(); + Role getRole(BdfDictionary d) throws FormatException; CreatorSession parseCreatorSession(GroupId contactGroupId, BdfDictionary d) diff --git a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/SessionParserImpl.java b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/SessionParserImpl.java index e8813b6dc..19a424d70 100644 --- a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/SessionParserImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/SessionParserImpl.java @@ -13,6 +13,7 @@ import javax.annotation.concurrent.Immutable; import javax.inject.Inject; import static org.briarproject.briar.privategroup.invitation.GroupInvitationConstants.SESSION_KEY_INVITE_TIMESTAMP; +import static org.briarproject.briar.privategroup.invitation.GroupInvitationConstants.SESSION_KEY_IS_SESSION; import static org.briarproject.briar.privategroup.invitation.GroupInvitationConstants.SESSION_KEY_LAST_LOCAL_MESSAGE_ID; import static org.briarproject.briar.privategroup.invitation.GroupInvitationConstants.SESSION_KEY_LAST_REMOTE_MESSAGE_ID; import static org.briarproject.briar.privategroup.invitation.GroupInvitationConstants.SESSION_KEY_LOCAL_TIMESTAMP; @@ -37,6 +38,11 @@ class SessionParserImpl implements SessionParser { return BdfDictionary.of(new BdfEntry(SESSION_KEY_SESSION_ID, s)); } + @Override + public BdfDictionary getAllSessionsQuery() { + return BdfDictionary.of(new BdfEntry(SESSION_KEY_IS_SESSION, true)); + } + @Override public Role getRole(BdfDictionary d) throws FormatException { return Role.fromValue(d.getLong(SESSION_KEY_ROLE).intValue()); diff --git a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/State.java b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/State.java index 46df85efd..2313f96c7 100644 --- a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/State.java +++ b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/State.java @@ -1,6 +1,10 @@ package org.briarproject.briar.privategroup.invitation; +import org.briarproject.bramble.api.sync.Group.Visibility; + interface State { int getValue(); + + Visibility getVisibility(); } diff --git a/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/AbstractProtocolEngineTest.java b/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/AbstractProtocolEngineTest.java index 3ae2fb61e..8c8056512 100644 --- a/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/AbstractProtocolEngineTest.java +++ b/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/AbstractProtocolEngineTest.java @@ -10,7 +10,9 @@ import org.briarproject.bramble.api.db.Transaction; import org.briarproject.bramble.api.identity.Author; import org.briarproject.bramble.api.identity.AuthorId; import org.briarproject.bramble.api.identity.IdentityManager; +import org.briarproject.bramble.api.sync.ClientVersioningManager; 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.Message; import org.briarproject.bramble.api.sync.MessageId; @@ -24,6 +26,7 @@ import org.briarproject.briar.api.privategroup.PrivateGroupManager; import org.jmock.Expectations; import static org.briarproject.bramble.api.identity.AuthorConstants.MAX_SIGNATURE_LENGTH; +import static org.briarproject.bramble.api.sync.Group.Visibility.SHARED; import static org.briarproject.bramble.test.TestUtils.getAuthor; import static org.briarproject.bramble.test.TestUtils.getGroup; import static org.briarproject.bramble.test.TestUtils.getRandomBytes; @@ -47,6 +50,8 @@ public abstract class AbstractProtocolEngineTest extends BrambleMockTestCase { context.mock(DatabaseComponent.class); protected final ClientHelper clientHelper = context.mock(ClientHelper.class); + protected final ClientVersioningManager clientVersioningManager = + context.mock(ClientVersioningManager.class); protected final PrivateGroupFactory privateGroupFactory = context.mock(PrivateGroupFactory.class); protected final PrivateGroupManager privateGroupManager = @@ -181,10 +186,13 @@ public abstract class AbstractProtocolEngineTest extends BrambleMockTestCase { }}); } - protected void expectSetPrivateGroupVisibility(Group.Visibility v) + protected void expectSetPrivateGroupVisibility(Visibility v) throws Exception { expectGetContactId(); context.checking(new Expectations() {{ + oneOf(clientVersioningManager).getClientVisibility(txn, contactId, + CLIENT_ID, CLIENT_VERSION); + will(returnValue(SHARED)); oneOf(db).setGroupVisibility(txn, contactId, privateGroupId, v); }}); } diff --git a/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/CreatorProtocolEngineTest.java b/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/CreatorProtocolEngineTest.java index 22e64a9f9..c1b2bd9b2 100644 --- a/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/CreatorProtocolEngineTest.java +++ b/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/CreatorProtocolEngineTest.java @@ -19,9 +19,10 @@ import static org.junit.Assert.assertEquals; public class CreatorProtocolEngineTest extends AbstractProtocolEngineTest { private final CreatorProtocolEngine engine = - new CreatorProtocolEngine(db, clientHelper, privateGroupManager, - privateGroupFactory, groupMessageFactory, identityManager, - messageParser, messageEncoder, messageTracker, clock); + new CreatorProtocolEngine(db, clientHelper, clientVersioningManager, + privateGroupManager, privateGroupFactory, + groupMessageFactory, identityManager, messageParser, + messageEncoder, messageTracker, clock); private CreatorSession getDefaultSession(CreatorState state) { return new CreatorSession(contactGroupId, privateGroupId, diff --git a/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImplTest.java b/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImplTest.java index 1a7ae0857..e7db720c7 100644 --- a/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImplTest.java +++ b/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImplTest.java @@ -15,6 +15,7 @@ import org.briarproject.bramble.api.db.Metadata; import org.briarproject.bramble.api.db.Transaction; import org.briarproject.bramble.api.identity.Author; import org.briarproject.bramble.api.identity.AuthorId; +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; @@ -69,6 +70,8 @@ public class GroupInvitationManagerImplTest 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 ContactGroupFactory contactGroupFactory = context.mock(ContactGroupFactory.class); private final PrivateGroupFactory privateGroupFactory = @@ -140,11 +143,11 @@ public class GroupInvitationManagerImplTest extends BrambleMockTestCase { }}); MetadataParser metadataParser = context.mock(MetadataParser.class); MessageTracker messageTracker = context.mock(MessageTracker.class); - groupInvitationManager = - new GroupInvitationManagerImpl(db, clientHelper, metadataParser, - messageTracker, contactGroupFactory, - privateGroupFactory, privateGroupManager, messageParser, - sessionParser, sessionEncoder, engineFactory); + groupInvitationManager = new GroupInvitationManagerImpl(db, + clientHelper, clientVersioningManager, metadataParser, + messageTracker, contactGroupFactory, privateGroupFactory, + privateGroupManager, messageParser, sessionParser, + sessionEncoder, engineFactory); } @Test @@ -184,6 +187,9 @@ public class GroupInvitationManagerImplTest extends BrambleMockTestCase { CLIENT_VERSION, c); will(returnValue(contactGroup)); oneOf(db).addGroup(txn, contactGroup); + oneOf(clientVersioningManager).getClientVisibility(txn, contactId, + CLIENT_ID, CLIENT_VERSION); + will(returnValue(SHARED)); oneOf(db).setGroupVisibility(txn, c.getId(), contactGroup.getId(), SHARED); oneOf(clientHelper) diff --git a/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/InviteeProtocolEngineTest.java b/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/InviteeProtocolEngineTest.java index 003094542..f398d3a7f 100644 --- a/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/InviteeProtocolEngineTest.java +++ b/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/InviteeProtocolEngineTest.java @@ -38,9 +38,10 @@ import static org.junit.Assert.assertTrue; public class InviteeProtocolEngineTest extends AbstractProtocolEngineTest { private final InviteeProtocolEngine engine = - new InviteeProtocolEngine(db, clientHelper, privateGroupManager, - privateGroupFactory, groupMessageFactory, identityManager, - messageParser, messageEncoder, messageTracker, clock); + new InviteeProtocolEngine(db, clientHelper, clientVersioningManager, + privateGroupManager, privateGroupFactory, + groupMessageFactory, identityManager, messageParser, + messageEncoder, messageTracker, clock); private final LocalAuthor localAuthor = getLocalAuthor(); private InviteeSession getDefaultSession(InviteeState state) { @@ -238,6 +239,7 @@ public class InviteeProtocolEngineTest extends AbstractProtocolEngineTest { @Test public void testOnLeaveActionFromAccepted() throws Exception { expectSendLeaveMessage(false); + expectSetPrivateGroupVisibility(INVISIBLE); InviteeSession session = getDefaultSession(ACCEPTED); InviteeSession newSession = engine.onLeaveAction(txn, session); @@ -249,6 +251,7 @@ public class InviteeProtocolEngineTest extends AbstractProtocolEngineTest { @Test public void testOnLeaveActionFromJoined() throws Exception { expectSendLeaveMessage(false); + expectSetPrivateGroupVisibility(INVISIBLE); InviteeSession session = getDefaultSession(JOINED); InviteeSession newSession = engine.onLeaveAction(txn, session); diff --git a/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/PeerProtocolEngineTest.java b/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/PeerProtocolEngineTest.java index d5d53168f..05c0920c5 100644 --- a/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/PeerProtocolEngineTest.java +++ b/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/PeerProtocolEngineTest.java @@ -24,9 +24,10 @@ import static org.junit.Assert.assertTrue; public class PeerProtocolEngineTest extends AbstractProtocolEngineTest { private final PeerProtocolEngine engine = - new PeerProtocolEngine(db, clientHelper, privateGroupManager, - privateGroupFactory, groupMessageFactory, identityManager, - messageParser, messageEncoder, messageTracker, clock); + new PeerProtocolEngine(db, clientHelper, clientVersioningManager, + privateGroupManager, privateGroupFactory, + groupMessageFactory, identityManager, messageParser, + messageEncoder, messageTracker, clock); private PeerSession getDefaultSession(PeerState state) { return new PeerSession(contactGroupId, privateGroupId, From cb11b55a9ab9a43e0d4179c638f96e7896b1ca89 Mon Sep 17 00:00:00 2001 From: akwizgran Date: Mon, 16 Apr 2018 15:09:16 +0100 Subject: [PATCH 15/33] 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 93cbf28eb..1fca633de 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 f3b62bb22..c9e0662b4 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 local = getLocalProperties(txn); for (Entry 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 6f12898b9..e0a84d6c6 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); }}); From e76f114a7233d1ba69cc57fde99f23fee5b66191 Mon Sep 17 00:00:00 2001 From: akwizgran Date: Mon, 16 Apr 2018 15:18:51 +0100 Subject: [PATCH 16/33] Use client versioning for introductions. --- .../introduction/IntroductionManagerImpl.java | 84 ++++++++++++------- .../introduction/IntroductionModule.java | 5 ++ 2 files changed, 59 insertions(+), 30 deletions(-) diff --git a/briar-core/src/main/java/org/briarproject/briar/introduction/IntroductionManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/introduction/IntroductionManagerImpl.java index efb857a0f..31273d00a 100644 --- a/briar-core/src/main/java/org/briarproject/briar/introduction/IntroductionManagerImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/introduction/IntroductionManagerImpl.java @@ -19,7 +19,10 @@ import org.briarproject.bramble.api.identity.IdentityManager; import org.briarproject.bramble.api.identity.LocalAuthor; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; 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.Message; import org.briarproject.bramble.api.sync.MessageId; @@ -39,11 +42,13 @@ import java.util.Collection; import java.util.List; 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 java.util.logging.Level.INFO; import static org.briarproject.bramble.api.sync.Group.Visibility.SHARED; import static org.briarproject.briar.api.introduction.Role.INTRODUCEE; import static org.briarproject.briar.api.introduction.Role.INTRODUCER; @@ -59,8 +64,13 @@ import static org.briarproject.briar.introduction.MessageType.REQUEST; @Immutable @NotNullByDefault class IntroductionManagerImpl extends ConversationClientImpl - implements IntroductionManager, Client, ContactHook { + implements IntroductionManager, Client, ContactHook, + ClientVersioningHook { + private static final Logger LOG = + Logger.getLogger(IntroductionManagerImpl.class.getName()); + + private final ClientVersioningManager clientVersioningManager; private final ContactGroupFactory contactGroupFactory; private final ContactManager contactManager; private final MessageParser messageParser; @@ -74,11 +84,8 @@ class IntroductionManagerImpl extends ConversationClientImpl private final Group localGroup; @Inject - IntroductionManagerImpl( - DatabaseComponent db, - ClientHelper clientHelper, - MetadataParser metadataParser, - MessageTracker messageTracker, + IntroductionManagerImpl(DatabaseComponent db, ClientHelper clientHelper, + ClientVersioningManager clientVersioningManager,MetadataParser metadataParser, MessageTracker messageTracker, ContactGroupFactory contactGroupFactory, ContactManager contactManager, MessageParser messageParser, @@ -89,6 +96,7 @@ class IntroductionManagerImpl extends ConversationClientImpl IntroductionCrypto crypto, IdentityManager identityManager) { super(db, clientHelper, metadataParser, messageTracker); + this.clientVersioningManager = clientVersioningManager; this.contactGroupFactory = contactGroupFactory; this.contactManager = contactManager; this.messageParser = messageParser; @@ -112,13 +120,17 @@ class IntroductionManagerImpl extends ConversationClientImpl } @Override - // TODO adapt to use upcoming ClientVersioning client public void addingContact(Transaction txn, Contact c) throws DbException { // Create a group to share with the contact 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); + db.setGroupVisibility(txn, c.getId(), g.getId(), client); // Attach the contact ID to the group BdfDictionary meta = new BdfDictionary(); meta.put(GROUP_KEY_CONTACT_ID, c.getId().getInt()); @@ -135,9 +147,20 @@ class IntroductionManagerImpl extends ConversationClientImpl abortOrRemoveSessionWithIntroducee(txn, c); // Remove the contact group (all messages will be removed with it) + 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 Group getContactGroup(Contact c) { return contactGroupFactory @@ -147,10 +170,11 @@ class IntroductionManagerImpl extends ConversationClientImpl @Override protected boolean incomingMessage(Transaction txn, Message m, BdfList body, BdfDictionary bdfMeta) throws DbException, FormatException { - // Parse the metadata +// Parse the metadata MessageMetadata meta = messageParser.parseMetadata(bdfMeta); // Look up the session, if there is one SessionId sessionId = meta.getSessionId(); + IntroduceeSession newIntroduceeSession = null; if (sessionId == null) { if (meta.getMessageType() != REQUEST) throw new AssertionError(); @@ -161,7 +185,7 @@ class IntroductionManagerImpl extends ConversationClientImpl // Handle the message Session session; MessageId storageId; - if (ss == null) { + if (ss == null){ if (meta.getMessageType() != REQUEST) throw new FormatException(); if (newIntroduceeSession == null) throw new AssertionError(); storageId = createStorageId(txn); @@ -172,12 +196,12 @@ class IntroductionManagerImpl extends ConversationClientImpl Role role = sessionParser.getRole(ss.bdfSession); if (role == INTRODUCER) { session = handleMessage(txn, m, body, meta.getMessageType(), - sessionParser.parseIntroducerSession(ss.bdfSession), - introducerEngine); + sessionParser.parseIntroducerSession(ss.bdfSession), + introducerEngine); } else if (role == INTRODUCEE) { session = handleMessage(txn, m, body, meta.getMessageType(), - sessionParser.parseIntroduceeSession(m.getGroupId(), - ss.bdfSession), introduceeEngine); + sessionParser.parseIntroduceeSession(m.getGroupId(), + ss.bdfSession), introduceeEngine); } else throw new AssertionError(); } // Store the updated session @@ -388,13 +412,14 @@ class IntroductionManagerImpl extends ConversationClientImpl List messages; Transaction txn = db.startTransaction(true); try { - Contact contact = db.getContact(txn, c); + Contact contact =db.getContact(txn, c); GroupId contactGroupId = getContactGroup(contact).getId(); BdfDictionary query = messageParser.getMessagesVisibleInUiQuery(); - Map results = clientHelper - .getMessageMetadataAsDictionary(txn, contactGroupId, query); - messages = new ArrayList<>(results.size()); - for (Entry e : results.entrySet()) { + Map results = clientHelper.getMessageMetadataAsDictionary(txn, contactGroupId, query); + messages = new ArrayList<>(results.size()); + for (Entry< + MessageId , + BdfDictionary > e : results.entrySet()) { MessageId m = e.getKey(); MessageMetadata meta = messageParser.parseMetadata(e.getValue()); @@ -405,7 +430,7 @@ class IntroductionManagerImpl extends ConversationClientImpl if (type == REQUEST) { messages.add( parseInvitationRequest(txn, contactGroupId, m, - meta, status, ss.bdfSession)); + meta, status, ss.bdfSession)); } else if (type == ACCEPT) { messages.add( parseInvitationResponse(contactGroupId, m, meta, @@ -425,8 +450,7 @@ class IntroductionManagerImpl extends ConversationClientImpl return messages; } - private IntroductionRequest parseInvitationRequest(Transaction txn, - GroupId contactGroupId, MessageId m, MessageMetadata meta, + private IntroductionRequest parseInvitationRequest(Transaction txn, GroupId contactGroupId, MessageId m, MessageMetadata meta, MessageStatus status, BdfDictionary bdfSession) throws DbException, FormatException { Role role = sessionParser.getRole(bdfSession); @@ -497,9 +521,9 @@ class IntroductionManagerImpl extends ConversationClientImpl Map sessions; try { sessions = clientHelper - .getMessageMetadataAsDictionary(txn, localGroup.getId(), + .getMessageMetadataAsDictionary(txn,localGroup.getId(), query); - } catch (FormatException e) { + } catch (FormatException e){ throw new DbException(e); } for (MessageId id : sessions.keySet()) { @@ -510,20 +534,20 @@ class IntroductionManagerImpl extends ConversationClientImpl private void abortOrRemoveSessionWithIntroducee(Transaction txn, Contact c) throws DbException { BdfDictionary query = sessionEncoder.getIntroducerSessionsQuery(); - Map sessions; + Map sessions; try { sessions = clientHelper - .getMessageMetadataAsDictionary(txn, localGroup.getId(), - query); + .getMessageMetadataAsDictionary(txn, + localGroup.getId(), + query); } catch (FormatException e) { throw new DbException(); } - LocalAuthor localAuthor = identityManager.getLocalAuthor(txn); - for (Entry session : sessions.entrySet()) { + LocalAuthor localAuthor = identityManager.getLocalAuthor(txn);for (Entry session : sessions.entrySet()) { IntroducerSession s; try { s = sessionParser.parseIntroducerSession(session.getValue()); - } catch (FormatException e) { + } catch (FormatException e){ throw new DbException(); } if (s.getIntroduceeA().author.equals(c.getAuthor())) { diff --git a/briar-core/src/main/java/org/briarproject/briar/introduction/IntroductionModule.java b/briar-core/src/main/java/org/briarproject/briar/introduction/IntroductionModule.java index a41215ae2..f7e55c99b 100644 --- a/briar-core/src/main/java/org/briarproject/briar/introduction/IntroductionModule.java +++ b/briar-core/src/main/java/org/briarproject/briar/introduction/IntroductionModule.java @@ -4,6 +4,7 @@ import org.briarproject.bramble.api.client.ClientHelper; 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.sync.ClientVersioningManager; import org.briarproject.bramble.api.sync.ValidationManager; import org.briarproject.bramble.api.system.Clock; import org.briarproject.briar.api.introduction.IntroductionManager; @@ -47,12 +48,16 @@ public class IntroductionModule { LifecycleManager lifecycleManager, ContactManager contactManager, ValidationManager validationManager, ConversationManager conversationManager, + ClientVersioningManager clientVersioningManager, IntroductionManagerImpl introductionManager) { lifecycleManager.registerClient(introductionManager); contactManager.registerContactHook(introductionManager); validationManager.registerIncomingMessageHook(CLIENT_ID, CLIENT_VERSION, introductionManager); conversationManager.registerConversationClient(introductionManager); + clientVersioningManager.registerClient(CLIENT_ID, CLIENT_VERSION); + clientVersioningManager.registerClientVersioningHook(CLIENT_ID, + CLIENT_VERSION, introductionManager); return introductionManager; } From cadb17987ca4d3df75fa712ba0b951ed8220286e Mon Sep 17 00:00:00 2001 From: akwizgran Date: Mon, 16 Apr 2018 15:25:38 +0100 Subject: [PATCH 17/33] Use client versioning for messaging. --- .../briar/messaging/MessagingManagerImpl.java | 47 ++++++++++++++----- .../briar/messaging/MessagingModule.java | 5 ++ 2 files changed, 41 insertions(+), 11 deletions(-) diff --git a/briar-core/src/main/java/org/briarproject/briar/messaging/MessagingManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/messaging/MessagingManagerImpl.java index 804dbeccf..81db870d7 100644 --- a/briar-core/src/main/java/org/briarproject/briar/messaging/MessagingManagerImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/messaging/MessagingManagerImpl.java @@ -14,7 +14,10 @@ import org.briarproject.bramble.api.db.DbException; import org.briarproject.bramble.api.db.Transaction; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; 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.Message; import org.briarproject.bramble.api.sync.MessageId; @@ -29,25 +32,32 @@ import org.briarproject.briar.client.ConversationClientImpl; import java.util.ArrayList; import java.util.Collection; import java.util.Map; +import java.util.logging.Logger; 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; import static org.briarproject.briar.client.MessageTrackerConstants.MSG_KEY_READ; @Immutable @NotNullByDefault class MessagingManagerImpl extends ConversationClientImpl - implements MessagingManager, Client, ContactHook { + implements MessagingManager, Client, ContactHook, ClientVersioningHook { + private static final Logger LOG = + Logger.getLogger(MessagingManagerImpl.class.getName()); + + private final ClientVersioningManager clientVersioningManager; private final ContactGroupFactory contactGroupFactory; @Inject MessagingManagerImpl(DatabaseComponent db, ClientHelper clientHelper, + ClientVersioningManager clientVersioningManager, MetadataParser metadataParser, MessageTracker messageTracker, ContactGroupFactory contactGroupFactory) { super(db, clientHelper, metadataParser, messageTracker); + this.clientVersioningManager = clientVersioningManager; this.contactGroupFactory = contactGroupFactory; } @@ -64,18 +74,23 @@ class MessagingManagerImpl extends ConversationClientImpl @Override public void addingContact(Transaction txn, Contact c) throws DbException { + // Create a group to share with the contact + Group g = getContactGroup(c); + // Store the group and share it with the contact + db.addGroup(txn, g); + // 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); + // Attach the contact ID to the group + BdfDictionary d = new BdfDictionary(); + d.put("contactId", c.getId().getInt()); try { - // Create a group to share with the contact - 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); - // Attach the contact ID to the group - BdfDictionary d = new BdfDictionary(); - d.put("contactId", c.getId().getInt()); clientHelper.mergeGroupMetadata(txn, g.getId(), d); } catch (FormatException e) { - throw new RuntimeException(e); + throw new AssertionError(e); } } @@ -90,6 +105,16 @@ class MessagingManagerImpl extends ConversationClientImpl 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 protected boolean incomingMessage(Transaction txn, Message m, BdfList body, BdfDictionary meta) throws DbException, FormatException { diff --git a/briar-core/src/main/java/org/briarproject/briar/messaging/MessagingModule.java b/briar-core/src/main/java/org/briarproject/briar/messaging/MessagingModule.java index c6c6bd1e6..95c49b41c 100644 --- a/briar-core/src/main/java/org/briarproject/briar/messaging/MessagingModule.java +++ b/briar-core/src/main/java/org/briarproject/briar/messaging/MessagingModule.java @@ -4,6 +4,7 @@ import org.briarproject.bramble.api.client.ClientHelper; 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.sync.ClientVersioningManager; import org.briarproject.bramble.api.sync.ValidationManager; import org.briarproject.bramble.api.system.Clock; import org.briarproject.briar.api.messaging.ConversationManager; @@ -54,12 +55,16 @@ public class MessagingModule { MessagingManager getMessagingManager(LifecycleManager lifecycleManager, ContactManager contactManager, ValidationManager validationManager, ConversationManager conversationManager, + ClientVersioningManager clientVersioningManager, MessagingManagerImpl messagingManager) { lifecycleManager.registerClient(messagingManager); contactManager.registerContactHook(messagingManager); validationManager.registerIncomingMessageHook(CLIENT_ID, CLIENT_VERSION, messagingManager); conversationManager.registerConversationClient(messagingManager); + clientVersioningManager.registerClient(CLIENT_ID, CLIENT_VERSION); + clientVersioningManager.registerClientVersioningHook(CLIENT_ID, + CLIENT_VERSION, messagingManager); return messagingManager; } From 2e570ba50d9e7ad1d1a689fbaf3cb50d52401041 Mon Sep 17 00:00:00 2001 From: akwizgran Date: Mon, 16 Apr 2018 16:35:48 +0100 Subject: [PATCH 18/33] Rename client version to major version. --- .../api/client/ContactGroupFactory.java | 6 +-- .../bramble/api/db/DatabaseComponent.java | 2 +- .../properties/TransportPropertyManager.java | 4 +- .../api/sync/ClientVersioningManager.java | 10 ++-- .../briarproject/bramble/api/sync/Group.java | 12 ++--- .../bramble/api/sync/GroupFactory.java | 4 +- .../bramble/api/sync/ValidationManager.java | 4 +- .../briarproject/bramble/test/TestUtils.java | 8 +-- .../client/ContactGroupFactoryImpl.java | 12 ++--- .../org/briarproject/bramble/db/Database.java | 2 +- .../bramble/db/DatabaseComponentImpl.java | 4 +- .../briarproject/bramble/db/JdbcDatabase.java | 30 +++++------ .../bramble/properties/PropertiesModule.java | 10 ++-- .../TransportPropertyManagerImpl.java | 6 +-- .../bramble/sync/ClientVersion.java | 14 +++--- .../sync/ClientVersioningManagerImpl.java | 34 ++++++------- .../sync/ClientVersioningValidator.java | 8 +-- .../bramble/sync/GroupFactoryImpl.java | 10 ++-- .../briarproject/bramble/sync/SyncModule.java | 6 +-- .../bramble/sync/ValidationManagerImpl.java | 28 +++++------ .../bramble/db/DatabaseComponentImplTest.java | 10 ++-- .../bramble/db/JdbcDatabaseTest.java | 12 ++--- .../TransportPropertyManagerImplTest.java | 42 ++++++++-------- .../TransportPropertyValidatorTest.java | 4 +- .../bramble/sync/SyncIntegrationTest.java | 4 +- .../sync/ValidationManagerImplTest.java | 8 +-- .../briar/api/blog/BlogManager.java | 4 +- .../briar/api/blog/BlogSharingManager.java | 4 +- .../briar/api/feed/FeedManager.java | 4 +- .../briar/api/forum/ForumManager.java | 4 +- .../briar/api/forum/ForumSharingManager.java | 4 +- .../api/introduction/IntroductionManager.java | 4 +- .../briar/api/messaging/MessagingManager.java | 4 +- .../api/privategroup/PrivateGroupManager.java | 4 +- .../invitation/GroupInvitationManager.java | 4 +- .../briar/blog/BlogFactoryImpl.java | 4 +- .../briar/blog/BlogManagerImpl.java | 2 +- .../briarproject/briar/blog/BlogModule.java | 6 +-- .../briar/blog/BlogPostValidator.java | 6 +-- .../briar/feed/FeedManagerImpl.java | 2 +- .../briar/forum/ForumFactoryImpl.java | 4 +- .../briar/forum/ForumManagerImpl.java | 2 +- .../briarproject/briar/forum/ForumModule.java | 6 +-- .../introduction/IntroductionManagerImpl.java | 2 +- .../introduction/IntroductionModule.java | 10 ++-- .../briar/messaging/MessagingManagerImpl.java | 6 +-- .../briar/messaging/MessagingModule.java | 10 ++-- .../privategroup/PrivateGroupFactoryImpl.java | 4 +- .../privategroup/PrivateGroupManagerImpl.java | 2 +- .../privategroup/PrivateGroupModule.java | 6 +-- .../invitation/AbstractProtocolEngine.java | 4 +- .../GroupInvitationFactoryImpl.java | 4 +- .../GroupInvitationManagerImpl.java | 10 ++-- .../invitation/GroupInvitationModule.java | 14 +++--- .../briar/sharing/BlogProtocolEngineImpl.java | 4 +- .../briar/sharing/BlogSharingManagerImpl.java | 4 +- .../sharing/ForumProtocolEngineImpl.java | 4 +- .../sharing/ForumSharingManagerImpl.java | 4 +- .../briar/sharing/SharingModule.java | 24 ++++----- .../briar/blog/BlogManagerImplTest.java | 4 +- .../briar/blog/BlogPostValidatorTest.java | 8 +-- .../briar/feed/FeedManagerImplTest.java | 8 +-- .../IntroductionIntegrationTest.java | 4 +- .../AbstractProtocolEngineTest.java | 6 +-- .../GroupInvitationManagerImplTest.java | 50 +++++++++---------- .../sharing/BlogSharingIntegrationTest.java | 6 +-- .../sharing/BlogSharingManagerImplTest.java | 26 +++++----- .../sharing/ForumSharingIntegrationTest.java | 6 +-- 68 files changed, 296 insertions(+), 296 deletions(-) diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/client/ContactGroupFactory.java b/bramble-api/src/main/java/org/briarproject/bramble/api/client/ContactGroupFactory.java index 6b4ba6b4c..896acb221 100644 --- a/bramble-api/src/main/java/org/briarproject/bramble/api/client/ContactGroupFactory.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/client/ContactGroupFactory.java @@ -12,19 +12,19 @@ public interface ContactGroupFactory { /** * Creates a group that is not shared with any contacts. */ - Group createLocalGroup(ClientId clientId, int clientVersion); + Group createLocalGroup(ClientId clientId, int majorVersion); /** * Creates a group for the given client to share with the given contact. */ - Group createContactGroup(ClientId clientId, int clientVersion, + Group createContactGroup(ClientId clientId, int majorVersion, Contact contact); /** * Creates a group for the given client to share between the given authors * identified by their AuthorIds. */ - Group createContactGroup(ClientId clientId, int clientVersion, + Group createContactGroup(ClientId clientId, int majorVersion, AuthorId authorId1, AuthorId authorId2); } diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/db/DatabaseComponent.java b/bramble-api/src/main/java/org/briarproject/bramble/api/db/DatabaseComponent.java index 5e50efdc2..371567441 100644 --- a/bramble-api/src/main/java/org/briarproject/bramble/api/db/DatabaseComponent.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/db/DatabaseComponent.java @@ -241,7 +241,7 @@ public interface DatabaseComponent { *

* Read-only. */ - Collection getGroups(Transaction txn, ClientId c, int clientVersion) + Collection getGroups(Transaction txn, ClientId c, int majorVersion) throws DbException; /** diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/properties/TransportPropertyManager.java b/bramble-api/src/main/java/org/briarproject/bramble/api/properties/TransportPropertyManager.java index ed18409bf..8a8ec4dad 100644 --- a/bramble-api/src/main/java/org/briarproject/bramble/api/properties/TransportPropertyManager.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/properties/TransportPropertyManager.java @@ -18,9 +18,9 @@ public interface TransportPropertyManager { ClientId CLIENT_ID = new ClientId("org.briarproject.bramble.properties"); /** - * The current version of the transport property client. + * The current major version of the transport property client. */ - int CLIENT_VERSION = 0; + int MAJOR_VERSION = 0; /** * Stores the given properties received while adding a contact - they will diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/sync/ClientVersioningManager.java b/bramble-api/src/main/java/org/briarproject/bramble/api/sync/ClientVersioningManager.java index 781ce4b4e..d2a9dac37 100644 --- a/bramble-api/src/main/java/org/briarproject/bramble/api/sync/ClientVersioningManager.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/sync/ClientVersioningManager.java @@ -17,22 +17,22 @@ public interface ClientVersioningManager { ClientId CLIENT_ID = new ClientId("org.briarproject.bramble.versioning"); /** - * The current version of the versioning client. + * The current major version of the versioning client. */ - int CLIENT_VERSION = 0; + int MAJOR_VERSION = 0; /** * Registers a client that will be advertised to contacts. This method * should be called before {@link LifecycleManager#startServices(String)}. */ - void registerClient(ClientId clientId, int clientVersion); + void registerClient(ClientId clientId, int majorVersion); /** * Registers a hook that will be called when the visibility of the given * client changes. This method should be called before * {@link LifecycleManager#startServices(String)}. */ - void registerClientVersioningHook(ClientId clientId, int clientVersion, + void registerClientVersioningHook(ClientId clientId, int majorVersion, ClientVersioningHook hook); /** @@ -40,7 +40,7 @@ public interface ClientVersioningManager { * contact. */ Visibility getClientVisibility(Transaction txn, ContactId contactId, - ClientId clientId, int clientVersion) throws DbException; + ClientId clientId, int majorVersion) throws DbException; interface ClientVersioningHook { diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/sync/Group.java b/bramble-api/src/main/java/org/briarproject/bramble/api/sync/Group.java index d44423cbc..2d395cce5 100644 --- a/bramble-api/src/main/java/org/briarproject/bramble/api/sync/Group.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/sync/Group.java @@ -32,16 +32,16 @@ public class Group { private final GroupId id; private final ClientId clientId; - private final int clientVersion; + private final int majorVersion; private final byte[] descriptor; - public Group(GroupId id, ClientId clientId, int clientVersion, + public Group(GroupId id, ClientId clientId, int majorVersion, byte[] descriptor) { if (descriptor.length > MAX_GROUP_DESCRIPTOR_LENGTH) throw new IllegalArgumentException(); this.id = id; this.clientId = clientId; - this.clientVersion = clientVersion; + this.majorVersion = majorVersion; this.descriptor = descriptor; } @@ -60,10 +60,10 @@ public class Group { } /** - * Returns the version of the client to which the group belongs. + * Returns the major version of the client to which the group belongs. */ - public int getClientVersion() { - return clientVersion; + public int getMajorVersion() { + return majorVersion; } /** diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/sync/GroupFactory.java b/bramble-api/src/main/java/org/briarproject/bramble/api/sync/GroupFactory.java index 844ded0e1..9924c51b8 100644 --- a/bramble-api/src/main/java/org/briarproject/bramble/api/sync/GroupFactory.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/sync/GroupFactory.java @@ -6,7 +6,7 @@ import org.briarproject.bramble.api.nullsafety.NotNullByDefault; public interface GroupFactory { /** - * Creates a group with the given client ID, client version and descriptor. + * Creates a group with the given client ID, major version and descriptor. */ - Group createGroup(ClientId c, int clientVersion, byte[] descriptor); + Group createGroup(ClientId c, int majorVersion, byte[] descriptor); } diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/sync/ValidationManager.java b/bramble-api/src/main/java/org/briarproject/bramble/api/sync/ValidationManager.java index 56571ad97..1718cac81 100644 --- a/bramble-api/src/main/java/org/briarproject/bramble/api/sync/ValidationManager.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/sync/ValidationManager.java @@ -37,7 +37,7 @@ public interface ValidationManager { * Registers the message validator for the given client. This method * should be called before {@link LifecycleManager#startServices(String)}. */ - void registerMessageValidator(ClientId c, int clientVersion, + void registerMessageValidator(ClientId c, int majorVersion, MessageValidator v); /** @@ -46,7 +46,7 @@ public interface ValidationManager { * method should be called before * {@link LifecycleManager#startServices(String)}. */ - void registerIncomingMessageHook(ClientId c, int clientVersion, + void registerIncomingMessageHook(ClientId c, int majorVersion, IncomingMessageHook hook); interface MessageValidator { diff --git a/bramble-api/src/test/java/org/briarproject/bramble/test/TestUtils.java b/bramble-api/src/test/java/org/briarproject/bramble/test/TestUtils.java index 0bff1a547..c77fde6e9 100644 --- a/bramble-api/src/test/java/org/briarproject/bramble/test/TestUtils.java +++ b/bramble-api/src/test/java/org/briarproject/bramble/test/TestUtils.java @@ -117,16 +117,16 @@ public class TestUtils { return new Author(id, FORMAT_VERSION, name, publicKey); } - public static Group getGroup(ClientId clientId, int clientVersion) { + public static Group getGroup(ClientId clientId, int majorVersion) { int descriptorLength = 1 + random.nextInt(MAX_GROUP_DESCRIPTOR_LENGTH); - return getGroup(clientId, clientVersion, descriptorLength); + return getGroup(clientId, majorVersion, descriptorLength); } - public static Group getGroup(ClientId clientId, int clientVersion, + public static Group getGroup(ClientId clientId, int majorVersion, int descriptorLength) { GroupId groupId = new GroupId(getRandomId()); byte[] descriptor = getRandomBytes(descriptorLength); - return new Group(groupId, clientId, clientVersion, descriptor); + return new Group(groupId, clientId, majorVersion, descriptor); } public static Message getMessage(GroupId groupId) { diff --git a/bramble-core/src/main/java/org/briarproject/bramble/client/ContactGroupFactoryImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/client/ContactGroupFactoryImpl.java index fba2aa745..6b35c9281 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/client/ContactGroupFactoryImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/client/ContactGroupFactoryImpl.java @@ -32,25 +32,25 @@ class ContactGroupFactoryImpl implements ContactGroupFactory { } @Override - public Group createLocalGroup(ClientId clientId, int clientVersion) { - return groupFactory.createGroup(clientId, clientVersion, + public Group createLocalGroup(ClientId clientId, int majorVersion) { + return groupFactory.createGroup(clientId, majorVersion, LOCAL_GROUP_DESCRIPTOR); } @Override - public Group createContactGroup(ClientId clientId, int clientVersion, + public Group createContactGroup(ClientId clientId, int majorVersion, Contact contact) { AuthorId local = contact.getLocalAuthorId(); AuthorId remote = contact.getAuthor().getId(); byte[] descriptor = createGroupDescriptor(local, remote); - return groupFactory.createGroup(clientId, clientVersion, descriptor); + return groupFactory.createGroup(clientId, majorVersion, descriptor); } @Override - public Group createContactGroup(ClientId clientId, int clientVersion, + public Group createContactGroup(ClientId clientId, int majorVersion, AuthorId authorId1, AuthorId authorId2) { byte[] descriptor = createGroupDescriptor(authorId1, authorId2); - return groupFactory.createGroup(clientId, clientVersion, descriptor); + return groupFactory.createGroup(clientId, majorVersion, descriptor); } private byte[] createGroupDescriptor(AuthorId local, AuthorId remote) { diff --git a/bramble-core/src/main/java/org/briarproject/bramble/db/Database.java b/bramble-core/src/main/java/org/briarproject/bramble/db/Database.java index 7a132510f..f20c0da5e 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/db/Database.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/db/Database.java @@ -266,7 +266,7 @@ interface Database { *

* Read-only. */ - Collection getGroups(T txn, ClientId c, int clientVersion) + Collection getGroups(T txn, ClientId c, int majorVersion) throws DbException; /** diff --git a/bramble-core/src/main/java/org/briarproject/bramble/db/DatabaseComponentImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/db/DatabaseComponentImpl.java index b24567bf3..1534a9d81 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/db/DatabaseComponentImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/db/DatabaseComponentImpl.java @@ -436,9 +436,9 @@ class DatabaseComponentImpl implements DatabaseComponent { @Override public Collection getGroups(Transaction transaction, ClientId c, - int clientVersion) throws DbException { + int majorVersion) throws DbException { T txn = unbox(transaction); - return db.getGroups(txn, c, clientVersion); + return db.getGroups(txn, c, majorVersion); } @Override diff --git a/bramble-core/src/main/java/org/briarproject/bramble/db/JdbcDatabase.java b/bramble-core/src/main/java/org/briarproject/bramble/db/JdbcDatabase.java index 3bffa8529..7115808e2 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/db/JdbcDatabase.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/db/JdbcDatabase.java @@ -74,7 +74,7 @@ import static org.briarproject.bramble.db.ExponentialBackoff.calculateExpiry; abstract class JdbcDatabase implements Database { // Package access for testing - static final int CODE_SCHEMA_VERSION = 37; + static final int CODE_SCHEMA_VERSION = 38; // Rotation period offsets for incoming transport keys private static final int OFFSET_PREV = -1; @@ -117,7 +117,7 @@ abstract class JdbcDatabase implements Database { "CREATE TABLE groups" + " (groupId _HASH NOT NULL," + " clientId _STRING NOT NULL," - + " clientVersion INT NOT NULL," + + " majorVersion INT NOT NULL," + " descriptor _BINARY NOT NULL," + " PRIMARY KEY (groupId))"; @@ -276,9 +276,9 @@ abstract class JdbcDatabase implements Database { "CREATE INDEX IF NOT EXISTS contactsByAuthorId" + " ON contacts (authorId)"; - private static final String INDEX_GROUPS_BY_CLIENT_ID_CLIENT_VERSION = - "CREATE INDEX IF NOT EXISTS groupsByClientIdClientVersion" - + " ON groups (clientId, clientVersion)"; + private static final String INDEX_GROUPS_BY_CLIENT_ID_MAJOR_VERSION = + "CREATE INDEX IF NOT EXISTS groupsByClientIdMajorVersion" + + " ON groups (clientId, majorVersion)"; private static final String INDEX_MESSAGE_METADATA_BY_GROUP_ID_STATE = "CREATE INDEX IF NOT EXISTS messageMetadataByGroupIdState" @@ -445,7 +445,7 @@ abstract class JdbcDatabase implements Database { try { s = txn.createStatement(); s.executeUpdate(INDEX_CONTACTS_BY_AUTHOR_ID); - s.executeUpdate(INDEX_GROUPS_BY_CLIENT_ID_CLIENT_VERSION); + s.executeUpdate(INDEX_GROUPS_BY_CLIENT_ID_MAJOR_VERSION); s.executeUpdate(INDEX_MESSAGE_METADATA_BY_GROUP_ID_STATE); s.executeUpdate(INDEX_MESSAGE_DEPENDENCIES_BY_DEPENDENCY_ID); s.executeUpdate(INDEX_STATUSES_BY_CONTACT_ID_GROUP_ID); @@ -614,12 +614,12 @@ abstract class JdbcDatabase implements Database { PreparedStatement ps = null; try { String sql = "INSERT INTO groups" - + " (groupId, clientId, clientVersion, descriptor)" + + " (groupId, clientId, majorVersion, descriptor)" + " VALUES (?, ?, ?, ?)"; ps = txn.prepareStatement(sql); ps.setBytes(1, g.getId().getBytes()); ps.setString(2, g.getClientId().getString()); - ps.setInt(3, g.getClientVersion()); + ps.setInt(3, g.getMajorVersion()); ps.setBytes(4, g.getDescriptor()); int affected = ps.executeUpdate(); if (affected != 1) throw new DbStateException(); @@ -1349,18 +1349,18 @@ abstract class JdbcDatabase implements Database { PreparedStatement ps = null; ResultSet rs = null; try { - String sql = "SELECT clientId, clientVersion, descriptor" + String sql = "SELECT clientId, majorVersion, descriptor" + " FROM groups WHERE groupId = ?"; ps = txn.prepareStatement(sql); ps.setBytes(1, g.getBytes()); rs = ps.executeQuery(); if (!rs.next()) throw new DbStateException(); ClientId clientId = new ClientId(rs.getString(1)); - int clientVersion = rs.getInt(2); + int majorVersion = rs.getInt(2); byte[] descriptor = rs.getBytes(3); rs.close(); ps.close(); - return new Group(g, clientId, clientVersion, descriptor); + return new Group(g, clientId, majorVersion, descriptor); } catch (SQLException e) { tryToClose(rs); tryToClose(ps); @@ -1370,21 +1370,21 @@ abstract class JdbcDatabase implements Database { @Override public Collection getGroups(Connection txn, ClientId c, - int clientVersion) throws DbException { + int majorVersion) throws DbException { PreparedStatement ps = null; ResultSet rs = null; try { String sql = "SELECT groupId, descriptor FROM groups" - + " WHERE clientId = ? AND clientVersion = ?"; + + " WHERE clientId = ? AND majorVersion = ?"; ps = txn.prepareStatement(sql); ps.setString(1, c.getString()); - ps.setInt(2, clientVersion); + ps.setInt(2, majorVersion); rs = ps.executeQuery(); List groups = new ArrayList<>(); while (rs.next()) { GroupId id = new GroupId(rs.getBytes(1)); byte[] descriptor = rs.getBytes(2); - groups.add(new Group(id, c, clientVersion, descriptor)); + groups.add(new Group(id, c, majorVersion, descriptor)); } rs.close(); ps.close(); 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 1fca633de..763e0d636 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 @@ -16,7 +16,7 @@ import dagger.Module; import dagger.Provides; import static org.briarproject.bramble.api.properties.TransportPropertyManager.CLIENT_ID; -import static org.briarproject.bramble.api.properties.TransportPropertyManager.CLIENT_VERSION; +import static org.briarproject.bramble.api.properties.TransportPropertyManager.MAJOR_VERSION; @Module public class PropertiesModule { @@ -35,7 +35,7 @@ public class PropertiesModule { Clock clock) { TransportPropertyValidator validator = new TransportPropertyValidator( clientHelper, metadataEncoder, clock); - validationManager.registerMessageValidator(CLIENT_ID, CLIENT_VERSION, + validationManager.registerMessageValidator(CLIENT_ID, MAJOR_VERSION, validator); return validator; } @@ -48,12 +48,12 @@ public class PropertiesModule { ClientVersioningManager clientVersioningManager, TransportPropertyManagerImpl transportPropertyManager) { lifecycleManager.registerClient(transportPropertyManager); - validationManager.registerIncomingMessageHook(CLIENT_ID, CLIENT_VERSION, + validationManager.registerIncomingMessageHook(CLIENT_ID, MAJOR_VERSION, transportPropertyManager); contactManager.registerContactHook(transportPropertyManager); - clientVersioningManager.registerClient(CLIENT_ID, CLIENT_VERSION); + clientVersioningManager.registerClient(CLIENT_ID, MAJOR_VERSION); clientVersioningManager.registerClientVersioningHook(CLIENT_ID, - CLIENT_VERSION, transportPropertyManager); + MAJOR_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 c9e0662b4..341776612 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 @@ -69,7 +69,7 @@ class TransportPropertyManagerImpl implements TransportPropertyManager, this.contactGroupFactory = contactGroupFactory; this.clock = clock; localGroup = contactGroupFactory.createLocalGroup(CLIENT_ID, - CLIENT_VERSION); + MAJOR_VERSION); } @Override @@ -88,7 +88,7 @@ class TransportPropertyManagerImpl implements TransportPropertyManager, db.addGroup(txn, g); // Apply the client's visibility to the contact group Visibility client = clientVersioningManager.getClientVisibility(txn, - c.getId(), CLIENT_ID, CLIENT_VERSION); + c.getId(), CLIENT_ID, MAJOR_VERSION); if (LOG.isLoggable(INFO)) LOG.info("Applying visibility " + client + " to new contact group"); db.setGroupVisibility(txn, c.getId(), g.getId(), client); @@ -313,7 +313,7 @@ class TransportPropertyManagerImpl implements TransportPropertyManager, private Group getContactGroup(Contact c) { return contactGroupFactory.createContactGroup(CLIENT_ID, - CLIENT_VERSION, c); + MAJOR_VERSION, c); } private void storeMessage(Transaction txn, GroupId g, TransportId t, diff --git a/bramble-core/src/main/java/org/briarproject/bramble/sync/ClientVersion.java b/bramble-core/src/main/java/org/briarproject/bramble/sync/ClientVersion.java index 202176a65..397381220 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/sync/ClientVersion.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/sync/ClientVersion.java @@ -10,11 +10,11 @@ import javax.annotation.concurrent.Immutable; class ClientVersion implements Comparable { final ClientId clientId; - final int clientVersion; + final int majorVersion; - ClientVersion(ClientId clientId, int clientVersion) { + ClientVersion(ClientId clientId, int majorVersion) { this.clientId = clientId; - this.clientVersion = clientVersion; + this.majorVersion = majorVersion; } @Override @@ -22,26 +22,26 @@ class ClientVersion implements Comparable { if (o instanceof ClientVersion) { ClientVersion cv = (ClientVersion) o; return clientId.equals(cv.clientId) - && clientVersion == cv.clientVersion; + && majorVersion == cv.majorVersion; } return false; } @Override public int hashCode() { - return (clientId.hashCode() << 16) + clientVersion; + return (clientId.hashCode() << 16) + majorVersion; } @Override public int compareTo(ClientVersion c) { int compare = clientId.compareTo(c.clientId); if (compare != 0) return compare; - return clientVersion - c.clientVersion; + return majorVersion - c.majorVersion; } @Override public String toString() { - return clientId.getString() + ":" + clientVersion; + return clientId.getString() + ":" + majorVersion; } } diff --git a/bramble-core/src/main/java/org/briarproject/bramble/sync/ClientVersioningManagerImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/sync/ClientVersioningManagerImpl.java index 0e9d79989..7c4b670a2 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/sync/ClientVersioningManagerImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/sync/ClientVersioningManagerImpl.java @@ -75,23 +75,23 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, Client, this.contactGroupFactory = contactGroupFactory; this.clock = clock; localGroup = contactGroupFactory.createLocalGroup(CLIENT_ID, - CLIENT_VERSION); + MAJOR_VERSION); } @Override - public void registerClient(ClientId clientId, int clientVersion) { - clients.add(new ClientVersion(clientId, clientVersion)); + public void registerClient(ClientId clientId, int majorVersion) { + clients.add(new ClientVersion(clientId, majorVersion)); } @Override public void registerClientVersioningHook(ClientId clientId, - int clientVersion, ClientVersioningHook hook) { - hooks.put(new ClientVersion(clientId, clientVersion), hook); + int majorVersion, ClientVersioningHook hook) { + hooks.put(new ClientVersion(clientId, majorVersion), hook); } @Override public Visibility getClientVisibility(Transaction txn, - ContactId contactId, ClientId clientId, int clientVersion) + ContactId contactId, ClientId clientId, int majorVersion) throws DbException { try { Contact contact = db.getContact(txn, contactId); @@ -106,7 +106,7 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, Client, Update remoteUpdate = loadUpdate(txn, latest.remote.messageId); Map visibilities = getVisibilities(localUpdate.states, remoteUpdate.states); - ClientVersion cv = new ClientVersion(clientId, clientVersion); + ClientVersion cv = new ClientVersion(clientId, majorVersion); Visibility v = visibilities.get(cv); return v == null ? INVISIBLE : v; } catch (FormatException e) { @@ -245,7 +245,7 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, Client, private BdfList encodeClientVersions(List versions) { BdfList encoded = new BdfList(); for (ClientVersion cv : versions) - encoded.add(BdfList.of(cv.clientId.getString(), cv.clientVersion)); + encoded.add(BdfList.of(cv.clientId.getString(), cv.majorVersion)); return encoded; } @@ -282,8 +282,8 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, Client, for (int i = 0; i < size; i++) { BdfList cv = body.getList(i); ClientId clientId = new ClientId(cv.getString(0)); - int clientVersion = cv.getLong(1).intValue(); - parsed.add(new ClientVersion(clientId, clientVersion)); + int majorVersion = cv.getLong(1).intValue(); + parsed.add(new ClientVersion(clientId, majorVersion)); } return parsed; } @@ -325,7 +325,7 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, Client, private Group getContactGroup(Contact c) { return contactGroupFactory.createContactGroup(CLIENT_ID, - CLIENT_VERSION, c); + MAJOR_VERSION, c); } private LatestUpdates findLatestUpdates(Transaction txn, GroupId g) @@ -372,11 +372,11 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, Client, private ClientState parseClientState(BdfList clientState) throws FormatException { - // Client ID, client version, active + // Client ID, major version, active ClientId clientId = new ClientId(clientState.getString(0)); - int clientVersion = clientState.getLong(1).intValue(); + int majorVersion = clientState.getLong(1).intValue(); boolean active = clientState.getBoolean(2); - return new ClientState(clientId, clientVersion, active); + return new ClientState(clientId, majorVersion, active); } private long parseUpdateVersion(BdfList body) throws FormatException { @@ -420,7 +420,7 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, Client, private BdfList encodeClientState(ClientState cs) { return BdfList.of(cs.version.clientId.getString(), - cs.version.clientVersion, cs.active); + cs.version.majorVersion, cs.active); } private Map getVisibilities( @@ -536,9 +536,9 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, Client, this.active = active; } - private ClientState(ClientId clientId, int clientVersion, + private ClientState(ClientId clientId, int majorVersion, boolean active) { - this(new ClientVersion(clientId, clientVersion), active); + this(new ClientVersion(clientId, majorVersion), active); } @Override diff --git a/bramble-core/src/main/java/org/briarproject/bramble/sync/ClientVersioningValidator.java b/bramble-core/src/main/java/org/briarproject/bramble/sync/ClientVersioningValidator.java index 2795523a1..7306f22c5 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/sync/ClientVersioningValidator.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/sync/ClientVersioningValidator.java @@ -39,13 +39,13 @@ class ClientVersioningValidator extends BdfMessageValidator { int size = states.size(); for (int i = 0; i < size; i++) { BdfList clientState = states.getList(i); - // Client ID, client version, active + // Client ID, major version, active checkSize(clientState, 3); String clientId = clientState.getString(0); checkLength(clientId, 1, MAX_CLIENT_ID_LENGTH); - int clientVersion = clientState.getLong(1).intValue(); - if (clientVersion < 0) throw new FormatException(); - boolean active = clientState.getBoolean(2); + int majorVersion = clientState.getLong(1).intValue(); + if (majorVersion < 0) throw new FormatException(); + clientState.getBoolean(2); } // Update version long updateVersion = body.getLong(1); diff --git a/bramble-core/src/main/java/org/briarproject/bramble/sync/GroupFactoryImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/sync/GroupFactoryImpl.java index 6f12e6ff8..5a46a4aad 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/sync/GroupFactoryImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/sync/GroupFactoryImpl.java @@ -28,12 +28,12 @@ class GroupFactoryImpl implements GroupFactory { } @Override - public Group createGroup(ClientId c, int clientVersion, byte[] descriptor) { - byte[] clientVersionBytes = new byte[INT_32_BYTES]; - ByteUtils.writeUint32(clientVersion, clientVersionBytes, 0); + public Group createGroup(ClientId c, int majorVersion, byte[] descriptor) { + byte[] majorVersionBytes = new byte[INT_32_BYTES]; + ByteUtils.writeUint32(majorVersion, majorVersionBytes, 0); byte[] hash = crypto.hash(LABEL, new byte[] {FORMAT_VERSION}, - StringUtils.toUtf8(c.getString()), clientVersionBytes, + StringUtils.toUtf8(c.getString()), majorVersionBytes, descriptor); - return new Group(new GroupId(hash), c, clientVersion, descriptor); + return new Group(new GroupId(hash), c, majorVersion, descriptor); } } diff --git a/bramble-core/src/main/java/org/briarproject/bramble/sync/SyncModule.java b/bramble-core/src/main/java/org/briarproject/bramble/sync/SyncModule.java index f83e4d64c..04c6ca0db 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/sync/SyncModule.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/sync/SyncModule.java @@ -28,7 +28,7 @@ import dagger.Module; import dagger.Provides; import static org.briarproject.bramble.api.sync.ClientVersioningManager.CLIENT_ID; -import static org.briarproject.bramble.api.sync.ClientVersioningManager.CLIENT_VERSION; +import static org.briarproject.bramble.api.sync.ClientVersioningManager.MAJOR_VERSION; @Module public class SyncModule { @@ -111,7 +111,7 @@ public class SyncModule { lifecycleManager.registerClient(clientVersioningManager); lifecycleManager.registerService(clientVersioningManager); contactManager.registerContactHook(clientVersioningManager); - validationManager.registerIncomingMessageHook(CLIENT_ID, CLIENT_VERSION, + validationManager.registerIncomingMessageHook(CLIENT_ID, MAJOR_VERSION, clientVersioningManager); return clientVersioningManager; } @@ -123,7 +123,7 @@ public class SyncModule { Clock clock, ValidationManager validationManager) { ClientVersioningValidator validator = new ClientVersioningValidator( clientHelper, metadataEncoder, clock); - validationManager.registerMessageValidator(CLIENT_ID, CLIENT_VERSION, + validationManager.registerMessageValidator(CLIENT_ID, MAJOR_VERSION, validator); return validator; } diff --git a/bramble-core/src/main/java/org/briarproject/bramble/sync/ValidationManagerImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/sync/ValidationManagerImpl.java index 16ce78a43..f6f977b73 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/sync/ValidationManagerImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/sync/ValidationManagerImpl.java @@ -81,15 +81,15 @@ class ValidationManagerImpl implements ValidationManager, Service, } @Override - public void registerMessageValidator(ClientId c, int clientVersion, + public void registerMessageValidator(ClientId c, int majorVersion, MessageValidator v) { - validators.put(new ClientVersion(c, clientVersion), v); + validators.put(new ClientVersion(c, majorVersion), v); } @Override - public void registerIncomingMessageHook(ClientId c, int clientVersion, + public void registerIncomingMessageHook(ClientId c, int majorVersion, IncomingMessageHook hook) { - hooks.put(new ClientVersion(c, clientVersion), hook); + hooks.put(new ClientVersion(c, majorVersion), hook); } private void validateOutstandingMessagesAsync() { @@ -200,11 +200,11 @@ class ValidationManagerImpl implements ValidationManager, Service, Message m = messageFactory.createMessage(id, raw); Group g = db.getGroup(txn, m.getGroupId()); ClientId c = g.getClientId(); - int clientVersion = g.getClientVersion(); + int majorVersion = g.getMajorVersion(); Metadata meta = db.getMessageMetadataForValidator(txn, id); DeliveryResult result = - deliverMessage(txn, m, c, clientVersion, meta); + deliverMessage(txn, m, c, majorVersion, meta); if (result.valid) { pending.addAll(getPendingDependents(txn, id)); if (result.share) { @@ -241,7 +241,7 @@ class ValidationManagerImpl implements ValidationManager, Service, @ValidationExecutor private void validateMessage(Message m, Group g) { ClientVersion cv = - new ClientVersion(g.getClientId(), g.getClientVersion()); + new ClientVersion(g.getClientId(), g.getMajorVersion()); MessageValidator v = validators.get(cv); if (v == null) { if (LOG.isLoggable(WARNING)) LOG.warning("No validator for " + cv); @@ -249,7 +249,7 @@ class ValidationManagerImpl implements ValidationManager, Service, try { MessageContext context = v.validateMessage(m, g); storeMessageContextAsync(m, g.getClientId(), - g.getClientVersion(), context); + g.getMajorVersion(), context); } catch (InvalidMessageException e) { if (LOG.isLoggable(INFO)) LOG.log(INFO, e.toString(), e); @@ -261,13 +261,13 @@ class ValidationManagerImpl implements ValidationManager, Service, } private void storeMessageContextAsync(Message m, ClientId c, - int clientVersion, MessageContext result) { + int majorVersion, MessageContext result) { dbExecutor.execute(() -> - storeMessageContext(m, c, clientVersion, result)); + storeMessageContext(m, c, majorVersion, result)); } @DatabaseExecutor - private void storeMessageContext(Message m, ClientId c, int clientVersion, + private void storeMessageContext(Message m, ClientId c, int majorVersion, MessageContext context) { try { MessageId id = m.getId(); @@ -299,7 +299,7 @@ class ValidationManagerImpl implements ValidationManager, Service, db.mergeMessageMetadata(txn, id, meta); if (allDelivered) { DeliveryResult result = - deliverMessage(txn, m, c, clientVersion, meta); + deliverMessage(txn, m, c, majorVersion, meta); if (result.valid) { pending = getPendingDependents(txn, id); if (result.share) { @@ -331,10 +331,10 @@ class ValidationManagerImpl implements ValidationManager, Service, @DatabaseExecutor private DeliveryResult deliverMessage(Transaction txn, Message m, - ClientId c, int clientVersion, Metadata meta) throws DbException { + ClientId c, int majorVersion, Metadata meta) throws DbException { // Deliver the message to the client if it's registered a hook boolean shareMsg = false; - ClientVersion cv = new ClientVersion(c, clientVersion); + ClientVersion cv = new ClientVersion(c, majorVersion); IncomingMessageHook hook = hooks.get(cv); if (hook != null) { try { diff --git a/bramble-core/src/test/java/org/briarproject/bramble/db/DatabaseComponentImplTest.java b/bramble-core/src/test/java/org/briarproject/bramble/db/DatabaseComponentImplTest.java index 5d08264f7..c228bf67e 100644 --- a/bramble-core/src/test/java/org/briarproject/bramble/db/DatabaseComponentImplTest.java +++ b/bramble-core/src/test/java/org/briarproject/bramble/db/DatabaseComponentImplTest.java @@ -89,7 +89,7 @@ public class DatabaseComponentImplTest extends BrambleMockTestCase { private final Object txn = new Object(); private final ClientId clientId; - private final int clientVersion; + private final int majorVersion; private final GroupId groupId; private final Group group; private final Author author; @@ -107,8 +107,8 @@ public class DatabaseComponentImplTest extends BrambleMockTestCase { public DatabaseComponentImplTest() { clientId = getClientId(); - clientVersion = 123; - group = getGroup(clientId, clientVersion); + majorVersion = 123; + group = getGroup(clientId, majorVersion); groupId = group.getId(); author = getAuthor(); localAuthor = getLocalAuthor(); @@ -177,7 +177,7 @@ public class DatabaseComponentImplTest extends BrambleMockTestCase { oneOf(database).containsGroup(txn, groupId); will(returnValue(true)); // getGroups() - oneOf(database).getGroups(txn, clientId, clientVersion); + oneOf(database).getGroups(txn, clientId, majorVersion); will(returnValue(singletonList(group))); // removeGroup() oneOf(database).containsGroup(txn, groupId); @@ -217,7 +217,7 @@ public class DatabaseComponentImplTest extends BrambleMockTestCase { db.addGroup(transaction, group); // First time - listeners called db.addGroup(transaction, group); // Second time - not called assertEquals(singletonList(group), - db.getGroups(transaction, clientId, clientVersion)); + db.getGroups(transaction, clientId, majorVersion)); db.removeGroup(transaction, group); db.removeContact(transaction, contactId); db.removeLocalAuthor(transaction, localAuthor.getId()); diff --git a/bramble-core/src/test/java/org/briarproject/bramble/db/JdbcDatabaseTest.java b/bramble-core/src/test/java/org/briarproject/bramble/db/JdbcDatabaseTest.java index 71f7b2985..d5b29dc65 100644 --- a/bramble-core/src/test/java/org/briarproject/bramble/db/JdbcDatabaseTest.java +++ b/bramble-core/src/test/java/org/briarproject/bramble/db/JdbcDatabaseTest.java @@ -82,7 +82,7 @@ public abstract class JdbcDatabaseTest extends BrambleTestCase { private final File testDir = TestUtils.getTestDirectory(); private final GroupId groupId; private final ClientId clientId; - private final int clientVersion; + private final int majorVersion; private final Group group; private final Author author; private final LocalAuthor localAuthor; @@ -97,8 +97,8 @@ public abstract class JdbcDatabaseTest extends BrambleTestCase { JdbcDatabaseTest() throws Exception { clientId = getClientId(); - clientVersion = 123; - group = getGroup(clientId, clientVersion); + majorVersion = 123; + group = getGroup(clientId, majorVersion); groupId = group.getId(); author = getAuthor(); localAuthor = getLocalAuthor(); @@ -1835,12 +1835,12 @@ public abstract class JdbcDatabaseTest extends BrambleTestCase { Database db = open(false); Connection txn = db.startTransaction(); - assertEquals(emptyList(), db.getGroups(txn, clientId, clientVersion)); + assertEquals(emptyList(), db.getGroups(txn, clientId, majorVersion)); db.addGroup(txn, group); assertEquals(singletonList(group), - db.getGroups(txn, clientId, clientVersion)); + db.getGroups(txn, clientId, majorVersion)); db.removeGroup(txn, groupId); - assertEquals(emptyList(), db.getGroups(txn, clientId, clientVersion)); + assertEquals(emptyList(), db.getGroups(txn, clientId, majorVersion)); db.commitTransaction(txn); db.close(); 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 e0a84d6c6..174d6fde9 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 @@ -32,7 +32,7 @@ import java.util.Map; import static java.util.Collections.singletonList; import static org.briarproject.bramble.api.properties.TransportPropertyManager.CLIENT_ID; -import static org.briarproject.bramble.api.properties.TransportPropertyManager.CLIENT_VERSION; +import static org.briarproject.bramble.api.properties.TransportPropertyManager.MAJOR_VERSION; import static org.briarproject.bramble.api.sync.Group.Visibility.SHARED; import static org.briarproject.bramble.api.sync.SyncConstants.MAX_MESSAGE_BODY_LENGTH; import static org.briarproject.bramble.test.TestUtils.getAuthor; @@ -55,7 +55,7 @@ public class TransportPropertyManagerImplTest extends BrambleMockTestCase { context.mock(ContactGroupFactory.class); private final Clock clock = context.mock(Clock.class); - private final Group localGroup = getGroup(CLIENT_ID, CLIENT_VERSION); + private final Group localGroup = getGroup(CLIENT_ID, MAJOR_VERSION); private final LocalAuthor localAuthor = getLocalAuthor(); private final BdfDictionary fooPropertiesDict = BdfDictionary.of( new BdfEntry("fooKey1", "fooValue1"), @@ -81,7 +81,7 @@ public class TransportPropertyManagerImplTest extends BrambleMockTestCase { private TransportPropertyManagerImpl createInstance() { context.checking(new Expectations() {{ oneOf(contactGroupFactory).createLocalGroup(CLIENT_ID, - CLIENT_VERSION); + MAJOR_VERSION); will(returnValue(localGroup)); }}); return new TransportPropertyManagerImpl(db, clientHelper, @@ -93,7 +93,7 @@ public class TransportPropertyManagerImplTest extends BrambleMockTestCase { public void testCreatesGroupsAtStartup() throws Exception { Transaction txn = new Transaction(null, false); Contact contact = getContact(true); - Group contactGroup = getGroup(CLIENT_ID, CLIENT_VERSION); + Group contactGroup = getGroup(CLIENT_ID, MAJOR_VERSION); context.checking(new Expectations() {{ oneOf(db).containsGroup(txn, localGroup.getId()); @@ -102,11 +102,11 @@ public class TransportPropertyManagerImplTest extends BrambleMockTestCase { oneOf(db).getContacts(txn); will(returnValue(singletonList(contact))); oneOf(contactGroupFactory).createContactGroup(CLIENT_ID, - CLIENT_VERSION, contact); + MAJOR_VERSION, contact); will(returnValue(contactGroup)); oneOf(db).addGroup(txn, contactGroup); oneOf(clientVersioningManager).getClientVisibility(txn, - contact.getId(), CLIENT_ID, CLIENT_VERSION); + contact.getId(), CLIENT_ID, MAJOR_VERSION); will(returnValue(SHARED)); oneOf(db).setGroupVisibility(txn, contact.getId(), contactGroup.getId(), SHARED); @@ -140,16 +140,16 @@ public class TransportPropertyManagerImplTest extends BrambleMockTestCase { public void testCreatesContactGroupWhenAddingContact() throws Exception { Transaction txn = new Transaction(null, false); Contact contact = getContact(true); - Group contactGroup = getGroup(CLIENT_ID, CLIENT_VERSION); + Group contactGroup = getGroup(CLIENT_ID, MAJOR_VERSION); context.checking(new Expectations() {{ // Create the group and share it with the contact oneOf(contactGroupFactory).createContactGroup(CLIENT_ID, - CLIENT_VERSION, contact); + MAJOR_VERSION, contact); will(returnValue(contactGroup)); oneOf(db).addGroup(txn, contactGroup); oneOf(clientVersioningManager).getClientVisibility(txn, - contact.getId(), CLIENT_ID, CLIENT_VERSION); + contact.getId(), CLIENT_ID, MAJOR_VERSION); will(returnValue(SHARED)); oneOf(db).setGroupVisibility(txn, contact.getId(), contactGroup.getId(), SHARED); @@ -169,11 +169,11 @@ public class TransportPropertyManagerImplTest extends BrambleMockTestCase { public void testRemovesGroupWhenRemovingContact() throws Exception { Transaction txn = new Transaction(null, false); Contact contact = getContact(true); - Group contactGroup = getGroup(CLIENT_ID, CLIENT_VERSION); + Group contactGroup = getGroup(CLIENT_ID, MAJOR_VERSION); context.checking(new Expectations() {{ oneOf(contactGroupFactory).createContactGroup(CLIENT_ID, - CLIENT_VERSION, contact); + MAJOR_VERSION, contact); will(returnValue(contactGroup)); oneOf(db).removeGroup(txn, contactGroup); }}); @@ -304,7 +304,7 @@ public class TransportPropertyManagerImplTest extends BrambleMockTestCase { @Test public void testStoresRemotePropertiesWithVersion0() throws Exception { Contact contact = getContact(true); - Group contactGroup = getGroup(CLIENT_ID, CLIENT_VERSION); + Group contactGroup = getGroup(CLIENT_ID, MAJOR_VERSION); Transaction txn = new Transaction(null, false); Map properties = new LinkedHashMap<>(); @@ -315,7 +315,7 @@ public class TransportPropertyManagerImplTest extends BrambleMockTestCase { oneOf(db).getContact(txn, contact.getId()); will(returnValue(contact)); oneOf(contactGroupFactory).createContactGroup(CLIENT_ID, - CLIENT_VERSION, contact); + MAJOR_VERSION, contact); will(returnValue(contactGroup)); }}); expectStoreMessage(txn, contactGroup.getId(), "foo", fooPropertiesDict, @@ -418,8 +418,8 @@ public class TransportPropertyManagerImplTest extends BrambleMockTestCase { Contact contact3 = getContact(true); List contacts = Arrays.asList(contact1, contact2, contact3); - Group contactGroup2 = getGroup(CLIENT_ID, CLIENT_VERSION); - Group contactGroup3 = getGroup(CLIENT_ID, CLIENT_VERSION); + Group contactGroup2 = getGroup(CLIENT_ID, MAJOR_VERSION); + Group contactGroup3 = getGroup(CLIENT_ID, MAJOR_VERSION); Map messageMetadata3 = new LinkedHashMap<>(); // A remote update for another transport should be ignored @@ -453,14 +453,14 @@ public class TransportPropertyManagerImplTest extends BrambleMockTestCase { // First contact: skipped because not active // Second contact: no updates oneOf(contactGroupFactory).createContactGroup(CLIENT_ID, - CLIENT_VERSION, contact2); + MAJOR_VERSION, contact2); will(returnValue(contactGroup2)); oneOf(clientHelper).getMessageMetadataAsDictionary(txn, contactGroup2.getId()); will(returnValue(Collections.emptyMap())); // Third contact: returns an update oneOf(contactGroupFactory).createContactGroup(CLIENT_ID, - CLIENT_VERSION, contact3); + MAJOR_VERSION, contact3); will(returnValue(contactGroup3)); oneOf(clientHelper).getMessageMetadataAsDictionary(txn, contactGroup3.getId()); @@ -521,7 +521,7 @@ public class TransportPropertyManagerImplTest extends BrambleMockTestCase { public void testMergingNewPropertiesCreatesUpdate() throws Exception { Transaction txn = new Transaction(null, false); Contact contact = getContact(true); - Group contactGroup = getGroup(CLIENT_ID, CLIENT_VERSION); + Group contactGroup = getGroup(CLIENT_ID, MAJOR_VERSION); context.checking(new Expectations() {{ oneOf(db).startTransaction(false); @@ -537,7 +537,7 @@ public class TransportPropertyManagerImplTest extends BrambleMockTestCase { oneOf(db).getContacts(txn); will(returnValue(singletonList(contact))); oneOf(contactGroupFactory).createContactGroup(CLIENT_ID, - CLIENT_VERSION, contact); + MAJOR_VERSION, contact); will(returnValue(contactGroup)); oneOf(clientHelper).getMessageMetadataAsDictionary(txn, contactGroup.getId()); @@ -556,7 +556,7 @@ public class TransportPropertyManagerImplTest extends BrambleMockTestCase { public void testMergingUpdatedPropertiesCreatesUpdate() throws Exception { Transaction txn = new Transaction(null, false); Contact contact = getContact(true); - Group contactGroup = getGroup(CLIENT_ID, CLIENT_VERSION); + Group contactGroup = getGroup(CLIENT_ID, MAJOR_VERSION); BdfDictionary oldMetadata = BdfDictionary.of( new BdfEntry("transportId", "foo"), new BdfEntry("version", 1), @@ -596,7 +596,7 @@ public class TransportPropertyManagerImplTest extends BrambleMockTestCase { oneOf(db).getContacts(txn); will(returnValue(singletonList(contact))); oneOf(contactGroupFactory).createContactGroup(CLIENT_ID, - CLIENT_VERSION, contact); + MAJOR_VERSION, contact); will(returnValue(contactGroup)); oneOf(clientHelper).getMessageMetadataAsDictionary(txn, contactGroup.getId()); diff --git a/bramble-core/src/test/java/org/briarproject/bramble/properties/TransportPropertyValidatorTest.java b/bramble-core/src/test/java/org/briarproject/bramble/properties/TransportPropertyValidatorTest.java index 600fb2ef8..717e5370d 100644 --- a/bramble-core/src/test/java/org/briarproject/bramble/properties/TransportPropertyValidatorTest.java +++ b/bramble-core/src/test/java/org/briarproject/bramble/properties/TransportPropertyValidatorTest.java @@ -19,7 +19,7 @@ import java.io.IOException; import static org.briarproject.bramble.api.plugin.TransportId.MAX_TRANSPORT_ID_LENGTH; import static org.briarproject.bramble.api.properties.TransportPropertyManager.CLIENT_ID; -import static org.briarproject.bramble.api.properties.TransportPropertyManager.CLIENT_VERSION; +import static org.briarproject.bramble.api.properties.TransportPropertyManager.MAJOR_VERSION; import static org.briarproject.bramble.test.TestUtils.getGroup; import static org.briarproject.bramble.test.TestUtils.getMessage; import static org.briarproject.bramble.test.TestUtils.getTransportId; @@ -43,7 +43,7 @@ public class TransportPropertyValidatorTest extends BrambleMockTestCase { transportProperties = new TransportProperties(); transportProperties.put("foo", "bar"); - group = getGroup(CLIENT_ID, CLIENT_VERSION); + group = getGroup(CLIENT_ID, MAJOR_VERSION); message = getMessage(group.getId()); MetadataEncoder metadataEncoder = context.mock(MetadataEncoder.class); diff --git a/bramble-core/src/test/java/org/briarproject/bramble/sync/SyncIntegrationTest.java b/bramble-core/src/test/java/org/briarproject/bramble/sync/SyncIntegrationTest.java index 593a8ef71..1ceedbb20 100644 --- a/bramble-core/src/test/java/org/briarproject/bramble/sync/SyncIntegrationTest.java +++ b/bramble-core/src/test/java/org/briarproject/bramble/sync/SyncIntegrationTest.java @@ -81,9 +81,9 @@ public class SyncIntegrationTest extends BrambleTestCase { streamNumber = 123; // Create a group ClientId clientId = getClientId(); - int clientVersion = 1234567890; + int majorVersion = 1234567890; byte[] descriptor = new byte[MAX_GROUP_DESCRIPTOR_LENGTH]; - Group group = groupFactory.createGroup(clientId, clientVersion, + Group group = groupFactory.createGroup(clientId, majorVersion, descriptor); // Add two messages to the group long timestamp = System.currentTimeMillis(); diff --git a/bramble-core/src/test/java/org/briarproject/bramble/sync/ValidationManagerImplTest.java b/bramble-core/src/test/java/org/briarproject/bramble/sync/ValidationManagerImplTest.java index 3131c4fb5..e3d7520e5 100644 --- a/bramble-core/src/test/java/org/briarproject/bramble/sync/ValidationManagerImplTest.java +++ b/bramble-core/src/test/java/org/briarproject/bramble/sync/ValidationManagerImplTest.java @@ -53,11 +53,11 @@ public class ValidationManagerImplTest extends BrambleMockTestCase { private final Executor dbExecutor = new ImmediateExecutor(); private final Executor validationExecutor = new ImmediateExecutor(); private final ClientId clientId = getClientId(); - private final int clientVersion = 123; + private final int majorVersion = 123; private final MessageId messageId = new MessageId(getRandomId()); private final MessageId messageId1 = new MessageId(getRandomId()); private final MessageId messageId2 = new MessageId(getRandomId()); - private final Group group = getGroup(clientId, clientVersion); + private final Group group = getGroup(clientId, majorVersion); private final GroupId groupId = group.getId(); private final long timestamp = System.currentTimeMillis(); private final byte[] raw = new byte[123]; @@ -86,8 +86,8 @@ public class ValidationManagerImplTest extends BrambleMockTestCase { public void setUp() { vm = new ValidationManagerImpl(db, dbExecutor, validationExecutor, messageFactory); - vm.registerMessageValidator(clientId, clientVersion, validator); - vm.registerIncomingMessageHook(clientId, clientVersion, hook); + vm.registerMessageValidator(clientId, majorVersion, validator); + vm.registerIncomingMessageHook(clientId, majorVersion, hook); } @Test diff --git a/briar-api/src/main/java/org/briarproject/briar/api/blog/BlogManager.java b/briar-api/src/main/java/org/briarproject/briar/api/blog/BlogManager.java index bbf1da094..c32f16736 100644 --- a/briar-api/src/main/java/org/briarproject/briar/api/blog/BlogManager.java +++ b/briar-api/src/main/java/org/briarproject/briar/api/blog/BlogManager.java @@ -22,9 +22,9 @@ public interface BlogManager { ClientId CLIENT_ID = new ClientId("org.briarproject.briar.blog"); /** - * The current version of the blog client. + * The current major version of the blog client. */ - int CLIENT_VERSION = 0; + int MAJOR_VERSION = 0; /** * Adds the given {@link Blog).} diff --git a/briar-api/src/main/java/org/briarproject/briar/api/blog/BlogSharingManager.java b/briar-api/src/main/java/org/briarproject/briar/api/blog/BlogSharingManager.java index e4b68bd6b..2e4a02d3b 100644 --- a/briar-api/src/main/java/org/briarproject/briar/api/blog/BlogSharingManager.java +++ b/briar-api/src/main/java/org/briarproject/briar/api/blog/BlogSharingManager.java @@ -11,7 +11,7 @@ public interface BlogSharingManager extends SharingManager { ClientId CLIENT_ID = new ClientId("org.briarproject.briar.blog.sharing"); /** - * The current version of the blog sharing client. + * The current major version of the blog sharing client. */ - int CLIENT_VERSION = 0; + int MAJOR_VERSION = 0; } diff --git a/briar-api/src/main/java/org/briarproject/briar/api/feed/FeedManager.java b/briar-api/src/main/java/org/briarproject/briar/api/feed/FeedManager.java index 50f67963a..98adcea29 100644 --- a/briar-api/src/main/java/org/briarproject/briar/api/feed/FeedManager.java +++ b/briar-api/src/main/java/org/briarproject/briar/api/feed/FeedManager.java @@ -16,9 +16,9 @@ public interface FeedManager { ClientId CLIENT_ID = new ClientId("org.briarproject.briar.feed"); /** - * The current version of the RSS feed client. + * The current major version of the RSS feed client. */ - int CLIENT_VERSION = 0; + int MAJOR_VERSION = 0; /** * Adds an RSS feed as a new dedicated blog. diff --git a/briar-api/src/main/java/org/briarproject/briar/api/forum/ForumManager.java b/briar-api/src/main/java/org/briarproject/briar/api/forum/ForumManager.java index 8eb7eb1ad..0d67a9c42 100644 --- a/briar-api/src/main/java/org/briarproject/briar/api/forum/ForumManager.java +++ b/briar-api/src/main/java/org/briarproject/briar/api/forum/ForumManager.java @@ -23,9 +23,9 @@ public interface ForumManager { ClientId CLIENT_ID = new ClientId("org.briarproject.briar.forum"); /** - * The current version of the forum client. + * The current major version of the forum client. */ - int CLIENT_VERSION = 0; + int MAJOR_VERSION = 0; /** * Subscribes to a forum. diff --git a/briar-api/src/main/java/org/briarproject/briar/api/forum/ForumSharingManager.java b/briar-api/src/main/java/org/briarproject/briar/api/forum/ForumSharingManager.java index 5620e024c..c021a23a9 100644 --- a/briar-api/src/main/java/org/briarproject/briar/api/forum/ForumSharingManager.java +++ b/briar-api/src/main/java/org/briarproject/briar/api/forum/ForumSharingManager.java @@ -11,7 +11,7 @@ public interface ForumSharingManager extends SharingManager { ClientId CLIENT_ID = new ClientId("org.briarproject.briar.forum.sharing"); /** - * The current version of the forum sharing client. + * The current major version of the forum sharing client. */ - int CLIENT_VERSION = 0; + int MAJOR_VERSION = 0; } diff --git a/briar-api/src/main/java/org/briarproject/briar/api/introduction/IntroductionManager.java b/briar-api/src/main/java/org/briarproject/briar/api/introduction/IntroductionManager.java index 9a267c5c2..c337dd44c 100644 --- a/briar-api/src/main/java/org/briarproject/briar/api/introduction/IntroductionManager.java +++ b/briar-api/src/main/java/org/briarproject/briar/api/introduction/IntroductionManager.java @@ -21,9 +21,9 @@ public interface IntroductionManager extends ConversationClient { ClientId CLIENT_ID = new ClientId("org.briarproject.briar.introduction"); /** - * The current version of the introduction client. + * The current major version of the introduction client. */ - int CLIENT_VERSION = 1; + int MAJOR_VERSION = 1; /** * Returns true if both contacts can be introduced at this moment. diff --git a/briar-api/src/main/java/org/briarproject/briar/api/messaging/MessagingManager.java b/briar-api/src/main/java/org/briarproject/briar/api/messaging/MessagingManager.java index 65f406a6f..be28aaa7b 100644 --- a/briar-api/src/main/java/org/briarproject/briar/api/messaging/MessagingManager.java +++ b/briar-api/src/main/java/org/briarproject/briar/api/messaging/MessagingManager.java @@ -19,9 +19,9 @@ public interface MessagingManager extends ConversationClient { ClientId CLIENT_ID = new ClientId("org.briarproject.briar.messaging"); /** - * The current version of the messaging client. + * The current major version of the messaging client. */ - int CLIENT_VERSION = 0; + int MAJOR_VERSION = 0; /** * Stores a local private message. diff --git a/briar-api/src/main/java/org/briarproject/briar/api/privategroup/PrivateGroupManager.java b/briar-api/src/main/java/org/briarproject/briar/api/privategroup/PrivateGroupManager.java index 7d08ae016..4034c4d61 100644 --- a/briar-api/src/main/java/org/briarproject/briar/api/privategroup/PrivateGroupManager.java +++ b/briar-api/src/main/java/org/briarproject/briar/api/privategroup/PrivateGroupManager.java @@ -22,9 +22,9 @@ public interface PrivateGroupManager { ClientId CLIENT_ID = new ClientId("org.briarproject.briar.privategroup"); /** - * The current version of the private group client. + * The current major version of the private group client. */ - int CLIENT_VERSION = 0; + int MAJOR_VERSION = 0; /** * Adds a new private group and joins it. diff --git a/briar-api/src/main/java/org/briarproject/briar/api/privategroup/invitation/GroupInvitationManager.java b/briar-api/src/main/java/org/briarproject/briar/api/privategroup/invitation/GroupInvitationManager.java index fc3ca339f..e510c6dec 100644 --- a/briar-api/src/main/java/org/briarproject/briar/api/privategroup/invitation/GroupInvitationManager.java +++ b/briar-api/src/main/java/org/briarproject/briar/api/privategroup/invitation/GroupInvitationManager.java @@ -26,9 +26,9 @@ public interface GroupInvitationManager extends ConversationClient { new ClientId("org.briarproject.briar.privategroup.invitation"); /** - * The current version of the private group invitation client. + * The current major version of the private group invitation client. */ - int CLIENT_VERSION = 0; + int MAJOR_VERSION = 0; /** * Sends an invitation to share the given private group with the given diff --git a/briar-core/src/main/java/org/briarproject/briar/blog/BlogFactoryImpl.java b/briar-core/src/main/java/org/briarproject/briar/blog/BlogFactoryImpl.java index aecc020f9..ca7887f0d 100644 --- a/briar-core/src/main/java/org/briarproject/briar/blog/BlogFactoryImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/blog/BlogFactoryImpl.java @@ -15,7 +15,7 @@ import javax.inject.Inject; import static org.briarproject.bramble.util.ValidationUtils.checkSize; import static org.briarproject.briar.api.blog.BlogManager.CLIENT_ID; -import static org.briarproject.briar.api.blog.BlogManager.CLIENT_VERSION; +import static org.briarproject.briar.api.blog.BlogManager.MAJOR_VERSION; @Immutable @NotNullByDefault @@ -45,7 +45,7 @@ class BlogFactoryImpl implements BlogFactory { try { BdfList blog = BdfList.of(clientHelper.toList(a), rssFeed); byte[] descriptor = clientHelper.toByteArray(blog); - Group g = groupFactory.createGroup(CLIENT_ID, CLIENT_VERSION, + Group g = groupFactory.createGroup(CLIENT_ID, MAJOR_VERSION, descriptor); return new Blog(g, a, rssFeed); } catch (FormatException e) { diff --git a/briar-core/src/main/java/org/briarproject/briar/blog/BlogManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/blog/BlogManagerImpl.java index dab2efccb..6a05b9a15 100644 --- a/briar-core/src/main/java/org/briarproject/briar/blog/BlogManagerImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/blog/BlogManagerImpl.java @@ -425,7 +425,7 @@ class BlogManagerImpl extends BdfIncomingMessageHook implements BlogManager, Collection groups; Transaction txn = db.startTransaction(true); try { - groups = db.getGroups(txn, CLIENT_ID, CLIENT_VERSION); + groups = db.getGroups(txn, CLIENT_ID, MAJOR_VERSION); for (Group g : groups) { blogs.add(blogFactory.parseBlog(g)); } diff --git a/briar-core/src/main/java/org/briarproject/briar/blog/BlogModule.java b/briar-core/src/main/java/org/briarproject/briar/blog/BlogModule.java index 54f8b9614..dcc829d39 100644 --- a/briar-core/src/main/java/org/briarproject/briar/blog/BlogModule.java +++ b/briar-core/src/main/java/org/briarproject/briar/blog/BlogModule.java @@ -19,7 +19,7 @@ import dagger.Module; import dagger.Provides; import static org.briarproject.briar.api.blog.BlogManager.CLIENT_ID; -import static org.briarproject.briar.api.blog.BlogManager.CLIENT_VERSION; +import static org.briarproject.briar.api.blog.BlogManager.MAJOR_VERSION; @Module public class BlogModule { @@ -38,7 +38,7 @@ public class BlogModule { ValidationManager validationManager) { lifecycleManager.registerClient(blogManager); contactManager.registerContactHook(blogManager); - validationManager.registerIncomingMessageHook(CLIENT_ID, CLIENT_VERSION, + validationManager.registerIncomingMessageHook(CLIENT_ID, MAJOR_VERSION, blogManager); return blogManager; } @@ -64,7 +64,7 @@ public class BlogModule { BlogPostValidator validator = new BlogPostValidator(groupFactory, messageFactory, blogFactory, clientHelper, metadataEncoder, clock); - validationManager.registerMessageValidator(CLIENT_ID, CLIENT_VERSION, + validationManager.registerMessageValidator(CLIENT_ID, MAJOR_VERSION, validator); return validator; } diff --git a/briar-core/src/main/java/org/briarproject/briar/blog/BlogPostValidator.java b/briar-core/src/main/java/org/briarproject/briar/blog/BlogPostValidator.java index 6dc845623..0b53468df 100644 --- a/briar-core/src/main/java/org/briarproject/briar/blog/BlogPostValidator.java +++ b/briar-core/src/main/java/org/briarproject/briar/blog/BlogPostValidator.java @@ -42,7 +42,7 @@ import static org.briarproject.briar.api.blog.BlogConstants.KEY_TYPE; import static org.briarproject.briar.api.blog.BlogConstants.MAX_BLOG_COMMENT_LENGTH; import static org.briarproject.briar.api.blog.BlogConstants.MAX_BLOG_POST_BODY_LENGTH; import static org.briarproject.briar.api.blog.BlogManager.CLIENT_ID; -import static org.briarproject.briar.api.blog.BlogManager.CLIENT_VERSION; +import static org.briarproject.briar.api.blog.BlogManager.MAJOR_VERSION; import static org.briarproject.briar.api.blog.BlogPostFactory.SIGNING_LABEL_COMMENT; import static org.briarproject.briar.api.blog.BlogPostFactory.SIGNING_LABEL_POST; import static org.briarproject.briar.api.blog.MessageType.COMMENT; @@ -195,7 +195,7 @@ class BlogPostValidator extends BdfMessageValidator { checkLength(signature, 1, MAX_SIGNATURE_LENGTH); // Get and Validate the Wrapped Message - Group wGroup = groupFactory.createGroup(CLIENT_ID, CLIENT_VERSION, + Group wGroup = groupFactory.createGroup(CLIENT_ID, MAJOR_VERSION, descriptor); Blog wBlog = blogFactory.parseBlog(wGroup); BdfList wBodyList = BdfList.of(POST.getInt(), content, signature); @@ -258,7 +258,7 @@ class BlogPostValidator extends BdfMessageValidator { MessageId parentId = new MessageId(parentIdBytes); // Get and Validate the Wrapped Comment - Group wGroup = groupFactory.createGroup(CLIENT_ID, CLIENT_VERSION, + Group wGroup = groupFactory.createGroup(CLIENT_ID, MAJOR_VERSION, descriptor); BdfList wBodyList = BdfList.of(COMMENT.getInt(), comment, pOriginalId, oldId, signature); diff --git a/briar-core/src/main/java/org/briarproject/briar/feed/FeedManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/feed/FeedManagerImpl.java index f4d94413d..a4d58d361 100644 --- a/briar-core/src/main/java/org/briarproject/briar/feed/FeedManagerImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/feed/FeedManagerImpl.java @@ -496,7 +496,7 @@ class FeedManagerImpl implements FeedManager, Client, EventListener, } private Group getLocalGroup() { - return contactGroupFactory.createLocalGroup(CLIENT_ID, CLIENT_VERSION); + return contactGroupFactory.createLocalGroup(CLIENT_ID, MAJOR_VERSION); } } diff --git a/briar-core/src/main/java/org/briarproject/briar/forum/ForumFactoryImpl.java b/briar-core/src/main/java/org/briarproject/briar/forum/ForumFactoryImpl.java index 4588db4c8..e49acc5ee 100644 --- a/briar-core/src/main/java/org/briarproject/briar/forum/ForumFactoryImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/forum/ForumFactoryImpl.java @@ -18,7 +18,7 @@ import javax.inject.Inject; import static org.briarproject.briar.api.forum.ForumConstants.FORUM_SALT_LENGTH; import static org.briarproject.briar.api.forum.ForumConstants.MAX_FORUM_NAME_LENGTH; import static org.briarproject.briar.api.forum.ForumManager.CLIENT_ID; -import static org.briarproject.briar.api.forum.ForumManager.CLIENT_VERSION; +import static org.briarproject.briar.api.forum.ForumManager.MAJOR_VERSION; @Immutable @NotNullByDefault @@ -52,7 +52,7 @@ class ForumFactoryImpl implements ForumFactory { try { BdfList forum = BdfList.of(name, salt); byte[] descriptor = clientHelper.toByteArray(forum); - Group g = groupFactory.createGroup(CLIENT_ID, CLIENT_VERSION, + Group g = groupFactory.createGroup(CLIENT_ID, MAJOR_VERSION, descriptor); return new Forum(g, name, salt); } catch (FormatException e) { diff --git a/briar-core/src/main/java/org/briarproject/briar/forum/ForumManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/forum/ForumManagerImpl.java index edac994cd..3a3864208 100644 --- a/briar-core/src/main/java/org/briarproject/briar/forum/ForumManagerImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/forum/ForumManagerImpl.java @@ -188,7 +188,7 @@ class ForumManagerImpl extends BdfIncomingMessageHook implements ForumManager { Collection groups; Transaction txn = db.startTransaction(true); try { - groups = db.getGroups(txn, CLIENT_ID, CLIENT_VERSION); + groups = db.getGroups(txn, CLIENT_ID, MAJOR_VERSION); db.commitTransaction(txn); } finally { db.endTransaction(txn); diff --git a/briar-core/src/main/java/org/briarproject/briar/forum/ForumModule.java b/briar-core/src/main/java/org/briarproject/briar/forum/ForumModule.java index a6732fadb..fd1703232 100644 --- a/briar-core/src/main/java/org/briarproject/briar/forum/ForumModule.java +++ b/briar-core/src/main/java/org/briarproject/briar/forum/ForumModule.java @@ -15,7 +15,7 @@ import dagger.Module; import dagger.Provides; import static org.briarproject.briar.api.forum.ForumManager.CLIENT_ID; -import static org.briarproject.briar.api.forum.ForumManager.CLIENT_VERSION; +import static org.briarproject.briar.api.forum.ForumManager.MAJOR_VERSION; @Module public class ForumModule { @@ -31,7 +31,7 @@ public class ForumModule { @Singleton ForumManager provideForumManager(ForumManagerImpl forumManager, ValidationManager validationManager) { - validationManager.registerIncomingMessageHook(CLIENT_ID, CLIENT_VERSION, + validationManager.registerIncomingMessageHook(CLIENT_ID, MAJOR_VERSION, forumManager); return forumManager; } @@ -54,7 +54,7 @@ public class ForumModule { MetadataEncoder metadataEncoder, Clock clock) { ForumPostValidator validator = new ForumPostValidator(clientHelper, metadataEncoder, clock); - validationManager.registerMessageValidator(CLIENT_ID, CLIENT_VERSION, + validationManager.registerMessageValidator(CLIENT_ID, MAJOR_VERSION, validator); return validator; } diff --git a/briar-core/src/main/java/org/briarproject/briar/introduction/IntroductionManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/introduction/IntroductionManagerImpl.java index 31273d00a..0725c147e 100644 --- a/briar-core/src/main/java/org/briarproject/briar/introduction/IntroductionManagerImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/introduction/IntroductionManagerImpl.java @@ -127,7 +127,7 @@ class IntroductionManagerImpl extends ConversationClientImpl db.addGroup(txn, g); // Apply the client's visibility to the contact group Visibility client = clientVersioningManager.getClientVisibility(txn, - c.getId(), CLIENT_ID, CLIENT_VERSION); + c.getId(), CLIENT_ID, MAJOR_VERSION); if (LOG.isLoggable(INFO)) LOG.info("Applying visibility " + client + " to new contact group");db.setGroupVisibility(txn, c.getId(), g.getId(), client); db.setGroupVisibility(txn, c.getId(), g.getId(), client); diff --git a/briar-core/src/main/java/org/briarproject/briar/introduction/IntroductionModule.java b/briar-core/src/main/java/org/briarproject/briar/introduction/IntroductionModule.java index f7e55c99b..1f3c7d7a5 100644 --- a/briar-core/src/main/java/org/briarproject/briar/introduction/IntroductionModule.java +++ b/briar-core/src/main/java/org/briarproject/briar/introduction/IntroductionModule.java @@ -17,7 +17,7 @@ import dagger.Module; import dagger.Provides; import static org.briarproject.briar.api.introduction.IntroductionManager.CLIENT_ID; -import static org.briarproject.briar.api.introduction.IntroductionManager.CLIENT_VERSION; +import static org.briarproject.briar.api.introduction.IntroductionManager.MAJOR_VERSION; @Module public class IntroductionModule { @@ -37,7 +37,7 @@ public class IntroductionModule { IntroductionValidator introductionValidator = new IntroductionValidator(messageEncoder, clientHelper, metadataEncoder, clock); - validationManager.registerMessageValidator(CLIENT_ID, CLIENT_VERSION, + validationManager.registerMessageValidator(CLIENT_ID, MAJOR_VERSION, introductionValidator); return introductionValidator; } @@ -53,11 +53,11 @@ public class IntroductionModule { lifecycleManager.registerClient(introductionManager); contactManager.registerContactHook(introductionManager); validationManager.registerIncomingMessageHook(CLIENT_ID, - CLIENT_VERSION, introductionManager); + MAJOR_VERSION, introductionManager); conversationManager.registerConversationClient(introductionManager); - clientVersioningManager.registerClient(CLIENT_ID, CLIENT_VERSION); + clientVersioningManager.registerClient(CLIENT_ID, MAJOR_VERSION); clientVersioningManager.registerClientVersioningHook(CLIENT_ID, - CLIENT_VERSION, introductionManager); + MAJOR_VERSION, introductionManager); return introductionManager; } diff --git a/briar-core/src/main/java/org/briarproject/briar/messaging/MessagingManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/messaging/MessagingManagerImpl.java index 81db870d7..3bbb3f03d 100644 --- a/briar-core/src/main/java/org/briarproject/briar/messaging/MessagingManagerImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/messaging/MessagingManagerImpl.java @@ -65,7 +65,7 @@ class MessagingManagerImpl extends ConversationClientImpl public void createLocalState(Transaction txn) throws DbException { // Create a local group to indicate that we've set this client up Group localGroup = contactGroupFactory.createLocalGroup(CLIENT_ID, - CLIENT_VERSION); + MAJOR_VERSION); if (db.containsGroup(txn, localGroup.getId())) return; db.addGroup(txn, localGroup); // Set things up for any pre-existing contacts @@ -80,7 +80,7 @@ class MessagingManagerImpl extends ConversationClientImpl db.addGroup(txn, g); // Apply the client's visibility to the contact group Visibility client = clientVersioningManager.getClientVisibility(txn, - c.getId(), CLIENT_ID, CLIENT_VERSION); + c.getId(), CLIENT_ID, MAJOR_VERSION); if (LOG.isLoggable(INFO)) LOG.info("Applying visibility " + client + " to new contact group"); db.setGroupVisibility(txn, c.getId(), g.getId(), client); @@ -97,7 +97,7 @@ class MessagingManagerImpl extends ConversationClientImpl @Override public Group getContactGroup(Contact c) { return contactGroupFactory.createContactGroup(CLIENT_ID, - CLIENT_VERSION, c); + MAJOR_VERSION, c); } @Override diff --git a/briar-core/src/main/java/org/briarproject/briar/messaging/MessagingModule.java b/briar-core/src/main/java/org/briarproject/briar/messaging/MessagingModule.java index 95c49b41c..0916a9426 100644 --- a/briar-core/src/main/java/org/briarproject/briar/messaging/MessagingModule.java +++ b/briar-core/src/main/java/org/briarproject/briar/messaging/MessagingModule.java @@ -18,7 +18,7 @@ import dagger.Module; import dagger.Provides; import static org.briarproject.briar.api.messaging.MessagingManager.CLIENT_ID; -import static org.briarproject.briar.api.messaging.MessagingManager.CLIENT_VERSION; +import static org.briarproject.briar.api.messaging.MessagingManager.MAJOR_VERSION; @Module public class MessagingModule { @@ -45,7 +45,7 @@ public class MessagingModule { Clock clock) { PrivateMessageValidator validator = new PrivateMessageValidator( clientHelper, metadataEncoder, clock); - validationManager.registerMessageValidator(CLIENT_ID, CLIENT_VERSION, + validationManager.registerMessageValidator(CLIENT_ID, MAJOR_VERSION, validator); return validator; } @@ -59,12 +59,12 @@ public class MessagingModule { MessagingManagerImpl messagingManager) { lifecycleManager.registerClient(messagingManager); contactManager.registerContactHook(messagingManager); - validationManager.registerIncomingMessageHook(CLIENT_ID, CLIENT_VERSION, + validationManager.registerIncomingMessageHook(CLIENT_ID, MAJOR_VERSION, messagingManager); conversationManager.registerConversationClient(messagingManager); - clientVersioningManager.registerClient(CLIENT_ID, CLIENT_VERSION); + clientVersioningManager.registerClient(CLIENT_ID, MAJOR_VERSION); clientVersioningManager.registerClientVersioningHook(CLIENT_ID, - CLIENT_VERSION, messagingManager); + MAJOR_VERSION, messagingManager); return messagingManager; } diff --git a/briar-core/src/main/java/org/briarproject/briar/privategroup/PrivateGroupFactoryImpl.java b/briar-core/src/main/java/org/briarproject/briar/privategroup/PrivateGroupFactoryImpl.java index 4cff80dd9..864ad23ab 100644 --- a/briar-core/src/main/java/org/briarproject/briar/privategroup/PrivateGroupFactoryImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/privategroup/PrivateGroupFactoryImpl.java @@ -21,7 +21,7 @@ import static org.briarproject.bramble.util.ValidationUtils.checkSize; import static org.briarproject.briar.api.privategroup.PrivateGroupConstants.GROUP_SALT_LENGTH; import static org.briarproject.briar.api.privategroup.PrivateGroupConstants.MAX_GROUP_NAME_LENGTH; import static org.briarproject.briar.api.privategroup.PrivateGroupManager.CLIENT_ID; -import static org.briarproject.briar.api.privategroup.PrivateGroupManager.CLIENT_VERSION; +import static org.briarproject.briar.api.privategroup.PrivateGroupManager.MAJOR_VERSION; @Immutable @NotNullByDefault @@ -57,7 +57,7 @@ class PrivateGroupFactoryImpl implements PrivateGroupFactory { BdfList creatorList = clientHelper.toList(creator); BdfList group = BdfList.of(creatorList, name, salt); byte[] descriptor = clientHelper.toByteArray(group); - Group g = groupFactory.createGroup(CLIENT_ID, CLIENT_VERSION, + Group g = groupFactory.createGroup(CLIENT_ID, MAJOR_VERSION, descriptor); return new PrivateGroup(g, name, creator, salt); } catch (FormatException e) { diff --git a/briar-core/src/main/java/org/briarproject/briar/privategroup/PrivateGroupManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/privategroup/PrivateGroupManagerImpl.java index 63b6807d1..531282fdf 100644 --- a/briar-core/src/main/java/org/briarproject/briar/privategroup/PrivateGroupManagerImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/privategroup/PrivateGroupManagerImpl.java @@ -271,7 +271,7 @@ class PrivateGroupManagerImpl extends BdfIncomingMessageHook Collection groups; Transaction txn = db.startTransaction(true); try { - groups = db.getGroups(txn, CLIENT_ID, CLIENT_VERSION); + groups = db.getGroups(txn, CLIENT_ID, MAJOR_VERSION); db.commitTransaction(txn); } finally { db.endTransaction(txn); diff --git a/briar-core/src/main/java/org/briarproject/briar/privategroup/PrivateGroupModule.java b/briar-core/src/main/java/org/briarproject/briar/privategroup/PrivateGroupModule.java index c105df88d..61901bc8b 100644 --- a/briar-core/src/main/java/org/briarproject/briar/privategroup/PrivateGroupModule.java +++ b/briar-core/src/main/java/org/briarproject/briar/privategroup/PrivateGroupModule.java @@ -16,7 +16,7 @@ import dagger.Module; import dagger.Provides; import static org.briarproject.briar.api.privategroup.PrivateGroupManager.CLIENT_ID; -import static org.briarproject.briar.api.privategroup.PrivateGroupManager.CLIENT_VERSION; +import static org.briarproject.briar.api.privategroup.PrivateGroupManager.MAJOR_VERSION; @Module public class PrivateGroupModule { @@ -33,7 +33,7 @@ public class PrivateGroupModule { PrivateGroupManager provideGroupManager( PrivateGroupManagerImpl groupManager, ValidationManager validationManager) { - validationManager.registerIncomingMessageHook(CLIENT_ID, CLIENT_VERSION, + validationManager.registerIncomingMessageHook(CLIENT_ID, MAJOR_VERSION, groupManager); return groupManager; } @@ -60,7 +60,7 @@ public class PrivateGroupModule { GroupMessageValidator validator = new GroupMessageValidator( privateGroupFactory, clientHelper, metadataEncoder, clock, groupInvitationFactory); - validationManager.registerMessageValidator(CLIENT_ID, CLIENT_VERSION, + validationManager.registerMessageValidator(CLIENT_ID, MAJOR_VERSION, validator); return validator; } diff --git a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/AbstractProtocolEngine.java b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/AbstractProtocolEngine.java index c37c26725..e981610ce 100644 --- a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/AbstractProtocolEngine.java +++ b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/AbstractProtocolEngine.java @@ -30,7 +30,7 @@ import javax.annotation.Nullable; import javax.annotation.concurrent.Immutable; import static org.briarproject.briar.api.privategroup.PrivateGroupManager.CLIENT_ID; -import static org.briarproject.briar.api.privategroup.PrivateGroupManager.CLIENT_VERSION; +import static org.briarproject.briar.api.privategroup.PrivateGroupManager.MAJOR_VERSION; import static org.briarproject.briar.privategroup.invitation.GroupInvitationConstants.GROUP_KEY_CONTACT_ID; import static org.briarproject.briar.privategroup.invitation.MessageType.ABORT; import static org.briarproject.briar.privategroup.invitation.MessageType.INVITE; @@ -101,7 +101,7 @@ abstract class AbstractProtocolEngine // Apply min of preferred visibility and client's visibility ContactId contactId = getContactId(txn, session.getContactGroupId()); Visibility client = clientVersioningManager.getClientVisibility(txn, - contactId, CLIENT_ID, CLIENT_VERSION); + contactId, CLIENT_ID, MAJOR_VERSION); Visibility min = Visibility.min(preferred, client); db.setGroupVisibility(txn, contactId, session.getPrivateGroupId(), min); } diff --git a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationFactoryImpl.java b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationFactoryImpl.java index 29ca211f6..c8fc2b4ba 100644 --- a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationFactoryImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationFactoryImpl.java @@ -17,7 +17,7 @@ import javax.annotation.concurrent.Immutable; import javax.inject.Inject; import static org.briarproject.briar.api.privategroup.invitation.GroupInvitationManager.CLIENT_ID; -import static org.briarproject.briar.api.privategroup.invitation.GroupInvitationManager.CLIENT_VERSION; +import static org.briarproject.briar.api.privategroup.invitation.GroupInvitationManager.MAJOR_VERSION; @Immutable @NotNullByDefault @@ -53,7 +53,7 @@ class GroupInvitationFactoryImpl implements GroupInvitationFactory { public BdfList createInviteToken(AuthorId creatorId, AuthorId memberId, GroupId privateGroupId, long timestamp) { Group contactGroup = contactGroupFactory.createContactGroup(CLIENT_ID, - CLIENT_VERSION, creatorId, memberId); + MAJOR_VERSION, creatorId, memberId); return BdfList.of( timestamp, contactGroup.getId(), diff --git a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImpl.java index 6275fad70..58da3f2de 100644 --- a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImpl.java @@ -108,7 +108,7 @@ class GroupInvitationManagerImpl extends ConversationClientImpl public void createLocalState(Transaction txn) throws DbException { // Create a local group to indicate that we've set this client up Group localGroup = contactGroupFactory.createLocalGroup(CLIENT_ID, - CLIENT_VERSION); + MAJOR_VERSION); if (db.containsGroup(txn, localGroup.getId())) return; db.addGroup(txn, localGroup); // Set things up for any pre-existing contacts @@ -122,7 +122,7 @@ class GroupInvitationManagerImpl extends ConversationClientImpl // Store the group and share it with the contact db.addGroup(txn, g); Visibility client = clientVersioningManager.getClientVisibility(txn, - c.getId(), CLIENT_ID, CLIENT_VERSION); + c.getId(), CLIENT_ID, MAJOR_VERSION); if (LOG.isLoggable(INFO)) LOG.info("Applying visibility " + client + " to new contact group"); db.setGroupVisibility(txn, c.getId(), g.getId(), client); @@ -136,7 +136,7 @@ class GroupInvitationManagerImpl extends ConversationClientImpl } // If the contact belongs to any private groups, create a peer session for (Group pg : db.getGroups(txn, PrivateGroupManager.CLIENT_ID, - PrivateGroupManager.CLIENT_VERSION)) { + PrivateGroupManager.MAJOR_VERSION)) { if (privateGroupManager.isMember(txn, pg.getId(), c.getAuthor())) addingMember(txn, pg.getId(), c); } @@ -151,7 +151,7 @@ class GroupInvitationManagerImpl extends ConversationClientImpl @Override public Group getContactGroup(Contact c) { return contactGroupFactory.createContactGroup(CLIENT_ID, - CLIENT_VERSION, c); + MAJOR_VERSION, c); } @Override @@ -599,7 +599,7 @@ class GroupInvitationManagerImpl extends ConversationClientImpl try { Collection shareables = db.getGroups(txn, PrivateGroupManager.CLIENT_ID, - PrivateGroupManager.CLIENT_VERSION); + PrivateGroupManager.MAJOR_VERSION); Map m = getPreferredVisibilities(txn, c); for (Group g : shareables) { Visibility preferred = m.get(g.getId()); diff --git a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationModule.java b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationModule.java index f02287574..f00192af7 100644 --- a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationModule.java +++ b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationModule.java @@ -20,7 +20,7 @@ import dagger.Module; import dagger.Provides; import static org.briarproject.briar.api.privategroup.invitation.GroupInvitationManager.CLIENT_ID; -import static org.briarproject.briar.api.privategroup.invitation.GroupInvitationManager.CLIENT_VERSION; +import static org.briarproject.briar.api.privategroup.invitation.GroupInvitationManager.MAJOR_VERSION; @Module public class GroupInvitationModule { @@ -42,21 +42,21 @@ public class GroupInvitationModule { ConversationManager conversationManager, ClientVersioningManager clientVersioningManager) { lifecycleManager.registerClient(groupInvitationManager); - validationManager.registerIncomingMessageHook(CLIENT_ID, CLIENT_VERSION, + validationManager.registerIncomingMessageHook(CLIENT_ID, MAJOR_VERSION, groupInvitationManager); contactManager.registerContactHook(groupInvitationManager); privateGroupManager.registerPrivateGroupHook(groupInvitationManager); conversationManager.registerConversationClient(groupInvitationManager); - clientVersioningManager.registerClient(CLIENT_ID, CLIENT_VERSION); + clientVersioningManager.registerClient(CLIENT_ID, MAJOR_VERSION); clientVersioningManager.registerClientVersioningHook(CLIENT_ID, - CLIENT_VERSION, groupInvitationManager); + MAJOR_VERSION, groupInvitationManager); // The group invitation manager handles client visibility changes for // the private group manager clientVersioningManager.registerClient(PrivateGroupManager.CLIENT_ID, - PrivateGroupManager.CLIENT_VERSION); + PrivateGroupManager.MAJOR_VERSION); clientVersioningManager.registerClientVersioningHook( PrivateGroupManager.CLIENT_ID, - PrivateGroupManager.CLIENT_VERSION, + PrivateGroupManager.MAJOR_VERSION, groupInvitationManager.getPrivateGroupClientVersioningHook()); return groupInvitationManager; } @@ -71,7 +71,7 @@ public class GroupInvitationModule { GroupInvitationValidator validator = new GroupInvitationValidator( clientHelper, metadataEncoder, clock, privateGroupFactory, messageEncoder); - validationManager.registerMessageValidator(CLIENT_ID, CLIENT_VERSION, + validationManager.registerMessageValidator(CLIENT_ID, MAJOR_VERSION, validator); return validator; } diff --git a/briar-core/src/main/java/org/briarproject/briar/sharing/BlogProtocolEngineImpl.java b/briar-core/src/main/java/org/briarproject/briar/sharing/BlogProtocolEngineImpl.java index 3ab61521d..fdc6427f8 100644 --- a/briar-core/src/main/java/org/briarproject/briar/sharing/BlogProtocolEngineImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/sharing/BlogProtocolEngineImpl.java @@ -24,7 +24,7 @@ import javax.annotation.concurrent.Immutable; import javax.inject.Inject; import static org.briarproject.briar.api.blog.BlogManager.CLIENT_ID; -import static org.briarproject.briar.api.blog.BlogManager.CLIENT_VERSION; +import static org.briarproject.briar.api.blog.BlogManager.MAJOR_VERSION; @Immutable @NotNullByDefault @@ -42,7 +42,7 @@ class BlogProtocolEngineImpl extends ProtocolEngineImpl { InvitationFactory invitationFactory) { super(db, clientHelper, clientVersioningManager, messageEncoder, messageParser, messageTracker, clock, CLIENT_ID, - CLIENT_VERSION); + MAJOR_VERSION); this.blogManager = blogManager; this.invitationFactory = invitationFactory; } diff --git a/briar-core/src/main/java/org/briarproject/briar/sharing/BlogSharingManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/sharing/BlogSharingManagerImpl.java index 41554bcf4..92cd05701 100644 --- a/briar-core/src/main/java/org/briarproject/briar/sharing/BlogSharingManagerImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/sharing/BlogSharingManagerImpl.java @@ -55,7 +55,7 @@ class BlogSharingManagerImpl extends SharingManagerImpl @Override protected int getClientVersion() { - return CLIENT_VERSION; + return MAJOR_VERSION; } @Override @@ -65,7 +65,7 @@ class BlogSharingManagerImpl extends SharingManagerImpl @Override protected int getShareableClientVersion() { - return BlogManager.CLIENT_VERSION; + return BlogManager.MAJOR_VERSION; } @Override diff --git a/briar-core/src/main/java/org/briarproject/briar/sharing/ForumProtocolEngineImpl.java b/briar-core/src/main/java/org/briarproject/briar/sharing/ForumProtocolEngineImpl.java index 90ad6888d..14411b7d0 100644 --- a/briar-core/src/main/java/org/briarproject/briar/sharing/ForumProtocolEngineImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/sharing/ForumProtocolEngineImpl.java @@ -24,7 +24,7 @@ import javax.annotation.concurrent.Immutable; import javax.inject.Inject; import static org.briarproject.briar.api.forum.ForumManager.CLIENT_ID; -import static org.briarproject.briar.api.forum.ForumManager.CLIENT_VERSION; +import static org.briarproject.briar.api.forum.ForumManager.MAJOR_VERSION; @Immutable @NotNullByDefault @@ -44,7 +44,7 @@ class ForumProtocolEngineImpl extends ProtocolEngineImpl { InvitationFactory invitationFactory) { super(db, clientHelper, clientVersioningManager, messageEncoder, messageParser, messageTracker, clock, CLIENT_ID, - CLIENT_VERSION); + MAJOR_VERSION); this.forumManager = forumManager; this.invitationFactory = invitationFactory; } diff --git a/briar-core/src/main/java/org/briarproject/briar/sharing/ForumSharingManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/sharing/ForumSharingManagerImpl.java index 2f1ac5efb..9fbe749ea 100644 --- a/briar-core/src/main/java/org/briarproject/briar/sharing/ForumSharingManagerImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/sharing/ForumSharingManagerImpl.java @@ -43,7 +43,7 @@ class ForumSharingManagerImpl extends SharingManagerImpl @Override protected int getClientVersion() { - return CLIENT_VERSION; + return MAJOR_VERSION; } @Override @@ -53,7 +53,7 @@ class ForumSharingManagerImpl extends SharingManagerImpl @Override protected int getShareableClientVersion() { - return ForumManager.CLIENT_VERSION; + return ForumManager.MAJOR_VERSION; } @Override diff --git a/briar-core/src/main/java/org/briarproject/briar/sharing/SharingModule.java b/briar-core/src/main/java/org/briarproject/briar/sharing/SharingModule.java index b31bfe68c..921ab7569 100644 --- a/briar-core/src/main/java/org/briarproject/briar/sharing/SharingModule.java +++ b/briar-core/src/main/java/org/briarproject/briar/sharing/SharingModule.java @@ -64,7 +64,7 @@ public class SharingModule { messageEncoder, clientHelper, metadataEncoder, clock, blogFactory); validationManager.registerMessageValidator(BlogSharingManager.CLIENT_ID, - BlogSharingManager.CLIENT_VERSION, validator); + BlogSharingManager.MAJOR_VERSION, validator); return validator; } @@ -79,21 +79,21 @@ public class SharingModule { lifecycleManager.registerClient(blogSharingManager); contactManager.registerContactHook(blogSharingManager); validationManager.registerIncomingMessageHook( - BlogSharingManager.CLIENT_ID, BlogSharingManager.CLIENT_VERSION, + BlogSharingManager.CLIENT_ID, BlogSharingManager.MAJOR_VERSION, blogSharingManager); conversationManager.registerConversationClient(blogSharingManager); blogManager.registerRemoveBlogHook(blogSharingManager); clientVersioningManager.registerClient(BlogSharingManager.CLIENT_ID, - BlogSharingManager.CLIENT_VERSION); + BlogSharingManager.MAJOR_VERSION); clientVersioningManager.registerClientVersioningHook( - BlogSharingManager.CLIENT_ID, BlogSharingManager.CLIENT_VERSION, + BlogSharingManager.CLIENT_ID, BlogSharingManager.MAJOR_VERSION, blogSharingManager); // The blog sharing manager handles client visibility changes for the // blog manager clientVersioningManager.registerClient(BlogManager.CLIENT_ID, - BlogManager.CLIENT_VERSION); + BlogManager.MAJOR_VERSION); clientVersioningManager.registerClientVersioningHook( - BlogManager.CLIENT_ID, BlogManager.CLIENT_VERSION, + BlogManager.CLIENT_ID, BlogManager.MAJOR_VERSION, blogSharingManager.getShareableClientVersioningHook()); return blogSharingManager; } @@ -127,7 +127,7 @@ public class SharingModule { forumFactory); validationManager.registerMessageValidator( ForumSharingManager.CLIENT_ID, - ForumSharingManager.CLIENT_VERSION, validator); + ForumSharingManager.MAJOR_VERSION, validator); return validator; } @@ -143,20 +143,20 @@ public class SharingModule { contactManager.registerContactHook(forumSharingManager); validationManager.registerIncomingMessageHook( ForumSharingManager.CLIENT_ID, - ForumSharingManager.CLIENT_VERSION, forumSharingManager); + ForumSharingManager.MAJOR_VERSION, forumSharingManager); conversationManager.registerConversationClient(forumSharingManager); forumManager.registerRemoveForumHook(forumSharingManager); clientVersioningManager.registerClient(ForumSharingManager.CLIENT_ID, - ForumSharingManager.CLIENT_VERSION); + ForumSharingManager.MAJOR_VERSION); clientVersioningManager.registerClientVersioningHook( ForumSharingManager.CLIENT_ID, - ForumSharingManager.CLIENT_VERSION, forumSharingManager); + ForumSharingManager.MAJOR_VERSION, forumSharingManager); // The forum sharing manager handles client visibility changes for the // forum manager clientVersioningManager.registerClient(ForumManager.CLIENT_ID, - ForumManager.CLIENT_VERSION); + ForumManager.MAJOR_VERSION); clientVersioningManager.registerClientVersioningHook( - ForumManager.CLIENT_ID, ForumManager.CLIENT_VERSION, + ForumManager.CLIENT_ID, ForumManager.MAJOR_VERSION, forumSharingManager.getShareableClientVersioningHook()); return forumSharingManager; } diff --git a/briar-core/src/test/java/org/briarproject/briar/blog/BlogManagerImplTest.java b/briar-core/src/test/java/org/briarproject/briar/blog/BlogManagerImplTest.java index 3f636748a..524b7ea39 100644 --- a/briar-core/src/test/java/org/briarproject/briar/blog/BlogManagerImplTest.java +++ b/briar-core/src/test/java/org/briarproject/briar/blog/BlogManagerImplTest.java @@ -50,7 +50,7 @@ import static org.briarproject.briar.api.blog.BlogConstants.KEY_TIME_RECEIVED; import static org.briarproject.briar.api.blog.BlogConstants.KEY_TYPE; import static org.briarproject.briar.api.blog.BlogConstants.MAX_BLOG_COMMENT_LENGTH; import static org.briarproject.briar.api.blog.BlogManager.CLIENT_ID; -import static org.briarproject.briar.api.blog.BlogManager.CLIENT_VERSION; +import static org.briarproject.briar.api.blog.BlogManager.MAJOR_VERSION; import static org.briarproject.briar.api.blog.MessageType.COMMENT; import static org.briarproject.briar.api.blog.MessageType.POST; import static org.briarproject.briar.api.blog.MessageType.WRAPPED_COMMENT; @@ -868,7 +868,7 @@ public class BlogManagerImplTest extends BriarTestCase { } private Blog createBlog(LocalAuthor localAuthor, boolean rssFeed) { - Group group = getGroup(CLIENT_ID, CLIENT_VERSION); + Group group = getGroup(CLIENT_ID, MAJOR_VERSION); return new Blog(group, localAuthor, rssFeed); } diff --git a/briar-core/src/test/java/org/briarproject/briar/blog/BlogPostValidatorTest.java b/briar-core/src/test/java/org/briarproject/briar/blog/BlogPostValidatorTest.java index 77290aa7a..7d00fb413 100644 --- a/briar-core/src/test/java/org/briarproject/briar/blog/BlogPostValidatorTest.java +++ b/briar-core/src/test/java/org/briarproject/briar/blog/BlogPostValidatorTest.java @@ -36,7 +36,7 @@ import static org.briarproject.briar.api.blog.BlogConstants.KEY_PARENT_MSG_ID; import static org.briarproject.briar.api.blog.BlogConstants.KEY_READ; import static org.briarproject.briar.api.blog.BlogConstants.KEY_RSS_FEED; import static org.briarproject.briar.api.blog.BlogManager.CLIENT_ID; -import static org.briarproject.briar.api.blog.BlogManager.CLIENT_VERSION; +import static org.briarproject.briar.api.blog.BlogManager.MAJOR_VERSION; import static org.briarproject.briar.api.blog.BlogPostFactory.SIGNING_LABEL_COMMENT; import static org.briarproject.briar.api.blog.BlogPostFactory.SIGNING_LABEL_POST; import static org.briarproject.briar.api.blog.MessageType.COMMENT; @@ -64,7 +64,7 @@ public class BlogPostValidatorTest extends BriarTestCase { private final String body = getRandomString(42); public BlogPostValidatorTest() { - group = getGroup(CLIENT_ID, CLIENT_VERSION); + group = getGroup(CLIENT_ID, MAJOR_VERSION); descriptor = group.getDescriptor(); author = getAuthor(); authorList = BdfList.of( @@ -206,7 +206,7 @@ public class BlogPostValidatorTest extends BriarTestCase { byte[] originalBody = getRandomBytes(42); context.checking(new Expectations() {{ - oneOf(groupFactory).createGroup(CLIENT_ID, CLIENT_VERSION, + oneOf(groupFactory).createGroup(CLIENT_ID, MAJOR_VERSION, descriptor); will(returnValue(b.getGroup())); oneOf(blogFactory).parseBlog(b.getGroup()); @@ -250,7 +250,7 @@ public class BlogPostValidatorTest extends BriarTestCase { byte[] originalBody = getRandomBytes(42); context.checking(new Expectations() {{ - oneOf(groupFactory).createGroup(CLIENT_ID, CLIENT_VERSION, + oneOf(groupFactory).createGroup(CLIENT_ID, MAJOR_VERSION, descriptor); will(returnValue(blog.getGroup())); oneOf(clientHelper).toByteArray(originalList); diff --git a/briar-core/src/test/java/org/briarproject/briar/feed/FeedManagerImplTest.java b/briar-core/src/test/java/org/briarproject/briar/feed/FeedManagerImplTest.java index 4074cebe6..4f104feb9 100644 --- a/briar-core/src/test/java/org/briarproject/briar/feed/FeedManagerImplTest.java +++ b/briar-core/src/test/java/org/briarproject/briar/feed/FeedManagerImplTest.java @@ -43,7 +43,7 @@ import static org.briarproject.bramble.test.TestUtils.getRandomBytes; import static org.briarproject.bramble.test.TestUtils.getRandomId; import static org.briarproject.briar.api.feed.FeedConstants.KEY_FEEDS; import static org.briarproject.briar.api.feed.FeedManager.CLIENT_ID; -import static org.briarproject.briar.api.feed.FeedManager.CLIENT_VERSION; +import static org.briarproject.briar.api.feed.FeedManager.MAJOR_VERSION; public class FeedManagerImplTest extends BrambleMockTestCase { @@ -61,10 +61,10 @@ public class FeedManagerImplTest extends BrambleMockTestCase { private final Clock clock = context.mock(Clock.class); private final Dns noDnsLookups = context.mock(Dns.class); - private final Group localGroup = getGroup(CLIENT_ID, CLIENT_VERSION); + private final Group localGroup = getGroup(CLIENT_ID, MAJOR_VERSION); private final GroupId localGroupId = localGroup.getId(); private final Group blogGroup = - getGroup(BlogManager.CLIENT_ID, BlogManager.CLIENT_VERSION); + getGroup(BlogManager.CLIENT_ID, BlogManager.MAJOR_VERSION); private final GroupId blogGroupId = blogGroup.getId(); private final LocalAuthor localAuthor = getLocalAuthor(); private final Blog blog = new Blog(blogGroup, localAuthor, true); @@ -132,7 +132,7 @@ public class FeedManagerImplTest extends BrambleMockTestCase { private void expectGetLocalGroup() { context.checking(new Expectations() {{ oneOf(contactGroupFactory).createLocalGroup(CLIENT_ID, - CLIENT_VERSION); + MAJOR_VERSION); will(returnValue(localGroup)); }}); } diff --git a/briar-core/src/test/java/org/briarproject/briar/introduction/IntroductionIntegrationTest.java b/briar-core/src/test/java/org/briarproject/briar/introduction/IntroductionIntegrationTest.java index 7441186e8..f860e702e 100644 --- a/briar-core/src/test/java/org/briarproject/briar/introduction/IntroductionIntegrationTest.java +++ b/briar-core/src/test/java/org/briarproject/briar/introduction/IntroductionIntegrationTest.java @@ -47,7 +47,7 @@ import static org.briarproject.bramble.test.TestUtils.getRandomBytes; import static org.briarproject.bramble.test.TestUtils.getTransportProperties; import static org.briarproject.bramble.test.TestUtils.getTransportPropertiesMap; import static org.briarproject.briar.api.introduction.IntroductionManager.CLIENT_ID; -import static org.briarproject.briar.api.introduction.IntroductionManager.CLIENT_VERSION; +import static org.briarproject.briar.api.introduction.IntroductionManager.MAJOR_VERSION; import static org.briarproject.briar.introduction.IntroduceeState.AWAIT_RESPONSES; import static org.briarproject.briar.introduction.IntroduceeState.LOCAL_DECLINED; import static org.briarproject.briar.introduction.IntroducerState.A_DECLINED; @@ -1284,7 +1284,7 @@ public class IntroductionIntegrationTest } private Group getLocalGroup() { - return contactGroupFactory.createLocalGroup(CLIENT_ID, CLIENT_VERSION); + return contactGroupFactory.createLocalGroup(CLIENT_ID, MAJOR_VERSION); } } diff --git a/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/AbstractProtocolEngineTest.java b/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/AbstractProtocolEngineTest.java index 8c8056512..9e014cbab 100644 --- a/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/AbstractProtocolEngineTest.java +++ b/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/AbstractProtocolEngineTest.java @@ -36,7 +36,7 @@ import static org.briarproject.briar.api.privategroup.PrivateGroupConstants.GROU import static org.briarproject.briar.api.privategroup.PrivateGroupConstants.MAX_GROUP_INVITATION_MSG_LENGTH; import static org.briarproject.briar.api.privategroup.PrivateGroupConstants.MAX_GROUP_NAME_LENGTH; import static org.briarproject.briar.api.privategroup.PrivateGroupManager.CLIENT_ID; -import static org.briarproject.briar.api.privategroup.PrivateGroupManager.CLIENT_VERSION; +import static org.briarproject.briar.api.privategroup.PrivateGroupManager.MAJOR_VERSION; import static org.briarproject.briar.privategroup.invitation.GroupInvitationConstants.GROUP_KEY_CONTACT_ID; import static org.briarproject.briar.privategroup.invitation.MessageType.ABORT; import static org.briarproject.briar.privategroup.invitation.MessageType.INVITE; @@ -71,7 +71,7 @@ public abstract class AbstractProtocolEngineTest extends BrambleMockTestCase { protected final Transaction txn = new Transaction(null, false); protected final GroupId contactGroupId = new GroupId(getRandomId()); protected final Group privateGroupGroup = - getGroup(CLIENT_ID, CLIENT_VERSION); + getGroup(CLIENT_ID, MAJOR_VERSION); protected final GroupId privateGroupId = privateGroupGroup.getId(); protected final Author author = getAuthor(); protected final PrivateGroup privateGroup = @@ -191,7 +191,7 @@ public abstract class AbstractProtocolEngineTest extends BrambleMockTestCase { expectGetContactId(); context.checking(new Expectations() {{ oneOf(clientVersioningManager).getClientVisibility(txn, contactId, - CLIENT_ID, CLIENT_VERSION); + CLIENT_ID, MAJOR_VERSION); will(returnValue(SHARED)); oneOf(db).setGroupVisibility(txn, contactId, privateGroupId, v); }}); diff --git a/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImplTest.java b/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImplTest.java index e7db720c7..6792e51e3 100644 --- a/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImplTest.java +++ b/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImplTest.java @@ -56,7 +56,7 @@ import static org.briarproject.bramble.util.StringUtils.getRandomString; import static org.briarproject.briar.api.privategroup.PrivateGroupConstants.GROUP_SALT_LENGTH; import static org.briarproject.briar.api.privategroup.PrivateGroupConstants.MAX_GROUP_NAME_LENGTH; import static org.briarproject.briar.api.privategroup.invitation.GroupInvitationManager.CLIENT_ID; -import static org.briarproject.briar.api.privategroup.invitation.GroupInvitationManager.CLIENT_VERSION; +import static org.briarproject.briar.api.privategroup.invitation.GroupInvitationManager.MAJOR_VERSION; import static org.briarproject.briar.privategroup.invitation.GroupInvitationConstants.GROUP_KEY_CONTACT_ID; import static org.briarproject.briar.privategroup.invitation.MessageType.ABORT; import static org.briarproject.briar.privategroup.invitation.MessageType.INVITE; @@ -102,9 +102,9 @@ public class GroupInvitationManagerImplTest extends BrambleMockTestCase { private final Author author = getAuthor(); private final Contact contact = new Contact(contactId, author, new AuthorId(getRandomId()), true, true); - private final Group localGroup = getGroup(CLIENT_ID, CLIENT_VERSION); - private final Group contactGroup = getGroup(CLIENT_ID, CLIENT_VERSION); - private final Group privateGroup = getGroup(CLIENT_ID, CLIENT_VERSION); + private final Group localGroup = getGroup(CLIENT_ID, MAJOR_VERSION); + private final Group contactGroup = getGroup(CLIENT_ID, MAJOR_VERSION); + private final Group privateGroup = getGroup(CLIENT_ID, MAJOR_VERSION); private final BdfDictionary meta = BdfDictionary.of(new BdfEntry("m", "e")); private final Message message = new Message(new MessageId(getRandomId()), contactGroup.getId(), @@ -154,7 +154,7 @@ public class GroupInvitationManagerImplTest extends BrambleMockTestCase { public void testCreateLocalStateFirstTime() throws Exception { context.checking(new Expectations() {{ oneOf(contactGroupFactory).createLocalGroup(CLIENT_ID, - CLIENT_VERSION); + MAJOR_VERSION); will(returnValue(localGroup)); oneOf(db).containsGroup(txn, localGroup.getId()); will(returnValue(false)); @@ -170,7 +170,7 @@ public class GroupInvitationManagerImplTest extends BrambleMockTestCase { public void testCreateLocalStateSubsequentTime() throws Exception { context.checking(new Expectations() {{ oneOf(contactGroupFactory).createLocalGroup(CLIENT_ID, - CLIENT_VERSION); + MAJOR_VERSION); will(returnValue(localGroup)); oneOf(db).containsGroup(txn, localGroup.getId()); will(returnValue(true)); @@ -184,18 +184,18 @@ public class GroupInvitationManagerImplTest extends BrambleMockTestCase { context.checking(new Expectations() {{ oneOf(contactGroupFactory).createContactGroup(CLIENT_ID, - CLIENT_VERSION, c); + MAJOR_VERSION, c); will(returnValue(contactGroup)); oneOf(db).addGroup(txn, contactGroup); oneOf(clientVersioningManager).getClientVisibility(txn, contactId, - CLIENT_ID, CLIENT_VERSION); + CLIENT_ID, MAJOR_VERSION); will(returnValue(SHARED)); oneOf(db).setGroupVisibility(txn, c.getId(), contactGroup.getId(), SHARED); oneOf(clientHelper) .mergeGroupMetadata(txn, contactGroup.getId(), meta); oneOf(db).getGroups(txn, PrivateGroupManager.CLIENT_ID, - PrivateGroupManager.CLIENT_VERSION); + PrivateGroupManager.MAJOR_VERSION); will(returnValue(Collections.singletonList(privateGroup))); oneOf(privateGroupManager).isMember(txn, privateGroup.getId(), c.getAuthor()); @@ -207,7 +207,7 @@ public class GroupInvitationManagerImplTest extends BrambleMockTestCase { private void expectAddingMember(GroupId g, Contact c) throws Exception { context.checking(new Expectations() {{ oneOf(contactGroupFactory).createContactGroup(CLIENT_ID, - CLIENT_VERSION, c); + MAJOR_VERSION, c); will(returnValue(contactGroup)); }}); expectGetSession(noResults, new SessionId(g.getBytes()), @@ -263,7 +263,7 @@ public class GroupInvitationManagerImplTest extends BrambleMockTestCase { public void testRemovingContact() throws Exception { context.checking(new Expectations() {{ oneOf(contactGroupFactory).createContactGroup(CLIENT_ID, - CLIENT_VERSION, contact); + MAJOR_VERSION, contact); will(returnValue(contactGroup)); oneOf(db).removeGroup(txn, contactGroup); }}); @@ -478,7 +478,7 @@ public class GroupInvitationManagerImplTest extends BrambleMockTestCase { oneOf(db).getContact(txn, contactId); will(returnValue(contact)); oneOf(contactGroupFactory).createContactGroup(CLIENT_ID, - CLIENT_VERSION, contact); + MAJOR_VERSION, contact); will(returnValue(contactGroup)); }}); expectCreateStorageId(); @@ -510,7 +510,7 @@ public class GroupInvitationManagerImplTest extends BrambleMockTestCase { oneOf(db).getContact(txn, contactId); will(returnValue(contact)); oneOf(contactGroupFactory).createContactGroup(CLIENT_ID, - CLIENT_VERSION, contact); + MAJOR_VERSION, contact); will(returnValue(contactGroup)); oneOf(sessionParser) .parseCreatorSession(contactGroup.getId(), bdfSession); @@ -539,7 +539,7 @@ public class GroupInvitationManagerImplTest extends BrambleMockTestCase { oneOf(db).getContact(txn, contactId); will(returnValue(contact)); oneOf(contactGroupFactory).createContactGroup(CLIENT_ID, - CLIENT_VERSION, contact); + MAJOR_VERSION, contact); will(returnValue(contactGroup)); oneOf(db).endTransaction(txn); }}); @@ -591,7 +591,7 @@ public class GroupInvitationManagerImplTest extends BrambleMockTestCase { oneOf(db).getContact(txn, contactId); will(returnValue(contact)); oneOf(contactGroupFactory).createContactGroup(CLIENT_ID, - CLIENT_VERSION, contact); + MAJOR_VERSION, contact); will(returnValue(contactGroup)); oneOf(sessionParser) .parseInviteeSession(contactGroup.getId(), bdfSession); @@ -613,7 +613,7 @@ public class GroupInvitationManagerImplTest extends BrambleMockTestCase { oneOf(db).getContact(txn, contactId); will(returnValue(contact)); oneOf(contactGroupFactory).createContactGroup(CLIENT_ID, - CLIENT_VERSION, contact); + MAJOR_VERSION, contact); will(returnValue(contactGroup)); oneOf(sessionParser) .parsePeerSession(contactGroup.getId(), bdfSession); @@ -638,7 +638,7 @@ public class GroupInvitationManagerImplTest extends BrambleMockTestCase { oneOf(db).getContact(txn, contactId); will(returnValue(contact)); oneOf(contactGroupFactory).createContactGroup(CLIENT_ID, - CLIENT_VERSION, contact); + MAJOR_VERSION, contact); will(returnValue(contactGroup)); oneOf(db).endTransaction(txn); }}); @@ -677,7 +677,7 @@ public class GroupInvitationManagerImplTest extends BrambleMockTestCase { oneOf(db).getContact(txn, contactId); will(returnValue(contact)); oneOf(contactGroupFactory).createContactGroup(CLIENT_ID, - CLIENT_VERSION, contact); + MAJOR_VERSION, contact); will(returnValue(contactGroup)); oneOf(messageParser).getMessagesVisibleInUiQuery(); will(returnValue(query)); @@ -754,7 +754,7 @@ public class GroupInvitationManagerImplTest extends BrambleMockTestCase { oneOf(db).getContacts(txn); will(returnValue(Collections.singletonList(contact))); oneOf(contactGroupFactory).createContactGroup(CLIENT_ID, - CLIENT_VERSION, contact); + MAJOR_VERSION, contact); will(returnValue(contactGroup)); oneOf(clientHelper).getMessageMetadataAsDictionary(txn, contactGroup.getId(), query); @@ -822,7 +822,7 @@ public class GroupInvitationManagerImplTest extends BrambleMockTestCase { expectGetSession(oneResult, sessionId, contactGroup.getId()); context.checking(new Expectations() {{ oneOf(contactGroupFactory).createContactGroup(CLIENT_ID, - CLIENT_VERSION, contact); + MAJOR_VERSION, contact); will(returnValue(contactGroup)); oneOf(db).startTransaction(true); will(returnValue(txn)); @@ -855,8 +855,8 @@ public class GroupInvitationManagerImplTest extends BrambleMockTestCase { Collection contacts = Arrays.asList(contact, contact2, contact3); - Group contactGroup2 = getGroup(CLIENT_ID, CLIENT_VERSION); - Group contactGroup3 = getGroup(CLIENT_ID, CLIENT_VERSION); + Group contactGroup2 = getGroup(CLIENT_ID, MAJOR_VERSION); + Group contactGroup3 = getGroup(CLIENT_ID, MAJOR_VERSION); MessageId storageId2 = new MessageId(getRandomId()); MessageId storageId3 = new MessageId(getRandomId()); @@ -875,13 +875,13 @@ public class GroupInvitationManagerImplTest extends BrambleMockTestCase { oneOf(db).getContacts(txn); will(returnValue(contacts)); oneOf(contactGroupFactory).createContactGroup(CLIENT_ID, - CLIENT_VERSION, contact); + MAJOR_VERSION, contact); will(returnValue(contactGroup)); oneOf(contactGroupFactory).createContactGroup(CLIENT_ID, - CLIENT_VERSION, contact2); + MAJOR_VERSION, contact2); will(returnValue(contactGroup2)); oneOf(contactGroupFactory).createContactGroup(CLIENT_ID, - CLIENT_VERSION, contact3); + MAJOR_VERSION, contact3); will(returnValue(contactGroup3)); // session 1 oneOf(sessionParser).getRole(bdfSession); diff --git a/briar-core/src/test/java/org/briarproject/briar/sharing/BlogSharingIntegrationTest.java b/briar-core/src/test/java/org/briarproject/briar/sharing/BlogSharingIntegrationTest.java index 37bbe16e1..1fbc64387 100644 --- a/briar-core/src/test/java/org/briarproject/briar/sharing/BlogSharingIntegrationTest.java +++ b/briar-core/src/test/java/org/briarproject/briar/sharing/BlogSharingIntegrationTest.java @@ -32,7 +32,7 @@ import java.util.Collection; import java.util.List; import static org.briarproject.briar.api.blog.BlogSharingManager.CLIENT_ID; -import static org.briarproject.briar.api.blog.BlogSharingManager.CLIENT_VERSION; +import static org.briarproject.briar.api.blog.BlogSharingManager.MAJOR_VERSION; import static org.briarproject.briar.test.BriarTestUtils.assertGroupCount; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; @@ -126,7 +126,7 @@ public class BlogSharingIntegrationTest // get sharing group and assert group message count GroupId g = contactGroupFactory.createContactGroup(CLIENT_ID, - CLIENT_VERSION, contact1From0).getId(); + MAJOR_VERSION, contact1From0).getId(); assertGroupCount(messageTracker0, g, 1, 0); // sync first request message @@ -201,7 +201,7 @@ public class BlogSharingIntegrationTest // get sharing group and assert group message count GroupId g = contactGroupFactory.createContactGroup(CLIENT_ID, - CLIENT_VERSION, contact1From0).getId(); + MAJOR_VERSION, contact1From0).getId(); assertGroupCount(messageTracker0, g, 1, 0); // sync first request message diff --git a/briar-core/src/test/java/org/briarproject/briar/sharing/BlogSharingManagerImplTest.java b/briar-core/src/test/java/org/briarproject/briar/sharing/BlogSharingManagerImplTest.java index 5b109533c..10a8f5fc5 100644 --- a/briar-core/src/test/java/org/briarproject/briar/sharing/BlogSharingManagerImplTest.java +++ b/briar-core/src/test/java/org/briarproject/briar/sharing/BlogSharingManagerImplTest.java @@ -39,7 +39,7 @@ import static org.briarproject.bramble.test.TestUtils.getLocalAuthor; import static org.briarproject.bramble.test.TestUtils.getRandomBytes; import static org.briarproject.bramble.test.TestUtils.getRandomId; import static org.briarproject.briar.api.blog.BlogSharingManager.CLIENT_ID; -import static org.briarproject.briar.api.blog.BlogSharingManager.CLIENT_VERSION; +import static org.briarproject.briar.api.blog.BlogSharingManager.MAJOR_VERSION; import static org.briarproject.briar.sharing.SharingConstants.GROUP_KEY_CONTACT_ID; public class BlogSharingManagerImplTest extends BrambleMockTestCase { @@ -66,13 +66,13 @@ public class BlogSharingManagerImplTest extends BrambleMockTestCase { new Contact(contactId, author, localAuthor.getId(), true, true); private final Collection contacts = Collections.singletonList(contact); - private final Group localGroup = getGroup(CLIENT_ID, CLIENT_VERSION); - private final Group contactGroup = getGroup(CLIENT_ID, CLIENT_VERSION); + private final Group localGroup = getGroup(CLIENT_ID, MAJOR_VERSION); + private final Group contactGroup = getGroup(CLIENT_ID, MAJOR_VERSION); private final Group blogGroup = - getGroup(BlogManager.CLIENT_ID, BlogManager.CLIENT_VERSION); + getGroup(BlogManager.CLIENT_ID, BlogManager.MAJOR_VERSION); private final Blog blog = new Blog(blogGroup, author, false); private final Group localBlogGroup = - getGroup(BlogManager.CLIENT_ID, BlogManager.CLIENT_VERSION); + getGroup(BlogManager.CLIENT_ID, BlogManager.MAJOR_VERSION); private final Blog localBlog = new Blog(localBlogGroup, localAuthor, false); @SuppressWarnings("unchecked") private final ProtocolEngine engine = @@ -100,7 +100,7 @@ public class BlogSharingManagerImplTest extends BrambleMockTestCase { context.checking(new Expectations() {{ // The local group doesn't exist - we need to set things up oneOf(contactGroupFactory).createLocalGroup(CLIENT_ID, - CLIENT_VERSION); + MAJOR_VERSION); will(returnValue(localGroup)); oneOf(db).containsGroup(txn, localGroup.getId()); will(returnValue(false)); @@ -123,11 +123,11 @@ public class BlogSharingManagerImplTest extends BrambleMockTestCase { context.checking(new Expectations() {{ // Create the contact group and share it with the contact oneOf(contactGroupFactory).createContactGroup(CLIENT_ID, - CLIENT_VERSION, contact); + MAJOR_VERSION, contact); will(returnValue(contactGroup)); oneOf(db).addGroup(txn, contactGroup); oneOf(clientVersioningManager).getClientVisibility(txn, contactId, - CLIENT_ID, CLIENT_VERSION); + CLIENT_ID, MAJOR_VERSION); will(returnValue(SHARED)); oneOf(db).setGroupVisibility(txn, contactId, contactGroup.getId(), SHARED); @@ -154,7 +154,7 @@ public class BlogSharingManagerImplTest extends BrambleMockTestCase { context.checking(new Expectations() {{ // The local group exists - everything has been set up oneOf(contactGroupFactory).createLocalGroup(CLIENT_ID, - CLIENT_VERSION); + MAJOR_VERSION); will(returnValue(localGroup)); oneOf(db).containsGroup(txn, localGroup.getId()); will(returnValue(true)); @@ -196,13 +196,13 @@ public class BlogSharingManagerImplTest extends BrambleMockTestCase { private void expectPreShareShareable(Transaction txn, Contact contact, Blog blog, Map sessions) throws Exception { - Group contactGroup = getGroup(CLIENT_ID, CLIENT_VERSION); + Group contactGroup = getGroup(CLIENT_ID, MAJOR_VERSION); BdfDictionary sessionDict = new BdfDictionary(); Message message = new Message(new MessageId(getRandomId()), contactGroup.getId(), 42L, getRandomBytes(1337)); context.checking(new Expectations() {{ oneOf(contactGroupFactory).createContactGroup(CLIENT_ID, - CLIENT_VERSION, contact); + MAJOR_VERSION, contact); will(returnValue(contactGroup)); oneOf(sessionParser) .getSessionQuery(new SessionId(blog.getId().getBytes())); @@ -214,7 +214,7 @@ public class BlogSharingManagerImplTest extends BrambleMockTestCase { oneOf(db).addGroup(txn, blog.getGroup()); oneOf(clientVersioningManager).getClientVisibility(txn, contactId, BlogManager.CLIENT_ID, - BlogManager.CLIENT_VERSION); + BlogManager.MAJOR_VERSION); will(returnValue(SHARED)); oneOf(db).setGroupVisibility(txn, contact.getId(), blog.getGroup().getId(), SHARED); @@ -240,7 +240,7 @@ public class BlogSharingManagerImplTest extends BrambleMockTestCase { oneOf(db).getContacts(txn); will(returnValue(contacts)); oneOf(contactGroupFactory).createContactGroup(CLIENT_ID, - CLIENT_VERSION, contact); + MAJOR_VERSION, contact); will(returnValue(contactGroup)); oneOf(sessionParser) .getSessionQuery(new SessionId(blog.getId().getBytes())); diff --git a/briar-core/src/test/java/org/briarproject/briar/sharing/ForumSharingIntegrationTest.java b/briar-core/src/test/java/org/briarproject/briar/sharing/ForumSharingIntegrationTest.java index bbc83660a..2683ea715 100644 --- a/briar-core/src/test/java/org/briarproject/briar/sharing/ForumSharingIntegrationTest.java +++ b/briar-core/src/test/java/org/briarproject/briar/sharing/ForumSharingIntegrationTest.java @@ -39,7 +39,7 @@ import java.util.List; import static junit.framework.Assert.assertNotNull; import static org.briarproject.bramble.util.StringUtils.getRandomString; import static org.briarproject.briar.api.forum.ForumSharingManager.CLIENT_ID; -import static org.briarproject.briar.api.forum.ForumSharingManager.CLIENT_VERSION; +import static org.briarproject.briar.api.forum.ForumSharingManager.MAJOR_VERSION; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; @@ -402,7 +402,7 @@ public class ForumSharingIntegrationTest // response and invitation got tracked Group group = contactGroupFactory.createContactGroup(CLIENT_ID, - CLIENT_VERSION, contact0From1); + MAJOR_VERSION, contact0From1); assertEquals(2, c1.getMessageTracker().getGroupCount(group.getId()) .getMsgCount()); @@ -434,7 +434,7 @@ public class ForumSharingIntegrationTest // assert that the invitation arrived Group group = contactGroupFactory.createContactGroup(CLIENT_ID, - CLIENT_VERSION, contact0From1); + MAJOR_VERSION, contact0From1); assertEquals(1, c1.getMessageTracker().getGroupCount(group.getId()) .getMsgCount()); From 05deaf42e3f990b866f00192d3ee0d11e5c8f005 Mon Sep 17 00:00:00 2001 From: akwizgran Date: Mon, 16 Apr 2018 17:16:14 +0100 Subject: [PATCH 19/33] Store and exchange client minor versions. These don't affect client visibility. --- .../properties/TransportPropertyManager.java | 5 + .../api/sync/ClientVersioningManager.java | 2 +- .../bramble/properties/PropertiesModule.java | 4 +- .../bramble/sync/ClientVersion.java | 11 +- .../sync/ClientVersioningManagerImpl.java | 123 +++++++++++++----- .../sync/ClientVersioningValidator.java | 8 +- .../briar/api/blog/BlogManager.java | 5 + .../briar/api/blog/BlogSharingManager.java | 5 + .../briar/api/forum/ForumManager.java | 5 + .../briar/api/forum/ForumSharingManager.java | 5 + .../api/introduction/IntroductionManager.java | 5 + .../briar/api/messaging/MessagingManager.java | 5 + .../api/privategroup/PrivateGroupManager.java | 5 + .../invitation/GroupInvitationManager.java | 5 + .../introduction/IntroductionModule.java | 4 +- .../briar/messaging/MessagingModule.java | 4 +- .../invitation/GroupInvitationModule.java | 7 +- .../briar/sharing/SharingModule.java | 10 +- 18 files changed, 164 insertions(+), 54 deletions(-) diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/properties/TransportPropertyManager.java b/bramble-api/src/main/java/org/briarproject/bramble/api/properties/TransportPropertyManager.java index 8a8ec4dad..a634bfaa7 100644 --- a/bramble-api/src/main/java/org/briarproject/bramble/api/properties/TransportPropertyManager.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/properties/TransportPropertyManager.java @@ -22,6 +22,11 @@ public interface TransportPropertyManager { */ int MAJOR_VERSION = 0; + /** + * The current minor version of the transport property client. + */ + int MINOR_VERSION = 0; + /** * Stores the given properties received while adding a contact - they will * be superseded by any properties synced from the contact. diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/sync/ClientVersioningManager.java b/bramble-api/src/main/java/org/briarproject/bramble/api/sync/ClientVersioningManager.java index d2a9dac37..b8be969f4 100644 --- a/bramble-api/src/main/java/org/briarproject/bramble/api/sync/ClientVersioningManager.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/sync/ClientVersioningManager.java @@ -25,7 +25,7 @@ public interface ClientVersioningManager { * Registers a client that will be advertised to contacts. This method * should be called before {@link LifecycleManager#startServices(String)}. */ - void registerClient(ClientId clientId, int majorVersion); + void registerClient(ClientId clientId, int majorVersion, int minorVersion); /** * Registers a hook that will be called when the visibility of the given 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 763e0d636..d2d1b6324 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 @@ -17,6 +17,7 @@ import dagger.Provides; import static org.briarproject.bramble.api.properties.TransportPropertyManager.CLIENT_ID; import static org.briarproject.bramble.api.properties.TransportPropertyManager.MAJOR_VERSION; +import static org.briarproject.bramble.api.properties.TransportPropertyManager.MINOR_VERSION; @Module public class PropertiesModule { @@ -51,7 +52,8 @@ public class PropertiesModule { validationManager.registerIncomingMessageHook(CLIENT_ID, MAJOR_VERSION, transportPropertyManager); contactManager.registerContactHook(transportPropertyManager); - clientVersioningManager.registerClient(CLIENT_ID, MAJOR_VERSION); + clientVersioningManager.registerClient(CLIENT_ID, MAJOR_VERSION, + MINOR_VERSION); clientVersioningManager.registerClientVersioningHook(CLIENT_ID, MAJOR_VERSION, transportPropertyManager); return transportPropertyManager; diff --git a/bramble-core/src/main/java/org/briarproject/bramble/sync/ClientVersion.java b/bramble-core/src/main/java/org/briarproject/bramble/sync/ClientVersion.java index 397381220..bd2d85b03 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/sync/ClientVersion.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/sync/ClientVersion.java @@ -33,15 +33,10 @@ class ClientVersion implements Comparable { } @Override - public int compareTo(ClientVersion c) { - int compare = clientId.compareTo(c.clientId); + public int compareTo(ClientVersion cv) { + int compare = clientId.compareTo(cv.clientId); if (compare != 0) return compare; - return majorVersion - c.majorVersion; - } - - @Override - public String toString() { - return clientId.getString() + ":" + majorVersion; + return majorVersion - cv.majorVersion; } } diff --git a/bramble-core/src/main/java/org/briarproject/bramble/sync/ClientVersioningManagerImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/sync/ClientVersioningManagerImpl.java index 7c4b670a2..653b72af5 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/sync/ClientVersioningManagerImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/sync/ClientVersioningManagerImpl.java @@ -61,7 +61,7 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, Client, private final Clock clock; private final Group localGroup; - private final Collection clients = + private final List clients = new CopyOnWriteArrayList<>(); private final Map hooks = new ConcurrentHashMap<>(); @@ -79,8 +79,10 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, Client, } @Override - public void registerClient(ClientId clientId, int majorVersion) { - clients.add(new ClientVersion(clientId, majorVersion)); + public void registerClient(ClientId clientId, int majorVersion, + int minorVersion) { + clients.add(new ClientMinorVersion(clientId, majorVersion, + minorVersion)); } @Override @@ -124,7 +126,7 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, Client, @Override public void startService() throws ServiceException { - List versions = new ArrayList<>(clients); + List versions = new ArrayList<>(clients); Collections.sort(versions); try { Transaction txn = db.startTransaction(false); @@ -161,7 +163,7 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, Client, throw new AssertionError(e); } // Create and store the first local update - List versions = new ArrayList<>(clients); + List versions = new ArrayList<>(clients); Collections.sort(versions); storeFirstUpdate(txn, g.getId(), versions); } @@ -230,7 +232,7 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, Client, } private void storeClientVersions(Transaction txn, - List versions) throws DbException { + List versions) throws DbException { long now = clock.currentTimeMillis(); BdfList body = encodeClientVersions(versions); try { @@ -242,30 +244,35 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, Client, } } - private BdfList encodeClientVersions(List versions) { + private BdfList encodeClientVersions(List versions) { BdfList encoded = new BdfList(); - for (ClientVersion cv : versions) - encoded.add(BdfList.of(cv.clientId.getString(), cv.majorVersion)); + for (ClientMinorVersion cm : versions) + encoded.add(encodeClientVersion(cm)); return encoded; } + private BdfList encodeClientVersion(ClientMinorVersion cm) { + return BdfList.of(cm.version.clientId.getString(), + cm.version.majorVersion, cm.minorVersion); + } + private boolean updateClientVersions(Transaction txn, - List newVersions) throws DbException { + List newVersions) throws DbException { Collection ids = db.getMessageIds(txn, localGroup.getId()); if (ids.isEmpty()) { storeClientVersions(txn, newVersions); return true; } MessageId m = ids.iterator().next(); - List oldVersions = loadClientVersions(txn, m); + List oldVersions = loadClientVersions(txn, m); if (oldVersions.equals(newVersions)) return false; db.removeMessage(txn, m); storeClientVersions(txn, newVersions); return true; } - private List loadClientVersions(Transaction txn, MessageId m) - throws DbException { + private List loadClientVersions(Transaction txn, + MessageId m) throws DbException { try { BdfList body = clientHelper.getMessageAsList(txn, m); if (body == null) throw new DbException(); @@ -275,21 +282,23 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, Client, } } - private List parseClientVersions(BdfList body) + private List parseClientVersions(BdfList body) throws FormatException { int size = body.size(); - List parsed = new ArrayList<>(size); + List parsed = new ArrayList<>(size); for (int i = 0; i < size; i++) { BdfList cv = body.getList(i); ClientId clientId = new ClientId(cv.getString(0)); int majorVersion = cv.getLong(1).intValue(); - parsed.add(new ClientVersion(clientId, majorVersion)); + int minorVersion = cv.getLong(2).intValue(); + parsed.add(new ClientMinorVersion(clientId, majorVersion, + minorVersion)); } return parsed; } private void clientVersionsUpdated(Transaction txn, Contact c, - List versions) throws DbException { + List versions) throws DbException { try { // Find the latest local and remote updates Group g = getContactGroup(c); @@ -372,11 +381,12 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, Client, private ClientState parseClientState(BdfList clientState) throws FormatException { - // Client ID, major version, active + // Client ID, major version, minor version, active ClientId clientId = new ClientId(clientState.getString(0)); int majorVersion = clientState.getLong(1).intValue(); - boolean active = clientState.getBoolean(2); - return new ClientState(clientId, majorVersion, active); + int minorVersion = clientState.getLong(2).intValue(); + boolean active = clientState.getBoolean(3); + return new ClientState(clientId, majorVersion, minorVersion, active); } private long parseUpdateVersion(BdfList body) throws FormatException { @@ -385,14 +395,15 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, Client, } private List updateStatesFromLocalVersions( - List oldStates, List newVersions) { + List oldStates, List newVersions) { Map oldMap = new HashMap<>(); for (ClientState cs : oldStates) oldMap.put(cs.version, cs); List newStates = new ArrayList<>(newVersions.size()); - for (ClientVersion newVersion : newVersions) { - ClientState oldState = oldMap.get(newVersion); + for (ClientMinorVersion newVersion : newVersions) { + ClientState oldState = oldMap.get(newVersion.version); boolean active = oldState != null && oldState.active; - newStates.add(new ClientState(newVersion, active)); + newStates.add(new ClientState(newVersion.version, + newVersion.minorVersion, active)); } return newStates; } @@ -420,7 +431,7 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, Client, private BdfList encodeClientState(ClientState cs) { return BdfList.of(cs.version.clientId.getString(), - cs.version.majorVersion, cs.active); + cs.version.majorVersion, cs.minorVersion, cs.active); } private Map getVisibilities( @@ -461,10 +472,10 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, Client, } private void storeFirstUpdate(Transaction txn, GroupId g, - List versions) throws DbException { + List versions) throws DbException { List states = new ArrayList<>(versions.size()); - for (ClientVersion cv : versions) - states.add(new ClientState(cv, false)); + for (ClientMinorVersion cm : versions) + states.add(new ClientState(cm.version, cm.minorVersion, false)); storeUpdate(txn, g, states, 1); } @@ -487,7 +498,8 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, Client, new ArrayList<>(oldLocalStates.size()); for (ClientState oldState : oldLocalStates) { boolean active = remoteSet.contains(oldState.version); - newLocalStates.add(new ClientState(oldState.version, active)); + newLocalStates.add(new ClientState(oldState.version, + oldState.minorVersion, active)); } return newLocalStates; } @@ -526,26 +538,71 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, Client, } } + private static class ClientMinorVersion + implements Comparable { + + private final ClientVersion version; + private final int minorVersion; + + private ClientMinorVersion(ClientVersion version, int minorVersion) { + this.version = version; + this.minorVersion = minorVersion; + } + + private ClientMinorVersion(ClientId clientId, int majorVersion, + int minorVersion) { + this(new ClientVersion(clientId, majorVersion), minorVersion); + } + + @Override + public boolean equals(Object o) { + if (o instanceof ClientMinorVersion) { + ClientMinorVersion cm = (ClientMinorVersion) o; + return version.equals(cm.version) + && minorVersion == cm.minorVersion; + } + return false; + } + + @Override + public int hashCode() { + return version.hashCode(); + } + + @Override + public int compareTo(ClientMinorVersion cm) { + int compare = version.compareTo(cm.version); + if (compare != 0) return compare; + return minorVersion - cm.minorVersion; + } + } + private static class ClientState { private final ClientVersion version; + private final int minorVersion; private final boolean active; - private ClientState(ClientVersion version, boolean active) { + private ClientState(ClientVersion version, int minorVersion, + boolean active) { this.version = version; + this.minorVersion = minorVersion; this.active = active; } private ClientState(ClientId clientId, int majorVersion, - boolean active) { - this(new ClientVersion(clientId, majorVersion), active); + int minorVersion, boolean active) { + this(new ClientVersion(clientId, majorVersion), minorVersion, + active); } @Override public boolean equals(Object o) { if (o instanceof ClientState) { ClientState cs = (ClientState) o; - return version.equals(cs.version) && active == cs.active; + return version.equals(cs.version) + && minorVersion == cs.minorVersion + && active == cs.active; } return false; } diff --git a/bramble-core/src/main/java/org/briarproject/bramble/sync/ClientVersioningValidator.java b/bramble-core/src/main/java/org/briarproject/bramble/sync/ClientVersioningValidator.java index 7306f22c5..55e0383bf 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/sync/ClientVersioningValidator.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/sync/ClientVersioningValidator.java @@ -39,13 +39,15 @@ class ClientVersioningValidator extends BdfMessageValidator { int size = states.size(); for (int i = 0; i < size; i++) { BdfList clientState = states.getList(i); - // Client ID, major version, active - checkSize(clientState, 3); + // Client ID, major version, minor version, active + checkSize(clientState, 4); String clientId = clientState.getString(0); checkLength(clientId, 1, MAX_CLIENT_ID_LENGTH); int majorVersion = clientState.getLong(1).intValue(); if (majorVersion < 0) throw new FormatException(); - clientState.getBoolean(2); + int minorVersion = clientState.getLong(2).intValue(); + if (minorVersion < 0) throw new FormatException(); + clientState.getBoolean(3); } // Update version long updateVersion = body.getLong(1); diff --git a/briar-api/src/main/java/org/briarproject/briar/api/blog/BlogManager.java b/briar-api/src/main/java/org/briarproject/briar/api/blog/BlogManager.java index c32f16736..5381dd490 100644 --- a/briar-api/src/main/java/org/briarproject/briar/api/blog/BlogManager.java +++ b/briar-api/src/main/java/org/briarproject/briar/api/blog/BlogManager.java @@ -26,6 +26,11 @@ public interface BlogManager { */ int MAJOR_VERSION = 0; + /** + * The current minor version of the blog client. + */ + int MINOR_VERSION = 0; + /** * Adds the given {@link Blog).} */ diff --git a/briar-api/src/main/java/org/briarproject/briar/api/blog/BlogSharingManager.java b/briar-api/src/main/java/org/briarproject/briar/api/blog/BlogSharingManager.java index 2e4a02d3b..f2f04afc5 100644 --- a/briar-api/src/main/java/org/briarproject/briar/api/blog/BlogSharingManager.java +++ b/briar-api/src/main/java/org/briarproject/briar/api/blog/BlogSharingManager.java @@ -14,4 +14,9 @@ public interface BlogSharingManager extends SharingManager { * The current major version of the blog sharing client. */ int MAJOR_VERSION = 0; + + /** + * The current minor version of the blog sharing client. + */ + int MINOR_VERSION = 0; } diff --git a/briar-api/src/main/java/org/briarproject/briar/api/forum/ForumManager.java b/briar-api/src/main/java/org/briarproject/briar/api/forum/ForumManager.java index 0d67a9c42..96f447776 100644 --- a/briar-api/src/main/java/org/briarproject/briar/api/forum/ForumManager.java +++ b/briar-api/src/main/java/org/briarproject/briar/api/forum/ForumManager.java @@ -27,6 +27,11 @@ public interface ForumManager { */ int MAJOR_VERSION = 0; + /** + * The current minor version of the forum client. + */ + int MINOR_VERSION = 0; + /** * Subscribes to a forum. */ diff --git a/briar-api/src/main/java/org/briarproject/briar/api/forum/ForumSharingManager.java b/briar-api/src/main/java/org/briarproject/briar/api/forum/ForumSharingManager.java index c021a23a9..29b2468d0 100644 --- a/briar-api/src/main/java/org/briarproject/briar/api/forum/ForumSharingManager.java +++ b/briar-api/src/main/java/org/briarproject/briar/api/forum/ForumSharingManager.java @@ -14,4 +14,9 @@ public interface ForumSharingManager extends SharingManager { * The current major version of the forum sharing client. */ int MAJOR_VERSION = 0; + + /** + * The current minor version of the forum sharing client. + */ + int MINOR_VERSION = 0; } diff --git a/briar-api/src/main/java/org/briarproject/briar/api/introduction/IntroductionManager.java b/briar-api/src/main/java/org/briarproject/briar/api/introduction/IntroductionManager.java index c337dd44c..532d63353 100644 --- a/briar-api/src/main/java/org/briarproject/briar/api/introduction/IntroductionManager.java +++ b/briar-api/src/main/java/org/briarproject/briar/api/introduction/IntroductionManager.java @@ -30,6 +30,11 @@ public interface IntroductionManager extends ConversationClient { */ boolean canIntroduce(Contact c1, Contact c2) throws DbException; + /** + * The current minor version of the introduction client. + */ + int MINOR_VERSION = 0; + /** * Sends two initial introduction messages. */ diff --git a/briar-api/src/main/java/org/briarproject/briar/api/messaging/MessagingManager.java b/briar-api/src/main/java/org/briarproject/briar/api/messaging/MessagingManager.java index be28aaa7b..f29d2c9e4 100644 --- a/briar-api/src/main/java/org/briarproject/briar/api/messaging/MessagingManager.java +++ b/briar-api/src/main/java/org/briarproject/briar/api/messaging/MessagingManager.java @@ -23,6 +23,11 @@ public interface MessagingManager extends ConversationClient { */ int MAJOR_VERSION = 0; + /** + * The current minor version of the messaging client. + */ + int MINOR_VERSION = 0; + /** * Stores a local private message. */ diff --git a/briar-api/src/main/java/org/briarproject/briar/api/privategroup/PrivateGroupManager.java b/briar-api/src/main/java/org/briarproject/briar/api/privategroup/PrivateGroupManager.java index 4034c4d61..de4caecfc 100644 --- a/briar-api/src/main/java/org/briarproject/briar/api/privategroup/PrivateGroupManager.java +++ b/briar-api/src/main/java/org/briarproject/briar/api/privategroup/PrivateGroupManager.java @@ -26,6 +26,11 @@ public interface PrivateGroupManager { */ int MAJOR_VERSION = 0; + /** + * The current minor version of the private group client. + */ + int MINOR_VERSION = 0; + /** * Adds a new private group and joins it. * diff --git a/briar-api/src/main/java/org/briarproject/briar/api/privategroup/invitation/GroupInvitationManager.java b/briar-api/src/main/java/org/briarproject/briar/api/privategroup/invitation/GroupInvitationManager.java index e510c6dec..1062d0ce1 100644 --- a/briar-api/src/main/java/org/briarproject/briar/api/privategroup/invitation/GroupInvitationManager.java +++ b/briar-api/src/main/java/org/briarproject/briar/api/privategroup/invitation/GroupInvitationManager.java @@ -30,6 +30,11 @@ public interface GroupInvitationManager extends ConversationClient { */ int MAJOR_VERSION = 0; + /** + * The current minor version of the private group invitation client. + */ + int MINOR_VERSION = 0; + /** * Sends an invitation to share the given private group with the given * contact, including an optional message. diff --git a/briar-core/src/main/java/org/briarproject/briar/introduction/IntroductionModule.java b/briar-core/src/main/java/org/briarproject/briar/introduction/IntroductionModule.java index 1f3c7d7a5..17d08cd18 100644 --- a/briar-core/src/main/java/org/briarproject/briar/introduction/IntroductionModule.java +++ b/briar-core/src/main/java/org/briarproject/briar/introduction/IntroductionModule.java @@ -18,6 +18,7 @@ import dagger.Provides; import static org.briarproject.briar.api.introduction.IntroductionManager.CLIENT_ID; import static org.briarproject.briar.api.introduction.IntroductionManager.MAJOR_VERSION; +import static org.briarproject.briar.api.introduction.IntroductionManager.MINOR_VERSION; @Module public class IntroductionModule { @@ -55,7 +56,8 @@ public class IntroductionModule { validationManager.registerIncomingMessageHook(CLIENT_ID, MAJOR_VERSION, introductionManager); conversationManager.registerConversationClient(introductionManager); - clientVersioningManager.registerClient(CLIENT_ID, MAJOR_VERSION); + clientVersioningManager.registerClient(CLIENT_ID, MAJOR_VERSION, + MINOR_VERSION); clientVersioningManager.registerClientVersioningHook(CLIENT_ID, MAJOR_VERSION, introductionManager); return introductionManager; diff --git a/briar-core/src/main/java/org/briarproject/briar/messaging/MessagingModule.java b/briar-core/src/main/java/org/briarproject/briar/messaging/MessagingModule.java index 0916a9426..8363ef393 100644 --- a/briar-core/src/main/java/org/briarproject/briar/messaging/MessagingModule.java +++ b/briar-core/src/main/java/org/briarproject/briar/messaging/MessagingModule.java @@ -19,6 +19,7 @@ import dagger.Provides; import static org.briarproject.briar.api.messaging.MessagingManager.CLIENT_ID; import static org.briarproject.briar.api.messaging.MessagingManager.MAJOR_VERSION; +import static org.briarproject.briar.api.messaging.MessagingManager.MINOR_VERSION; @Module public class MessagingModule { @@ -62,7 +63,8 @@ public class MessagingModule { validationManager.registerIncomingMessageHook(CLIENT_ID, MAJOR_VERSION, messagingManager); conversationManager.registerConversationClient(messagingManager); - clientVersioningManager.registerClient(CLIENT_ID, MAJOR_VERSION); + clientVersioningManager.registerClient(CLIENT_ID, MAJOR_VERSION, + MINOR_VERSION); clientVersioningManager.registerClientVersioningHook(CLIENT_ID, MAJOR_VERSION, messagingManager); return messagingManager; diff --git a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationModule.java b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationModule.java index f00192af7..03f0ed678 100644 --- a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationModule.java +++ b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationModule.java @@ -21,6 +21,7 @@ import dagger.Provides; import static org.briarproject.briar.api.privategroup.invitation.GroupInvitationManager.CLIENT_ID; import static org.briarproject.briar.api.privategroup.invitation.GroupInvitationManager.MAJOR_VERSION; +import static org.briarproject.briar.api.privategroup.invitation.GroupInvitationManager.MINOR_VERSION; @Module public class GroupInvitationModule { @@ -47,13 +48,15 @@ public class GroupInvitationModule { contactManager.registerContactHook(groupInvitationManager); privateGroupManager.registerPrivateGroupHook(groupInvitationManager); conversationManager.registerConversationClient(groupInvitationManager); - clientVersioningManager.registerClient(CLIENT_ID, MAJOR_VERSION); + clientVersioningManager.registerClient(CLIENT_ID, MAJOR_VERSION, + MINOR_VERSION); clientVersioningManager.registerClientVersioningHook(CLIENT_ID, MAJOR_VERSION, groupInvitationManager); // The group invitation manager handles client visibility changes for // the private group manager clientVersioningManager.registerClient(PrivateGroupManager.CLIENT_ID, - PrivateGroupManager.MAJOR_VERSION); + PrivateGroupManager.MAJOR_VERSION, + PrivateGroupManager.MINOR_VERSION); clientVersioningManager.registerClientVersioningHook( PrivateGroupManager.CLIENT_ID, PrivateGroupManager.MAJOR_VERSION, diff --git a/briar-core/src/main/java/org/briarproject/briar/sharing/SharingModule.java b/briar-core/src/main/java/org/briarproject/briar/sharing/SharingModule.java index 921ab7569..b58bc246a 100644 --- a/briar-core/src/main/java/org/briarproject/briar/sharing/SharingModule.java +++ b/briar-core/src/main/java/org/briarproject/briar/sharing/SharingModule.java @@ -84,14 +84,15 @@ public class SharingModule { conversationManager.registerConversationClient(blogSharingManager); blogManager.registerRemoveBlogHook(blogSharingManager); clientVersioningManager.registerClient(BlogSharingManager.CLIENT_ID, - BlogSharingManager.MAJOR_VERSION); + BlogSharingManager.MAJOR_VERSION, + BlogSharingManager.MINOR_VERSION); clientVersioningManager.registerClientVersioningHook( BlogSharingManager.CLIENT_ID, BlogSharingManager.MAJOR_VERSION, blogSharingManager); // The blog sharing manager handles client visibility changes for the // blog manager clientVersioningManager.registerClient(BlogManager.CLIENT_ID, - BlogManager.MAJOR_VERSION); + BlogManager.MAJOR_VERSION, BlogManager.MINOR_VERSION); clientVersioningManager.registerClientVersioningHook( BlogManager.CLIENT_ID, BlogManager.MAJOR_VERSION, blogSharingManager.getShareableClientVersioningHook()); @@ -147,14 +148,15 @@ public class SharingModule { conversationManager.registerConversationClient(forumSharingManager); forumManager.registerRemoveForumHook(forumSharingManager); clientVersioningManager.registerClient(ForumSharingManager.CLIENT_ID, - ForumSharingManager.MAJOR_VERSION); + ForumSharingManager.MAJOR_VERSION, + ForumSharingManager.MINOR_VERSION); clientVersioningManager.registerClientVersioningHook( ForumSharingManager.CLIENT_ID, ForumSharingManager.MAJOR_VERSION, forumSharingManager); // The forum sharing manager handles client visibility changes for the // forum manager clientVersioningManager.registerClient(ForumManager.CLIENT_ID, - ForumManager.MAJOR_VERSION); + ForumManager.MAJOR_VERSION, ForumManager.MINOR_VERSION); clientVersioningManager.registerClientVersioningHook( ForumManager.CLIENT_ID, ForumManager.MAJOR_VERSION, forumSharingManager.getShareableClientVersioningHook()); From c4e9b6f2ab0a15bc18958b970b8a028d422fc6a8 Mon Sep 17 00:00:00 2001 From: akwizgran Date: Mon, 16 Apr 2018 17:39:19 +0100 Subject: [PATCH 20/33] Remove debug logging. --- .../properties/TransportPropertyManagerImpl.java | 10 ---------- .../introduction/IntroductionManagerImpl.java | 5 ----- .../briar/messaging/MessagingManagerImpl.java | 9 --------- .../invitation/GroupInvitationManagerImpl.java | 14 -------------- .../briar/sharing/SharingManagerImpl.java | 14 -------------- 5 files changed, 52 deletions(-) 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 341776612..7c3e4a332 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 @@ -32,22 +32,16 @@ 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 java.util.logging.Level.INFO; - @Immutable @NotNullByDefault class TransportPropertyManagerImpl implements TransportPropertyManager, 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; @@ -89,8 +83,6 @@ class TransportPropertyManagerImpl implements TransportPropertyManager, // Apply the client's visibility to the contact group Visibility client = clientVersioningManager.getClientVisibility(txn, c.getId(), CLIENT_ID, MAJOR_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 local = getLocalProperties(txn); @@ -110,8 +102,6 @@ class TransportPropertyManagerImpl implements TransportPropertyManager, 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); } diff --git a/briar-core/src/main/java/org/briarproject/briar/introduction/IntroductionManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/introduction/IntroductionManagerImpl.java index 0725c147e..a4137a509 100644 --- a/briar-core/src/main/java/org/briarproject/briar/introduction/IntroductionManagerImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/introduction/IntroductionManagerImpl.java @@ -48,7 +48,6 @@ import javax.annotation.Nullable; import javax.annotation.concurrent.Immutable; import javax.inject.Inject; -import static java.util.logging.Level.INFO; import static org.briarproject.bramble.api.sync.Group.Visibility.SHARED; import static org.briarproject.briar.api.introduction.Role.INTRODUCEE; import static org.briarproject.briar.api.introduction.Role.INTRODUCER; @@ -128,8 +127,6 @@ class IntroductionManagerImpl extends ConversationClientImpl // Apply the client's visibility to the contact group Visibility client = clientVersioningManager.getClientVisibility(txn, c.getId(), CLIENT_ID, MAJOR_VERSION); - if (LOG.isLoggable(INFO)) - LOG.info("Applying visibility " + client + " to new contact group");db.setGroupVisibility(txn, c.getId(), g.getId(), client); db.setGroupVisibility(txn, c.getId(), g.getId(), client); // Attach the contact ID to the group BdfDictionary meta = new BdfDictionary(); @@ -156,8 +153,6 @@ class IntroductionManagerImpl extends ConversationClientImpl 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); } diff --git a/briar-core/src/main/java/org/briarproject/briar/messaging/MessagingManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/messaging/MessagingManagerImpl.java index 3bbb3f03d..f57dafcdf 100644 --- a/briar-core/src/main/java/org/briarproject/briar/messaging/MessagingManagerImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/messaging/MessagingManagerImpl.java @@ -32,12 +32,10 @@ import org.briarproject.briar.client.ConversationClientImpl; import java.util.ArrayList; import java.util.Collection; import java.util.Map; -import java.util.logging.Logger; import javax.annotation.concurrent.Immutable; import javax.inject.Inject; -import static java.util.logging.Level.INFO; import static org.briarproject.briar.client.MessageTrackerConstants.MSG_KEY_READ; @Immutable @@ -45,9 +43,6 @@ import static org.briarproject.briar.client.MessageTrackerConstants.MSG_KEY_READ class MessagingManagerImpl extends ConversationClientImpl implements MessagingManager, Client, ContactHook, ClientVersioningHook { - private static final Logger LOG = - Logger.getLogger(MessagingManagerImpl.class.getName()); - private final ClientVersioningManager clientVersioningManager; private final ContactGroupFactory contactGroupFactory; @@ -81,8 +76,6 @@ class MessagingManagerImpl extends ConversationClientImpl // Apply the client's visibility to the contact group Visibility client = clientVersioningManager.getClientVisibility(txn, c.getId(), CLIENT_ID, MAJOR_VERSION); - if (LOG.isLoggable(INFO)) - LOG.info("Applying visibility " + client + " to new contact group"); db.setGroupVisibility(txn, c.getId(), g.getId(), client); // Attach the contact ID to the group BdfDictionary d = new BdfDictionary(); @@ -110,8 +103,6 @@ class MessagingManagerImpl extends ConversationClientImpl 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); } diff --git a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImpl.java index 58da3f2de..bc67240a1 100644 --- a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImpl.java @@ -43,13 +43,11 @@ import java.util.HashMap; import java.util.List; 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 java.util.logging.Level.INFO; import static org.briarproject.briar.privategroup.invitation.CreatorState.START; import static org.briarproject.briar.privategroup.invitation.GroupInvitationConstants.GROUP_KEY_CONTACT_ID; import static org.briarproject.briar.privategroup.invitation.MessageType.ABORT; @@ -66,9 +64,6 @@ class GroupInvitationManagerImpl extends ConversationClientImpl implements GroupInvitationManager, Client, ContactHook, PrivateGroupHook, ClientVersioningHook { - private static final Logger LOG = - Logger.getLogger(GroupInvitationManagerImpl.class.getName()); - private final ClientVersioningManager clientVersioningManager; private final ContactGroupFactory contactGroupFactory; private final PrivateGroupFactory privateGroupFactory; @@ -123,8 +118,6 @@ class GroupInvitationManagerImpl extends ConversationClientImpl db.addGroup(txn, g); Visibility client = clientVersioningManager.getClientVisibility(txn, c.getId(), CLIENT_ID, MAJOR_VERSION); - if (LOG.isLoggable(INFO)) - LOG.info("Applying visibility " + client + " to new contact group"); db.setGroupVisibility(txn, c.getId(), g.getId(), client); // Attach the contact ID to the group BdfDictionary meta = new BdfDictionary(); @@ -584,8 +577,6 @@ class GroupInvitationManagerImpl extends ConversationClientImpl public void onClientVisibilityChanging(Transaction txn, Contact c, Visibility v) throws DbException { // Apply the client's visibility to the contact group - if (LOG.isLoggable(INFO)) - LOG.info("Applying visibility " + v + " to contact group"); Group g = getContactGroup(c); db.setGroupVisibility(txn, c.getId(), g.getId(), v); } @@ -606,11 +597,6 @@ class GroupInvitationManagerImpl extends ConversationClientImpl if (preferred == null) continue; // No session for this group // Apply min of preferred visibility and client's visibility Visibility min = Visibility.min(preferred, client); - if (LOG.isLoggable(INFO)) { - LOG.info("Applying visibility " + min - + " to private group, preferred " + preferred - + ", client " + client); - } db.setGroupVisibility(txn, c.getId(), g.getId(), min); } } catch (FormatException e) { diff --git a/briar-core/src/main/java/org/briarproject/briar/sharing/SharingManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/sharing/SharingManagerImpl.java index d249fc1f6..e0c2404fd 100644 --- a/briar-core/src/main/java/org/briarproject/briar/sharing/SharingManagerImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/sharing/SharingManagerImpl.java @@ -40,11 +40,9 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; -import java.util.logging.Logger; import javax.annotation.Nullable; -import static java.util.logging.Level.INFO; import static org.briarproject.bramble.api.sync.Group.Visibility.SHARED; import static org.briarproject.briar.sharing.MessageType.ABORT; import static org.briarproject.briar.sharing.MessageType.ACCEPT; @@ -60,9 +58,6 @@ abstract class SharingManagerImpl implements SharingManager, Client, ContactHook, ClientVersioningHook { - private static final Logger LOG = - Logger.getLogger(SharingManagerImpl.class.getName()); - private final ClientVersioningManager clientVersioningManager; private final MessageParser messageParser; private final SessionEncoder sessionEncoder; @@ -115,8 +110,6 @@ abstract class SharingManagerImpl db.addGroup(txn, g); Visibility client = clientVersioningManager.getClientVisibility(txn, c.getId(), getClientId(), getClientVersion()); - if (LOG.isLoggable(INFO)) - LOG.info("Applying visibility " + client + " to new contact group"); db.setGroupVisibility(txn, c.getId(), g.getId(), client); // Attach the contact ID to the group BdfDictionary meta = new BdfDictionary(); @@ -510,8 +503,6 @@ abstract class SharingManagerImpl 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); } @@ -531,11 +522,6 @@ abstract class SharingManagerImpl if (preferred == null) continue; // No session for this group // Apply min of preferred visibility and client's visibility Visibility min = Visibility.min(preferred, client); - if (LOG.isLoggable(INFO)) { - LOG.info("Applying visibility " + min - + " to shareable, preferred " + preferred - + ", client" + client); - } db.setGroupVisibility(txn, c.getId(), g.getId(), min); } } catch (FormatException e) { From 6942a368d4cfa67636b944f79de4e18fbc3022bf Mon Sep 17 00:00:00 2001 From: akwizgran Date: Mon, 16 Apr 2018 17:45:34 +0100 Subject: [PATCH 21/33] Don't share groups unless the contact supports the client. --- .../GroupInvitationManagerImpl.java | 6 ++++++ .../briar/sharing/BlogSharingManagerImpl.java | 4 ++-- .../sharing/ForumSharingManagerImpl.java | 4 ++-- .../briar/sharing/SharingManagerImpl.java | 21 +++++++++++-------- .../GroupInvitationManagerImplTest.java | 4 ++++ 5 files changed, 26 insertions(+), 13 deletions(-) diff --git a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImpl.java index bc67240a1..22427eaa0 100644 --- a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImpl.java @@ -48,6 +48,7 @@ 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 org.briarproject.briar.privategroup.invitation.CreatorState.START; import static org.briarproject.briar.privategroup.invitation.GroupInvitationConstants.GROUP_KEY_CONTACT_ID; import static org.briarproject.briar.privategroup.invitation.MessageType.ABORT; @@ -468,8 +469,13 @@ class GroupInvitationManagerImpl extends ConversationClientImpl SessionId sessionId = getSessionId(privateGroupId); Transaction txn = db.startTransaction(true); try { + Visibility client = clientVersioningManager.getClientVisibility(txn, + c.getId(), PrivateGroupManager.CLIENT_ID, + PrivateGroupManager.MAJOR_VERSION); StoredSession ss = getSession(txn, contactGroupId, sessionId); db.commitTransaction(txn); + // The group can't be shared unless the contact supports the client + if (client != SHARED) return false; // If there's no session, the contact can be invited if (ss == null) return true; // If the session's in the start state, the contact can be invited diff --git a/briar-core/src/main/java/org/briarproject/briar/sharing/BlogSharingManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/sharing/BlogSharingManagerImpl.java index 92cd05701..2be80af2b 100644 --- a/briar-core/src/main/java/org/briarproject/briar/sharing/BlogSharingManagerImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/sharing/BlogSharingManagerImpl.java @@ -54,7 +54,7 @@ class BlogSharingManagerImpl extends SharingManagerImpl } @Override - protected int getClientVersion() { + protected int getMajorVersion() { return MAJOR_VERSION; } @@ -64,7 +64,7 @@ class BlogSharingManagerImpl extends SharingManagerImpl } @Override - protected int getShareableClientVersion() { + protected int getShareableMajorVersion() { return BlogManager.MAJOR_VERSION; } diff --git a/briar-core/src/main/java/org/briarproject/briar/sharing/ForumSharingManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/sharing/ForumSharingManagerImpl.java index 9fbe749ea..12dd56b5b 100644 --- a/briar-core/src/main/java/org/briarproject/briar/sharing/ForumSharingManagerImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/sharing/ForumSharingManagerImpl.java @@ -42,7 +42,7 @@ class ForumSharingManagerImpl extends SharingManagerImpl } @Override - protected int getClientVersion() { + protected int getMajorVersion() { return MAJOR_VERSION; } @@ -52,7 +52,7 @@ class ForumSharingManagerImpl extends SharingManagerImpl } @Override - protected int getShareableClientVersion() { + protected int getShareableMajorVersion() { return ForumManager.MAJOR_VERSION; } diff --git a/briar-core/src/main/java/org/briarproject/briar/sharing/SharingManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/sharing/SharingManagerImpl.java index e0c2404fd..200d91c95 100644 --- a/briar-core/src/main/java/org/briarproject/briar/sharing/SharingManagerImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/sharing/SharingManagerImpl.java @@ -85,17 +85,17 @@ abstract class SharingManagerImpl protected abstract ClientId getClientId(); - protected abstract int getClientVersion(); + protected abstract int getMajorVersion(); protected abstract ClientId getShareableClientId(); - protected abstract int getShareableClientVersion(); + protected abstract int getShareableMajorVersion(); @Override public void createLocalState(Transaction txn) throws DbException { // Create a local group to indicate that we've set this client up Group localGroup = contactGroupFactory.createLocalGroup(getClientId(), - getClientVersion()); + getMajorVersion()); if (db.containsGroup(txn, localGroup.getId())) return; db.addGroup(txn, localGroup); // Set things up for any pre-existing contacts @@ -109,7 +109,7 @@ abstract class SharingManagerImpl // Store the group and share it with the contact db.addGroup(txn, g); Visibility client = clientVersioningManager.getClientVisibility(txn, - c.getId(), getClientId(), getClientVersion()); + c.getId(), getClientId(), getMajorVersion()); db.setGroupVisibility(txn, c.getId(), g.getId(), client); // Attach the contact ID to the group BdfDictionary meta = new BdfDictionary(); @@ -123,14 +123,14 @@ abstract class SharingManagerImpl @Override public void removingContact(Transaction txn, Contact c) throws DbException { - // remove the contact group (all messages will be removed with it) + // Remove the contact group (all messages will be removed with it) db.removeGroup(txn, getContactGroup(c)); } @Override public Group getContactGroup(Contact c) { return contactGroupFactory.createContactGroup(getClientId(), - getClientVersion(), c); + getMajorVersion(), c); } @Override @@ -174,7 +174,7 @@ abstract class SharingManagerImpl // Apply the client's visibility Visibility client = clientVersioningManager.getClientVisibility(txn, - c.getId(), getShareableClientId(), getShareableClientVersion()); + c.getId(), getShareableClientId(), getShareableMajorVersion()); db.setGroupVisibility(txn, c.getId(), shareable.getId(), client); // Initialize session in sharing state @@ -437,7 +437,6 @@ abstract class SharingManagerImpl Transaction txn = db.startTransaction(true); try { for (Contact c : db.getContacts(txn)) { - // FIXME: Check the session for the preferred visibility? if (db.getGroupVisibility(txn, c.getId(), g) == SHARED) contacts.add(c); } @@ -462,6 +461,10 @@ abstract class SharingManagerImpl private boolean canBeShared(Transaction txn, GroupId g, Contact c) throws DbException { + // The group can't be shared unless the contact supports the client + Visibility client = clientVersioningManager.getClientVisibility(txn, + c.getId(), getShareableClientId(), getShareableMajorVersion()); + if (client != SHARED) return false; GroupId contactGroupId = getContactGroup(c).getId(); SessionId sessionId = getSessionId(g); try { @@ -515,7 +518,7 @@ abstract class SharingManagerImpl Visibility client) throws DbException { try { Collection shareables = db.getGroups(txn, - getShareableClientId(), getShareableClientVersion()); + getShareableClientId(), getShareableMajorVersion()); Map m = getPreferredVisibilities(txn, c); for (Group g : shareables) { Visibility preferred = m.get(g.getId()); diff --git a/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImplTest.java b/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImplTest.java index 6792e51e3..4a1a7a7e9 100644 --- a/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImplTest.java +++ b/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImplTest.java @@ -826,6 +826,10 @@ public class GroupInvitationManagerImplTest extends BrambleMockTestCase { will(returnValue(contactGroup)); oneOf(db).startTransaction(true); will(returnValue(txn)); + oneOf(clientVersioningManager).getClientVisibility(txn, contactId, + PrivateGroupManager.CLIENT_ID, + PrivateGroupManager.MAJOR_VERSION); + will(returnValue(SHARED)); oneOf(sessionParser) .parseCreatorSession(contactGroup.getId(), bdfSession); will(returnValue(creatorSession)); From 57a6c8cb3ac2b8416b447a711578f52d07ecc93e Mon Sep 17 00:00:00 2001 From: akwizgran Date: Tue, 17 Apr 2018 12:13:02 +0100 Subject: [PATCH 22/33] Separate the crypto executor into its own module. This allows it to be replaced for testing. --- .../bramble/BrambleCoreEagerSingletons.java | 4 +- .../bramble/BrambleCoreModule.java | 4 +- .../bramble/crypto/CryptoExecutorModule.java | 67 +++++++ .../bramble/crypto/CryptoModule.java | 55 ------ .../test/TestCryptoExecutorModule.java | 21 +++ .../feed/FeedManagerIntegrationTest.java | 6 +- .../FeedManagerIntegrationTestComponent.java | 10 +- .../IntroductionIntegrationTestComponent.java | 2 + .../messaging/MessageSizeIntegrationTest.java | 13 ++ .../MessageSizeIntegrationTestComponent.java | 24 ++- .../SimplexMessagingIntegrationTest.java | 178 ++++++++++-------- ...plexMessagingIntegrationTestComponent.java | 12 ++ .../briar/test/BriarIntegrationTest.java | 4 +- .../test/BriarIntegrationTestComponent.java | 4 +- 14 files changed, 252 insertions(+), 152 deletions(-) create mode 100644 bramble-core/src/main/java/org/briarproject/bramble/crypto/CryptoExecutorModule.java create mode 100644 bramble-core/src/test/java/org/briarproject/bramble/test/TestCryptoExecutorModule.java diff --git a/bramble-core/src/main/java/org/briarproject/bramble/BrambleCoreEagerSingletons.java b/bramble-core/src/main/java/org/briarproject/bramble/BrambleCoreEagerSingletons.java index e7a211e29..b57869fb1 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/BrambleCoreEagerSingletons.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/BrambleCoreEagerSingletons.java @@ -1,7 +1,7 @@ package org.briarproject.bramble; import org.briarproject.bramble.contact.ContactModule; -import org.briarproject.bramble.crypto.CryptoModule; +import org.briarproject.bramble.crypto.CryptoExecutorModule; import org.briarproject.bramble.db.DatabaseExecutorModule; import org.briarproject.bramble.identity.IdentityModule; import org.briarproject.bramble.lifecycle.LifecycleModule; @@ -15,7 +15,7 @@ public interface BrambleCoreEagerSingletons { void inject(ContactModule.EagerSingletons init); - void inject(CryptoModule.EagerSingletons init); + void inject(CryptoExecutorModule.EagerSingletons init); void inject(DatabaseExecutorModule.EagerSingletons init); 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 365b50de9..771776c26 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/BrambleCoreModule.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/BrambleCoreModule.java @@ -2,6 +2,7 @@ package org.briarproject.bramble; import org.briarproject.bramble.client.ClientModule; import org.briarproject.bramble.contact.ContactModule; +import org.briarproject.bramble.crypto.CryptoExecutorModule; import org.briarproject.bramble.crypto.CryptoModule; import org.briarproject.bramble.data.DataModule; import org.briarproject.bramble.db.DatabaseExecutorModule; @@ -26,6 +27,7 @@ import dagger.Module; ClientModule.class, ContactModule.class, CryptoModule.class, + CryptoExecutorModule.class, DataModule.class, DatabaseModule.class, DatabaseExecutorModule.class, @@ -47,7 +49,7 @@ public class BrambleCoreModule { public static void initEagerSingletons(BrambleCoreEagerSingletons c) { c.inject(new ContactModule.EagerSingletons()); - c.inject(new CryptoModule.EagerSingletons()); + c.inject(new CryptoExecutorModule.EagerSingletons()); c.inject(new DatabaseExecutorModule.EagerSingletons()); c.inject(new IdentityModule.EagerSingletons()); c.inject(new LifecycleModule.EagerSingletons()); diff --git a/bramble-core/src/main/java/org/briarproject/bramble/crypto/CryptoExecutorModule.java b/bramble-core/src/main/java/org/briarproject/bramble/crypto/CryptoExecutorModule.java new file mode 100644 index 000000000..ab0e4114f --- /dev/null +++ b/bramble-core/src/main/java/org/briarproject/bramble/crypto/CryptoExecutorModule.java @@ -0,0 +1,67 @@ +package org.briarproject.bramble.crypto; + +import org.briarproject.bramble.TimeLoggingExecutor; +import org.briarproject.bramble.api.crypto.CryptoExecutor; +import org.briarproject.bramble.api.lifecycle.LifecycleManager; + +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.Executor; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.RejectedExecutionHandler; +import java.util.concurrent.ThreadPoolExecutor; + +import javax.inject.Inject; +import javax.inject.Singleton; + +import dagger.Module; +import dagger.Provides; + +import static java.util.concurrent.TimeUnit.SECONDS; + +@Module +public class CryptoExecutorModule { + + public static class EagerSingletons { + @Inject + @CryptoExecutor + ExecutorService cryptoExecutor; + } + + /** + * The maximum number of executor threads. + *

+ * The number of available processors can change during the lifetime of the + * JVM, so this is just a reasonable guess. + */ + private static final int MAX_EXECUTOR_THREADS = + Math.max(1, Runtime.getRuntime().availableProcessors() - 1); + + private final ExecutorService cryptoExecutor; + + public CryptoExecutorModule() { + // Use an unbounded queue + BlockingQueue queue = new LinkedBlockingQueue<>(); + // Discard tasks that are submitted during shutdown + RejectedExecutionHandler policy = + new ThreadPoolExecutor.DiscardPolicy(); + // Create a limited # of threads and keep them in the pool for 60 secs + cryptoExecutor = new TimeLoggingExecutor("CryptoExecutor", 0, + MAX_EXECUTOR_THREADS, 60, SECONDS, queue, policy); + } + + @Provides + @Singleton + @CryptoExecutor + ExecutorService provideCryptoExecutorService( + LifecycleManager lifecycleManager) { + lifecycleManager.registerForShutdown(cryptoExecutor); + return cryptoExecutor; + } + + @Provides + @CryptoExecutor + Executor provideCryptoExecutor() { + return cryptoExecutor; + } +} diff --git a/bramble-core/src/main/java/org/briarproject/bramble/crypto/CryptoModule.java b/bramble-core/src/main/java/org/briarproject/bramble/crypto/CryptoModule.java index 25d24995d..680391bd0 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/crypto/CryptoModule.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/crypto/CryptoModule.java @@ -1,64 +1,24 @@ package org.briarproject.bramble.crypto; -import org.briarproject.bramble.TimeLoggingExecutor; import org.briarproject.bramble.api.crypto.CryptoComponent; -import org.briarproject.bramble.api.crypto.CryptoExecutor; import org.briarproject.bramble.api.crypto.KeyAgreementCrypto; import org.briarproject.bramble.api.crypto.PasswordStrengthEstimator; import org.briarproject.bramble.api.crypto.StreamDecrypterFactory; import org.briarproject.bramble.api.crypto.StreamEncrypterFactory; import org.briarproject.bramble.api.crypto.TransportCrypto; -import org.briarproject.bramble.api.lifecycle.LifecycleManager; import org.briarproject.bramble.api.system.SecureRandomProvider; import java.security.SecureRandom; -import java.util.concurrent.BlockingQueue; -import java.util.concurrent.Executor; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.RejectedExecutionHandler; -import java.util.concurrent.ThreadPoolExecutor; -import javax.inject.Inject; import javax.inject.Provider; import javax.inject.Singleton; import dagger.Module; import dagger.Provides; -import static java.util.concurrent.TimeUnit.SECONDS; - @Module public class CryptoModule { - public static class EagerSingletons { - @Inject - @CryptoExecutor - ExecutorService cryptoExecutor; - } - - /** - * The maximum number of executor threads. - *

- * The number of available processors can change during the lifetime of the - * JVM, so this is just a reasonable guess. - */ - private static final int MAX_EXECUTOR_THREADS = - Math.max(1, Runtime.getRuntime().availableProcessors() - 1); - - private final ExecutorService cryptoExecutor; - - public CryptoModule() { - // Use an unbounded queue - BlockingQueue queue = new LinkedBlockingQueue<>(); - // Discard tasks that are submitted during shutdown - RejectedExecutionHandler policy = - new ThreadPoolExecutor.DiscardPolicy(); - // Create a limited # of threads and keep them in the pool for 60 secs - cryptoExecutor = new TimeLoggingExecutor("CryptoExecutor", 0, - MAX_EXECUTOR_THREADS, 60, SECONDS, queue, policy); - } - @Provides AuthenticatedCipher provideAuthenticatedCipher() { return new XSalsa20Poly1305AuthenticatedCipher(); @@ -103,21 +63,6 @@ public class CryptoModule { return keyAgreementCrypto; } - @Provides - @Singleton - @CryptoExecutor - ExecutorService getCryptoExecutorService( - LifecycleManager lifecycleManager) { - lifecycleManager.registerForShutdown(cryptoExecutor); - return cryptoExecutor; - } - - @Provides - @CryptoExecutor - Executor getCryptoExecutor() { - return cryptoExecutor; - } - @Provides SecureRandom getSecureRandom(CryptoComponent crypto) { return crypto.getSecureRandom(); diff --git a/bramble-core/src/test/java/org/briarproject/bramble/test/TestCryptoExecutorModule.java b/bramble-core/src/test/java/org/briarproject/bramble/test/TestCryptoExecutorModule.java new file mode 100644 index 000000000..3fabc08d5 --- /dev/null +++ b/bramble-core/src/test/java/org/briarproject/bramble/test/TestCryptoExecutorModule.java @@ -0,0 +1,21 @@ +package org.briarproject.bramble.test; + +import org.briarproject.bramble.api.crypto.CryptoExecutor; + +import java.util.concurrent.Executor; + +import javax.inject.Singleton; + +import dagger.Module; +import dagger.Provides; + +@Module +public class TestCryptoExecutorModule { + + @Provides + @Singleton + @CryptoExecutor + Executor provideCryptoExecutor() { + return new ImmediateExecutor(); + } +} diff --git a/briar-core/src/test/java/org/briarproject/briar/feed/FeedManagerIntegrationTest.java b/briar-core/src/test/java/org/briarproject/briar/feed/FeedManagerIntegrationTest.java index 2fc24aae5..ea8448ed4 100644 --- a/briar-core/src/test/java/org/briarproject/briar/feed/FeedManagerIntegrationTest.java +++ b/briar-core/src/test/java/org/briarproject/briar/feed/FeedManagerIntegrationTest.java @@ -2,7 +2,7 @@ package org.briarproject.briar.feed; import org.briarproject.bramble.api.lifecycle.LifecycleManager; import org.briarproject.bramble.contact.ContactModule; -import org.briarproject.bramble.crypto.CryptoModule; +import org.briarproject.bramble.crypto.CryptoExecutorModule; import org.briarproject.bramble.identity.IdentityModule; import org.briarproject.bramble.lifecycle.LifecycleModule; import org.briarproject.bramble.sync.SyncModule; @@ -113,10 +113,10 @@ public class FeedManagerIntegrationTest extends BriarTestCase { protected void injectEagerSingletons( FeedManagerIntegrationTestComponent component) { - component.inject(new FeedModule.EagerSingletons()); component.inject(new BlogModule.EagerSingletons()); component.inject(new ContactModule.EagerSingletons()); - component.inject(new CryptoModule.EagerSingletons()); + component.inject(new CryptoExecutorModule.EagerSingletons()); + component.inject(new FeedModule.EagerSingletons()); component.inject(new IdentityModule.EagerSingletons()); component.inject(new LifecycleModule.EagerSingletons()); component.inject(new SyncModule.EagerSingletons()); diff --git a/briar-core/src/test/java/org/briarproject/briar/feed/FeedManagerIntegrationTestComponent.java b/briar-core/src/test/java/org/briarproject/briar/feed/FeedManagerIntegrationTestComponent.java index 0a8fbfbe6..6de06bc28 100644 --- a/briar-core/src/test/java/org/briarproject/briar/feed/FeedManagerIntegrationTestComponent.java +++ b/briar-core/src/test/java/org/briarproject/briar/feed/FeedManagerIntegrationTestComponent.java @@ -3,6 +3,7 @@ package org.briarproject.briar.feed; import org.briarproject.bramble.api.lifecycle.LifecycleManager; import org.briarproject.bramble.client.ClientModule; import org.briarproject.bramble.contact.ContactModule; +import org.briarproject.bramble.crypto.CryptoExecutorModule; import org.briarproject.bramble.crypto.CryptoModule; import org.briarproject.bramble.data.DataModule; import org.briarproject.bramble.db.DatabaseModule; @@ -33,17 +34,18 @@ import dagger.Component; TestSecureRandomModule.class, TestSocksModule.class, TestDnsModule.class, - LifecycleModule.class, BriarClientModule.class, ClientModule.class, ContactModule.class, CryptoModule.class, + CryptoExecutorModule.class, BlogModule.class, FeedModule.class, DataModule.class, DatabaseModule.class, EventModule.class, IdentityModule.class, + LifecycleModule.class, SyncModule.class, SystemModule.class, TransportModule.class @@ -52,13 +54,13 @@ interface FeedManagerIntegrationTestComponent { void inject(FeedManagerIntegrationTest testCase); - void inject(FeedModule.EagerSingletons init); - void inject(BlogModule.EagerSingletons init); void inject(ContactModule.EagerSingletons init); - void inject(CryptoModule.EagerSingletons init); + void inject(CryptoExecutorModule.EagerSingletons init); + + void inject(FeedModule.EagerSingletons init); void inject(IdentityModule.EagerSingletons init); diff --git a/briar-core/src/test/java/org/briarproject/briar/introduction/IntroductionIntegrationTestComponent.java b/briar-core/src/test/java/org/briarproject/briar/introduction/IntroductionIntegrationTestComponent.java index 3a90d7d14..d3367296f 100644 --- a/briar-core/src/test/java/org/briarproject/briar/introduction/IntroductionIntegrationTestComponent.java +++ b/briar-core/src/test/java/org/briarproject/briar/introduction/IntroductionIntegrationTestComponent.java @@ -2,6 +2,7 @@ package org.briarproject.briar.introduction; import org.briarproject.bramble.client.ClientModule; import org.briarproject.bramble.contact.ContactModule; +import org.briarproject.bramble.crypto.CryptoExecutorModule; import org.briarproject.bramble.crypto.CryptoModule; import org.briarproject.bramble.data.DataModule; import org.briarproject.bramble.db.DatabaseModule; @@ -38,6 +39,7 @@ import dagger.Component; ClientModule.class, ContactModule.class, CryptoModule.class, + CryptoExecutorModule.class, DataModule.class, DatabaseModule.class, EventModule.class, diff --git a/briar-core/src/test/java/org/briarproject/briar/messaging/MessageSizeIntegrationTest.java b/briar-core/src/test/java/org/briarproject/briar/messaging/MessageSizeIntegrationTest.java index b56d42d7f..d2b19c89f 100644 --- a/briar-core/src/test/java/org/briarproject/briar/messaging/MessageSizeIntegrationTest.java +++ b/briar-core/src/test/java/org/briarproject/briar/messaging/MessageSizeIntegrationTest.java @@ -7,11 +7,17 @@ import org.briarproject.bramble.api.identity.AuthorFactory; import org.briarproject.bramble.api.identity.LocalAuthor; import org.briarproject.bramble.api.sync.GroupId; import org.briarproject.bramble.api.sync.MessageId; +import org.briarproject.bramble.contact.ContactModule; +import org.briarproject.bramble.crypto.CryptoExecutorModule; +import org.briarproject.bramble.identity.IdentityModule; +import org.briarproject.bramble.sync.SyncModule; import org.briarproject.bramble.system.SystemModule; +import org.briarproject.bramble.transport.TransportModule; import org.briarproject.briar.api.forum.ForumPost; import org.briarproject.briar.api.forum.ForumPostFactory; import org.briarproject.briar.api.messaging.PrivateMessage; import org.briarproject.briar.api.messaging.PrivateMessageFactory; +import org.briarproject.briar.forum.ForumModule; import org.briarproject.briar.test.BriarTestCase; import org.junit.Test; @@ -85,6 +91,13 @@ public class MessageSizeIntegrationTest extends BriarTestCase { private static void injectEagerSingletons( MessageSizeIntegrationTestComponent component) { + component.inject(new ContactModule.EagerSingletons()); + component.inject(new CryptoExecutorModule.EagerSingletons()); + component.inject(new ForumModule.EagerSingletons()); + component.inject(new IdentityModule.EagerSingletons()); + component.inject(new MessagingModule.EagerSingletons()); + component.inject(new SyncModule.EagerSingletons()); component.inject(new SystemModule.EagerSingletons()); + component.inject(new TransportModule.EagerSingletons()); } } diff --git a/briar-core/src/test/java/org/briarproject/briar/messaging/MessageSizeIntegrationTestComponent.java b/briar-core/src/test/java/org/briarproject/briar/messaging/MessageSizeIntegrationTestComponent.java index 42b27da6f..2ac7f469b 100644 --- a/briar-core/src/test/java/org/briarproject/briar/messaging/MessageSizeIntegrationTestComponent.java +++ b/briar-core/src/test/java/org/briarproject/briar/messaging/MessageSizeIntegrationTestComponent.java @@ -1,6 +1,8 @@ package org.briarproject.briar.messaging; import org.briarproject.bramble.client.ClientModule; +import org.briarproject.bramble.contact.ContactModule; +import org.briarproject.bramble.crypto.CryptoExecutorModule; import org.briarproject.bramble.crypto.CryptoModule; import org.briarproject.bramble.data.DataModule; import org.briarproject.bramble.db.DatabaseModule; @@ -10,7 +12,9 @@ import org.briarproject.bramble.sync.SyncModule; import org.briarproject.bramble.system.SystemModule; import org.briarproject.bramble.test.TestDatabaseModule; import org.briarproject.bramble.test.TestLifecycleModule; +import org.briarproject.bramble.test.TestPluginConfigModule; import org.briarproject.bramble.test.TestSecureRandomModule; +import org.briarproject.bramble.transport.TransportModule; import org.briarproject.briar.client.BriarClientModule; import org.briarproject.briar.forum.ForumModule; @@ -22,10 +26,13 @@ import dagger.Component; @Component(modules = { TestDatabaseModule.class, TestLifecycleModule.class, + TestPluginConfigModule.class, TestSecureRandomModule.class, BriarClientModule.class, ClientModule.class, + ContactModule.class, CryptoModule.class, + CryptoExecutorModule.class, DataModule.class, DatabaseModule.class, EventModule.class, @@ -33,11 +40,26 @@ import dagger.Component; IdentityModule.class, MessagingModule.class, SyncModule.class, - SystemModule.class + SystemModule.class, + TransportModule.class }) interface MessageSizeIntegrationTestComponent { void inject(MessageSizeIntegrationTest testCase); + void inject(ContactModule.EagerSingletons init); + + void inject(CryptoExecutorModule.EagerSingletons init); + + void inject(ForumModule.EagerSingletons init); + + void inject(IdentityModule.EagerSingletons init); + + void inject(MessagingModule.EagerSingletons init); + + void inject(SyncModule.EagerSingletons init); + void inject(SystemModule.EagerSingletons init); + + void inject(TransportModule.EagerSingletons init); } diff --git a/briar-core/src/test/java/org/briarproject/briar/messaging/SimplexMessagingIntegrationTest.java b/briar-core/src/test/java/org/briarproject/briar/messaging/SimplexMessagingIntegrationTest.java index 8967961ce..df9754d53 100644 --- a/briar-core/src/test/java/org/briarproject/briar/messaging/SimplexMessagingIntegrationTest.java +++ b/briar-core/src/test/java/org/briarproject/briar/messaging/SimplexMessagingIntegrationTest.java @@ -5,6 +5,7 @@ import org.briarproject.bramble.api.contact.ContactManager; import org.briarproject.bramble.api.crypto.SecretKey; import org.briarproject.bramble.api.event.Event; import org.briarproject.bramble.api.event.EventListener; +import org.briarproject.bramble.api.identity.Author; import org.briarproject.bramble.api.identity.IdentityManager; import org.briarproject.bramble.api.identity.LocalAuthor; import org.briarproject.bramble.api.lifecycle.LifecycleManager; @@ -12,17 +13,22 @@ import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.sync.GroupId; import org.briarproject.bramble.api.sync.SyncSession; import org.briarproject.bramble.api.sync.SyncSessionFactory; -import org.briarproject.bramble.api.sync.event.MessageAddedEvent; import org.briarproject.bramble.api.transport.KeyManager; import org.briarproject.bramble.api.transport.StreamContext; import org.briarproject.bramble.api.transport.StreamReaderFactory; import org.briarproject.bramble.api.transport.StreamWriterFactory; +import org.briarproject.bramble.contact.ContactModule; +import org.briarproject.bramble.identity.IdentityModule; +import org.briarproject.bramble.lifecycle.LifecycleModule; +import org.briarproject.bramble.sync.SyncModule; import org.briarproject.bramble.system.SystemModule; import org.briarproject.bramble.test.TestDatabaseModule; import org.briarproject.bramble.test.TestUtils; +import org.briarproject.bramble.transport.TransportModule; import org.briarproject.briar.api.messaging.MessagingManager; import org.briarproject.briar.api.messaging.PrivateMessage; import org.briarproject.briar.api.messaging.PrivateMessageFactory; +import org.briarproject.briar.api.messaging.event.PrivateMessageReceivedEvent; import org.briarproject.briar.test.BriarTestCase; import org.junit.After; import org.junit.Before; @@ -41,7 +47,6 @@ import static org.briarproject.bramble.test.TestUtils.getLocalAuthor; import static org.briarproject.bramble.test.TestUtils.getSecretKey; import static org.briarproject.bramble.test.TestUtils.getTestDirectory; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; @@ -71,103 +76,105 @@ public class SimplexMessagingIntegrationTest extends BriarTestCase { @Test public void testWriteAndRead() throws Exception { - read(write()); - } - - - private byte[] write() throws Exception { - // Instantiate Alice's services - LifecycleManager lifecycleManager = alice.getLifecycleManager(); - IdentityManager identityManager = alice.getIdentityManager(); - ContactManager contactManager = alice.getContactManager(); - MessagingManager messagingManager = alice.getMessagingManager(); - KeyManager keyManager = alice.getKeyManager(); - PrivateMessageFactory privateMessageFactory = - alice.getPrivateMessageFactory(); - StreamWriterFactory streamWriterFactory = - alice.getStreamWriterFactory(); - SyncSessionFactory syncSessionFactory = alice.getSyncSessionFactory(); - - // Start the lifecycle manager - lifecycleManager.startServices(null); - lifecycleManager.waitForStartup(); - // Add an identity for Alice - identityManager.registerLocalAuthor(aliceAuthor); - // Add Bob as a contact - ContactId contactId = contactManager.addContact(bobAuthor, - aliceAuthor.getId(), master, timestamp, true, true, true); - - // Send Bob a message - GroupId groupId = messagingManager.getConversationId(contactId); - String body = "Hi Bob!"; - PrivateMessage message = privateMessageFactory.createPrivateMessage( - groupId, timestamp, body); - messagingManager.addLocalMessage(message); - // Get a stream context - StreamContext ctx = keyManager.getStreamContext(contactId, - TRANSPORT_ID); - assertNotNull(ctx); - // Create a stream writer - ByteArrayOutputStream out = new ByteArrayOutputStream(); - OutputStream streamWriter = streamWriterFactory.createStreamWriter( - out, ctx); - // Create an outgoing sync session - SyncSession session = syncSessionFactory.createSimplexOutgoingSession( - contactId, MAX_LATENCY, streamWriter); - // Write whatever needs to be written - session.run(); - streamWriter.close(); - - // Clean up - lifecycleManager.stopServices(); - lifecycleManager.waitForShutdown(); - - // Return the contents of the stream - return out.toByteArray(); - } - - private void read(byte[] stream) throws Exception { - // Instantiate Bob's services - LifecycleManager lifecycleManager = bob.getLifecycleManager(); - IdentityManager identityManager = bob.getIdentityManager(); - ContactManager contactManager = bob.getContactManager(); - KeyManager keyManager = bob.getKeyManager(); - StreamReaderFactory streamReaderFactory = bob.getStreamReaderFactory(); - SyncSessionFactory syncSessionFactory = bob.getSyncSessionFactory(); - - // Start the lifecyle manager - lifecycleManager.startServices(null); - lifecycleManager.waitForStartup(); - // Add an identity for Bob - identityManager.registerLocalAuthor(bobAuthor); - // Add Alice as a contact - ContactId contactId = contactManager.addContact(aliceAuthor, - bobAuthor.getId(), master, timestamp, false, true, true); - // Set up an event listener - MessageListener listener = new MessageListener(); + // Set up the devices and get the contact IDs + ContactId bobId = setUp(alice, aliceAuthor, bobAuthor, true); + ContactId aliceId = setUp(bob, bobAuthor, aliceAuthor, false); + // Add a private message listener + PrivateMessageListener listener = new PrivateMessageListener(); bob.getEventBus().addListener(listener); + // Alice sends a private message to Bob + sendMessage(alice, bobId); + // Send three simplex streams to exchange client versions and the + // private message + read(bob, aliceId, write(alice, bobId)); + read(alice, bobId, write(bob, aliceId)); + read(bob, aliceId, write(alice, bobId)); + // Tear down the devices + tearDown(alice); + tearDown(bob); + // Bob should have received the private message + assertTrue(listener.messageAdded); + } + + private ContactId setUp(SimplexMessagingIntegrationTestComponent device, + LocalAuthor local, Author remote, boolean alice) throws Exception { + // Start the lifecycle manager + LifecycleManager lifecycleManager = device.getLifecycleManager(); + lifecycleManager.startServices(null); + lifecycleManager.waitForStartup(); + // Add an identity for the user + IdentityManager identityManager = device.getIdentityManager(); + identityManager.registerLocalAuthor(local); + // Add the other user as a contact + ContactManager contactManager = device.getContactManager(); + return contactManager.addContact(remote, local.getId(), master, + timestamp, alice, true, true); + } + + private void sendMessage(SimplexMessagingIntegrationTestComponent device, + ContactId contactId) throws Exception { + // Send Bob a message + MessagingManager messagingManager = device.getMessagingManager(); + GroupId groupId = messagingManager.getConversationId(contactId); + PrivateMessageFactory privateMessageFactory = + device.getPrivateMessageFactory(); + PrivateMessage message = privateMessageFactory.createPrivateMessage( + groupId, System.currentTimeMillis(), "Hi!"); + messagingManager.addLocalMessage(message); + } + + private void read(SimplexMessagingIntegrationTestComponent device, + ContactId contactId, byte[] stream) throws Exception { // Read and recognise the tag ByteArrayInputStream in = new ByteArrayInputStream(stream); byte[] tag = new byte[TAG_LENGTH]; int read = in.read(tag); assertEquals(tag.length, read); + KeyManager keyManager = device.getKeyManager(); StreamContext ctx = keyManager.getStreamContext(TRANSPORT_ID, tag); assertNotNull(ctx); // Create a stream reader + StreamReaderFactory streamReaderFactory = + device.getStreamReaderFactory(); InputStream streamReader = streamReaderFactory.createStreamReader( in, ctx); // Create an incoming sync session + SyncSessionFactory syncSessionFactory = device.getSyncSessionFactory(); SyncSession session = syncSessionFactory.createIncomingSession( contactId, streamReader); - // No messages should have been added yet - assertFalse(listener.messageAdded); // Read whatever needs to be read session.run(); streamReader.close(); - // The private message from Alice should have been added - assertTrue(listener.messageAdded); + } - // Clean up + private byte[] write(SimplexMessagingIntegrationTestComponent device, + ContactId contactId) throws Exception { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + // Get a stream context + KeyManager keyManager = device.getKeyManager(); + StreamContext ctx = keyManager.getStreamContext(contactId, + TRANSPORT_ID); + assertNotNull(ctx); + // Create a stream writer + StreamWriterFactory streamWriterFactory = + device.getStreamWriterFactory(); + OutputStream streamWriter = + streamWriterFactory.createStreamWriter(out, ctx); + // Create an outgoing sync session + SyncSessionFactory syncSessionFactory = device.getSyncSessionFactory(); + SyncSession session = syncSessionFactory.createSimplexOutgoingSession( + contactId, MAX_LATENCY, streamWriter); + // Write whatever needs to be written + session.run(); + streamWriter.close(); + // Return the contents of the stream + return out.toByteArray(); + } + + private void tearDown(SimplexMessagingIntegrationTestComponent device) + throws Exception { + // Stop the lifecycle manager + LifecycleManager lifecycleManager = device.getLifecycleManager(); lifecycleManager.stopServices(); lifecycleManager.waitForShutdown(); } @@ -179,18 +186,23 @@ public class SimplexMessagingIntegrationTest extends BriarTestCase { private static void injectEagerSingletons( SimplexMessagingIntegrationTestComponent component) { + component.inject(new ContactModule.EagerSingletons()); + component.inject(new IdentityModule.EagerSingletons()); + component.inject(new LifecycleModule.EagerSingletons()); component.inject(new MessagingModule.EagerSingletons()); + component.inject(new SyncModule.EagerSingletons()); component.inject(new SystemModule.EagerSingletons()); + component.inject(new TransportModule.EagerSingletons()); } @NotNullByDefault - private static class MessageListener implements EventListener { + private static class PrivateMessageListener implements EventListener { private volatile boolean messageAdded = false; @Override public void eventOccurred(Event e) { - if (e instanceof MessageAddedEvent) messageAdded = true; + if (e instanceof PrivateMessageReceivedEvent) messageAdded = true; } } } diff --git a/briar-core/src/test/java/org/briarproject/briar/messaging/SimplexMessagingIntegrationTestComponent.java b/briar-core/src/test/java/org/briarproject/briar/messaging/SimplexMessagingIntegrationTestComponent.java index d740859aa..7fc608a55 100644 --- a/briar-core/src/test/java/org/briarproject/briar/messaging/SimplexMessagingIntegrationTestComponent.java +++ b/briar-core/src/test/java/org/briarproject/briar/messaging/SimplexMessagingIntegrationTestComponent.java @@ -18,6 +18,7 @@ import org.briarproject.bramble.identity.IdentityModule; import org.briarproject.bramble.lifecycle.LifecycleModule; import org.briarproject.bramble.sync.SyncModule; import org.briarproject.bramble.system.SystemModule; +import org.briarproject.bramble.test.TestCryptoExecutorModule; import org.briarproject.bramble.test.TestDatabaseModule; import org.briarproject.bramble.test.TestPluginConfigModule; import org.briarproject.bramble.test.TestSecureRandomModule; @@ -32,6 +33,7 @@ import dagger.Component; @Singleton @Component(modules = { + TestCryptoExecutorModule.class, TestDatabaseModule.class, TestPluginConfigModule.class, TestSecureRandomModule.class, @@ -51,10 +53,20 @@ import dagger.Component; }) interface SimplexMessagingIntegrationTestComponent { + void inject(ContactModule.EagerSingletons init); + + void inject(IdentityModule.EagerSingletons init); + + void inject(LifecycleModule.EagerSingletons init); + void inject(MessagingModule.EagerSingletons init); + void inject(SyncModule.EagerSingletons init); + void inject(SystemModule.EagerSingletons init); + void inject(TransportModule.EagerSingletons init); + LifecycleManager getLifecycleManager(); IdentityManager getIdentityManager(); diff --git a/briar-core/src/test/java/org/briarproject/briar/test/BriarIntegrationTest.java b/briar-core/src/test/java/org/briarproject/briar/test/BriarIntegrationTest.java index bb955313b..18d00ee06 100644 --- a/briar-core/src/test/java/org/briarproject/briar/test/BriarIntegrationTest.java +++ b/briar-core/src/test/java/org/briarproject/briar/test/BriarIntegrationTest.java @@ -24,7 +24,7 @@ import org.briarproject.bramble.api.sync.SyncSessionFactory; import org.briarproject.bramble.api.sync.event.MessageStateChangedEvent; import org.briarproject.bramble.api.system.Clock; import org.briarproject.bramble.contact.ContactModule; -import org.briarproject.bramble.crypto.CryptoModule; +import org.briarproject.bramble.crypto.CryptoExecutorModule; import org.briarproject.bramble.identity.IdentityModule; import org.briarproject.bramble.lifecycle.LifecycleModule; import org.briarproject.bramble.properties.PropertiesModule; @@ -170,7 +170,7 @@ public abstract class BriarIntegrationTest Date: Wed, 18 Apr 2018 11:16:49 +0100 Subject: [PATCH 23/33] Merge registration methods for clients and hooks. --- .../api/sync/ClientVersioningManager.java | 14 ++++---------- .../bramble/properties/PropertiesModule.java | 4 +--- .../sync/ClientVersioningManagerImpl.java | 7 +------ .../briar/introduction/IntroductionModule.java | 4 +--- .../briar/messaging/MessagingModule.java | 4 +--- .../invitation/GroupInvitationModule.java | 9 ++------- .../briar/sharing/SharingModule.java | 18 ++++-------------- 7 files changed, 14 insertions(+), 46 deletions(-) diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/sync/ClientVersioningManager.java b/bramble-api/src/main/java/org/briarproject/bramble/api/sync/ClientVersioningManager.java index b8be969f4..f15528d5c 100644 --- a/bramble-api/src/main/java/org/briarproject/bramble/api/sync/ClientVersioningManager.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/sync/ClientVersioningManager.java @@ -22,17 +22,11 @@ public interface ClientVersioningManager { int MAJOR_VERSION = 0; /** - * Registers a client that will be advertised to contacts. This method - * should be called before {@link LifecycleManager#startServices(String)}. + * Registers a client that will be advertised to contacts. The hook will + * be called when the visibility of the client changes. This method should + * be called before {@link LifecycleManager#startServices(String)}. */ - void registerClient(ClientId clientId, int majorVersion, int minorVersion); - - /** - * Registers a hook that will be called when the visibility of the given - * client changes. This method should be called before - * {@link LifecycleManager#startServices(String)}. - */ - void registerClientVersioningHook(ClientId clientId, int majorVersion, + void registerClient(ClientId clientId, int majorVersion, int minorVersion, ClientVersioningHook hook); /** 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 d2d1b6324..c6d2dbaf9 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 @@ -53,9 +53,7 @@ public class PropertiesModule { transportPropertyManager); contactManager.registerContactHook(transportPropertyManager); clientVersioningManager.registerClient(CLIENT_ID, MAJOR_VERSION, - MINOR_VERSION); - clientVersioningManager.registerClientVersioningHook(CLIENT_ID, - MAJOR_VERSION, transportPropertyManager); + MINOR_VERSION, transportPropertyManager); return transportPropertyManager; } } diff --git a/bramble-core/src/main/java/org/briarproject/bramble/sync/ClientVersioningManagerImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/sync/ClientVersioningManagerImpl.java index 653b72af5..6c9191f29 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/sync/ClientVersioningManagerImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/sync/ClientVersioningManagerImpl.java @@ -80,14 +80,9 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, Client, @Override public void registerClient(ClientId clientId, int majorVersion, - int minorVersion) { + int minorVersion, ClientVersioningHook hook) { clients.add(new ClientMinorVersion(clientId, majorVersion, minorVersion)); - } - - @Override - public void registerClientVersioningHook(ClientId clientId, - int majorVersion, ClientVersioningHook hook) { hooks.put(new ClientVersion(clientId, majorVersion), hook); } diff --git a/briar-core/src/main/java/org/briarproject/briar/introduction/IntroductionModule.java b/briar-core/src/main/java/org/briarproject/briar/introduction/IntroductionModule.java index 17d08cd18..e959f4ca5 100644 --- a/briar-core/src/main/java/org/briarproject/briar/introduction/IntroductionModule.java +++ b/briar-core/src/main/java/org/briarproject/briar/introduction/IntroductionModule.java @@ -57,9 +57,7 @@ public class IntroductionModule { MAJOR_VERSION, introductionManager); conversationManager.registerConversationClient(introductionManager); clientVersioningManager.registerClient(CLIENT_ID, MAJOR_VERSION, - MINOR_VERSION); - clientVersioningManager.registerClientVersioningHook(CLIENT_ID, - MAJOR_VERSION, introductionManager); + MINOR_VERSION, introductionManager); return introductionManager; } diff --git a/briar-core/src/main/java/org/briarproject/briar/messaging/MessagingModule.java b/briar-core/src/main/java/org/briarproject/briar/messaging/MessagingModule.java index 8363ef393..80ba2578a 100644 --- a/briar-core/src/main/java/org/briarproject/briar/messaging/MessagingModule.java +++ b/briar-core/src/main/java/org/briarproject/briar/messaging/MessagingModule.java @@ -64,9 +64,7 @@ public class MessagingModule { messagingManager); conversationManager.registerConversationClient(messagingManager); clientVersioningManager.registerClient(CLIENT_ID, MAJOR_VERSION, - MINOR_VERSION); - clientVersioningManager.registerClientVersioningHook(CLIENT_ID, - MAJOR_VERSION, messagingManager); + MINOR_VERSION, messagingManager); return messagingManager; } diff --git a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationModule.java b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationModule.java index 03f0ed678..1ae6ceb74 100644 --- a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationModule.java +++ b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationModule.java @@ -49,17 +49,12 @@ public class GroupInvitationModule { privateGroupManager.registerPrivateGroupHook(groupInvitationManager); conversationManager.registerConversationClient(groupInvitationManager); clientVersioningManager.registerClient(CLIENT_ID, MAJOR_VERSION, - MINOR_VERSION); - clientVersioningManager.registerClientVersioningHook(CLIENT_ID, - MAJOR_VERSION, groupInvitationManager); + MINOR_VERSION, groupInvitationManager); // The group invitation manager handles client visibility changes for // the private group manager clientVersioningManager.registerClient(PrivateGroupManager.CLIENT_ID, PrivateGroupManager.MAJOR_VERSION, - PrivateGroupManager.MINOR_VERSION); - clientVersioningManager.registerClientVersioningHook( - PrivateGroupManager.CLIENT_ID, - PrivateGroupManager.MAJOR_VERSION, + PrivateGroupManager.MINOR_VERSION, groupInvitationManager.getPrivateGroupClientVersioningHook()); return groupInvitationManager; } diff --git a/briar-core/src/main/java/org/briarproject/briar/sharing/SharingModule.java b/briar-core/src/main/java/org/briarproject/briar/sharing/SharingModule.java index b58bc246a..296511ec3 100644 --- a/briar-core/src/main/java/org/briarproject/briar/sharing/SharingModule.java +++ b/briar-core/src/main/java/org/briarproject/briar/sharing/SharingModule.java @@ -85,16 +85,11 @@ public class SharingModule { blogManager.registerRemoveBlogHook(blogSharingManager); clientVersioningManager.registerClient(BlogSharingManager.CLIENT_ID, BlogSharingManager.MAJOR_VERSION, - BlogSharingManager.MINOR_VERSION); - clientVersioningManager.registerClientVersioningHook( - BlogSharingManager.CLIENT_ID, BlogSharingManager.MAJOR_VERSION, - blogSharingManager); + BlogSharingManager.MINOR_VERSION, blogSharingManager); // The blog sharing manager handles client visibility changes for the // blog manager clientVersioningManager.registerClient(BlogManager.CLIENT_ID, - BlogManager.MAJOR_VERSION, BlogManager.MINOR_VERSION); - clientVersioningManager.registerClientVersioningHook( - BlogManager.CLIENT_ID, BlogManager.MAJOR_VERSION, + BlogManager.MAJOR_VERSION, BlogManager.MINOR_VERSION, blogSharingManager.getShareableClientVersioningHook()); return blogSharingManager; } @@ -149,16 +144,11 @@ public class SharingModule { forumManager.registerRemoveForumHook(forumSharingManager); clientVersioningManager.registerClient(ForumSharingManager.CLIENT_ID, ForumSharingManager.MAJOR_VERSION, - ForumSharingManager.MINOR_VERSION); - clientVersioningManager.registerClientVersioningHook( - ForumSharingManager.CLIENT_ID, - ForumSharingManager.MAJOR_VERSION, forumSharingManager); + ForumSharingManager.MINOR_VERSION, forumSharingManager); // The forum sharing manager handles client visibility changes for the // forum manager clientVersioningManager.registerClient(ForumManager.CLIENT_ID, - ForumManager.MAJOR_VERSION, ForumManager.MINOR_VERSION); - clientVersioningManager.registerClientVersioningHook( - ForumManager.CLIENT_ID, ForumManager.MAJOR_VERSION, + ForumManager.MAJOR_VERSION, ForumManager.MINOR_VERSION, forumSharingManager.getShareableClientVersioningHook()); return forumSharingManager; } From 522cba6ac3f8b2b1fe608fe95b223a32dc543aea Mon Sep 17 00:00:00 2001 From: akwizgran Date: Wed, 18 Apr 2018 11:32:39 +0100 Subject: [PATCH 24/33] Rename utility classes, add comment. --- ...ntVersion.java => ClientMajorVersion.java} | 10 +- .../sync/ClientVersioningManagerImpl.java | 170 +++++++++--------- .../bramble/sync/ValidationManagerImpl.java | 14 +- 3 files changed, 98 insertions(+), 96 deletions(-) rename bramble-core/src/main/java/org/briarproject/bramble/sync/{ClientVersion.java => ClientMajorVersion.java} (73%) diff --git a/bramble-core/src/main/java/org/briarproject/bramble/sync/ClientVersion.java b/bramble-core/src/main/java/org/briarproject/bramble/sync/ClientMajorVersion.java similarity index 73% rename from bramble-core/src/main/java/org/briarproject/bramble/sync/ClientVersion.java rename to bramble-core/src/main/java/org/briarproject/bramble/sync/ClientMajorVersion.java index bd2d85b03..dfce29807 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/sync/ClientVersion.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/sync/ClientMajorVersion.java @@ -7,20 +7,20 @@ import javax.annotation.concurrent.Immutable; @Immutable @NotNullByDefault -class ClientVersion implements Comparable { +class ClientMajorVersion implements Comparable { final ClientId clientId; final int majorVersion; - ClientVersion(ClientId clientId, int majorVersion) { + ClientMajorVersion(ClientId clientId, int majorVersion) { this.clientId = clientId; this.majorVersion = majorVersion; } @Override public boolean equals(Object o) { - if (o instanceof ClientVersion) { - ClientVersion cv = (ClientVersion) o; + if (o instanceof ClientMajorVersion) { + ClientMajorVersion cv = (ClientMajorVersion) o; return clientId.equals(cv.clientId) && majorVersion == cv.majorVersion; } @@ -33,7 +33,7 @@ class ClientVersion implements Comparable { } @Override - public int compareTo(ClientVersion cv) { + public int compareTo(ClientMajorVersion cv) { int compare = clientId.compareTo(cv.clientId); if (compare != 0) return compare; return majorVersion - cv.majorVersion; diff --git a/bramble-core/src/main/java/org/briarproject/bramble/sync/ClientVersioningManagerImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/sync/ClientVersioningManagerImpl.java index 6c9191f29..6f74036d8 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/sync/ClientVersioningManagerImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/sync/ClientVersioningManagerImpl.java @@ -61,15 +61,13 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, Client, private final Clock clock; private final Group localGroup; - private final List clients = - new CopyOnWriteArrayList<>(); - private final Map hooks = + private final List clients = new CopyOnWriteArrayList<>(); + private final Map hooks = new ConcurrentHashMap<>(); @Inject - ClientVersioningManagerImpl(DatabaseComponent db, - ClientHelper clientHelper, ContactGroupFactory contactGroupFactory, - Clock clock) { + ClientVersioningManagerImpl(DatabaseComponent db, ClientHelper clientHelper, + ContactGroupFactory contactGroupFactory, Clock clock) { this.db = db; this.clientHelper = clientHelper; this.contactGroupFactory = contactGroupFactory; @@ -81,15 +79,14 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, Client, @Override public void registerClient(ClientId clientId, int majorVersion, int minorVersion, ClientVersioningHook hook) { - clients.add(new ClientMinorVersion(clientId, majorVersion, - minorVersion)); - hooks.put(new ClientVersion(clientId, majorVersion), hook); + ClientMajorVersion cv = new ClientMajorVersion(clientId, majorVersion); + clients.add(new ClientVersion(cv, minorVersion)); + hooks.put(cv, hook); } @Override - public Visibility getClientVisibility(Transaction txn, - ContactId contactId, ClientId clientId, int majorVersion) - throws DbException { + public Visibility getClientVisibility(Transaction txn, ContactId contactId, + ClientId clientId, int majorVersion) throws DbException { try { Contact contact = db.getContact(txn, contactId); Group g = getContactGroup(contact); @@ -101,9 +98,10 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, Client, if (latest.remote == null) return INVISIBLE; Update localUpdate = loadUpdate(txn, latest.local.messageId); Update remoteUpdate = loadUpdate(txn, latest.remote.messageId); - Map visibilities = + Map visibilities = getVisibilities(localUpdate.states, remoteUpdate.states); - ClientVersion cv = new ClientVersion(clientId, majorVersion); + ClientMajorVersion cv = + new ClientMajorVersion(clientId, majorVersion); Visibility v = visibilities.get(cv); return v == null ? INVISIBLE : v; } catch (FormatException e) { @@ -121,7 +119,7 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, Client, @Override public void startService() throws ServiceException { - List versions = new ArrayList<>(clients); + List versions = new ArrayList<>(clients); Collections.sort(versions); try { Transaction txn = db.startTransaction(false); @@ -158,7 +156,7 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, Client, throw new AssertionError(e); } // Create and store the first local update - List versions = new ArrayList<>(clients); + List versions = new ArrayList<>(clients); Collections.sort(versions); storeFirstUpdate(txn, g.getId(), versions); } @@ -213,9 +211,9 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, Client, oldLocalUpdateVersion + 1); } // Calculate the old and new client visibilities - Map before = + Map before = getVisibilities(oldLocalStates, oldRemoteStates); - Map after = + Map after = getVisibilities(newLocalStates, newRemoteStates); // Call hooks for any visibilities that have changed Contact c = getContact(txn, m.getGroupId()); @@ -227,7 +225,7 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, Client, } private void storeClientVersions(Transaction txn, - List versions) throws DbException { + List versions) throws DbException { long now = clock.currentTimeMillis(); BdfList body = encodeClientVersions(versions); try { @@ -239,34 +237,37 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, Client, } } - private BdfList encodeClientVersions(List versions) { + private BdfList encodeClientVersions(List versions) { BdfList encoded = new BdfList(); - for (ClientMinorVersion cm : versions) - encoded.add(encodeClientVersion(cm)); + for (ClientVersion cv : versions) encoded.add(encodeClientVersion(cv)); return encoded; } - private BdfList encodeClientVersion(ClientMinorVersion cm) { - return BdfList.of(cm.version.clientId.getString(), - cm.version.majorVersion, cm.minorVersion); + private BdfList encodeClientVersion(ClientVersion cv) { + return BdfList.of(cv.majorVersion.clientId.getString(), + cv.majorVersion.majorVersion, cv.minorVersion); } + /** + * Stores the local client versions and returns true if an update needs to + * be sent to contacts. + */ private boolean updateClientVersions(Transaction txn, - List newVersions) throws DbException { + List newVersions) throws DbException { Collection ids = db.getMessageIds(txn, localGroup.getId()); if (ids.isEmpty()) { storeClientVersions(txn, newVersions); return true; } MessageId m = ids.iterator().next(); - List oldVersions = loadClientVersions(txn, m); + List oldVersions = loadClientVersions(txn, m); if (oldVersions.equals(newVersions)) return false; db.removeMessage(txn, m); storeClientVersions(txn, newVersions); return true; } - private List loadClientVersions(Transaction txn, + private List loadClientVersions(Transaction txn, MessageId m) throws DbException { try { BdfList body = clientHelper.getMessageAsList(txn, m); @@ -277,23 +278,23 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, Client, } } - private List parseClientVersions(BdfList body) + private List parseClientVersions(BdfList body) throws FormatException { int size = body.size(); - List parsed = new ArrayList<>(size); + List parsed = new ArrayList<>(size); for (int i = 0; i < size; i++) { BdfList cv = body.getList(i); ClientId clientId = new ClientId(cv.getString(0)); int majorVersion = cv.getLong(1).intValue(); int minorVersion = cv.getLong(2).intValue(); - parsed.add(new ClientMinorVersion(clientId, majorVersion, + parsed.add(new ClientVersion(clientId, majorVersion, minorVersion)); } return parsed; } private void clientVersionsUpdated(Transaction txn, Contact c, - List versions) throws DbException { + List versions) throws DbException { try { // Find the latest local and remote updates Group g = getContactGroup(c); @@ -316,9 +317,9 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, Client, if (latest.remote == null) remoteStates = emptyList(); else remoteStates = loadUpdate(txn, latest.remote.messageId).states; // Calculate the old and new client visibilities - Map before = + Map before = getVisibilities(oldLocalStates, remoteStates); - Map after = + Map after = getVisibilities(newLocalStates, remoteStates); // Call hooks for any visibilities that have changed callVisibilityHooks(txn, c, before, after); @@ -390,14 +391,14 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, Client, } private List updateStatesFromLocalVersions( - List oldStates, List newVersions) { - Map oldMap = new HashMap<>(); - for (ClientState cs : oldStates) oldMap.put(cs.version, cs); + List oldStates, List newVersions) { + Map oldMap = new HashMap<>(); + for (ClientState cs : oldStates) oldMap.put(cs.majorVersion, cs); List newStates = new ArrayList<>(newVersions.size()); - for (ClientMinorVersion newVersion : newVersions) { - ClientState oldState = oldMap.get(newVersion.version); + for (ClientVersion newVersion : newVersions) { + ClientState oldState = oldMap.get(newVersion.majorVersion); boolean active = oldState != null && oldState.active; - newStates.add(new ClientState(newVersion.version, + newStates.add(new ClientState(newVersion.majorVersion, newVersion.minorVersion, active)); } return newStates; @@ -425,32 +426,31 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, Client, } private BdfList encodeClientState(ClientState cs) { - return BdfList.of(cs.version.clientId.getString(), - cs.version.majorVersion, cs.minorVersion, cs.active); + return BdfList.of(cs.majorVersion.clientId.getString(), + cs.majorVersion.majorVersion, cs.minorVersion, cs.active); } - private Map getVisibilities( + private Map getVisibilities( List localStates, List remoteStates) { - Map remoteMap = new HashMap<>(); - for (ClientState remote : remoteStates) - remoteMap.put(remote.version, remote); - Map visibilities = new HashMap<>(); + Map remoteMap = new HashMap<>(); + for (ClientState cs : remoteStates) remoteMap.put(cs.majorVersion, cs); + Map visibilities = new HashMap<>(); for (ClientState local : localStates) { - ClientState remote = remoteMap.get(local.version); - if (remote == null) visibilities.put(local.version, INVISIBLE); - else if (remote.active) visibilities.put(local.version, SHARED); - else visibilities.put(local.version, VISIBLE); + ClientState remote = remoteMap.get(local.majorVersion); + if (remote == null) visibilities.put(local.majorVersion, INVISIBLE); + else if (remote.active) visibilities.put(local.majorVersion, SHARED); + else visibilities.put(local.majorVersion, VISIBLE); } return visibilities; } private void callVisibilityHooks(Transaction txn, Contact c, - Map before, - Map after) throws DbException { - Set keys = new TreeSet<>(); + Map before, + Map after) throws DbException { + Set keys = new TreeSet<>(); keys.addAll(before.keySet()); keys.addAll(after.keySet()); - for (ClientVersion cv : keys) { + for (ClientMajorVersion cv : keys) { Visibility vBefore = before.get(cv), vAfter = after.get(cv); if (vAfter == null) { callVisibilityHook(txn, cv, c, INVISIBLE); @@ -460,17 +460,19 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, Client, } } - private void callVisibilityHook(Transaction txn, ClientVersion cv, + private void callVisibilityHook(Transaction txn, ClientMajorVersion cv, Contact c, Visibility v) throws DbException { ClientVersioningHook hook = hooks.get(cv); if (hook != null) hook.onClientVisibilityChanging(txn, c, v); } private void storeFirstUpdate(Transaction txn, GroupId g, - List versions) throws DbException { + List versions) throws DbException { List states = new ArrayList<>(versions.size()); - for (ClientMinorVersion cm : versions) - states.add(new ClientState(cm.version, cm.minorVersion, false)); + for (ClientVersion cv : versions) { + states.add(new ClientState(cv.majorVersion, cv.minorVersion, + false)); + } storeUpdate(txn, g, states, 1); } @@ -487,13 +489,13 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, Client, private List updateStatesFromRemoteStates( List oldLocalStates, List remoteStates) { - Set remoteSet = new HashSet<>(); - for (ClientState remote : remoteStates) remoteSet.add(remote.version); + Set remoteSet = new HashSet<>(); + for (ClientState cs : remoteStates) remoteSet.add(cs.majorVersion); List newLocalStates = new ArrayList<>(oldLocalStates.size()); for (ClientState oldState : oldLocalStates) { - boolean active = remoteSet.contains(oldState.version); - newLocalStates.add(new ClientState(oldState.version, + boolean active = remoteSet.contains(oldState.majorVersion); + newLocalStates.add(new ClientState(oldState.majorVersion, oldState.minorVersion, active)); } return newLocalStates; @@ -533,61 +535,61 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, Client, } } - private static class ClientMinorVersion - implements Comparable { + private static class ClientVersion implements Comparable { - private final ClientVersion version; + private final ClientMajorVersion majorVersion; private final int minorVersion; - private ClientMinorVersion(ClientVersion version, int minorVersion) { - this.version = version; + private ClientVersion(ClientMajorVersion majorVersion, + int minorVersion) { + this.majorVersion = majorVersion; this.minorVersion = minorVersion; } - private ClientMinorVersion(ClientId clientId, int majorVersion, + private ClientVersion(ClientId clientId, int majorVersion, int minorVersion) { - this(new ClientVersion(clientId, majorVersion), minorVersion); + this(new ClientMajorVersion(clientId, majorVersion), minorVersion); } @Override public boolean equals(Object o) { - if (o instanceof ClientMinorVersion) { - ClientMinorVersion cm = (ClientMinorVersion) o; - return version.equals(cm.version) - && minorVersion == cm.minorVersion; + if (o instanceof ClientVersion) { + ClientVersion cv = (ClientVersion) o; + return majorVersion.equals(cv.majorVersion) + && minorVersion == cv.minorVersion; } return false; } @Override public int hashCode() { - return version.hashCode(); + return majorVersion.hashCode(); } @Override - public int compareTo(ClientMinorVersion cm) { - int compare = version.compareTo(cm.version); + public int compareTo(ClientVersion cv) { + int compare = majorVersion.compareTo(cv.majorVersion); if (compare != 0) return compare; - return minorVersion - cm.minorVersion; + return minorVersion - cv.minorVersion; } } private static class ClientState { - private final ClientVersion version; + private final ClientMajorVersion majorVersion; private final int minorVersion; private final boolean active; - private ClientState(ClientVersion version, int minorVersion, + private ClientState(ClientMajorVersion majorVersion, int minorVersion, boolean active) { - this.version = version; + this.majorVersion = majorVersion; this.minorVersion = minorVersion; this.active = active; } private ClientState(ClientId clientId, int majorVersion, int minorVersion, boolean active) { - this(new ClientVersion(clientId, majorVersion), minorVersion, + this(new ClientMajorVersion(clientId, majorVersion), minorVersion, active); } @@ -595,7 +597,7 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, Client, public boolean equals(Object o) { if (o instanceof ClientState) { ClientState cs = (ClientState) o; - return version.equals(cs.version) + return majorVersion.equals(cs.majorVersion) && minorVersion == cs.minorVersion && active == cs.active; } @@ -604,7 +606,7 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, Client, @Override public int hashCode() { - return version.hashCode(); + return majorVersion.hashCode(); } } } diff --git a/bramble-core/src/main/java/org/briarproject/bramble/sync/ValidationManagerImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/sync/ValidationManagerImpl.java index f6f977b73..9565e889f 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/sync/ValidationManagerImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/sync/ValidationManagerImpl.java @@ -51,8 +51,8 @@ class ValidationManagerImpl implements ValidationManager, Service, private final DatabaseComponent db; private final Executor dbExecutor, validationExecutor; private final MessageFactory messageFactory; - private final Map validators; - private final Map hooks; + private final Map validators; + private final Map hooks; private final AtomicBoolean used = new AtomicBoolean(false); @Inject @@ -83,13 +83,13 @@ class ValidationManagerImpl implements ValidationManager, Service, @Override public void registerMessageValidator(ClientId c, int majorVersion, MessageValidator v) { - validators.put(new ClientVersion(c, majorVersion), v); + validators.put(new ClientMajorVersion(c, majorVersion), v); } @Override public void registerIncomingMessageHook(ClientId c, int majorVersion, IncomingMessageHook hook) { - hooks.put(new ClientVersion(c, majorVersion), hook); + hooks.put(new ClientMajorVersion(c, majorVersion), hook); } private void validateOutstandingMessagesAsync() { @@ -240,8 +240,8 @@ class ValidationManagerImpl implements ValidationManager, Service, @ValidationExecutor private void validateMessage(Message m, Group g) { - ClientVersion cv = - new ClientVersion(g.getClientId(), g.getMajorVersion()); + ClientMajorVersion cv = + new ClientMajorVersion(g.getClientId(), g.getMajorVersion()); MessageValidator v = validators.get(cv); if (v == null) { if (LOG.isLoggable(WARNING)) LOG.warning("No validator for " + cv); @@ -334,7 +334,7 @@ class ValidationManagerImpl implements ValidationManager, Service, ClientId c, int majorVersion, Metadata meta) throws DbException { // Deliver the message to the client if it's registered a hook boolean shareMsg = false; - ClientVersion cv = new ClientVersion(c, majorVersion); + ClientMajorVersion cv = new ClientMajorVersion(c, majorVersion); IncomingMessageHook hook = hooks.get(cv); if (hook != null) { try { From c5efb6e16d752a17f9ff78b98a483c35dd01f1bc Mon Sep 17 00:00:00 2001 From: akwizgran Date: Tue, 24 Apr 2018 11:27:43 +0100 Subject: [PATCH 25/33] Move versioning client to its own package. --- .../api/versioning}/ClientMajorVersion.java | 18 ++++-- .../ClientVersioningManager.java | 3 +- .../bramble/BrambleCoreEagerSingletons.java | 3 + .../bramble/BrambleCoreModule.java | 5 +- .../bramble/properties/PropertiesModule.java | 2 +- .../TransportPropertyManagerImpl.java | 4 +- .../briarproject/bramble/sync/SyncModule.java | 37 ------------ .../bramble/sync/ValidationManagerImpl.java | 1 + .../ClientVersioningConstants.java | 2 +- .../ClientVersioningManagerImpl.java | 19 ++++--- .../ClientVersioningValidator.java | 6 +- .../bramble/versioning/VersioningModule.java | 56 +++++++++++++++++++ .../TransportPropertyManagerImplTest.java | 2 +- .../introduction/IntroductionManagerImpl.java | 4 +- .../introduction/IntroductionModule.java | 2 +- .../briar/messaging/MessagingManagerImpl.java | 4 +- .../briar/messaging/MessagingModule.java | 2 +- .../invitation/AbstractProtocolEngine.java | 2 +- .../invitation/CreatorProtocolEngine.java | 2 +- .../GroupInvitationManagerImpl.java | 4 +- .../invitation/GroupInvitationModule.java | 2 +- .../invitation/InviteeProtocolEngine.java | 2 +- .../invitation/PeerProtocolEngine.java | 2 +- .../invitation/ProtocolEngineFactoryImpl.java | 2 +- .../briar/sharing/BlogProtocolEngineImpl.java | 2 +- .../briar/sharing/BlogSharingManagerImpl.java | 2 +- .../sharing/ForumProtocolEngineImpl.java | 2 +- .../sharing/ForumSharingManagerImpl.java | 2 +- .../briar/sharing/ProtocolEngineImpl.java | 2 +- .../briar/sharing/SharingManagerImpl.java | 4 +- .../briar/sharing/SharingModule.java | 2 +- .../feed/FeedManagerIntegrationTest.java | 2 + .../FeedManagerIntegrationTestComponent.java | 6 +- .../IntroductionIntegrationTestComponent.java | 4 +- .../messaging/MessageSizeIntegrationTest.java | 2 + .../MessageSizeIntegrationTestComponent.java | 6 +- .../SimplexMessagingIntegrationTest.java | 2 + ...plexMessagingIntegrationTestComponent.java | 6 +- .../AbstractProtocolEngineTest.java | 2 +- .../GroupInvitationManagerImplTest.java | 2 +- .../sharing/BlogSharingManagerImplTest.java | 2 +- .../briar/test/BriarIntegrationTest.java | 2 + .../test/BriarIntegrationTestComponent.java | 6 +- 43 files changed, 153 insertions(+), 91 deletions(-) rename {bramble-core/src/main/java/org/briarproject/bramble/sync => bramble-api/src/main/java/org/briarproject/bramble/api/versioning}/ClientMajorVersion.java (67%) rename bramble-api/src/main/java/org/briarproject/bramble/api/{sync => versioning}/ClientVersioningManager.java (93%) rename bramble-core/src/main/java/org/briarproject/bramble/{sync => versioning}/ClientVersioningConstants.java (80%) rename bramble-core/src/main/java/org/briarproject/bramble/{sync => versioning}/ClientVersioningManagerImpl.java (96%) rename bramble-core/src/main/java/org/briarproject/bramble/{sync => versioning}/ClientVersioningValidator.java (90%) create mode 100644 bramble-core/src/main/java/org/briarproject/bramble/versioning/VersioningModule.java diff --git a/bramble-core/src/main/java/org/briarproject/bramble/sync/ClientMajorVersion.java b/bramble-api/src/main/java/org/briarproject/bramble/api/versioning/ClientMajorVersion.java similarity index 67% rename from bramble-core/src/main/java/org/briarproject/bramble/sync/ClientMajorVersion.java rename to bramble-api/src/main/java/org/briarproject/bramble/api/versioning/ClientMajorVersion.java index dfce29807..d57eb987e 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/sync/ClientMajorVersion.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/versioning/ClientMajorVersion.java @@ -1,4 +1,4 @@ -package org.briarproject.bramble.sync; +package org.briarproject.bramble.api.versioning; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.sync.ClientId; @@ -7,16 +7,24 @@ import javax.annotation.concurrent.Immutable; @Immutable @NotNullByDefault -class ClientMajorVersion implements Comparable { +public class ClientMajorVersion implements Comparable { - final ClientId clientId; - final int majorVersion; + private final ClientId clientId; + private final int majorVersion; - ClientMajorVersion(ClientId clientId, int majorVersion) { + public ClientMajorVersion(ClientId clientId, int majorVersion) { this.clientId = clientId; this.majorVersion = majorVersion; } + public ClientId getClientId() { + return clientId; + } + + public int getMajorVersion() { + return majorVersion; + } + @Override public boolean equals(Object o) { if (o instanceof ClientMajorVersion) { diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/sync/ClientVersioningManager.java b/bramble-api/src/main/java/org/briarproject/bramble/api/versioning/ClientVersioningManager.java similarity index 93% rename from bramble-api/src/main/java/org/briarproject/bramble/api/sync/ClientVersioningManager.java rename to bramble-api/src/main/java/org/briarproject/bramble/api/versioning/ClientVersioningManager.java index f15528d5c..0cb2fc478 100644 --- a/bramble-api/src/main/java/org/briarproject/bramble/api/sync/ClientVersioningManager.java +++ b/bramble-api/src/main/java/org/briarproject/bramble/api/versioning/ClientVersioningManager.java @@ -1,4 +1,4 @@ -package org.briarproject.bramble.api.sync; +package org.briarproject.bramble.api.versioning; import org.briarproject.bramble.api.contact.Contact; import org.briarproject.bramble.api.contact.ContactId; @@ -6,6 +6,7 @@ import org.briarproject.bramble.api.db.DbException; import org.briarproject.bramble.api.db.Transaction; import org.briarproject.bramble.api.lifecycle.LifecycleManager; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; +import org.briarproject.bramble.api.sync.ClientId; import org.briarproject.bramble.api.sync.Group.Visibility; @NotNullByDefault diff --git a/bramble-core/src/main/java/org/briarproject/bramble/BrambleCoreEagerSingletons.java b/bramble-core/src/main/java/org/briarproject/bramble/BrambleCoreEagerSingletons.java index b57869fb1..367e7785f 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/BrambleCoreEagerSingletons.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/BrambleCoreEagerSingletons.java @@ -10,6 +10,7 @@ import org.briarproject.bramble.properties.PropertiesModule; import org.briarproject.bramble.sync.SyncModule; import org.briarproject.bramble.system.SystemModule; import org.briarproject.bramble.transport.TransportModule; +import org.briarproject.bramble.versioning.VersioningModule; public interface BrambleCoreEagerSingletons { @@ -32,4 +33,6 @@ public interface BrambleCoreEagerSingletons { void inject(SystemModule.EagerSingletons init); void inject(TransportModule.EagerSingletons init); + + void inject(VersioningModule.EagerSingletons init); } 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 771776c26..b92329b18 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/BrambleCoreModule.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/BrambleCoreModule.java @@ -20,6 +20,7 @@ import org.briarproject.bramble.socks.SocksModule; import org.briarproject.bramble.sync.SyncModule; import org.briarproject.bramble.system.SystemModule; import org.briarproject.bramble.transport.TransportModule; +import org.briarproject.bramble.versioning.VersioningModule; import dagger.Module; @@ -43,7 +44,8 @@ import dagger.Module; SocksModule.class, SyncModule.class, SystemModule.class, - TransportModule.class + TransportModule.class, + VersioningModule.class }) public class BrambleCoreModule { @@ -58,5 +60,6 @@ public class BrambleCoreModule { c.inject(new SyncModule.EagerSingletons()); c.inject(new SystemModule.EagerSingletons()); c.inject(new TransportModule.EagerSingletons()); + c.inject(new VersioningModule.EagerSingletons()); } } 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 c6d2dbaf9..866f95da2 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,9 +5,9 @@ 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; +import org.briarproject.bramble.api.versioning.ClientVersioningManager; import javax.inject.Inject; import javax.inject.Singleton; 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 7c3e4a332..bca74a5aa 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,8 +18,6 @@ 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; @@ -28,6 +26,8 @@ import org.briarproject.bramble.api.sync.Message; import org.briarproject.bramble.api.sync.MessageId; import org.briarproject.bramble.api.sync.ValidationManager.IncomingMessageHook; import org.briarproject.bramble.api.system.Clock; +import org.briarproject.bramble.api.versioning.ClientVersioningManager; +import org.briarproject.bramble.api.versioning.ClientVersioningManager.ClientVersioningHook; import java.util.HashMap; import java.util.Map; diff --git a/bramble-core/src/main/java/org/briarproject/bramble/sync/SyncModule.java b/bramble-core/src/main/java/org/briarproject/bramble/sync/SyncModule.java index 04c6ca0db..ca6ec897a 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/sync/SyncModule.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/sync/SyncModule.java @@ -1,16 +1,12 @@ package org.briarproject.bramble.sync; import org.briarproject.bramble.PoliteExecutor; -import org.briarproject.bramble.api.client.ClientHelper; -import org.briarproject.bramble.api.contact.ContactManager; import org.briarproject.bramble.api.crypto.CryptoComponent; import org.briarproject.bramble.api.crypto.CryptoExecutor; -import org.briarproject.bramble.api.data.MetadataEncoder; import org.briarproject.bramble.api.db.DatabaseComponent; import org.briarproject.bramble.api.db.DatabaseExecutor; import org.briarproject.bramble.api.event.EventBus; import org.briarproject.bramble.api.lifecycle.LifecycleManager; -import org.briarproject.bramble.api.sync.ClientVersioningManager; import org.briarproject.bramble.api.sync.GroupFactory; import org.briarproject.bramble.api.sync.MessageFactory; import org.briarproject.bramble.api.sync.RecordReaderFactory; @@ -27,19 +23,12 @@ import javax.inject.Singleton; import dagger.Module; import dagger.Provides; -import static org.briarproject.bramble.api.sync.ClientVersioningManager.CLIENT_ID; -import static org.briarproject.bramble.api.sync.ClientVersioningManager.MAJOR_VERSION; - @Module public class SyncModule { public static class EagerSingletons { @Inject ValidationManager validationManager; - @Inject - ClientVersioningManager clientVersioningManager; - @Inject - ClientVersioningValidator clientVersioningValidator; } /** @@ -101,30 +90,4 @@ public class SyncModule { return new PoliteExecutor("ValidationExecutor", cryptoExecutor, MAX_CONCURRENT_VALIDATION_TASKS); } - - @Provides - @Singleton - ClientVersioningManager provideClientVersioningManager( - ClientVersioningManagerImpl clientVersioningManager, - LifecycleManager lifecycleManager, ContactManager contactManager, - ValidationManager validationManager) { - lifecycleManager.registerClient(clientVersioningManager); - lifecycleManager.registerService(clientVersioningManager); - contactManager.registerContactHook(clientVersioningManager); - validationManager.registerIncomingMessageHook(CLIENT_ID, MAJOR_VERSION, - clientVersioningManager); - return clientVersioningManager; - } - - @Provides - @Singleton - ClientVersioningValidator provideClientVersioningValidator( - ClientHelper clientHelper, MetadataEncoder metadataEncoder, - Clock clock, ValidationManager validationManager) { - ClientVersioningValidator validator = new ClientVersioningValidator( - clientHelper, metadataEncoder, clock); - validationManager.registerMessageValidator(CLIENT_ID, MAJOR_VERSION, - validator); - return validator; - } } diff --git a/bramble-core/src/main/java/org/briarproject/bramble/sync/ValidationManagerImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/sync/ValidationManagerImpl.java index 9565e889f..b84385305 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/sync/ValidationManagerImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/sync/ValidationManagerImpl.java @@ -20,6 +20,7 @@ import org.briarproject.bramble.api.sync.MessageFactory; import org.briarproject.bramble.api.sync.MessageId; import org.briarproject.bramble.api.sync.ValidationManager; import org.briarproject.bramble.api.sync.event.MessageAddedEvent; +import org.briarproject.bramble.api.versioning.ClientMajorVersion; import java.util.Collection; import java.util.LinkedList; diff --git a/bramble-core/src/main/java/org/briarproject/bramble/sync/ClientVersioningConstants.java b/bramble-core/src/main/java/org/briarproject/bramble/versioning/ClientVersioningConstants.java similarity index 80% rename from bramble-core/src/main/java/org/briarproject/bramble/sync/ClientVersioningConstants.java rename to bramble-core/src/main/java/org/briarproject/bramble/versioning/ClientVersioningConstants.java index 4578fa88d..e68ecc468 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/sync/ClientVersioningConstants.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/versioning/ClientVersioningConstants.java @@ -1,4 +1,4 @@ -package org.briarproject.bramble.sync; +package org.briarproject.bramble.versioning; interface ClientVersioningConstants { diff --git a/bramble-core/src/main/java/org/briarproject/bramble/sync/ClientVersioningManagerImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/versioning/ClientVersioningManagerImpl.java similarity index 96% rename from bramble-core/src/main/java/org/briarproject/bramble/sync/ClientVersioningManagerImpl.java rename to bramble-core/src/main/java/org/briarproject/bramble/versioning/ClientVersioningManagerImpl.java index 6f74036d8..7f3a96f1f 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/sync/ClientVersioningManagerImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/versioning/ClientVersioningManagerImpl.java @@ -1,4 +1,4 @@ -package org.briarproject.bramble.sync; +package org.briarproject.bramble.versioning; import org.briarproject.bramble.api.FormatException; import org.briarproject.bramble.api.client.ClientHelper; @@ -17,7 +17,6 @@ import org.briarproject.bramble.api.lifecycle.ServiceException; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.sync.Client; import org.briarproject.bramble.api.sync.ClientId; -import org.briarproject.bramble.api.sync.ClientVersioningManager; import org.briarproject.bramble.api.sync.Group; import org.briarproject.bramble.api.sync.Group.Visibility; import org.briarproject.bramble.api.sync.GroupId; @@ -26,6 +25,8 @@ import org.briarproject.bramble.api.sync.Message; import org.briarproject.bramble.api.sync.MessageId; import org.briarproject.bramble.api.sync.ValidationManager.IncomingMessageHook; import org.briarproject.bramble.api.system.Clock; +import org.briarproject.bramble.api.versioning.ClientMajorVersion; +import org.briarproject.bramble.api.versioning.ClientVersioningManager; import java.util.ArrayList; import java.util.Collection; @@ -47,9 +48,9 @@ import static java.util.Collections.emptyList; import static org.briarproject.bramble.api.sync.Group.Visibility.INVISIBLE; import static org.briarproject.bramble.api.sync.Group.Visibility.SHARED; import static org.briarproject.bramble.api.sync.Group.Visibility.VISIBLE; -import static org.briarproject.bramble.sync.ClientVersioningConstants.GROUP_KEY_CONTACT_ID; -import static org.briarproject.bramble.sync.ClientVersioningConstants.MSG_KEY_LOCAL; -import static org.briarproject.bramble.sync.ClientVersioningConstants.MSG_KEY_UPDATE_VERSION; +import static org.briarproject.bramble.versioning.ClientVersioningConstants.GROUP_KEY_CONTACT_ID; +import static org.briarproject.bramble.versioning.ClientVersioningConstants.MSG_KEY_LOCAL; +import static org.briarproject.bramble.versioning.ClientVersioningConstants.MSG_KEY_UPDATE_VERSION; @NotNullByDefault class ClientVersioningManagerImpl implements ClientVersioningManager, Client, @@ -244,8 +245,8 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, Client, } private BdfList encodeClientVersion(ClientVersion cv) { - return BdfList.of(cv.majorVersion.clientId.getString(), - cv.majorVersion.majorVersion, cv.minorVersion); + return BdfList.of(cv.majorVersion.getClientId().getString(), + cv.majorVersion.getMajorVersion(), cv.minorVersion); } /** @@ -426,8 +427,8 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, Client, } private BdfList encodeClientState(ClientState cs) { - return BdfList.of(cs.majorVersion.clientId.getString(), - cs.majorVersion.majorVersion, cs.minorVersion, cs.active); + return BdfList.of(cs.majorVersion.getClientId().getString(), + cs.majorVersion.getMajorVersion(), cs.minorVersion, cs.active); } private Map getVisibilities( diff --git a/bramble-core/src/main/java/org/briarproject/bramble/sync/ClientVersioningValidator.java b/bramble-core/src/main/java/org/briarproject/bramble/versioning/ClientVersioningValidator.java similarity index 90% rename from bramble-core/src/main/java/org/briarproject/bramble/sync/ClientVersioningValidator.java rename to bramble-core/src/main/java/org/briarproject/bramble/versioning/ClientVersioningValidator.java index 55e0383bf..e2fc20913 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/sync/ClientVersioningValidator.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/versioning/ClientVersioningValidator.java @@ -1,4 +1,4 @@ -package org.briarproject.bramble.sync; +package org.briarproject.bramble.versioning; import org.briarproject.bramble.api.FormatException; import org.briarproject.bramble.api.client.BdfMessageContext; @@ -15,10 +15,10 @@ import org.briarproject.bramble.api.system.Clock; import javax.annotation.concurrent.Immutable; import static org.briarproject.bramble.api.sync.ClientId.MAX_CLIENT_ID_LENGTH; -import static org.briarproject.bramble.sync.ClientVersioningConstants.MSG_KEY_LOCAL; -import static org.briarproject.bramble.sync.ClientVersioningConstants.MSG_KEY_UPDATE_VERSION; import static org.briarproject.bramble.util.ValidationUtils.checkLength; import static org.briarproject.bramble.util.ValidationUtils.checkSize; +import static org.briarproject.bramble.versioning.ClientVersioningConstants.MSG_KEY_LOCAL; +import static org.briarproject.bramble.versioning.ClientVersioningConstants.MSG_KEY_UPDATE_VERSION; @Immutable @NotNullByDefault diff --git a/bramble-core/src/main/java/org/briarproject/bramble/versioning/VersioningModule.java b/bramble-core/src/main/java/org/briarproject/bramble/versioning/VersioningModule.java new file mode 100644 index 000000000..f018ffd76 --- /dev/null +++ b/bramble-core/src/main/java/org/briarproject/bramble/versioning/VersioningModule.java @@ -0,0 +1,56 @@ +package org.briarproject.bramble.versioning; + +import org.briarproject.bramble.api.client.ClientHelper; +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.sync.ValidationManager; +import org.briarproject.bramble.api.system.Clock; +import org.briarproject.bramble.api.versioning.ClientVersioningManager; + +import javax.inject.Inject; +import javax.inject.Singleton; + +import dagger.Module; +import dagger.Provides; + +import static org.briarproject.bramble.api.versioning.ClientVersioningManager.CLIENT_ID; +import static org.briarproject.bramble.api.versioning.ClientVersioningManager.MAJOR_VERSION; + +@Module +public class VersioningModule { + + public static class EagerSingletons { + @Inject + ClientVersioningManager clientVersioningManager; + @Inject + ClientVersioningValidator clientVersioningValidator; + } + + + @Provides + @Singleton + ClientVersioningManager provideClientVersioningManager( + ClientVersioningManagerImpl clientVersioningManager, + LifecycleManager lifecycleManager, ContactManager contactManager, + ValidationManager validationManager) { + lifecycleManager.registerClient(clientVersioningManager); + lifecycleManager.registerService(clientVersioningManager); + contactManager.registerContactHook(clientVersioningManager); + validationManager.registerIncomingMessageHook(CLIENT_ID, MAJOR_VERSION, + clientVersioningManager); + return clientVersioningManager; + } + + @Provides + @Singleton + ClientVersioningValidator provideClientVersioningValidator( + ClientHelper clientHelper, MetadataEncoder metadataEncoder, + Clock clock, ValidationManager validationManager) { + ClientVersioningValidator validator = new ClientVersioningValidator( + clientHelper, metadataEncoder, clock); + validationManager.registerMessageValidator(CLIENT_ID, MAJOR_VERSION, + validator); + return validator; + } +} 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 174d6fde9..90aba549d 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,12 +14,12 @@ 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; import org.briarproject.bramble.api.sync.MessageId; import org.briarproject.bramble.api.system.Clock; +import org.briarproject.bramble.api.versioning.ClientVersioningManager; import org.briarproject.bramble.test.BrambleMockTestCase; import org.jmock.Expectations; import org.junit.Test; diff --git a/briar-core/src/main/java/org/briarproject/briar/introduction/IntroductionManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/introduction/IntroductionManagerImpl.java index a4137a509..ce6b40c2a 100644 --- a/briar-core/src/main/java/org/briarproject/briar/introduction/IntroductionManagerImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/introduction/IntroductionManagerImpl.java @@ -19,14 +19,14 @@ import org.briarproject.bramble.api.identity.IdentityManager; import org.briarproject.bramble.api.identity.LocalAuthor; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; 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.Message; import org.briarproject.bramble.api.sync.MessageId; import org.briarproject.bramble.api.sync.MessageStatus; +import org.briarproject.bramble.api.versioning.ClientVersioningManager; +import org.briarproject.bramble.api.versioning.ClientVersioningManager.ClientVersioningHook; import org.briarproject.briar.api.client.MessageTracker; import org.briarproject.briar.api.client.SessionId; import org.briarproject.briar.api.introduction.IntroductionManager; diff --git a/briar-core/src/main/java/org/briarproject/briar/introduction/IntroductionModule.java b/briar-core/src/main/java/org/briarproject/briar/introduction/IntroductionModule.java index e959f4ca5..932de3408 100644 --- a/briar-core/src/main/java/org/briarproject/briar/introduction/IntroductionModule.java +++ b/briar-core/src/main/java/org/briarproject/briar/introduction/IntroductionModule.java @@ -4,9 +4,9 @@ import org.briarproject.bramble.api.client.ClientHelper; 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.sync.ClientVersioningManager; import org.briarproject.bramble.api.sync.ValidationManager; import org.briarproject.bramble.api.system.Clock; +import org.briarproject.bramble.api.versioning.ClientVersioningManager; import org.briarproject.briar.api.introduction.IntroductionManager; import org.briarproject.briar.api.messaging.ConversationManager; diff --git a/briar-core/src/main/java/org/briarproject/briar/messaging/MessagingManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/messaging/MessagingManagerImpl.java index f57dafcdf..cd7a671ca 100644 --- a/briar-core/src/main/java/org/briarproject/briar/messaging/MessagingManagerImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/messaging/MessagingManagerImpl.java @@ -14,14 +14,14 @@ import org.briarproject.bramble.api.db.DbException; import org.briarproject.bramble.api.db.Transaction; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; 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.Message; import org.briarproject.bramble.api.sync.MessageId; import org.briarproject.bramble.api.sync.MessageStatus; +import org.briarproject.bramble.api.versioning.ClientVersioningManager; +import org.briarproject.bramble.api.versioning.ClientVersioningManager.ClientVersioningHook; import org.briarproject.briar.api.client.MessageTracker; import org.briarproject.briar.api.messaging.MessagingManager; import org.briarproject.briar.api.messaging.PrivateMessage; diff --git a/briar-core/src/main/java/org/briarproject/briar/messaging/MessagingModule.java b/briar-core/src/main/java/org/briarproject/briar/messaging/MessagingModule.java index 80ba2578a..016f1225a 100644 --- a/briar-core/src/main/java/org/briarproject/briar/messaging/MessagingModule.java +++ b/briar-core/src/main/java/org/briarproject/briar/messaging/MessagingModule.java @@ -4,9 +4,9 @@ import org.briarproject.bramble.api.client.ClientHelper; 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.sync.ClientVersioningManager; import org.briarproject.bramble.api.sync.ValidationManager; import org.briarproject.bramble.api.system.Clock; +import org.briarproject.bramble.api.versioning.ClientVersioningManager; import org.briarproject.briar.api.messaging.ConversationManager; import org.briarproject.briar.api.messaging.MessagingManager; import org.briarproject.briar.api.messaging.PrivateMessageFactory; diff --git a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/AbstractProtocolEngine.java b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/AbstractProtocolEngine.java index e981610ce..d3bd73943 100644 --- a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/AbstractProtocolEngine.java +++ b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/AbstractProtocolEngine.java @@ -10,13 +10,13 @@ import org.briarproject.bramble.api.db.Transaction; import org.briarproject.bramble.api.identity.IdentityManager; import org.briarproject.bramble.api.identity.LocalAuthor; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; -import org.briarproject.bramble.api.sync.ClientVersioningManager; 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.Message; import org.briarproject.bramble.api.sync.MessageId; import org.briarproject.bramble.api.system.Clock; +import org.briarproject.bramble.api.versioning.ClientVersioningManager; import org.briarproject.briar.api.client.MessageTracker; import org.briarproject.briar.api.privategroup.GroupMessage; import org.briarproject.briar.api.privategroup.GroupMessageFactory; diff --git a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/CreatorProtocolEngine.java b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/CreatorProtocolEngine.java index 62030a09b..d043fbad2 100644 --- a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/CreatorProtocolEngine.java +++ b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/CreatorProtocolEngine.java @@ -8,9 +8,9 @@ import org.briarproject.bramble.api.db.DbException; import org.briarproject.bramble.api.db.Transaction; import org.briarproject.bramble.api.identity.IdentityManager; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; -import org.briarproject.bramble.api.sync.ClientVersioningManager; import org.briarproject.bramble.api.sync.Message; import org.briarproject.bramble.api.system.Clock; +import org.briarproject.bramble.api.versioning.ClientVersioningManager; import org.briarproject.briar.api.client.MessageTracker; import org.briarproject.briar.api.client.ProtocolStateException; import org.briarproject.briar.api.client.SessionId; diff --git a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImpl.java index 22427eaa0..3ef0c9451 100644 --- a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImpl.java @@ -16,14 +16,14 @@ import org.briarproject.bramble.api.db.Transaction; import org.briarproject.bramble.api.identity.Author; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; 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.Message; import org.briarproject.bramble.api.sync.MessageId; import org.briarproject.bramble.api.sync.MessageStatus; +import org.briarproject.bramble.api.versioning.ClientVersioningManager; +import org.briarproject.bramble.api.versioning.ClientVersioningManager.ClientVersioningHook; import org.briarproject.briar.api.client.MessageTracker; import org.briarproject.briar.api.client.SessionId; import org.briarproject.briar.api.privategroup.PrivateGroup; diff --git a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationModule.java b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationModule.java index 1ae6ceb74..9dc9c84ad 100644 --- a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationModule.java +++ b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationModule.java @@ -4,9 +4,9 @@ import org.briarproject.bramble.api.client.ClientHelper; 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.sync.ClientVersioningManager; import org.briarproject.bramble.api.sync.ValidationManager; import org.briarproject.bramble.api.system.Clock; +import org.briarproject.bramble.api.versioning.ClientVersioningManager; import org.briarproject.briar.api.messaging.ConversationManager; import org.briarproject.briar.api.privategroup.PrivateGroupFactory; import org.briarproject.briar.api.privategroup.PrivateGroupManager; diff --git a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/InviteeProtocolEngine.java b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/InviteeProtocolEngine.java index 064c1d593..a0e73d9b0 100644 --- a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/InviteeProtocolEngine.java +++ b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/InviteeProtocolEngine.java @@ -9,10 +9,10 @@ import org.briarproject.bramble.api.db.Transaction; import org.briarproject.bramble.api.identity.Author; import org.briarproject.bramble.api.identity.IdentityManager; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; -import org.briarproject.bramble.api.sync.ClientVersioningManager; import org.briarproject.bramble.api.sync.Message; import org.briarproject.bramble.api.sync.MessageId; import org.briarproject.bramble.api.system.Clock; +import org.briarproject.bramble.api.versioning.ClientVersioningManager; import org.briarproject.briar.api.client.MessageTracker; import org.briarproject.briar.api.client.ProtocolStateException; import org.briarproject.briar.api.client.SessionId; diff --git a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/PeerProtocolEngine.java b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/PeerProtocolEngine.java index 5a7f1c6c3..9b7096b63 100644 --- a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/PeerProtocolEngine.java +++ b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/PeerProtocolEngine.java @@ -9,9 +9,9 @@ import org.briarproject.bramble.api.db.DbException; import org.briarproject.bramble.api.db.Transaction; import org.briarproject.bramble.api.identity.IdentityManager; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; -import org.briarproject.bramble.api.sync.ClientVersioningManager; import org.briarproject.bramble.api.sync.Message; import org.briarproject.bramble.api.system.Clock; +import org.briarproject.bramble.api.versioning.ClientVersioningManager; import org.briarproject.briar.api.client.MessageTracker; import org.briarproject.briar.api.client.ProtocolStateException; import org.briarproject.briar.api.privategroup.GroupMessageFactory; diff --git a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/ProtocolEngineFactoryImpl.java b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/ProtocolEngineFactoryImpl.java index 801d16d06..d54031029 100644 --- a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/ProtocolEngineFactoryImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/ProtocolEngineFactoryImpl.java @@ -4,8 +4,8 @@ import org.briarproject.bramble.api.client.ClientHelper; import org.briarproject.bramble.api.db.DatabaseComponent; import org.briarproject.bramble.api.identity.IdentityManager; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; -import org.briarproject.bramble.api.sync.ClientVersioningManager; import org.briarproject.bramble.api.system.Clock; +import org.briarproject.bramble.api.versioning.ClientVersioningManager; import org.briarproject.briar.api.client.MessageTracker; import org.briarproject.briar.api.privategroup.GroupMessageFactory; import org.briarproject.briar.api.privategroup.PrivateGroupFactory; diff --git a/briar-core/src/main/java/org/briarproject/briar/sharing/BlogProtocolEngineImpl.java b/briar-core/src/main/java/org/briarproject/briar/sharing/BlogProtocolEngineImpl.java index fdc6427f8..25e0d0e8e 100644 --- a/briar-core/src/main/java/org/briarproject/briar/sharing/BlogProtocolEngineImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/sharing/BlogProtocolEngineImpl.java @@ -9,9 +9,9 @@ import org.briarproject.bramble.api.db.Transaction; import org.briarproject.bramble.api.event.Event; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.sync.ClientId; -import org.briarproject.bramble.api.sync.ClientVersioningManager; import org.briarproject.bramble.api.sync.MessageId; import org.briarproject.bramble.api.system.Clock; +import org.briarproject.bramble.api.versioning.ClientVersioningManager; import org.briarproject.briar.api.blog.Blog; import org.briarproject.briar.api.blog.BlogInvitationResponse; import org.briarproject.briar.api.blog.BlogManager; diff --git a/briar-core/src/main/java/org/briarproject/briar/sharing/BlogSharingManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/sharing/BlogSharingManagerImpl.java index 2be80af2b..5c77c7be9 100644 --- a/briar-core/src/main/java/org/briarproject/briar/sharing/BlogSharingManagerImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/sharing/BlogSharingManagerImpl.java @@ -12,7 +12,7 @@ import org.briarproject.bramble.api.identity.IdentityManager; import org.briarproject.bramble.api.identity.LocalAuthor; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.sync.ClientId; -import org.briarproject.bramble.api.sync.ClientVersioningManager; +import org.briarproject.bramble.api.versioning.ClientVersioningManager; import org.briarproject.briar.api.blog.Blog; import org.briarproject.briar.api.blog.BlogInvitationResponse; import org.briarproject.briar.api.blog.BlogManager; diff --git a/briar-core/src/main/java/org/briarproject/briar/sharing/ForumProtocolEngineImpl.java b/briar-core/src/main/java/org/briarproject/briar/sharing/ForumProtocolEngineImpl.java index 14411b7d0..7b2a1c785 100644 --- a/briar-core/src/main/java/org/briarproject/briar/sharing/ForumProtocolEngineImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/sharing/ForumProtocolEngineImpl.java @@ -9,9 +9,9 @@ import org.briarproject.bramble.api.db.Transaction; import org.briarproject.bramble.api.event.Event; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.sync.ClientId; -import org.briarproject.bramble.api.sync.ClientVersioningManager; import org.briarproject.bramble.api.sync.MessageId; import org.briarproject.bramble.api.system.Clock; +import org.briarproject.bramble.api.versioning.ClientVersioningManager; import org.briarproject.briar.api.client.MessageTracker; import org.briarproject.briar.api.forum.Forum; import org.briarproject.briar.api.forum.ForumInvitationResponse; diff --git a/briar-core/src/main/java/org/briarproject/briar/sharing/ForumSharingManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/sharing/ForumSharingManagerImpl.java index 12dd56b5b..9b3cd97e1 100644 --- a/briar-core/src/main/java/org/briarproject/briar/sharing/ForumSharingManagerImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/sharing/ForumSharingManagerImpl.java @@ -8,7 +8,7 @@ import org.briarproject.bramble.api.db.DbException; import org.briarproject.bramble.api.db.Transaction; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.sync.ClientId; -import org.briarproject.bramble.api.sync.ClientVersioningManager; +import org.briarproject.bramble.api.versioning.ClientVersioningManager; import org.briarproject.briar.api.client.MessageTracker; import org.briarproject.briar.api.forum.Forum; import org.briarproject.briar.api.forum.ForumInvitationResponse; diff --git a/briar-core/src/main/java/org/briarproject/briar/sharing/ProtocolEngineImpl.java b/briar-core/src/main/java/org/briarproject/briar/sharing/ProtocolEngineImpl.java index 6097c61aa..0a672f578 100644 --- a/briar-core/src/main/java/org/briarproject/briar/sharing/ProtocolEngineImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/sharing/ProtocolEngineImpl.java @@ -11,13 +11,13 @@ import org.briarproject.bramble.api.db.Transaction; import org.briarproject.bramble.api.event.Event; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.sync.ClientId; -import org.briarproject.bramble.api.sync.ClientVersioningManager; 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.Message; import org.briarproject.bramble.api.sync.MessageId; import org.briarproject.bramble.api.system.Clock; +import org.briarproject.bramble.api.versioning.ClientVersioningManager; import org.briarproject.briar.api.client.MessageTracker; import org.briarproject.briar.api.client.ProtocolStateException; import org.briarproject.briar.api.sharing.Shareable; diff --git a/briar-core/src/main/java/org/briarproject/briar/sharing/SharingManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/sharing/SharingManagerImpl.java index 200d91c95..29e653301 100644 --- a/briar-core/src/main/java/org/briarproject/briar/sharing/SharingManagerImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/sharing/SharingManagerImpl.java @@ -16,14 +16,14 @@ import org.briarproject.bramble.api.db.Transaction; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.sync.Client; import org.briarproject.bramble.api.sync.ClientId; -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.Message; import org.briarproject.bramble.api.sync.MessageId; import org.briarproject.bramble.api.sync.MessageStatus; +import org.briarproject.bramble.api.versioning.ClientVersioningManager; +import org.briarproject.bramble.api.versioning.ClientVersioningManager.ClientVersioningHook; import org.briarproject.briar.api.client.MessageTracker; import org.briarproject.briar.api.client.SessionId; import org.briarproject.briar.api.sharing.InvitationMessage; diff --git a/briar-core/src/main/java/org/briarproject/briar/sharing/SharingModule.java b/briar-core/src/main/java/org/briarproject/briar/sharing/SharingModule.java index 296511ec3..c5c1bacce 100644 --- a/briar-core/src/main/java/org/briarproject/briar/sharing/SharingModule.java +++ b/briar-core/src/main/java/org/briarproject/briar/sharing/SharingModule.java @@ -4,9 +4,9 @@ import org.briarproject.bramble.api.client.ClientHelper; 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.sync.ClientVersioningManager; import org.briarproject.bramble.api.sync.ValidationManager; import org.briarproject.bramble.api.system.Clock; +import org.briarproject.bramble.api.versioning.ClientVersioningManager; import org.briarproject.briar.api.blog.Blog; import org.briarproject.briar.api.blog.BlogFactory; import org.briarproject.briar.api.blog.BlogInvitationResponse; diff --git a/briar-core/src/test/java/org/briarproject/briar/feed/FeedManagerIntegrationTest.java b/briar-core/src/test/java/org/briarproject/briar/feed/FeedManagerIntegrationTest.java index ea8448ed4..24c7334e7 100644 --- a/briar-core/src/test/java/org/briarproject/briar/feed/FeedManagerIntegrationTest.java +++ b/briar-core/src/test/java/org/briarproject/briar/feed/FeedManagerIntegrationTest.java @@ -10,6 +10,7 @@ import org.briarproject.bramble.system.SystemModule; import org.briarproject.bramble.test.TestDatabaseModule; import org.briarproject.bramble.test.TestUtils; import org.briarproject.bramble.transport.TransportModule; +import org.briarproject.bramble.versioning.VersioningModule; import org.briarproject.briar.api.blog.Blog; import org.briarproject.briar.api.blog.BlogManager; import org.briarproject.briar.api.blog.BlogPostHeader; @@ -122,6 +123,7 @@ public class FeedManagerIntegrationTest extends BriarTestCase { component.inject(new SyncModule.EagerSingletons()); component.inject(new SystemModule.EagerSingletons()); component.inject(new TransportModule.EagerSingletons()); + component.inject(new VersioningModule.EagerSingletons()); } } diff --git a/briar-core/src/test/java/org/briarproject/briar/feed/FeedManagerIntegrationTestComponent.java b/briar-core/src/test/java/org/briarproject/briar/feed/FeedManagerIntegrationTestComponent.java index 6de06bc28..76445fe03 100644 --- a/briar-core/src/test/java/org/briarproject/briar/feed/FeedManagerIntegrationTestComponent.java +++ b/briar-core/src/test/java/org/briarproject/briar/feed/FeedManagerIntegrationTestComponent.java @@ -17,6 +17,7 @@ import org.briarproject.bramble.test.TestPluginConfigModule; import org.briarproject.bramble.test.TestSecureRandomModule; import org.briarproject.bramble.test.TestSocksModule; import org.briarproject.bramble.transport.TransportModule; +import org.briarproject.bramble.versioning.VersioningModule; import org.briarproject.briar.api.blog.BlogManager; import org.briarproject.briar.api.feed.FeedManager; import org.briarproject.briar.blog.BlogModule; @@ -48,7 +49,8 @@ import dagger.Component; LifecycleModule.class, SyncModule.class, SystemModule.class, - TransportModule.class + TransportModule.class, + VersioningModule.class }) interface FeedManagerIntegrationTestComponent { @@ -72,6 +74,8 @@ interface FeedManagerIntegrationTestComponent { void inject(TransportModule.EagerSingletons init); + void inject(VersioningModule.EagerSingletons init); + LifecycleManager getLifecycleManager(); FeedManager getFeedManager(); diff --git a/briar-core/src/test/java/org/briarproject/briar/introduction/IntroductionIntegrationTestComponent.java b/briar-core/src/test/java/org/briarproject/briar/introduction/IntroductionIntegrationTestComponent.java index d3367296f..160d80e53 100644 --- a/briar-core/src/test/java/org/briarproject/briar/introduction/IntroductionIntegrationTestComponent.java +++ b/briar-core/src/test/java/org/briarproject/briar/introduction/IntroductionIntegrationTestComponent.java @@ -16,6 +16,7 @@ import org.briarproject.bramble.test.TestDatabaseModule; import org.briarproject.bramble.test.TestPluginConfigModule; import org.briarproject.bramble.test.TestSecureRandomModule; import org.briarproject.bramble.transport.TransportModule; +import org.briarproject.bramble.versioning.VersioningModule; import org.briarproject.briar.blog.BlogModule; import org.briarproject.briar.client.BriarClientModule; import org.briarproject.briar.forum.ForumModule; @@ -54,7 +55,8 @@ import dagger.Component; SharingModule.class, SyncModule.class, SystemModule.class, - TransportModule.class + TransportModule.class, + VersioningModule.class }) interface IntroductionIntegrationTestComponent extends BriarIntegrationTestComponent { diff --git a/briar-core/src/test/java/org/briarproject/briar/messaging/MessageSizeIntegrationTest.java b/briar-core/src/test/java/org/briarproject/briar/messaging/MessageSizeIntegrationTest.java index d2b19c89f..c5a1f1851 100644 --- a/briar-core/src/test/java/org/briarproject/briar/messaging/MessageSizeIntegrationTest.java +++ b/briar-core/src/test/java/org/briarproject/briar/messaging/MessageSizeIntegrationTest.java @@ -13,6 +13,7 @@ import org.briarproject.bramble.identity.IdentityModule; import org.briarproject.bramble.sync.SyncModule; import org.briarproject.bramble.system.SystemModule; import org.briarproject.bramble.transport.TransportModule; +import org.briarproject.bramble.versioning.VersioningModule; import org.briarproject.briar.api.forum.ForumPost; import org.briarproject.briar.api.forum.ForumPostFactory; import org.briarproject.briar.api.messaging.PrivateMessage; @@ -99,5 +100,6 @@ public class MessageSizeIntegrationTest extends BriarTestCase { component.inject(new SyncModule.EagerSingletons()); component.inject(new SystemModule.EagerSingletons()); component.inject(new TransportModule.EagerSingletons()); + component.inject(new VersioningModule.EagerSingletons()); } } diff --git a/briar-core/src/test/java/org/briarproject/briar/messaging/MessageSizeIntegrationTestComponent.java b/briar-core/src/test/java/org/briarproject/briar/messaging/MessageSizeIntegrationTestComponent.java index 2ac7f469b..01caa2e4b 100644 --- a/briar-core/src/test/java/org/briarproject/briar/messaging/MessageSizeIntegrationTestComponent.java +++ b/briar-core/src/test/java/org/briarproject/briar/messaging/MessageSizeIntegrationTestComponent.java @@ -15,6 +15,7 @@ import org.briarproject.bramble.test.TestLifecycleModule; import org.briarproject.bramble.test.TestPluginConfigModule; import org.briarproject.bramble.test.TestSecureRandomModule; import org.briarproject.bramble.transport.TransportModule; +import org.briarproject.bramble.versioning.VersioningModule; import org.briarproject.briar.client.BriarClientModule; import org.briarproject.briar.forum.ForumModule; @@ -41,7 +42,8 @@ import dagger.Component; MessagingModule.class, SyncModule.class, SystemModule.class, - TransportModule.class + TransportModule.class, + VersioningModule.class }) interface MessageSizeIntegrationTestComponent { @@ -62,4 +64,6 @@ interface MessageSizeIntegrationTestComponent { void inject(SystemModule.EagerSingletons init); void inject(TransportModule.EagerSingletons init); + + void inject(VersioningModule.EagerSingletons init); } diff --git a/briar-core/src/test/java/org/briarproject/briar/messaging/SimplexMessagingIntegrationTest.java b/briar-core/src/test/java/org/briarproject/briar/messaging/SimplexMessagingIntegrationTest.java index df9754d53..879b763da 100644 --- a/briar-core/src/test/java/org/briarproject/briar/messaging/SimplexMessagingIntegrationTest.java +++ b/briar-core/src/test/java/org/briarproject/briar/messaging/SimplexMessagingIntegrationTest.java @@ -25,6 +25,7 @@ import org.briarproject.bramble.system.SystemModule; import org.briarproject.bramble.test.TestDatabaseModule; import org.briarproject.bramble.test.TestUtils; import org.briarproject.bramble.transport.TransportModule; +import org.briarproject.bramble.versioning.VersioningModule; import org.briarproject.briar.api.messaging.MessagingManager; import org.briarproject.briar.api.messaging.PrivateMessage; import org.briarproject.briar.api.messaging.PrivateMessageFactory; @@ -193,6 +194,7 @@ public class SimplexMessagingIntegrationTest extends BriarTestCase { component.inject(new SyncModule.EagerSingletons()); component.inject(new SystemModule.EagerSingletons()); component.inject(new TransportModule.EagerSingletons()); + component.inject(new VersioningModule.EagerSingletons()); } @NotNullByDefault diff --git a/briar-core/src/test/java/org/briarproject/briar/messaging/SimplexMessagingIntegrationTestComponent.java b/briar-core/src/test/java/org/briarproject/briar/messaging/SimplexMessagingIntegrationTestComponent.java index 7fc608a55..f3d6f0399 100644 --- a/briar-core/src/test/java/org/briarproject/briar/messaging/SimplexMessagingIntegrationTestComponent.java +++ b/briar-core/src/test/java/org/briarproject/briar/messaging/SimplexMessagingIntegrationTestComponent.java @@ -23,6 +23,7 @@ import org.briarproject.bramble.test.TestDatabaseModule; import org.briarproject.bramble.test.TestPluginConfigModule; import org.briarproject.bramble.test.TestSecureRandomModule; import org.briarproject.bramble.transport.TransportModule; +import org.briarproject.bramble.versioning.VersioningModule; import org.briarproject.briar.api.messaging.MessagingManager; import org.briarproject.briar.api.messaging.PrivateMessageFactory; import org.briarproject.briar.client.BriarClientModule; @@ -49,7 +50,8 @@ import dagger.Component; MessagingModule.class, SyncModule.class, SystemModule.class, - TransportModule.class + TransportModule.class, + VersioningModule.class }) interface SimplexMessagingIntegrationTestComponent { @@ -67,6 +69,8 @@ interface SimplexMessagingIntegrationTestComponent { void inject(TransportModule.EagerSingletons init); + void inject(VersioningModule.EagerSingletons init); + LifecycleManager getLifecycleManager(); IdentityManager getIdentityManager(); diff --git a/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/AbstractProtocolEngineTest.java b/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/AbstractProtocolEngineTest.java index 9e014cbab..ebcaf70bb 100644 --- a/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/AbstractProtocolEngineTest.java +++ b/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/AbstractProtocolEngineTest.java @@ -10,13 +10,13 @@ import org.briarproject.bramble.api.db.Transaction; import org.briarproject.bramble.api.identity.Author; import org.briarproject.bramble.api.identity.AuthorId; import org.briarproject.bramble.api.identity.IdentityManager; -import org.briarproject.bramble.api.sync.ClientVersioningManager; 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.Message; import org.briarproject.bramble.api.sync.MessageId; import org.briarproject.bramble.api.system.Clock; +import org.briarproject.bramble.api.versioning.ClientVersioningManager; import org.briarproject.bramble.test.BrambleMockTestCase; import org.briarproject.briar.api.client.MessageTracker; import org.briarproject.briar.api.privategroup.GroupMessageFactory; diff --git a/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImplTest.java b/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImplTest.java index 4a1a7a7e9..d36fc02e3 100644 --- a/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImplTest.java +++ b/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImplTest.java @@ -15,11 +15,11 @@ import org.briarproject.bramble.api.db.Metadata; import org.briarproject.bramble.api.db.Transaction; import org.briarproject.bramble.api.identity.Author; import org.briarproject.bramble.api.identity.AuthorId; -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; import org.briarproject.bramble.api.sync.MessageId; +import org.briarproject.bramble.api.versioning.ClientVersioningManager; import org.briarproject.bramble.test.BrambleMockTestCase; import org.briarproject.bramble.test.TestUtils; import org.briarproject.briar.api.client.MessageTracker; diff --git a/briar-core/src/test/java/org/briarproject/briar/sharing/BlogSharingManagerImplTest.java b/briar-core/src/test/java/org/briarproject/briar/sharing/BlogSharingManagerImplTest.java index 10a8f5fc5..8b72b4aff 100644 --- a/briar-core/src/test/java/org/briarproject/briar/sharing/BlogSharingManagerImplTest.java +++ b/briar-core/src/test/java/org/briarproject/briar/sharing/BlogSharingManagerImplTest.java @@ -14,10 +14,10 @@ import org.briarproject.bramble.api.db.Transaction; import org.briarproject.bramble.api.identity.Author; import org.briarproject.bramble.api.identity.IdentityManager; import org.briarproject.bramble.api.identity.LocalAuthor; -import org.briarproject.bramble.api.sync.ClientVersioningManager; import org.briarproject.bramble.api.sync.Group; import org.briarproject.bramble.api.sync.Message; import org.briarproject.bramble.api.sync.MessageId; +import org.briarproject.bramble.api.versioning.ClientVersioningManager; import org.briarproject.bramble.test.BrambleMockTestCase; import org.briarproject.briar.api.blog.Blog; import org.briarproject.briar.api.blog.BlogInvitationResponse; diff --git a/briar-core/src/test/java/org/briarproject/briar/test/BriarIntegrationTest.java b/briar-core/src/test/java/org/briarproject/briar/test/BriarIntegrationTest.java index 18d00ee06..7175cdb77 100644 --- a/briar-core/src/test/java/org/briarproject/briar/test/BriarIntegrationTest.java +++ b/briar-core/src/test/java/org/briarproject/briar/test/BriarIntegrationTest.java @@ -32,6 +32,7 @@ import org.briarproject.bramble.sync.SyncModule; import org.briarproject.bramble.system.SystemModule; import org.briarproject.bramble.test.TestUtils; import org.briarproject.bramble.transport.TransportModule; +import org.briarproject.bramble.versioning.VersioningModule; import org.briarproject.briar.api.blog.BlogFactory; import org.briarproject.briar.api.blog.BlogPostFactory; import org.briarproject.briar.api.client.MessageTracker; @@ -183,6 +184,7 @@ public abstract class BriarIntegrationTest Date: Tue, 24 Apr 2018 11:59:18 +0100 Subject: [PATCH 26/33] Unit tests for client versioning validator. --- .../ClientVersioningValidatorTest.java | 274 ++++++++++++++++++ 1 file changed, 274 insertions(+) create mode 100644 bramble-core/src/test/java/org/briarproject/bramble/versioning/ClientVersioningValidatorTest.java diff --git a/bramble-core/src/test/java/org/briarproject/bramble/versioning/ClientVersioningValidatorTest.java b/bramble-core/src/test/java/org/briarproject/bramble/versioning/ClientVersioningValidatorTest.java new file mode 100644 index 000000000..d13be2340 --- /dev/null +++ b/bramble-core/src/test/java/org/briarproject/bramble/versioning/ClientVersioningValidatorTest.java @@ -0,0 +1,274 @@ +package org.briarproject.bramble.versioning; + +import org.briarproject.bramble.api.FormatException; +import org.briarproject.bramble.api.client.BdfMessageContext; +import org.briarproject.bramble.api.client.ClientHelper; +import org.briarproject.bramble.api.data.BdfDictionary; +import org.briarproject.bramble.api.data.BdfEntry; +import org.briarproject.bramble.api.data.BdfList; +import org.briarproject.bramble.api.data.MetadataEncoder; +import org.briarproject.bramble.api.sync.ClientId; +import org.briarproject.bramble.api.sync.Group; +import org.briarproject.bramble.api.sync.Message; +import org.briarproject.bramble.api.system.Clock; +import org.briarproject.bramble.test.BrambleMockTestCase; +import org.junit.Test; + +import static java.util.Collections.emptyList; +import static org.briarproject.bramble.api.sync.ClientId.MAX_CLIENT_ID_LENGTH; +import static org.briarproject.bramble.api.versioning.ClientVersioningManager.CLIENT_ID; +import static org.briarproject.bramble.api.versioning.ClientVersioningManager.MAJOR_VERSION; +import static org.briarproject.bramble.test.TestUtils.getClientId; +import static org.briarproject.bramble.test.TestUtils.getGroup; +import static org.briarproject.bramble.test.TestUtils.getMessage; +import static org.briarproject.bramble.test.TestUtils.getRandomBytes; +import static org.briarproject.bramble.util.StringUtils.getRandomString; +import static org.briarproject.bramble.versioning.ClientVersioningConstants.MSG_KEY_LOCAL; +import static org.briarproject.bramble.versioning.ClientVersioningConstants.MSG_KEY_UPDATE_VERSION; +import static org.junit.Assert.assertEquals; + +public class ClientVersioningValidatorTest extends BrambleMockTestCase { + + private final ClientHelper clientHelper = context.mock(ClientHelper.class); + private final MetadataEncoder metadataEncoder = + context.mock(MetadataEncoder.class); + private final Clock clock = context.mock(Clock.class); + private final ClientVersioningValidator validator = + new ClientVersioningValidator(clientHelper, metadataEncoder, clock); + + private final Group group = getGroup(CLIENT_ID, MAJOR_VERSION); + private final Message message = getMessage(group.getId()); + private final ClientId clientId = getClientId(); + + @Test(expected = FormatException.class) + public void testRejectsTooShortBody() throws Exception { + BdfList body = BdfList.of(new BdfList()); + validator.validateMessage(message, group, body); + } + + @Test(expected = FormatException.class) + public void testRejectsTooLongBody() throws Exception { + BdfList body = BdfList.of(new BdfList(), 123, null); + validator.validateMessage(message, group, body); + } + + @Test(expected = FormatException.class) + public void testRejectsNullStatesList() throws Exception { + BdfList body = BdfList.of(null, 123); + validator.validateMessage(message, group, body); + } + + @Test(expected = FormatException.class) + public void testRejectsNonListStatesList() throws Exception { + BdfList body = BdfList.of("", 123); + validator.validateMessage(message, group, body); + } + + @Test + public void testAcceptsEmptyStatesList() throws Exception { + BdfList body = BdfList.of(new BdfList(), 123); + BdfMessageContext context = + validator.validateMessage(message, group, body); + assertEquals(emptyList(), context.getDependencies()); + BdfDictionary expectedMeta = BdfDictionary.of( + new BdfEntry(MSG_KEY_UPDATE_VERSION, 123L), + new BdfEntry(MSG_KEY_LOCAL, false)); + assertEquals(expectedMeta, context.getDictionary()); + } + + @Test(expected = FormatException.class) + public void testRejectsNullUpdateVersion() throws Exception { + BdfList body = BdfList.of(new BdfList(), null); + validator.validateMessage(message, group, body); + } + + @Test(expected = FormatException.class) + public void testRejectsNonLongUpdateVersion() throws Exception { + BdfList body = BdfList.of(new BdfList(), "123"); + validator.validateMessage(message, group, body); + } + + @Test(expected = FormatException.class) + public void testRejectsNegativeUpdateVersion() throws Exception { + BdfList body = BdfList.of(new BdfList(), -1); + validator.validateMessage(message, group, body); + } + + @Test + public void testAcceptsZeroUpdateVersion() throws Exception { + BdfList body = BdfList.of(new BdfList(), 0); + BdfMessageContext context = + validator.validateMessage(message, group, body); + assertEquals(emptyList(), context.getDependencies()); + BdfDictionary expectedMeta = BdfDictionary.of( + new BdfEntry(MSG_KEY_UPDATE_VERSION, 0L), + new BdfEntry(MSG_KEY_LOCAL, false)); + assertEquals(expectedMeta, context.getDictionary()); + } + + @Test(expected = FormatException.class) + public void testRejectsTooShortClientState() throws Exception { + BdfList state = BdfList.of(clientId.getString(), 123, 234); + BdfList body = BdfList.of(BdfList.of(state), 345); + validator.validateMessage(message, group, body); + } + + @Test(expected = FormatException.class) + public void testRejectsTooLongClientState() throws Exception { + BdfList state = BdfList.of(clientId.getString(), 123, 234, true, null); + BdfList body = BdfList.of(BdfList.of(state), 345); + validator.validateMessage(message, group, body); + } + + @Test(expected = FormatException.class) + public void testRejectsNullClientId() throws Exception { + BdfList state = BdfList.of(null, 123, 234, true); + BdfList body = BdfList.of(BdfList.of(state), 345); + validator.validateMessage(message, group, body); + } + + @Test(expected = FormatException.class) + public void testRejectsNonStringClientId() throws Exception { + byte[] id = getRandomBytes(MAX_CLIENT_ID_LENGTH); + BdfList state = BdfList.of(id, 123, 234, true); + BdfList body = BdfList.of(BdfList.of(state), 345); + validator.validateMessage(message, group, body); + } + + @Test(expected = FormatException.class) + public void testRejectsTooShortClientId() throws Exception { + BdfList state = BdfList.of("", 123, 234, true); + BdfList body = BdfList.of(BdfList.of(state), 345); + validator.validateMessage(message, group, body); + } + + @Test + public void testAcceptsMinLengthClientId() throws Exception { + BdfList state = BdfList.of(getRandomString(1), 123, 234, true); + BdfList body = BdfList.of(BdfList.of(state), 345); + BdfMessageContext context = + validator.validateMessage(message, group, body); + assertEquals(emptyList(), context.getDependencies()); + BdfDictionary expectedMeta = BdfDictionary.of( + new BdfEntry(MSG_KEY_UPDATE_VERSION, 345L), + new BdfEntry(MSG_KEY_LOCAL, false)); + assertEquals(expectedMeta, context.getDictionary()); + } + + @Test(expected = FormatException.class) + public void testRejectsTooLongClientId() throws Exception { + String id = getRandomString(MAX_CLIENT_ID_LENGTH + 1); + BdfList state = BdfList.of(id, 123, 234, true); + BdfList body = BdfList.of(BdfList.of(state), 345); + validator.validateMessage(message, group, body); + } + + @Test + public void testAcceptsMaxLengthClientId() throws Exception { + String id = getRandomString(MAX_CLIENT_ID_LENGTH); + BdfList state = BdfList.of(id, 123, 234, true); + BdfList body = BdfList.of(BdfList.of(state), 345); + BdfMessageContext context = + validator.validateMessage(message, group, body); + assertEquals(emptyList(), context.getDependencies()); + BdfDictionary expectedMeta = BdfDictionary.of( + new BdfEntry(MSG_KEY_UPDATE_VERSION, 345L), + new BdfEntry(MSG_KEY_LOCAL, false)); + assertEquals(expectedMeta, context.getDictionary()); + } + + @Test(expected = FormatException.class) + public void testRejectsNullMajorVersion() throws Exception { + BdfList state = BdfList.of(clientId.getString(), null, 234, true); + BdfList body = BdfList.of(BdfList.of(state), 345); + validator.validateMessage(message, group, body); + } + + @Test(expected = FormatException.class) + public void testRejectsNonLongMajorVersion() throws Exception { + BdfList state = BdfList.of(clientId.getString(), "123", 234, true); + BdfList body = BdfList.of(BdfList.of(state), 345); + validator.validateMessage(message, group, body); + } + + @Test(expected = FormatException.class) + public void testRejectsNegativeMajorVersion() throws Exception { + BdfList state = BdfList.of(clientId.getString(), -1, 234, true); + BdfList body = BdfList.of(BdfList.of(state), 345); + validator.validateMessage(message, group, body); + } + + @Test + public void testAcceptsZeroMajorVersion() throws Exception { + BdfList state = BdfList.of(clientId.getString(), 0, 234, true); + BdfList body = BdfList.of(BdfList.of(state), 345); + BdfMessageContext context = + validator.validateMessage(message, group, body); + assertEquals(emptyList(), context.getDependencies()); + BdfDictionary expectedMeta = BdfDictionary.of( + new BdfEntry(MSG_KEY_UPDATE_VERSION, 345L), + new BdfEntry(MSG_KEY_LOCAL, false)); + assertEquals(expectedMeta, context.getDictionary()); + } + + @Test(expected = FormatException.class) + public void testRejectsNullMinorVersion() throws Exception { + BdfList state = BdfList.of(clientId.getString(), 123, null, true); + BdfList body = BdfList.of(BdfList.of(state), 345); + validator.validateMessage(message, group, body); + } + + @Test(expected = FormatException.class) + public void testRejectsNonLongMinorVersion() throws Exception { + BdfList state = BdfList.of(clientId.getString(), 123, "234", true); + BdfList body = BdfList.of(BdfList.of(state), 345); + validator.validateMessage(message, group, body); + } + + @Test(expected = FormatException.class) + public void testRejectsNegativeMinorVersion() throws Exception { + BdfList state = BdfList.of(clientId.getString(), 123, -1, true); + BdfList body = BdfList.of(BdfList.of(state), 345); + validator.validateMessage(message, group, body); + } + + @Test + public void testAcceptsZeroMinorVersion() throws Exception { + BdfList state = BdfList.of(clientId.getString(), 123, 0, true); + BdfList body = BdfList.of(BdfList.of(state), 345); + BdfMessageContext context = + validator.validateMessage(message, group, body); + assertEquals(emptyList(), context.getDependencies()); + BdfDictionary expectedMeta = BdfDictionary.of( + new BdfEntry(MSG_KEY_UPDATE_VERSION, 345L), + new BdfEntry(MSG_KEY_LOCAL, false)); + assertEquals(expectedMeta, context.getDictionary()); + } + + @Test(expected = FormatException.class) + public void testRejectsNullActiveFlag() throws Exception { + BdfList state = BdfList.of(clientId.getString(), 123, 234, null); + BdfList body = BdfList.of(BdfList.of(state), 345); + validator.validateMessage(message, group, body); + } + + @Test(expected = FormatException.class) + public void testRejectsNonBooleanActiveFlag() throws Exception { + BdfList state = BdfList.of(clientId.getString(), 123, 234, "true"); + BdfList body = BdfList.of(BdfList.of(state), 345); + validator.validateMessage(message, group, body); + } + + @Test + public void testAcceptsNegativeActiveFlag() throws Exception { + BdfList state = BdfList.of(clientId.getString(), 123, 234, false); + BdfList body = BdfList.of(BdfList.of(state), 345); + BdfMessageContext context = + validator.validateMessage(message, group, body); + assertEquals(emptyList(), context.getDependencies()); + BdfDictionary expectedMeta = BdfDictionary.of( + new BdfEntry(MSG_KEY_UPDATE_VERSION, 345L), + new BdfEntry(MSG_KEY_LOCAL, false)); + assertEquals(expectedMeta, context.getDictionary()); + } +} From ebaa50b1012b0f98e36d4007a1271050f7dd1058 Mon Sep 17 00:00:00 2001 From: akwizgran Date: Tue, 24 Apr 2018 15:02:13 +0100 Subject: [PATCH 27/33] Don't send redundant updates to new contacts. --- .../versioning/ClientVersioningManagerImpl.java | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/bramble-core/src/main/java/org/briarproject/bramble/versioning/ClientVersioningManagerImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/versioning/ClientVersioningManagerImpl.java index 7f3a96f1f..1af256a3c 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/versioning/ClientVersioningManagerImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/versioning/ClientVersioningManagerImpl.java @@ -305,14 +305,17 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, Client, Update oldLocalUpdate = loadUpdate(txn, latest.local.messageId); List oldLocalStates = oldLocalUpdate.states; long oldLocalUpdateVersion = oldLocalUpdate.updateVersion; - // Delete the latest local update - db.deleteMessage(txn, latest.local.messageId); - db.deleteMessageMetadata(txn, latest.local.messageId); - // Store a new local update + // Update the local states if necessary List newLocalStates = updateStatesFromLocalVersions(oldLocalStates, versions); - storeUpdate(txn, g.getId(), newLocalStates, - oldLocalUpdateVersion + 1); + if (!oldLocalStates.equals(newLocalStates)) { + // Delete the latest local update + db.deleteMessage(txn, latest.local.messageId); + db.deleteMessageMetadata(txn, latest.local.messageId); + // Store a new local update + storeUpdate(txn, g.getId(), newLocalStates, + oldLocalUpdateVersion + 1); + } // Load and parse the latest remote update, if any List remoteStates; if (latest.remote == null) remoteStates = emptyList(); From 36b191e9d4941dc0afb0203b3bf402c15943ac66 Mon Sep 17 00:00:00 2001 From: akwizgran Date: Tue, 24 Apr 2018 15:43:45 +0100 Subject: [PATCH 28/33] Use remote states to update local states at startup. --- .../versioning/ClientVersioningManagerImpl.java | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/bramble-core/src/main/java/org/briarproject/bramble/versioning/ClientVersioningManagerImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/versioning/ClientVersioningManagerImpl.java index 1af256a3c..3d028196e 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/versioning/ClientVersioningManagerImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/versioning/ClientVersioningManagerImpl.java @@ -305,9 +305,15 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, Client, Update oldLocalUpdate = loadUpdate(txn, latest.local.messageId); List oldLocalStates = oldLocalUpdate.states; long oldLocalUpdateVersion = oldLocalUpdate.updateVersion; + // Load and parse the latest remote update, if any + List remoteStates; + if (latest.remote == null) remoteStates = emptyList(); + else remoteStates = loadUpdate(txn, latest.remote.messageId).states; // Update the local states if necessary List newLocalStates = updateStatesFromLocalVersions(oldLocalStates, versions); + newLocalStates = updateStatesFromRemoteStates(newLocalStates, + remoteStates); if (!oldLocalStates.equals(newLocalStates)) { // Delete the latest local update db.deleteMessage(txn, latest.local.messageId); @@ -316,10 +322,6 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, Client, storeUpdate(txn, g.getId(), newLocalStates, oldLocalUpdateVersion + 1); } - // Load and parse the latest remote update, if any - List remoteStates; - if (latest.remote == null) remoteStates = emptyList(); - else remoteStates = loadUpdate(txn, latest.remote.messageId).states; // Calculate the old and new client visibilities Map before = getVisibilities(oldLocalStates, remoteStates); @@ -442,7 +444,8 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, Client, for (ClientState local : localStates) { ClientState remote = remoteMap.get(local.majorVersion); if (remote == null) visibilities.put(local.majorVersion, INVISIBLE); - else if (remote.active) visibilities.put(local.majorVersion, SHARED); + else if (remote.active) + visibilities.put(local.majorVersion, SHARED); else visibilities.put(local.majorVersion, VISIBLE); } return visibilities; From 97f40bd20bf3f44d662f89149a19c3007347f402 Mon Sep 17 00:00:00 2001 From: akwizgran Date: Tue, 24 Apr 2018 16:45:28 +0100 Subject: [PATCH 29/33] Check whether hooks need to be called before loading contact. --- .../bramble/versioning/ClientVersioningManagerImpl.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/bramble-core/src/main/java/org/briarproject/bramble/versioning/ClientVersioningManagerImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/versioning/ClientVersioningManagerImpl.java index 3d028196e..002001d7e 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/versioning/ClientVersioningManagerImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/versioning/ClientVersioningManagerImpl.java @@ -217,8 +217,10 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, Client, Map after = getVisibilities(newLocalStates, newRemoteStates); // Call hooks for any visibilities that have changed - Contact c = getContact(txn, m.getGroupId()); - callVisibilityHooks(txn, c, before, after); + if (!before.equals(after)) { + Contact c = getContact(txn, m.getGroupId()); + callVisibilityHooks(txn, c, before, after); + } } catch (FormatException e) { throw new InvalidMessageException(e); } From fb6b487212e4d564ddcb3d7565329b72627c9051 Mon Sep 17 00:00:00 2001 From: akwizgran Date: Tue, 24 Apr 2018 17:31:21 +0100 Subject: [PATCH 30/33] Unit tests for client versioning manager. --- .../ClientVersioningManagerImplTest.java | 669 ++++++++++++++++++ 1 file changed, 669 insertions(+) create mode 100644 bramble-core/src/test/java/org/briarproject/bramble/versioning/ClientVersioningManagerImplTest.java diff --git a/bramble-core/src/test/java/org/briarproject/bramble/versioning/ClientVersioningManagerImplTest.java b/bramble-core/src/test/java/org/briarproject/bramble/versioning/ClientVersioningManagerImplTest.java new file mode 100644 index 000000000..7494873d9 --- /dev/null +++ b/bramble-core/src/test/java/org/briarproject/bramble/versioning/ClientVersioningManagerImplTest.java @@ -0,0 +1,669 @@ +package org.briarproject.bramble.versioning; + +import org.briarproject.bramble.api.client.ClientHelper; +import org.briarproject.bramble.api.client.ContactGroupFactory; +import org.briarproject.bramble.api.contact.Contact; +import org.briarproject.bramble.api.contact.ContactId; +import org.briarproject.bramble.api.data.BdfDictionary; +import org.briarproject.bramble.api.data.BdfEntry; +import org.briarproject.bramble.api.data.BdfList; +import org.briarproject.bramble.api.db.DatabaseComponent; +import org.briarproject.bramble.api.db.Metadata; +import org.briarproject.bramble.api.db.Transaction; +import org.briarproject.bramble.api.sync.ClientId; +import org.briarproject.bramble.api.sync.Group; +import org.briarproject.bramble.api.sync.Group.Visibility; +import org.briarproject.bramble.api.sync.Message; +import org.briarproject.bramble.api.sync.MessageId; +import org.briarproject.bramble.api.system.Clock; +import org.briarproject.bramble.api.versioning.ClientVersioningManager.ClientVersioningHook; +import org.briarproject.bramble.test.BrambleMockTestCase; +import org.jmock.Expectations; +import org.junit.Test; + +import java.util.HashMap; +import java.util.Map; + +import static java.util.Collections.emptyList; +import static java.util.Collections.singletonList; +import static java.util.Collections.singletonMap; +import static org.briarproject.bramble.api.sync.Group.Visibility.INVISIBLE; +import static org.briarproject.bramble.api.sync.Group.Visibility.SHARED; +import static org.briarproject.bramble.api.sync.Group.Visibility.VISIBLE; +import static org.briarproject.bramble.api.versioning.ClientVersioningManager.CLIENT_ID; +import static org.briarproject.bramble.api.versioning.ClientVersioningManager.MAJOR_VERSION; +import static org.briarproject.bramble.test.TestUtils.getAuthor; +import static org.briarproject.bramble.test.TestUtils.getClientId; +import static org.briarproject.bramble.test.TestUtils.getGroup; +import static org.briarproject.bramble.test.TestUtils.getLocalAuthor; +import static org.briarproject.bramble.test.TestUtils.getMessage; +import static org.briarproject.bramble.test.TestUtils.getRandomId; +import static org.briarproject.bramble.versioning.ClientVersioningConstants.GROUP_KEY_CONTACT_ID; +import static org.briarproject.bramble.versioning.ClientVersioningConstants.MSG_KEY_LOCAL; +import static org.briarproject.bramble.versioning.ClientVersioningConstants.MSG_KEY_UPDATE_VERSION; +import static org.junit.Assert.assertFalse; + +public class ClientVersioningManagerImplTest extends BrambleMockTestCase { + + private final DatabaseComponent db = context.mock(DatabaseComponent.class); + private final ClientHelper clientHelper = context.mock(ClientHelper.class); + private final ContactGroupFactory contactGroupFactory = + context.mock(ContactGroupFactory.class); + private final Clock clock = context.mock(Clock.class); + private final ClientVersioningHook hook = + context.mock(ClientVersioningHook.class); + + private final Group localGroup = getGroup(CLIENT_ID, MAJOR_VERSION); + private final Group contactGroup = getGroup(CLIENT_ID, MAJOR_VERSION); + private final Contact contact = new Contact(new ContactId(123), + getAuthor(), getLocalAuthor().getId(), true, true); + private final ClientId clientId = getClientId(); + private final long now = System.currentTimeMillis(); + private final Transaction txn = new Transaction(null, false); + + private ClientVersioningManagerImpl createInstance() throws Exception { + context.checking(new Expectations() {{ + oneOf(contactGroupFactory).createLocalGroup(CLIENT_ID, + MAJOR_VERSION); + will(returnValue(localGroup)); + }}); + return new ClientVersioningManagerImpl(db, clientHelper, + contactGroupFactory, clock); + } + + @Test + public void testCreatesGroupsAtStartup() throws Exception { + context.checking(new Expectations() {{ + oneOf(db).containsGroup(txn, localGroup.getId()); + will(returnValue(false)); + oneOf(db).addGroup(txn, localGroup); + oneOf(db).getContacts(txn); + will(returnValue(singletonList(contact))); + }}); + expectAddingContact(); + + ClientVersioningManagerImpl c = createInstance(); + c.createLocalState(txn); + } + + @Test + public void testDoesNotCreateGroupsAtStartupIfAlreadyCreated() + throws Exception { + context.checking(new Expectations() {{ + oneOf(db).containsGroup(txn, localGroup.getId()); + will(returnValue(true)); + }}); + + ClientVersioningManagerImpl c = createInstance(); + c.createLocalState(txn); + } + + @Test + public void testCreatesContactGroupWhenAddingContact() throws Exception { + expectAddingContact(); + + ClientVersioningManagerImpl c = createInstance(); + c.addingContact(txn, contact); + } + + private void expectAddingContact() throws Exception { + BdfDictionary groupMeta = BdfDictionary.of( + new BdfEntry(GROUP_KEY_CONTACT_ID, contact.getId().getInt())); + long now = System.currentTimeMillis(); + BdfList localUpdateBody = BdfList.of(new BdfList(), 1L); + Message localUpdate = getMessage(contactGroup.getId()); + BdfDictionary localUpdateMeta = BdfDictionary.of( + new BdfEntry(MSG_KEY_UPDATE_VERSION, 1L), + new BdfEntry(MSG_KEY_LOCAL, true)); + + context.checking(new Expectations() {{ + oneOf(contactGroupFactory).createContactGroup(CLIENT_ID, + MAJOR_VERSION, contact); + will(returnValue(contactGroup)); + oneOf(db).addGroup(txn, contactGroup); + oneOf(db).setGroupVisibility(txn, contact.getId(), + contactGroup.getId(), SHARED); + oneOf(clientHelper).mergeGroupMetadata(txn, contactGroup.getId(), + groupMeta); + oneOf(clock).currentTimeMillis(); + will(returnValue(now)); + oneOf(clientHelper).createMessage(contactGroup.getId(), now, + localUpdateBody); + will(returnValue(localUpdate)); + oneOf(clientHelper).addLocalMessage(txn, localUpdate, + localUpdateMeta, true); + }}); + } + + @Test + public void testRemovesGroupWhenRemovingContact() throws Exception { + context.checking(new Expectations() {{ + oneOf(contactGroupFactory).createContactGroup(CLIENT_ID, + MAJOR_VERSION, contact); + will(returnValue(contactGroup)); + oneOf(db).removeGroup(txn, contactGroup); + }}); + + ClientVersioningManagerImpl c = createInstance(); + c.removingContact(txn, contact); + } + + @Test + public void testStoresClientVersionsAtFirstStartup() throws Exception { + BdfList localVersionsBody = + BdfList.of(BdfList.of(clientId.getString(), 123, 234)); + Message localVersions = getMessage(localGroup.getId()); + MessageId localUpdateId = new MessageId(getRandomId()); + BdfDictionary localUpdateMeta = BdfDictionary.of( + new BdfEntry(MSG_KEY_UPDATE_VERSION, 1L), + new BdfEntry(MSG_KEY_LOCAL, true)); + BdfList localUpdateBody = BdfList.of(BdfList.of( + BdfList.of(clientId.getString(), 123, 234, false)), 1L); + + context.checking(new Expectations() {{ + oneOf(db).startTransaction(false); + will(returnValue(txn)); + // No client versions have been stored yet + oneOf(db).getMessageIds(txn, localGroup.getId()); + will(returnValue(emptyList())); + // Store the client versions + oneOf(clock).currentTimeMillis(); + will(returnValue(now)); + oneOf(clientHelper).createMessage(localGroup.getId(), now, + localVersionsBody); + will(returnValue(localVersions)); + oneOf(db).addLocalMessage(txn, localVersions, new Metadata(), + false); + // Inform contacts that client versions have changed + oneOf(db).getContacts(txn); + will(returnValue(singletonList(contact))); + oneOf(contactGroupFactory).createContactGroup(CLIENT_ID, + MAJOR_VERSION, contact); + will(returnValue(contactGroup)); + // Find the latest local and remote updates (no remote update) + oneOf(clientHelper).getMessageMetadataAsDictionary(txn, + contactGroup.getId()); + will(returnValue(singletonMap(localUpdateId, localUpdateMeta))); + // Load the latest local update + oneOf(clientHelper).getMessageAsList(txn, localUpdateId); + will(returnValue(localUpdateBody)); + // Latest local update is up-to-date, no visibilities have changed + oneOf(db).commitTransaction(txn); + oneOf(db).endTransaction(txn); + }}); + + ClientVersioningManagerImpl c = createInstance(); + c.registerClient(clientId, 123, 234, hook); + c.startService(); + } + + @Test + public void testComparesClientVersionsAtSubsequentStartup() + throws Exception { + MessageId localVersionsId = new MessageId(getRandomId()); + BdfList localVersionsBody = + BdfList.of(BdfList.of(clientId.getString(), 123, 234)); + + context.checking(new Expectations() {{ + oneOf(db).startTransaction(false); + will(returnValue(txn)); + // Load the old client versions + oneOf(db).getMessageIds(txn, localGroup.getId()); + will(returnValue(singletonList(localVersionsId))); + oneOf(clientHelper).getMessageAsList(txn, localVersionsId); + will(returnValue(localVersionsBody)); + // Client versions are up-to-date + oneOf(db).commitTransaction(txn); + oneOf(db).endTransaction(txn); + }}); + + ClientVersioningManagerImpl c = createInstance(); + c.registerClient(clientId, 123, 234, hook); + c.startService(); + } + + @Test + public void testStoresClientVersionsAtSubsequentStartupIfChanged() + throws Exception { + // The client had minor version 234 in the old client versions + BdfList oldLocalVersionsBody = + BdfList.of(BdfList.of(clientId.getString(), 123, 234)); + // The client has minor version 345 in the new client versions + BdfList newLocalVersionsBody = + BdfList.of(BdfList.of(clientId.getString(), 123, 345)); + // The client had minor version 234 in the old local update + BdfList oldLocalUpdateBody = BdfList.of(BdfList.of( + BdfList.of(clientId.getString(), 123, 234, false)), 1L); + // The client has minor version 345 in the new local update + BdfList newLocalUpdateBody = BdfList.of(BdfList.of( + BdfList.of(clientId.getString(), 123, 345, false)), 2L); + + MessageId oldLocalVersionsId = new MessageId(getRandomId()); + Message newLocalVersions = getMessage(localGroup.getId()); + MessageId oldLocalUpdateId = new MessageId(getRandomId()); + BdfDictionary oldLocalUpdateMeta = BdfDictionary.of( + new BdfEntry(MSG_KEY_UPDATE_VERSION, 1L), + new BdfEntry(MSG_KEY_LOCAL, true)); + Message newLocalUpdate = getMessage(contactGroup.getId()); + BdfDictionary newLocalUpdateMeta = BdfDictionary.of( + new BdfEntry(MSG_KEY_UPDATE_VERSION, 2L), + new BdfEntry(MSG_KEY_LOCAL, true)); + + context.checking(new Expectations() {{ + oneOf(db).startTransaction(false); + will(returnValue(txn)); + // Load the old client versions + oneOf(db).getMessageIds(txn, localGroup.getId()); + will(returnValue(singletonList(oldLocalVersionsId))); + oneOf(clientHelper).getMessageAsList(txn, oldLocalVersionsId); + will(returnValue(oldLocalVersionsBody)); + // Delete the old client versions + oneOf(db).removeMessage(txn, oldLocalVersionsId); + // Store the new client versions + oneOf(clock).currentTimeMillis(); + will(returnValue(now)); + oneOf(clientHelper).createMessage(localGroup.getId(), now, + newLocalVersionsBody); + will(returnValue(newLocalVersions)); + oneOf(db).addLocalMessage(txn, newLocalVersions, new Metadata(), + false); + // Inform contacts that client versions have changed + oneOf(db).getContacts(txn); + will(returnValue(singletonList(contact))); + oneOf(contactGroupFactory).createContactGroup(CLIENT_ID, + MAJOR_VERSION, contact); + will(returnValue(contactGroup)); + // Find the latest local and remote updates (no remote update) + oneOf(clientHelper).getMessageMetadataAsDictionary(txn, + contactGroup.getId()); + will(returnValue(singletonMap(oldLocalUpdateId, + oldLocalUpdateMeta))); + // Load the latest local update + oneOf(clientHelper).getMessageAsList(txn, oldLocalUpdateId); + will(returnValue(oldLocalUpdateBody)); + // Delete the latest local update + oneOf(db).deleteMessage(txn, oldLocalUpdateId); + oneOf(db).deleteMessageMetadata(txn, oldLocalUpdateId); + // Store the new local update + oneOf(clock).currentTimeMillis(); + will(returnValue(now)); + oneOf(clientHelper).createMessage(contactGroup.getId(), now, + newLocalUpdateBody); + will(returnValue(newLocalUpdate)); + oneOf(clientHelper).addLocalMessage(txn, newLocalUpdate, + newLocalUpdateMeta, true); + // No visibilities have changed + oneOf(db).commitTransaction(txn); + oneOf(db).endTransaction(txn); + }}); + + ClientVersioningManagerImpl c = createInstance(); + c.registerClient(clientId, 123, 345, hook); + c.startService(); + } + + @Test + public void testActivatesNewClientAtStartupIfAlreadyAdvertisedByContact() + throws Exception { + testActivatesNewClientAtStartup(false, VISIBLE); + } + + @Test + public void testActivatesNewClientAtStartupIfAlreadyActivatedByContact() + throws Exception { + testActivatesNewClientAtStartup(true, SHARED); + } + + private void testActivatesNewClientAtStartup(boolean remoteActive, + Visibility visibility) throws Exception { + // The client was missing from the old client versions + BdfList oldLocalVersionsBody = new BdfList(); + // The client is included in the new client versions + BdfList newLocalVersionsBody = + BdfList.of(BdfList.of(clientId.getString(), 123, 234)); + // The client was missing from the old local update + BdfList oldLocalUpdateBody = BdfList.of(new BdfList(), 1L); + // The client was included in the old remote update + BdfList oldRemoteUpdateBody = BdfList.of(BdfList.of( + BdfList.of(clientId.getString(), 123, 345, remoteActive)), 1L); + // The client is active in the new local update + BdfList newLocalUpdateBody = BdfList.of(BdfList.of( + BdfList.of(clientId.getString(), 123, 234, true)), 2L); + + MessageId oldLocalVersionsId = new MessageId(getRandomId()); + Message newLocalVersions = getMessage(localGroup.getId()); + MessageId oldLocalUpdateId = new MessageId(getRandomId()); + BdfDictionary oldLocalUpdateMeta = BdfDictionary.of( + new BdfEntry(MSG_KEY_UPDATE_VERSION, 1L), + new BdfEntry(MSG_KEY_LOCAL, true)); + MessageId oldRemoteUpdateId = new MessageId(getRandomId()); + BdfDictionary oldRemoteUpdateMeta = BdfDictionary.of( + new BdfEntry(MSG_KEY_UPDATE_VERSION, 1L), + new BdfEntry(MSG_KEY_LOCAL, false)); + Map messageMetadata = new HashMap<>(); + messageMetadata.put(oldLocalUpdateId, oldLocalUpdateMeta); + messageMetadata.put(oldRemoteUpdateId, oldRemoteUpdateMeta); + Message newLocalUpdate = getMessage(localGroup.getId()); + BdfDictionary newLocalUpdateMeta = BdfDictionary.of( + new BdfEntry(MSG_KEY_UPDATE_VERSION, 2L), + new BdfEntry(MSG_KEY_LOCAL, true)); + + context.checking(new Expectations() {{ + oneOf(db).startTransaction(false); + will(returnValue(txn)); + // Load the old client versions + oneOf(db).getMessageIds(txn, localGroup.getId()); + will(returnValue(singletonList(oldLocalVersionsId))); + oneOf(clientHelper).getMessageAsList(txn, oldLocalVersionsId); + will(returnValue(oldLocalVersionsBody)); + // Delete the old client versions + oneOf(db).removeMessage(txn, oldLocalVersionsId); + // Store the new client versions + oneOf(clock).currentTimeMillis(); + will(returnValue(now)); + oneOf(clientHelper).createMessage(localGroup.getId(), now, + newLocalVersionsBody); + will(returnValue(newLocalVersions)); + oneOf(db).addLocalMessage(txn, newLocalVersions, new Metadata(), + false); + // Inform contacts that client versions have changed + oneOf(db).getContacts(txn); + will(returnValue(singletonList(contact))); + oneOf(contactGroupFactory).createContactGroup(CLIENT_ID, + MAJOR_VERSION, contact); + will(returnValue(contactGroup)); + // Find the latest local and remote updates + oneOf(clientHelper).getMessageMetadataAsDictionary(txn, + contactGroup.getId()); + will(returnValue(messageMetadata)); + // Load the latest local update + oneOf(clientHelper).getMessageAsList(txn, oldLocalUpdateId); + will(returnValue(oldLocalUpdateBody)); + // Load the latest remote update + oneOf(clientHelper).getMessageAsList(txn, oldRemoteUpdateId); + will(returnValue(oldRemoteUpdateBody)); + // Delete the latest local update + oneOf(db).deleteMessage(txn, oldLocalUpdateId); + oneOf(db).deleteMessageMetadata(txn, oldLocalUpdateId); + // Store the new local update + oneOf(clock).currentTimeMillis(); + will(returnValue(now)); + oneOf(clientHelper).createMessage(contactGroup.getId(), now, + newLocalUpdateBody); + will(returnValue(newLocalUpdate)); + oneOf(clientHelper).addLocalMessage(txn, newLocalUpdate, + newLocalUpdateMeta, true); + // The client's visibility has changed + oneOf(hook).onClientVisibilityChanging(txn, contact, visibility); + oneOf(db).commitTransaction(txn); + oneOf(db).endTransaction(txn); + }}); + + ClientVersioningManagerImpl c = createInstance(); + c.registerClient(clientId, 123, 234, hook); + c.startService(); + } + + @Test + public void testDeletesObsoleteRemoteUpdate() throws Exception { + Message newRemoteUpdate = getMessage(contactGroup.getId()); + BdfList newRemoteUpdateBody = BdfList.of(new BdfList(), 1L); + MessageId oldLocalUpdateId = new MessageId(getRandomId()); + BdfDictionary oldLocalUpdateMeta = BdfDictionary.of( + new BdfEntry(MSG_KEY_UPDATE_VERSION, 1L), + new BdfEntry(MSG_KEY_LOCAL, true)); + MessageId oldRemoteUpdateId = new MessageId(getRandomId()); + BdfDictionary oldRemoteUpdateMeta = BdfDictionary.of( + new BdfEntry(MSG_KEY_UPDATE_VERSION, 2L), + new BdfEntry(MSG_KEY_LOCAL, false)); + Map messageMetadata = new HashMap<>(); + messageMetadata.put(oldLocalUpdateId, oldLocalUpdateMeta); + messageMetadata.put(oldRemoteUpdateId, oldRemoteUpdateMeta); + + context.checking(new Expectations() {{ + oneOf(clientHelper).toList(newRemoteUpdate); + will(returnValue(newRemoteUpdateBody)); + // Find the latest local and remote updates + oneOf(clientHelper).getMessageMetadataAsDictionary(txn, + contactGroup.getId()); + will(returnValue(messageMetadata)); + // Delete the new remote update, which is obsolete + oneOf(db).deleteMessage(txn, newRemoteUpdate.getId()); + oneOf(db).deleteMessageMetadata(txn, newRemoteUpdate.getId()); + }}); + + ClientVersioningManagerImpl c = createInstance(); + c.registerClient(clientId, 123, 234, hook); + assertFalse(c.incomingMessage(txn, newRemoteUpdate, new Metadata())); + } + + @Test + public void testDeletesPreviousRemoteUpdate() throws Exception { + Message newRemoteUpdate = getMessage(contactGroup.getId()); + BdfList newRemoteUpdateBody = BdfList.of(new BdfList(), 2L); + MessageId oldLocalUpdateId = new MessageId(getRandomId()); + BdfDictionary oldLocalUpdateMeta = BdfDictionary.of( + new BdfEntry(MSG_KEY_UPDATE_VERSION, 1L), + new BdfEntry(MSG_KEY_LOCAL, true)); + MessageId oldRemoteUpdateId = new MessageId(getRandomId()); + BdfDictionary oldRemoteUpdateMeta = BdfDictionary.of( + new BdfEntry(MSG_KEY_UPDATE_VERSION, 1L), + new BdfEntry(MSG_KEY_LOCAL, false)); + Map messageMetadata = new HashMap<>(); + messageMetadata.put(oldLocalUpdateId, oldLocalUpdateMeta); + messageMetadata.put(oldRemoteUpdateId, oldRemoteUpdateMeta); + BdfList oldLocalUpdateBody = BdfList.of(new BdfList(), 1L); + BdfList oldRemoteUpdateBody = BdfList.of(new BdfList(), 1L); + + context.checking(new Expectations() {{ + oneOf(clientHelper).toList(newRemoteUpdate); + will(returnValue(newRemoteUpdateBody)); + // Find the latest local and remote updates + oneOf(clientHelper).getMessageMetadataAsDictionary(txn, + contactGroup.getId()); + will(returnValue(messageMetadata)); + // Load the latest local update + oneOf(clientHelper).getMessageAsList(txn, oldLocalUpdateId); + will(returnValue(oldLocalUpdateBody)); + // Load the latest remote update + oneOf(clientHelper).getMessageAsList(txn, oldRemoteUpdateId); + will(returnValue(oldRemoteUpdateBody)); + // Delete the old remote update + oneOf(db).deleteMessage(txn, oldRemoteUpdateId); + oneOf(db).deleteMessageMetadata(txn, oldRemoteUpdateId); + // No states or visibilities have changed + }}); + + ClientVersioningManagerImpl c = createInstance(); + c.registerClient(clientId, 123, 234, hook); + assertFalse(c.incomingMessage(txn, newRemoteUpdate, new Metadata())); + } + + @Test + public void testAcceptsFirstRemoteUpdate() throws Exception { + Message newRemoteUpdate = getMessage(contactGroup.getId()); + BdfList newRemoteUpdateBody = BdfList.of(new BdfList(), 1L); + MessageId oldLocalUpdateId = new MessageId(getRandomId()); + BdfDictionary oldLocalUpdateMeta = BdfDictionary.of( + new BdfEntry(MSG_KEY_UPDATE_VERSION, 1L), + new BdfEntry(MSG_KEY_LOCAL, true)); + BdfList oldLocalUpdateBody = BdfList.of(new BdfList(), 1L); + + context.checking(new Expectations() {{ + oneOf(clientHelper).toList(newRemoteUpdate); + will(returnValue(newRemoteUpdateBody)); + // Find the latest local and remote updates (no remote update) + oneOf(clientHelper).getMessageMetadataAsDictionary(txn, + contactGroup.getId()); + will(returnValue(singletonMap(oldLocalUpdateId, + oldLocalUpdateMeta))); + // Load the latest local update + oneOf(clientHelper).getMessageAsList(txn, oldLocalUpdateId); + will(returnValue(oldLocalUpdateBody)); + // No states or visibilities have changed + }}); + + ClientVersioningManagerImpl c = createInstance(); + c.registerClient(clientId, 123, 234, hook); + assertFalse(c.incomingMessage(txn, newRemoteUpdate, new Metadata())); + } + + @Test + public void testActivatesClientOnIncomingMessageWhenAdvertisedByContact() + throws Exception { + testActivatesClientOnIncomingMessage(false, VISIBLE); + } + + @Test + public void testActivatesClientOnIncomingMessageWhenActivatedByContact() + throws Exception { + testActivatesClientOnIncomingMessage(true, SHARED); + } + + private void testActivatesClientOnIncomingMessage(boolean remoteActive, + Visibility visibility) throws Exception { + // The client was missing from the old remote update + BdfList oldRemoteUpdateBody = BdfList.of(new BdfList(), 1L); + // The client was inactive in the old local update + BdfList oldLocalUpdateBody = BdfList.of(BdfList.of( + BdfList.of(clientId.getString(), 123, 234, false)), 1L); + // The client is included in the new remote update + BdfList newRemoteUpdateBody = BdfList.of(BdfList.of( + BdfList.of(clientId.getString(), 123, 234, remoteActive)), 2L); + // The client is active in the new local update + BdfList newLocalUpdateBody = BdfList.of(BdfList.of( + BdfList.of(clientId.getString(), 123, 234, true)), 2L); + + Message newRemoteUpdate = getMessage(contactGroup.getId()); + MessageId oldLocalUpdateId = new MessageId(getRandomId()); + BdfDictionary oldLocalUpdateMeta = BdfDictionary.of( + new BdfEntry(MSG_KEY_UPDATE_VERSION, 1L), + new BdfEntry(MSG_KEY_LOCAL, true)); + MessageId oldRemoteUpdateId = new MessageId(getRandomId()); + BdfDictionary oldRemoteUpdateMeta = BdfDictionary.of( + new BdfEntry(MSG_KEY_UPDATE_VERSION, 1L), + new BdfEntry(MSG_KEY_LOCAL, false)); + Map messageMetadata = new HashMap<>(); + messageMetadata.put(oldLocalUpdateId, oldLocalUpdateMeta); + messageMetadata.put(oldRemoteUpdateId, oldRemoteUpdateMeta); + Message newLocalUpdate = getMessage(contactGroup.getId()); + BdfDictionary newLocalUpdateMeta = BdfDictionary.of( + new BdfEntry(MSG_KEY_UPDATE_VERSION, 2L), + new BdfEntry(MSG_KEY_LOCAL, true)); + BdfDictionary groupMeta = BdfDictionary.of( + new BdfEntry(GROUP_KEY_CONTACT_ID, contact.getId().getInt())); + + context.checking(new Expectations() {{ + oneOf(clientHelper).toList(newRemoteUpdate); + will(returnValue(newRemoteUpdateBody)); + // Find the latest local and remote updates + oneOf(clientHelper).getMessageMetadataAsDictionary(txn, + contactGroup.getId()); + will(returnValue(messageMetadata)); + // Load the latest local update + oneOf(clientHelper).getMessageAsList(txn, oldLocalUpdateId); + will(returnValue(oldLocalUpdateBody)); + // Load the latest remote update + oneOf(clientHelper).getMessageAsList(txn, oldRemoteUpdateId); + will(returnValue(oldRemoteUpdateBody)); + // Delete the old remote update + oneOf(db).deleteMessage(txn, oldRemoteUpdateId); + oneOf(db).deleteMessageMetadata(txn, oldRemoteUpdateId); + // Delete the old local update + oneOf(db).deleteMessage(txn, oldLocalUpdateId); + oneOf(db).deleteMessageMetadata(txn, oldLocalUpdateId); + // Store the new local update + oneOf(clock).currentTimeMillis(); + will(returnValue(now)); + oneOf(clientHelper).createMessage(contactGroup.getId(), now, + newLocalUpdateBody); + will(returnValue(newLocalUpdate)); + oneOf(clientHelper).addLocalMessage(txn, newLocalUpdate, + newLocalUpdateMeta, true); + // The client's visibility has changed + oneOf(clientHelper).getGroupMetadataAsDictionary(txn, + contactGroup.getId()); + will(returnValue(groupMeta)); + oneOf(db).getContact(txn, contact.getId()); + will(returnValue(contact)); + oneOf(hook).onClientVisibilityChanging(txn, contact, visibility); + }}); + + ClientVersioningManagerImpl c = createInstance(); + c.registerClient(clientId, 123, 234, hook); + assertFalse(c.incomingMessage(txn, newRemoteUpdate, new Metadata())); + } + + @Test + public void testDeactivatesClientOnIncomingMessage() throws Exception { + // The client was active in the old local and remote updates + BdfList oldLocalUpdateBody = BdfList.of(BdfList.of( + BdfList.of(clientId.getString(), 123, 234, true)), 1L); + BdfList oldRemoteUpdateBody = BdfList.of(BdfList.of( + BdfList.of(clientId.getString(), 123, 234, true)), 1L); + // The client is missing from the new remote update + BdfList newRemoteUpdateBody = BdfList.of(new BdfList(), 2L); + // The client is inactive in the new local update + BdfList newLocalUpdateBody = BdfList.of(BdfList.of( + BdfList.of(clientId.getString(), 123, 234, false)), 2L); + + Message newRemoteUpdate = getMessage(contactGroup.getId()); + MessageId oldLocalUpdateId = new MessageId(getRandomId()); + BdfDictionary oldLocalUpdateMeta = BdfDictionary.of( + new BdfEntry(MSG_KEY_UPDATE_VERSION, 1L), + new BdfEntry(MSG_KEY_LOCAL, true)); + MessageId oldRemoteUpdateId = new MessageId(getRandomId()); + BdfDictionary oldRemoteUpdateMeta = BdfDictionary.of( + new BdfEntry(MSG_KEY_UPDATE_VERSION, 1L), + new BdfEntry(MSG_KEY_LOCAL, false)); + Map messageMetadata = new HashMap<>(); + messageMetadata.put(oldLocalUpdateId, oldLocalUpdateMeta); + messageMetadata.put(oldRemoteUpdateId, oldRemoteUpdateMeta); + Message newLocalUpdate = getMessage(contactGroup.getId()); + BdfDictionary newLocalUpdateMeta = BdfDictionary.of( + new BdfEntry(MSG_KEY_UPDATE_VERSION, 2L), + new BdfEntry(MSG_KEY_LOCAL, true)); + BdfDictionary groupMeta = BdfDictionary.of( + new BdfEntry(GROUP_KEY_CONTACT_ID, contact.getId().getInt())); + + context.checking(new Expectations() {{ + oneOf(clientHelper).toList(newRemoteUpdate); + will(returnValue(newRemoteUpdateBody)); + // Find the latest local and remote updates + oneOf(clientHelper).getMessageMetadataAsDictionary(txn, + contactGroup.getId()); + will(returnValue(messageMetadata)); + // Load the latest local update + oneOf(clientHelper).getMessageAsList(txn, oldLocalUpdateId); + will(returnValue(oldLocalUpdateBody)); + // Load the latest remote update + oneOf(clientHelper).getMessageAsList(txn, oldRemoteUpdateId); + will(returnValue(oldRemoteUpdateBody)); + // Delete the old remote update + oneOf(db).deleteMessage(txn, oldRemoteUpdateId); + oneOf(db).deleteMessageMetadata(txn, oldRemoteUpdateId); + // Delete the old local update + oneOf(db).deleteMessage(txn, oldLocalUpdateId); + oneOf(db).deleteMessageMetadata(txn, oldLocalUpdateId); + // Store the new local update + oneOf(clock).currentTimeMillis(); + will(returnValue(now)); + oneOf(clientHelper).createMessage(contactGroup.getId(), now, + newLocalUpdateBody); + will(returnValue(newLocalUpdate)); + oneOf(clientHelper).addLocalMessage(txn, newLocalUpdate, + newLocalUpdateMeta, true); + // The client's visibility has changed + oneOf(clientHelper).getGroupMetadataAsDictionary(txn, + contactGroup.getId()); + will(returnValue(groupMeta)); + oneOf(db).getContact(txn, contact.getId()); + will(returnValue(contact)); + oneOf(hook).onClientVisibilityChanging(txn, contact, INVISIBLE); + }}); + + ClientVersioningManagerImpl c = createInstance(); + c.registerClient(clientId, 123, 234, hook); + assertFalse(c.incomingMessage(txn, newRemoteUpdate, new Metadata())); + } +} From c55bef95ce4a28eb787035bb0a3f535664d970af Mon Sep 17 00:00:00 2001 From: akwizgran Date: Fri, 27 Apr 2018 18:20:04 +0100 Subject: [PATCH 31/33] Fix rebasing mistakes. --- .../bramble/test/ValidatorTestCase.java | 2 +- .../introduction/IntroductionCryptoImpl.java | 4 +- .../introduction/IntroductionManagerImpl.java | 63 +++++++++---------- .../MessageEncoderParserIntegrationTest.java | 6 +- 4 files changed, 37 insertions(+), 38 deletions(-) diff --git a/bramble-core/src/test/java/org/briarproject/bramble/test/ValidatorTestCase.java b/bramble-core/src/test/java/org/briarproject/bramble/test/ValidatorTestCase.java index 66a4a3b56..9958573de 100644 --- a/bramble-core/src/test/java/org/briarproject/bramble/test/ValidatorTestCase.java +++ b/bramble-core/src/test/java/org/briarproject/bramble/test/ValidatorTestCase.java @@ -24,7 +24,7 @@ public abstract class ValidatorTestCase extends BrambleMockTestCase { context.mock(MetadataEncoder.class); protected final Clock clock = context.mock(Clock.class); - protected final Group group = getGroup(getClientId()); + protected final Group group = getGroup(getClientId(), 123); protected final GroupId groupId = group.getId(); protected final byte[] descriptor = group.getDescriptor(); protected final Message message = getMessage(groupId); diff --git a/briar-core/src/main/java/org/briarproject/briar/introduction/IntroductionCryptoImpl.java b/briar-core/src/main/java/org/briarproject/briar/introduction/IntroductionCryptoImpl.java index f9d53323b..d892c58b3 100644 --- a/briar-core/src/main/java/org/briarproject/briar/introduction/IntroductionCryptoImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/introduction/IntroductionCryptoImpl.java @@ -29,7 +29,7 @@ import static org.briarproject.briar.api.introduction.IntroductionConstants.LABE import static org.briarproject.briar.api.introduction.IntroductionConstants.LABEL_BOB_MAC_KEY; import static org.briarproject.briar.api.introduction.IntroductionConstants.LABEL_MASTER_KEY; import static org.briarproject.briar.api.introduction.IntroductionConstants.LABEL_SESSION_ID; -import static org.briarproject.briar.api.introduction.IntroductionManager.CLIENT_VERSION; +import static org.briarproject.briar.api.introduction.IntroductionManager.MAJOR_VERSION; import static org.briarproject.briar.introduction.IntroduceeSession.Local; @Immutable @@ -94,7 +94,7 @@ class IntroductionCryptoImpl implements IntroductionCrypto { LABEL_MASTER_KEY, remoteEphemeralPublicKey, keyPair, - new byte[] {CLIENT_VERSION}, + new byte[] {MAJOR_VERSION}, alice ? publicKey : remotePublicKey, alice ? remotePublicKey : publicKey ); diff --git a/briar-core/src/main/java/org/briarproject/briar/introduction/IntroductionManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/introduction/IntroductionManagerImpl.java index ce6b40c2a..ad746ddb4 100644 --- a/briar-core/src/main/java/org/briarproject/briar/introduction/IntroductionManagerImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/introduction/IntroductionManagerImpl.java @@ -42,13 +42,11 @@ import java.util.Collection; import java.util.List; 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 org.briarproject.briar.api.introduction.Role.INTRODUCEE; import static org.briarproject.briar.api.introduction.Role.INTRODUCER; import static org.briarproject.briar.introduction.IntroducerState.START; @@ -66,9 +64,6 @@ class IntroductionManagerImpl extends ConversationClientImpl implements IntroductionManager, Client, ContactHook, ClientVersioningHook { - private static final Logger LOG = - Logger.getLogger(IntroductionManagerImpl.class.getName()); - private final ClientVersioningManager clientVersioningManager; private final ContactGroupFactory contactGroupFactory; private final ContactManager contactManager; @@ -83,8 +78,12 @@ class IntroductionManagerImpl extends ConversationClientImpl private final Group localGroup; @Inject - IntroductionManagerImpl(DatabaseComponent db, ClientHelper clientHelper, - ClientVersioningManager clientVersioningManager,MetadataParser metadataParser, MessageTracker messageTracker, + IntroductionManagerImpl( + DatabaseComponent db, + ClientHelper clientHelper, + ClientVersioningManager clientVersioningManager, + MetadataParser metadataParser, + MessageTracker messageTracker, ContactGroupFactory contactGroupFactory, ContactManager contactManager, MessageParser messageParser, @@ -106,7 +105,7 @@ class IntroductionManagerImpl extends ConversationClientImpl this.crypto = crypto; this.identityManager = identityManager; this.localGroup = - contactGroupFactory.createLocalGroup(CLIENT_ID, CLIENT_VERSION); + contactGroupFactory.createLocalGroup(CLIENT_ID, MAJOR_VERSION); } @Override @@ -144,7 +143,6 @@ class IntroductionManagerImpl extends ConversationClientImpl abortOrRemoveSessionWithIntroducee(txn, c); // Remove the contact group (all messages will be removed with it) - db.removeGroup(txn, getContactGroup(c)); } @@ -159,17 +157,16 @@ class IntroductionManagerImpl extends ConversationClientImpl @Override public Group getContactGroup(Contact c) { return contactGroupFactory - .createContactGroup(CLIENT_ID, CLIENT_VERSION, c); + .createContactGroup(CLIENT_ID, MAJOR_VERSION, c); } @Override protected boolean incomingMessage(Transaction txn, Message m, BdfList body, BdfDictionary bdfMeta) throws DbException, FormatException { -// Parse the metadata + // Parse the metadata MessageMetadata meta = messageParser.parseMetadata(bdfMeta); // Look up the session, if there is one SessionId sessionId = meta.getSessionId(); - IntroduceeSession newIntroduceeSession = null; if (sessionId == null) { if (meta.getMessageType() != REQUEST) throw new AssertionError(); @@ -180,7 +177,7 @@ class IntroductionManagerImpl extends ConversationClientImpl // Handle the message Session session; MessageId storageId; - if (ss == null){ + if (ss == null) { if (meta.getMessageType() != REQUEST) throw new FormatException(); if (newIntroduceeSession == null) throw new AssertionError(); storageId = createStorageId(txn); @@ -191,12 +188,12 @@ class IntroductionManagerImpl extends ConversationClientImpl Role role = sessionParser.getRole(ss.bdfSession); if (role == INTRODUCER) { session = handleMessage(txn, m, body, meta.getMessageType(), - sessionParser.parseIntroducerSession(ss.bdfSession), - introducerEngine); + sessionParser.parseIntroducerSession(ss.bdfSession), + introducerEngine); } else if (role == INTRODUCEE) { session = handleMessage(txn, m, body, meta.getMessageType(), - sessionParser.parseIntroduceeSession(m.getGroupId(), - ss.bdfSession), introduceeEngine); + sessionParser.parseIntroduceeSession(m.getGroupId(), + ss.bdfSession), introduceeEngine); } else throw new AssertionError(); } // Store the updated session @@ -407,14 +404,13 @@ class IntroductionManagerImpl extends ConversationClientImpl List messages; Transaction txn = db.startTransaction(true); try { - Contact contact =db.getContact(txn, c); + Contact contact = db.getContact(txn, c); GroupId contactGroupId = getContactGroup(contact).getId(); BdfDictionary query = messageParser.getMessagesVisibleInUiQuery(); - Map results = clientHelper.getMessageMetadataAsDictionary(txn, contactGroupId, query); - messages = new ArrayList<>(results.size()); - for (Entry< - MessageId , - BdfDictionary > e : results.entrySet()) { + Map results = clientHelper + .getMessageMetadataAsDictionary(txn, contactGroupId, query); + messages = new ArrayList<>(results.size()); + for (Entry e : results.entrySet()) { MessageId m = e.getKey(); MessageMetadata meta = messageParser.parseMetadata(e.getValue()); @@ -425,7 +421,7 @@ class IntroductionManagerImpl extends ConversationClientImpl if (type == REQUEST) { messages.add( parseInvitationRequest(txn, contactGroupId, m, - meta, status, ss.bdfSession)); + meta, status, ss.bdfSession)); } else if (type == ACCEPT) { messages.add( parseInvitationResponse(contactGroupId, m, meta, @@ -445,7 +441,8 @@ class IntroductionManagerImpl extends ConversationClientImpl return messages; } - private IntroductionRequest parseInvitationRequest(Transaction txn, GroupId contactGroupId, MessageId m, MessageMetadata meta, + private IntroductionRequest parseInvitationRequest(Transaction txn, + GroupId contactGroupId, MessageId m, MessageMetadata meta, MessageStatus status, BdfDictionary bdfSession) throws DbException, FormatException { Role role = sessionParser.getRole(bdfSession); @@ -516,9 +513,9 @@ class IntroductionManagerImpl extends ConversationClientImpl Map sessions; try { sessions = clientHelper - .getMessageMetadataAsDictionary(txn,localGroup.getId(), + .getMessageMetadataAsDictionary(txn, localGroup.getId(), query); - } catch (FormatException e){ + } catch (FormatException e) { throw new DbException(e); } for (MessageId id : sessions.keySet()) { @@ -529,20 +526,20 @@ class IntroductionManagerImpl extends ConversationClientImpl private void abortOrRemoveSessionWithIntroducee(Transaction txn, Contact c) throws DbException { BdfDictionary query = sessionEncoder.getIntroducerSessionsQuery(); - Map sessions; + Map sessions; try { sessions = clientHelper - .getMessageMetadataAsDictionary(txn, - localGroup.getId(), - query); + .getMessageMetadataAsDictionary(txn, localGroup.getId(), + query); } catch (FormatException e) { throw new DbException(); } - LocalAuthor localAuthor = identityManager.getLocalAuthor(txn);for (Entry session : sessions.entrySet()) { + LocalAuthor localAuthor = identityManager.getLocalAuthor(txn); + for (Entry session : sessions.entrySet()) { IntroducerSession s; try { s = sessionParser.parseIntroducerSession(session.getValue()); - } catch (FormatException e){ + } catch (FormatException e) { throw new DbException(); } if (s.getIntroduceeA().author.equals(c.getAuthor())) { diff --git a/briar-core/src/test/java/org/briarproject/briar/introduction/MessageEncoderParserIntegrationTest.java b/briar-core/src/test/java/org/briarproject/briar/introduction/MessageEncoderParserIntegrationTest.java index 7b15b6ab4..a29f79445 100644 --- a/briar-core/src/test/java/org/briarproject/briar/introduction/MessageEncoderParserIntegrationTest.java +++ b/briar-core/src/test/java/org/briarproject/briar/introduction/MessageEncoderParserIntegrationTest.java @@ -25,12 +25,14 @@ import javax.inject.Inject; import static org.briarproject.bramble.api.crypto.CryptoConstants.MAC_BYTES; import static org.briarproject.bramble.api.crypto.CryptoConstants.MAX_SIGNATURE_BYTES; import static org.briarproject.bramble.api.identity.AuthorConstants.MAX_PUBLIC_KEY_LENGTH; +import static org.briarproject.bramble.test.TestUtils.getGroup; import static org.briarproject.bramble.test.TestUtils.getRandomBytes; import static org.briarproject.bramble.test.TestUtils.getRandomId; import static org.briarproject.bramble.test.TestUtils.getTransportPropertiesMap; import static org.briarproject.bramble.util.StringUtils.getRandomString; import static org.briarproject.briar.api.introduction.IntroductionConstants.MAX_REQUEST_MESSAGE_LENGTH; import static org.briarproject.briar.api.introduction.IntroductionManager.CLIENT_ID; +import static org.briarproject.briar.api.introduction.IntroductionManager.MAJOR_VERSION; import static org.briarproject.briar.introduction.MessageType.ABORT; import static org.briarproject.briar.introduction.MessageType.REQUEST; import static org.briarproject.briar.test.BriarTestUtils.getRealAuthor; @@ -57,8 +59,8 @@ public class MessageEncoderParserIntegrationTest extends BrambleTestCase { private final MessageParser messageParser; private final IntroductionValidator validator; - private final GroupId groupId = new GroupId(getRandomId()); - private final Group group = new Group(groupId, CLIENT_ID, getRandomId()); + private final Group group = getGroup(CLIENT_ID, MAJOR_VERSION); + private final GroupId groupId = group.getId(); private final long timestamp = 42L; private final SessionId sessionId = new SessionId(getRandomId()); private final MessageId previousMsgId = new MessageId(getRandomId()); From 41242ef36908d454a2070b39bcce59f390c01976 Mon Sep 17 00:00:00 2001 From: akwizgran Date: Sun, 29 Apr 2018 16:38:44 +0100 Subject: [PATCH 32/33] Check that there's only one local client versions message. --- .../bramble/versioning/ClientVersioningManagerImpl.java | 1 + 1 file changed, 1 insertion(+) diff --git a/bramble-core/src/main/java/org/briarproject/bramble/versioning/ClientVersioningManagerImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/versioning/ClientVersioningManagerImpl.java index 002001d7e..4c73abfe3 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/versioning/ClientVersioningManagerImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/versioning/ClientVersioningManagerImpl.java @@ -262,6 +262,7 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, Client, storeClientVersions(txn, newVersions); return true; } + if (ids.size() != 1) throw new DbException(); MessageId m = ids.iterator().next(); List oldVersions = loadClientVersions(txn, m); if (oldVersions.equals(newVersions)) return false; From fd78139a5aea1fefa347d96a0a02300d5e7ad69c Mon Sep 17 00:00:00 2001 From: akwizgran Date: Sun, 29 Apr 2018 16:39:15 +0100 Subject: [PATCH 33/33] Remove stale comments. --- .../bramble/properties/TransportPropertyManagerImpl.java | 1 - .../briarproject/briar/introduction/IntroductionManagerImpl.java | 1 - .../org/briarproject/briar/messaging/MessagingManagerImpl.java | 1 - .../privategroup/invitation/GroupInvitationManagerImpl.java | 1 - .../java/org/briarproject/briar/sharing/SharingManagerImpl.java | 1 - 5 files changed, 5 deletions(-) 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 bca74a5aa..4b4c360db 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 @@ -78,7 +78,6 @@ class TransportPropertyManagerImpl implements TransportPropertyManager, public void addingContact(Transaction txn, Contact c) throws DbException { // Create a group to share with the contact Group g = getContactGroup(c); - // Store the group and share it with the contact db.addGroup(txn, g); // Apply the client's visibility to the contact group Visibility client = clientVersioningManager.getClientVisibility(txn, diff --git a/briar-core/src/main/java/org/briarproject/briar/introduction/IntroductionManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/introduction/IntroductionManagerImpl.java index ad746ddb4..fd39a865f 100644 --- a/briar-core/src/main/java/org/briarproject/briar/introduction/IntroductionManagerImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/introduction/IntroductionManagerImpl.java @@ -121,7 +121,6 @@ class IntroductionManagerImpl extends ConversationClientImpl public void addingContact(Transaction txn, Contact c) throws DbException { // Create a group to share with the contact Group g = getContactGroup(c); - // Store the group and share it with the contact db.addGroup(txn, g); // Apply the client's visibility to the contact group Visibility client = clientVersioningManager.getClientVisibility(txn, diff --git a/briar-core/src/main/java/org/briarproject/briar/messaging/MessagingManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/messaging/MessagingManagerImpl.java index cd7a671ca..555a20990 100644 --- a/briar-core/src/main/java/org/briarproject/briar/messaging/MessagingManagerImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/messaging/MessagingManagerImpl.java @@ -71,7 +71,6 @@ class MessagingManagerImpl extends ConversationClientImpl public void addingContact(Transaction txn, Contact c) throws DbException { // Create a group to share with the contact Group g = getContactGroup(c); - // Store the group and share it with the contact db.addGroup(txn, g); // Apply the client's visibility to the contact group Visibility client = clientVersioningManager.getClientVisibility(txn, diff --git a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImpl.java index 3ef0c9451..a4aef1eca 100644 --- a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImpl.java @@ -115,7 +115,6 @@ class GroupInvitationManagerImpl extends ConversationClientImpl public void addingContact(Transaction txn, Contact c) throws DbException { // Create a group to share with the contact Group g = getContactGroup(c); - // Store the group and share it with the contact db.addGroup(txn, g); Visibility client = clientVersioningManager.getClientVisibility(txn, c.getId(), CLIENT_ID, MAJOR_VERSION); diff --git a/briar-core/src/main/java/org/briarproject/briar/sharing/SharingManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/sharing/SharingManagerImpl.java index 29e653301..fc57a6daa 100644 --- a/briar-core/src/main/java/org/briarproject/briar/sharing/SharingManagerImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/sharing/SharingManagerImpl.java @@ -106,7 +106,6 @@ abstract class SharingManagerImpl public void addingContact(Transaction txn, Contact c) throws DbException { // Create a group to share with the contact Group g = getContactGroup(c); - // Store the group and share it with the contact db.addGroup(txn, g); Visibility client = clientVersioningManager.getClientVisibility(txn, c.getId(), getClientId(), getMajorVersion());