use futures::stream::StreamExt; use tokio::io::{AsyncRead, AsyncWrite}; use xmpp_parsers::{component::Handshake, ns}; use crate::error::{AuthError, Error}; use crate::proto::{Packet, XmppStream}; pub async fn auth( stream: &mut XmppStream, password: String, ) -> Result<(), Error> { let nonza = Handshake::from_password_and_stream_id(&password, &stream.id); stream.send_stanza(nonza).await?; loop { match stream.next().await { Some(Ok(Packet::Stanza(ref stanza))) if stanza.is("handshake", ns::COMPONENT_ACCEPT) => { return Ok(()); } Some(Ok(Packet::Stanza(ref stanza))) if stanza.is("error", "http://etherx.jabber.org/streams") => { return Err(AuthError::ComponentFail.into()); } Some(_) => {} None => return Err(Error::Disconnected), } } }