Use client versioning for blogs and forums.

This commit is contained in:
akwizgran
2018-04-16 14:53:48 +01:00
parent cf396c2ce2
commit be309057cd
14 changed files with 239 additions and 47 deletions

View File

@@ -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<Blog> {
@@ -31,13 +35,14 @@ class BlogProtocolEngineImpl extends ProtocolEngineImpl<Blog> {
invitationFactory;
@Inject
BlogProtocolEngineImpl(DatabaseComponent db,
ClientHelper clientHelper, MessageEncoder messageEncoder,
MessageParser<Blog> messageParser, MessageTracker messageTracker,
Clock clock, BlogManager blogManager,
BlogProtocolEngineImpl(DatabaseComponent db, ClientHelper clientHelper,
ClientVersioningManager clientVersioningManager,
MessageEncoder messageEncoder, MessageParser<Blog> messageParser,
MessageTracker messageTracker, Clock clock, BlogManager blogManager,
InvitationFactory<Blog, BlogInvitationResponse> 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<Blog> {
Event getInvitationRequestReceivedEvent(InviteMessage<Blog> m,
ContactId contactId, boolean available, boolean canBeOpened) {
InvitationRequest<Blog> 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<Blog> {
@Override
protected ClientId getShareableClientId() {
return BlogManager.CLIENT_ID;
return CLIENT_ID;
}
@Override

View File

@@ -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<Blog>
@Inject
BlogSharingManagerImpl(DatabaseComponent db, ClientHelper clientHelper,
ClientVersioningManager clientVersioningManager,
MetadataParser metadataParser, MessageParser<Blog> messageParser,
SessionEncoder sessionEncoder, SessionParser sessionParser,
MessageTracker messageTracker,
@@ -39,9 +41,9 @@ class BlogSharingManagerImpl extends SharingManagerImpl<Blog>
ProtocolEngine<Blog> engine,
InvitationFactory<Blog, BlogInvitationResponse> 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<Blog>
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

View File

@@ -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<Forum> {
@@ -32,12 +36,15 @@ class ForumProtocolEngineImpl extends ProtocolEngineImpl<Forum> {
@Inject
ForumProtocolEngineImpl(DatabaseComponent db,
ClientHelper clientHelper, MessageEncoder messageEncoder,
MessageParser<Forum> messageParser, MessageTracker messageTracker,
Clock clock, ForumManager forumManager,
ClientHelper clientHelper,
ClientVersioningManager clientVersioningManager,
MessageEncoder messageEncoder, MessageParser<Forum> messageParser,
MessageTracker messageTracker, Clock clock,
ForumManager forumManager,
InvitationFactory<Forum, ForumInvitationResponse> 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<Forum> {
Event getInvitationRequestReceivedEvent(InviteMessage<Forum> m,
ContactId contactId, boolean available, boolean canBeOpened) {
InvitationRequest<Forum> 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<Forum> {
@Override
protected ClientId getShareableClientId() {
return ForumManager.CLIENT_ID;
return CLIENT_ID;
}
@Override

View File

@@ -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<Forum>
@Inject
ForumSharingManagerImpl(DatabaseComponent db, ClientHelper clientHelper,
ClientVersioningManager clientVersioningManager,
MetadataParser metadataParser, MessageParser<Forum> messageParser,
SessionEncoder sessionEncoder, SessionParser sessionParser,
MessageTracker messageTracker,
ContactGroupFactory contactGroupFactory,
ProtocolEngine<Forum> engine,
InvitationFactory<Forum, ForumInvitationResponse> 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<Forum>
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);

View File

@@ -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<S extends Shareable>
protected final ClientHelper clientHelper;
protected final MessageParser<S> 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<S> 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<S extends Shareable>
}
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)

View File

@@ -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();

View File

@@ -11,6 +11,8 @@ interface SessionParser {
BdfDictionary getSessionQuery(SessionId s);
BdfDictionary getAllSessionsQuery();
Session parseSession(GroupId contactGroupId, BdfDictionary d)
throws FormatException;

View File

@@ -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 {

View File

@@ -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";

View File

@@ -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<S extends Shareable>
extends ConversationClientImpl
implements SharingManager<S>, Client, ContactHook {
implements SharingManager<S>, Client, ContactHook,
ClientVersioningHook {
private static final Logger LOG =
Logger.getLogger(SharingManagerImpl.class.getName());
private final ClientVersioningManager clientVersioningManager;
private final MessageParser<S> messageParser;
private final SessionEncoder sessionEncoder;
private final SessionParser sessionParser;
@@ -62,12 +72,14 @@ abstract class SharingManagerImpl<S extends Shareable>
private final InvitationFactory<S, ?> invitationFactory;
SharingManagerImpl(DatabaseComponent db, ClientHelper clientHelper,
ClientVersioningManager clientVersioningManager,
MetadataParser metadataParser, MessageParser<S> messageParser,
SessionEncoder sessionEncoder, SessionParser sessionParser,
MessageTracker messageTracker,
ContactGroupFactory contactGroupFactory, ProtocolEngine<S> engine,
InvitationFactory<S, ?> 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<S extends Shareable>
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<S extends Shareable>
@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<S extends Shareable>
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<S extends Shareable>
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<S extends Shareable>
}
}
@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<Group> shareables = db.getGroups(txn,
getShareableClientId(), getShareableClientVersion());
Map<GroupId, Visibility> 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<GroupId, Visibility> getPreferredVisibilities(Transaction txn,
Contact c) throws DbException, FormatException {
GroupId contactGroupId = getContactGroup(c).getId();
BdfDictionary query = sessionParser.getAllSessionsQuery();
Map<MessageId, BdfDictionary> results = clientHelper
.getMessageMetadataAsDictionary(txn, contactGroupId, query);
Map<GroupId, Visibility> 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;

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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<Blog> messageParser = context.mock(MessageParser.class);
MessageTracker messageTracker = context.mock(MessageTracker.class);
InvitationFactory<Blog, BlogInvitationResponse> 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)

View File

@@ -256,6 +256,8 @@ public abstract class BriarIntegrationTest<C extends BriarIntegrationTestCompone
sync0To2(1, true);
sync1To0(1, true);
sync2To0(1, true);
sync0To1(1, true);
sync0To2(1, true);
}
protected void addContacts1And2() throws Exception {
@@ -269,6 +271,7 @@ public abstract class BriarIntegrationTest<C extends BriarIntegrationTestCompone
// Sync initial client versioning updates
sync1To2(1, true);
sync2To1(1, true);
sync1To2(1, true);
}
@After