|
|
@@ -28,9 +28,7 @@ The user presents their current Lox credential:
|
|
|
and a Resolve credential (which may have all fields 0):
|
|
|
- pending: revealed to be the same as in the above Lox credential
|
|
|
- new_false_reports: revealed
|
|
|
-- bridge_0_pending: revealed
|
|
|
-- bridge_1_pending: revealed
|
|
|
-- bridge_2_pending: revealed
|
|
|
+- bridges_pending: revealed
|
|
|
|
|
|
and a new Lox credential to be issued:
|
|
|
|
|
|
@@ -73,7 +71,7 @@ const SESSION_ID: &[u8] = b"report_submit";
|
|
|
|
|
|
muCMZProtocol! { report_submit<max_false_reports, bucket>,
|
|
|
[ L: Lox { id: R, bucket: H, trust_level: H, level_since: H, invites_remaining: H, blockages: H, false_reports: H, pending: R },
|
|
|
- R: Resolve { pending: R, new_false_reports: R, bridge_0_pending: R, bridge_1_pending: R, bridge_2_pending: R } ],
|
|
|
+ R: Resolve { pending: R, new_false_reports: R, bridges_pending: R } ],
|
|
|
N: Lox { id: J, bucket: H, trust_level: H, level_since: H, invites_remaining: H, blockages: H, false_reports: H, pending: S },
|
|
|
L.bucket = bucket,
|
|
|
N.bucket = L.bucket,
|
|
|
@@ -141,10 +139,21 @@ pub fn request(
|
|
|
));
|
|
|
}
|
|
|
|
|
|
- // Check that we're reporting at least one bridge
|
|
|
+ // Check that we're reporting at least one bridge and that we're not
|
|
|
+ // reporting any bridges with pending reports
|
|
|
let mut reporting_a_bridge = false;
|
|
|
- for br in bridges_being_reported {
|
|
|
- if br {
|
|
|
+ let bridges_with_pending_reports = R.bridges_pending.unwrap().as_bytes()[0];
|
|
|
+ for i in 0..MAX_BRIDGES_PER_BUCKET {
|
|
|
+ if bridges_being_reported[i] {
|
|
|
+ if bridges_with_pending_reports & 1 << i != 0 {
|
|
|
+ return Err(CredentialError::InvalidField(
|
|
|
+ String::from("bridges_being_reported"),
|
|
|
+ format!(
|
|
|
+ "resolve credential shows bridge {} still has a pending report",
|
|
|
+ i
|
|
|
+ ),
|
|
|
+ ));
|
|
|
+ }
|
|
|
reporting_a_bridge = true;
|
|
|
}
|
|
|
}
|
|
|
@@ -254,12 +263,14 @@ impl BridgeAuth {
|
|
|
}
|
|
|
};
|
|
|
|
|
|
- // Check that user indicated at least one non-default bridge to
|
|
|
- // submit a report for
|
|
|
- let bridges_pending = [R.bridge_0_pending, R.bridge_1_pending, R.bridge_2_pending];
|
|
|
+ // Check that user indicated at least one non-default
|
|
|
+ // bridge to submit a report for and that the user is
|
|
|
+ // not submitting a report for any bridge that already
|
|
|
+ // has a pending report
|
|
|
+ let bridges_with_pending_reports = R.bridges_pending.unwrap().as_bytes()[0];
|
|
|
for i in 0..MAX_BRIDGES_PER_BUCKET {
|
|
|
if bridges_being_reported[i] {
|
|
|
- if bridges_pending[i] != Some(Scalar::ZERO) {
|
|
|
+ if bridges_with_pending_reports & 1 << i != 0 {
|
|
|
return Err(CMZError::RevealAttrMissing(
|
|
|
"bridges_being_reported",
|
|
|
"Report submitted for a bridge that already has a pending report",
|
|
|
@@ -405,9 +416,7 @@ mod tests {
|
|
|
assert_eq!(pending_1 + Scalar::ONE, pending_2);
|
|
|
assert_eq!(resolve_cred.pending.unwrap(), pending_2);
|
|
|
assert_eq!(resolve_cred.new_false_reports, Some(Scalar::ZERO));
|
|
|
- assert_eq!(resolve_cred.bridge_0_pending, Some(Scalar::ONE));
|
|
|
- assert_eq!(resolve_cred.bridge_1_pending, Some(Scalar::ZERO));
|
|
|
- assert_eq!(resolve_cred.bridge_2_pending, Some(Scalar::ZERO));
|
|
|
+ assert_eq!(resolve_cred.bridges_pending, Some(Scalar::ONE));
|
|
|
|
|
|
// Resolve (stay in pending state because we have a pending report)
|
|
|
lox_cred = th.report_resolve(rng, lox_cred.clone(), resolve_cred.clone());
|
|
|
@@ -421,9 +430,7 @@ mod tests {
|
|
|
assert_eq!(pending_2 + Scalar::ONE, pending_3);
|
|
|
assert_eq!(resolve_cred.pending.unwrap(), pending_3);
|
|
|
assert_eq!(resolve_cred.new_false_reports, Some(Scalar::ZERO));
|
|
|
- assert_eq!(resolve_cred.bridge_0_pending, Some(Scalar::ONE));
|
|
|
- assert_eq!(resolve_cred.bridge_1_pending, Some(Scalar::ZERO));
|
|
|
- assert_eq!(resolve_cred.bridge_2_pending, Some(Scalar::ZERO));
|
|
|
+ assert_eq!(resolve_cred.bridges_pending, Some(Scalar::ONE));
|
|
|
|
|
|
// We should be unable to submit another report for bridge 0 due
|
|
|
// to pending report for bridge 0
|
|
|
@@ -434,12 +441,7 @@ mod tests {
|
|
|
cc,
|
|
|
[true, false, false],
|
|
|
);
|
|
|
- let ((rs_request, _rs_client_state), cc_server, D, bridges_being_reported_server) =
|
|
|
- report_submit_request.unwrap();
|
|
|
- let report_submit_response =
|
|
|
- th.ba
|
|
|
- .handle_report_submit(rs_request, cc_server, D, bridges_being_reported_server);
|
|
|
- assert!(report_submit_response.is_err());
|
|
|
+ assert!(report_submit_request.is_err());
|
|
|
|
|
|
// Let the report time out
|
|
|
th.ba.report_table.mark_old_reports_simulated_time(
|
|
|
@@ -455,9 +457,7 @@ mod tests {
|
|
|
assert_eq!(pending_3 + Scalar::ONE, pending_4);
|
|
|
assert_eq!(resolve_cred.pending.unwrap(), pending_4);
|
|
|
assert_eq!(resolve_cred.new_false_reports, Some(Scalar::ZERO));
|
|
|
- assert_eq!(resolve_cred.bridge_0_pending, Some(Scalar::ZERO));
|
|
|
- assert_eq!(resolve_cred.bridge_1_pending, Some(Scalar::ZERO));
|
|
|
- assert_eq!(resolve_cred.bridge_2_pending, Some(Scalar::ZERO));
|
|
|
+ assert_eq!(resolve_cred.bridges_pending, Some(Scalar::ZERO));
|
|
|
|
|
|
// Submit another report for bridge 0
|
|
|
lox_cred = th.report_submit(
|
|
|
@@ -484,9 +484,7 @@ mod tests {
|
|
|
assert_eq!(pending_4 + Scalar::ONE, pending_5);
|
|
|
assert_eq!(resolve_cred.pending.unwrap(), pending_5);
|
|
|
assert_eq!(resolve_cred.new_false_reports, Some(Scalar::ONE));
|
|
|
- assert_eq!(resolve_cred.bridge_0_pending, Some(Scalar::ZERO));
|
|
|
- assert_eq!(resolve_cred.bridge_1_pending, Some(Scalar::ZERO));
|
|
|
- assert_eq!(resolve_cred.bridge_2_pending, Some(Scalar::ZERO));
|
|
|
+ assert_eq!(resolve_cred.bridges_pending, Some(Scalar::ZERO));
|
|
|
|
|
|
// Submit a new report. We need to increase false_reports.
|
|
|
lox_cred = th.report_submit(
|