diff --git a/sflphone-client-gnome/src/config/configwindow.c b/sflphone-client-gnome/src/config/configwindow.c index d954bd335350fb370f5070e086d5281aa6691630..2ad87ef081bf3d5b3363736613c60eadb2e74a2b 100644 --- a/sflphone-client-gnome/src/config/configwindow.c +++ b/sflphone-client-gnome/src/config/configwindow.c @@ -68,8 +68,10 @@ GtkWidget * status; static int history_limit; static gboolean history_enabled = TRUE; -account_t *selectedAccount; +account_t * selectedAccount = NULL; +GHashTable * directIpCallsProperties = NULL; + // Account properties enum { COLUMN_ACCOUNT_ALIAS, @@ -97,16 +99,6 @@ config_window_fill_account_list() gtk_list_store_clear(accountStore); - gtk_list_store_append (accountStore, &iter); - - gtk_list_store_set(accountStore, &iter, - COLUMN_ACCOUNT_ALIAS, (gchar *) _("Direct calls account"), - COLUMN_ACCOUNT_TYPE, (gchar *) _("SIP"), // Protocol - COLUMN_ACCOUNT_STATUS, (gchar *) _("Active"), // Status - COLUMN_ACCOUNT_ACTIVE, TRUE, // Enable/Disable - COLUMN_ACCOUNT_DATA, NULL, // Pointer - -1); - unsigned int i; for(i = 0; i < account_list_get_size(); i++) { account_t * a = account_list_get_nth (i); @@ -137,7 +129,7 @@ config_window_fill_account_list() static void delete_account(GtkWidget *widget UNUSED, gpointer data UNUSED) { - if(selectedAccount) + if(selectedAccount != NULL) { dbus_remove_account(selectedAccount->accountID); if(account_list_get_sip_account_number() == 1 && @@ -152,16 +144,10 @@ delete_account(GtkWidget *widget UNUSED, gpointer data UNUSED) static void edit_account(GtkWidget *widget UNUSED, gpointer data UNUSED) { - if(selectedAccount) + if(selectedAccount != NULL) { show_account_window(selectedAccount); - } else { - GHashTable * properties = NULL; - properties = sflphone_get_ip2ip_properties(); - if (properties != NULL) { - show_ip2ip_dialog(properties); - } - } + } } /** @@ -243,17 +229,6 @@ select_account(GtkTreeSelection *selection, GtkTreeModel *model) GtkTreeIter iter; GValue val; - GtkTreePath *path; - if(gtk_tree_selection_get_selected (selection, NULL, &iter)) { - path = gtk_tree_model_get_path (model, &iter); - if(gtk_tree_path_get_indices (path)[0] == 0) { - gtk_widget_set_sensitive(GTK_WIDGET(editButton), TRUE); - gtk_widget_set_sensitive(GTK_WIDGET(deleteButton), FALSE); - gtk_widget_set_sensitive(GTK_WIDGET(accountMoveUpButton), FALSE); - gtk_widget_set_sensitive(GTK_WIDGET(accountMoveDownButton), FALSE); - } - } - memset (&val, 0, sizeof(val)); if (!gtk_tree_selection_get_selected(selection, &model, &iter)) { @@ -269,13 +244,12 @@ select_account(GtkTreeSelection *selection, GtkTreeModel *model) selectedAccount = (account_t*)g_value_get_pointer(&val); g_value_unset(&val); - if(selectedAccount) + if(selectedAccount != NULL) { - gtk_widget_set_sensitive(GTK_WIDGET(editButton), TRUE); - gtk_widget_set_sensitive(GTK_WIDGET(deleteButton), TRUE); gtk_widget_set_sensitive(GTK_WIDGET(accountMoveUpButton), TRUE); gtk_widget_set_sensitive(GTK_WIDGET(accountMoveDownButton), TRUE); } + DEBUG("Selecting account in account window"); } @@ -283,44 +257,39 @@ select_account(GtkTreeSelection *selection, GtkTreeModel *model) enable_account(GtkCellRendererToggle *rend UNUSED, gchar* path, gpointer data ) { GtkTreeIter iter; - GtkTreePath *treePath; + GtkTreePath *treePath; GtkTreeModel *model; gboolean enable; account_t* acc ; - // Get path of clicked codec active toggle box + // Get pointer on object treePath = gtk_tree_path_new_from_string(path); model = gtk_tree_view_get_model(GTK_TREE_VIEW(data)); gtk_tree_model_get_iter(model, &iter, treePath); - - if (gtk_tree_path_get_indices (treePath)[0] != 0) { - // Get pointer on object - gtk_tree_model_get(model, &iter, - COLUMN_ACCOUNT_ACTIVE, &enable, - COLUMN_ACCOUNT_DATA, &acc, - -1); - enable = !enable; - - DEBUG("Account is %d enabled", enable); - // Store value - gtk_list_store_set(GTK_LIST_STORE(model), &iter, - COLUMN_ACCOUNT_ACTIVE, enable, - -1); - - gtk_tree_path_free(treePath); - - // Modify account state - gchar * registrationState; - if (enable == TRUE) { - registrationState = g_strdup("true"); - } else { - registrationState = g_strdup("false"); - } - DEBUG("Replacing with %s\n", registrationState); - g_hash_table_replace( acc->properties , g_strdup(ACCOUNT_ENABLED), registrationState); - - dbus_send_register(acc->accountID, enable); + gtk_tree_model_get(model, &iter, + COLUMN_ACCOUNT_ACTIVE, &enable, + COLUMN_ACCOUNT_DATA, &acc, + -1); + enable = !enable; + + DEBUG("Account is %d enabled", enable); + // Store value + gtk_list_store_set(GTK_LIST_STORE(model), &iter, + COLUMN_ACCOUNT_ACTIVE, enable, + -1); + + // Modify account state + gchar * registrationState; + if (enable == TRUE) { + registrationState = g_strdup("true"); + } else { + registrationState = g_strdup("false"); } + DEBUG("Replacing with %s\n", registrationState); + g_hash_table_replace( acc->properties , g_strdup(ACCOUNT_ENABLED), registrationState); + + dbus_send_register(acc->accountID, enable); + } /** @@ -553,6 +522,130 @@ void update_registration( void ) gtk_widget_set_sensitive(GTK_WIDGET(applyButton) , FALSE ); } +static void show_advanced_zrtp_options_cb(GtkWidget *widget UNUSED, gpointer data) +{ + DEBUG("Advanced options for ZRTP"); + show_advanced_zrtp_options((GHashTable *) data); +} + +static void show_advanced_tls_options_cb(GtkWidget *widget UNUSED, gpointer data) +{ + DEBUG("Advanced options for TLS"); + show_advanced_tls_options((GHashTable *) data); +} + +static void key_exchange_changed_cb(GtkWidget *widget, gpointer data) +{ + DEBUG("Key exchange changed"); + if (g_strcasecmp(gtk_combo_box_get_active_text(GTK_COMBO_BOX(widget)), (gchar *) "ZRTP") == 0) { + gtk_widget_set_sensitive(GTK_WIDGET(data), TRUE); + g_hash_table_replace(directIpCallsProperties, g_strdup(ACCOUNT_KEY_EXCHANGE), g_strdup(ZRTP)); + } else { + gtk_widget_set_sensitive(GTK_WIDGET(data), FALSE); + DEBUG("Setting key exchange %s to %s\n", ACCOUNT_KEY_EXCHANGE, KEY_EXCHANGE_NONE); + g_hash_table_replace(directIpCallsProperties, g_strdup(ACCOUNT_KEY_EXCHANGE), g_strdup(KEY_EXCHANGE_NONE)); + } +} + +static void use_sip_tls_cb(GtkWidget *widget, gpointer data) +{ + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))) { + DEBUG("Using sips"); + gtk_widget_set_sensitive(GTK_WIDGET(data), TRUE); + g_hash_table_replace(directIpCallsProperties, + g_strdup(TLS_ENABLE), g_strdup("true")); + } else { + gtk_widget_set_sensitive(GTK_WIDGET(data), FALSE); + g_hash_table_replace(directIpCallsProperties, + g_strdup(TLS_ENABLE), g_strdup("false")); + } +} + +GtkWidget* create_direct_ip_calls_tab() +{ + GtkWidget * frame; + GtkWidget * table; + GtkWidget * label; + GtkWidget * explanationLabel; + GtkWidget * keyExchangeCombo; + GtkWidget * advancedZrtpButton; + GtkWidget * useSipTlsCheckBox; + + gchar * curSRTPEnabled = "false"; + gchar * curTlsEnabled = "false"; + gchar * curKeyExchange = "0"; + gchar * description; + + directIpCallsProperties = sflphone_get_ip2ip_properties(); + + if(directIpCallsProperties != NULL) { + curSRTPEnabled = g_hash_table_lookup(directIpCallsProperties, ACCOUNT_SRTP_ENABLED); + curKeyExchange = g_hash_table_lookup(directIpCallsProperties, ACCOUNT_KEY_EXCHANGE); + curTlsEnabled = g_hash_table_lookup(directIpCallsProperties, TLS_ENABLE); + } + + GtkWidget * vbox = gtk_vbox_new(FALSE, 10); + gtk_container_set_border_width(GTK_CONTAINER(vbox), 10); + + description = g_markup_printf_escaped(_("This profile is used when you want to reach a remote peer simply by typing a sip URI such as <b>sip:remotepeer</b>. The settings you define here will also be used if no account can be matched to an incoming or outgoing call.")); + explanationLabel = gtk_label_new(NULL); + gtk_label_set_markup(GTK_LABEL(explanationLabel), description); + gtk_misc_set_alignment(GTK_MISC(explanationLabel), 0, 0.5); + gtk_box_pack_start(GTK_BOX(vbox), explanationLabel, FALSE, FALSE, 0); + + gnome_main_section_new_with_table (_("Security"), &frame, &table, 2, 3); + gtk_container_set_border_width (GTK_CONTAINER(table), 10); + gtk_table_set_row_spacings (GTK_TABLE(table), 10); + gtk_table_set_col_spacings( GTK_TABLE(table), 10); + gtk_box_pack_start(GTK_BOX(vbox), frame, FALSE, FALSE, 0); + + GtkWidget * sipTlsAdvancedButton; + sipTlsAdvancedButton = gtk_button_new_from_stock(GTK_STOCK_EDIT); + gtk_table_attach_defaults(GTK_TABLE(table), sipTlsAdvancedButton, 2, 3, 0, 1); + gtk_widget_set_sensitive(GTK_WIDGET(sipTlsAdvancedButton), FALSE); + g_signal_connect(G_OBJECT(sipTlsAdvancedButton), "clicked", G_CALLBACK(show_advanced_tls_options_cb), directIpCallsProperties); + + useSipTlsCheckBox = gtk_check_button_new_with_mnemonic(_("Use TLS transport (sips)")); + g_signal_connect (useSipTlsCheckBox, "toggled", G_CALLBACK(use_sip_tls_cb), sipTlsAdvancedButton); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(useSipTlsCheckBox), (g_strcmp0(curTlsEnabled, "false") == 0) ? FALSE:TRUE); + gtk_table_attach_defaults(GTK_TABLE(table), useSipTlsCheckBox, 0, 2, 0, 1); + + label = gtk_label_new_with_mnemonic (_("SRTP key exchange")); + gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); + keyExchangeCombo = gtk_combo_box_new_text(); + gtk_label_set_mnemonic_widget (GTK_LABEL (label), keyExchangeCombo); + gtk_combo_box_append_text(GTK_COMBO_BOX(keyExchangeCombo), "ZRTP"); + //gtk_combo_box_append_text(GTK_COMBO_BOX(keyExchangeCombo), "SDES"); + gtk_combo_box_append_text(GTK_COMBO_BOX(keyExchangeCombo), _("Disabled")); + + advancedZrtpButton = gtk_button_new_from_stock(GTK_STOCK_PREFERENCES); + g_signal_connect(G_OBJECT(advancedZrtpButton), "clicked", G_CALLBACK(show_advanced_zrtp_options_cb), directIpCallsProperties); + + if (g_strcasecmp(curKeyExchange, ZRTP) == 0) { + gtk_combo_box_set_active(GTK_COMBO_BOX(keyExchangeCombo),0); + } else { + gtk_combo_box_set_active(GTK_COMBO_BOX(keyExchangeCombo), 1); + gtk_widget_set_sensitive(GTK_WIDGET(advancedZrtpButton), FALSE); + } + + g_signal_connect (G_OBJECT (GTK_COMBO_BOX(keyExchangeCombo)), "changed", G_CALLBACK (key_exchange_changed_cb), advancedZrtpButton); + + gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 1, 2); + gtk_table_attach_defaults(GTK_TABLE(table), keyExchangeCombo, 1, 2, 1, 2); + gtk_table_attach_defaults(GTK_TABLE(table), advancedZrtpButton, 2, 3, 1, 2); + + gtk_widget_show_all(table); + + GtkRequisition requisition; + gtk_widget_size_request(GTK_WIDGET(table), &requisition); + gtk_widget_set_size_request(GTK_WIDGET(explanationLabel), requisition.width * 1.5, -1); + gtk_label_set_line_wrap(GTK_LABEL(explanationLabel), TRUE); + + gtk_widget_show_all(vbox); + + return vbox; +} + GtkWidget* create_network_tab() { GtkWidget * frame; @@ -740,7 +833,9 @@ void save_configuration_parameters (void) { // History config dbus_set_history_limit (history_limit); - + + // Direct IP calls config + dbus_set_ip2ip_details(directIpCallsProperties); } /** @@ -798,7 +893,12 @@ show_config_window () tab = create_network_tab(); gtk_notebook_append_page(GTK_NOTEBOOK(notebook), tab, gtk_label_new(_("Network"))); gtk_notebook_page_num(GTK_NOTEBOOK(notebook), tab); - + + // Direct IP calls tab + tab = create_direct_ip_calls_tab(); + gtk_notebook_append_page(GTK_NOTEBOOK(notebook), tab, gtk_label_new(_("Direct IP calls"))); + gtk_notebook_page_num(GTK_NOTEBOOK(notebook), tab); + gtk_notebook_set_current_page( GTK_NOTEBOOK( notebook) , 0); result = gtk_dialog_run(dialog); @@ -867,4 +967,3 @@ void config_window_set_stun_visible() gtk_widget_set_sensitive( GTK_WIDGET(stunFrame), TRUE ); } - diff --git a/sflphone-client-gnome/src/config/ip2ipdialog.c b/sflphone-client-gnome/src/config/ip2ipdialog.c index ec1434898f9a11ad33b9b3baa3433d9ffe261044..8d6f961a629da390e2686be3fee6c81c9a8d9a97 100644 --- a/sflphone-client-gnome/src/config/ip2ipdialog.c +++ b/sflphone-client-gnome/src/config/ip2ipdialog.c @@ -145,7 +145,7 @@ void show_ip2ip_dialog(GHashTable * properties) } else { g_hash_table_replace(properties, g_strdup(ACCOUNT_SRTP_ENABLED), g_strdup("false")); } - dbus_set_ip2_ip_details(properties); + dbus_set_ip2ip_details(properties); } gtk_widget_destroy (GTK_WIDGET(ip2ipDialog)); diff --git a/sflphone-client-gnome/src/dbus/dbus.c b/sflphone-client-gnome/src/dbus/dbus.c index b73933e1da17188bf77eb0b7558922ee649c11a3..970905a6485cff376594907a97c4e50609162344 100644 --- a/sflphone-client-gnome/src/dbus/dbus.c +++ b/sflphone-client-gnome/src/dbus/dbus.c @@ -797,7 +797,7 @@ GHashTable* dbus_get_ip2_ip_details(void) } void -dbus_set_ip2_ip_details(GHashTable * properties) +dbus_set_ip2ip_details(GHashTable * properties) { GError *error = NULL; org_sflphone_SFLphone_ConfigurationManager_set_ip2_ip_details ( @@ -857,7 +857,6 @@ dbus_set_account_details(account_t *a) g_error_free (error); } } - gchar* dbus_add_account(account_t *a) { diff --git a/sflphone-client-gnome/src/dbus/dbus.h b/sflphone-client-gnome/src/dbus/dbus.h index 50e2552571652052ed0e44393d1c9a7cc1f96e3a..73305b489f35da47c06ce28d0727f57545cc4aa7 100644 --- a/sflphone-client-gnome/src/dbus/dbus.h +++ b/sflphone-client-gnome/src/dbus/dbus.h @@ -159,7 +159,7 @@ GHashTable * dbus_get_ip2_ip_details(void); /** * ConfigurationManager - Set the details for the ip2ip profile */ -void dbus_set_ip2_ip_details(GHashTable * properties); +void dbus_set_ip2ip_details(GHashTable * properties); /** * ConfigurationManager - Send registration request diff --git a/sflphone-client-gnome/src/sflphone_const.h b/sflphone-client-gnome/src/sflphone_const.h index 516929916cf0dff4986a8103f3af4fe78086c438..627e4f919e50be7dd9ba2a161489f30749056841 100644 --- a/sflphone-client-gnome/src/sflphone_const.h +++ b/sflphone-client-gnome/src/sflphone_const.h @@ -64,6 +64,7 @@ #define ACCOUNT_ZRTP_NOT_SUPP_WARNING "ZRTP.notSuppWarning" #define ACCOUNT_ZRTP_HELLO_HASH "ZRTP.helloHashEnable" #define ACCOUNT_DISPLAY_SAS_ONCE "ZRTP.displaySasOnce" +#define KEY_EXCHANGE_NONE "0" #define ZRTP "1" #define SDES_TLS "2" diff --git a/sflphone-common/src/dbus/configurationmanager.cpp b/sflphone-common/src/dbus/configurationmanager.cpp index 9fe007627ec4ad6989ed80780858c812770fa58b..f76921e2477b25b422c8762987891daa3a7b631b 100644 --- a/sflphone-common/src/dbus/configurationmanager.cpp +++ b/sflphone-common/src/dbus/configurationmanager.cpp @@ -77,6 +77,10 @@ ConfigurationManager::getIp2IpDetails(void) ip2ipAccountDetails.insert(std::pair<std::string, std::string> (ZRTP_NOT_SUPP_WARNING, Manager::instance().getConfigString(IP2IP_PROFILE, ZRTP_NOT_SUPP_WARNING))); ip2ipAccountDetails.insert(std::pair<std::string, std::string> (ZRTP_DISPLAY_SAS_ONCE, Manager::instance().getConfigString(IP2IP_PROFILE, ZRTP_DISPLAY_SAS_ONCE))); + std::map<std::string, std::string> tlsSettings; + tlsSettings = getTlsSettings(IP2IP_PROFILE); + std::copy(tlsSettings.begin(), tlsSettings.end(), std::inserter(ip2ipAccountDetails, ip2ipAccountDetails.end())); + return ip2ipAccountDetails; } @@ -91,6 +95,12 @@ ConfigurationManager::setIp2IpDetails(const std::map< std::string, std::string > if (it != details.end()) { Manager::instance().setConfig(IP2IP_PROFILE, SRTP_ENABLE, it->second); } + + it = map_cpy.find(SRTP_KEY_EXCHANGE); + if (it != details.end()) { + Manager::instance().setConfig(IP2IP_PROFILE, SRTP_KEY_EXCHANGE, it->second); + } + it = map_cpy.find(ZRTP_DISPLAY_SAS); if (it != details.end()) { Manager::instance().setConfig(IP2IP_PROFILE, ZRTP_DISPLAY_SAS, it->second); @@ -108,13 +118,7 @@ ConfigurationManager::setIp2IpDetails(const std::map< std::string, std::string > Manager::instance().setConfig(IP2IP_PROFILE, ZRTP_DISPLAY_SAS_ONCE, it->second); } - std::string keyExchange(details.find(SRTP_KEY_EXCHANGE)->second); - - if(keyExchange.find("ZRTP") == 0) { - Manager::instance().setConfig(IP2IP_PROFILE, SRTP_KEY_EXCHANGE, "0"); - } else { - Manager::instance().setConfig(IP2IP_PROFILE, SRTP_KEY_EXCHANGE, "1"); - } + setTlsSettings(IP2IP_PROFILE, details); Manager::instance().saveConfig(); @@ -166,49 +170,48 @@ ConfigurationManager::setTlsSettings(const std::string& section, const std::map< if (it != details.end()) { Manager::instance().setConfig(section, TLS_ENABLE, it->second); } - it = map_cpy.find(TLS_CA_LIST_FILE); - if (it != details.end()) { + if (it != map_cpy.end()) { Manager::instance().setConfig(section, TLS_CA_LIST_FILE, it->second); } it = map_cpy.find(TLS_CERTIFICATE_FILE); - if (it != details.end()) { + if (it != map_cpy.end()) { Manager::instance().setConfig(section, TLS_CERTIFICATE_FILE, it->second); } it = map_cpy.find(TLS_PRIVATE_KEY_FILE); - if (it != details.end()) { + if (it != map_cpy.end()) { Manager::instance().setConfig(section, TLS_PRIVATE_KEY_FILE, it->second); } it = map_cpy.find(TLS_PASSWORD); - if (it != details.end()) { + if (it != map_cpy.end()) { Manager::instance().setConfig(section, TLS_PASSWORD, it->second); } it = map_cpy.find(TLS_METHOD); - if (it != details.end()) { + if (it != map_cpy.end()) { Manager::instance().setConfig(section, TLS_METHOD, it->second); } it = map_cpy.find(TLS_CIPHERS); - if (it != details.end()) { + if (it != map_cpy.end()) { Manager::instance().setConfig(section, TLS_CIPHERS, it->second); } it = map_cpy.find(TLS_SERVER_NAME); - if (it != details.end()) { + if (it != map_cpy.end()) { Manager::instance().setConfig(section, TLS_SERVER_NAME, it->second); } it = map_cpy.find(TLS_VERIFY_CLIENT); - if (it != details.end()) { + if (it != map_cpy.end()) { Manager::instance().setConfig(section, TLS_VERIFY_CLIENT, it->second); } it = map_cpy.find(TLS_REQUIRE_CLIENT_CERTIFICATE); - if (it != details.end()) { + if (it != map_cpy.end()) { Manager::instance().setConfig(section, TLS_REQUIRE_CLIENT_CERTIFICATE, it->second); } it = map_cpy.find(TLS_NEGOTIATION_TIMEOUT_SEC); - if (it != details.end()) { + if (it != map_cpy.end()) { Manager::instance().setConfig(section, TLS_NEGOTIATION_TIMEOUT_SEC, it->second); } it = map_cpy.find(TLS_NEGOTIATION_TIMEOUT_MSEC); - if (it != details.end()) { + if (it != map_cpy.end()) { Manager::instance().setConfig(section, TLS_NEGOTIATION_TIMEOUT_MSEC, it->second); } diff --git a/sflphone-common/src/managerimpl.cpp b/sflphone-common/src/managerimpl.cpp index 0e978649a4e7c4900b84e9dbc3e149f60365b60f..0f19bbd35d064ded0a3e9ee1485362a9017bf896 100644 --- a/sflphone-common/src/managerimpl.cpp +++ b/sflphone-common/src/managerimpl.cpp @@ -2467,7 +2467,7 @@ ManagerImpl::getConfigString (const std::string& section, const std::string& bool ManagerImpl::setConfig (const std::string& section, const std::string& name, const std::string& value) { - _debug("ManagerImp::setConfig %s %s %s\n", section.c_str(), name.c_str(), value.c_str()); + _debug("ManagerImpl::setConfig %s %s %s\n", section.c_str(), name.c_str(), value.c_str()); return _config.setConfigTreeItem (section, name, value); }