Detect if PLAIN SASL mechanism is supported
authorThadeu Lima de Souza Cascardo <cascardo@holoscopio.com>
Sun, 2 Nov 2008 03:15:55 +0000 (01:15 -0200)
committerThadeu Lima de Souza Cascardo <cascardo@holoscopio.com>
Sun, 2 Nov 2008 03:15:55 +0000 (01:15 -0200)
tictactoe.c

index 5c7e599..19b4891 100644 (file)
 #include "tcp_connect.h"
 #include "iksemel_extra.h"
 
+void
+plain (void *data)
+{
+  iks *mplain;
+  char *str;
+  mplain = iks_new ("auth");
+  iks_insert_attrib (mplain, "xmlns", "urn:ietf:params:xml:ns:xmpp-sasl");
+  iks_insert_attrib (mplain, "mechanism", "PLAIN");
+  str = iks_string (iks_stack (mplain), mplain);
+  write ((int) data, str, strlen (str));
+  iks_delete (mplain);
+}
+
+void
+sasl (void *data, iks *s)
+{
+  iks *m;
+  for (m = iks_child (s); m != NULL; m = iks_next (m))
+    {
+      if (!iks_strcmp (iks_name (m), "mechanism") &&
+          !iks_strcmp (iks_cdata (iks_child (m)), "PLAIN"))
+        plain (data);
+    }
+}
+
+void
+features (void *data, iks *s)
+{
+  iks *f;
+  for (f = iks_child (s); f != NULL; f = iks_next (f))
+    {
+      if (!iks_strcmp (iks_name (f), "mechanisms") &&
+          !iks_strcmp (iks_find_attrib (f, "xmlns"),
+                       "urn:ietf:params:xml:ns:xmpp-sasl"))
+        sasl (data, f);
+    }
+}
+
 int
 myhook (void *data, int type, iks *stanza)
 {
-  char *s = iks_string (iks_stack (stanza), stanza);
-  write (1, s, strlen (s));
+  if (!iks_strcmp (iks_name (stanza), "stream:features"))
+    {
+      features (data, stanza);
+    }
+  else
+    {
+      fprintf (stderr, "Other: %s\n", iks_string (iks_stack (stanza), stanza));
+    }
   return IKS_OK;
 }
 
@@ -62,7 +106,7 @@ main (int argc, char **argv)
   iksparser *parser;
   dns_init (NULL, 1);
   fd = hc_tcp_connect (server, "xmpp-client");
-  parser = iks_extra_stream_new (NULL, myhook);
+  parser = iks_extra_stream_new ((void *) fd, myhook);
   write_stream (fd, server);
   loop (parser, fd);
   return 0;