arti/crates/tor-netdoc
Nick Mathewson 4841b50c9f Minimize the required version for each dependency.
I found these versions empirically, by using the following process:

First, I used `cargo tree --depth 1 --kind all` to get a list of
every immediate dependency we had.

Then, I used `cargo upgrade --workspace package@version` to change
each dependency to the earliest version with which (in theory) the
current version is semver-compatible.  IOW, if the current version
was 3.2.3, I picked "3".  If the current version was 0.12.8, I
picked "0.12".

Then, I used `cargo +nightly upgrade -Z minimal-versions` to
downgrade Cargo.lock to the minimal listed version for each
dependency.  (I had to override a few packages; see .gitlab-ci.yml
for details).

Finally, I repeatedly increased the version of each of our
dependencies until our code compiled and the tests passed.  Here's
what I found that we need:

anyhow >= 1.0.5: Earlier versions break our hyper example.

async-broadcast >= 0.3.2: Earlier versions fail our tests.

async-compression 0.3.5: Earlier versions handled futures and tokio
    differently.

async-trait >= 0.1.2: Earlier versions are too buggy to compile our
    code.

clap 2.33.0: For Arg::default_value_os().

coarsetime >= 0.1.20: exposed as_ticks() function.

curve25519-dalek >= 3.2: For is_identity().

generic-array 0.14.3: Earlier versions don't implement
    From<&[T; 32]>

httparse >= 1.2: Earlier versions didn't implement Error.

itertools at 0.10.1: For at_most_once.

rusqlite >= 0.26.3: for backward compatibility with older rustc.

serde 1.0.103: Older versions break our code.

serde_json >= 1.0.50: Since we need its Value type to implement Eq.

shellexpand >= 2.1: To avoid a broken dirs crate version.

tokio >= 1.4: For Handle::block_on().

tracing >= 0.1.18: Previously, tracing_core and tracing had separate
    LevelFilter types.

typenum >= 1.12: Compatibility with rust-crypto crates

x25519-dalek >= 1.2.0: For was_contributory().

Closes #275.
2022-01-07 19:08:58 -05:00
..
fuzz tor-netdoc: put NS consensus documents behind a feature. 2021-11-12 12:15:34 -05:00
src extend lints to include 'clippy::all' 2021-12-28 20:15:40 +00:00
testdata Move all crates into a `crates` subdirectory. 2021-08-27 09:53:09 -04:00
Cargo.toml Minimize the required version for each dependency. 2022-01-07 19:08:58 -05:00
README.md run ./maint/readmes.sh 2021-11-29 21:29:28 +10:00

README.md

tor-netdoc

Parse and represent directory objects used in Tor.

Overview

Tor has several "directory objects" that it uses to convey information about relays on the network. They are documented in dir-spec.txt.

This crate has common code to parse and validate these documents. Currently, it can handle the metaformat, along with certain parts of the router descriptor type. We will eventually need to handle more types.

This crate is part of Arti, a project to implement Tor in Rust.

Design notes

The crate is derived into three main parts. In the (private) parse module, we have the generic code that we use to parse different kinds of network documents. In the [types] module we have implementations for parsing specific data structures that are used inside directory documents. Finally, the [doc] module defines the parsers for the documents themselves.

Features

build_docs: enable code to construct the objects representing different network documents.

routerdesc: enable support for the "router descriptor" document type, which is needed by bridge clients and relays.

ns-consensus: enable support for the "ns consensus" document type, which some relays cache and serve.

Caveat haxxor: limitations and infelicities

TODO: This crate requires that all of its inputs be valid UTF-8: This is fine only if we assume that proposal 285 is implemented in mainline Tor.

TODO: This crate has several pieces that could probably be split out into other smaller cases, including handling for version numbers and exit policies.

TODO: Many parts of this crate that should eventually be public aren't.

TODO: this crate needs far more tests!

License: MIT OR Apache-2.0