X-Git-Url: http://git.cascardo.eti.br/?a=blobdiff_plain;f=jabber.c;h=61ed23c8c4864562fa4fb5cc7999eceddd5e7ece;hb=dff33f5dcf96800863b162a320bcf5dc0bb15b92;hp=41d20a5a0fe15d0789c2fbb1dbeefdbaa213a6d8;hpb=fbd666fad867a355dca17e866daf04cc46c0623a;p=cascardo%2Frnetproxy.git diff --git a/jabber.c b/jabber.c index 41d20a5..61ed23c 100644 --- a/jabber.c +++ b/jabber.c @@ -20,14 +20,47 @@ #include #include #include +#include +#include "iksemel_extra.h" #include "jabber.h" +jabber_data_t* jabber_data_new (gpointer hook, gpointer parser) +{ + jabber_data_t *data; + data = g_slice_new0 (jabber_data_t); + data->parser = iks_extra_stream_new (hook, parser); + gsasl_init (&(data->ctx)); + return data; +} + +void jabber_data_destroy (gpointer data) +{ + jabber_data_t *jdata = (jabber_data_t*) data; + if (jdata->parser) + iks_parser_delete (jdata->parser); + if (jdata->client) + gsasl_finish (jdata->client); + if (jdata->server) + gsasl_finish (jdata->server); + if (jdata->ctx) + gsasl_done (jdata->ctx); + g_slice_free (jabber_data_t, jdata); +} + static void jabber_connect (net_hook_t* hook) { } static void jabber_close (net_hook_t* hook) { + if (hook->peer) + { + hook->peer->peer = NULL; + gnet_conn_disconnect (hook->peer->conn); + } + gnet_conn_delete (hook->conn); + jabber_data_destroy (hook->data); + g_slice_free (net_hook_t, hook); } static void jabber_write (net_hook_t* hook) @@ -36,7 +69,8 @@ static void jabber_write (net_hook_t* hook) static void jabber_read (net_hook_t* hook, gchar* buffer, size_t len) { - iks_parse (hook->data, buffer, len, FALSE); + jabber_data_t *jdata = (jabber_data_t*) hook->data; + iks_parse (jdata->parser, buffer, len, FALSE); } void jabber_error (net_hook_t* hook) @@ -47,7 +81,6 @@ void jabber_error (net_hook_t* hook) GString* jabber_new_start (iks* node) { GString* buffer; - iks* attrib; buffer = g_string_sized_new (256); g_string_append (buffer, iks_string (iks_stack (node), node)); g_string_erase (buffer, buffer->len - 2, 1); @@ -58,21 +91,43 @@ void jabber_connect_server (net_hook_t* hook, char* server, iks* node) { net_hook_t* server_hook; GString* buffer; - server_hook = jabber_server_hook_new (hook, server); - hook->peer = server_hook->conn; - g_message ("Trying to connect to server %s.", server); - gnet_conn_connect (hook->peer); + g_message ("Received new stream."); + if (hook->peer == NULL) + { + server_hook = jabber_server_hook_new (hook, server); + hook->peer = server_hook; + g_message ("Trying to connect to server %s.", server); + gnet_conn_connect (hook->peer->conn); + gnet_conn_read (hook->peer->conn); + } buffer = jabber_new_start (node); - gnet_conn_write (hook->peer, buffer->str, buffer->len); + gnet_conn_write (hook->peer->conn, buffer->str, buffer->len); g_string_free (buffer, TRUE); - gnet_conn_read (hook->peer); +} + +void +jabber_sasl_plain_filter (iks *node) +{ + if (g_str_equal (iks_name (node), "auth") && + g_str_equal (iks_find_attrib (node, "xmlns"), + "urn:ietf:params:xml:ns:xmpp-sasl")) + { + char *b64; + char *uname; + gsize uname_len; + b64 = iks_cdata (iks_child (node)); + uname = g_base64_decode (b64, &uname_len); + g_message ("User trying authentication as %s", uname); + g_free (uname); + } } void jabber_send (net_hook_t* hook, iks* node) { GString* buffer; + jabber_sasl_plain_filter (node); buffer = g_string_new (iks_string (iks_stack (node), node)); - gnet_conn_write (hook->peer, buffer->str, buffer->len); + gnet_conn_write (hook->peer->conn, buffer->str, buffer->len); g_string_free (buffer, TRUE); } @@ -97,7 +152,7 @@ int jabber_parser (gpointer data, int type, iks* node) iks_delete (node); break; case IKS_NODE_STOP: - gnet_conn_write (hook->peer, "", 16); + gnet_conn_write (hook->peer->conn, "", 16); break; case IKS_NODE_ERROR: break; @@ -116,7 +171,7 @@ net_hook_t* jabber_hook_new (GConn* conn) hook->close = jabber_close; hook->write = jabber_write; hook->read = jabber_read; - hook->data = iks_stream_new ("jabber:client", hook, jabber_parser); + hook->data = jabber_data_new (hook, jabber_parser); gnet_conn_set_callback (hook->conn, nethook_event, hook); return hook; }