X-Git-Url: http://git.cascardo.eti.br/?a=blobdiff_plain;f=jabber_server.c;h=f3cef497288f6c1258f80aa482b4af9db41873a8;hb=dff33f5dcf96800863b162a320bcf5dc0bb15b92;hp=728aab48a3bff9b18023afb3360b26ead5d5484a;hpb=c29ddaa255224a932c438b37899a9203fa41b5f7;p=cascardo%2Frnetproxy.git diff --git a/jabber_server.c b/jabber_server.c index 728aab4..f3cef49 100644 --- a/jabber_server.c +++ b/jabber_server.c @@ -36,7 +36,7 @@ static void jabber_server_close (net_hook_t* hook) gnet_conn_disconnect (hook->peer->conn); } gnet_conn_delete (hook->conn); - iks_parser_delete (hook->data); + jabber_data_destroy (hook->data); g_slice_free (net_hook_t, hook); g_message ("Server disconnected."); } @@ -47,7 +47,8 @@ static void jabber_server_write (net_hook_t* hook) static void jabber_server_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_server_tls_filter (iks* node) @@ -61,6 +62,44 @@ void jabber_server_tls_filter (iks* node) } } +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; @@ -76,6 +115,7 @@ int jabber_server_parser (gpointer data, int type, iks* 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); @@ -102,6 +142,6 @@ net_hook_t* jabber_server_hook_new (net_hook_t* client_hook, char* server) hook->close = jabber_server_close; hook->write = jabber_server_write; hook->read = jabber_server_read; - hook->data = iks_extra_stream_new (hook, jabber_server_parser); + hook->data = jabber_data_new (hook, jabber_server_parser); return hook; }