From a10055025fdf5994c93302791160a90c54c12d27 Mon Sep 17 00:00:00 2001 From: Stefan Strigler Date: Mon, 6 Oct 2025 15:51:20 +0200 Subject: [PATCH 1/4] add support for pre-authenticated roster subscription --- README.md | 1 + include/ns.hrl | 1 + specs/xmpp_codec.spec | 8 ++++++++ xmpp.doap | 9 +++++++++ 4 files changed, 19 insertions(+) diff --git a/README.md b/README.md index ba73e7c..b2aeb36 100644 --- a/README.md +++ b/README.md @@ -321,6 +321,7 @@ and its nice display in [Erlang/Elixir XMPP at xmpp.org](https://xmpp.org/softwa - [XEP-0363](https://xmpp.org/extensions/xep-0363.html): HTTP File Upload - [XEP-0369](https://xmpp.org/extensions/xep-0369.html): Mediated Information eXchange (MIX) - [XEP-0377](https://xmpp.org/extensions/xep-0377.html): Spam Reporting +- [XEP-0379](https://xmpp.org/extensions/xep-0379.html): Pre-Authenticated Roster Subscription - [XEP-0386](https://xmpp.org/extensions/xep-0386.html): Bind 2 - [XEP-0388](https://xmpp.org/extensions/xep-0388.html): Extensible SASL Profile - [XEP-0402](https://xmpp.org/extensions/xep-0402.html): PEP Native Bookmarks diff --git a/include/ns.hrl b/include/ns.hrl index f08d9e6..e20a156 100644 --- a/include/ns.hrl +++ b/include/ns.hrl @@ -222,3 +222,4 @@ -define(NS_MESSAGE_MODERATE_1, <<"urn:xmpp:message-moderate:1">>). -define(NS_MESSAGE_RETRACT, <<"urn:xmpp:message-retract:1">>). -define(NS_OCCUPANT_ID, <<"urn:xmpp:occupant-id:0">>). +-define(NS_PREAUTHENTICATED_ROSTER_SUBSCRIPTION, <<"urn:xmpp:pars:0">>). diff --git a/specs/xmpp_codec.spec b/specs/xmpp_codec.spec index 1940b54..3f84eca 100644 --- a/specs/xmpp_codec.spec +++ b/specs/xmpp_codec.spec @@ -5743,6 +5743,14 @@ enc = {enc_enum, []}, dec = {dec_enum, [[incoming, outgoing, bidi]]}}]}). +-xml(preauth, + #elem{name = <<"preauth">>, + xmlns = <<"urn:xmpp:pars:0">>, + module = 'xep0379', + attrs = [#attr{name = <<"token">>, + label = '$token'}], + result = {preauth, '$token'}}). + -spec dec_tzo(_) -> {integer(), integer()}. dec_tzo(Val) -> [H1, M1] = binary:split(Val, <<":">>), diff --git a/xmpp.doap b/xmpp.doap index fe8f904..b0e7108 100644 --- a/xmpp.doap +++ b/xmpp.doap @@ -638,6 +638,15 @@ + + + + 0.3.3 + 1.11.3 + + + + From 062ade4227016203f61330b65aeb8e95db99b76e Mon Sep 17 00:00:00 2001 From: Stefan Strigler Date: Wed, 8 Oct 2025 15:57:28 +0200 Subject: [PATCH 2/4] add feature_register_ibr_token --- README.md | 1 + include/ns.hrl | 1 + specs/xmpp_codec.spec | 6 ++++++ xmpp.doap | 9 +++++++++ 4 files changed, 17 insertions(+) diff --git a/README.md b/README.md index b2aeb36..5a7253b 100644 --- a/README.md +++ b/README.md @@ -334,6 +334,7 @@ and its nice display in [Erlang/Elixir XMPP at xmpp.org](https://xmpp.org/softwa - [XEP-0425](https://xmpp.org/extensions/xep-0425.html): Message Moderation - [XEP-0430](https://xmpp.org/extensions/xep-0430.html): Inbox - [XEP-0440](https://xmpp.org/extensions/xep-0440.html): SASL Channel-Binding Type Capability +- [XEP-0445](https://xmpp.org/extensions/xep-0445.html): Pre-Authenticated In-Band Registration - [XEP-0474](https://xmpp.org/extensions/xep-0474.html): SASL SCRAM Downgrade Protection - [draft-cridland-xmpp-session-01](https://tools.ietf.org/html/draft-cridland-xmpp-session-01): XMPP Session Establishment diff --git a/include/ns.hrl b/include/ns.hrl index e20a156..f5a79a8 100644 --- a/include/ns.hrl +++ b/include/ns.hrl @@ -223,3 +223,4 @@ -define(NS_MESSAGE_RETRACT, <<"urn:xmpp:message-retract:1">>). -define(NS_OCCUPANT_ID, <<"urn:xmpp:occupant-id:0">>). -define(NS_PREAUTHENTICATED_ROSTER_SUBSCRIPTION, <<"urn:xmpp:pars:0">>). +-define(NS_FEATURE_IBR_TOKEN, <<"urn:xmpp:ibr-token:0">>). diff --git a/specs/xmpp_codec.spec b/specs/xmpp_codec.spec index 3f84eca..e153b9e 100644 --- a/specs/xmpp_codec.spec +++ b/specs/xmpp_codec.spec @@ -5751,6 +5751,12 @@ label = '$token'}], result = {preauth, '$token'}}). +-xml(feature_register_ibr_token, + #elem{name = <<"register">>, + xmlns = <<"urn:xmpp:ibr-token:0">>, + module = 'xep0445', + result = {feature_register_ibr_token}}). + -spec dec_tzo(_) -> {integer(), integer()}. dec_tzo(Val) -> [H1, M1] = binary:split(Val, <<":">>), diff --git a/xmpp.doap b/xmpp.doap index b0e7108..2c05207 100644 --- a/xmpp.doap +++ b/xmpp.doap @@ -755,6 +755,15 @@ + + + + 0.2.0 + 1.11.3 + + + + From 9814266e2e20598144376e7185334af731debce2 Mon Sep 17 00:00:00 2001 From: Stefan Strigler Date: Thu, 13 Nov 2025 08:31:51 +0100 Subject: [PATCH 3/4] add support for rfc6121#3.4 roster subscription pre-approval --- include/ns.hrl | 1 + specs/xmpp_codec.spec | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/include/ns.hrl b/include/ns.hrl index f5a79a8..2c2942c 100644 --- a/include/ns.hrl +++ b/include/ns.hrl @@ -224,3 +224,4 @@ -define(NS_OCCUPANT_ID, <<"urn:xmpp:occupant-id:0">>). -define(NS_PREAUTHENTICATED_ROSTER_SUBSCRIPTION, <<"urn:xmpp:pars:0">>). -define(NS_FEATURE_IBR_TOKEN, <<"urn:xmpp:ibr-token:0">>). +-define(NS_FEATURE_SUB_PRE_APPROVAL, <<"urn:xmpp:features:pre-approval">>). diff --git a/specs/xmpp_codec.spec b/specs/xmpp_codec.spec index e153b9e..6f9f352 100644 --- a/specs/xmpp_codec.spec +++ b/specs/xmpp_codec.spec @@ -105,6 +105,12 @@ module = rfc6121, result = {rosterver_feature}}). +-xml(feature_pre_approval, + #elem{name = <<"sub">>, + xmlns = <<"urn:xmpp:features:pre-approval">>, + module = 'rfc6121', + result = {feature_pre_approval}}). + -xml(privacy_message, #elem{name = <<"message">>, xmlns = <<"jabber:iq:privacy">>, From 03bce052c2c1509ded3a4acdf653985d68cfd8ed Mon Sep 17 00:00:00 2001 From: sstrigler <23786+sstrigler@users.noreply.github.com> Date: Thu, 13 Nov 2025 07:36:21 +0000 Subject: [PATCH 4/4] Automatic changes "make spec xdata" --- include/xmpp_codec.hrl | 186 ++++++++++++++++++++++------------------- src/rfc6121.erl | 34 +++++++- src/xmpp_codec.erl | 18 +++- 3 files changed, 144 insertions(+), 94 deletions(-) diff --git a/include/xmpp_codec.hrl b/include/xmpp_codec.hrl index f87c3cb..3921e4e 100644 --- a/include/xmpp_codec.hrl +++ b/include/xmpp_codec.hrl @@ -190,15 +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{}. --record(rosterver_feature, {}). --type rosterver_feature() :: #rosterver_feature{}. - -record(mix_roster_channel, {participant_id = <<>> :: binary()}). -type mix_roster_channel() :: #mix_roster_channel{}. @@ -341,6 +335,9 @@ -record(private, {sub_els = [] :: [xmpp_element() | fxml:xmlel()]}). -type private() :: #private{}. +-record(preauth, {token = <<>> :: binary()}). +-type preauth() :: #preauth{}. + -record(scram_upgrade_hash, {data = <<>> :: binary()}). -type scram_upgrade_hash() :: #scram_upgrade_hash{}. @@ -389,6 +386,9 @@ id = <<>> :: binary()}). -type inbox_entry() :: #inbox_entry{}. +-record(feature_register_ibr_token, {}). +-type feature_register_ibr_token() :: #feature_register_ibr_token{}. + -record(x509_challenge_failed, {}). -type x509_challenge_failed() :: #x509_challenge_failed{}. @@ -644,6 +644,9 @@ items = [] :: [#ps_item{}]}). -type ps_publish() :: #ps_publish{}. +-record(feature_pre_approval, {}). +-type feature_pre_approval() :: #feature_pre_approval{}. + -record(report, {reason :: 'abuse' | 'spam', text = [] :: [#text{}]}). -type report() :: #report{}. @@ -860,11 +863,6 @@ 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{}. @@ -927,14 +925,6 @@ -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{}. @@ -1255,38 +1245,6 @@ 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()}). @@ -1338,28 +1296,6 @@ text = [] :: [#text{}]}). -type sasl_failure() :: #sasl_failure{}. --record(bind, {jid :: undefined | jid:jid(), - resource = <<>> :: binary()}). --type bind() :: #bind{}. - --record(jingle_ft_file, {date :: undefined | erlang:timestamp(), - desc = [] :: [#text{}], - hash = [] :: [#hash{}], - 'hash-used' :: 'undefined' | #hash_used{}, - 'media-type' :: 'undefined' | binary(), - name :: 'undefined' | binary(), - size :: 'undefined' | non_neg_integer(), - range :: 'undefined' | #jingle_ft_range{}}). --type jingle_ft_file() :: #jingle_ft_file{}. - --record(jingle_ft_checksum, {creator :: 'initiator' | 'responder' | 'undefined', - name = <<>> :: binary(), - file :: #jingle_ft_file{}}). --type jingle_ft_checksum() :: #jingle_ft_checksum{}. - --record(jingle_ft_description, {file :: 'undefined' | #jingle_ft_file{}}). --type jingle_ft_description() :: #jingle_ft_description{}. - -record(pubsub, {subscriptions :: 'undefined' | {binary(),[#ps_subscription{}]}, subscription :: 'undefined' | #ps_subscription{}, affiliations :: 'undefined' | {binary(),[#ps_affiliation{}]}, @@ -1400,6 +1336,88 @@ 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(privacy_query, {lists = [] :: [#privacy_list{}], + default :: 'none' | 'undefined' | binary(), + active :: 'none' | 'undefined' | binary()}). +-type privacy_query() :: #privacy_query{}. + +-record(jingle_ft_file, {date :: undefined | erlang:timestamp(), + desc = [] :: [#text{}], + hash = [] :: [#hash{}], + 'hash-used' :: 'undefined' | #hash_used{}, + 'media-type' :: 'undefined' | binary(), + name :: 'undefined' | binary(), + size :: 'undefined' | non_neg_integer(), + range :: 'undefined' | #jingle_ft_range{}}). +-type jingle_ft_file() :: #jingle_ft_file{}. + +-record(jingle_ft_checksum, {creator :: 'initiator' | 'responder' | 'undefined', + name = <<>> :: binary(), + file :: #jingle_ft_file{}}). +-type jingle_ft_checksum() :: #jingle_ft_checksum{}. + +-record(jingle_ft_description, {file :: 'undefined' | #jingle_ft_file{}}). +-type jingle_ft_description() :: #jingle_ft_description{}. + -record(register, {registered = false :: boolean(), remove = false :: boolean(), instructions :: 'undefined' | binary(), @@ -1424,21 +1442,12 @@ sub_els = [] :: [xmpp_element() | fxml:xmlel()]}). -type register() :: #register{}. --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(bind, {jid :: undefined | jid:jid(), + resource = <<>> :: binary()}). +-type bind() :: #bind{}. --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(rosterver_feature, {}). +-type rosterver_feature() :: #rosterver_feature{}. -type xmpp_element() :: address() | addresses() | @@ -1491,7 +1500,9 @@ fasten_apply_to() | fasten_external() | feature_csi() | + feature_pre_approval() | feature_register() | + feature_register_ibr_token() | feature_sm() | forwarded() | gone() | @@ -1583,6 +1594,7 @@ origin_id() | pep_bookmarks_conference() | ping() | + preauth() | presence() | privacy_item() | privacy_list() | diff --git a/src/rfc6121.erl b/src/rfc6121.erl index a1705e9..8fc2372 100644 --- a/src/rfc6121.erl +++ b/src/rfc6121.erl @@ -5,6 +5,11 @@ -compile(export_all). +do_decode(<<"sub">>, + <<"urn:xmpp:features:pre-approval">>, El, Opts) -> + decode_feature_pre_approval(<<"urn:xmpp:features:pre-approval">>, + Opts, + El); do_decode(<<"ver">>, <<"urn:xmpp:features:rosterver">>, El, Opts) -> decode_rosterver_feature(<<"urn:xmpp:features:rosterver">>, @@ -25,7 +30,8 @@ do_decode(Name, XMLNS, _, _) -> erlang:error({xmpp_codec, {unknown_tag, Name, XMLNS}}). tags() -> - [{<<"ver">>, <<"urn:xmpp:features:rosterver">>}, + [{<<"sub">>, <<"urn:xmpp:features:pre-approval">>}, + {<<"ver">>, <<"urn:xmpp:features:rosterver">>}, {<<"query">>, <<"jabber:iq:roster">>}, {<<"item">>, <<"jabber:iq:roster">>}, {<<"group">>, <<"jabber:iq:roster">>}]. @@ -36,13 +42,18 @@ do_encode({roster_item, _, _, _, _, _, _} = Item, do_encode({roster_query, _, _, _} = Query, TopXMLNS) -> encode_roster_query(Query, TopXMLNS); do_encode({rosterver_feature} = Ver, TopXMLNS) -> - encode_rosterver_feature(Ver, TopXMLNS). + encode_rosterver_feature(Ver, TopXMLNS); +do_encode({feature_pre_approval} = Sub, TopXMLNS) -> + encode_feature_pre_approval(Sub, TopXMLNS). +do_get_name({feature_pre_approval}) -> <<"sub">>; do_get_name({roster_item, _, _, _, _, _, _}) -> <<"item">>; do_get_name({roster_query, _, _, _}) -> <<"query">>; do_get_name({rosterver_feature}) -> <<"ver">>. +do_get_ns({feature_pre_approval}) -> + <<"urn:xmpp:features:pre-approval">>; do_get_ns({roster_item, _, _, _, _, _, _}) -> <<"jabber:iq:roster">>; do_get_ns({roster_query, _, _, _}) -> @@ -54,12 +65,14 @@ pp(roster_item, 6) -> [jid, name, groups, subscription, ask, mix_channel]; pp(roster_query, 3) -> [items, ver, mix_annotate]; pp(rosterver_feature, 0) -> []; +pp(feature_pre_approval, 0) -> []; pp(_, _) -> no. records() -> [{roster_item, 6}, {roster_query, 3}, - {rosterver_feature, 0}]. + {rosterver_feature, 0}, + {feature_pre_approval, 0}]. dec_enum(Val, Enums) -> AtomVal = erlang:binary_to_existing_atom(Val, utf8), @@ -69,6 +82,21 @@ dec_enum(Val, Enums) -> enc_enum(Atom) -> erlang:atom_to_binary(Atom, utf8). +decode_feature_pre_approval(__TopXMLNS, __Opts, + {xmlel, <<"sub">>, _attrs, _els}) -> + {feature_pre_approval}. + +encode_feature_pre_approval({feature_pre_approval}, + __TopXMLNS) -> + __NewTopXMLNS = + xmpp_codec:choose_top_xmlns(<<"urn:xmpp:features:pre-approval">>, + [], + __TopXMLNS), + _els = [], + _attrs = xmpp_codec:enc_xmlns_attrs(__NewTopXMLNS, + __TopXMLNS), + {xmlel, <<"sub">>, _attrs, _els}. + decode_rosterver_feature(__TopXMLNS, __Opts, {xmlel, <<"ver">>, _attrs, _els}) -> {rosterver_feature}. diff --git a/src/xmpp_codec.erl b/src/xmpp_codec.erl index f4feb18..fff1037 100644 --- a/src/xmpp_codec.erl +++ b/src/xmpp_codec.erl @@ -676,6 +676,9 @@ get_mod(<<"decline">>, <<"urn:xmpp:jingle:1">>) -> get_mod(<<"connection">>, <<"urn:xmpp:serverinfo:0">>) -> xep0485; +get_mod(<<"sub">>, + <<"urn:xmpp:features:pre-approval">>) -> + rfc6121; get_mod(<<"key">>, <<"jabber:iq:register">>) -> xep0077; get_mod(<<"unsupported">>, <<"http://jabber.org/protocol/pubsub#errors">>) -> @@ -692,6 +695,8 @@ get_mod(<<"query">>, <<"jabber:iq:register">>) -> xep0077; get_mod(<<"CLASS">>, <<"vcard-temp">>) -> xep0054; get_mod(<<"result">>, <<"urn:xmpp:mam:2">>) -> xep0313; +get_mod(<<"register">>, <<"urn:xmpp:ibr-token:0">>) -> + xep0445; get_mod(<<"purge">>, <<"http://jabber.org/protocol/pubsub#event">>) -> xep0060; @@ -852,6 +857,8 @@ get_mod(<<"connectivity-error">>, get_mod(<<"retracted">>, <<"urn:xmpp:message-retract:1">>) -> xep0424; +get_mod(<<"preauth">>, <<"urn:xmpp:pars:0">>) -> + xep0379; get_mod(<<"stream:features">>, <<"jabber:server">>) -> rfc6120; get_mod(<<"request">>, @@ -1813,6 +1820,7 @@ get_mod({disco_items, _, _, _}) -> xep0030; get_mod({vcard_xupdate, _}) -> xep0153; get_mod({sasl2_challenge, _}) -> xep0388; get_mod({bind2_feature, _}) -> xep0386; +get_mod({feature_register_ibr_token}) -> xep0445; get_mod({block_item, _, _}) -> xep0191; get_mod({message, _, _, _, _, _, _, _, _, _, _}) -> rfc6120; @@ -1917,18 +1925,15 @@ get_mod({fasten_apply_to, _, _, _}) -> xep0422; get_mod({mix_destroy, _, _}) -> xep0369; get_mod({media_uri, _, _}) -> xep0221; get_mod({jingle_error, _}) -> xep0166; +get_mod({feature_pre_approval}) -> rfc6121; get_mod({sasl_success, _}) -> rfc6120; get_mod({compress, _}) -> xep0138; get_mod({xdata_field, _, _, _, _, _, _, _, _}) -> xep0004; -get_mod({muc_subscriptions, _}) -> p1_mucsub; -get_mod({mix, _, _, _, _}) -> xep0369; -get_mod({addresses, _}) -> xep0033; get_mod({adhoc_command, _, _, _, _, _, _, _, _}) -> xep0050; get_mod({media, _, _, _}) -> xep0221; get_mod({oob_x, _, _, _, _}) -> xep0066; -get_mod({ibb_data, _, _, _}) -> xep0047; get_mod({identity, _, _, _, _}) -> xep0030; get_mod({redirect, _}) -> rfc6120; get_mod({muc_history, _, _, _, _}) -> xep0045; @@ -2093,6 +2098,7 @@ get_mod({message_moderate, _, _, _}) -> xep0425; get_mod({sasl_channel_binding, _}) -> xep0440; get_mod({db_result, _, _, _, _, _}) -> xep0220; get_mod({scram_upgrade_hash, _}) -> xep0480; +get_mod({preauth, _}) -> xep0379; get_mod({bookmark_conference, _, _, _, _, _}) -> xep0048; get_mod({vcard_name, _, _, _, _, _}) -> xep0054; @@ -2165,4 +2171,8 @@ get_mod({upload_slot_0, _, _, _}) -> xep0363; get_mod({delegation_query, _, _}) -> xep0355; get_mod({jingle_s5b_candidate, _, _, _, _, _, _}) -> xep0260; +get_mod({muc_subscriptions, _}) -> p1_mucsub; +get_mod({mix, _, _, _, _}) -> xep0369; +get_mod({addresses, _}) -> xep0033; +get_mod({ibb_data, _, _, _}) -> xep0047; get_mod(Record) -> xmpp_codec_external:lookup(Record).