From f0f4299b0225733fe752f67620fbf954c1d1d428 Mon Sep 17 00:00:00 2001 From: Emmanuel Gil Peyrot Date: Tue, 6 Aug 2024 16:00:52 +0200 Subject: [PATCH] xmpp-parsers: Parse the bind feature in its module, with required MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This is different from the bind query or the bind response, despite all three having the same element namespace and nameā€¦ Annoying! --- parsers/src/bind.rs | 18 ++++++++++++++++++ parsers/src/stream_features.rs | 10 ++-------- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/parsers/src/bind.rs b/parsers/src/bind.rs index 27f79af1..d8486692 100644 --- a/parsers/src/bind.rs +++ b/parsers/src/bind.rs @@ -10,6 +10,20 @@ use crate::iq::{IqResultPayload, IqSetPayload}; use crate::ns; use jid::{FullJid, Jid}; +/// The bind feature exposed in stream:features. +#[derive(FromXml, AsXml, Debug, Clone, PartialEq)] +#[xml(namespace = ns::BIND, name = "bind")] +pub struct BindFeature { + /// Present if bind is required. + #[xml(child(default))] + required: Option, +} + +/// Notes that bind is required. +#[derive(FromXml, AsXml, Debug, Clone, PartialEq)] +#[xml(namespace = ns::BIND, name = "required")] +pub struct Required; + /// The request for resource binding, which is the process by which a client /// can obtain a full JID and start exchanging on the XMPP network. /// @@ -68,6 +82,8 @@ mod tests { #[cfg(target_pointer_width = "32")] #[test] fn test_size() { + assert_size!(BindFeature, 1); + assert_size!(Required, 0); assert_size!(BindQuery, 12); assert_size!(BindResponse, 16); } @@ -75,6 +91,8 @@ mod tests { #[cfg(target_pointer_width = "64")] #[test] fn test_size() { + assert_size!(BindFeature, 1); + assert_size!(Required, 0); assert_size!(BindQuery, 24); assert_size!(BindResponse, 32); } diff --git a/parsers/src/stream_features.rs b/parsers/src/stream_features.rs index e392328e..09b48cf6 100644 --- a/parsers/src/stream_features.rs +++ b/parsers/src/stream_features.rs @@ -7,6 +7,7 @@ use minidom::Element; use xso::{AsXml, FromXml}; +use crate::bind::BindFeature; use crate::ns; /// Wraps ``, usually the very first nonza of a @@ -20,7 +21,7 @@ pub struct StreamFeatures { /// Bind is supported. #[xml(child(default))] - pub bind: Option, + pub bind: Option, /// List of supported SASL mechanisms #[xml(child(default))] @@ -48,11 +49,6 @@ pub struct StartTls { #[xml(namespace = ns::TLS, name = "required")] pub struct RequiredStartTls; -/// Bind is supported. -#[derive(FromXml, AsXml, PartialEq, Debug, Clone)] -#[xml(namespace = ns::BIND, name = "bind")] -pub struct Bind; - /// List of supported SASL mechanisms #[derive(FromXml, AsXml, PartialEq, Debug, Clone, Default)] #[xml(namespace = ns::SASL, name = "mechanisms")] @@ -93,7 +89,6 @@ mod tests { fn test_size() { assert_size!(SaslMechanism, 12); assert_size!(SaslMechanisms, 12); - assert_size!(Bind, 0); assert_size!(RequiredStartTls, 0); assert_size!(StartTls, 1); assert_size!(StreamFeatures, 28); @@ -104,7 +99,6 @@ mod tests { fn test_size() { assert_size!(SaslMechanism, 24); assert_size!(SaslMechanisms, 24); - assert_size!(Bind, 0); assert_size!(RequiredStartTls, 0); assert_size!(StartTls, 1); assert_size!(StreamFeatures, 56);