# HG changeset patch # User Stu Tomlinson # Date 1204034002 0 # Node ID dc47e908965fccad690bb1ca6dd2810970f30699 # Parent 63f102c210ad1b2597d5ba7beadada399298adc5 Use connect server as FQDN for SASL auth except when it is an IP address. References #699. diff -r 63f102c210ad -r dc47e908965f ChangeLog.API --- a/ChangeLog.API Mon Feb 25 15:24:49 2008 +0000 +++ b/ChangeLog.API Tue Feb 26 13:53:22 2008 +0000 @@ -9,6 +9,7 @@ purple_micro_version variables are exported by version.h, giving the version of libpurple in use at runtime. * purple_util_set_current_song, purple_util_format_song_info + * purple_ip_address_is_valid * Some accessor functions to the Roomlist API: * purple_roomlist_get_fields * purple_roomlist_room_get_type diff -r 63f102c210ad -r dc47e908965f libpurple/protocols/jabber/jabber.c --- a/libpurple/protocols/jabber/jabber.c Mon Feb 25 15:24:49 2008 +0000 +++ b/libpurple/protocols/jabber/jabber.c Tue Feb 26 13:53:22 2008 +0000 @@ -564,9 +564,16 @@ jabber_login_callback_ssl, jabber_ssl_connect_failure, js->certificate_CN, js->gc); } -static void jabber_login_connect(JabberStream *js, const char *fqdn, const char *host, int port) +static void jabber_login_connect(JabberStream *js, const char *domain, const char *host, int port) { - js->serverFQDN = g_strdup(fqdn); + /* host should be used in preference to domain to + * allow SASL authentication to work with FQDN of the server, + * but we use domain as fallback for when users enter IP address + * in connect server */ + if (purple_ip_address_is_valid(host)) + js->serverFQDN = g_strdup(domain); + else + js->serverFQDN = g_strdup(host); if (purple_proxy_connect(js->gc, js->gc->account, host, port, jabber_login_callback, js->gc) == NULL) diff -r 63f102c210ad -r dc47e908965f libpurple/util.c --- a/libpurple/util.c Mon Feb 25 15:24:49 2008 +0000 +++ b/libpurple/util.c Tue Feb 26 13:53:22 2008 +0000 @@ -4129,6 +4129,17 @@ return ((c - domain) > 3 ? TRUE : FALSE); } +gboolean +purple_ip_address_is_valid(const char *ip) +{ + int c, o1, o2, o3, o4; + char end; + c = sscanf(ip, "%d.%d.%d.%d%c", &o1, &o2, &o3, &o4, &end); + if (c > 4 || o1 < 0 || o1 > 255 || o2 < 0 || o2 > 255 || o3 < 0 || o3 > 255 || o4 < 0 || o4 > 255) + return FALSE; + return TRUE; +} + /* Stolen from gnome_uri_list_extract_uris */ GList * purple_uri_list_extract_uris(const gchar *uri_list) diff -r 63f102c210ad -r dc47e908965f libpurple/util.h --- a/libpurple/util.h Mon Feb 25 15:24:49 2008 +0000 +++ b/libpurple/util.h Tue Feb 26 13:53:22 2008 +0000 @@ -1081,6 +1081,15 @@ gboolean purple_email_is_valid(const char *address); /** + * Checks if the given IP address is a syntactically valid IPv4 address. + * + * @param address The IP address to validate. + * + * @return True if the IP address is syntactically correct. + */ +gboolean purple_ip_address_is_valid(const char *ip); + +/** * This function extracts a list of URIs from the a "text/uri-list" * string. It was "borrowed" from gnome_uri_list_extract_uris *