/ crates / tor-netdir / src / err.rs
err.rs
 1  //! Declare error type for tor-netdir
 2  
 3  use thiserror::Error;
 4  use tor_error::HasKind;
 5  
 6  /// An error returned by the network directory code
 7  #[derive(Error, Clone, Debug)]
 8  #[non_exhaustive]
 9  pub enum Error {
10      /// We don't have enough directory info to build circuits
11      #[error("Not enough directory information to build circuits")]
12      NotEnoughInfo,
13      /// We don't have any directory information.
14      #[error("No directory information available")]
15      NoInfo,
16      /// We have directory information, but it is too expired to use.
17      #[error("Directory is expired, and we haven't got a new one yet")]
18      DirExpired,
19      /// We have directory information, but it is too expired to use.
20      #[error("Directory is published too far in the future: Your clock is probably wrong")]
21      DirNotYetValid,
22      /// We received a consensus document that should be impossible.
23      #[error("Invalid information from consensus document: {0}")]
24      InvalidConsensus(&'static str),
25  }
26  
27  impl HasKind for Error {
28      fn kind(&self) -> tor_error::ErrorKind {
29          use tor_error::ErrorKind as EK;
30          use Error as E;
31          match self {
32              E::DirExpired => EK::DirectoryExpired,
33              E::DirNotYetValid => EK::ClockSkew,
34              E::NotEnoughInfo | E::NoInfo => EK::BootstrapRequired,
35              E::InvalidConsensus(_) => EK::TorProtocolViolation,
36          }
37      }
38  }
39  
40  /// An error returned when looking up onion service directories.
41  #[derive(Error, Clone, Debug)]
42  #[cfg(feature = "hs-common")]
43  #[cfg_attr(docsrs, doc(cfg(feature = "hs-common")))]
44  #[non_exhaustive]
45  pub enum OnionDirLookupError {
46      /// We tried to look up an onion service directory for a time period that
47      /// did not correspond to one of our hash rings.
48      #[error("Tried to look up an onion service directory for an invalid time period.")]
49      WrongTimePeriod,
50  }
51  
52  #[cfg(feature = "hs-common")]
53  impl HasKind for OnionDirLookupError {
54      fn kind(&self) -> tor_error::ErrorKind {
55          use tor_error::ErrorKind as EK;
56          use OnionDirLookupError as E;
57          match self {
58              E::WrongTimePeriod => EK::BadApiUsage,
59          }
60      }
61  }