From fc6507ab415ed9ef0c573441773f919d330e5770 Mon Sep 17 00:00:00 2001 From: Tristan Matthews <tristan.matthews@savoirfairelinux.com> Date: Thu, 19 Apr 2012 13:13:03 -0400 Subject: [PATCH] * #9871: disable STUN for account if STUN setup failed --- daemon/src/sip/siptransport.cpp | 20 +++++++++++--------- daemon/src/sip/siptransport.h | 8 ++------ gnome/src/config/accountconfigdialog.c | 1 - gnome/src/dbus/dbus.c | 15 ++++++++++++--- 4 files changed, 25 insertions(+), 19 deletions(-) diff --git a/daemon/src/sip/siptransport.cpp b/daemon/src/sip/siptransport.cpp index c84197e8fa..48273c745f 100644 --- a/daemon/src/sip/siptransport.cpp +++ b/daemon/src/sip/siptransport.cpp @@ -354,7 +354,7 @@ void SipTransport::createSipTransport(SIPAccount *account) pjsip_transport *transport = createTlsTransport(remoteAddr, account->getLocalInterface(), account->getTlsListenerPort(), account->getTlsSetting()); account->transport_ = transport; } else if (account->isStunEnabled()) { - pjsip_transport *transport = createStunTransport(account->getStunServerName(), account->getStunPort()); + pjsip_transport *transport = createSTUNTransport(*account); if(transport == NULL) transport = createUdpTransport(account->getLocalInterface(), account->getLocalPort()); account->transport_ = transport; @@ -382,7 +382,7 @@ void SipTransport::createSipTransport(SIPAccount *account) if(account->transport_ == NULL) ERROR("SipTransport: Could not create transport on %s:%d", - account->getLocalInterface().c_str(), account->getLocalPort()); + account->getLocalInterface().c_str(), account->getLocalPort()); } void SipTransport::createDefaultSipUdpTransport() @@ -482,14 +482,15 @@ pjsip_tpselector *SipTransport::initTransportSelector(pjsip_transport *transport return tp; } -pjsip_transport *SipTransport::createStunTransport(pj_str_t serverName, pj_uint16_t port) +pjsip_transport *SipTransport::createSTUNTransport(SIPAccount &account) { - pjsip_transport *transport; + pj_str_t serverName = account.getStunServerName(); + pj_uint16_t port = account.getStunPort(); - DEBUG("SipTransport: Create stun transport server name: %s, port: %d", serverName, port);// account->getStunPort()); + DEBUG("SipTransport: Create STUN transport server name: %s, port: %d", serverName, port); if (createStunResolver(serverName, port) != PJ_SUCCESS) { ERROR("SipTransport: Can't resolve STUN server"); - Manager::instance().getDbusManager()->getConfigurationManager()->stunStatusFailure(""); + Manager::instance().getDbusManager()->getConfigurationManager()->stunStatusFailure(account.getAccountID()); return NULL; } @@ -499,13 +500,13 @@ pjsip_transport *SipTransport::createStunTransport(pj_str_t serverName, pj_uint1 if (pj_sockaddr_in_init(&boundAddr, &serverName, 0) != PJ_SUCCESS) { ERROR("SipTransport: Can't initialize IPv4 socket on %*s:%i", serverName.slen, serverName.ptr, port); - Manager::instance().getDbusManager()->getConfigurationManager()->stunStatusFailure(""); + Manager::instance().getDbusManager()->getConfigurationManager()->stunStatusFailure(account.getAccountID()); return NULL; } if (pj_sock_socket(pj_AF_INET(), pj_SOCK_DGRAM(), 0, &sock) != PJ_SUCCESS) { ERROR("SipTransport: Can't create or bind socket"); - Manager::instance().getDbusManager()->getConfigurationManager()->stunStatusFailure(""); + Manager::instance().getDbusManager()->getConfigurationManager()->stunStatusFailure(account.getAccountID()); return NULL; } @@ -515,7 +516,7 @@ pjsip_transport *SipTransport::createStunTransport(pj_str_t serverName, pj_uint1 if (pjstun_get_mapped_addr(&cp_->factory, 1, &sock, &serverName, port, &serverName, port, &pub_addr) != PJ_SUCCESS) { ERROR("SipTransport: Can't contact STUN server"); pj_sock_close(sock); - Manager::instance().getDbusManager()->getConfigurationManager()->stunStatusFailure(""); + Manager::instance().getDbusManager()->getConfigurationManager()->stunStatusFailure(account.getAccountID()); return NULL; } @@ -524,6 +525,7 @@ pjsip_transport *SipTransport::createStunTransport(pj_str_t serverName, pj_uint1 pj_ntohs(pub_addr.sin_port) }; + pjsip_transport *transport; pjsip_udp_transport_attach2(endpt_, PJSIP_TRANSPORT_UDP, sock, &a_name, 1, &transport); diff --git a/daemon/src/sip/siptransport.h b/daemon/src/sip/siptransport.h index 24f8833d1b..aaa5d2c20e 100644 --- a/daemon/src/sip/siptransport.h +++ b/daemon/src/sip/siptransport.h @@ -156,12 +156,6 @@ class SipTransport { pj_uint16_t tlsListenerPort, pjsip_tls_setting *tlsSetting); - /** - * Create a UDP transport using stun server to resove public address - * @param account The account for which a transport must be created. - */ - pjsip_transport *createStunTransport(pj_str_t serverName, pj_uint16_t port); - /** * This function unset the transport for a given account. */ @@ -180,6 +174,8 @@ class SipTransport { private: NON_COPYABLE(SipTransport); + pjsip_transport *createSTUNTransport(SIPAccount &account); + /** * UDP Transports are stored in this map in order to retreive them in case * several accounts would share the same port number. diff --git a/gnome/src/config/accountconfigdialog.c b/gnome/src/config/accountconfigdialog.c index 73cd407362..437e21c1f4 100644 --- a/gnome/src/config/accountconfigdialog.c +++ b/gnome/src/config/accountconfigdialog.c @@ -490,7 +490,6 @@ key_exchange_changed_cb(GtkWidget *widget UNUSED, gpointer data UNUSED) gtk_widget_set_sensitive(zrtp_button, sensitive); } - static void use_sip_tls_cb(GtkWidget *widget, gpointer data) { if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))) { diff --git a/gnome/src/dbus/dbus.c b/gnome/src/dbus/dbus.c index c49bd52115..e752480fea 100644 --- a/gnome/src/dbus/dbus.c +++ b/gnome/src/dbus/dbus.c @@ -46,6 +46,7 @@ #include "sliders.h" #include "statusicon.h" #include "assistant.h" +#include "accountlist.h" #include "accountlistconfigdialog.h" #include "dbus.h" @@ -448,14 +449,22 @@ accounts_changed_cb(DBusGProxy *proxy UNUSED, void *foo UNUSED) } static void -stun_status_failure_cb(DBusGProxy *proxy UNUSED, const gchar *reason, void *foo UNUSED) -{ - ERROR("Error: Stun status failure: %s failed", reason); +stun_status_failure_cb(DBusGProxy *proxy UNUSED, const gchar *accountID, void *foo UNUSED) +{ + ERROR("Error: Stun status failure: account %s failed to setup STUN", + accountID); + // Disable STUN for the account that tried to create the STUN transport + account_t *account = account_list_get_by_id(accountID); + if (account) { + account_replace(account, ACCOUNT_SIP_STUN_ENABLED, "false"); + dbus_set_account_details(account); + } } static void stun_status_success_cb(DBusGProxy *proxy UNUSED, const gchar *message UNUSED, void *foo UNUSED) { + DEBUG("STUN setup successful"); } static void -- GitLab