From 01413659639b1a03ca3ec88032aa7a796017d74b Mon Sep 17 00:00:00 2001 From: akwizgran <michael@briarproject.org> Date: Mon, 28 Jan 2013 20:43:43 +0000 Subject: [PATCH] Created expiry update and expiry ack packets for BMP. --- .../net/sf/briar/api/protocol/ExpiryAck.java | 15 ++++++++++++ .../sf/briar/api/protocol/ExpiryUpdate.java | 23 ++++++++++++++++++ .../sf/briar/api/protocol/ProtocolReader.java | 6 +++++ .../sf/briar/api/protocol/ProtocolWriter.java | 4 ++++ .../api/protocol/SubscriptionUpdate.java | 2 +- .../briar/api/protocol/TransportUpdate.java | 4 +++- .../src/net/sf/briar/api/protocol/Types.java | 22 +++++++++-------- .../sf/briar/protocol/ExpiryAckReader.java | 20 ++++++++++++++++ .../sf/briar/protocol/ExpiryUpdateReader.java | 22 +++++++++++++++++ .../net/sf/briar/protocol/MessageReader.java | 20 ++++------------ .../net/sf/briar/protocol/ProtocolModule.java | 20 ++++++++++++---- .../protocol/ProtocolReaderFactoryImpl.java | 9 +++++++ .../sf/briar/protocol/ProtocolReaderImpl.java | 24 +++++++++++++++++++ .../sf/briar/protocol/ProtocolWriterImpl.java | 17 +++++++++++++ 14 files changed, 176 insertions(+), 32 deletions(-) create mode 100644 briar-api/src/net/sf/briar/api/protocol/ExpiryAck.java create mode 100644 briar-api/src/net/sf/briar/api/protocol/ExpiryUpdate.java create mode 100644 briar-core/src/net/sf/briar/protocol/ExpiryAckReader.java create mode 100644 briar-core/src/net/sf/briar/protocol/ExpiryUpdateReader.java diff --git a/briar-api/src/net/sf/briar/api/protocol/ExpiryAck.java b/briar-api/src/net/sf/briar/api/protocol/ExpiryAck.java new file mode 100644 index 0000000000..08640279d2 --- /dev/null +++ b/briar-api/src/net/sf/briar/api/protocol/ExpiryAck.java @@ -0,0 +1,15 @@ +package net.sf.briar.api.protocol; + +/** A packet acknowledging a (@link ExpiryUpdate} */ +public class ExpiryAck { + + private final long version; + + public ExpiryAck(long version) { + this.version = version; + } + + public long getVersionNumber() { + return version; + } +} diff --git a/briar-api/src/net/sf/briar/api/protocol/ExpiryUpdate.java b/briar-api/src/net/sf/briar/api/protocol/ExpiryUpdate.java new file mode 100644 index 0000000000..4b3c81f308 --- /dev/null +++ b/briar-api/src/net/sf/briar/api/protocol/ExpiryUpdate.java @@ -0,0 +1,23 @@ +package net.sf.briar.api.protocol; + +/** + * A packet updating the recipient's view of the expiry time of the sender's + * database. + */ +public class ExpiryUpdate { + + private final long expiry, version; + + public ExpiryUpdate(long expiry, long version) { + this.expiry = expiry; + this.version = version; + } + + public long getExpiryTime() { + return expiry; + } + + public long getVersionNumber() { + return version; + } +} diff --git a/briar-api/src/net/sf/briar/api/protocol/ProtocolReader.java b/briar-api/src/net/sf/briar/api/protocol/ProtocolReader.java index 4712c83457..0499180c03 100644 --- a/briar-api/src/net/sf/briar/api/protocol/ProtocolReader.java +++ b/briar-api/src/net/sf/briar/api/protocol/ProtocolReader.java @@ -9,6 +9,12 @@ public interface ProtocolReader { boolean hasAck() throws IOException; Ack readAck() throws IOException; + boolean hasExpiryAck() throws IOException; + ExpiryAck readExpiryAck() throws IOException; + + boolean hasExpiryUpdate() throws IOException; + ExpiryUpdate readExpiryUpdate() throws IOException; + boolean hasMessage() throws IOException; UnverifiedMessage readMessage() throws IOException; diff --git a/briar-api/src/net/sf/briar/api/protocol/ProtocolWriter.java b/briar-api/src/net/sf/briar/api/protocol/ProtocolWriter.java index 4637fdffc5..58785a290c 100644 --- a/briar-api/src/net/sf/briar/api/protocol/ProtocolWriter.java +++ b/briar-api/src/net/sf/briar/api/protocol/ProtocolWriter.java @@ -10,6 +10,10 @@ public interface ProtocolWriter { void writeAck(Ack a) throws IOException; + void writeExpiryAck(ExpiryAck a) throws IOException; + + void writeExpiryUpdate(ExpiryUpdate e) throws IOException; + void writeMessage(byte[] raw) throws IOException; void writeOffer(Offer o) throws IOException; diff --git a/briar-api/src/net/sf/briar/api/protocol/SubscriptionUpdate.java b/briar-api/src/net/sf/briar/api/protocol/SubscriptionUpdate.java index 8b7c1e8733..1e96168f80 100644 --- a/briar-api/src/net/sf/briar/api/protocol/SubscriptionUpdate.java +++ b/briar-api/src/net/sf/briar/api/protocol/SubscriptionUpdate.java @@ -2,7 +2,7 @@ package net.sf.briar.api.protocol; import java.util.Collection; -/** A packet updating the sender's subscriptions. */ +/** A packet updating the recipient's view of the sender's subscriptions. */ public class SubscriptionUpdate { private final Collection<Group> subs; diff --git a/briar-api/src/net/sf/briar/api/protocol/TransportUpdate.java b/briar-api/src/net/sf/briar/api/protocol/TransportUpdate.java index b36c32eaa9..b4372c4dd8 100644 --- a/briar-api/src/net/sf/briar/api/protocol/TransportUpdate.java +++ b/briar-api/src/net/sf/briar/api/protocol/TransportUpdate.java @@ -2,7 +2,9 @@ package net.sf.briar.api.protocol; import net.sf.briar.api.TransportProperties; -/** A packet updating the sender's transport properties. */ +/** + * A packet updating the recipient's view of the sender's transport properties. + */ public class TransportUpdate { private final TransportId id; diff --git a/briar-api/src/net/sf/briar/api/protocol/Types.java b/briar-api/src/net/sf/briar/api/protocol/Types.java index 248d6731b6..d17e26ab5f 100644 --- a/briar-api/src/net/sf/briar/api/protocol/Types.java +++ b/briar-api/src/net/sf/briar/api/protocol/Types.java @@ -3,14 +3,16 @@ package net.sf.briar.api.protocol; /** Struct identifiers for encoding and decoding protocol objects. */ public interface Types { - int ACK = 0; - int AUTHOR = 1; - int GROUP = 3; - int MESSAGE = 4; - int OFFER = 5; - int REQUEST = 6; - int SUBSCRIPTION_ACK = 7; - int SUBSCRIPTION_UPDATE = 8; - int TRANSPORT_ACK = 9; - int TRANSPORT_UPDATE = 10; + int AUTHOR = 0; + int GROUP = 1; + int ACK = 2; + int EXPIRY_ACK = 3; + int EXPIRY_UPDATE = 4; + int MESSAGE = 5; + int OFFER = 6; + int REQUEST = 7; + int SUBSCRIPTION_ACK = 8; + int SUBSCRIPTION_UPDATE = 9; + int TRANSPORT_ACK = 10; + int TRANSPORT_UPDATE = 11; } diff --git a/briar-core/src/net/sf/briar/protocol/ExpiryAckReader.java b/briar-core/src/net/sf/briar/protocol/ExpiryAckReader.java new file mode 100644 index 0000000000..48b24de6c0 --- /dev/null +++ b/briar-core/src/net/sf/briar/protocol/ExpiryAckReader.java @@ -0,0 +1,20 @@ +package net.sf.briar.protocol; + +import static net.sf.briar.api.protocol.Types.EXPIRY_ACK; + +import java.io.IOException; + +import net.sf.briar.api.FormatException; +import net.sf.briar.api.protocol.ExpiryAck; +import net.sf.briar.api.serial.Reader; +import net.sf.briar.api.serial.StructReader; + +class ExpiryAckReader implements StructReader<ExpiryAck> { + + public ExpiryAck readStruct(Reader r) throws IOException { + r.readStructId(EXPIRY_ACK); + long version = r.readInt64(); + if(version < 0L) throw new FormatException(); + return new ExpiryAck(version); + } +} diff --git a/briar-core/src/net/sf/briar/protocol/ExpiryUpdateReader.java b/briar-core/src/net/sf/briar/protocol/ExpiryUpdateReader.java new file mode 100644 index 0000000000..7b8fe7b761 --- /dev/null +++ b/briar-core/src/net/sf/briar/protocol/ExpiryUpdateReader.java @@ -0,0 +1,22 @@ +package net.sf.briar.protocol; + +import static net.sf.briar.api.protocol.Types.EXPIRY_UPDATE; + +import java.io.IOException; + +import net.sf.briar.api.FormatException; +import net.sf.briar.api.protocol.ExpiryUpdate; +import net.sf.briar.api.serial.Reader; +import net.sf.briar.api.serial.StructReader; + +class ExpiryUpdateReader implements StructReader<ExpiryUpdate> { + + public ExpiryUpdate readStruct(Reader r) throws IOException { + r.readStructId(EXPIRY_UPDATE); + long expiry = r.readInt64(); + if(expiry < 0L) throw new FormatException(); + long version = r.readInt64(); + if(version < 0L) throw new FormatException(); + return new ExpiryUpdate(expiry, version); + } +} diff --git a/briar-core/src/net/sf/briar/protocol/MessageReader.java b/briar-core/src/net/sf/briar/protocol/MessageReader.java index f86ae4dfa9..eb000103e8 100644 --- a/briar-core/src/net/sf/briar/protocol/MessageReader.java +++ b/briar-core/src/net/sf/briar/protocol/MessageReader.java @@ -5,8 +5,6 @@ import static net.sf.briar.api.protocol.ProtocolConstants.MAX_PACKET_LENGTH; import static net.sf.briar.api.protocol.ProtocolConstants.MAX_SIGNATURE_LENGTH; import static net.sf.briar.api.protocol.ProtocolConstants.MAX_SUBJECT_LENGTH; import static net.sf.briar.api.protocol.ProtocolConstants.SALT_LENGTH; -import static net.sf.briar.api.protocol.Types.AUTHOR; -import static net.sf.briar.api.protocol.Types.GROUP; import static net.sf.briar.api.protocol.Types.MESSAGE; import java.io.IOException; @@ -51,22 +49,12 @@ class MessageReader implements StructReader<UnverifiedMessage> { } // Read the group, if there is one Group group = null; - if(r.hasNull()) { - r.readNull(); - } else { - r.addStructReader(GROUP, groupReader); - group = r.readStruct(GROUP, Group.class); - r.removeStructReader(GROUP); - } + if(r.hasNull()) r.readNull(); + else group = groupReader.readStruct(r); // Read the author, if there is one Author author = null; - if(r.hasNull()) { - r.readNull(); - } else { - r.addStructReader(AUTHOR, authorReader); - author = r.readStruct(AUTHOR, Author.class); - r.removeStructReader(AUTHOR); - } + if(r.hasNull()) r.readNull(); + else author = authorReader.readStruct(r); // Read the subject String subject = r.readString(MAX_SUBJECT_LENGTH); // Read the timestamp diff --git a/briar-core/src/net/sf/briar/protocol/ProtocolModule.java b/briar-core/src/net/sf/briar/protocol/ProtocolModule.java index dfce9b987c..e30884ac8f 100644 --- a/briar-core/src/net/sf/briar/protocol/ProtocolModule.java +++ b/briar-core/src/net/sf/briar/protocol/ProtocolModule.java @@ -6,6 +6,8 @@ import net.sf.briar.api.crypto.CryptoComponent; import net.sf.briar.api.protocol.Ack; import net.sf.briar.api.protocol.Author; import net.sf.briar.api.protocol.AuthorFactory; +import net.sf.briar.api.protocol.ExpiryAck; +import net.sf.briar.api.protocol.ExpiryUpdate; import net.sf.briar.api.protocol.Group; import net.sf.briar.api.protocol.GroupFactory; import net.sf.briar.api.protocol.MessageFactory; @@ -58,19 +60,29 @@ public class ProtocolModule extends AbstractModule { MIN_VERIFIER_THREADS, MAX_VERIFIER_THREADS)); } + @Provides + StructReader<Author> getAuthorReader(CryptoComponent crypto) { + return new AuthorReader(crypto); + } + + @Provides + StructReader<Group> getGroupReader(CryptoComponent crypto) { + return new GroupReader(crypto); + } + @Provides StructReader<Ack> getAckReader() { return new AckReader(); } @Provides - StructReader<Author> getAuthorReader(CryptoComponent crypto) { - return new AuthorReader(crypto); + StructReader<ExpiryAck> getExpiryAckReader() { + return new ExpiryAckReader(); } @Provides - StructReader<Group> getGroupReader(CryptoComponent crypto) { - return new GroupReader(crypto); + StructReader<ExpiryUpdate> getExpiryUpdateReader() { + return new ExpiryUpdateReader(); } @Provides diff --git a/briar-core/src/net/sf/briar/protocol/ProtocolReaderFactoryImpl.java b/briar-core/src/net/sf/briar/protocol/ProtocolReaderFactoryImpl.java index fc42c841da..dbfb622ac8 100644 --- a/briar-core/src/net/sf/briar/protocol/ProtocolReaderFactoryImpl.java +++ b/briar-core/src/net/sf/briar/protocol/ProtocolReaderFactoryImpl.java @@ -3,6 +3,8 @@ package net.sf.briar.protocol; import java.io.InputStream; import net.sf.briar.api.protocol.Ack; +import net.sf.briar.api.protocol.ExpiryAck; +import net.sf.briar.api.protocol.ExpiryUpdate; import net.sf.briar.api.protocol.Offer; import net.sf.briar.api.protocol.ProtocolReader; import net.sf.briar.api.protocol.ProtocolReaderFactory; @@ -23,6 +25,8 @@ class ProtocolReaderFactoryImpl implements ProtocolReaderFactory { private final ReaderFactory readerFactory; private final Provider<StructReader<Ack>> ackProvider; + private final Provider<StructReader<ExpiryAck>> expiryAckProvider; + private final Provider<StructReader<ExpiryUpdate>> expiryUpdateProvider; private final Provider<StructReader<UnverifiedMessage>> messageProvider; private final Provider<StructReader<Offer>> offerProvider; private final Provider<StructReader<Request>> requestProvider; @@ -35,6 +39,8 @@ class ProtocolReaderFactoryImpl implements ProtocolReaderFactory { ProtocolReaderFactoryImpl(ReaderFactory readerFactory, Provider<StructReader<Ack>> ackProvider, Provider<StructReader<UnverifiedMessage>> messageProvider, + Provider<StructReader<ExpiryAck>> expiryAckProvider, + Provider<StructReader<ExpiryUpdate>> expiryUpdateProvider, Provider<StructReader<Offer>> offerProvider, Provider<StructReader<Request>> requestProvider, Provider<StructReader<SubscriptionAck>> subscriptionAckProvider, @@ -43,6 +49,8 @@ class ProtocolReaderFactoryImpl implements ProtocolReaderFactory { Provider<StructReader<TransportUpdate>> transportUpdateProvider) { this.readerFactory = readerFactory; this.ackProvider = ackProvider; + this.expiryAckProvider = expiryAckProvider; + this.expiryUpdateProvider = expiryUpdateProvider; this.messageProvider = messageProvider; this.offerProvider = offerProvider; this.requestProvider = requestProvider; @@ -54,6 +62,7 @@ class ProtocolReaderFactoryImpl implements ProtocolReaderFactory { public ProtocolReader createProtocolReader(InputStream in) { return new ProtocolReaderImpl(in, readerFactory, ackProvider.get(), + expiryAckProvider.get(), expiryUpdateProvider.get(), messageProvider.get(), offerProvider.get(), requestProvider.get(), subscriptionAckProvider.get(), subscriptionUpdateProvider.get(), transportAckProvider.get(), diff --git a/briar-core/src/net/sf/briar/protocol/ProtocolReaderImpl.java b/briar-core/src/net/sf/briar/protocol/ProtocolReaderImpl.java index b13cfe8adf..b2dd6287ee 100644 --- a/briar-core/src/net/sf/briar/protocol/ProtocolReaderImpl.java +++ b/briar-core/src/net/sf/briar/protocol/ProtocolReaderImpl.java @@ -1,6 +1,8 @@ package net.sf.briar.protocol; import static net.sf.briar.api.protocol.Types.ACK; +import static net.sf.briar.api.protocol.Types.EXPIRY_ACK; +import static net.sf.briar.api.protocol.Types.EXPIRY_UPDATE; import static net.sf.briar.api.protocol.Types.MESSAGE; import static net.sf.briar.api.protocol.Types.OFFER; import static net.sf.briar.api.protocol.Types.REQUEST; @@ -13,6 +15,8 @@ import java.io.IOException; import java.io.InputStream; import net.sf.briar.api.protocol.Ack; +import net.sf.briar.api.protocol.ExpiryAck; +import net.sf.briar.api.protocol.ExpiryUpdate; import net.sf.briar.api.protocol.Offer; import net.sf.briar.api.protocol.ProtocolReader; import net.sf.briar.api.protocol.Request; @@ -31,6 +35,8 @@ class ProtocolReaderImpl implements ProtocolReader { ProtocolReaderImpl(InputStream in, ReaderFactory readerFactory, StructReader<Ack> ackReader, + StructReader<ExpiryAck> expiryAckReader, + StructReader<ExpiryUpdate> expiryUpdateReader, StructReader<UnverifiedMessage> messageReader, StructReader<Offer> offerReader, StructReader<Request> requestReader, @@ -43,6 +49,8 @@ class ProtocolReaderImpl implements ProtocolReader { reader.addStructReader(MESSAGE, messageReader); reader.addStructReader(OFFER, offerReader); reader.addStructReader(REQUEST, requestReader); + reader.addStructReader(EXPIRY_ACK, expiryAckReader); + reader.addStructReader(EXPIRY_UPDATE, expiryUpdateReader); reader.addStructReader(SUBSCRIPTION_ACK, subscriptionAckReader); reader.addStructReader(SUBSCRIPTION_UPDATE, subscriptionUpdateReader); reader.addStructReader(TRANSPORT_ACK, transportAckReader); @@ -61,6 +69,22 @@ class ProtocolReaderImpl implements ProtocolReader { return reader.readStruct(ACK, Ack.class); } + public boolean hasExpiryAck() throws IOException { + return reader.hasStruct(EXPIRY_ACK); + } + + public ExpiryAck readExpiryAck() throws IOException { + return reader.readStruct(EXPIRY_ACK, ExpiryAck.class); + } + + public boolean hasExpiryUpdate() throws IOException { + return reader.hasStruct(EXPIRY_UPDATE); + } + + public ExpiryUpdate readExpiryUpdate() throws IOException { + return reader.readStruct(EXPIRY_UPDATE, ExpiryUpdate.class); + } + public boolean hasMessage() throws IOException { return reader.hasStruct(MESSAGE); } diff --git a/briar-core/src/net/sf/briar/protocol/ProtocolWriterImpl.java b/briar-core/src/net/sf/briar/protocol/ProtocolWriterImpl.java index 633ec17d88..d5ed0e1f38 100644 --- a/briar-core/src/net/sf/briar/protocol/ProtocolWriterImpl.java +++ b/briar-core/src/net/sf/briar/protocol/ProtocolWriterImpl.java @@ -2,6 +2,8 @@ package net.sf.briar.protocol; import static net.sf.briar.api.protocol.ProtocolConstants.MAX_PACKET_LENGTH; import static net.sf.briar.api.protocol.Types.ACK; +import static net.sf.briar.api.protocol.Types.EXPIRY_ACK; +import static net.sf.briar.api.protocol.Types.EXPIRY_UPDATE; import static net.sf.briar.api.protocol.Types.GROUP; import static net.sf.briar.api.protocol.Types.OFFER; import static net.sf.briar.api.protocol.Types.REQUEST; @@ -15,6 +17,8 @@ import java.io.OutputStream; import java.util.BitSet; import net.sf.briar.api.protocol.Ack; +import net.sf.briar.api.protocol.ExpiryAck; +import net.sf.briar.api.protocol.ExpiryUpdate; import net.sf.briar.api.protocol.Group; import net.sf.briar.api.protocol.MessageId; import net.sf.briar.api.protocol.Offer; @@ -70,6 +74,19 @@ class ProtocolWriterImpl implements ProtocolWriter { if(flush) out.flush(); } + public void writeExpiryAck(ExpiryAck a) throws IOException { + w.writeStructId(EXPIRY_ACK); + w.writeInt64(a.getVersionNumber()); + if(flush) out.flush(); + } + + public void writeExpiryUpdate(ExpiryUpdate e) throws IOException { + w.writeStructId(EXPIRY_UPDATE); + w.writeInt64(e.getExpiryTime()); + w.writeInt64(e.getVersionNumber()); + if(flush) out.flush(); + } + public void writeMessage(byte[] raw) throws IOException { out.write(raw); if(flush) out.flush(); -- GitLab