diff --git a/config.json b/config.json index 1dc843d..bfde8e1 100644 --- a/config.json +++ b/config.json @@ -7,6 +7,7 @@ "Lox": "127.0.0.1:8002" }, "extra_infos_base_url": "https://collector.torproject.org/recent/bridge-descriptors/extra-infos/", + "confidence": 0.95, "port": 8003, "require_bridge_token": false, "updater_schedule": "* * 22 * * * *" diff --git a/src/analyzer.rs b/src/analyzer.rs index a3eba6a..74e799d 100644 --- a/src/analyzer.rs +++ b/src/analyzer.rs @@ -3,14 +3,14 @@ use std::collections::HashSet; /// Provides a function for predicting which countries block this bridge pub trait Analyzer { - fn blocked_in(&self, bridge_info: &BridgeInfo) -> HashSet; + fn blocked_in(&self, bridge_info: &BridgeInfo, confidence: f64) -> HashSet; } pub struct ExampleAnalyzer {} /// Dummy example which just tells us about blockages we already know about impl Analyzer for ExampleAnalyzer { - fn blocked_in(&self, bridge_info: &BridgeInfo) -> HashSet { + fn blocked_in(&self, bridge_info: &BridgeInfo, confidence: f64) -> HashSet { let mut blocked_in = HashSet::::new(); for (country, info) in &bridge_info.info_by_country { if info.blocked { diff --git a/src/bin/server.rs b/src/bin/server.rs index 24b9718..70fdf69 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -41,6 +41,8 @@ pub struct Config { // map of distributor name to IP:port to contact it pub distributors: BTreeMap, extra_infos_base_url: String, + // confidence required to consider a bridge blocked + confidence: f64, //require_bridge_token: bool, port: u16, updater_schedule: String, @@ -64,13 +66,14 @@ async fn update_daily_info( db: &Db, distributors: &BTreeMap, extra_infos_base_url: &str, + confidence: f64, ) { update_extra_infos(&db, &extra_infos_base_url) .await .unwrap(); update_negative_reports(&db, &distributors).await; update_positive_reports(&db, &distributors).await; - let new_blockages = guess_blockages(&db, &analyzer::ExampleAnalyzer {}); + let new_blockages = guess_blockages(&db, &analyzer::ExampleAnalyzer {}, confidence); report_blockages(&distributors, new_blockages).await; } @@ -82,11 +85,12 @@ async fn create_context_manager( db_config: DbConfig, distributors: BTreeMap, extra_infos_base_url: &str, + confidence: f64, context_rx: mpsc::Receiver, mut kill: broadcast::Receiver<()>, ) { tokio::select! { - create_context = context_manager(db_config, distributors, extra_infos_base_url, context_rx) => create_context, + create_context = context_manager(db_config, distributors, extra_infos_base_url, confidence, context_rx) => create_context, _ = kill.recv() => {println!("Shut down manager");}, } } @@ -95,6 +99,7 @@ async fn context_manager( db_config: DbConfig, distributors: BTreeMap, extra_infos_base_url: &str, + confidence: f64, mut context_rx: mpsc::Receiver, ) { let db: Db = sled::open(&db_config.db_path).unwrap(); @@ -115,7 +120,7 @@ async fn context_manager( println!("Shutdown Sent."); } Update {} => { - update_daily_info(&db, &distributors, &extra_infos_base_url).await; + update_daily_info(&db, &distributors, &extra_infos_base_url, confidence).await; } } } @@ -182,6 +187,7 @@ async fn main() { config.db, config.distributors, &config.extra_infos_base_url, + config.confidence, request_rx, kill, ) diff --git a/src/lib.rs b/src/lib.rs index 02666ce..ccfa862 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -564,7 +564,11 @@ pub async fn update_positive_reports(db: &Db, distributors: &BTreeMap HashMap<[u8; 20], HashSet> { +pub fn guess_blockages( + db: &Db, + analyzer: &dyn Analyzer, + confidence: f64, +) -> HashMap<[u8; 20], HashSet> { // Map of bridge fingerprint to set of countries which newly block it let mut blockages = HashMap::<[u8; 20], HashSet>::new(); @@ -579,7 +583,7 @@ pub fn guess_blockages(db: &Db, analyzer: &dyn Analyzer) -> HashMap<[u8; 20], Ha let mut bridge_info: BridgeInfo = bincode::deserialize(&db.get(fingerprint).unwrap().unwrap()).unwrap(); let mut new_blockages = HashSet::::new(); - let blocked_in = analyzer.blocked_in(&bridge_info); + let blocked_in = analyzer.blocked_in(&bridge_info, confidence); for country in blocked_in { let bridge_country_info = bridge_info.info_by_country.get_mut(&country).unwrap(); if !bridge_country_info.blocked {