diff --git a/src/lib.rs b/src/lib.rs index c4f028d..e646202 100644 --- a/src/lib.rs +++ b/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::::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, - /// Set of negative reports received during this day - pub negative_reports: Vec, + /// Map of negative reports to count of negative reports received + pub negative_reports: BTreeMap, /// Set of positive reports received during this day pub positive_reports: Vec, // 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::::new(), - negative_reports: Vec::::new(), + negative_reports: BTreeMap::::new(), positive_reports: Vec::::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::::new(), + negative_reports: BTreeMap::::new(), positive_reports: Vec::::new(), }; bridge_info diff --git a/src/negative_report.rs b/src/negative_report.rs index 0e71c3e..5e62d60 100644 --- a/src/negative_report.rs +++ b/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], }