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 0000000000000000000000000000000000000000..08640279d24aa27145ece490e684a9fa9a43812f --- /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 0000000000000000000000000000000000000000..4b3c81f3080cfb9a7a43e2c085bd45c5a79e97fe --- /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 4712c83457b714a5809d3740a1fb070374a81310..0499180c03d0835fc001a873681ef11eca09ea79 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 4637fdffc5a43d3a6f4c1d735221b0dfcd7ac21d..58785a290c944bb7c8a198b47bd89b2245dd1a3d 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 8b7c1e8733f427a11f1c23c98e1a4f85a02774d2..1e96168f80e16422fc81fe858ff9dd43946d6c39 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 b36c32eaa997f067c3e4d18b2fe70ae1e572952e..b4372c4dd8b19ec8382a79cb5071d8606fec5c6c 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 248d6731b61d2a116de2f40c9ca2496a22447225..d17e26ab5f50799feea3cda98586c9c482cab70e 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 0000000000000000000000000000000000000000..48b24de6c0069d4f0861ea1d2407660c0d340542 --- /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 0000000000000000000000000000000000000000..7b8fe7b761195277e4923077ed51fc3c21f37752 --- /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 f86ae4dfa9bea044b957bf1ef0310f3335d91611..eb000103e8a7528b9fbfe3613d19d033199c7adb 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 dfce9b987c6dd777eccb001204b7730877d9adf4..e30884ac8f2bdbcc0f8f460fda2683ecb58db1a7 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 fc42c841da2e3cd51a24370c09ec7b317bf150dc..dbfb622ac873958428a8ce0d2128a3fe789d9aa1 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 b13cfe8adffa94796eb6084cf4ee764c035b03cd..b2dd6287ee7352916927a6db1fd9861c54dff9bb 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 633ec17d8833bcea993a235827d14817d0717df9..d5ed0e1f381aba9383182e1ba9f911b8bff13cab 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();