diff --git a/briar-api/src/org/briarproject/api/blogs/BlogSharingMessage.java b/briar-api/src/org/briarproject/api/blogs/BlogSharingMessage.java index 105b0d2a3..1465225e6 100644 --- a/briar-api/src/org/briarproject/api/blogs/BlogSharingMessage.java +++ b/briar-api/src/org/briarproject/api/blogs/BlogSharingMessage.java @@ -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() { diff --git a/briar-api/src/org/briarproject/api/event/BlogInvitationReceivedEvent.java b/briar-api/src/org/briarproject/api/event/BlogInvitationReceivedEvent.java index 12d8d4cc4..b92a46667 100644 --- a/briar-api/src/org/briarproject/api/event/BlogInvitationReceivedEvent.java +++ b/briar-api/src/org/briarproject/api/event/BlogInvitationReceivedEvent.java @@ -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; } diff --git a/briar-api/src/org/briarproject/api/event/BlogInvitationResponseReceivedEvent.java b/briar-api/src/org/briarproject/api/event/BlogInvitationResponseReceivedEvent.java index b6344ad92..fc4c04be2 100644 --- a/briar-api/src/org/briarproject/api/event/BlogInvitationResponseReceivedEvent.java +++ b/briar-api/src/org/briarproject/api/event/BlogInvitationResponseReceivedEvent.java @@ -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; } diff --git a/briar-api/src/org/briarproject/api/event/ForumInvitationReceivedEvent.java b/briar-api/src/org/briarproject/api/event/ForumInvitationReceivedEvent.java index d823a2a6b..bbfab9cfe 100644 --- a/briar-api/src/org/briarproject/api/event/ForumInvitationReceivedEvent.java +++ b/briar-api/src/org/briarproject/api/event/ForumInvitationReceivedEvent.java @@ -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; } + } diff --git a/briar-api/src/org/briarproject/api/event/ForumInvitationResponseReceivedEvent.java b/briar-api/src/org/briarproject/api/event/ForumInvitationResponseReceivedEvent.java index cb51daf0a..f4669f946 100644 --- a/briar-api/src/org/briarproject/api/event/ForumInvitationResponseReceivedEvent.java +++ b/briar-api/src/org/briarproject/api/event/ForumInvitationResponseReceivedEvent.java @@ -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; } diff --git a/briar-api/src/org/briarproject/api/event/InvitationReceivedEvent.java b/briar-api/src/org/briarproject/api/event/InvitationReceivedEvent.java index 834b71edd..a72478d66 100644 --- a/briar-api/src/org/briarproject/api/event/InvitationReceivedEvent.java +++ b/briar-api/src/org/briarproject/api/event/InvitationReceivedEvent.java @@ -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; + } } diff --git a/briar-api/src/org/briarproject/api/event/InvitationResponseReceivedEvent.java b/briar-api/src/org/briarproject/api/event/InvitationResponseReceivedEvent.java index df84a6965..63f41be02 100644 --- a/briar-api/src/org/briarproject/api/event/InvitationResponseReceivedEvent.java +++ b/briar-api/src/org/briarproject/api/event/InvitationResponseReceivedEvent.java @@ -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; + } } diff --git a/briar-api/src/org/briarproject/api/forum/ForumInvitationRequest.java b/briar-api/src/org/briarproject/api/forum/ForumInvitationRequest.java index f043ca201..7099bf37b 100644 --- a/briar-api/src/org/briarproject/api/forum/ForumInvitationRequest.java +++ b/briar-api/src/org/briarproject/api/forum/ForumInvitationRequest.java @@ -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) { diff --git a/briar-api/src/org/briarproject/api/forum/ForumInvitationResponse.java b/briar-api/src/org/briarproject/api/forum/ForumInvitationResponse.java index 00a15eac2..1a76ccb65 100644 --- a/briar-api/src/org/briarproject/api/forum/ForumInvitationResponse.java +++ b/briar-api/src/org/briarproject/api/forum/ForumInvitationResponse.java @@ -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) { diff --git a/briar-api/src/org/briarproject/api/forum/ForumSharingMessage.java b/briar-api/src/org/briarproject/api/forum/ForumSharingMessage.java index 45badea54..e93a39c6b 100644 --- a/briar-api/src/org/briarproject/api/forum/ForumSharingMessage.java +++ b/briar-api/src/org/briarproject/api/forum/ForumSharingMessage.java @@ -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() { diff --git a/briar-api/src/org/briarproject/api/sharing/InvitationRequest.java b/briar-api/src/org/briarproject/api/sharing/InvitationRequest.java index 6d5f07d35..6fe51d88e 100644 --- a/briar-api/src/org/briarproject/api/sharing/InvitationRequest.java +++ b/briar-api/src/org/briarproject/api/sharing/InvitationRequest.java @@ -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; } diff --git a/briar-api/src/org/briarproject/api/sharing/SharingConstants.java b/briar-api/src/org/briarproject/api/sharing/SharingConstants.java index e09b9015c..47a990669 100644 --- a/briar-api/src/org/briarproject/api/sharing/SharingConstants.java +++ b/briar-api/src/org/briarproject/api/sharing/SharingConstants.java @@ -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; diff --git a/briar-api/src/org/briarproject/api/sharing/SharingMessage.java b/briar-api/src/org/briarproject/api/sharing/SharingMessage.java index be0cac328..3078d86b4 100644 --- a/briar-api/src/org/briarproject/api/sharing/SharingMessage.java +++ b/briar-api/src/org/briarproject/api/sharing/SharingMessage.java @@ -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); } } diff --git a/briar-core/src/org/briarproject/sharing/BlogInviteeSessionState.java b/briar-core/src/org/briarproject/sharing/BlogInviteeSessionState.java index 7bb3295b7..2ffc4d8d1 100644 --- a/briar-core/src/org/briarproject/sharing/BlogInviteeSessionState.java +++ b/briar-core/src/org/briarproject/sharing/BlogInviteeSessionState.java @@ -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; diff --git a/briar-core/src/org/briarproject/sharing/BlogSharerSessionState.java b/briar-core/src/org/briarproject/sharing/BlogSharerSessionState.java index 16ef1355b..5dd365cae 100644 --- a/briar-core/src/org/briarproject/sharing/BlogSharerSessionState.java +++ b/briar-core/src/org/briarproject/sharing/BlogSharerSessionState.java @@ -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; diff --git a/briar-core/src/org/briarproject/sharing/BlogSharingManagerImpl.java b/briar-core/src/org/briarproject/sharing/BlogSharingManagerImpl.java index 32314ec73..a596bcb2c 100644 --- a/briar-core/src/org/briarproject/sharing/BlogSharingManagerImpl.java +++ b/briar-core/src/org/briarproject/sharing/BlogSharingManagerImpl.java @@ -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 @@ -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 { @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); } } } diff --git a/briar-core/src/org/briarproject/sharing/ForumInviteeSessionState.java b/briar-core/src/org/briarproject/sharing/ForumInviteeSessionState.java index f8ac1629b..259b38b00 100644 --- a/briar-core/src/org/briarproject/sharing/ForumInviteeSessionState.java +++ b/briar-core/src/org/briarproject/sharing/ForumInviteeSessionState.java @@ -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; diff --git a/briar-core/src/org/briarproject/sharing/ForumSharerSessionState.java b/briar-core/src/org/briarproject/sharing/ForumSharerSessionState.java index 4e0fd0504..1403b75a6 100644 --- a/briar-core/src/org/briarproject/sharing/ForumSharerSessionState.java +++ b/briar-core/src/org/briarproject/sharing/ForumSharerSessionState.java @@ -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; diff --git a/briar-core/src/org/briarproject/sharing/ForumSharingManagerImpl.java b/briar-core/src/org/briarproject/sharing/ForumSharingManagerImpl.java index 89bf145cc..d0d4a9e8a 100644 --- a/briar-core/src/org/briarproject/sharing/ForumSharingManagerImpl.java +++ b/briar-core/src/org/briarproject/sharing/ForumSharingManagerImpl.java @@ -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 @@ -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 { @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); } } } diff --git a/briar-core/src/org/briarproject/sharing/InvitationFactory.java b/briar-core/src/org/briarproject/sharing/InvitationFactory.java index be82501e8..2c2d32c29 100644 --- a/briar-core/src/org/briarproject/sharing/InvitationFactory.java +++ b/briar-core/src/org/briarproject/sharing/InvitationFactory.java @@ -5,5 +5,5 @@ import org.briarproject.api.sharing.SharingMessage; public interface InvitationFactory extends org.briarproject.api.sharing.InvitationFactory { - I build(SS localState); + I build(SS localState, long time); } diff --git a/briar-core/src/org/briarproject/sharing/InvitationReceivedEventFactory.java b/briar-core/src/org/briarproject/sharing/InvitationReceivedEventFactory.java index bdedeee48..7c1e324d0 100644 --- a/briar-core/src/org/briarproject/sharing/InvitationReceivedEventFactory.java +++ b/briar-core/src/org/briarproject/sharing/InvitationReceivedEventFactory.java @@ -4,5 +4,5 @@ import org.briarproject.api.event.InvitationReceivedEvent; public interface InvitationReceivedEventFactory { - IR build(IS localState); + IR build(IS localState, long time, String msg); } diff --git a/briar-core/src/org/briarproject/sharing/InvitationResponseReceivedEventFactory.java b/briar-core/src/org/briarproject/sharing/InvitationResponseReceivedEventFactory.java index 4420f30ed..ea5cdd91a 100644 --- a/briar-core/src/org/briarproject/sharing/InvitationResponseReceivedEventFactory.java +++ b/briar-core/src/org/briarproject/sharing/InvitationResponseReceivedEventFactory.java @@ -4,5 +4,5 @@ import org.briarproject.api.event.InvitationResponseReceivedEvent; public interface InvitationResponseReceivedEventFactory { - IRR build(SS localState); + IRR build(SS localState, boolean accept, long time); } diff --git a/briar-core/src/org/briarproject/sharing/InviteeEngine.java b/briar-core/src/org/briarproject/sharing/InviteeEngine.java index 766a37e41..f84583316 100644 --- a/briar-core/src/org/briarproject/sharing/InviteeEngine.java +++ b/briar-core/src/org/briarproject/sharing/InviteeEngine.java @@ -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 invitationReceivedEventFactory; + private final Clock clock; - InviteeEngine(InvitationReceivedEventFactory invitationReceivedEventFactory) { + InviteeEngine( + InvitationReceivedEventFactory invitationReceivedEventFactory, + Clock clock) { this.invitationReceivedEventFactory = invitationReceivedEventFactory; + this.clock = clock; } @Override @@ -63,19 +69,22 @@ class InviteeEngine messages = Collections.singletonList(msg); List events = Collections.emptyList(); diff --git a/briar-core/src/org/briarproject/sharing/InviteeSessionState.java b/briar-core/src/org/briarproject/sharing/InviteeSessionState.java index 6082c7ba8..295076fd4 100644 --- a/briar-core/src/org/briarproject/sharing/InviteeSessionState.java +++ b/briar-core/src/org/briarproject/sharing/InviteeSessionState.java @@ -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) { diff --git a/briar-core/src/org/briarproject/sharing/InviteeSessionStateFactory.java b/briar-core/src/org/briarproject/sharing/InviteeSessionStateFactory.java index 57b8adcfa..0a514f519 100644 --- a/briar-core/src/org/briarproject/sharing/InviteeSessionStateFactory.java +++ b/briar-core/src/org/briarproject/sharing/InviteeSessionStateFactory.java @@ -15,5 +15,6 @@ public interface InviteeSessionStateFactory implements ProtocolEngine { @@ -32,12 +35,15 @@ class SharerEngine invitationFactory; private final InvitationResponseReceivedEventFactory invitationResponseReceivedEventFactory; + private final Clock clock; SharerEngine(InvitationFactory invitationFactory, - InvitationResponseReceivedEventFactory invitationResponseReceivedEventFactory) { + InvitationResponseReceivedEventFactory invitationResponseReceivedEventFactory, + Clock clock) { this.invitationFactory = invitationFactory; this.invitationResponseReceivedEventFactory = invitationResponseReceivedEventFactory; + this.clock = clock; } @Override @@ -65,7 +71,8 @@ class SharerEngine 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 messages = Collections.singletonList(msg); List events = Collections.emptyList(); diff --git a/briar-core/src/org/briarproject/sharing/SharerSessionState.java b/briar-core/src/org/briarproject/sharing/SharerSessionState.java index 6cbb27156..a56be9067 100644 --- a/briar-core/src/org/briarproject/sharing/SharerSessionState.java +++ b/briar-core/src/org/briarproject/sharing/SharerSessionState.java @@ -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) { diff --git a/briar-core/src/org/briarproject/sharing/SharingManagerImpl.java b/briar-core/src/org/briarproject/sharing/SharingManagerImpl.java index 805b9d0b4..f0a88ff5f 100644 --- a/briar-core/src/org/briarproject/sharing/SharingManagerImpl.java +++ b/briar-core/src/org/briarproject/sharing/SharingManagerImpl.java @@ -211,6 +211,7 @@ abstract class SharingManagerImpl engine = - new InviteeEngine(getIRFactory()); + new InviteeEngine(getIRFactory(), clock); processInviteeStateUpdate(txn, m.getId(), engine.onMessageReceived(state, msg)); trackIncomingMessage(txn, m); @@ -233,9 +235,10 @@ abstract class SharingManagerImpl engine = new SharerEngine(getIFactory(), - getIRRFactory()); + getIRRFactory(), clock); processSharerStateUpdate(txn, m.getId(), engine.onMessageReceived(state, msg)); trackIncomingMessage(txn, m); @@ -245,17 +248,19 @@ abstract class SharingManagerImpl engine = new SharerEngine(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 engine = - new InviteeEngine(getIRFactory()); + new InviteeEngine(getIRFactory(), clock); processInviteeStateUpdate(txn, m.getId(), engine.onMessageReceived(state, msg)); } @@ -285,13 +290,14 @@ abstract class SharingManagerImpl engine = new SharerEngine(getIFactory(), - getIRRFactory()); - processSharerStateUpdate(txn, null, + getIRRFactory(), clock); + StateUpdate 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 engine = - new InviteeEngine(getIRFactory()); - processInviteeStateUpdate(txn, null, - engine.onLocalAction(localState, localAction)); + new InviteeEngine(getIRFactory(), clock); + StateUpdate 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 engine = new SharerEngine(getIFactory(), - getIRRFactory()); + getIRRFactory(), clock); + //noinspection unchecked processSharerStateUpdate(txn, null, engine.onLocalAction((SS) state, action)); } else { InviteeSessionState.Action action = InviteeSessionState.Action.LOCAL_LEAVE; InviteeEngine engine = - new InviteeEngine(getIRFactory()); + new InviteeEngine(getIRFactory(), clock); + //noinspection unchecked processInviteeStateUpdate(txn, null, engine.onLocalAction((IS) state, action)); }