[tor-commits] [tor/master] Merge remote-tracking branch 'isis/bug23881_r1'
nickm at torproject.org
nickm at torproject.org
Mon Mar 19 21:20:46 UTC 2018
commit d8893bc93c52e1edd0a76b81f5d65bb10d790474
Merge: 3716611fe 1f8bd93ec
Author: Nick Mathewson <nickm at torproject.org>
Date: Mon Mar 19 17:20:37 2018 -0400
Merge remote-tracking branch 'isis/bug23881_r1'
src/common/log.c | 31 ++++
src/common/torlog.h | 14 ++
src/or/main.c | 8 +-
src/rust/Cargo.lock | 10 ++
src/rust/Cargo.toml | 3 +-
src/rust/protover/Cargo.toml | 6 +
src/rust/protover/ffi.rs | 8 +-
src/rust/protover/lib.rs | 3 +
src/rust/protover/protover.rs | 20 ++-
src/rust/tor_allocate/tor_allocate.rs | 19 ++-
src/rust/tor_log/Cargo.toml | 18 +++
src/rust/tor_log/lib.rs | 16 ++
src/rust/tor_log/tor_log.rs | 270 ++++++++++++++++++++++++++++++++++
src/rust/tor_util/Cargo.toml | 3 +
src/rust/tor_util/ffi.rs | 13 +-
src/rust/tor_util/lib.rs | 3 +
src/test/test_rust.sh | 2 +-
17 files changed, 423 insertions(+), 24 deletions(-)
diff --cc src/rust/protover/lib.rs
index 8e80fcef4,05687c1fb..d1d49d2a5
--- a/src/rust/protover/lib.rs
+++ b/src/rust/protover/lib.rs
@@@ -26,9 -26,10 +26,12 @@@ extern crate libc
extern crate smartlist;
extern crate external;
extern crate tor_allocate;
+#[macro_use]
+extern crate tor_util;
+ #[macro_use]
+ extern crate tor_log;
+
mod protover;
pub mod ffi;
diff --cc src/rust/protover/protover.rs
index 03776411c,22a94a164..fd1f41d78
--- a/src/rust/protover/protover.rs
+++ b/src/rust/protover/protover.rs
@@@ -1,17 -1,14 +1,18 @@@
// Copyright (c) 2016-2017, The Tor Project, Inc. */
// See LICENSE for licensing information */
- use external::c_tor_version_as_new_as;
-
+use std::str;
use std::str::FromStr;
+use std::ffi::CStr;
use std::fmt;
use std::collections::{HashMap, HashSet};
+use std::ops::Range;
use std::string::String;
+use std::u32;
+ use tor_log::{LogSeverity, LogDomain};
+ use external::c_tor_version_as_new_as;
+
/// The first version of Tor that included "proto" entries in its descriptors.
/// Authorities should use this to decide whether to guess proto lines.
///
@@@ -105,127 -126,67 +106,126 @@@ pub(crate) fn get_supported_protocols_c
///
/// # Returns
///
-/// A `Result` whose `Ok` value is a `HashMap<Proto, <u32>>` holding all
-/// subprotocols and versions currently supported by tor.
-///
-/// The returned `Result`'s `Err` value is an `&'static str` with a description
-/// of the error.
+/// An `&'a str` whose value is the existing protocols supported by tor.
+/// Returned data is in the format as follows:
///
-fn tor_supported() -> Result<HashMap<Proto, HashSet<u32>>, &'static str> {
- parse_protocols(&SUPPORTED_PROTOCOLS)
+/// "HSDir=1-1 LinkAuth=1"
+pub fn get_supported_protocols<'a>() -> &'a str {
+ let supported_cstr: &'static CStr = get_supported_protocols_cstr();
+ let supported: &str = match supported_cstr.to_str() {
+ Ok(x) => x,
+ Err(_) => "",
+ };
+
+ supported
}
-/// Get the unique version numbers supported by a subprotocol.
-///
-/// # Inputs
-///
-/// * `version_string`, a string comprised of "[0-9,-]"
-///
-/// # Returns
-///
-/// A `Result` whose `Ok` value is a `HashSet<u32>` holding all of the unique
-/// version numbers. If there were ranges in the `version_string`, then these
-/// are expanded, i.e. `"1-3"` would expand to `HashSet<u32>::new([1, 2, 3])`.
-/// The returned HashSet is *unordered*.
-///
-/// The returned `Result`'s `Err` value is an `&'static str` with a description
-/// of the error.
-///
-/// # Errors
-///
-/// This function will error if:
-///
-/// * the `version_string` is empty or contains an equals (`"="`) sign,
-/// * the expansion of a version range produces an error (see
-/// `expand_version_range`),
-/// * any single version number is not parseable as an `u32` in radix 10, or
-/// * there are greater than 2^16 version numbers to expand.
-///
-fn get_versions(version_string: &str) -> Result<HashSet<u32>, &'static str> {
- if version_string.is_empty() {
- return Err("version string is empty");
+pub struct SupportedProtocols(HashMap<Proto, Versions>);
+
+impl SupportedProtocols {
+ pub fn from_proto_entries<I, S>(protocol_strs: I) -> Result<Self, &'static str>
+ where
+ I: Iterator<Item = S>,
+ S: AsRef<str>,
+ {
+ let mut parsed = HashMap::new();
+ for subproto in protocol_strs {
+ let (name, version) = get_proto_and_vers(subproto.as_ref())?;
+ parsed.insert(name, version);
+ }
+ Ok(SupportedProtocols(parsed))
}
- let mut versions = HashSet::<u32>::new();
+ /// Translates a string representation of a protocol list to a
+ /// SupportedProtocols instance.
+ ///
+ /// # Examples
+ ///
+ /// ```
+ /// use protover::SupportedProtocols;
+ ///
+ /// let supported_protocols = SupportedProtocols::from_proto_entries_string(
+ /// "HSDir=1-2 HSIntro=3-4"
+ /// );
+ /// ```
+ pub fn from_proto_entries_string(
+ proto_entries: &str,
+ ) -> Result<Self, &'static str> {
+ Self::from_proto_entries(proto_entries.split(" "))
+ }
- for piece in version_string.split(",") {
- if piece.contains("-") {
- for p in expand_version_range(piece)? {
- versions.insert(p);
+ /// Translate the supported tor versions from a string into a
+ /// HashMap, which is useful when looking up a specific
+ /// subprotocol.
+ ///
+ fn tor_supported() -> Result<Self, &'static str> {
+ Self::from_proto_entries_string(get_supported_protocols())
+ }
+}
+
+type Version = u32;
+
+/// Set of versions for a protocol.
+#[derive(Debug, PartialEq, Eq)]
+pub struct Versions(HashSet<Version>);
+
+impl Versions {
+ /// Get the unique version numbers supported by a subprotocol.
+ ///
+ /// # Inputs
+ ///
+ /// * `version_string`, a string comprised of "[0-9,-]"
+ ///
+ /// # Returns
+ ///
+ /// A `Result` whose `Ok` value is a `HashSet<u32>` holding all of the unique
+ /// version numbers. If there were ranges in the `version_string`, then these
+ /// are expanded, i.e. `"1-3"` would expand to `HashSet<u32>::new([1, 2, 3])`.
+ /// The returned HashSet is *unordered*.
+ ///
+ /// The returned `Result`'s `Err` value is an `&'static str` with a description
+ /// of the error.
+ ///
+ /// # Errors
+ ///
+ /// This function will error if:
+ ///
+ /// * the `version_string` is empty or contains an equals (`"="`) sign,
+ /// * the expansion of a version range produces an error (see
+ /// `expand_version_range`),
+ /// * any single version number is not parseable as an `u32` in radix 10, or
+ /// * there are greater than 2^16 version numbers to expand.
+ ///
+ fn from_version_string(
+ version_string: &str,
+ ) -> Result<Self, &'static str> {
+ let mut versions = HashSet::<Version>::new();
+
+ for piece in version_string.split(",") {
+ if piece.contains("-") {
+ for p in expand_version_range(piece)? {
+ versions.insert(p);
+ }
+ } else if piece == "" {
+ continue;
+ } else {
+ let v = u32::from_str(piece).or(
+ Err("invalid protocol entry"),
+ )?;
+ if v == u32::MAX {
+ return Err("invalid protocol entry");
+ }
+ versions.insert(v);
}
- } else {
- versions.insert(u32::from_str(piece).or(
- Err("invalid protocol entry"),
- )?);
- }
- if versions.len() > MAX_PROTOCOLS_TO_EXPAND as usize {
- return Err("Too many versions to expand");
+ if versions.len() > MAX_PROTOCOLS_TO_EXPAND {
+ return Err("Too many versions to expand");
+ }
}
+ Ok(Versions(versions))
}
- Ok(versions)
}
-
/// Parse the subprotocol type and its version numbers.
///
/// # Inputs
diff --cc src/rust/tor_util/lib.rs
index 12cb3896b,4d5cbb568..94697b606
--- a/src/rust/tor_util/lib.rs
+++ b/src/rust/tor_util/lib.rs
@@@ -7,5 -8,7 +7,8 @@@
extern crate libc;
extern crate tor_allocate;
+ #[macro_use]
+ extern crate tor_log;
+
pub mod ffi;
+pub mod strings;
More information about the tor-commits
mailing list