Refactor SharingManager so its events provide message header

This commit is contained in:
Torsten Grote
2016-10-05 09:20:02 -03:00
parent 064b920626
commit 1731369d7a
28 changed files with 253 additions and 102 deletions

View File

@@ -13,6 +13,7 @@ import static org.briarproject.api.blogs.BlogConstants.BLOG_PUBLIC_KEY;
import static org.briarproject.api.blogs.BlogConstants.BLOG_TITLE;
import static org.briarproject.api.sharing.SharingConstants.INVITATION_MSG;
import static org.briarproject.api.sharing.SharingConstants.SESSION_ID;
import static org.briarproject.api.sharing.SharingConstants.TIME;
public interface BlogSharingMessage {
@@ -25,9 +26,9 @@ public interface BlogSharingMessage {
public BlogInvitation(GroupId groupId, SessionId sessionId,
String blogTitle, String blogDesc, String blogAuthorName,
byte[] blogPublicKey, String message) {
byte[] blogPublicKey, long time, String message) {
super(groupId, sessionId, message);
super(groupId, sessionId, time, message);
this.blogTitle = blogTitle;
this.blogDesc = blogDesc;
@@ -65,9 +66,10 @@ public interface BlogSharingMessage {
String blogAuthorName = d.getString(BLOG_AUTHOR_NAME);
byte[] blogPublicKey = d.getRaw(BLOG_PUBLIC_KEY);
String message = d.getOptionalString(INVITATION_MSG);
long time = d.getLong(TIME);
return new BlogInvitation(groupId, sessionId, blogTitle,
blogDesc, blogAuthorName, blogPublicKey, message);
blogDesc, blogAuthorName, blogPublicKey, time, message);
}
public String getBlogTitle() {

View File

@@ -2,13 +2,15 @@ package org.briarproject.api.event;
import org.briarproject.api.blogs.Blog;
import org.briarproject.api.contact.ContactId;
import org.briarproject.api.sharing.InvitationRequest;
public class BlogInvitationReceivedEvent extends InvitationReceivedEvent {
private final Blog blog;
public BlogInvitationReceivedEvent(Blog blog, ContactId contactId) {
super(contactId);
public BlogInvitationReceivedEvent(Blog blog, ContactId contactId,
InvitationRequest request) {
super(contactId, request);
this.blog = blog;
}

View File

@@ -1,5 +1,6 @@
package org.briarproject.api.event;
import org.briarproject.api.blogs.BlogInvitationResponse;
import org.briarproject.api.contact.ContactId;
public class BlogInvitationResponseReceivedEvent extends InvitationResponseReceivedEvent {
@@ -7,8 +8,8 @@ public class BlogInvitationResponseReceivedEvent extends InvitationResponseRecei
private final String blogTitle;
public BlogInvitationResponseReceivedEvent(String blogTitle,
ContactId contactId) {
super(contactId);
ContactId contactId, BlogInvitationResponse response) {
super(contactId, response);
this.blogTitle = blogTitle;
}

View File

@@ -2,17 +2,20 @@ package org.briarproject.api.event;
import org.briarproject.api.contact.ContactId;
import org.briarproject.api.forum.Forum;
import org.briarproject.api.forum.ForumInvitationRequest;
public class ForumInvitationReceivedEvent extends InvitationReceivedEvent {
private final Forum forum;
public ForumInvitationReceivedEvent(Forum forum, ContactId contactId) {
super(contactId);
public ForumInvitationReceivedEvent(Forum forum, ContactId contactId,
ForumInvitationRequest request) {
super(contactId, request);
this.forum = forum;
}
public Forum getForum() {
return forum;
}
}

View File

@@ -1,14 +1,15 @@
package org.briarproject.api.event;
import org.briarproject.api.contact.ContactId;
import org.briarproject.api.forum.ForumInvitationResponse;
public class ForumInvitationResponseReceivedEvent extends InvitationResponseReceivedEvent {
private final String forumName;
public ForumInvitationResponseReceivedEvent(String forumName,
ContactId contactId) {
super(contactId);
ContactId contactId, ForumInvitationResponse response) {
super(contactId, response);
this.forumName = forumName;
}

View File

@@ -1,16 +1,23 @@
package org.briarproject.api.event;
import org.briarproject.api.contact.ContactId;
import org.briarproject.api.sharing.InvitationRequest;
public abstract class InvitationReceivedEvent extends Event {
private final ContactId contactId;
private final InvitationRequest request;
InvitationReceivedEvent(ContactId contactId) {
InvitationReceivedEvent(ContactId contactId, InvitationRequest request) {
this.contactId = contactId;
this.request = request;
}
public ContactId getContactId() {
return contactId;
}
public InvitationRequest getRequest() {
return request;
}
}

View File

@@ -1,16 +1,24 @@
package org.briarproject.api.event;
import org.briarproject.api.contact.ContactId;
import org.briarproject.api.sharing.InvitationResponse;
public abstract class InvitationResponseReceivedEvent extends Event {
private final ContactId contactId;
private final InvitationResponse response;
public InvitationResponseReceivedEvent(ContactId contactId) {
public InvitationResponseReceivedEvent(ContactId contactId,
InvitationResponse response) {
this.contactId = contactId;
this.response = response;
}
public ContactId getContactId() {
return contactId;
}
public InvitationResponse getResponse() {
return response;
}
}

View File

@@ -4,12 +4,13 @@ import org.briarproject.api.clients.SessionId;
import org.briarproject.api.contact.ContactId;
import org.briarproject.api.sharing.InvitationRequest;
import org.briarproject.api.sync.MessageId;
import org.jetbrains.annotations.Nullable;
public class ForumInvitationRequest extends InvitationRequest {
private final String forumName;
public ForumInvitationRequest(MessageId id, SessionId sessionId,
public ForumInvitationRequest(@Nullable MessageId id, SessionId sessionId,
ContactId contactId, String forumName, String message,
boolean available, long time, boolean local, boolean sent,
boolean seen, boolean read) {

View File

@@ -4,10 +4,11 @@ import org.briarproject.api.clients.SessionId;
import org.briarproject.api.contact.ContactId;
import org.briarproject.api.sharing.InvitationResponse;
import org.briarproject.api.sync.MessageId;
import org.jetbrains.annotations.Nullable;
public class ForumInvitationResponse extends InvitationResponse {
public ForumInvitationResponse(MessageId id, SessionId sessionId,
public ForumInvitationResponse(@Nullable MessageId id, SessionId sessionId,
ContactId contactId, boolean accept, long time, boolean local,
boolean sent, boolean seen, boolean read) {

View File

@@ -11,6 +11,7 @@ import static org.briarproject.api.forum.ForumConstants.FORUM_NAME;
import static org.briarproject.api.forum.ForumConstants.FORUM_SALT;
import static org.briarproject.api.sharing.SharingConstants.INVITATION_MSG;
import static org.briarproject.api.sharing.SharingConstants.SESSION_ID;
import static org.briarproject.api.sharing.SharingConstants.TIME;
public interface ForumSharingMessage {
@@ -20,9 +21,9 @@ public interface ForumSharingMessage {
private final byte[] forumSalt;
public ForumInvitation(GroupId groupId, SessionId sessionId,
String forumName, byte[] forumSalt, String message) {
String forumName, byte[] forumSalt, long time, String message) {
super(groupId, sessionId, message);
super(groupId, sessionId, time, message);
this.forumName = forumName;
this.forumSalt = forumSalt;
@@ -53,9 +54,10 @@ public interface ForumSharingMessage {
String forumName = d.getString(FORUM_NAME);
byte[] forumSalt = d.getRaw(FORUM_SALT);
String message = d.getOptionalString(INVITATION_MSG);
long time = d.getLong(TIME);
return new ForumInvitation(groupId, sessionId, forumName, forumSalt,
message);
time, message);
}
public String getForumName() {

View File

@@ -3,6 +3,7 @@ package org.briarproject.api.sharing;
import org.briarproject.api.clients.SessionId;
import org.briarproject.api.contact.ContactId;
import org.briarproject.api.sync.MessageId;
import org.jetbrains.annotations.Nullable;
public abstract class InvitationRequest extends InvitationMessage {
@@ -19,6 +20,7 @@ public abstract class InvitationRequest extends InvitationMessage {
this.available = available;
}
@Nullable
public String getMessage() {
return message;
}

View File

@@ -19,6 +19,8 @@ public interface SharingConstants {
String IS_SHARER = "isSharer";
String SHAREABLE_ID = "shareableId";
String INVITATION_MSG = "invitationMsg";
String INVITATION_ID = "invitationId";
String RESPONSE_ID = "responseId";
int SHARE_MSG_TYPE_INVITATION = 1;
int SHARE_MSG_TYPE_ACCEPT = 2;
int SHARE_MSG_TYPE_DECLINE = 3;

View File

@@ -14,6 +14,7 @@ import static org.briarproject.api.sharing.SharingConstants.SHARE_MSG_TYPE_ACCEP
import static org.briarproject.api.sharing.SharingConstants.SHARE_MSG_TYPE_DECLINE;
import static org.briarproject.api.sharing.SharingConstants.SHARE_MSG_TYPE_INVITATION;
import static org.briarproject.api.sharing.SharingConstants.SHARE_MSG_TYPE_LEAVE;
import static org.briarproject.api.sharing.SharingConstants.TIME;
import static org.briarproject.api.sharing.SharingConstants.TYPE;
public interface SharingMessage {
@@ -21,10 +22,12 @@ public interface SharingMessage {
abstract class BaseMessage {
private final GroupId groupId;
private final SessionId sessionId;
private final long time;
BaseMessage(GroupId groupId, SessionId sessionId) {
BaseMessage(GroupId groupId, SessionId sessionId, long time) {
this.groupId = groupId;
this.sessionId = sessionId;
this.time = time;
}
public BdfList toBdfList() {
@@ -62,16 +65,20 @@ public interface SharingMessage {
public SessionId getSessionId() {
return sessionId;
}
public long getTime() {
return time;
}
}
abstract class Invitation extends BaseMessage {
protected final String message;
public Invitation(GroupId groupId, SessionId sessionId,
public Invitation(GroupId groupId, SessionId sessionId, long time,
String message) {
super(groupId, sessionId);
super(groupId, sessionId, time);
this.message = message;
}
@@ -90,8 +97,9 @@ public interface SharingMessage {
private final long type;
public SimpleMessage(long type, GroupId groupId, SessionId sessionId) {
super(groupId, sessionId);
public SimpleMessage(long type, GroupId groupId, SessionId sessionId,
long time) {
super(groupId, sessionId, time);
this.type = type;
}
@@ -114,7 +122,8 @@ public interface SharingMessage {
type != SHARE_MSG_TYPE_ABORT) throw new FormatException();
SessionId sessionId = new SessionId(d.getRaw(SESSION_ID));
return new SimpleMessage(type, groupId, sessionId);
long time = d.getLong(TIME);
return new SimpleMessage(type, groupId, sessionId, time);
}
}

View File

@@ -5,6 +5,7 @@ import org.briarproject.api.contact.ContactId;
import org.briarproject.api.data.BdfDictionary;
import org.briarproject.api.sync.GroupId;
import org.briarproject.api.sync.MessageId;
import org.jetbrains.annotations.Nullable;
import static org.briarproject.api.blogs.BlogConstants.BLOG_AUTHOR_NAME;
import static org.briarproject.api.blogs.BlogConstants.BLOG_DESC;
@@ -21,8 +22,9 @@ public class BlogInviteeSessionState extends InviteeSessionState {
public BlogInviteeSessionState(SessionId sessionId, MessageId storageId,
GroupId groupId, State state, ContactId contactId, GroupId blogId,
String blogTitle, String blogDesc, String blogAuthorName,
byte[] blogPublicKey) {
super(sessionId, storageId, groupId, state, contactId, blogId);
byte[] blogPublicKey, @Nullable MessageId invitationId) {
super(sessionId, storageId, groupId, state, contactId, blogId,
invitationId);
this.blogTitle = blogTitle;
this.blogDesc = blogDesc;

View File

@@ -5,6 +5,7 @@ import org.briarproject.api.contact.ContactId;
import org.briarproject.api.data.BdfDictionary;
import org.briarproject.api.sync.GroupId;
import org.briarproject.api.sync.MessageId;
import org.jetbrains.annotations.Nullable;
import static org.briarproject.api.blogs.BlogConstants.BLOG_AUTHOR_NAME;
import static org.briarproject.api.blogs.BlogConstants.BLOG_DESC;
@@ -21,8 +22,9 @@ public class BlogSharerSessionState extends SharerSessionState {
public BlogSharerSessionState(SessionId sessionId, MessageId storageId,
GroupId groupId, State state, ContactId contactId, GroupId blogId,
String blogTitle, String blogDesc, String blogAuthorName,
byte[] blogPublicKey) {
super(sessionId, storageId, groupId, state, contactId, blogId);
byte[] blogPublicKey, @Nullable MessageId responseId) {
super(sessionId, storageId, groupId, state, contactId, blogId,
responseId);
this.blogTitle = blogTitle;
this.blogDesc = blogDesc;

View File

@@ -10,8 +10,8 @@ import org.briarproject.api.blogs.BlogManager.RemoveBlogHook;
import org.briarproject.api.blogs.BlogSharingManager;
import org.briarproject.api.blogs.BlogSharingMessage.BlogInvitation;
import org.briarproject.api.clients.ClientHelper;
import org.briarproject.api.clients.MessageQueueManager;
import org.briarproject.api.clients.ContactGroupFactory;
import org.briarproject.api.clients.MessageQueueManager;
import org.briarproject.api.clients.SessionId;
import org.briarproject.api.contact.Contact;
import org.briarproject.api.contact.ContactId;
@@ -43,6 +43,7 @@ import static org.briarproject.api.blogs.BlogConstants.BLOG_AUTHOR_NAME;
import static org.briarproject.api.blogs.BlogConstants.BLOG_DESC;
import static org.briarproject.api.blogs.BlogConstants.BLOG_PUBLIC_KEY;
import static org.briarproject.api.blogs.BlogConstants.BLOG_TITLE;
import static org.briarproject.api.sharing.SharingConstants.INVITATION_ID;
class BlogSharingManagerImpl extends
SharingManagerImpl<Blog, BlogInvitation, BlogInviteeSessionState, BlogSharerSessionState, BlogInvitationReceivedEvent, BlogInvitationResponseReceivedEvent>
@@ -163,7 +164,7 @@ class BlogSharingManagerImpl extends
private final BlogFactory blogFactory;
private final BlogManager blogManager;
SFactory(AuthorFactory authorFactory, BlogFactory BlogFactory,
private SFactory(AuthorFactory authorFactory, BlogFactory BlogFactory,
BlogManager BlogManager) {
this.authorFactory = authorFactory;
this.blogFactory = BlogFactory;
@@ -230,11 +231,13 @@ class BlogSharingManagerImpl extends
}
@Override
public BlogInvitation build(BlogSharerSessionState localState) {
public BlogInvitation build(BlogSharerSessionState localState,
long time) {
return new BlogInvitation(localState.getGroupId(),
localState.getSessionId(), localState.getBlogTitle(),
localState.getBlogDesc(), localState.getBlogAuthorName(),
localState.getBlogPublicKey(), localState.getMessage());
localState.getBlogPublicKey(), time,
localState.getMessage());
}
}
@@ -249,20 +252,24 @@ class BlogSharingManagerImpl extends
String blogDesc = d.getString(BLOG_DESC);
String blogAuthorName = d.getString(BLOG_AUTHOR_NAME);
byte[] blogPublicKey = d.getRaw(BLOG_PUBLIC_KEY);
MessageId invitationId = null;
byte[] invitationIdBytes = d.getOptionalRaw(INVITATION_ID);
if (invitationIdBytes != null)
invitationId = new MessageId(invitationIdBytes);
return new BlogInviteeSessionState(sessionId, storageId,
groupId, state, contactId, blogId, blogTitle, blogDesc,
blogAuthorName, blogPublicKey);
blogAuthorName, blogPublicKey, invitationId);
}
@Override
public BlogInviteeSessionState build(SessionId sessionId,
MessageId storageId, GroupId groupId,
InviteeSessionState.State state, ContactId contactId,
Blog blog) {
Blog blog, MessageId invitationId) {
return new BlogInviteeSessionState(sessionId, storageId,
groupId, state, contactId, blog.getId(), blog.getName(),
blog.getDescription(), blog.getAuthor().getName(),
blog.getAuthor().getPublicKey());
blog.getAuthor().getPublicKey(), invitationId);
}
}
@@ -277,9 +284,13 @@ class BlogSharingManagerImpl extends
String blogDesc = d.getString(BLOG_DESC);
String blogAuthorName = d.getString(BLOG_AUTHOR_NAME);
byte[] blogPublicKey = d.getRaw(BLOG_PUBLIC_KEY);
MessageId responseId = null;
byte[] responseIdBytes = d.getOptionalRaw(INVITATION_ID);
if (responseIdBytes != null)
responseId = new MessageId(responseIdBytes);
return new BlogSharerSessionState(sessionId, storageId,
groupId, state, contactId, blogId, blogTitle, blogDesc,
blogAuthorName, blogPublicKey);
blogAuthorName, blogPublicKey, responseId);
}
@Override
@@ -290,7 +301,7 @@ class BlogSharingManagerImpl extends
return new BlogSharerSessionState(sessionId, storageId,
groupId, state, contactId, blog.getId(), blog.getName(),
blog.getDescription(), blog.getAuthor().getName(),
blog.getAuthor().getPublicKey());
blog.getAuthor().getPublicKey(), null);
}
}
@@ -299,16 +310,21 @@ class BlogSharingManagerImpl extends
private final SFactory sFactory;
IRFactory(SFactory sFactory) {
private IRFactory(SFactory sFactory) {
this.sFactory = sFactory;
}
@Override
public BlogInvitationReceivedEvent build(
BlogInviteeSessionState localState) {
BlogInviteeSessionState localState, long time, String msg) {
Blog blog = sFactory.parse(localState);
ContactId contactId = localState.getContactId();
return new BlogInvitationReceivedEvent(blog, contactId);
BlogInvitationRequest request =
new BlogInvitationRequest(localState.getInvitationId(),
localState.getSessionId(), contactId,
blog.getAuthor().getName(), msg, true, time, false,
false, false, false);
return new BlogInvitationReceivedEvent(blog, contactId, request);
}
}
@@ -316,10 +332,15 @@ class BlogSharingManagerImpl extends
InvitationResponseReceivedEventFactory<BlogSharerSessionState, BlogInvitationResponseReceivedEvent> {
@Override
public BlogInvitationResponseReceivedEvent build(
BlogSharerSessionState localState) {
BlogSharerSessionState localState, boolean accept, long time) {
String title = localState.getBlogTitle();
ContactId c = localState.getContactId();
return new BlogInvitationResponseReceivedEvent(title, c);
BlogInvitationResponse response =
new BlogInvitationResponse(localState.getResponseId(),
localState.getSessionId(),
localState.getContactId(), accept, time, false,
false, false, false);
return new BlogInvitationResponseReceivedEvent(title, c, response);
}
}
}

View File

@@ -5,6 +5,7 @@ import org.briarproject.api.contact.ContactId;
import org.briarproject.api.data.BdfDictionary;
import org.briarproject.api.sync.GroupId;
import org.briarproject.api.sync.MessageId;
import org.jetbrains.annotations.Nullable;
import static org.briarproject.api.forum.ForumConstants.FORUM_NAME;
import static org.briarproject.api.forum.ForumConstants.FORUM_SALT;
@@ -16,8 +17,10 @@ public class ForumInviteeSessionState extends InviteeSessionState {
public ForumInviteeSessionState(SessionId sessionId, MessageId storageId,
GroupId groupId, State state, ContactId contactId, GroupId forumId,
String forumName, byte[] forumSalt) {
super(sessionId, storageId, groupId, state, contactId, forumId);
String forumName, byte[] forumSalt,
@Nullable MessageId invitationId) {
super(sessionId, storageId, groupId, state, contactId, forumId,
invitationId);
this.forumName = forumName;
this.forumSalt = forumSalt;

View File

@@ -5,6 +5,7 @@ import org.briarproject.api.contact.ContactId;
import org.briarproject.api.data.BdfDictionary;
import org.briarproject.api.sync.GroupId;
import org.briarproject.api.sync.MessageId;
import org.jetbrains.annotations.Nullable;
import static org.briarproject.api.forum.ForumConstants.FORUM_NAME;
import static org.briarproject.api.forum.ForumConstants.FORUM_SALT;
@@ -16,8 +17,10 @@ class ForumSharerSessionState extends SharerSessionState {
ForumSharerSessionState(SessionId sessionId, MessageId storageId,
GroupId groupId, State state, ContactId contactId, GroupId forumId,
String forumName, byte[] forumSalt) {
super(sessionId, storageId, groupId, state, contactId, forumId);
String forumName, byte[] forumSalt,
@Nullable MessageId responseId) {
super(sessionId, storageId, groupId, state, contactId, forumId,
responseId);
this.forumName = forumName;
this.forumSalt = forumSalt;

View File

@@ -2,8 +2,8 @@ package org.briarproject.sharing;
import org.briarproject.api.FormatException;
import org.briarproject.api.clients.ClientHelper;
import org.briarproject.api.clients.MessageQueueManager;
import org.briarproject.api.clients.ContactGroupFactory;
import org.briarproject.api.clients.MessageQueueManager;
import org.briarproject.api.clients.SessionId;
import org.briarproject.api.contact.ContactId;
import org.briarproject.api.data.BdfDictionary;
@@ -35,6 +35,7 @@ import javax.inject.Inject;
import static org.briarproject.api.forum.ForumConstants.FORUM_NAME;
import static org.briarproject.api.forum.ForumConstants.FORUM_SALT;
import static org.briarproject.api.sharing.SharingConstants.INVITATION_ID;
class ForumSharingManagerImpl extends
SharingManagerImpl<Forum, ForumInvitation, ForumInviteeSessionState, ForumSharerSessionState, ForumInvitationReceivedEvent, ForumInvitationResponseReceivedEvent>
@@ -136,7 +137,7 @@ class ForumSharingManagerImpl extends
private final ForumFactory forumFactory;
private final ForumManager forumManager;
SFactory(ForumFactory forumFactory, ForumManager forumManager) {
private SFactory(ForumFactory forumFactory, ForumManager forumManager) {
this.forumFactory = forumFactory;
this.forumManager = forumManager;
}
@@ -185,10 +186,11 @@ class ForumSharingManagerImpl extends
}
@Override
public ForumInvitation build(ForumSharerSessionState localState) {
public ForumInvitation build(ForumSharerSessionState localState,
long time) {
return new ForumInvitation(localState.getGroupId(),
localState.getSessionId(), localState.getForumName(),
localState.getForumSalt(), localState.getMessage());
localState.getForumSalt(), time, localState.getMessage());
}
}
@@ -201,18 +203,23 @@ class ForumSharingManagerImpl extends
GroupId forumId, BdfDictionary d) throws FormatException {
String forumName = d.getString(FORUM_NAME);
byte[] forumSalt = d.getRaw(FORUM_SALT);
MessageId invitationId = null;
byte[] invitationIdBytes = d.getOptionalRaw(INVITATION_ID);
if (invitationIdBytes != null)
invitationId = new MessageId(invitationIdBytes);
return new ForumInviteeSessionState(sessionId, storageId,
groupId, state, contactId, forumId, forumName, forumSalt);
groupId, state, contactId, forumId, forumName, forumSalt,
invitationId);
}
@Override
public ForumInviteeSessionState build(SessionId sessionId,
MessageId storageId, GroupId groupId,
InviteeSessionState.State state, ContactId contactId,
Forum forum) {
Forum forum, MessageId invitationId) {
return new ForumInviteeSessionState(sessionId, storageId,
groupId, state, contactId, forum.getId(), forum.getName(),
forum.getSalt());
forum.getSalt(), invitationId);
}
}
@@ -225,8 +232,13 @@ class ForumSharingManagerImpl extends
GroupId forumId, BdfDictionary d) throws FormatException {
String forumName = d.getString(FORUM_NAME);
byte[] forumSalt = d.getRaw(FORUM_SALT);
MessageId responseId = null;
byte[] responseIdBytes = d.getOptionalRaw(INVITATION_ID);
if (responseIdBytes != null)
responseId = new MessageId(responseIdBytes);
return new ForumSharerSessionState(sessionId, storageId,
groupId, state, contactId, forumId, forumName, forumSalt);
groupId, state, contactId, forumId, forumName, forumSalt,
responseId);
}
@Override
@@ -236,7 +248,7 @@ class ForumSharingManagerImpl extends
Forum forum) {
return new ForumSharerSessionState(sessionId, storageId,
groupId, state, contactId, forum.getId(), forum.getName(),
forum.getSalt());
forum.getSalt(), null);
}
}
@@ -245,16 +257,20 @@ class ForumSharingManagerImpl extends
private final SFactory sFactory;
IRFactory(SFactory sFactory) {
private IRFactory(SFactory sFactory) {
this.sFactory = sFactory;
}
@Override
public ForumInvitationReceivedEvent build(
ForumInviteeSessionState localState) {
ForumInviteeSessionState localState, long time, String msg) {
Forum forum = sFactory.parse(localState);
ContactId contactId = localState.getContactId();
return new ForumInvitationReceivedEvent(forum, contactId);
ForumInvitationRequest request = new ForumInvitationRequest(
localState.getInvitationId(), localState.getSessionId(),
contactId, forum.getName(), msg, true, time, false, false,
false, false);
return new ForumInvitationReceivedEvent(forum, contactId, request);
}
}
@@ -262,10 +278,14 @@ class ForumSharingManagerImpl extends
InvitationResponseReceivedEventFactory<ForumSharerSessionState, ForumInvitationResponseReceivedEvent> {
@Override
public ForumInvitationResponseReceivedEvent build(
ForumSharerSessionState localState) {
ForumSharerSessionState localState, boolean accept, long time) {
String name = localState.getForumName();
ContactId c = localState.getContactId();
return new ForumInvitationResponseReceivedEvent(name, c);
ForumInvitationResponse response = new ForumInvitationResponse(
localState.getResponseId(),
localState.getSessionId(), localState.getContactId(),
accept, time, false, false, false, false);
return new ForumInvitationResponseReceivedEvent(name, c, response);
}
}
}

View File

@@ -5,5 +5,5 @@ import org.briarproject.api.sharing.SharingMessage;
public interface InvitationFactory<I extends SharingMessage.Invitation, SS extends SharerSessionState> extends
org.briarproject.api.sharing.InvitationFactory<I> {
I build(SS localState);
I build(SS localState, long time);
}

View File

@@ -4,5 +4,5 @@ import org.briarproject.api.event.InvitationReceivedEvent;
public interface InvitationReceivedEventFactory<IS extends InviteeSessionState, IR extends InvitationReceivedEvent> {
IR build(IS localState);
IR build(IS localState, long time, String msg);
}

View File

@@ -4,5 +4,5 @@ import org.briarproject.api.event.InvitationResponseReceivedEvent;
public interface InvitationResponseReceivedEventFactory<SS extends SharerSessionState, IRR extends InvitationResponseReceivedEvent> {
IRR build(SS localState);
IRR build(SS localState, boolean accept, long time);
}

View File

@@ -4,6 +4,8 @@ import org.briarproject.api.FormatException;
import org.briarproject.api.clients.ProtocolEngine;
import org.briarproject.api.event.Event;
import org.briarproject.api.event.InvitationReceivedEvent;
import org.briarproject.api.sharing.SharingMessage.Invitation;
import org.briarproject.api.system.Clock;
import java.util.Collections;
import java.util.List;
@@ -30,9 +32,13 @@ class InviteeEngine<IS extends InviteeSessionState, IR extends InvitationReceive
Logger.getLogger(InviteeEngine.class.getName());
private final InvitationReceivedEventFactory<IS, IR> invitationReceivedEventFactory;
private final Clock clock;
InviteeEngine(InvitationReceivedEventFactory<IS, IR> invitationReceivedEventFactory) {
InviteeEngine(
InvitationReceivedEventFactory<IS, IR> invitationReceivedEventFactory,
Clock clock) {
this.invitationReceivedEventFactory = invitationReceivedEventFactory;
this.clock = clock;
}
@Override
@@ -63,19 +69,22 @@ class InviteeEngine<IS extends InviteeSessionState, IR extends InvitationReceive
if (action == InviteeSessionState.Action.LOCAL_ACCEPT) {
localState.setTask(TASK_ADD_SHARED_SHAREABLE);
msg = new SimpleMessage(SHARE_MSG_TYPE_ACCEPT,
localState.getGroupId(), localState.getSessionId());
localState.getGroupId(), localState.getSessionId(),
clock.currentTimeMillis());
} else {
localState.setTask(
TASK_REMOVE_SHAREABLE_FROM_LIST_SHARED_WITH_US);
msg = new SimpleMessage(SHARE_MSG_TYPE_DECLINE,
localState.getGroupId(), localState.getSessionId());
localState.getGroupId(), localState.getSessionId(),
clock.currentTimeMillis());
}
messages = Collections.singletonList(msg);
logLocalAction(currentState, localState, msg);
}
else if (action == InviteeSessionState.Action.LOCAL_LEAVE) {
BaseMessage msg = new SimpleMessage(SHARE_MSG_TYPE_LEAVE,
localState.getGroupId(), localState.getSessionId());
localState.getGroupId(), localState.getSessionId(),
clock.currentTimeMillis());
messages = Collections.singletonList(msg);
logLocalAction(currentState, localState, msg);
}
@@ -133,7 +142,9 @@ class InviteeEngine<IS extends InviteeSessionState, IR extends InvitationReceive
// we have just received our invitation
else if (action == InviteeSessionState.Action.REMOTE_INVITATION) {
localState.setTask(TASK_ADD_SHAREABLE_TO_LIST_SHARED_WITH_US);
Event event = invitationReceivedEventFactory.build(localState);
Invitation invitation = (Invitation) msg;
Event event = invitationReceivedEventFactory.build(localState,
msg.getTime(), invitation.getMessage());
events = Collections.singletonList(event);
}
else {
@@ -203,7 +214,7 @@ class InviteeEngine<IS extends InviteeSessionState, IR extends InvitationReceive
localState.setState(InviteeSessionState.State.ERROR);
BaseMessage msg =
new SimpleMessage(SHARE_MSG_TYPE_ABORT, localState.getGroupId(),
localState.getSessionId());
localState.getSessionId(), clock.currentTimeMillis());
List<BaseMessage> messages = Collections.singletonList(msg);
List<Event> events = Collections.emptyList();

View File

@@ -5,7 +5,9 @@ import org.briarproject.api.contact.ContactId;
import org.briarproject.api.data.BdfDictionary;
import org.briarproject.api.sync.GroupId;
import org.briarproject.api.sync.MessageId;
import org.jetbrains.annotations.Nullable;
import static org.briarproject.api.sharing.SharingConstants.INVITATION_ID;
import static org.briarproject.api.sharing.SharingConstants.IS_SHARER;
import static org.briarproject.api.sharing.SharingConstants.SHARE_MSG_TYPE_ABORT;
import static org.briarproject.api.sharing.SharingConstants.SHARE_MSG_TYPE_INVITATION;
@@ -21,19 +23,22 @@ import static org.briarproject.sharing.InviteeSessionState.Action.REMOTE_LEAVE;
public abstract class InviteeSessionState extends SharingSessionState {
private State state;
private final MessageId invitationId;
public InviteeSessionState(SessionId sessionId, MessageId storageId,
GroupId groupId, State state, ContactId contactId,
GroupId shareableId) {
GroupId shareableId, MessageId invitationId) {
super(sessionId, storageId, groupId, contactId, shareableId);
this.state = state;
this.invitationId = invitationId;
}
public BdfDictionary toBdfDictionary() {
BdfDictionary d = super.toBdfDictionary();
d.put(STATE, getState().getValue());
d.put(IS_SHARER, false);
if (invitationId != null) d.put(INVITATION_ID, invitationId);
return d;
}
@@ -45,6 +50,11 @@ public abstract class InviteeSessionState extends SharingSessionState {
return state;
}
@Nullable
public MessageId getInvitationId() {
return invitationId;
}
public enum State {
ERROR(0),
AWAIT_INVITATION(1) {

View File

@@ -15,5 +15,6 @@ public interface InviteeSessionStateFactory<S extends Shareable, IS extends Invi
GroupId shareableId, BdfDictionary d) throws FormatException;
IS build(SessionId sessionId, MessageId storageId, GroupId groupId,
InviteeSessionState.State state, ContactId contactId, S shareable);
InviteeSessionState.State state, ContactId contactId, S shareable,
MessageId invitationId);
}

View File

@@ -4,6 +4,7 @@ import org.briarproject.api.FormatException;
import org.briarproject.api.clients.ProtocolEngine;
import org.briarproject.api.event.Event;
import org.briarproject.api.event.InvitationResponseReceivedEvent;
import org.briarproject.api.system.Clock;
import java.util.Collections;
import java.util.List;
@@ -22,6 +23,8 @@ import static org.briarproject.api.sharing.SharingConstants.TASK_UNSHARE_SHAREAB
import static org.briarproject.api.sharing.SharingMessage.BaseMessage;
import static org.briarproject.api.sharing.SharingMessage.Invitation;
import static org.briarproject.api.sharing.SharingMessage.SimpleMessage;
import static org.briarproject.sharing.SharerSessionState.Action.REMOTE_ACCEPT;
import static org.briarproject.sharing.SharerSessionState.Action.REMOTE_DECLINE;
class SharerEngine<I extends Invitation, SS extends SharerSessionState, IRR extends InvitationResponseReceivedEvent>
implements ProtocolEngine<SharerSessionState.Action, SS, BaseMessage> {
@@ -32,12 +35,15 @@ class SharerEngine<I extends Invitation, SS extends SharerSessionState, IRR exte
private final InvitationFactory<I, SS> invitationFactory;
private final InvitationResponseReceivedEventFactory<SS, IRR>
invitationResponseReceivedEventFactory;
private final Clock clock;
SharerEngine(InvitationFactory<I, SS> invitationFactory,
InvitationResponseReceivedEventFactory<SS, IRR> invitationResponseReceivedEventFactory) {
InvitationResponseReceivedEventFactory<SS, IRR> invitationResponseReceivedEventFactory,
Clock clock) {
this.invitationFactory = invitationFactory;
this.invitationResponseReceivedEventFactory =
invitationResponseReceivedEventFactory;
this.clock = clock;
}
@Override
@@ -65,7 +71,8 @@ class SharerEngine<I extends Invitation, SS extends SharerSessionState, IRR exte
List<Event> events = Collections.emptyList();
if (action == SharerSessionState.Action.LOCAL_INVITATION) {
BaseMessage msg = invitationFactory.build(localState);
BaseMessage msg = invitationFactory.build(localState,
clock.currentTimeMillis());
messages = Collections.singletonList(msg);
logLocalAction(currentState, nextState, msg);
@@ -74,7 +81,8 @@ class SharerEngine<I extends Invitation, SS extends SharerSessionState, IRR exte
.setTask(TASK_ADD_SHAREABLE_TO_LIST_TO_BE_SHARED_BY_US);
} else if (action == SharerSessionState.Action.LOCAL_LEAVE) {
BaseMessage msg = new SimpleMessage(SHARE_MSG_TYPE_LEAVE,
localState.getGroupId(), localState.getSessionId());
localState.getGroupId(), localState.getSessionId(),
clock.currentTimeMillis());
messages = Collections.singletonList(msg);
logLocalAction(currentState, nextState, msg);
} else {
@@ -122,9 +130,8 @@ class SharerEngine<I extends Invitation, SS extends SharerSessionState, IRR exte
deleteMsg = true;
}
// we have sent our invitation and just got a response
else if (action == SharerSessionState.Action.REMOTE_ACCEPT ||
action == SharerSessionState.Action.REMOTE_DECLINE) {
if (action == SharerSessionState.Action.REMOTE_ACCEPT) {
else if (action == REMOTE_ACCEPT || action == REMOTE_DECLINE) {
if (action == REMOTE_ACCEPT) {
localState.setTask(TASK_SHARE_SHAREABLE);
} else {
// this ensures that the forum can be shared again
@@ -132,7 +139,8 @@ class SharerEngine<I extends Invitation, SS extends SharerSessionState, IRR exte
TASK_REMOVE_SHAREABLE_FROM_LIST_TO_BE_SHARED_BY_US);
}
Event event = invitationResponseReceivedEventFactory
.build(localState);
.build(localState, action == REMOTE_ACCEPT,
msg.getTime());
events = Collections.singletonList(event);
} else {
throw new IllegalArgumentException("Bad state");
@@ -204,7 +212,8 @@ class SharerEngine<I extends Invitation, SS extends SharerSessionState, IRR exte
localState.setState(SharerSessionState.State.ERROR);
BaseMessage msg = new SimpleMessage(SHARE_MSG_TYPE_ABORT,
localState.getGroupId(), localState.getSessionId());
localState.getGroupId(), localState.getSessionId(),
clock.currentTimeMillis());
List<BaseMessage> messages = Collections.singletonList(msg);
List<Event> events = Collections.emptyList();

View File

@@ -5,8 +5,10 @@ import org.briarproject.api.contact.ContactId;
import org.briarproject.api.data.BdfDictionary;
import org.briarproject.api.sync.GroupId;
import org.briarproject.api.sync.MessageId;
import org.jetbrains.annotations.Nullable;
import static org.briarproject.api.sharing.SharingConstants.IS_SHARER;
import static org.briarproject.api.sharing.SharingConstants.RESPONSE_ID;
import static org.briarproject.api.sharing.SharingConstants.SHARE_MSG_TYPE_ABORT;
import static org.briarproject.api.sharing.SharingConstants.SHARE_MSG_TYPE_ACCEPT;
import static org.briarproject.api.sharing.SharingConstants.SHARE_MSG_TYPE_DECLINE;
@@ -22,20 +24,25 @@ import static org.briarproject.sharing.SharerSessionState.Action.REMOTE_LEAVE;
public abstract class SharerSessionState extends SharingSessionState {
private State state;
@Nullable
private String msg = null;
@Nullable
private MessageId responseId;
public SharerSessionState(SessionId sessionId, MessageId storageId,
GroupId groupId, State state, ContactId contactId,
GroupId shareableId) {
GroupId shareableId, @Nullable MessageId responseId) {
super(sessionId, storageId, groupId, contactId, shareableId);
this.state = state;
this.responseId = responseId;
}
public BdfDictionary toBdfDictionary() {
BdfDictionary d = super.toBdfDictionary();
d.put(STATE, getState().getValue());
d.put(IS_SHARER, true);
if (responseId != null) d.put(RESPONSE_ID, responseId);
return d;
}
@@ -55,6 +62,15 @@ public abstract class SharerSessionState extends SharingSessionState {
return this.msg;
}
public void setResponseId(@Nullable MessageId responseId) {
this.responseId = responseId;
}
@Nullable
public MessageId getResponseId() {
return responseId;
}
public enum State {
ERROR(0),
PREPARE_INVITATION(1) {

View File

@@ -211,6 +211,7 @@ abstract class SharingManagerImpl<S extends Shareable, I extends Invitation, IS
if (stateExists) throw new FormatException();
// check if shareable can be shared
@SuppressWarnings("unchecked")
I invitation = (I) msg;
S f = getSFactory().parse(invitation);
ContactId contactId = getContactId(txn, m.getGroupId());
@@ -219,9 +220,10 @@ abstract class SharingManagerImpl<S extends Shareable, I extends Invitation, IS
checkForRaceCondition(txn, f, contact);
// initialize state and process invitation
IS state = initializeInviteeState(txn, contactId, invitation);
IS state = initializeInviteeState(txn, contactId, invitation,
m.getId());
InviteeEngine<IS, IR> engine =
new InviteeEngine<IS, IR>(getIRFactory());
new InviteeEngine<IS, IR>(getIRFactory(), clock);
processInviteeStateUpdate(txn, m.getId(),
engine.onMessageReceived(state, msg));
trackIncomingMessage(txn, m);
@@ -233,9 +235,10 @@ abstract class SharingManagerImpl<S extends Shareable, I extends Invitation, IS
msg.getType() == SHARE_MSG_TYPE_DECLINE) {
// we are a sharer who just received a response
SS state = getSessionStateForSharer(txn, sessionId);
state.setResponseId(m.getId());
SharerEngine<I, SS, IRR> engine =
new SharerEngine<I, SS, IRR>(getIFactory(),
getIRRFactory());
getIRRFactory(), clock);
processSharerStateUpdate(txn, m.getId(),
engine.onMessageReceived(state, msg));
trackIncomingMessage(txn, m);
@@ -245,17 +248,19 @@ abstract class SharingManagerImpl<S extends Shareable, I extends Invitation, IS
SharingSessionState s = getSessionState(txn, sessionId, true);
if (s instanceof SharerSessionState) {
// we are a sharer and the invitee wants to leave or abort
@SuppressWarnings("unchecked")
SS state = (SS) s;
SharerEngine<I, SS, IRR> engine =
new SharerEngine<I, SS, IRR>(getIFactory(),
getIRRFactory());
getIRRFactory(), clock);
processSharerStateUpdate(txn, m.getId(),
engine.onMessageReceived(state, msg));
} else {
// we are an invitee and the sharer wants to leave or abort
@SuppressWarnings("unchecked")
IS state = (IS) s;
InviteeEngine<IS, IR> engine =
new InviteeEngine<IS, IR>(getIRFactory());
new InviteeEngine<IS, IR>(getIRFactory(), clock);
processInviteeStateUpdate(txn, m.getId(),
engine.onMessageReceived(state, msg));
}
@@ -285,13 +290,14 @@ abstract class SharingManagerImpl<S extends Shareable, I extends Invitation, IS
// start engine and process its state update
SharerEngine<I, SS, IRR> engine =
new SharerEngine<I, SS, IRR>(getIFactory(),
getIRRFactory());
processSharerStateUpdate(txn, null,
getIRRFactory(), clock);
StateUpdate<SS, BaseMessage> update =
engine.onLocalAction(localState,
SharerSessionState.Action.LOCAL_INVITATION));
SharerSessionState.Action.LOCAL_INVITATION);
processSharerStateUpdate(txn, null, update);
// track message
long time = clock.currentTimeMillis();
long time = update.toSend.get(0).getTime();
trackMessage(txn, localState.getGroupId(), time, true);
txn.setComplete();
@@ -321,12 +327,13 @@ abstract class SharingManagerImpl<S extends Shareable, I extends Invitation, IS
// start engine and process its state update
InviteeEngine<IS, IR> engine =
new InviteeEngine<IS, IR>(getIRFactory());
processInviteeStateUpdate(txn, null,
engine.onLocalAction(localState, localAction));
new InviteeEngine<IS, IR>(getIRFactory(), clock);
StateUpdate<IS, BaseMessage> update =
engine.onLocalAction(localState, localAction);
processInviteeStateUpdate(txn, null, update);
// track message
long time = clock.currentTimeMillis();
long time = update.toSend.get(0).getTime();
trackMessage(txn, localState.getGroupId(), time, true);
txn.setComplete();
@@ -466,6 +473,7 @@ abstract class SharingManagerImpl<S extends Shareable, I extends Invitation, IS
BdfDictionary d = m.getValue();
try {
I msg = getIFactory().build(group.getId(), d);
@SuppressWarnings("unchecked")
IS iss = (IS) getSessionState(txn, msg.getSessionId(), true);
// get and add the shareable if the invitation is unanswered
if (iss.getState().equals(AWAIT_LOCAL_RESPONSE)) {
@@ -642,7 +650,7 @@ abstract class SharingManagerImpl<S extends Shareable, I extends Invitation, IS
}
private IS initializeInviteeState(Transaction txn,
ContactId contactId, I msg)
ContactId contactId, I msg, MessageId id)
throws FormatException, DbException {
Contact c = db.getContact(txn, contactId);
@@ -656,9 +664,10 @@ abstract class SharingManagerImpl<S extends Shareable, I extends Invitation, IS
Message m = clientHelper.createMessage(localGroup.getId(), now,
BdfList.of(mSalt));
IS s = getISFactory().build(msg.getSessionId(),
m.getId(), group.getId(),
InviteeSessionState.State.AWAIT_INVITATION, contactId, f);
IS s = getISFactory()
.build(msg.getSessionId(), m.getId(), group.getId(),
InviteeSessionState.State.AWAIT_INVITATION, contactId,
f, id);
// save local state to database
BdfDictionary d = s.toBdfDictionary();
@@ -712,6 +721,7 @@ abstract class SharingManagerImpl<S extends Shareable, I extends Invitation, IS
if (!d.getBoolean(IS_SHARER)) throw new FormatException();
//noinspection unchecked
return (SS) SharingSessionState
.fromBdfDictionary(getISFactory(), getSSFactory(), d);
}
@@ -746,6 +756,7 @@ abstract class SharingManagerImpl<S extends Shareable, I extends Invitation, IS
}
throw new DbException();
}
//noinspection unchecked
return (IS) SharingSessionState
.fromBdfDictionary(getISFactory(), getSSFactory(),
map.values().iterator().next());
@@ -898,16 +909,15 @@ abstract class SharingManagerImpl<S extends Shareable, I extends Invitation, IS
byte[] body = clientHelper.toByteArray(m.toBdfList());
Group group = db.getGroup(txn, m.getGroupId());
long timestamp = clock.currentTimeMillis();
// add message itself as metadata
BdfDictionary d = m.toBdfDictionary();
d.put(LOCAL, true);
d.put(TIME, timestamp);
d.put(TIME, m.getTime());
Metadata meta = metadataEncoder.encode(d);
messageQueueManager
.sendMessage(txn, group, timestamp, body, meta);
.sendMessage(txn, group, m.getTime(), body, meta);
}
private Group getContactGroup(Contact c) {
@@ -930,14 +940,16 @@ abstract class SharingManagerImpl<S extends Shareable, I extends Invitation, IS
SharerSessionState.Action.LOCAL_LEAVE;
SharerEngine<I, SS, IRR> engine =
new SharerEngine<I, SS, IRR>(getIFactory(),
getIRRFactory());
getIRRFactory(), clock);
//noinspection unchecked
processSharerStateUpdate(txn, null,
engine.onLocalAction((SS) state, action));
} else {
InviteeSessionState.Action action =
InviteeSessionState.Action.LOCAL_LEAVE;
InviteeEngine<IS, IR> engine =
new InviteeEngine<IS, IR>(getIRFactory());
new InviteeEngine<IS, IR>(getIRFactory(), clock);
//noinspection unchecked
processInviteeStateUpdate(txn, null,
engine.onLocalAction((IS) state, action));
}