From 9615a55856ce6f1d0aabb4fb6b7f9a41c27a5391 Mon Sep 17 00:00:00 2001 From: James Booth Date: Sun, 20 May 2012 01:50:32 +0100 Subject: [PATCH 1/3] Added option to disable TLS The connection object includes a tls_support flag, which can be disabled with xmpp_conn_disable_tls(). --- src/auth.c | 10 +++++++--- src/common.h | 1 + src/conn.c | 12 ++++++++++++ strophe.h | 1 + 4 files changed, 21 insertions(+), 3 deletions(-) diff --git a/src/auth.c b/src/auth.c index d0c33cb..3bbdfec 100644 --- a/src/auth.c +++ b/src/auth.c @@ -209,9 +209,13 @@ static int _handle_features(xmpp_conn_t * const conn, /* check for TLS */ if (!conn->secured) { - child = xmpp_stanza_get_child_by_name(stanza, "starttls"); - if (child && (strcmp(xmpp_stanza_get_ns(child), XMPP_NS_TLS) == 0)) - conn->tls_support = 1; + if (!conn->tls_disabled) { + child = xmpp_stanza_get_child_by_name(stanza, "starttls"); + if (child && (strcmp(xmpp_stanza_get_ns(child), XMPP_NS_TLS) == 0)) + conn->tls_support = 1; + } else { + conn->tls_disabled = 0; + } } /* check for SASL */ diff --git a/src/common.h b/src/common.h index cafcbd4..9434e6f 100644 --- a/src/common.h +++ b/src/common.h @@ -163,6 +163,7 @@ struct _xmpp_conn_t { tls_t *tls; int tls_support; + int tls_disabled; int tls_failed; /* set when tls fails, so we don't try again */ int sasl_support; /* if true, field is a bitfield of supported mechanisms */ diff --git a/src/conn.c b/src/conn.c index 0a4e61c..e53a7f9 100644 --- a/src/conn.c +++ b/src/conn.c @@ -109,6 +109,7 @@ xmpp_conn_t *xmpp_conn_new(xmpp_ctx_t * const ctx) conn->bound_jid = NULL; conn->tls_support = 0; + conn->tls_disabled = 0; conn->tls_failed = 0; conn->sasl_support = 0; conn->secured = 0; @@ -666,6 +667,17 @@ void conn_open_stream(xmpp_conn_t * const conn) XMPP_NS_STREAMS); } +/** Disable TLS for this connection, called by users of the library. + * Occasionally a server will be misconfigured to send the starttls + * feature, but wil not support the handshake. + * + * @param conn a Strophe connection object + */ +void xmpp_conn_disable_tls(xmpp_conn_t * const conn) +{ + conn->tls_disabled = 1; +} + static void _log_open_tag(xmpp_conn_t *conn, char **attrs) { char buf[4096]; diff --git a/strophe.h b/strophe.h index 347ff7d..e3a2f4d 100644 --- a/strophe.h +++ b/strophe.h @@ -217,6 +217,7 @@ void xmpp_conn_set_jid(xmpp_conn_t * const conn, const char * const jid); const char *xmpp_conn_get_pass(const xmpp_conn_t * const conn); void xmpp_conn_set_pass(xmpp_conn_t * const conn, const char * const pass); xmpp_ctx_t* xmpp_conn_get_context(xmpp_conn_t * const conn); +void xmpp_conn_disable_tls(xmpp_conn_t * const conn); int xmpp_connect_client(xmpp_conn_t * const conn, const char * const altdomain, From a572d055a8cea591c1559666f35350fbf2e6fd7e Mon Sep 17 00:00:00 2001 From: James Booth Date: Sun, 20 May 2012 02:10:19 +0100 Subject: [PATCH 2/3] Fixed wrong flag setting --- src/auth.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/auth.c b/src/auth.c index 3bbdfec..2371925 100644 --- a/src/auth.c +++ b/src/auth.c @@ -214,7 +214,7 @@ static int _handle_features(xmpp_conn_t * const conn, if (child && (strcmp(xmpp_stanza_get_ns(child), XMPP_NS_TLS) == 0)) conn->tls_support = 1; } else { - conn->tls_disabled = 0; + conn->tls_support = 0; } } From 5875390968e5f843e930031db44d59be34d696bf Mon Sep 17 00:00:00 2001 From: James Booth Date: Sun, 20 May 2012 05:16:20 +0100 Subject: [PATCH 3/3] Fixed spacing --- src/conn.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/conn.c b/src/conn.c index e53a7f9..26df418 100644 --- a/src/conn.c +++ b/src/conn.c @@ -109,7 +109,7 @@ xmpp_conn_t *xmpp_conn_new(xmpp_ctx_t * const ctx) conn->bound_jid = NULL; conn->tls_support = 0; - conn->tls_disabled = 0; + conn->tls_disabled = 0; conn->tls_failed = 0; conn->sasl_support = 0; conn->secured = 0;