aboutsummaryrefslogtreecommitdiffstats
path: root/src/jabber.rs
diff options
context:
space:
mode:
authorLibravatar cel 🌸 <cel@bunny.garden>2024-12-04 17:38:36 +0000
committerLibravatar cel 🌸 <cel@bunny.garden>2024-12-04 17:38:36 +0000
commit21f10a0b43c4ab1429b274b386065c023c661ab0 (patch)
tree9e65aae47363f6ba2f1f8c10cb9ed7c35c82e5b2 /src/jabber.rs
parent4886396044356d2676a77c3900af796fe7641f42 (diff)
downloadluz-21f10a0b43c4ab1429b274b386065c023c661ab0.tar.gz
luz-21f10a0b43c4ab1429b274b386065c023c661ab0.tar.bz2
luz-21f10a0b43c4ab1429b274b386065c023c661ab0.zip
implement send_stanza
Diffstat (limited to 'src/jabber.rs')
-rw-r--r--src/jabber.rs92
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);