aboutsummaryrefslogtreecommitdiffstats
path: root/protocols
diff options
context:
space:
mode:
authorWilmer van der Gaast <wilmer@gaast.net>2011-12-24 19:02:39 +0100
committerWilmer van der Gaast <wilmer@gaast.net>2011-12-24 19:02:39 +0100
commit164352ef9d3e8b4b2eea8ec64c3b4590b2388b18 (patch)
tree58d3424f7743d89ad4f94fc803ddd7e0563ec251 /protocols
parente306fbf84aa37ab934c5ea18ccfd75da041af052 (diff)
parent96f954df218e81f5580257c319b91217dac2f4bf (diff)
Merging mainline.
Diffstat (limited to 'protocols')
-rw-r--r--protocols/bee.h2
-rw-r--r--protocols/jabber/io.c32
-rw-r--r--protocols/jabber/jabber.c7
-rw-r--r--protocols/jabber/jabber.h2
-rw-r--r--protocols/msn/soap.c10
-rw-r--r--protocols/skype/skype.c4
6 files changed, 44 insertions, 13 deletions
diff --git a/protocols/bee.h b/protocols/bee.h
index 49ea6fb5..24f5824e 100644
--- a/protocols/bee.h
+++ b/protocols/bee.h
@@ -122,7 +122,7 @@ typedef struct bee_ui_funcs
gboolean (*chat_msg)( bee_t *bee, struct groupchat *c, bee_user_t *bu, const char *msg, time_t sent_at );
gboolean (*chat_add_user)( bee_t *bee, struct groupchat *c, bee_user_t *bu );
gboolean (*chat_remove_user)( bee_t *bee, struct groupchat *c, bee_user_t *bu );
- gboolean (*chat_topic)( bee_t *bee, struct groupchat *c, const char *new, bee_user_t *bu );
+ gboolean (*chat_topic)( bee_t *bee, struct groupchat *c, const char *new_topic, bee_user_t *bu );
gboolean (*chat_name_hint)( bee_t *bee, struct groupchat *c, const char *name );
gboolean (*chat_invite)( bee_t *bee, bee_user_t *bu, const char *name, const char *msg );
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 );
diff --git a/protocols/msn/soap.c b/protocols/msn/soap.c
index 7d9f3791..d9804f49 100644
--- a/protocols/msn/soap.c
+++ b/protocols/msn/soap.c
@@ -59,6 +59,7 @@ struct msn_soap_req_data
void *data;
struct im_connection *ic;
int ttl;
+ char *error;
char *url, *action, *payload;
struct http_request *http_req;
@@ -157,13 +158,17 @@ static void msn_soap_handle_response( struct http_request *http_req )
xt_free( parser );
}
+ if( http_req->status_code != 200 )
+ soap_req->error = g_strdup( http_req->status_string );
+
st = soap_req->handle_response( soap_req );
fail:
g_free( soap_req->url );
g_free( soap_req->action );
g_free( soap_req->payload );
- soap_req->url = soap_req->action = soap_req->payload = NULL;
+ g_free( soap_req->error );
+ soap_req->url = soap_req->action = soap_req->payload = soap_req->error = NULL;
if( st == MSN_SOAP_RETRY && --soap_req->ttl )
{
@@ -252,6 +257,7 @@ static void msn_soap_free( struct msn_soap_req_data *soap_req )
g_free( soap_req->url );
g_free( soap_req->action );
g_free( soap_req->payload );
+ g_free( soap_req->error );
g_free( soap_req );
}
@@ -409,7 +415,7 @@ static int msn_soap_passport_sso_handle_response( struct msn_soap_req_data *soap
if( sd->secret == NULL )
{
- msn_auth_got_passport_token( ic, NULL, sd->error );
+ msn_auth_got_passport_token( ic, NULL, sd->error ? sd->error : soap_req->error );
return MSN_SOAP_OK;
}
diff --git a/protocols/skype/skype.c b/protocols/skype/skype.c
index 5b1a6c30..760aeb3d 100644
--- a/protocols/skype/skype.c
+++ b/protocols/skype/skype.c
@@ -1156,7 +1156,7 @@ gboolean skype_start_stream(struct im_connection *ic)
return st;
}
-gboolean skype_connected(gpointer data, void *source, b_input_condition cond)
+gboolean skype_connected(gpointer data, int returncode, void *source, b_input_condition cond)
{
struct im_connection *ic = data;
struct skype_data *sd = ic->proto_data;
@@ -1184,7 +1184,7 @@ static void skype_login(account_t *acc)
imcb_log(ic, "Connecting");
sd->ssl = ssl_connect(set_getstr(&acc->set, "server"),
- set_getint(&acc->set, "port"), skype_connected, ic);
+ set_getint(&acc->set, "port"), FALSE, skype_connected, ic);
sd->fd = sd->ssl ? ssl_getfd(sd->ssl) : -1;
sd->username = g_strdup(acc->user);