xmpp-parsers: Support required in SM feature

Link Mauve created

This was forgotten in 0f0759b2075de7e6d6b98ced9979412da8254913.

That element is only specified in the XML schema, its semantics aren’t
defined anywhere, but we can guess them anyway.

Change summary

parsers/ChangeLog    |  3 ++-
parsers/src/sasl2.rs |  8 +++++++-
parsers/src/sm.rs    | 14 ++++++++++----
3 files changed, 19 insertions(+), 6 deletions(-)

Detailed changes

parsers/ChangeLog 🔗

@@ -108,7 +108,8 @@ XXXX-YY-ZZ RELEASER <admin@example.com>
       - Push Notifications (XEP-0357) (!543)
       - JSON Containers (XEP-0335) (!546)
     * Improvements:
-      - Add support for `<optional/> in XEP-0198 feature advertisment
+      - Add support for `<optional/>` and `<required/>` in XEP-0198 feature
+        advertisment.
       - Add support application-specific error conditions in XEP-0198
       - Keep unsupported vCard elements as `minidom::Element`, so that they
         get serialized back instead of being dropped.  We now also test for

parsers/src/sasl2.rs 🔗

@@ -269,7 +269,13 @@ mod tests {
 
         let inline = auth.inline.unwrap();
         assert_eq!(inline.bind2.unwrap().inline_features.len(), 0);
-        assert_eq!(inline.sm.unwrap(), StreamManagement { optional: false });
+        assert_eq!(
+            inline.sm.unwrap(),
+            StreamManagement {
+                optional: false,
+                required: false
+            }
+        );
         assert_eq!(inline.payloads.len(), 0);
     }
 

parsers/src/sm.rs 🔗

@@ -133,7 +133,7 @@ pub struct Resumed {
     pub previd: StreamId,
 }
 
-// TODO: add support for optional and required.
+// TODO: Only allow either optional or required, not both.
 /// Represents availability of Stream Management in `<stream:features/>`.
 #[derive(FromXml, AsXml, PartialEq, Debug, Clone)]
 #[xml(namespace = ns::SM, name = "sm")]
@@ -141,6 +141,10 @@ pub struct StreamManagement {
     /// `<optional/>` flag.
     #[xml(flag)]
     pub optional: bool,
+
+    /// `<required/>` flag.
+    #[xml(flag)]
+    pub required: bool,
 }
 
 /// Application-specific error condition to use when the peer acknowledges
@@ -222,7 +226,7 @@ mod tests {
         assert_size!(R, 0);
         assert_size!(Resume, 16);
         assert_size!(Resumed, 16);
-        assert_size!(StreamManagement, 1);
+        assert_size!(StreamManagement, 2);
         assert_size!(HandledCountTooHigh, 8);
     }
 
@@ -237,7 +241,7 @@ mod tests {
         assert_size!(R, 0);
         assert_size!(Resume, 32);
         assert_size!(Resumed, 32);
-        assert_size!(StreamManagement, 1);
+        assert_size!(StreamManagement, 2);
         assert_size!(HandledCountTooHigh, 8);
     }
 
@@ -251,7 +255,9 @@ mod tests {
     #[test]
     fn stream_feature() {
         let elem: Element = "<sm xmlns='urn:xmpp:sm:3'/>".parse().unwrap();
-        StreamManagement::try_from(elem).unwrap();
+        let sm = StreamManagement::try_from(elem).unwrap();
+        assert_eq!(sm.optional, false);
+        assert_eq!(sm.required, false);
     }
 
     #[test]