diff options
Diffstat (limited to 'src/stanza')
| -rw-r--r-- | src/stanza/sasl.rs | 84 | 
1 files changed, 80 insertions, 4 deletions
| diff --git a/src/stanza/sasl.rs b/src/stanza/sasl.rs index 6ac4fc9..ec6f63c 100644 --- a/src/stanza/sasl.rs +++ b/src/stanza/sasl.rs @@ -105,10 +105,10 @@ impl FromElement for Challenge {  }  #[derive(Debug)] -pub struct Success(String); +pub struct Success(Option<String>);  impl Deref for Success { -    type Target = str; +    type Target = Option<String>;      fn deref(&self) -> &Self::Target {          &self.0 @@ -120,7 +120,7 @@ impl FromElement for Success {          element.check_name("success")?;          element.check_namespace(XMLNS)?; -        let sasl_data = element.value()?; +        let sasl_data = element.value_opt()?;          Ok(Success(sasl_data))      } @@ -130,10 +130,12 @@ impl FromElement for Success {  pub enum ServerResponse {      Challenge(Challenge),      Success(Success), +    Failure(Failure),  }  impl FromElement for ServerResponse {      fn from_element(element: Element) -> peanuts::element::DeserializeResult<Self> { +        debug!("identification: {:?}", element.identify());          match element.identify() {              (Some(XMLNS), "challenge") => {                  Ok(ServerResponse::Challenge(Challenge::from_element(element)?)) @@ -141,6 +143,9 @@ impl FromElement for ServerResponse {              (Some(XMLNS), "success") => {                  Ok(ServerResponse::Success(Success::from_element(element)?))              } +            (Some(XMLNS), "failure") => { +                Ok(ServerResponse::Failure(Failure::from_element(element)?)) +            }              _ => Err(DeserializeError::UnexpectedElement(element)),          }      } @@ -165,6 +170,77 @@ impl Deref for Response {  impl IntoElement for Response {      fn builder(&self) -> peanuts::element::ElementBuilder { -        Element::builder("reponse", Some(XMLNS)).push_text(self.0.clone()) +        Element::builder("response", Some(XMLNS)).push_text(self.0.clone()) +    } +} + +#[derive(Debug)] +pub struct Failure { +    r#type: Option<FailureType>, +    text: Option<Text>, +} + +impl FromElement for Failure { +    fn from_element(mut element: Element) -> peanuts::element::DeserializeResult<Self> { +        element.check_name("failure")?; +        element.check_namespace(XMLNS)?; + +        let r#type = element.pop_child_opt()?; +        let text = element.pop_child_opt()?; + +        Ok(Failure { r#type, text }) +    } +} + +#[derive(Debug)] +pub enum FailureType { +    Aborted, +    AccountDisabled, +    CredentialsExpired, +    EncryptionRequired, +    IncorrectEncoding, +    InvalidAuthzid, +    InvalidMechanism, +    MalformedRequest, +    MechanismTooWeak, +    NotAuthorized, +    TemporaryAuthFailure, +} + +impl FromElement for FailureType { +    fn from_element(element: Element) -> peanuts::element::DeserializeResult<Self> { +        match element.identify() { +            (Some(XMLNS), "aborted") => Ok(FailureType::Aborted), +            (Some(XMLNS), "account-disabled") => Ok(FailureType::AccountDisabled), +            (Some(XMLNS), "credentials-expired") => Ok(FailureType::CredentialsExpired), +            (Some(XMLNS), "encryption-required") => Ok(FailureType::EncryptionRequired), +            (Some(XMLNS), "incorrect-encoding") => Ok(FailureType::IncorrectEncoding), +            (Some(XMLNS), "invalid-authzid") => Ok(FailureType::InvalidAuthzid), +            (Some(XMLNS), "invalid-mechanism") => Ok(FailureType::InvalidMechanism), +            (Some(XMLNS), "malformed-request") => Ok(FailureType::MalformedRequest), +            (Some(XMLNS), "mechanism-too-weak") => Ok(FailureType::MechanismTooWeak), +            (Some(XMLNS), "not-authorized") => Ok(FailureType::NotAuthorized), +            (Some(XMLNS), "temporary-auth-failure") => Ok(FailureType::TemporaryAuthFailure), +            _ => Err(DeserializeError::UnexpectedElement(element)), +        } +    } +} + +#[derive(Debug)] +pub struct Text { +    lang: Option<String>, +    text: Option<String>, +} + +impl FromElement for Text { +    fn from_element(mut element: Element) -> peanuts::element::DeserializeResult<Self> { +        element.check_name("text")?; +        element.check_namespace(XMLNS)?; + +        let lang = element.attribute_opt_namespaced("lang", peanuts::XML_NS)?; + +        let text = element.pop_value_opt()?; + +        Ok(Text { lang, text })      }  } | 
