diff --git a/src/auth.c b/src/auth.c index d0c33cb..2371925 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_support = 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..26df418 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,