|
@@ -90,19 +90,27 @@ impl User {
|
|
|
.unwrap();
|
|
|
if is_censor {
|
|
|
censor.learn_bridge(&bridgeline.get_hashed_fingerprint());
|
|
|
- } else if Self::connect(in_censorship_range, config, bridge, censor) {
|
|
|
- able_to_connect = true;
|
|
|
- } else if submits_reports {
|
|
|
- // New user only has one bridge, so no need
|
|
|
- // to collect the negative reports before
|
|
|
- // sending. Just send one now.
|
|
|
- let mut negative_reports = Vec::<NegativeReport>::new();
|
|
|
- negative_reports.push(NegativeReport::from_bridgeline(
|
|
|
- bridgeline,
|
|
|
- config.country.to_string(),
|
|
|
- BridgeDistributor::Lox,
|
|
|
- ));
|
|
|
- Self::send_negative_reports(&config, negative_reports).await?;
|
|
|
+ } else {
|
|
|
+ // If this is the first time the bridge has been
|
|
|
+ // distributed to a real user, store that info
|
|
|
+ if bridge.first_real_user == 0 {
|
|
|
+ bridge.first_real_user = get_date();
|
|
|
+ }
|
|
|
+
|
|
|
+ if Self::connect(in_censorship_range, config, bridge, censor) {
|
|
|
+ able_to_connect = true;
|
|
|
+ } else if submits_reports {
|
|
|
+ // New user only has one bridge, so no need
|
|
|
+ // to collect the negative reports before
|
|
|
+ // sending. Just send one now.
|
|
|
+ let mut negative_reports = Vec::<NegativeReport>::new();
|
|
|
+ negative_reports.push(NegativeReport::from_bridgeline(
|
|
|
+ bridgeline,
|
|
|
+ config.country.to_string(),
|
|
|
+ BridgeDistributor::Lox,
|
|
|
+ ));
|
|
|
+ Self::send_negative_reports(&config, negative_reports).await?;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -138,16 +146,28 @@ impl User {
|
|
|
)
|
|
|
.await?;
|
|
|
self.primary_cred = new_cred;
|
|
|
- if self.is_censor {
|
|
|
- // Make sure censor has access to each bridge and each
|
|
|
- // credential
|
|
|
- let (bucket, _reachcred) = get_bucket(&config.la_net, &self.primary_cred).await?;
|
|
|
- for bl in bucket {
|
|
|
+ // Make sure bridge is in list of bridges and that censor has
|
|
|
+ // access if applicable
|
|
|
+ let (bucket, _reachcred) = get_bucket(&config.la_net, &self.primary_cred).await?;
|
|
|
+ for bl in bucket {
|
|
|
+ if bl != BridgeLine::default() {
|
|
|
let fingerprint = bl.get_hashed_fingerprint();
|
|
|
- censor.learn_bridge(&fingerprint);
|
|
|
- censor.give_lox_cred(&fingerprint, &self.primary_cred);
|
|
|
+ if !bridges.contains_key(&fingerprint) {
|
|
|
+ let bridge = Bridge::from_bridge_line(&bl);
|
|
|
+ bridges.insert(fingerprint, bridge);
|
|
|
+ }
|
|
|
+ let bridge = bridges.get_mut(&fingerprint).unwrap();
|
|
|
+ if self.is_censor {
|
|
|
+ censor.learn_bridge(&fingerprint);
|
|
|
+ censor.give_lox_cred(&fingerprint, &self.primary_cred);
|
|
|
+ // If this is the first time the bridge has been
|
|
|
+ // distributed to a real user, store that info
|
|
|
+ } else if bridge.first_real_user == 0 {
|
|
|
+ bridge.first_real_user = get_date();
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
let friend_cred = redeem_invite(
|
|
|
&config.la_net,
|
|
|
&invite,
|
|
@@ -184,24 +204,31 @@ impl User {
|
|
|
let mut negative_reports = Vec::<NegativeReport>::new();
|
|
|
let (bucket, _reachcred) = get_bucket(&config.la_net, &friend_cred).await?;
|
|
|
for bridgeline in bucket {
|
|
|
+ let fingerprint = bridgeline.get_hashed_fingerprint();
|
|
|
if bridgeline != BridgeLine::default() {
|
|
|
- if !bridges.contains_key(&bridgeline.get_hashed_fingerprint()) {
|
|
|
+ if !bridges.contains_key(&fingerprint) {
|
|
|
let bridge = Bridge::from_bridge_line(&bridgeline);
|
|
|
- bridges.insert(bridgeline.get_hashed_fingerprint(), bridge);
|
|
|
+ bridges.insert(fingerprint, bridge);
|
|
|
}
|
|
|
- let bridge = bridges
|
|
|
- .get_mut(&bridgeline.get_hashed_fingerprint())
|
|
|
- .unwrap();
|
|
|
+ let bridge = bridges.get_mut(&fingerprint).unwrap();
|
|
|
if is_censor {
|
|
|
- censor.learn_bridge(&bridgeline.get_hashed_fingerprint());
|
|
|
- } else if Self::connect(in_censorship_range, config, bridge, censor) {
|
|
|
- able_to_connect = true;
|
|
|
- } else if submits_reports {
|
|
|
- negative_reports.push(NegativeReport::from_bridgeline(
|
|
|
- bridgeline,
|
|
|
- config.country.to_string(),
|
|
|
- BridgeDistributor::Lox,
|
|
|
- ));
|
|
|
+ censor.learn_bridge(&fingerprint);
|
|
|
+ } else {
|
|
|
+ // If this is the first time the bridge has been
|
|
|
+ // distributed to a real user, store that info
|
|
|
+ if bridge.first_real_user == 0 {
|
|
|
+ bridge.first_real_user = get_date();
|
|
|
+ }
|
|
|
+
|
|
|
+ if Self::connect(in_censorship_range, config, bridge, censor) {
|
|
|
+ able_to_connect = true;
|
|
|
+ } else if submits_reports {
|
|
|
+ negative_reports.push(NegativeReport::from_bridgeline(
|
|
|
+ bridgeline,
|
|
|
+ config.country.to_string(),
|
|
|
+ BridgeDistributor::Lox,
|
|
|
+ ));
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -370,9 +397,17 @@ impl User {
|
|
|
// Make sure each bridge in bucket is in the global bridges set
|
|
|
for bridgeline in bucket {
|
|
|
if bridgeline != BridgeLine::default() {
|
|
|
- if !bridges.contains_key(&bridgeline.get_hashed_fingerprint()) {
|
|
|
+ let fingerprint = bridgeline.get_hashed_fingerprint();
|
|
|
+ if !bridges.contains_key(&fingerprint) {
|
|
|
let bridge = Bridge::from_bridge_line(&bridgeline);
|
|
|
- bridges.insert(bridgeline.get_hashed_fingerprint(), bridge);
|
|
|
+ bridges.insert(fingerprint, bridge);
|
|
|
+ }
|
|
|
+
|
|
|
+ // If this is the first time the bridge has been
|
|
|
+ // distributed to a real user, store that info
|
|
|
+ let bridge = bridges.get_mut(&fingerprint).unwrap();
|
|
|
+ if bridge.first_real_user == 0 {
|
|
|
+ bridge.first_real_user = get_date();
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -437,21 +472,23 @@ impl User {
|
|
|
get_bucket(&config.la_net, &second_cred).await?;
|
|
|
for bridgeline in second_bucket {
|
|
|
if bridgeline != BridgeLine::default() {
|
|
|
- if !bridges.contains_key(&bridgeline.get_hashed_fingerprint()) {
|
|
|
+ let fingerprint = bridgeline.get_hashed_fingerprint();
|
|
|
+ if !bridges.contains_key(&fingerprint) {
|
|
|
bridges.insert(
|
|
|
- bridgeline.get_hashed_fingerprint(),
|
|
|
+ bridgeline.fingerprint,
|
|
|
Bridge::from_bridge_line(&bridgeline),
|
|
|
);
|
|
|
}
|
|
|
+
|
|
|
+ // If this is the first time the bridge has been
|
|
|
+ // distributed to a real user, store that info
|
|
|
+ let bridge = bridges.get_mut(&fingerprint).unwrap();
|
|
|
+ if bridge.first_real_user == 0 {
|
|
|
+ bridge.first_real_user = get_date();
|
|
|
+ }
|
|
|
+
|
|
|
// Attempt to connect to second cred's bridge
|
|
|
- if Self::connect(
|
|
|
- self.in_censorship_range,
|
|
|
- &config,
|
|
|
- bridges
|
|
|
- .get_mut(&bridgeline.get_hashed_fingerprint())
|
|
|
- .unwrap(),
|
|
|
- censor,
|
|
|
- ) {
|
|
|
+ if Self::connect(self.in_censorship_range, &config, bridge, censor) {
|
|
|
succeeded.push(bridgeline);
|
|
|
if second_reachcred.is_some()
|
|
|
&& eligible_for_trust_promotion(&config.la_net, &second_cred).await
|