From 0b6a54dc371354d217c1632f117e3f89bc61efff Mon Sep 17 00:00:00 2001 From: Stefan Strigler Date: Thu, 11 Sep 2025 12:47:31 +0200 Subject: [PATCH 1/2] update xep-0377 spam reporting to urn:xmpp:reporting:1 --- specs/xmpp_codec.spec | 35 ++++++++++++++--------------------- 1 file changed, 14 insertions(+), 21 deletions(-) diff --git a/specs/xmpp_codec.spec b/specs/xmpp_codec.spec index fac30ab..9ea5725 100644 --- a/specs/xmpp_codec.spec +++ b/specs/xmpp_codec.spec @@ -230,21 +230,9 @@ refs = [#ref{name = block_item, label = '$items'}]}). --xml(report_reason_abuse, - #elem{name = <<"abuse">>, - xmlns = <<"urn:xmpp:reporting:0">>, - module = 'xep0377', - result = 'abuse'}). - --xml(report_reason_spam, - #elem{name = <<"spam">>, - xmlns = <<"urn:xmpp:reporting:0">>, - module = 'xep0377', - result = 'spam'}). - -xml(report_text, #elem{name = <<"text">>, - xmlns = <<"urn:xmpp:reporting:0">>, + xmlns = <<"urn:xmpp:reporting:1">>, module = 'xep0377', result = {text, '$lang', '$data'}, cdata = #cdata{label = '$data'}, @@ -254,16 +242,14 @@ -xml(report, #elem{name = <<"report">>, - xmlns = <<"urn:xmpp:reporting:0">>, + xmlns = <<"urn:xmpp:reporting:1">>, module = 'xep0377', result = {report, '$reason', '$text'}, - refs = [#ref{name = report_reason_abuse, - label = '$reason', - min = 0, max = 1}, - #ref{name = report_reason_spam, - label = '$reason', - min = 0, max = 1}, - #ref{name = report_text, + attrs = [#attr{name = <<"reason">>, + required = true, + enc = {enc_reporting_reason, []}, + dec = {dec_reporting_reason, []}}], + refs = [#ref{name = report_text, label = '$text'}]}). -xml(disco_identity, @@ -5907,6 +5893,13 @@ dec_message_type(<<"headline">>) -> headline; dec_message_type(<<"error">>) -> error; dec_message_type(_) -> normal. +enc_reporting_reason(abuse) -> <<"urn:xmpp:reporting:abuse">>; +enc_reporting_reason(spam) -> <<"urn:xmpp:reporting:spam">>. + +-spec dec_reporting_reason(_) -> abuse | spam. +dec_reporting_reason(<<"urn:xmpp:reporting:abuse">>) -> abuse; +dec_reporting_reason(<<"urn:xmpp:reporting:spam">>) -> spam. + %% Local Variables: %% mode: erlang %% End: From f2563a76fb206921784986f737485f4379a02eae Mon Sep 17 00:00:00 2001 From: sstrigler <23786+sstrigler@users.noreply.github.com> Date: Thu, 11 Sep 2025 10:51:55 +0000 Subject: [PATCH 2/2] Automatic changes "make spec xdata" --- include/xmpp_codec.hrl | 128 +++++++++++++------------- src/xep0191.erl | 4 +- src/xep0377.erl | 199 ++++++++++++++--------------------------- src/xmpp_codec.erl | 12 +-- 4 files changed, 135 insertions(+), 208 deletions(-) diff --git a/include/xmpp_codec.hrl b/include/xmpp_codec.hrl index 47e4c06..bfb48b8 100644 --- a/include/xmpp_codec.hrl +++ b/include/xmpp_codec.hrl @@ -190,6 +190,9 @@ cdata = <<>> :: binary()}). -type scram_upgrade_salt() :: #scram_upgrade_salt{}. +-record(receipt_request, {}). +-type receipt_request() :: #receipt_request{}. + -record(legacy_auth_feature, {}). -type legacy_auth_feature() :: #legacy_auth_feature{}. @@ -640,7 +643,7 @@ items = [] :: [#ps_item{}]}). -type ps_publish() :: #ps_publish{}. --record(report, {reason :: 'abuse' | 'spam' | 'undefined', +-record(report, {reason :: 'abuse' | 'spam', text = [] :: [#text{}]}). -type report() :: #report{}. @@ -856,6 +859,11 @@ resource :: 'undefined' | binary()}). -type legacy_auth() :: #legacy_auth{}. +-record(privacy_query, {lists = [] :: [#privacy_list{}], + default :: 'none' | 'undefined' | binary(), + active :: 'none' | 'undefined' | binary()}). +-type privacy_query() :: #privacy_query{}. + -record(pubsub_serverinfo_remote_domain, {name = <<>> :: binary(), type = [] :: ['bidi' | 'incoming' | 'outgoing']}). -type pubsub_serverinfo_remote_domain() :: #pubsub_serverinfo_remote_domain{}. @@ -918,6 +926,14 @@ -record(credentials, {services = [] :: [#service{}]}). -type credentials() :: #credentials{}. +-record(vcard_email, {home = false :: boolean(), + work = false :: boolean(), + internet = false :: boolean(), + pref = false :: boolean(), + x400 = false :: boolean(), + userid :: 'undefined' | binary()}). +-type vcard_email() :: #vcard_email{}. + -record(block_item, {jid :: jid:jid(), spam_report :: 'undefined' | #report{}}). -type block_item() :: #block_item{}. @@ -1238,6 +1254,38 @@ suffix :: 'undefined' | binary()}). -type vcard_name() :: #vcard_name{}. +-record(vcard_temp, {version :: 'undefined' | binary(), + fn :: 'undefined' | binary(), + n :: 'undefined' | #vcard_name{}, + nickname :: 'undefined' | binary(), + photo :: 'undefined' | #vcard_photo{}, + bday :: 'undefined' | binary(), + adr = [] :: [#vcard_adr{}], + label = [] :: [#vcard_label{}], + tel = [] :: [#vcard_tel{}], + email = [] :: [#vcard_email{}], + jabberid :: 'undefined' | binary(), + mailer :: 'undefined' | binary(), + tz :: 'undefined' | binary(), + geo :: 'undefined' | #vcard_geo{}, + title :: 'undefined' | binary(), + role :: 'undefined' | binary(), + logo :: 'undefined' | #vcard_logo{}, + org :: 'undefined' | #vcard_org{}, + categories = [] :: [binary()], + note :: 'undefined' | binary(), + prodid :: 'undefined' | binary(), + rev :: 'undefined' | binary(), + sort_string :: 'undefined' | binary(), + sound :: 'undefined' | #vcard_sound{}, + uid :: 'undefined' | binary(), + url :: 'undefined' | binary(), + class :: 'confidential' | 'private' | 'public' | 'undefined', + key :: 'undefined' | #vcard_key{}, + desc :: 'undefined' | binary(), + sub_els = [] :: [xmpp_element() | fxml:xmlel()]}). +-type vcard_temp() :: #vcard_temp{}. + -record(ibb_data, {sid = <<>> :: binary(), seq :: non_neg_integer(), data = <<>> :: binary()}). @@ -1351,65 +1399,6 @@ sub_els = [] :: [xmpp_element() | fxml:xmlel()]}). -type jingle() :: #jingle{}. --record(muc_subscription, {jid :: undefined | jid:jid(), - nick = <<>> :: binary(), - events = [] :: [binary()]}). --type muc_subscription() :: #muc_subscription{}. - --record(muc_subscriptions, {list = [] :: [#muc_subscription{}]}). --type muc_subscriptions() :: #muc_subscriptions{}. - --record(pubsub_owner, {affiliations :: 'undefined' | {binary(),[#ps_affiliation{}]}, - configure :: 'undefined' | {binary(),'undefined' | #xdata{}}, - default :: 'undefined' | {binary(),'undefined' | #xdata{}}, - delete :: 'undefined' | {binary(),binary()}, - purge :: 'undefined' | binary(), - subscriptions :: 'undefined' | {binary(),[#ps_subscription{}]}}). --type pubsub_owner() :: #pubsub_owner{}. - --record(receipt_request, {}). --type receipt_request() :: #receipt_request{}. - --record(vcard_email, {home = false :: boolean(), - work = false :: boolean(), - internet = false :: boolean(), - pref = false :: boolean(), - x400 = false :: boolean(), - userid :: 'undefined' | binary()}). --type vcard_email() :: #vcard_email{}. - --record(vcard_temp, {version :: 'undefined' | binary(), - fn :: 'undefined' | binary(), - n :: 'undefined' | #vcard_name{}, - nickname :: 'undefined' | binary(), - photo :: 'undefined' | #vcard_photo{}, - bday :: 'undefined' | binary(), - adr = [] :: [#vcard_adr{}], - label = [] :: [#vcard_label{}], - tel = [] :: [#vcard_tel{}], - email = [] :: [#vcard_email{}], - jabberid :: 'undefined' | binary(), - mailer :: 'undefined' | binary(), - tz :: 'undefined' | binary(), - geo :: 'undefined' | #vcard_geo{}, - title :: 'undefined' | binary(), - role :: 'undefined' | binary(), - logo :: 'undefined' | #vcard_logo{}, - org :: 'undefined' | #vcard_org{}, - categories = [] :: [binary()], - note :: 'undefined' | binary(), - prodid :: 'undefined' | binary(), - rev :: 'undefined' | binary(), - sort_string :: 'undefined' | binary(), - sound :: 'undefined' | #vcard_sound{}, - uid :: 'undefined' | binary(), - url :: 'undefined' | binary(), - class :: 'confidential' | 'private' | 'public' | 'undefined', - key :: 'undefined' | #vcard_key{}, - desc :: 'undefined' | binary(), - sub_els = [] :: [xmpp_element() | fxml:xmlel()]}). --type vcard_temp() :: #vcard_temp{}. - -record(register, {registered = false :: boolean(), remove = false :: boolean(), instructions :: 'undefined' | binary(), @@ -1434,10 +1423,21 @@ sub_els = [] :: [xmpp_element() | fxml:xmlel()]}). -type register() :: #register{}. --record(privacy_query, {lists = [] :: [#privacy_list{}], - default :: 'none' | 'undefined' | binary(), - active :: 'none' | 'undefined' | binary()}). --type privacy_query() :: #privacy_query{}. +-record(muc_subscription, {jid :: undefined | jid:jid(), + nick = <<>> :: binary(), + events = [] :: [binary()]}). +-type muc_subscription() :: #muc_subscription{}. + +-record(muc_subscriptions, {list = [] :: [#muc_subscription{}]}). +-type muc_subscriptions() :: #muc_subscriptions{}. + +-record(pubsub_owner, {affiliations :: 'undefined' | {binary(),[#ps_affiliation{}]}, + configure :: 'undefined' | {binary(),'undefined' | #xdata{}}, + default :: 'undefined' | {binary(),'undefined' | #xdata{}}, + delete :: 'undefined' | {binary(),binary()}, + purge :: 'undefined' | binary(), + subscriptions :: 'undefined' | {binary(),[#ps_subscription{}]}}). +-type pubsub_owner() :: #pubsub_owner{}. -type xmpp_element() :: address() | addresses() | diff --git a/src/xep0191.erl b/src/xep0191.erl index c6906ee..5102b43 100644 --- a/src/xep0191.erl +++ b/src/xep0191.erl @@ -227,11 +227,11 @@ decode_block_item_els(__TopXMLNS, __Opts, _attrs, __TopXMLNS) of - <<"urn:xmpp:reporting:0">> -> + <<"urn:xmpp:reporting:1">> -> decode_block_item_els(__TopXMLNS, __Opts, _els, - xep0377:decode_report(<<"urn:xmpp:reporting:0">>, + xep0377:decode_report(<<"urn:xmpp:reporting:1">>, __Opts, _el)); _ -> diff --git a/src/xep0377.erl b/src/xep0377.erl index f4753bc..28a8815 100644 --- a/src/xep0377.erl +++ b/src/xep0377.erl @@ -5,34 +5,22 @@ -compile(export_all). -do_decode(<<"report">>, <<"urn:xmpp:reporting:0">>, El, +do_decode(<<"report">>, <<"urn:xmpp:reporting:1">>, El, Opts) -> - decode_report(<<"urn:xmpp:reporting:0">>, Opts, El); -do_decode(<<"text">>, <<"urn:xmpp:reporting:0">>, El, + decode_report(<<"urn:xmpp:reporting:1">>, Opts, El); +do_decode(<<"text">>, <<"urn:xmpp:reporting:1">>, El, Opts) -> - decode_report_text(<<"urn:xmpp:reporting:0">>, + decode_report_text(<<"urn:xmpp:reporting:1">>, Opts, El); -do_decode(<<"spam">>, <<"urn:xmpp:reporting:0">>, El, - Opts) -> - decode_report_reason_spam(<<"urn:xmpp:reporting:0">>, - Opts, - El); -do_decode(<<"abuse">>, <<"urn:xmpp:reporting:0">>, El, - Opts) -> - decode_report_reason_abuse(<<"urn:xmpp:reporting:0">>, - Opts, - El); do_decode(Name, <<>>, _, _) -> erlang:error({xmpp_codec, {missing_tag_xmlns, Name}}); do_decode(Name, XMLNS, _, _) -> erlang:error({xmpp_codec, {unknown_tag, Name, XMLNS}}). tags() -> - [{<<"report">>, <<"urn:xmpp:reporting:0">>}, - {<<"text">>, <<"urn:xmpp:reporting:0">>}, - {<<"spam">>, <<"urn:xmpp:reporting:0">>}, - {<<"abuse">>, <<"urn:xmpp:reporting:0">>}]. + [{<<"report">>, <<"urn:xmpp:reporting:1">>}, + {<<"text">>, <<"urn:xmpp:reporting:1">>}]. do_encode({text, _, _} = Text, TopXMLNS) -> encode_report_text(Text, TopXMLNS); @@ -42,8 +30,8 @@ do_encode({report, _, _} = Report, TopXMLNS) -> do_get_name({report, _, _}) -> <<"report">>; do_get_name({text, _, _}) -> <<"text">>. -do_get_ns({report, _, _}) -> <<"urn:xmpp:reporting:0">>; -do_get_ns({text, _, _}) -> <<"urn:xmpp:reporting:0">>. +do_get_ns({report, _, _}) -> <<"urn:xmpp:reporting:1">>; +do_get_ns({text, _, _}) -> <<"urn:xmpp:reporting:1">>. pp(text, 2) -> [lang, data]; pp(report, 2) -> [reason, text]; @@ -51,105 +39,65 @@ pp(_, _) -> no. records() -> [{text, 2}, {report, 2}]. +dec_reporting_reason(<<"urn:xmpp:reporting:abuse">>) -> + abuse; +dec_reporting_reason(<<"urn:xmpp:reporting:spam">>) -> + spam. + +enc_reporting_reason(abuse) -> + <<"urn:xmpp:reporting:abuse">>; +enc_reporting_reason(spam) -> + <<"urn:xmpp:reporting:spam">>. + decode_report(__TopXMLNS, __Opts, {xmlel, <<"report">>, _attrs, _els}) -> - {Text, Reason} = decode_report_els(__TopXMLNS, - __Opts, - _els, - [], - undefined), + Text = decode_report_els(__TopXMLNS, __Opts, _els, []), + Reason = decode_report_attrs(__TopXMLNS, + _attrs, + undefined), {report, Reason, Text}. -decode_report_els(__TopXMLNS, __Opts, [], Text, - Reason) -> - {lists:reverse(Text), Reason}; -decode_report_els(__TopXMLNS, __Opts, - [{xmlel, <<"abuse">>, _attrs, _} = _el | _els], Text, - Reason) -> - case xmpp_codec:get_attr(<<"xmlns">>, - _attrs, - __TopXMLNS) - of - <<"urn:xmpp:reporting:0">> -> - decode_report_els(__TopXMLNS, - __Opts, - _els, - Text, - decode_report_reason_abuse(<<"urn:xmpp:reporting:0">>, - __Opts, - _el)); - _ -> - decode_report_els(__TopXMLNS, - __Opts, - _els, - Text, - Reason) - end; -decode_report_els(__TopXMLNS, __Opts, - [{xmlel, <<"spam">>, _attrs, _} = _el | _els], Text, - Reason) -> - case xmpp_codec:get_attr(<<"xmlns">>, - _attrs, - __TopXMLNS) - of - <<"urn:xmpp:reporting:0">> -> - decode_report_els(__TopXMLNS, - __Opts, - _els, - Text, - decode_report_reason_spam(<<"urn:xmpp:reporting:0">>, - __Opts, - _el)); - _ -> - decode_report_els(__TopXMLNS, - __Opts, - _els, - Text, - Reason) - end; +decode_report_els(__TopXMLNS, __Opts, [], Text) -> + lists:reverse(Text); decode_report_els(__TopXMLNS, __Opts, - [{xmlel, <<"text">>, _attrs, _} = _el | _els], Text, - Reason) -> + [{xmlel, <<"text">>, _attrs, _} = _el | _els], Text) -> case xmpp_codec:get_attr(<<"xmlns">>, _attrs, __TopXMLNS) of - <<"urn:xmpp:reporting:0">> -> + <<"urn:xmpp:reporting:1">> -> decode_report_els(__TopXMLNS, __Opts, _els, - [decode_report_text(<<"urn:xmpp:reporting:0">>, + [decode_report_text(<<"urn:xmpp:reporting:1">>, __Opts, _el) - | Text], - Reason); - _ -> - decode_report_els(__TopXMLNS, - __Opts, - _els, - Text, - Reason) + | Text]); + _ -> decode_report_els(__TopXMLNS, __Opts, _els, Text) end; -decode_report_els(__TopXMLNS, __Opts, [_ | _els], Text, - Reason) -> - decode_report_els(__TopXMLNS, - __Opts, - _els, - Text, - Reason). +decode_report_els(__TopXMLNS, __Opts, [_ | _els], + Text) -> + decode_report_els(__TopXMLNS, __Opts, _els, Text). + +decode_report_attrs(__TopXMLNS, + [{<<"reason">>, _val} | _attrs], _Reason) -> + decode_report_attrs(__TopXMLNS, _attrs, _val); +decode_report_attrs(__TopXMLNS, [_ | _attrs], Reason) -> + decode_report_attrs(__TopXMLNS, _attrs, Reason); +decode_report_attrs(__TopXMLNS, [], Reason) -> + decode_report_attr_reason(__TopXMLNS, Reason). encode_report({report, Reason, Text}, __TopXMLNS) -> __NewTopXMLNS = - xmpp_codec:choose_top_xmlns(<<"urn:xmpp:reporting:0">>, + xmpp_codec:choose_top_xmlns(<<"urn:xmpp:reporting:1">>, [], __TopXMLNS), _els = lists:reverse('encode_report_$text'(Text, __NewTopXMLNS, - 'encode_report_$reason'(Reason, - __NewTopXMLNS, - []))), - _attrs = xmpp_codec:enc_xmlns_attrs(__NewTopXMLNS, - __TopXMLNS), + [])), + _attrs = encode_report_attr_reason(Reason, + xmpp_codec:enc_xmlns_attrs(__NewTopXMLNS, + __TopXMLNS)), {xmlel, <<"report">>, _attrs, _els}. 'encode_report_$text'([], __TopXMLNS, _acc) -> _acc; @@ -159,14 +107,25 @@ encode_report({report, Reason, Text}, __TopXMLNS) -> __TopXMLNS, [encode_report_text(Text, __TopXMLNS) | _acc]). -'encode_report_$reason'(undefined, __TopXMLNS, _acc) -> - _acc; -'encode_report_$reason'(abuse = Reason, __TopXMLNS, - _acc) -> - [encode_report_reason_abuse(Reason, __TopXMLNS) | _acc]; -'encode_report_$reason'(spam = Reason, __TopXMLNS, - _acc) -> - [encode_report_reason_spam(Reason, __TopXMLNS) | _acc]. +decode_report_attr_reason(__TopXMLNS, undefined) -> + erlang:error({xmpp_codec, + {missing_attr, + <<"reason">>, + <<"report">>, + __TopXMLNS}}); +decode_report_attr_reason(__TopXMLNS, _val) -> + case catch dec_reporting_reason(_val) of + {'EXIT', _} -> + erlang:error({xmpp_codec, + {bad_attr_value, + <<"reason">>, + <<"report">>, + __TopXMLNS}}); + _res -> _res + end. + +encode_report_attr_reason(_val, _acc) -> + [{<<"reason">>, enc_reporting_reason(_val)} | _acc]. decode_report_text(__TopXMLNS, __Opts, {xmlel, <<"text">>, _attrs, _els}) -> @@ -202,7 +161,7 @@ decode_report_text_attrs(__TopXMLNS, [], Lang) -> encode_report_text({text, Lang, Data}, __TopXMLNS) -> __NewTopXMLNS = - xmpp_codec:choose_top_xmlns(<<"urn:xmpp:reporting:0">>, + xmpp_codec:choose_top_xmlns(<<"urn:xmpp:reporting:1">>, [], __TopXMLNS), _els = encode_report_text_cdata(Data, []), @@ -235,31 +194,3 @@ decode_report_text_cdata(__TopXMLNS, _val) -> _val. encode_report_text_cdata(<<>>, _acc) -> _acc; encode_report_text_cdata(_val, _acc) -> [{xmlcdata, _val} | _acc]. - -decode_report_reason_spam(__TopXMLNS, __Opts, - {xmlel, <<"spam">>, _attrs, _els}) -> - spam. - -encode_report_reason_spam(spam, __TopXMLNS) -> - __NewTopXMLNS = - xmpp_codec:choose_top_xmlns(<<"urn:xmpp:reporting:0">>, - [], - __TopXMLNS), - _els = [], - _attrs = xmpp_codec:enc_xmlns_attrs(__NewTopXMLNS, - __TopXMLNS), - {xmlel, <<"spam">>, _attrs, _els}. - -decode_report_reason_abuse(__TopXMLNS, __Opts, - {xmlel, <<"abuse">>, _attrs, _els}) -> - abuse. - -encode_report_reason_abuse(abuse, __TopXMLNS) -> - __NewTopXMLNS = - xmpp_codec:choose_top_xmlns(<<"urn:xmpp:reporting:0">>, - [], - __TopXMLNS), - _els = [], - _attrs = xmpp_codec:enc_xmlns_attrs(__NewTopXMLNS, - __TopXMLNS), - {xmlel, <<"abuse">>, _attrs, _els}. diff --git a/src/xmpp_codec.erl b/src/xmpp_codec.erl index 12775c7..6696a60 100644 --- a/src/xmpp_codec.erl +++ b/src/xmpp_codec.erl @@ -466,8 +466,6 @@ get_mod(<<"no-permanent-storage">>, get_mod(<<"unsupported-applications">>, <<"urn:xmpp:jingle:1">>) -> xep0166; -get_mod(<<"text">>, <<"urn:xmpp:reporting:0">>) -> - xep0377; get_mod(<<"credentials-expired">>, <<"urn:ietf:params:xml:ns:xmpp-sasl">>) -> rfc6120; @@ -724,6 +722,8 @@ get_mod(<<"close">>, xep0047; get_mod(<<"x509-csr">>, <<"urn:xmpp:x509:0">>) -> xep0417; +get_mod(<<"report">>, <<"urn:xmpp:reporting:1">>) -> + xep0377; get_mod(<<"internal-server-error">>, <<"urn:ietf:params:xml:ns:xmpp-stanzas">>) -> rfc6120; @@ -936,8 +936,6 @@ get_mod(<<"fetch">>, get_mod(<<"failed-transport">>, <<"urn:xmpp:jingle:1">>) -> xep0166; -get_mod(<<"abuse">>, <<"urn:xmpp:reporting:0">>) -> - xep0377; get_mod(<<"state">>, <<"jabber:iq:register">>) -> xep0077; get_mod(<<"utc">>, <<"urn:xmpp:time">>) -> xep0202; @@ -1028,6 +1026,8 @@ get_mod(<<"enable">>, <<"urn:xmpp:sm:3">>) -> xep0198; get_mod(<<"size">>, <<"eu:siacs:conversations:http:upload">>) -> xep0363; +get_mod(<<"text">>, <<"urn:xmpp:reporting:1">>) -> + xep0377; get_mod(<<"registration-required">>, <<"urn:ietf:params:xml:ns:xmpp-stanzas">>) -> rfc6120; @@ -1075,8 +1075,6 @@ get_mod(<<"text">>, <<"jabber:iq:register">>) -> xep0077; get_mod(<<"private">>, <<"urn:xmpp:carbons:2">>) -> xep0280; -get_mod(<<"spam">>, <<"urn:xmpp:reporting:0">>) -> - xep0377; get_mod(<<"show">>, <<"jabber:component:accept">>) -> rfc6120; get_mod(<<"PAGER">>, <<"vcard-temp">>) -> xep0054; @@ -1645,8 +1643,6 @@ get_mod(<<"software">>, <<"urn:xmpp:sasl:2">>) -> get_mod(<<"task-data">>, <<"urn:xmpp:sasl:2">>) -> xep0388; get_mod(<<"inline">>, <<"urn:xmpp:bind:0">>) -> xep0386; -get_mod(<<"report">>, <<"urn:xmpp:reporting:0">>) -> - xep0377; get_mod(<<"item-not-found">>, <<"urn:ietf:params:xml:ns:xmpp-stanzas">>) -> rfc6120;