diff options
| author | Wilmer van der Gaast <wilmer@gaast.net> | 2010-05-13 23:05:13 +0100 | 
|---|---|---|
| committer | Wilmer van der Gaast <wilmer@gaast.net> | 2010-05-13 23:05:13 +0100 | 
| commit | 3429b589177f286384dab151c167e16071f8a828 (patch) | |
| tree | 756963dee5779aa0e54109701669bd69b97d0bb8 | |
| parent | 58f5ef70c3824b881ad6b35f854a8c8ac59a5d32 (diff) | |
| parent | 3742fb6ae99c2e5e25cff272a154b9834866e8f9 (diff) | |
Mainline merge.
| -rw-r--r-- | lib/xmltree.c | 22 | ||||
| -rw-r--r-- | protocols/jabber/conference.c | 4 | ||||
| -rw-r--r-- | protocols/msn/sb.c | 49 | ||||
| -rw-r--r-- | protocols/oscar/oscar.c | 136 | 
4 files changed, 46 insertions, 165 deletions
| diff --git a/lib/xmltree.c b/lib/xmltree.c index 67fe46e1..31f8ee9c 100644 --- a/lib/xmltree.c +++ b/lib/xmltree.c @@ -448,7 +448,11 @@ struct xt_node *xt_find_node( struct xt_node *node, const char *name )  {  	while( node )  	{ -		if( g_strcasecmp( node->name, name ) == 0 ) +		char *colon; +		 +		if( g_strcasecmp( node->name, name ) == 0 || +		    ( ( colon = strchr( node->name, ':' ) ) && +		      g_strcasecmp( colon + 1, name ) == 0 ) )  			break;  		node = node->next; @@ -460,6 +464,7 @@ struct xt_node *xt_find_node( struct xt_node *node, const char *name )  char *xt_find_attr( struct xt_node *node, const char *key )  {  	int i; +	char *colon;  	if( !node )  		return NULL; @@ -468,6 +473,21 @@ char *xt_find_attr( struct xt_node *node, const char *key )  		if( g_strcasecmp( node->attr[i].key, key ) == 0 )  			break; +	/* This is an awful hack that only takes care of namespace prefixes +	   inside a tag. Since IMHO excessive namespace usage in XMPP is +	   massive overkill anyway (this code exists for almost four years +	   now and never really missed it): Meh. */ +	if( !node->attr[i].key && strcmp( key, "xmlns" ) == 0 && +	    ( colon = strchr( node->name, ':' ) ) ) +	{ +		*colon = '\0'; +		for( i = 0; node->attr[i].key; i ++ ) +			if( strncmp( node->attr[i].key, "xmlns:", 6 ) == 0 && +			    strcmp( node->attr[i].key + 6, node->name ) == 0 ) +				break; +		*colon = ':'; +	} +	  	return node->attr[i].value;  } diff --git a/protocols/jabber/conference.c b/protocols/jabber/conference.c index bb3fbcf3..e04b9792 100644 --- a/protocols/jabber/conference.c +++ b/protocols/jabber/conference.c @@ -273,8 +273,10 @@ void jabber_chat_pkt_presence( struct im_connection *ic, struct jabber_buddy *bu  			bud->flags |= JBFLAG_IS_ANONYMOUS;  		} -		if( bud != jc->me ) +		if( bud != jc->me && bud->flags & JBFLAG_IS_ANONYMOUS )  		{ +			/* If JIDs are anonymized, add them to the local +			   list for the duration of this chat. */  			imcb_add_buddy( ic, bud->ext_jid, NULL );  			imcb_buddy_nick_hint( ic, bud->ext_jid, bud->resource );  		} diff --git a/protocols/msn/sb.c b/protocols/msn/sb.c index bfdbfe64..093c1086 100644 --- a/protocols/msn/sb.c +++ b/protocols/msn/sb.c @@ -339,9 +339,13 @@ static gboolean msn_sb_callback( gpointer data, gint source, b_input_condition c  	struct im_connection *ic = sb->ic;  	struct msn_data *md = ic->proto_data; -	if( msn_handler( sb->handler ) == -1 ) +	if( msn_handler( sb->handler ) != -1 ) +		return TRUE; +	 +	if( sb->msgq != NULL )  	{  		time_t now = time( NULL ); +		char buf[1024];  		if( now - md->first_sb_failure > 600 )  		{ @@ -358,37 +362,28 @@ static gboolean msn_sb_callback( gpointer data, gint source, b_input_condition c  			imcb_log( ic, "Warning: Many switchboard failures on MSN connection. "  			              "There might be problems delivering your messages." ); -		if( sb->msgq != NULL ) +		if( md->msgq == NULL )  		{ -			char buf[1024]; -			 -			if( md->msgq == NULL ) -			{ -				md->msgq = sb->msgq; -			} -			else -			{ -				GSList *l; -				 -				for( l = md->msgq; l->next; l = l->next ); -				l->next = sb->msgq; -			} -			sb->msgq = NULL; +			md->msgq = sb->msgq; +		} +		else +		{ +			GSList *l; -			debug( "Moved queued messages back to the main queue, creating a new switchboard to retry." ); -			g_snprintf( buf, sizeof( buf ), "XFR %d SB\r\n", ++md->trId ); -			if( !msn_write( ic, buf, strlen( buf ) ) ) -				return FALSE; +			for( l = md->msgq; l->next; l = l->next ); +			l->next = sb->msgq;  		} +		sb->msgq = NULL; -		msn_sb_destroy( sb ); -		 -		return FALSE; -	} -	else -	{ -		return TRUE; +		debug( "Moved queued messages back to the main queue, " +		       "creating a new switchboard to retry." ); +		g_snprintf( buf, sizeof( buf ), "XFR %d SB\r\n", ++md->trId ); +		if( !msn_write( ic, buf, strlen( buf ) ) ) +			return FALSE;  	} +	 +	msn_sb_destroy( sb ); +	return FALSE;  }  static int msn_sb_command( gpointer data, char **cmd, int num_parts ) diff --git a/protocols/oscar/oscar.c b/protocols/oscar/oscar.c index fa710ece..f4c77a9f 100644 --- a/protocols/oscar/oscar.c +++ b/protocols/oscar/oscar.c @@ -204,7 +204,6 @@ static int gaim_parse_buddyrights(aim_session_t *, aim_frame_t *, ...);  static int gaim_parse_locerr     (aim_session_t *, aim_frame_t *, ...);  static int gaim_icbm_param_info  (aim_session_t *, aim_frame_t *, ...);  static int gaim_parse_genericerr (aim_session_t *, aim_frame_t *, ...); -static int gaim_memrequest       (aim_session_t *, aim_frame_t *, ...);  static int gaim_selfinfo         (aim_session_t *, aim_frame_t *, ...);  static int gaim_offlinemsg       (aim_session_t *, aim_frame_t *, ...);  static int gaim_offlinemsgdone   (aim_session_t *, aim_frame_t *, ...); @@ -567,7 +566,6 @@ static int gaim_parse_auth_resp(aim_session_t *sess, aim_frame_t *fr, ...) {  	aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_GEN, AIM_CB_GEN_ERROR, gaim_parse_genericerr, 0);  	aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_BUD, AIM_CB_BUD_ERROR, gaim_parse_genericerr, 0);  	aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_BOS, AIM_CB_BOS_ERROR, gaim_parse_genericerr, 0); -	aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_GEN, 0x1f, gaim_memrequest, 0);  	aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_GEN, AIM_CB_GEN_SELFINFO, gaim_selfinfo, 0);  	aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_ICQ, AIM_CB_ICQ_OFFLINEMSG, gaim_offlinemsg, 0);  	aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_ICQ, AIM_CB_ICQ_OFFLINEMSGCOMPLETE, gaim_offlinemsgdone, 0); @@ -601,143 +599,9 @@ static int gaim_parse_auth_resp(aim_session_t *sess, aim_frame_t *fr, ...) {  	return 1;  } -struct pieceofcrap { -	struct im_connection *ic; -	unsigned long offset; -	unsigned long len; -	char *modname; -	int fd; -	aim_conn_t *conn; -	unsigned int inpa; -}; - -static gboolean damn_you(gpointer data, gint source, b_input_condition c) -{ -	struct pieceofcrap *pos = data; -	struct oscar_data *od = pos->ic->proto_data; -	char in = '\0'; -	int x = 0; -	unsigned char m[17]; - -	while (read(pos->fd, &in, 1) == 1) { -		if (in == '\n') -			x++; -		else if (in != '\r') -			x = 0; -		if (x == 2) -			break; -		in = '\0'; -	} -	if (in != '\n') { -		imcb_error(pos->ic, "Gaim was unable to get a valid hash for logging into AIM." -				" You may be disconnected shortly."); -		b_event_remove(pos->inpa); -		closesocket(pos->fd); -		g_free(pos); -		return FALSE; -	} -	/* [WvG] Wheeeee! Who needs error checking anyway? ;-) */ -	read(pos->fd, m, 16); -	m[16] = '\0'; -	b_event_remove(pos->inpa); -	closesocket(pos->fd); -	aim_sendmemblock(od->sess, pos->conn, 0, 16, m, AIM_SENDMEMBLOCK_FLAG_ISHASH); -	g_free(pos); -	 -	return FALSE; -} - -static gboolean straight_to_hell(gpointer data, gint source, b_input_condition cond) { -	struct pieceofcrap *pos = data; -	char buf[BUF_LONG]; - -	if (source < 0) { -		imcb_error(pos->ic, "Gaim was unable to get a valid hash for logging into AIM." -				" You may be disconnected shortly."); -		if (pos->modname) -			g_free(pos->modname); -		g_free(pos); -		return FALSE; -	} - -	g_snprintf(buf, sizeof(buf), "GET " AIMHASHDATA -			"?offset=%ld&len=%ld&modname=%s HTTP/1.0\n\n", -			pos->offset, pos->len, pos->modname ? pos->modname : ""); -	write(pos->fd, buf, strlen(buf)); -	if (pos->modname) -		g_free(pos->modname); -	pos->inpa = b_input_add(pos->fd, GAIM_INPUT_READ, damn_you, pos); -	return FALSE; -} -  /* size of icbmui.ocm, the largest module in AIM 3.5 */  #define AIM_MAX_FILE_SIZE 98304 -int gaim_memrequest(aim_session_t *sess, aim_frame_t *fr, ...) { -	va_list ap; -	struct pieceofcrap *pos; -	guint32 offset, len; -	char *modname; -	int fd; - -	va_start(ap, fr); -	offset = (guint32)va_arg(ap, unsigned long); -	len = (guint32)va_arg(ap, unsigned long); -	modname = va_arg(ap, char *); -	va_end(ap); - -	if (len == 0) { -		aim_sendmemblock(sess, fr->conn, offset, len, NULL, -				AIM_SENDMEMBLOCK_FLAG_ISREQUEST); -		return 1; -	} -	/* uncomment this when you're convinced it's right. remember, it's been wrong before. -	if (offset > AIM_MAX_FILE_SIZE || len > AIM_MAX_FILE_SIZE) { -		char *buf; -		int i = 8; -		if (modname) -			i += strlen(modname); -		buf = g_malloc(i); -		i = 0; -		if (modname) { -			memcpy(buf, modname, strlen(modname)); -			i += strlen(modname); -		} -		buf[i++] = offset & 0xff; -		buf[i++] = (offset >> 8) & 0xff; -		buf[i++] = (offset >> 16) & 0xff; -		buf[i++] = (offset >> 24) & 0xff; -		buf[i++] = len & 0xff; -		buf[i++] = (len >> 8) & 0xff; -		buf[i++] = (len >> 16) & 0xff; -		buf[i++] = (len >> 24) & 0xff; -		aim_sendmemblock(sess, command->conn, offset, i, buf, AIM_SENDMEMBLOCK_FLAG_ISREQUEST); -		g_free(buf); -		return 1; -	} -	*/ - -	pos = g_new0(struct pieceofcrap, 1); -	pos->ic = sess->aux_data; -	pos->conn = fr->conn; - -	pos->offset = offset; -	pos->len = len; -	pos->modname = modname ? g_strdup(modname) : NULL; - -	fd = proxy_connect("gaim.sourceforge.net", 80, straight_to_hell, pos); -	if (fd < 0) { -		if (pos->modname) -			g_free(pos->modname); -		g_free(pos); -		imcb_error(sess->aux_data, "Gaim was unable to get a valid hash for logging into AIM." -				" You may be disconnected shortly."); -	} -	pos->fd = fd; - -	return 1; -} -  static int gaim_parse_login(aim_session_t *sess, aim_frame_t *fr, ...) {  #if 0  	struct client_info_s info = {"gaim", 4, 1, 2010, "us", "en", 0x0004, 0x0000, 0x04b}; | 
