diff options
Diffstat (limited to 'protocols')
| -rw-r--r-- | protocols/jabber/io.c | 5 | ||||
| -rw-r--r-- | protocols/jabber/jabber.c | 4 | ||||
| -rw-r--r-- | protocols/jabber/jabber.h | 4 | ||||
| -rw-r--r-- | protocols/jabber/jabber_util.c | 30 | ||||
| -rw-r--r-- | protocols/jabber/sasl.c | 21 | 
5 files changed, 30 insertions, 34 deletions
| diff --git a/protocols/jabber/io.c b/protocols/jabber/io.c index 6f79b2d1..a8f7d09f 100644 --- a/protocols/jabber/io.c +++ b/protocols/jabber/io.c @@ -505,6 +505,11 @@ static xt_status jabber_pkt_stream_error( struct xt_node *node, gpointer data )  		imcb_error( ic, "Account and resource used from a different location" );  		allow_reconnect = FALSE;  	} +	else if( strcmp( err->code, "not-authorized" ) == 0 ) +	{ +		imcb_error( ic, "Not authorized" ); +		allow_reconnect = FALSE; +	}  	else  	{  		imcb_error( ic, "Stream error: %s%s%s", err->code, err->text ? ": " : "", diff --git a/protocols/jabber/jabber.c b/protocols/jabber/jabber.c index dab4afdf..4b5cb3a1 100644 --- a/protocols/jabber/jabber.c +++ b/protocols/jabber/jabber.c @@ -147,9 +147,7 @@ static void jabber_login( account_t *acc )  		jd->fd = jd->r_inpa = jd->w_inpa = -1; -		if( strstr( jd->server, ".live.com" ) ) -			jd->oauth2_service = &oauth2_service_mslive; -		else if( strstr( jd->server, ".facebook.com" ) ) +		if( strstr( jd->server, ".facebook.com" ) )  			jd->oauth2_service = &oauth2_service_facebook;  		else  			jd->oauth2_service = &oauth2_service_google; diff --git a/protocols/jabber/jabber.h b/protocols/jabber/jabber.h index 21769a3b..eb99f9ca 100644 --- a/protocols/jabber/jabber.h +++ b/protocols/jabber/jabber.h @@ -228,7 +228,8 @@ struct jabber_transfer  #define XMLNS_PING         "urn:xmpp:ping"                                       /* XEP-0199 */  #define XMLNS_RECEIPTS     "urn:xmpp:receipts"                                   /* XEP-0184 */  #define XMLNS_VCARD        "vcard-temp"                                          /* XEP-0054 */ -#define XMLNS_DELAY        "jabber:x:delay"                                      /* XEP-0091 */ +#define XMLNS_DELAY_OLD    "jabber:x:delay"                                      /* XEP-0091 */ +#define XMLNS_DELAY        "urn:xmpp:delay"                                      /* XEP-0203 */  #define XMLNS_XDATA        "jabber:x:data"                                       /* XEP-0004 */  #define XMLNS_CHATSTATES   "http://jabber.org/protocol/chatstates"               /* XEP-0085 */  #define XMLNS_DISCO_INFO   "http://jabber.org/protocol/disco#info"               /* XEP-0030 */ @@ -337,7 +338,6 @@ int sasl_oauth2_refresh( struct im_connection *ic, const char *refresh_token );  extern const struct oauth2_service oauth2_service_google;  extern const struct oauth2_service oauth2_service_facebook; -extern const struct oauth2_service oauth2_service_mslive;  /* conference.c */  struct groupchat *jabber_chat_join( struct im_connection *ic, const char *room, const char *nick, const char *password ); diff --git a/protocols/jabber/jabber_util.c b/protocols/jabber/jabber_util.c index 0fcc8338..fb68c33d 100644 --- a/protocols/jabber/jabber_util.c +++ b/protocols/jabber/jabber_util.c @@ -725,19 +725,29 @@ time_t jabber_get_timestamp( struct xt_node *xt )  	struct xt_node *c;  	char *s = NULL;  	struct tm tp; -	 -	for( c = xt->children; ( c = xt_find_node( c, "x" ) ); c = c->next ) -	{ -		if( ( s = xt_find_attr( c, "xmlns" ) ) && strcmp( s, XMLNS_DELAY ) == 0 ) -			break; +	gboolean is_old = TRUE; +	const char *format; + +	/* XEP-0091 has <x> */ +	c = xt_find_node_by_attr( xt->children, "x", "xmlns", XMLNS_DELAY_OLD ); + +	if( !c || !( s = xt_find_attr( c, "stamp" ) ) ) { +		is_old = FALSE; + +		/* XEP-0203 has <delay> */ +		c = xt_find_node_by_attr( xt->children, "delay", "xmlns", XMLNS_DELAY ); +		if( !c || !( s = xt_find_attr( c, "stamp" ) ) ) { +			return 0; +		}  	} -	if( !c || !( s = xt_find_attr( c, "stamp" ) ) ) -		return 0; -	  	memset( &tp, 0, sizeof( tp ) ); -	if( sscanf( s, "%4d%2d%2dT%2d:%2d:%2d", &tp.tm_year, &tp.tm_mon, &tp.tm_mday, -	                                        &tp.tm_hour, &tp.tm_min, &tp.tm_sec ) != 6 ) + +	/* The other main difference between XEPs is the timestamp format */ +	format = (is_old) ? "%4d%2d%2dT%2d:%2d:%2d" : "%4d-%2d-%2dT%2d:%2d:%2dZ"; + +	if( sscanf( s, format, &tp.tm_year, &tp.tm_mon, &tp.tm_mday, +	                       &tp.tm_hour, &tp.tm_min, &tp.tm_sec ) != 6 )  		return 0;  	tp.tm_year -= 1900; diff --git a/protocols/jabber/sasl.c b/protocols/jabber/sasl.c index 12111fc7..a4d1f6c1 100644 --- a/protocols/jabber/sasl.c +++ b/protocols/jabber/sasl.c @@ -46,15 +46,6 @@ const struct oauth2_service oauth2_service_facebook =  	"126828914005625",  	"4b100f0f244d620bf3f15f8b217d4c32",  }; -const struct oauth2_service oauth2_service_mslive = -{ -	"https://oauth.live.com/authorize", -	"https://oauth.live.com/token", -	"http://www.bitlbee.org/main.php/Messenger/oauth2.html", -	"wl.offline_access%20wl.messenger", -	"000000004C06FCD1", -	"IRKlBPzJJAWcY-TbZjiTEJu9tn7XCFaV", -};  xt_status sasl_pkt_mechanisms( struct xt_node *node, gpointer data )  { @@ -62,7 +53,7 @@ xt_status sasl_pkt_mechanisms( struct xt_node *node, gpointer data )  	struct jabber_data *jd = ic->proto_data;  	struct xt_node *c, *reply;  	char *s; -	int sup_plain = 0, sup_digest = 0, sup_gtalk = 0, sup_fb = 0, sup_ms = 0; +	int sup_plain = 0, sup_digest = 0, sup_gtalk = 0, sup_fb = 0;  	int want_oauth = FALSE;  	GString *mechs; @@ -97,8 +88,6 @@ xt_status sasl_pkt_mechanisms( struct xt_node *node, gpointer data )  			sup_gtalk = 1;  		else if( c->text && g_strcasecmp( c->text, "X-FACEBOOK-PLATFORM" ) == 0 )  			sup_fb = 1; -		else if( c->text && g_strcasecmp( c->text, "X-MESSENGER-OAUTH2" ) == 0 ) -			sup_ms = 1;  		if( c->text )  			g_string_append_printf( mechs, " %s", c->text ); @@ -108,7 +97,7 @@ xt_status sasl_pkt_mechanisms( struct xt_node *node, gpointer data )  	if( !want_oauth && !sup_plain && !sup_digest )  	{ -		if( !sup_gtalk && !sup_fb && !sup_ms ) +		if( !sup_gtalk && !sup_fb )  			imcb_error( ic, "This server requires OAuth "  			                "(supported schemes:%s)", mechs->str );  		else @@ -141,12 +130,6 @@ xt_status sasl_pkt_mechanisms( struct xt_node *node, gpointer data )  		reply->text_len = strlen( reply->text );  		g_free( s );  	} -	else if( sup_ms && want_oauth ) -	{ -		xt_add_attr( reply, "mechanism", "X-MESSENGER-OAUTH2" ); -		reply->text = g_strdup( jd->oauth2_access_token ); -		reply->text_len = strlen( jd->oauth2_access_token ); -	}  	else if( sup_fb && want_oauth )  	{  		xt_add_attr( reply, "mechanism", "X-FACEBOOK-PLATFORM" ); | 
