2 * Copyright (C) 2009 Thadeu Lima de Souza Cascardo <cascardo@holoscopio.com>
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License along
15 * with this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
27 static char * server = "vespa.holoscopio.com";
28 static char * username = "pubsub";
29 static char * password = "pubsub";
30 static char * pbservice = "pubsub.vespa.holoscopio.com";
31 static char * authed_jid = "vespa";
34 createiq (char *type, char *to, char *qnam, char *xmlns, iks **query)
39 snprintf (sid, 32, "ps%d", id++);
41 iks_insert_attrib (iq, "type", type);
42 iks_insert_attrib (iq, "to", to);
43 iks_insert_attrib (iq, "id", sid);
44 *query = iks_insert (iq, qnam);
45 iks_insert_attrib (*query, "xmlns", xmlns);
50 catnode (iksparser *parser, char *node)
54 iq = createiq ("get", pbservice, "query",
55 "http://jabber.org/protocol/disco#info", &query);
57 iks_insert_attrib (query, "node", node);
58 iks_send (parser, iq);
63 listnode (iksparser *parser, char *node)
67 iq = createiq ("get", pbservice, "query",
68 "http://jabber.org/protocol/disco#items", &query);
70 iks_insert_attrib (query, "node", node);
71 iks_send (parser, iq);
76 createnode (iksparser *parser, char *node)
80 iq = createiq ("set", pbservice, "pubsub",
81 "http://jabber.org/protocol/pubsub", &query);
82 iks_insert_attrib (iks_insert (query, "create"), "node", node);
83 iks_send (parser, iq);
88 getnode (iksparser *parser, char *node)
92 iq = createiq ("get", pbservice, "pubsub",
93 "http://jabber.org/protocol/pubsub", &query);
94 iks_insert_attrib (iks_insert (query, "items"), "node", node);
95 iks_send (parser, iq);
100 vcard (iksparser *parser)
104 iq = createiq ("get", pbservice, "vCard", "vcard-temp", &query);
105 iks_send (parser, iq);
110 createmood (char *line)
113 mood = iks_new ("mood");
114 iks_insert_attrib (mood, "xmlns", "http://jabber.org/protocol/mood");
115 iks_insert (mood, line);
120 pushmood (iksparser *parser, char *node, char *line)
127 iq = createiq ("set", pbservice, "pubsub",
128 "http://jabber.org/protocol/pubsub", &query);
129 publish = iks_insert (query, "publish");
130 iks_insert_attrib (publish, "node", node);
131 item = iks_insert (publish, "item");
132 mood = createmood (line);
133 iks_insert_node (item, mood);
134 iks_send (parser, iq);
139 createtune (char *line)
142 tune = iks_new ("tune");
143 iks_insert_attrib (tune, "xmlns", "http://jabber.org/protocol/tune");
144 iks_insert_cdata (iks_insert (tune, "artist"), line, 0);
149 pushtune (iksparser *parser, char *node, char *line)
156 iq = createiq ("set", pbservice, "pubsub",
157 "http://jabber.org/protocol/pubsub", &query);
158 publish = iks_insert (query, "publish");
159 iks_insert_attrib (publish, "node", node);
160 item = iks_insert (publish, "item");
161 tune = createtune (line);
162 iks_insert_node (item, tune);
163 printf ("debug: %s\n", iks_string (iks_stack (iq), iq));
164 iks_send (parser, iq);
170 process_mood (iksparser *parser, char *cmdline)
174 orig_cmdline = cmdline = strdup (cmdline);
175 cmd = strsep (&cmdline, " ");
176 if (!strcmp (cmd, "ls"))
177 listnode (parser, cmdline);
178 else if (!strcmp (cmd, "cat"))
179 catnode (parser, cmdline);
180 else if (!strcmp (cmd, "vcard"))
182 else if (!strcmp (cmd, "create"))
183 createnode (parser, cmdline);
184 else if (!strcmp (cmd, "get"))
185 getnode (parser, cmdline);
186 else if (!strcmp (cmd, "mood"))
189 node = "http://jabber.org/protocol/mood";
190 pushmood (parser, node, cmdline);
192 else if (!strcmp (cmd, "tune"))
195 node = "http://jabber.org/protocol/tune";
196 pushtune (parser, node, cmdline);
202 xmpp_session_hook (iksparser *parser, iks *node)
206 iks_insert_attrib (iq, "type", "set");
207 iks_insert_attrib (iq, "id", "session1");
208 iks_insert_attrib (iks_insert (iq, "session"),
209 "xmlns", "urn:ietf:params:xml:ns:xmpp-session");
210 iks_send (parser, iq);
216 xmpp_initial_presence_hook (iksparser *parser, iks *node)
219 pres = iks_make_pres (IKS_SHOW_AVAILABLE, "Microblogging here!");
220 iks_send (parser, pres);
226 xmpp_id_hook (iksparser *parser, iks *node, char *id)
228 if (!iks_strcmp (id, "bind1"))
230 xmpp_session_hook (parser, node);
233 else if (!iks_strcmp (id, "session1"))
235 xmpp_initial_presence_hook (parser, node);
238 else if (!iks_strncmp (id, "ps", 2))
240 printf ("%s\n", iks_string (iks_stack (node), node));
246 xmpp_ns_hook (iksparser *parser, iks *node, char *ns)
252 xmpp_iq_error (iksparser *parser, iks *node)
257 if (!iks_strcmp (iks_find_attrib (node, "type"), "error"))
259 to = iks_find_attrib (node, "to");
260 from = iks_find_attrib (node, "from");
262 iks_insert_attrib (node, "from", to);
264 iks_insert_attrib (node, "from", NULL);
266 iks_insert_attrib (node, "to", from);
268 iks_insert_attrib (node, "to", NULL);
269 iks_insert_attrib (node, "type", "error");
270 enode = iks_insert (node, "error");
271 iks_insert_attrib (enode, "type", "cancel");
272 iks_insert_attrib (iks_insert (enode, "feature-not-implemented"),
273 "xmlns", "urn:ietf:params:xml:ns:xmpp-stanzas");
274 iks_send (parser, node);
279 xmpp_tls_hook (iksparser *parser, iks *node)
281 iks_start_tls (parser);
286 xmpp_sasl_hook (iksparser *parser, iks* node)
288 iks_start_sasl (parser, IKS_SASL_DIGEST_MD5, username, password);
293 xmpp_bind_hook (iksparser *parser, iks *node)
297 iks_insert_attrib (iq, "type", "set");
298 iks_insert_attrib (iq, "id", "bind1");
299 iks_insert_attrib (iks_insert (iq, "bind"),
300 "xmlns", "urn:ietf:params:xml:ns:xmpp-bind");
301 iks_send (parser, iq);
307 xmpp_features_hook (iksparser *parser, iks *node)
311 for (feat = iks_child (node); feat != NULL; feat = iks_next (feat))
313 ns = iks_find_attrib (feat, "xmlns");
314 if (!iks_strcmp (ns, "urn:ietf:params:xml:ns:xmpp-tls"))
316 xmpp_tls_hook (parser, node);
319 else if (!iks_strcmp (ns, "urn:ietf:params:xml:ns:xmpp-sasl"))
321 xmpp_sasl_hook (parser, node);
324 else if (!iks_strcmp (ns, "urn:ietf:params:xml:ns:xmpp-bind"))
326 xmpp_bind_hook (parser, node);
334 xmpp_other_hook (iksparser *parser, iks *node, char *ns)
336 if (!iks_strcmp (ns, "urn:ietf:params:xml:ns:xmpp-sasl"))
338 if (!iks_strcmp (iks_name (node), "success"))
339 iks_send_header (parser, server);
340 else if (!iks_strcmp (iks_name (node), "failure"))
341 printf ("failture to authenticate: %s\n",
342 iks_string (iks_stack (node), node));
350 hook (void *data, int type, iks *node)
357 parser = *(iksparser **) data;
358 name = iks_name (node);
359 id = iks_find_attrib (node, "id");
360 ns = iks_find_attrib (node, "xmlns");
361 iqns = iks_find_attrib (iks_child (node), "xmlns");
362 if (!iks_strcmp (name, "message"))
365 from = iks_find_attrib (node, "from");
366 if (!iks_strncmp (from, authed_jid, iks_strlen (authed_jid)))
368 char *body = iks_find_cdata (node, "body");
370 process_mood (parser, body);
374 printf ("%s is not authorized\n", from);
378 else if (!iks_strcmp (name, "presence"))
381 from = iks_find_attrib (node, "from");
382 printf ("I sense a disturbance in the force: %s!\n", from);
384 else if (!iks_strcmp (name, "iq"))
386 if (xmpp_id_hook (parser, node, id) == 0)
388 if (xmpp_ns_hook (parser, node, iqns) == 0)
390 xmpp_iq_error (parser, node);
392 else if (!iks_strcmp (name, "stream:features"))
394 if (xmpp_features_hook (parser, node) == 0)
397 else if (!iks_strcmp (name, "stream:error"))
399 printf ("streamerror: %s\n", iks_string (iks_stack (node), node));
403 if (xmpp_other_hook (parser, node, ns) == 0)
405 printf ("No no: %s\n", name);
411 handler (GIOChannel *channel, GIOCondition cond, gpointer data)
413 iksparser *parser = data;
414 iks_recv (parser, 0);
419 loop (iksparser *parser)
422 channel = g_io_channel_unix_new (iks_fd (parser));
423 g_io_add_watch (channel, G_IO_IN, handler, parser);
424 g_main_loop_run (g_main_loop_new (g_main_context_default (), TRUE));
428 main (int argc, char **argv)
432 while ((c = getopt (argc, argv, "s:u:p:i:a:")) != -1)
453 parser = iks_stream_new ("jabber:client", &parser, hook);
454 iks_connect_tcp (parser, server, 5222);