aboutsummaryrefslogtreecommitdiffstats
path: root/protocols/jabber/iq.c
diff options
context:
space:
mode:
authorWilmer van der Gaast <wilmer@gaast.net>2006-09-22 20:39:31 +0200
committerWilmer van der Gaast <wilmer@gaast.net>2006-09-22 20:39:31 +0200
commitfe7a55434385fd858453dffdbb425a21f41e3859 (patch)
tree31f7d29dd436d59d80d06674c12b98b934ddb467 /protocols/jabber/iq.c
parent8d7429102adf8dce6844f2f3da2723d1f87c6442 (diff)
Better detection of successful IQ authentication (using packet caching),
properly working SASL authentication (although only PLAIN so far).
Diffstat (limited to 'protocols/jabber/iq.c')
-rw-r--r--protocols/jabber/iq.c34
1 files changed, 28 insertions, 6 deletions
diff --git a/protocols/jabber/iq.c b/protocols/jabber/iq.c
index bcce5289..fbb4a38b 100644
--- a/protocols/jabber/iq.c
+++ b/protocols/jabber/iq.c
@@ -27,7 +27,7 @@ xt_status jabber_pkt_iq( struct xt_node *node, gpointer data )
{
struct gaim_connection *gc = data;
struct jabber_data *jd = gc->proto_data;
- struct xt_node *query, *reply = NULL;
+ struct xt_node *query, *reply = NULL, *orig = NULL;
char *s, *type, *xmlns;
int st;
@@ -39,6 +39,9 @@ xt_status jabber_pkt_iq( struct xt_node *node, gpointer data )
xmlns = xt_find_attr( query, "xmlns" );
+ if( ( s = xt_find_attr( node, "id" ) ) )
+ orig = jabber_packet_from_cache( gc, s );
+
if( strcmp( type, "result" ) == 0 && xmlns && strcmp( xmlns, "jabber:iq:auth" ) == 0 )
{
/* Time to authenticate ourselves! */
@@ -81,8 +84,8 @@ xt_status jabber_pkt_iq( struct xt_node *node, gpointer data )
}
reply = jabber_make_packet( "iq", "set", NULL, reply );
+ jabber_cache_packet( gc, reply );
st = jabber_write_packet( gc, reply );
- xt_free_node( reply );
return st ? XT_HANDLED : XT_ABORT;
}
@@ -105,16 +108,35 @@ xt_status jabber_pkt_iq( struct xt_node *node, gpointer data )
presence_announce( gc );
}
- else if( strcmp( type, "result" ) == 0 )
+ else if( strcmp( type, "result" ) == 0 && orig )
{
- /* If we weren't authenticated yet, let's assume we are now.
- There are cleaner ways to do this, probably, but well.. */
- if( !( jd->flags & JFLAG_AUTHENTICATED ) )
+ struct xt_node *node;
+
+ if( !( jd->flags & JFLAG_AUTHENTICATED ) &&
+ ( node = xt_find_node( orig->children, "query" ) ) &&
+ ( node = xt_find_node( node->children, "username" ) ) &&
+ node->text_len )
{
+ /* This happens when we just successfully authenticated
+ the old (non-SASL) way. */
jd->flags |= JFLAG_AUTHENTICATED;
if( !jabber_get_roster( gc ) )
return XT_ABORT;
}
+ else if( ( node = xt_find_node( orig->children, "bind" ) ) ||
+ ( node = xt_find_node( orig->children, "session" ) ) )
+ {
+ if( strcmp( node->name, "bind" ) == 0 )
+ jd->flags &= ~JFLAG_WAIT_BIND;
+ else if( strcmp( node->name, "session" ) == 0 )
+ jd->flags &= ~JFLAG_WAIT_SESSION;
+
+ if( ( jd->flags & ( JFLAG_WAIT_BIND | JFLAG_WAIT_SESSION ) ) == 0 )
+ {
+ if( !jabber_get_roster( gc ) )
+ return XT_ABORT;
+ }
+ }
}
else if( strcmp( type, "error" ) == 0 )
{