aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--protocols/jabber/iq.c34
-rw-r--r--protocols/jabber/jabber.h9
-rw-r--r--protocols/jabber/jabber_util.c19
3 files changed, 49 insertions, 13 deletions
diff --git a/protocols/jabber/iq.c b/protocols/jabber/iq.c
index 8864e3fd..446a25bb 100644
--- a/protocols/jabber/iq.c
+++ b/protocols/jabber/iq.c
@@ -44,11 +44,12 @@ xt_status jabber_pkt_iq( struct xt_node *node, gpointer data )
{
struct jabber_cache_entry *entry;
- if( ( s = xt_find_attr( node, "id" ) ) == NULL )
+ if( ( s = xt_find_attr( node, "id" ) ) == NULL ||
+ strncmp( s, JABBER_CACHED_ID, strlen( JABBER_CACHED_ID ) ) != 0 )
{
- /* Silently ignore it, without an ID we don't know
- how to handle the packet, but it doesn't have
- to be a serious problem. */
+ /* Silently ignore it, without an ID (or an non-cache
+ ID) we don't know how to handle the packet and we
+ probably don't have to. */
return XT_HANDLED;
}
@@ -64,7 +65,7 @@ xt_status jabber_pkt_iq( struct xt_node *node, gpointer data )
if( !( c = xt_find_node( node->children, "query" ) ) ||
!( s = xt_find_attr( c, "xmlns" ) ) )
{
- serv_got_crap( gc, "WARNING: Received incomplete IQ-get packet" );
+ serv_got_crap( gc, "WARNING: Received incomplete IQ-%s packet", type );
return XT_HANDLED;
}
@@ -124,9 +125,26 @@ xt_status jabber_pkt_iq( struct xt_node *node, gpointer data )
}
else if( strcmp( type, "set" ) == 0 )
{
- xt_free_node( reply );
- reply = jabber_make_error_packet( node, "feature-not-implemented", "cancel" );
- pack = 0;
+ if( !( c = xt_find_node( node->children, "query" ) ) ||
+ !( s = xt_find_attr( c, "xmlns" ) ) )
+ {
+ serv_got_crap( gc, "WARNING: Received incomplete IQ-%s packet", type );
+ return XT_HANDLED;
+ }
+
+ if( strcmp( s, "jabber:iq:roster" ) == 0 )
+ {
+ /* This is a roster push packet, probably. Here we
+ should check if the packet is legitimate by
+ checking if it really comes from the user's JID
+ and, if so, process it. */
+ }
+ else
+ {
+ xt_free_node( reply );
+ reply = jabber_make_error_packet( node, "feature-not-implemented", "cancel" );
+ pack = 0;
+ }
}
/* If we recognized the xmlns and managed to generate a reply,
diff --git a/protocols/jabber/jabber.h b/protocols/jabber/jabber.h
index cd65d374..4bccd5ed 100644
--- a/protocols/jabber/jabber.h
+++ b/protocols/jabber/jabber.h
@@ -101,11 +101,18 @@ struct jabber_buddy
char *away_message;
time_t last_act;
- int flags;
+ jabber_buddy_flag_t flags;
struct jabber_buddy *next;
};
+/* Prefixes to use for packet IDs (mainly for IQ packets ATM). Usually the
+ first one should be used, but when storing a packet in the cache, a
+ "special" kind of ID is assigned to make it easier later to figure out
+ if we have to do call an event handler for the response packet. */
+#define JABBER_PACKET_ID "BeeP"
+#define JABBER_CACHED_ID "BeeC"
+
/* iq.c */
xt_status jabber_pkt_iq( struct xt_node *node, gpointer data );
int jabber_init_iq_auth( struct gaim_connection *gc );
diff --git a/protocols/jabber/jabber_util.c b/protocols/jabber/jabber_util.c
index d5d038cf..3f189300 100644
--- a/protocols/jabber/jabber_util.c
+++ b/protocols/jabber/jabber_util.c
@@ -23,7 +23,7 @@
#include "jabber.h"
-static int next_id = 1;
+static unsigned int next_id = 1;
char *set_eval_priority( set_t *set, char *value )
{
@@ -82,6 +82,17 @@ struct xt_node *jabber_make_packet( char *name, char *type, char *to, struct xt_
if( to )
xt_add_attr( node, "to", to );
+ /* IQ packets should always have an ID, so let's generate one. It
+ might get overwritten by jabber_cache_add() if this packet has
+ to be saved until we receive a response. Cached packets get
+ slightly different IDs so we can recognize them. */
+ if( strcmp( name, "iq" ) == 0 )
+ {
+ char *id = g_strdup_printf( "%s%05x", JABBER_PACKET_ID, ( next_id++ ) & 0xfffff );
+ xt_add_attr( node, "id", id );
+ g_free( id );
+ }
+
return node;
}
@@ -115,13 +126,13 @@ struct xt_node *jabber_make_error_packet( struct xt_node *orig, char *err_cond,
return node;
}
-/* Cache a node/epacket for later use. Mainly useful for IQ packets if you need
+/* Cache a node/packet for later use. Mainly useful for IQ packets if you need
them when you receive the response. Use this BEFORE sending the packet so
- it'll get an id= tag, and do NOT free() the packet after writing it! */
+ it'll get a new id= tag, and do NOT free() the packet after writing it! */
void jabber_cache_add( struct gaim_connection *gc, struct xt_node *node, jabber_cache_event func )
{
struct jabber_data *jd = gc->proto_data;
- char *id = g_strdup_printf( "BeeX%04x", next_id++ );
+ char *id = g_strdup_printf( "%s%05x", JABBER_CACHED_ID, ( next_id++ ) & 0xfffff );
struct jabber_cache_entry *entry = g_new0( struct jabber_cache_entry, 1 );
xt_add_attr( node, "id", id );