diff options
| author | Wilmer van der Gaast <wilmer@gaast.net> | 2011-12-24 19:02:39 +0100 | 
|---|---|---|
| committer | Wilmer van der Gaast <wilmer@gaast.net> | 2011-12-24 19:02:39 +0100 | 
| commit | 164352ef9d3e8b4b2eea8ec64c3b4590b2388b18 (patch) | |
| tree | 58d3424f7743d89ad4f94fc803ddd7e0563ec251 /protocols/jabber | |
| parent | e306fbf84aa37ab934c5ea18ccfd75da041af052 (diff) | |
| parent | 96f954df218e81f5580257c319b91217dac2f4bf (diff) | |
Merging mainline.
Diffstat (limited to 'protocols/jabber')
| -rw-r--r-- | protocols/jabber/io.c | 32 | ||||
| -rw-r--r-- | protocols/jabber/jabber.c | 7 | ||||
| -rw-r--r-- | protocols/jabber/jabber.h | 2 | 
3 files changed, 33 insertions, 8 deletions
| diff --git a/protocols/jabber/io.c b/protocols/jabber/io.c index a28eea90..5b9149af 100644 --- a/protocols/jabber/io.c +++ b/protocols/jabber/io.c @@ -275,7 +275,7 @@ gboolean jabber_connected_plain( gpointer data, gint source, b_input_condition c  	return jabber_start_stream( ic );  } -gboolean jabber_connected_ssl( gpointer data, void *source, b_input_condition cond ) +gboolean jabber_connected_ssl( gpointer data, int returncode, void *source, b_input_condition cond )  {  	struct im_connection *ic = data;  	struct jabber_data *jd; @@ -291,8 +291,20 @@ gboolean jabber_connected_ssl( gpointer data, void *source, b_input_condition co  		   already, set it to NULL here to prevent a double cleanup: */  		jd->ssl = NULL; -		imcb_error( ic, "Could not connect to server" ); -		imc_logout( ic, TRUE ); +		if( returncode != 0 ) +		{ +			char *err = ssl_verify_strerror( returncode ); +			imcb_error( ic, "Certificate verification problem 0x%x: %s", +			            returncode, err ? err : "Unknown" ); +			g_free( err ); +			imc_logout( ic, FALSE ); +		} +		else +		{ +			imcb_error( ic, "Could not connect to server" ); +			imc_logout( ic, TRUE ); +		} +		  		return FALSE;  	} @@ -396,7 +408,7 @@ static xt_status jabber_pkt_proceed_tls( struct xt_node *node, gpointer data )  {  	struct im_connection *ic = data;  	struct jabber_data *jd = ic->proto_data; -	char *xmlns; +	char *xmlns, *tlsname;  	xmlns = xt_find_attr( node, "xmlns" ); @@ -422,7 +434,17 @@ static xt_status jabber_pkt_proceed_tls( struct xt_node *node, gpointer data )  	imcb_log( ic, "Converting stream to TLS" );  	jd->flags |= JFLAG_STARTTLS_DONE; -	jd->ssl = ssl_starttls( jd->fd, jabber_connected_ssl, ic ); + +	/* If the user specified a server for the account, use this server as the  +	 * hostname in the certificate verification. Else we use the domain from  +	 * the username. */ +	if( ic->acc->server && *ic->acc->server ) +		tlsname = ic->acc->server; +	else +		tlsname = jd->server; +	 +	jd->ssl = ssl_starttls( jd->fd, tlsname, set_getbool( &ic->acc->set, "tls_verify" ), +	                        jabber_connected_ssl, ic );  	return XT_HANDLED;  } diff --git a/protocols/jabber/jabber.c b/protocols/jabber/jabber.c index 71287842..92256a71 100644 --- a/protocols/jabber/jabber.c +++ b/protocols/jabber/jabber.c @@ -86,7 +86,10 @@ static void jabber_init( account_t *acc )  	s = set_add( &acc->set, "tls", "try", set_eval_tls, acc );  	s->flags |= ACC_SET_OFFLINE_ONLY; - +	 +	s = set_add( &acc->set, "tls_verify", "true", set_eval_bool, acc ); +	s->flags |= ACC_SET_OFFLINE_ONLY; +	  	s = set_add( &acc->set, "user_agent", "BitlBee", NULL, acc );  	s = set_add( &acc->set, "xmlconsole", "false", set_eval_bool, acc ); @@ -227,7 +230,7 @@ void jabber_connect( struct im_connection *ic )  	   non-standard ports... */  	if( set_getbool( &acc->set, "ssl" ) )  	{ -		jd->ssl = ssl_connect( connect_to, set_getint( &acc->set, "port" ), jabber_connected_ssl, ic ); +		jd->ssl = ssl_connect( connect_to, set_getint( &acc->set, "port" ), FALSE, jabber_connected_ssl, ic );  		jd->fd = jd->ssl ? ssl_getfd( jd->ssl ) : -1;  	}  	else diff --git a/protocols/jabber/jabber.h b/protocols/jabber/jabber.h index 49cfe8ee..76546bde 100644 --- a/protocols/jabber/jabber.h +++ b/protocols/jabber/jabber.h @@ -316,7 +316,7 @@ extern const struct jabber_away_state jabber_away_state_list[];  int jabber_write_packet( struct im_connection *ic, struct xt_node *node );  int jabber_write( struct im_connection *ic, char *buf, int len );  gboolean jabber_connected_plain( gpointer data, gint source, b_input_condition cond ); -gboolean jabber_connected_ssl( gpointer data, void *source, b_input_condition cond ); +gboolean jabber_connected_ssl( gpointer data, int returncode, void *source, b_input_condition cond );  gboolean jabber_start_stream( struct im_connection *ic );  void jabber_end_stream( struct im_connection *ic ); | 
