Add support for salts and crypto
[iotcloud.git] / src / java / iotcloud / RejectedMessage.java
index bd52ed0597898f36cecceee74bf1ac27b170889b..9c84f18e053720b43de5e617684ba512d828b2fd 100644 (file)
@@ -1,11 +1,28 @@
 package iotcloud;
 import java.nio.ByteBuffer;
+import java.util.HashSet;
+
+/**
+ * Entry for tracking messages that the server rejected.  We have to
+ * make sure that all clients know that this message was rejected to
+ * prevent the server from reusing these messages in an attack.
+ * @author Brian Demsky
+ * @version 1.0
+ */
+
 
 class RejectedMessage extends Entry {
+       /* Machine identifier */
        private long machineid;
-       private long oldseqnum;                                                                                         //Oldest seqnum in range
-       private long newseqnum;                                                                                         //Newest seqnum in range (inclusive)
-       private boolean equalto;                                                                                                                        //Is message sent or not sent by machineid
+       /* Oldest sequence number in range */
+       private long oldseqnum;
+       /* Newest sequence number in range */
+       private long newseqnum;
+       /* Is the machine identifier of the relevant slots equal to (or not
+        * equal to) the specified machine identifier. */
+       private boolean equalto;
+       /* Set of machines that have not received notification. */
+       private HashSet<Long> watchset;
 
        RejectedMessage(Slot slot, long _machineid, long _oldseqnum, long _newseqnum, boolean _equalto) {
                super(slot);
@@ -39,6 +56,16 @@ class RejectedMessage extends Entry {
                return new RejectedMessage(slot, machineid, oldseqnum, newseqnum, equalto==1);
        }
 
+       void setWatchSet(HashSet<Long> _watchset) {
+               watchset=_watchset;
+       }
+
+       void removeWatcher(long machineid) {
+               if (watchset.remove(machineid))
+                       if (watchset.isEmpty())
+                               setDead();
+       }
+
        void encode(ByteBuffer bb) {
                bb.put(Entry.TypeRejectedMessage);
                bb.putLong(machineid);
@@ -54,4 +81,8 @@ class RejectedMessage extends Entry {
        byte getType() {
                return Entry.TypeRejectedMessage;
        }
+       
+       Entry getCopy(Slot s) {
+               return new RejectedMessage(s, machineid, oldseqnum, newseqnum, equalto);
+       }
 }