Skip to content

Simplify BridgeLine struct and make it variable length

Cecylia Bocovich requested to merge cohosh/lox-rs:issue/60 into main

Closes #60

This is a big change, all for the purpose of removing the fixed length limit from the BridgeLine struct. While I was making the change, I took the liberty of modifying the BridgeLine into something more usable for the client.

Note: this change is not backwards compatible, but it was never going to be. Even if all we changed was the BRIDGE_BYTES value, old clients wouldn't be able to decrypt/decode the bridge table entries properly because they assumed an outdated value. However, this change should provide a path towards backwards compatibility if changes are made later.

To break down the changes into pieces:

  • The new BridgeLine struct was modified to:

    pub struct BridgeLine {
        pub uid_fingerprint: u64,
        pub line: String,

    We didn't need the other fields for anything Lox related, and all the client really needs is the bridge line string. Note also that there is no fixed length for the line field.

  • Modified the encoding of Bucket and BridgeLine to use protobufs

    The previous encoding relied on both structs having fixed-length fields. I went with protobufs for a few reasons:

    • There is a nice library for it, called prost, that is popular and maintained by the tokio-rs project.
    • It's interoperable, meaning that we're using a deterministic protobuf schema, so any other client implementation that uses the same schema should be able to decode and decrypt the bridge table entries just fine.
    • It allows for forward and backward compatibility, though we have to be careful here. The prost library allows us to annotate struct fields with tags, which help maintain a deterministic schema even if we reorder or remove struct fields. We have to be careful though if we rename the fields or add new ones, to use a different tag for it.
  • The Resource struct in the rdsys-backend-api crate changed the type of the params field:

    pub struct Resource {
      pub r#type: String,
      pub blocked_in: HashMap<String, bool>,
      pub test_result: TestResults,
      pub protocol: String,
      pub address: String,
      pub port: u16,
      pub fingerprint: String,
      #[serde(rename = "or-addresses")]
      pub or_addresses: Option<Vec<String>>,
      pub distribution: String,
      pub flags: Option<HashMap<String, bool>>,
      #[serde_as(as = "Option<Map<_,_>>")]
      pub params: Option<Vec<(String, String)>>,

    This change was necessary to create a deterministic bridge line string when parsing the resources in the lox-distributor.

  • Lots of new new tests

Merge request reports