Ver código fonte

Use map for negative reports

Vecna 1 ano atrás
pai
commit
28233ec8a5
2 arquivos alterados com 14 adições e 10 exclusões
  1. 8 4
      src/lib.rs
  2. 6 6
      src/negative_report.rs

+ 8 - 4
src/lib.rs

@@ -65,6 +65,8 @@ pub struct BridgeInfo {
     pub fingerprint: [u8; 20],
     /// nickname of bridge (probably not necessary)
     pub nickname: String,
+    /// first Julian date we started collecting data on this bridge
+    pub first_seen: u32,
     /// flag indicating whether the bridge is believed to be blocked
     pub is_blocked: bool,
     /// map of dates to data for that day
@@ -76,6 +78,7 @@ impl BridgeInfo {
         Self {
             fingerprint: fingerprint,
             nickname: nickname,
+            first_seen: get_date(),
             is_blocked: false,
             info_by_day: HashMap::<u32, DailyBridgeInfo>::new(),
         }
@@ -89,6 +92,7 @@ impl fmt::Display for BridgeInfo {
             array_bytes::bytes2hex("", self.fingerprint).as_str()
         );
         str.push_str(format!("nickname: {}\n", self.nickname).as_str());
+        str.push_str(format!("first_seen: {}\n", self.first_seen).as_str());
         str.push_str(format!("is_blocked: {}\n", self.is_blocked).as_str());
         str.push_str("info_by_day:");
         for day in self.info_by_day.keys() {
@@ -111,8 +115,8 @@ pub struct DailyBridgeInfo {
     /// Map of country codes and how many users (rounded up to a multiple of
     /// 8) have connected to that bridge during the day.
     pub bridge_ips: BTreeMap<String, u32>,
-    /// Set of negative reports received during this day
-    pub negative_reports: Vec<SerializableNegativeReport>,
+    /// Map of negative reports to count of negative reports received
+    pub negative_reports: BTreeMap<SerializableNegativeReport, u32>,
     /// Set of positive reports received during this day
     pub positive_reports: Vec<SerializablePositiveReport>,
     // We don't care about ordering of the reports, but I'm using vectors for
@@ -127,7 +131,7 @@ impl DailyBridgeInfo {
     pub fn new() -> Self {
         Self {
             bridge_ips: BTreeMap::<String, u32>::new(),
-            negative_reports: Vec::<SerializableNegativeReport>::new(),
+            negative_reports: BTreeMap::<SerializableNegativeReport, u32>::new(),
             positive_reports: Vec::<SerializablePositiveReport>::new(),
         }
     }
@@ -191,7 +195,7 @@ pub fn add_extra_info_to_db(db: &Db, extra_info: ExtraInfo) {
         // No existing entry; make a new one.
         let daily_bridge_info = DailyBridgeInfo {
             bridge_ips: extra_info.bridge_ips,
-            negative_reports: Vec::<SerializableNegativeReport>::new(),
+            negative_reports: BTreeMap::<SerializableNegativeReport, u32>::new(),
             positive_reports: Vec::<SerializablePositiveReport>::new(),
         };
         bridge_info

+ 6 - 6
src/negative_report.rs

@@ -87,7 +87,7 @@ impl NegativeReport {
             ProofOfBridgeKnowledge::HashOfBridgeLine(pok) => {
                 let hash = HashOfBridgeLine::new(bl);
                 hash == pok
-            },
+            }
             _ => false,
         }
     }
@@ -98,7 +98,7 @@ impl NegativeReport {
             ProofOfBridgeKnowledge::HashOfBucket(pok) => {
                 let hash = HashOfBucket::new(bucket);
                 hash == pok
-            },
+            }
             _ => false,
         }
     }
@@ -106,7 +106,7 @@ impl NegativeReport {
 
 /// (De)serializable negative report object which must be consumed by the
 /// checking function before it can be used
-#[derive(Deserialize, Serialize)]
+#[derive(Eq, PartialEq, Ord, PartialOrd, Serialize, Deserialize)]
 pub struct SerializableNegativeReport {
     pub fingerprint: [u8; 20],
     bridge_pok: ProofOfBridgeKnowledge,
@@ -132,7 +132,7 @@ impl SerializableNegativeReport {
 }
 
 /// Proof that the user knows (and should be able to access) a given bridge
-#[derive(Serialize, Deserialize)]
+#[derive(Eq, PartialEq, Ord, PartialOrd, Serialize, Deserialize)]
 pub enum ProofOfBridgeKnowledge {
     /// Hash of bridge line as proof of knowledge of bridge line
     HashOfBridgeLine(HashOfBridgeLine),
@@ -141,7 +141,7 @@ pub enum ProofOfBridgeKnowledge {
 }
 
 /// Hash of bridge line to prove knowledge of that bridge
-#[derive(PartialEq, Serialize, Deserialize)]
+#[derive(Eq, PartialEq, Ord, PartialOrd, Serialize, Deserialize)]
 pub struct HashOfBridgeLine {
     hash: [u8; 32],
 }
@@ -156,7 +156,7 @@ impl HashOfBridgeLine {
 }
 
 /// Hash of bucket ID to prove knowledge of bridges in that bucket
-#[derive(PartialEq, Serialize, Deserialize)]
+#[derive(Eq, PartialEq, Ord, PartialOrd, Serialize, Deserialize)]
 pub struct HashOfBucket {
     hash: [u8; 32],
 }