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.
26 static char * server = "vespa.holoscopio.com";
27 static char * username = "pubsub";
28 static char * password = "pubsub";
29 static char * pbservice = "pubsub.vespa.holoscopio.com";
30 static char * authed_jid = "vespa";
33 createiq (char *type, char *to, char *qnam, char *xmlns, iks **query)
38 snprintf (sid, 32, "ps%d", id++);
40 iks_insert_attrib (iq, "type", type);
41 iks_insert_attrib (iq, "to", to);
42 iks_insert_attrib (iq, "id", sid);
43 *query = iks_insert (iq, qnam);
44 iks_insert_attrib (*query, "xmlns", xmlns);
49 catnode (iksparser *parser, char *node)
53 iq = createiq ("get", pbservice, "query",
54 "http://jabber.org/protocol/disco#info", &query);
56 iks_insert_attrib (query, "node", node);
57 iks_send (parser, iq);
62 listnode (iksparser *parser, char *node)
66 iq = createiq ("get", pbservice, "query",
67 "http://jabber.org/protocol/disco#items", &query);
69 iks_insert_attrib (query, "node", node);
70 iks_send (parser, iq);
75 createnode (iksparser *parser, char *node)
79 iq = createiq ("set", pbservice, "pubsub",
80 "http://jabber.org/protocol/pubsub", &query);
81 iks_insert_attrib (iks_insert (query, "create"), "node", node);
82 iks_send (parser, iq);
87 getnode (iksparser *parser, char *node)
91 iq = createiq ("get", pbservice, "pubsub",
92 "http://jabber.org/protocol/pubsub", &query);
93 iks_insert_attrib (iks_insert (query, "items"), "node", node);
94 iks_send (parser, iq);
99 vcard (iksparser *parser)
103 iq = createiq ("get", pbservice, "vCard", "vcard-temp", &query);
104 iks_send (parser, iq);
109 createmood (char *line)
112 mood = iks_new ("mood");
113 iks_insert_attrib (mood, "xmlns", "http://jabber.org/protocol/mood");
114 iks_insert (mood, line);
119 pushmood (iksparser *parser, char *node, char *line)
126 iq = createiq ("set", pbservice, "pubsub",
127 "http://jabber.org/protocol/pubsub", &query);
128 publish = iks_insert (query, "publish");
129 iks_insert_attrib (publish, "node", node);
130 item = iks_insert (publish, "item");
131 mood = createmood (line);
132 iks_insert_node (item, mood);
133 iks_send (parser, iq);
138 createtune (char *line)
141 tune = iks_new ("tune");
142 iks_insert_attrib (tune, "xmlns", "http://jabber.org/protocol/tune");
143 iks_insert_cdata (iks_insert (tune, "artist"), line, 0);
148 pushtune (iksparser *parser, char *node, char *line)
155 iq = createiq ("set", pbservice, "pubsub",
156 "http://jabber.org/protocol/pubsub", &query);
157 publish = iks_insert (query, "publish");
158 iks_insert_attrib (publish, "node", node);
159 item = iks_insert (publish, "item");
160 tune = createtune (line);
161 iks_insert_node (item, tune);
162 printf ("debug: %s\n", iks_string (iks_stack (iq), iq));
163 iks_send (parser, iq);
169 process_mood (iksparser *parser, char *cmdline)
173 orig_cmdline = cmdline = strdup (cmdline);
174 cmd = strsep (&cmdline, " ");
175 if (!strcmp (cmd, "ls"))
176 listnode (parser, cmdline);
177 else if (!strcmp (cmd, "cat"))
178 catnode (parser, cmdline);
179 else if (!strcmp (cmd, "vcard"))
181 else if (!strcmp (cmd, "create"))
182 createnode (parser, cmdline);
183 else if (!strcmp (cmd, "get"))
184 getnode (parser, cmdline);
185 else if (!strcmp (cmd, "mood"))
188 node = "http://jabber.org/protocol/mood";
189 pushmood (parser, node, cmdline);
191 else if (!strcmp (cmd, "tune"))
194 node = "http://jabber.org/protocol/tune";
195 pushtune (parser, node, cmdline);
201 xmpp_session_hook (iksparser *parser, iks *node)
205 iks_insert_attrib (iq, "type", "set");
206 iks_insert_attrib (iq, "id", "session1");
207 iks_insert_attrib (iks_insert (iq, "session"),
208 "xmlns", "urn:ietf:params:xml:ns:xmpp-session");
209 iks_send (parser, iq);
215 xmpp_initial_presence_hook (iksparser *parser, iks *node)
218 pres = iks_make_pres (IKS_SHOW_AVAILABLE, "Microblogging here!");
219 iks_send (parser, pres);
225 xmpp_id_hook (iksparser *parser, iks *node, char *id)
227 if (!iks_strcmp (id, "bind1"))
229 xmpp_session_hook (parser, node);
232 else if (!iks_strcmp (id, "session1"))
234 xmpp_initial_presence_hook (parser, node);
237 else if (!iks_strncmp (id, "ps", 2))
239 printf ("%s\n", iks_string (iks_stack (node), node));
245 xmpp_ns_hook (iksparser *parser, iks *node, char *ns)
251 xmpp_iq_error (iksparser *parser, iks *node)
256 if (!iks_strcmp (iks_find_attrib (node, "type"), "error"))
258 to = iks_find_attrib (node, "to");
259 from = iks_find_attrib (node, "from");
261 iks_insert_attrib (node, "from", to);
263 iks_insert_attrib (node, "from", NULL);
265 iks_insert_attrib (node, "to", from);
267 iks_insert_attrib (node, "to", NULL);
268 iks_insert_attrib (node, "type", "error");
269 enode = iks_insert (node, "error");
270 iks_insert_attrib (enode, "type", "cancel");
271 iks_insert_attrib (iks_insert (enode, "feature-not-implemented"),
272 "xmlns", "urn:ietf:params:xml:ns:xmpp-stanzas");
273 iks_send (parser, node);
278 xmpp_tls_hook (iksparser *parser, iks *node)
280 iks_start_tls (parser);
285 xmpp_sasl_hook (iksparser *parser, iks* node)
287 iks_start_sasl (parser, IKS_SASL_DIGEST_MD5, username, password);
292 xmpp_bind_hook (iksparser *parser, iks *node)
296 iks_insert_attrib (iq, "type", "set");
297 iks_insert_attrib (iq, "id", "bind1");
298 iks_insert_attrib (iks_insert (iq, "bind"),
299 "xmlns", "urn:ietf:params:xml:ns:xmpp-bind");
300 iks_send (parser, iq);
306 xmpp_features_hook (iksparser *parser, iks *node)
310 for (feat = iks_child (node); feat != NULL; feat = iks_next (feat))
312 ns = iks_find_attrib (feat, "xmlns");
313 if (!iks_strcmp (ns, "urn:ietf:params:xml:ns:xmpp-tls"))
315 xmpp_tls_hook (parser, node);
318 else if (!iks_strcmp (ns, "urn:ietf:params:xml:ns:xmpp-sasl"))
320 xmpp_sasl_hook (parser, node);
323 else if (!iks_strcmp (ns, "urn:ietf:params:xml:ns:xmpp-bind"))
325 xmpp_bind_hook (parser, node);
333 xmpp_other_hook (iksparser *parser, iks *node, char *ns)
335 if (!iks_strcmp (ns, "urn:ietf:params:xml:ns:xmpp-sasl"))
337 if (!iks_strcmp (iks_name (node), "success"))
338 iks_send_header (parser, server);
339 else if (!iks_strcmp (iks_name (node), "failure"))
340 printf ("failture to authenticate: %s\n",
341 iks_string (iks_stack (node), node));
349 hook (void *data, int type, iks *node)
356 parser = *(iksparser **) data;
357 name = iks_name (node);
358 id = iks_find_attrib (node, "id");
359 ns = iks_find_attrib (node, "xmlns");
360 iqns = iks_find_attrib (iks_child (node), "xmlns");
361 if (!iks_strcmp (name, "message"))
364 from = iks_find_attrib (node, "from");
365 if (!iks_strncmp (from, authed_jid, iks_strlen (authed_jid)))
367 char *body = iks_find_cdata (node, "body");
369 process_mood (parser, body);
373 printf ("%s is not authorized\n", from);
377 else if (!iks_strcmp (name, "presence"))
380 from = iks_find_attrib (node, "from");
381 printf ("I sense a disturbance in the force: %s!\n", from);
383 else if (!iks_strcmp (name, "iq"))
385 if (xmpp_id_hook (parser, node, id) == 0)
387 if (xmpp_ns_hook (parser, node, iqns) == 0)
389 xmpp_iq_error (parser, node);
391 else if (!iks_strcmp (name, "stream:features"))
393 if (xmpp_features_hook (parser, node) == 0)
396 else if (!iks_strcmp (name, "stream:error"))
398 printf ("streamerror: %s\n", iks_string (iks_stack (node), node));
402 if (xmpp_other_hook (parser, node, ns) == 0)
404 printf ("No no: %s\n", name);
410 main (int argc, char **argv)
414 while ((c = getopt (argc, argv, "s:u:p:i:a:")) != -1)
435 parser = iks_stream_new ("jabber:client", &parser, hook);
436 iks_connect_tcp (parser, server, 5222);
438 iks_recv (parser, -1);