diff options
Diffstat (limited to 'xmpp-vala/src/module/xep/0386_bind2.vala')
| -rw-r--r-- | xmpp-vala/src/module/xep/0386_bind2.vala | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/xmpp-vala/src/module/xep/0386_bind2.vala b/xmpp-vala/src/module/xep/0386_bind2.vala new file mode 100644 index 00000000..cc21d62e --- /dev/null +++ b/xmpp-vala/src/module/xep/0386_bind2.vala @@ -0,0 +1,49 @@ +using Gee; + +namespace Xmpp.Xep.Bind2 { + public const string NS_URI = "urn:xmpp:bind:0"; + + public class Sasl2Activation : ExtensibleSaslProfile.Sasl2InlineActivation { + public HashMap<string, Bind2InlineActivation> inline_activation_providers = new HashMap<string, Bind2InlineActivation>(); + + public override StanzaNode? get_activation_node(XmppStream stream, StanzaNode inline_node) { + var res = new StanzaNode.build("bind", Bind2.NS_URI).add_self_xmlns().put_node( + new StanzaNode.build("tag", Bind2.NS_URI).put_node(new StanzaNode.text("dino"))); + + StanzaNode bind_inline_node = inline_node.get_subnode("bind", NS_URI).get_subnode("inline", NS_URI); + + if (bind_inline_node != null) { + foreach (StanzaNode inline_feature in bind_inline_node.get_subnodes("feature", NS_URI)) { + var inline_feature_ns = inline_feature.get_attribute("var"); + if (inline_activation_providers.has_key(inline_feature_ns)) { + var activation_node = inline_activation_providers[inline_feature_ns].get_activation_node(stream); + if (activation_node != null) { + res.put_node(activation_node); + } + } + } + } + return res; + } + + public override void on_bound(XmppStream stream, Jid authorization_identifier, StanzaNode success_node) { + Bind.Flag bind_flag = new Bind.Flag(); + bind_flag.my_jid = authorization_identifier; + bind_flag.finished = true; + stream.add_flag(bind_flag); + stream.get_module(Bind.Module.IDENTITY).bound_to_resource(stream, bind_flag.my_jid); + + StanzaNode? bound_node = success_node.get_subnode("bound", Bind2.NS_URI); + if (bound_node != null) { + foreach (var inline_activation in inline_activation_providers.values) { + inline_activation.on_bound(stream, bound_node); + } + } + } + } + + public abstract class Bind2InlineActivation : Object { + public abstract StanzaNode? get_activation_node(XmppStream stream); + public abstract void on_bound(XmppStream stream, StanzaNode bound_node); + } +}
\ No newline at end of file |
