diff --git a/daemon/src/sip/siptransport.cpp b/daemon/src/sip/siptransport.cpp index c84197e8fa0a421214c00048097ed4dc31513d30..48273c745f256e7d3feeb7cb062b9ba84ceaaaa9 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 24f8833d1b1c5a5beb7938b5ea64d1616a8ec7da..aaa5d2c20e4f38f1552f2b9ad1c9f719f511e8fd 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 73cd4073629a087fd11adcccd2f0b8629de32709..437e21c1f448e5805decc7f81e6a3f0f3e285070 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 c49bd52115e717649c8ccdcbe43d967fbd188060..e752480feae8c9c12a023f0e6d94ac601090bf8d 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