From 114044ee5f0983877d1f5c3d55511a97006f1e66 Mon Sep 17 00:00:00 2001 From: akwizgran <michael@briarproject.org> Date: Fri, 13 Apr 2018 16:11:03 +0100 Subject: [PATCH] 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 d80042b415..bc73714b78 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 7f7da60cec..93cbf28eb5 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 36a51a4e3e..202176a65c 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<ClientVersion> { 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 0acf9e4e80..f83e4d64c2 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 a9c79c3321..16ce78a432 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<ClientId, MessageValidator> validators; - private final Map<ClientId, IncomingMessageHook> hooks; + private final Map<ClientVersion, MessageValidator> validators; + private final Map<ClientVersion, IncomingMessageHook> 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 c6be26f21e..3131c4fb54 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 af39a8fcd9..54f8b96141 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 9050dc272a..a6732fadb0 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 24c649c5fd..a41215ae2f 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 492d3c4fac..c6c6bd1e6c 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 8b2bb3b66e..c105df88d9 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 fbd5efbc13..178cafdd09 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 64d4d0d37d..4dfe78d8d3 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; } -- GitLab