diff options
author | 2024-12-04 17:38:36 +0000 | |
---|---|---|
committer | 2024-12-04 17:38:36 +0000 | |
commit | 21f10a0b43c4ab1429b274b386065c023c661ab0 (patch) | |
tree | 9e65aae47363f6ba2f1f8c10cb9ed7c35c82e5b2 /src/jabber.rs | |
parent | 4886396044356d2676a77c3900af796fe7641f42 (diff) | |
download | luz-21f10a0b43c4ab1429b274b386065c023c661ab0.tar.gz luz-21f10a0b43c4ab1429b274b386065c023c661ab0.tar.bz2 luz-21f10a0b43c4ab1429b274b386065c023c661ab0.zip |
implement send_stanza
Diffstat (limited to 'src/jabber.rs')
-rw-r--r-- | src/jabber.rs | 92 |
1 files changed, 9 insertions, 83 deletions
diff --git a/src/jabber.rs b/src/jabber.rs index 30dc15d..8ee45b5 100644 --- a/src/jabber.rs +++ b/src/jabber.rs @@ -50,6 +50,7 @@ where S: AsyncRead + AsyncWrite + Unpin + Send + std::fmt::Debug, JabberStream<S>: std::fmt::Debug, { + #[instrument] pub async fn sasl(mut self, mechanisms: Mechanisms, sasl_config: Arc<SASLConfig>) -> Result<S> { let sasl = SASLClient::new(sasl_config); let mut offered_mechs: Vec<&Mechname> = Vec::new(); @@ -139,6 +140,7 @@ where Ok(stream) } + #[instrument] pub async fn bind(mut self, jid: &mut JID) -> Result<Self> { let iq_id = nanoid::nanoid!(); if let Some(resource) = &jid.resourcepart { @@ -266,6 +268,7 @@ where Ok(Self { reader, writer }) } + #[instrument] pub async fn get_features(mut self) -> Result<(Features, Self)> { debug!("getting features"); let features: Features = self.reader.read().await?; @@ -276,91 +279,16 @@ where pub fn into_inner(self) -> S { self.reader.into_inner().unsplit(self.writer.into_inner()) } -} - -impl JabberStream<Unencrypted> { - // pub async fn negotiate<S: AsyncRead + AsyncWrite + Unpin>( - // mut self, - // features: Features, - // ) -> Result<Feature> { - // // TODO: timeout - // if let Some(Feature::StartTls(_)) = features - // .features - // .iter() - // .find(|feature| matches!(feature, Feature::StartTls(_s))) - // { - // return Ok(self); - // } else { - // // TODO: better error - // return Err(Error::TlsRequired); - // } - // } - // #[async_recursion] - // pub async fn negotiate_tls_optional(mut self) -> Result<Connection> { - // self.start_stream().await?; - // // TODO: timeout - // let features = self.get_features().await?.features; - // if let Some(Feature::StartTls(_)) = features - // .iter() - // .find(|feature| matches!(feature, Feature::StartTls(_s))) - // { - // let jabber = self.starttls().await?; - // let jabber = jabber.negotiate().await?; - // return Ok(Connection::Encrypted(jabber)); - // } else if let (Some(sasl_config), Some(Feature::Sasl(mechanisms))) = ( - // self.auth.clone(), - // features - // .iter() - // .find(|feature| matches!(feature, Feature::Sasl(_))), - // ) { - // self.sasl(mechanisms.clone(), sasl_config).await?; - // let jabber = self.negotiate_tls_optional().await?; - // Ok(jabber) - // } else if let Some(Feature::Bind) = features - // .iter() - // .find(|feature| matches!(feature, Feature::Bind)) - // { - // self.bind().await?; - // Ok(Connection::Unencrypted(self)) - // } else { - // // TODO: better error - // return Err(Error::Negotiation); - // } - // } -} - -impl JabberStream<Tls> { - // #[async_recursion] - // pub async fn negotiate(mut self) -> Result<JabberStream<Tls>> { - // self.start_stream().await?; - // let features = self.get_features().await?.features; - - // if let (Some(sasl_config), Some(Feature::Sasl(mechanisms))) = ( - // self.auth.clone(), - // features - // .iter() - // .find(|feature| matches!(feature, Feature::Sasl(_))), - // ) { - // // TODO: avoid clone - // self.sasl(mechanisms.clone(), sasl_config).await?; - // let jabber = self.negotiate().await?; - // Ok(jabber) - // } else if let Some(Feature::Bind) = features - // .iter() - // .find(|feature| matches!(feature, Feature::Bind)) - // { - // self.bind().await?; - // Ok(self) - // } else { - // // TODO: better error - // return Err(Error::Negotiation); - // } - // } + pub async fn send_stanza(&mut self, stanza: &Stanza) -> Result<()> { + self.writer.write(stanza).await?; + Ok(()) + } } impl JabberStream<Unencrypted> { - pub async fn starttls(mut self, domain: impl AsRef<str>) -> Result<Tls> { + #[instrument] + pub async fn starttls(mut self, domain: impl AsRef<str> + std::fmt::Debug) -> Result<Tls> { self.writer .write_full(&StartTls { required: false }) .await?; @@ -372,8 +300,6 @@ impl JabberStream<Unencrypted> { .connect(domain.as_ref(), stream) .await { - // let (read, write) = tokio::io::split(tlsstream); - // let client = JabberStream::new(read, write); return Ok(tls_stream); } else { return Err(Error::Connection); |