diff --git a/tokio-xmpp/ChangeLog b/tokio-xmpp/ChangeLog index 2710f09cc8ecf178ddcad5ce8a884972600f531f..2d585a3460ca3b4e858e8bd2c6b61b9519aa1892 100644 --- a/tokio-xmpp/ChangeLog +++ b/tokio-xmpp/ChangeLog @@ -2,6 +2,7 @@ Version NEXT: XXXX-YY-ZZ RELEASER * Breaking: - Remove `tokio_xmpp::ParseError` and `tokio_xmpp::starttls::ParseError` which were never used + - Removed StreamFeatures from this crate, replaced with xmpp_parsers::stream_features::StreamFeatures (!400) Version 4.0.0: 2024-07-26 Maxime “pep” Buquet diff --git a/tokio-xmpp/src/client/async_client.rs b/tokio-xmpp/src/client/async_client.rs index 5c5b5fa2c489977f0bb983d72e049888bb55831f..a79d8f83b47dbd2e0873a5b6e89cce8ceb17b268 100644 --- a/tokio-xmpp/src/client/async_client.rs +++ b/tokio-xmpp/src/client/async_client.rs @@ -4,12 +4,11 @@ use std::mem::replace; use std::pin::Pin; use std::task::Context; use tokio::task::JoinHandle; -use xmpp_parsers::{jid::Jid, ns}; +use xmpp_parsers::{jid::Jid, ns, stream_features::StreamFeatures}; use super::connect::client_login; use crate::connect::{AsyncReadAndWrite, ServerConnector}; use crate::event::Event; -use crate::stream_features::StreamFeatures; use crate::xmpp_codec::Packet; use crate::xmpp_stream::{add_stanza_id, XMPPStream}; use crate::{Error, ProtocolError}; diff --git a/tokio-xmpp/src/client/auth.rs b/tokio-xmpp/src/client/auth.rs index 94114a0eb474b7d06cce25fdb91a2b721c309e63..9c7f35de0c61a4279efca00e0515d32e7f5c2158 100644 --- a/tokio-xmpp/src/client/auth.rs +++ b/tokio-xmpp/src/client/auth.rs @@ -23,7 +23,13 @@ pub async fn auth( Box::new(|| Box::new(Anonymous::new())), ]; - let remote_mechs: HashSet = stream.stream_features.sasl_mechanisms()?.collect(); + let remote_mechs: HashSet = stream + .stream_features + .sasl_mechanisms + .mechanisms + .iter() + .map(|item| item.mechanism.clone()) + .collect(); for local_mech in local_mechs { let mut mechanism = local_mech(); diff --git a/tokio-xmpp/src/client/simple_client.rs b/tokio-xmpp/src/client/simple_client.rs index bb406e69df21f48e4bf3d8fb9e08270290b5c0f9..d5020d1e64e1f76e433521cffb9a46d0ab770cb4 100644 --- a/tokio-xmpp/src/client/simple_client.rs +++ b/tokio-xmpp/src/client/simple_client.rs @@ -3,10 +3,9 @@ use minidom::Element; use std::pin::Pin; use std::task::{Context, Poll}; use tokio_stream::StreamExt; -use xmpp_parsers::{jid::Jid, ns}; +use xmpp_parsers::{jid::Jid, ns, stream_features::StreamFeatures}; use crate::connect::ServerConnector; -use crate::stream_features::StreamFeatures; use crate::xmpp_codec::Packet; use crate::xmpp_stream::{add_stanza_id, XMPPStream}; use crate::Error; diff --git a/tokio-xmpp/src/lib.rs b/tokio-xmpp/src/lib.rs index c3ace54270f99d3fd9e9cc2564e74c70a8a08673..89fb249ab0203bdc91786e20206a30f054b0425e 100644 --- a/tokio-xmpp/src/lib.rs +++ b/tokio-xmpp/src/lib.rs @@ -30,7 +30,6 @@ mod event; pub use event::Event; mod client; pub mod connect; -pub mod stream_features; pub mod xmpp_stream; pub use client::{ diff --git a/tokio-xmpp/src/stream_features.rs b/tokio-xmpp/src/stream_features.rs deleted file mode 100644 index 5599e841d3f3f46451c12b2637784fec926ca91a..0000000000000000000000000000000000000000 --- a/tokio-xmpp/src/stream_features.rs +++ /dev/null @@ -1,41 +0,0 @@ -//! Contains wrapper for `` - -use crate::error::AuthError; -use minidom::Element; -use xmpp_parsers::ns; - -/// Wraps ``, usually the very first nonza of an -/// XMPPStream. -/// -/// TODO: should this rather go into xmpp-parsers, kept in a decoded -/// struct? -#[derive(Debug)] -pub struct StreamFeatures(pub Element); - -impl StreamFeatures { - /// Wrap the nonza - pub fn new(element: Element) -> Self { - StreamFeatures(element) - } - - /// Can initiate TLS session with this server? - pub fn can_starttls(&self) -> bool { - self.0.get_child("starttls", ns::TLS).is_some() - } - - /// Iterate over SASL mechanisms - pub fn sasl_mechanisms<'a>(&'a self) -> Result + 'a, AuthError> { - Ok(self - .0 - .get_child("mechanisms", ns::SASL) - .ok_or(AuthError::NoMechanism)? - .children() - .filter(|child| child.is("mechanism", ns::SASL)) - .map(|mech_el| mech_el.text())) - } - - /// Does server support user resource binding? - pub fn can_bind(&self) -> bool { - self.0.get_child("bind", ns::BIND).is_some() - } -} diff --git a/tokio-xmpp/src/stream_start.rs b/tokio-xmpp/src/stream_start.rs index 5b37f81e38f91dfb6fb4acc0dfafb0fd14e000f7..effaf20d174a3e51a910bd51482d7f13b40ec703 100644 --- a/tokio-xmpp/src/stream_start.rs +++ b/tokio-xmpp/src/stream_start.rs @@ -1,8 +1,7 @@ use futures::{sink::SinkExt, stream::StreamExt}; -use minidom::Element; use tokio::io::{AsyncRead, AsyncWrite}; use tokio_util::codec::Framed; -use xmpp_parsers::{jid::Jid, ns}; +use xmpp_parsers::{jid::Jid, ns, stream_features::StreamFeatures}; use crate::xmpp_codec::{Packet, XmppCodec}; use crate::xmpp_stream::XMPPStream; @@ -47,29 +46,27 @@ pub async fn start( .get("id") .ok_or(ProtocolError::NoStreamId)? .clone(); - let stream = if stream_ns == "jabber:client" && stream_attrs.get("version").is_some() { - let stream_features; + if stream_ns == "jabber:client" && stream_attrs.get("version").is_some() { loop { match stream.next().await { - Some(Ok(Packet::Stanza(stanza))) if stanza.is("features", ns::STREAM) => { - stream_features = stanza; - break; + Some(Ok(Packet::Stanza(stanza))) => { + if let Ok(stream_features) = StreamFeatures::try_from(stanza) { + return Ok(XMPPStream::new(jid, stream, ns, stream_id, stream_features)); + } } Some(Ok(_)) => {} Some(Err(e)) => return Err(e.into()), None => return Err(Error::Disconnected), } } - XMPPStream::new(jid, stream, ns, stream_id, stream_features) } else { // FIXME: huge hack, shouldn’t be an element! - XMPPStream::new( + return Ok(XMPPStream::new( jid, stream, ns, stream_id.clone(), - Element::builder(stream_id, ns::STREAM).build(), - ) - }; - Ok(stream) + StreamFeatures::default(), + )); + } } diff --git a/tokio-xmpp/src/xmpp_stream.rs b/tokio-xmpp/src/xmpp_stream.rs index 97d84b2ef808bba81cf753a67581ad5ae84410f6..a77ff9f1c147132cebbbb2c60052440ada0902cf 100644 --- a/tokio-xmpp/src/xmpp_stream.rs +++ b/tokio-xmpp/src/xmpp_stream.rs @@ -8,9 +8,8 @@ use std::pin::Pin; use std::task::Context; use tokio::io::{AsyncRead, AsyncWrite}; use tokio_util::codec::Framed; -use xmpp_parsers::jid::Jid; +use xmpp_parsers::{jid::Jid, stream_features::StreamFeatures}; -use crate::stream_features::StreamFeatures; use crate::stream_start; use crate::xmpp_codec::{Packet, XmppCodec}; use crate::Error; @@ -60,12 +59,12 @@ impl XMPPStream { stream: Framed, ns: String, id: String, - stream_features: Element, + stream_features: StreamFeatures, ) -> Self { XMPPStream { jid, stream, - stream_features: StreamFeatures::new(stream_features), + stream_features, ns, id, }