X-Git-Url: http://git.cascardo.eti.br/?a=blobdiff_plain;f=jabber_server.c;h=f3cef497288f6c1258f80aa482b4af9db41873a8;hb=3e042db42f91cb2b7f29741e22585fa16e698928;hp=b4fe6c339b177d5fc84e4725c58fff096597fb8f;hpb=fbd666fad867a355dca17e866daf04cc46c0623a;p=cascardo%2Frnetproxy.git diff --git a/jabber_server.c b/jabber_server.c index b4fe6c3..f3cef49 100644 --- a/jabber_server.c +++ b/jabber_server.c @@ -20,6 +20,7 @@ #include #include #include +#include "iksemel_extra.h" #include "jabber.h" static void jabber_server_connect (net_hook_t* hook) @@ -29,18 +30,105 @@ static void jabber_server_connect (net_hook_t* hook) static void jabber_server_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); g_message ("Server disconnected."); } static void jabber_server_write (net_hook_t* hook) { - g_message ("Have written bytes to server."); } static void jabber_server_read (net_hook_t* hook, gchar* buffer, size_t len) { - g_message ("Received response from server."); - gnet_conn_write (hook->peer, buffer, len); + jabber_data_t *jdata = (jabber_data_t*) hook->data; + iks_parse (jdata->parser, buffer, len, FALSE); +} + +void jabber_server_tls_filter (iks* node) +{ + iks* tls; + if (g_str_equal (iks_name (node), "stream:features")) + { + tls = iks_find (node, "starttls"); + if (tls) + iks_hide (tls); + } +} + +void jabber_server_sasl_filter (iks* node) +{ + iks* sasl; + GString* mechs = NULL; + gboolean plain = FALSE; + if (g_str_equal (iks_name (node), "stream:features")) + { + sasl = iks_find (node, "mechanisms"); + if (sasl && g_str_equal (iks_find_attrib (sasl, "xmlns"), + "urn:ietf:params:xml:ns:xmpp-sasl")) + { + mechs = g_string_sized_new (256); + iks* mech; + for (mech = iks_child (sasl); mech != NULL; mech = iks_next (mech)) + { + char* mech_name; + mech_name = iks_cdata (iks_child (mech)); + if (g_str_equal (mech_name, "PLAIN")) + plain = TRUE; + mechs = g_string_append (mechs, mech_name); + mechs = g_string_append_c (mechs, ' '); + } + g_debug ("Mechanisms supported by server: %s", mechs->str); + g_string_free (mechs, TRUE); + if (plain) + { + for (mech = iks_child (sasl); mech != NULL; mech = iks_next (mech)) + { + char* mech_name; + mech_name = iks_cdata (iks_child (mech)); + if (!g_str_equal (mech_name, "PLAIN")) + iks_hide (mech); + } + } + } + } +} + +int jabber_server_parser (gpointer data, int type, iks* node) +{ + net_hook_t* hook; + GString* buffer; + hook = (net_hook_t*) data; + switch (type) + { + case IKS_NODE_START: + buffer = jabber_new_start (node); + gnet_conn_write (hook->peer->conn, buffer->str, buffer->len); + g_string_free (buffer, TRUE); + iks_delete (node); + break; + case IKS_NODE_NORMAL: + jabber_server_tls_filter (node); + jabber_server_sasl_filter (node); + buffer = g_string_new (iks_string (iks_stack (node), node)); + gnet_conn_write (hook->peer->conn, buffer->str, buffer->len); + g_string_free (buffer, TRUE); + iks_delete (node); + break; + case IKS_NODE_STOP: + gnet_conn_write (hook->peer->conn, "", 16); + break; + case IKS_NODE_ERROR: + g_debug ("Parse error!!"); + break; + } + return IKS_OK; } net_hook_t* jabber_server_hook_new (net_hook_t* client_hook, char* server) @@ -48,12 +136,12 @@ net_hook_t* jabber_server_hook_new (net_hook_t* client_hook, char* server) net_hook_t* hook; hook = g_slice_new (net_hook_t); hook->conn = gnet_conn_new (server, 5222, nethook_event, hook); - hook->peer = client_hook->conn; + hook->peer = client_hook; hook->server = TRUE; hook->connect = jabber_server_connect; hook->close = jabber_server_close; hook->write = jabber_server_write; hook->read = jabber_server_read; - hook->data = NULL; /*iks_stream_new ("jabber:client", hook, jabber_server_parser);*/ + hook->data = jabber_data_new (hook, jabber_server_parser); return hook; }