|
@@ -9,7 +9,7 @@ use crate::{
|
|
|
censor::{Censor, Hides::*, Speed::*, Totality::*},
|
|
|
state::State,
|
|
|
},
|
|
|
- BridgeDistributor,
|
|
|
+ BridgeDistributor, COUNTRY_CODES,
|
|
|
};
|
|
|
use lox_cli::{networking::*, *};
|
|
|
use lox_library::{
|
|
@@ -69,7 +69,7 @@ impl User {
|
|
|
let mut cc = String::default();
|
|
|
for (country, prob) in &state.probs_user_in_country {
|
|
|
let prob = *prob;
|
|
|
- if prob < num {
|
|
|
+ if num < prob {
|
|
|
cc = country.to_string();
|
|
|
break;
|
|
|
} else {
|
|
@@ -78,6 +78,7 @@ impl User {
|
|
|
}
|
|
|
cc
|
|
|
};
|
|
|
+ assert!(COUNTRY_CODES.contains(cc.as_str()));
|
|
|
|
|
|
// Randomly determine how likely this user is to use bridges on
|
|
|
// a given day
|
|
@@ -135,7 +136,7 @@ impl User {
|
|
|
let mut cc = String::default();
|
|
|
for (country, prob) in &state.probs_user_in_country {
|
|
|
let prob = *prob;
|
|
|
- if prob < num {
|
|
|
+ if num < prob {
|
|
|
cc = country.to_string();
|
|
|
break;
|
|
|
} else {
|
|
@@ -237,7 +238,7 @@ impl User {
|
|
|
state: &State,
|
|
|
bridges: &mut HashMap<[u8; 20], Bridge>,
|
|
|
censors: &mut HashMap<String, Censor>,
|
|
|
- ) -> (Vec<User>, Vec<[u8; 20]>) {
|
|
|
+ ) -> Vec<User> {
|
|
|
// Probabilistically decide if the user should use bridges today
|
|
|
if event_happens(self.prob_use_bridges) {
|
|
|
// Download bucket to see if bridge is still reachable. (We
|
|
@@ -248,23 +249,25 @@ impl User {
|
|
|
|
|
|
// Make sure each bridge in bucket is in the global bridges set
|
|
|
for bridgeline in bucket {
|
|
|
- if !bridges.contains_key(&bridgeline.fingerprint) {
|
|
|
- let bridge = Bridge::from_bridge_line(&bridgeline);
|
|
|
- bridges.insert(bridgeline.fingerprint, bridge).unwrap();
|
|
|
- }
|
|
|
- // Also, if this user cooperates with censors, make sure
|
|
|
- // each applicable censor knows about their bridges.
|
|
|
- if self.censor {
|
|
|
- if state.sharing {
|
|
|
- for c in censors.values_mut() {
|
|
|
- if !c.knows_bridge(&bridgeline.fingerprint) {
|
|
|
- c.learn_bridge(&bridgeline.fingerprint);
|
|
|
+ if bridgeline != BridgeLine::default() {
|
|
|
+ if !bridges.contains_key(&bridgeline.get_hashed_fingerprint()) {
|
|
|
+ let bridge = Bridge::from_bridge_line(&bridgeline);
|
|
|
+ bridges.insert(bridgeline.get_hashed_fingerprint(), bridge);
|
|
|
+ }
|
|
|
+ // Also, if this user cooperates with censors, make sure
|
|
|
+ // each applicable censor knows about their bridges.
|
|
|
+ if self.censor {
|
|
|
+ if state.sharing {
|
|
|
+ for c in censors.values_mut() {
|
|
|
+ if !c.knows_bridge(&bridgeline.get_hashed_fingerprint()) {
|
|
|
+ c.learn_bridge(&bridgeline.get_hashed_fingerprint());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ let censor = censors.get_mut(&self.country).unwrap();
|
|
|
+ if !censor.knows_bridge(&bridgeline.get_hashed_fingerprint()) {
|
|
|
+ censor.learn_bridge(&bridgeline.get_hashed_fingerprint());
|
|
|
}
|
|
|
- }
|
|
|
- } else {
|
|
|
- let censor = censors.get_mut(&self.country).unwrap();
|
|
|
- if !censor.knows_bridge(&bridgeline.fingerprint) {
|
|
|
- censor.learn_bridge(&bridgeline.fingerprint);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -282,14 +285,17 @@ impl User {
|
|
|
// Can we level up the secondary credential?
|
|
|
let mut second_level_up = false;
|
|
|
|
|
|
+ // Attempt to connect to each bridge
|
|
|
let mut failed = Vec::<BridgeLine>::new();
|
|
|
let mut succeeded = Vec::<BridgeLine>::new();
|
|
|
for i in 0..bucket.len() {
|
|
|
// At level 0, we only have 1 bridge
|
|
|
- if level > 0 || i == 0 {
|
|
|
+ if bucket[i] != BridgeLine::default() {
|
|
|
if self.connect(
|
|
|
&state,
|
|
|
- bridges.get_mut(&bucket[i].fingerprint).unwrap(),
|
|
|
+ bridges
|
|
|
+ .get_mut(&bucket[i].get_hashed_fingerprint())
|
|
|
+ .unwrap(),
|
|
|
&censors.get(&self.country).unwrap(),
|
|
|
) {
|
|
|
succeeded.push(bucket[i]);
|
|
@@ -321,45 +327,49 @@ impl User {
|
|
|
let second_cred = second_cred.as_ref().unwrap();
|
|
|
let (second_bucket, second_reachcred) =
|
|
|
get_bucket(&state.la_net, &second_cred).await;
|
|
|
- if !bridges.contains_key(&second_bucket[0].fingerprint) {
|
|
|
- bridges
|
|
|
- .insert(
|
|
|
- second_bucket[0].fingerprint,
|
|
|
- Bridge::from_bridge_line(&second_bucket[0]),
|
|
|
- )
|
|
|
- .unwrap();
|
|
|
- }
|
|
|
- if self.connect(
|
|
|
- &state,
|
|
|
- bridges.get_mut(&second_bucket[0].fingerprint).unwrap(),
|
|
|
- &censors.get(&self.country).unwrap(),
|
|
|
- ) {
|
|
|
- succeeded.push(second_bucket[0]);
|
|
|
- if second_reachcred.is_some()
|
|
|
- && eligible_for_trust_promotion(&state.la_net, &second_cred).await
|
|
|
- {
|
|
|
- second_level_up = true;
|
|
|
+ for bridgeline in second_bucket {
|
|
|
+ if bridgeline != BridgeLine::default() {
|
|
|
+ if !bridges.contains_key(&bridgeline.get_hashed_fingerprint()) {
|
|
|
+ bridges.insert(
|
|
|
+ bridgeline.get_hashed_fingerprint(),
|
|
|
+ Bridge::from_bridge_line(&bridgeline),
|
|
|
+ );
|
|
|
+ }
|
|
|
+ if self.connect(
|
|
|
+ &state,
|
|
|
+ bridges
|
|
|
+ .get_mut(&bridgeline.get_hashed_fingerprint())
|
|
|
+ .unwrap(),
|
|
|
+ &censors.get(&self.country).unwrap(),
|
|
|
+ ) {
|
|
|
+ succeeded.push(bridgeline);
|
|
|
+ if second_reachcred.is_some()
|
|
|
+ && eligible_for_trust_promotion(&state.la_net, &second_cred).await
|
|
|
+ {
|
|
|
+ second_level_up = true;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ failed.push(bridgeline);
|
|
|
+ }
|
|
|
}
|
|
|
- } else {
|
|
|
- failed.push(second_bucket[0]);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
let mut negative_reports = Vec::<NegativeReport>::new();
|
|
|
let mut positive_reports = Vec::<PositiveReport>::new();
|
|
|
if self.submits_reports {
|
|
|
- for bridge in &failed {
|
|
|
+ for bridgeline in &failed {
|
|
|
negative_reports.push(NegativeReport::from_bridgeline(
|
|
|
- *bridge,
|
|
|
+ *bridgeline,
|
|
|
self.country.to_string(),
|
|
|
BridgeDistributor::Lox,
|
|
|
));
|
|
|
}
|
|
|
if level >= 3 {
|
|
|
- for bridge in &succeeded {
|
|
|
+ for bridgeline in &succeeded {
|
|
|
positive_reports.push(
|
|
|
PositiveReport::from_lox_credential(
|
|
|
- bridge.fingerprint,
|
|
|
+ bridgeline.get_hashed_fingerprint(),
|
|
|
None,
|
|
|
&self.primary_cred,
|
|
|
get_lox_pub(&state.la_pubkeys),
|
|
@@ -392,8 +402,8 @@ impl User {
|
|
|
let censor = censors.get_mut(&self.country).unwrap();
|
|
|
let (bucket, reachcred) = get_bucket(&state.la_net, &self.primary_cred).await;
|
|
|
for bl in bucket {
|
|
|
- censor.learn_bridge(&bl.fingerprint);
|
|
|
- censor.give_lox_cred(&bl.fingerprint, &self.primary_cred);
|
|
|
+ censor.learn_bridge(&bl.get_hashed_fingerprint());
|
|
|
+ censor.give_lox_cred(&bl.get_hashed_fingerprint(), &self.primary_cred);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -461,16 +471,9 @@ impl User {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- // List of fingerprints we contacted. This should not
|
|
|
- // actually be more than one.
|
|
|
- let mut connections = Vec::<[u8; 20]>::new();
|
|
|
- for bridge in succeeded {
|
|
|
- connections.push(bridge.get_hashed_fingerprint());
|
|
|
- }
|
|
|
-
|
|
|
- (new_friends, connections)
|
|
|
+ new_friends
|
|
|
} else {
|
|
|
- (Vec::<User>::new(), Vec::<[u8; 20]>::new())
|
|
|
+ Vec::<User>::new()
|
|
|
}
|
|
|
}
|
|
|
}
|