Commit 40cc8283 authored by Nick Mathewson's avatar Nick Mathewson 🥔
Browse files

hss: implement HasKind for several errors.

parent 08271673
Loading
Loading
Loading
Loading
+19 −0
Original line number Diff line number Diff line
@@ -67,6 +67,25 @@ pub enum ClientError {
    /// Failed to complete a rendezvous request.
    #[error("Could not connect rendezvous circuit.")]
    EstablishSession(#[source] EstablishSessionError),

    /// Failed to send a CONNECTED message and get a stream.
    #[error("Could not accept stream from rendezvous circuit")]
    AcceptStream(#[source] tor_proto::Error),

    /// Failed to send a END message and reject a stream.
    #[error("Could not reject stream from rendezvous circuit")]
    RejectStream(#[source] tor_proto::Error),
}

impl HasKind for ClientError {
    fn kind(&self) -> ErrorKind {
        match self {
            ClientError::BadIntroduce(e) => e.kind(),
            ClientError::EstablishSession(e) => e.kind(),
            ClientError::AcceptStream(e) => e.kind(),
            ClientError::RejectStream(e) => e.kind(),
        }
    }
}

/// An error which means we cannot continue to try to operate an onion service.
+31 −1
Original line number Diff line number Diff line
@@ -15,7 +15,7 @@ use tor_circmgr::{
    build::circparameters_from_netparameters,
    hspool::{HsCircKind, HsCircPool},
};
use tor_error::into_internal;
use tor_error::{into_internal, HasKind};
use tor_linkspec::{
    decode::Strictness, verbatim::VerbatimLinkSpecCircTarget, CircTarget as _,
    OwnedChanTargetBuilder, OwnedCircTarget,
@@ -51,6 +51,18 @@ pub enum IntroRequestError {
    InvalidLinkSpecs(#[source] tor_linkspec::decode::ChanTargetDecodeError),
}

impl HasKind for IntroRequestError {
    fn kind(&self) -> tor_error::ErrorKind {
        use tor_error::ErrorKind as EK;
        use IntroRequestError as E;
        match self {
            E::InvalidHandshake(e) => e.kind(),
            E::InvalidPayload(_) => EK::RemoteProtocolViolation,
            E::InvalidLinkSpecs(_) => EK::RemoteProtocolViolation,
        }
    }
}

/// An error produced while trying to connect to a rendezvous point and open a
/// session with a client.
#[derive(Debug, Clone, thiserror::Error)]
@@ -87,6 +99,24 @@ pub enum EstablishSessionError {
    Bug(#[from] tor_error::Bug),
}

impl HasKind for EstablishSessionError {
    fn kind(&self) -> tor_error::ErrorKind {
        use tor_error::ErrorKind as EK;
        use EstablishSessionError as E;
        match self {
            E::NetdirUnavailable(e) => e.kind(),
            E::UnsupportedOnionKey => EK::RemoteProtocolViolation,
            // TODO HSS Not quite right.
            EstablishSessionError::RendCirc(e) => EK::RemoteNetworkTimeout,
            EstablishSessionError::VirtualHop(e) => e.kind(),
            EstablishSessionError::AcceptBegins(e) => e.kind(),
            EstablishSessionError::SendRendezvous(e) => e.kind(),
            EstablishSessionError::ImpossibleIds(_) => EK::RemoteProtocolViolation,
            EstablishSessionError::Bug(e) => e.kind(),
        }
    }
}

/// A decrypted request from an onion service client which we can
/// choose to answer (or not).
///