diff --git a/sflphone-client-gnome/src/config/configwindow.c b/sflphone-client-gnome/src/config/configwindow.c index 3cf371a53f32426cddfb1cc450b80e8f9606e02f..ba8d62d9086cbf59dfeb766db4ed8d61298246d4 100644 --- a/sflphone-client-gnome/src/config/configwindow.c +++ b/sflphone-client-gnome/src/config/configwindow.c @@ -149,24 +149,32 @@ edit_account(GtkWidget *widget UNUSED, gpointer data UNUSED) /** * Add an account */ - static void +static void add_account(GtkWidget *widget UNUSED, gpointer data UNUSED) { show_account_window(NULL); } - void +static void +set_md5_hash_cb(GtkWidget *widget UNUSED, gpointer data UNUSED) +{ + gboolean enabled = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)); + dbus_set_md5_credential_hashing(enabled); +} + +static void start_hidden( void ) { dbus_start_hidden(); } - void +static void set_popup_mode( void ) { dbus_switch_popup_mode(); } + void set_notif_level( ) { @@ -573,7 +581,7 @@ create_general_settings () GtkWidget *mutewidget; GtkWidget *trayItem; GtkWidget *frame; - GtkWidget *history_w; + GtkWidget *checkBoxWidget; GtkWidget *label; GtkWidget *entryPort; GtkWidget *table; @@ -629,20 +637,28 @@ create_general_settings () gnome_main_section_new_with_table (_("Calls History"), &frame, &table, 3, 1); gtk_box_pack_start(GTK_BOX(ret), frame, FALSE, FALSE, 0); - history_w = gtk_check_button_new_with_mnemonic(_("_Keep my history for at least")); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (history_w), history_enabled); - g_signal_connect (G_OBJECT (history_w) , "clicked" , G_CALLBACK (history_enabled_cb) , NULL); - gtk_table_attach( GTK_TABLE(table), history_w, 0, 1, 0, 1, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 5); + checkBoxWidget = gtk_check_button_new_with_mnemonic(_("_Keep my history for at least")); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (checkBoxWidget), history_enabled); + g_signal_connect (G_OBJECT (checkBoxWidget) , "clicked" , G_CALLBACK (history_enabled_cb) , NULL); + gtk_table_attach( GTK_TABLE(table), checkBoxWidget, 0, 1, 0, 1, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 5); history_value = gtk_spin_button_new_with_range(1, 99, 1); gtk_spin_button_set_value (GTK_SPIN_BUTTON(history_value), history_limit); g_signal_connect( G_OBJECT (history_value) , "value-changed" , G_CALLBACK (history_limit_cb) , history_value); - gtk_widget_set_sensitive (GTK_WIDGET (history_value), gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (history_w))); + gtk_widget_set_sensitive (GTK_WIDGET (history_value), gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (checkBoxWidget))); gtk_table_attach( GTK_TABLE(table), history_value, 1, 2, 0, 1, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 5); label = gtk_label_new(_("days")); gtk_table_attach( GTK_TABLE(table), label, 2, 3, 0, 1, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 5); - + + // Configuration File + gnome_main_section_new_with_table (_("Configuration File"), &frame, &table, 1, 1); + gtk_box_pack_start(GTK_BOX(ret), frame, FALSE, FALSE, 0); + checkBoxWidget = gtk_check_button_new_with_mnemonic(_("Store SIP credentials as MD5 hash")); + gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(checkBoxWidget), dbus_is_md5_credential_hashing() ); + g_signal_connect(G_OBJECT( checkBoxWidget ) , "clicked" , G_CALLBACK(set_md5_hash_cb) , NULL); + gtk_table_attach( GTK_TABLE(table), checkBoxWidget, 0, 1, 0, 1, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 5); + /** PULSEAUDIO CONFIGURATION */ gnome_main_section_new_with_table (_("PulseAudio sound server"), &frame, &table, 1, 1); gtk_box_pack_start(GTK_BOX(ret), frame, FALSE, FALSE, 0); diff --git a/sflphone-client-gnome/src/dbus/configurationmanager-introspec.xml b/sflphone-client-gnome/src/dbus/configurationmanager-introspec.xml index bf535c9d6daed82ab1045d7d8e3226727a8499fc..8c2151be386f1fb556b149661fb33d86bdb32cce 100644 --- a/sflphone-client-gnome/src/dbus/configurationmanager-introspec.xml +++ b/sflphone-client-gnome/src/dbus/configurationmanager-introspec.xml @@ -203,7 +203,15 @@ </method> <!-- General Settings Panel --> - + + <method name="isMd5CredentialHashing"> + <arg type="b" name="res" direction="out"/> + </method> + + <method name="setMd5CredentialHashing"> + <arg type="b" name="enabled" direction="in"/> + </method> + <method name="isIax2Enabled"> <arg type="i" name="res" direction="out"/> </method> diff --git a/sflphone-client-gnome/src/dbus/dbus.c b/sflphone-client-gnome/src/dbus/dbus.c index 08904b82f1269cd676cafe2ceeea18ea8e930df2..a48eecf86dcf2025c79115c82a678cecdad803be 100644 --- a/sflphone-client-gnome/src/dbus/dbus.c +++ b/sflphone-client-gnome/src/dbus/dbus.c @@ -1211,6 +1211,36 @@ dbus_ringtone_enabled() } } + gboolean +dbus_is_md5_credential_hashing() +{ + int res; + GError* error = NULL; + org_sflphone_SFLphone_ConfigurationManager_is_md5_credential_hashing( + configurationManagerProxy, + &res, + &error); + if(error) + { + g_error_free(error); + } + return res; +} + + void +dbus_set_md5_credential_hashing(gboolean enabled) +{ + GError* error = NULL; + org_sflphone_SFLphone_ConfigurationManager_set_md5_credential_hashing( + configurationManagerProxy, + &enabled, + &error); + if(error) + { + g_error_free(error); + } +} + int dbus_is_iax2_enabled() { diff --git a/sflphone-client-gnome/src/dbus/dbus.h b/sflphone-client-gnome/src/dbus/dbus.h index f0bf2a9a987fbef9cde76a187c087311f4d93107..a8a27791d8dd1916fb0ff4589a295a25c0689999 100644 --- a/sflphone-client-gnome/src/dbus/dbus.h +++ b/sflphone-client-gnome/src/dbus/dbus.h @@ -299,6 +299,22 @@ int dbus_get_audio_device_index(const gchar* name); */ gchar* dbus_get_current_audio_output_plugin(); +/** + * ConfigurationManager - Query to server to + * know if MD5 credential hashing is enabled. + * @return True if enabled, false otherwise + * + */ +gboolean dbus_is_md5_credential_hashing(); + +/** + * ConfigurationManager - Set whether or not + * the server should store credential as + * a md5 hash. + * @param enabled + */ +void dbus_set_md5_credential_hashing(gboolean enabled); + /** * ConfigurationManager - Tells the GUI if IAX2 support is enabled * @return int 1 if IAX2 is enabled diff --git a/sflphone-common/src/dbus/configurationmanager-introspec.xml b/sflphone-common/src/dbus/configurationmanager-introspec.xml index 2371fb93160a40ad6f3f0bd78816eb588f439d9f..13d7234aadcb1dd625c66fa115d9aaec15edea61 100644 --- a/sflphone-common/src/dbus/configurationmanager-introspec.xml +++ b/sflphone-common/src/dbus/configurationmanager-introspec.xml @@ -203,7 +203,15 @@ </method> <!-- General Settings Panel --> - + + <method name="isMd5CredentialHashing"> + <arg type="b" name="res" direction="out"/> + </method> + + <method name="setMd5CredentialHashing"> + <arg type="b" name="enabled" direction="in"/> + </method> + <method name="isIax2Enabled"> <arg type="i" name="res" direction="out"/> </method> diff --git a/sflphone-common/src/dbus/configurationmanager.cpp b/sflphone-common/src/dbus/configurationmanager.cpp index d12825631cf95fa468b7f2d1b138998921a5ab3b..d5bc386b9b5d3c3dd59032005379997f19eb7993 100644 --- a/sflphone-common/src/dbus/configurationmanager.cpp +++ b/sflphone-common/src/dbus/configurationmanager.cpp @@ -84,45 +84,7 @@ ConfigurationManager::setCredential (const std::string& accountID, const int32_t { _debug ("ConfigurationManager::setCredential received\n"); - std::map<std::string, std::string>::iterator it; - std::map<std::string, std::string> credentialInformation = details; - - std::string credentialIndex; - std::stringstream streamOut; - streamOut << index; - credentialIndex = streamOut.str(); - - std::string section = "Credential" + std::string(":") + accountID + std::string(":") + credentialIndex; - - _debug("Setting credential in section %s\n", section.c_str()); - - it = credentialInformation.find(USERNAME); - if(it == credentialInformation.end()) { - Manager::instance().setConfig (section, USERNAME, EMPTY_FIELD); - } else { - Manager::instance().setConfig (section, USERNAME, it->second); - } - - _debug("Username: %s\n", it->second.c_str()); - - it = credentialInformation.find(PASSWORD); - if(it == credentialInformation.end()) { - Manager::instance().setConfig (section, PASSWORD, EMPTY_FIELD); - } else { - Manager::instance().setConfig (section, PASSWORD, it->second); - } - - _debug("Password: %s\n", it->second.c_str()); - - it = credentialInformation.find(REALM); - if(it == credentialInformation.end()) { - Manager::instance().setConfig (section, REALM, EMPTY_FIELD); - } else { - Manager::instance().setConfig (section, REALM, it->second); - } - - _debug("Realm: %s\n", it->second.c_str()); - + Manager::instance().setCredential(accountID, index, details); } void @@ -322,6 +284,18 @@ ConfigurationManager::getRecordDeviceList() } +bool +ConfigurationManager::isMd5CredentialHashing(void) +{ + return Manager::instance().getMd5CredentialHashing(); +} + +void +ConfigurationManager::setMd5CredentialHashing(const bool& enabled) +{ + Manager::instance().setMd5CredentialHashing(enabled); +} + int32_t ConfigurationManager::isIax2Enabled (void) { diff --git a/sflphone-common/src/dbus/configurationmanager.h b/sflphone-common/src/dbus/configurationmanager.h index 2a74fe448a2d03544737d615d2787b34adf6ade4..191fa3285576da5d9f8b7e0da1cf18423d8a028e 100644 --- a/sflphone-common/src/dbus/configurationmanager.h +++ b/sflphone-common/src/dbus/configurationmanager.h @@ -78,6 +78,8 @@ public: int32_t getAudioManager( void ); void setAudioManager( const int32_t& api ); + bool isMd5CredentialHashing (void); + void setMd5CredentialHashing (const bool& enabled); int32_t isIax2Enabled( void ); int32_t isRingtoneEnabled( void ); void ringtoneEnabled( void ); diff --git a/sflphone-common/src/managerimpl.cpp b/sflphone-common/src/managerimpl.cpp index 1316dac80f387c7df850d7debcc396c4fbebd852..e1963246d24aeb28d2d25bc8cc47218f38ee5e84 100644 --- a/sflphone-common/src/managerimpl.cpp +++ b/sflphone-common/src/managerimpl.cpp @@ -53,6 +53,8 @@ #define fill_config_int(name, value) \ (_config.addConfigTreeItem(section, Conf::ConfigTreeItem(std::string(name), std::string(value), type_int))) +#define MD5_APPEND(pms,buf,len) pj_md5_update(pms, (const pj_uint8_t*)buf, len) + ManagerImpl::ManagerImpl (void) : _hasTriedToRegister (false) , _config() @@ -280,8 +282,6 @@ ManagerImpl::outgoingCall (const std::string& accountid, const CallID& id, const bool ManagerImpl::answerCall (const CallID& id) { - bool isActive = false; - stopTone (true); AccountID currentAccountId; @@ -1359,6 +1359,7 @@ ManagerImpl::initConfigFile (bool load_user_value, std::string alternate) fill_config_int (CONFIG_PA_VOLUME_CTRL , YES_STR); fill_config_int (CONFIG_SIP_PORT, DFT_SIP_PORT); fill_config_str (CONFIG_ACCOUNTS_ORDER, ""); + fill_config_int (CONFIG_MD5HASH, NO_STR); section = ADDRESSBOOK; fill_config_int (ADDRESSBOOK_ENABLE, YES_STR); @@ -1782,6 +1783,22 @@ ManagerImpl::setRecordPath (const std::string& recPath) setConfig (AUDIO, RECORD_PATH, recPath); } +bool +ManagerImpl::getMd5CredentialHashing(void) +{ + return getConfigInt(PREFERENCES, CONFIG_MD5HASH); +} + +void +ManagerImpl::setMd5CredentialHashing(bool enabled) +{ + if (enabled) { + setConfig(PREFERENCES, CONFIG_MD5HASH, YES_STR); + } else { + setConfig(PREFERENCES, CONFIG_MD5HASH, NO_STR); + } +} + int ManagerImpl::getDialpad (void) { @@ -2490,6 +2507,113 @@ std::map< std::string, std::string > ManagerImpl::getAccountDetails (const Accou return a; } +/* Transform digest to string. + * output must be at least PJSIP_MD5STRLEN+1 bytes. + * Helper function taken from sip_auth_client.c in + * pjproject-1.0.3. + * + * NOTE: THE OUTPUT STRING IS NOT NULL TERMINATED! + */ + +void ManagerImpl::digest2str(const unsigned char digest[], char *output) +{ + int i; + for (i = 0; i<16; ++i) { + pj_val_to_hex_digit(digest[i], output); + output += 2; + } +} + +std::string ManagerImpl::computeMd5HashFromCredential(const std::string& username, const std::string& password, const std::string& realm) +{ + pj_md5_context pms; + unsigned char digest[16]; + char ha1[PJSIP_MD5STRLEN]; + + pj_str_t usernamePjFormat = pj_str(strdup(username.c_str())); + pj_str_t passwordPjFormat = pj_str(strdup(password.c_str())); + pj_str_t realmPjFormat = pj_str(strdup(realm.c_str())); + + /* Compute md5 hash = MD5(username ":" realm ":" password) */ + pj_md5_init(&pms); + MD5_APPEND( &pms, usernamePjFormat.ptr, usernamePjFormat.slen); + MD5_APPEND( &pms, ":", 1); + MD5_APPEND( &pms, realmPjFormat.ptr, realmPjFormat.slen); + MD5_APPEND( &pms, ":", 1); + MD5_APPEND( &pms, passwordPjFormat.ptr, passwordPjFormat.slen); + pj_md5_final(&pms, digest); + + digest2str(digest, ha1); + + char ha1_null_terminated[PJSIP_MD5STRLEN+1]; + memcpy(ha1_null_terminated, ha1, sizeof(char)*PJSIP_MD5STRLEN); + ha1_null_terminated[PJSIP_MD5STRLEN] = '\0'; + + std::string hashedDigest = ha1_null_terminated; + return hashedDigest; +} + +void ManagerImpl::setCredential (const std::string& accountID, const int32_t& index, const std::map< std::string, std::string >& details) +{ + std::map<std::string, std::string>::iterator it; + std::map<std::string, std::string> credentialInformation = details; + + std::string credentialIndex; + std::stringstream streamOut; + streamOut << index; + credentialIndex = streamOut.str(); + + std::string section = "Credential" + std::string(":") + accountID + std::string(":") + credentialIndex; + + _debug("Setting credential in section %s\n", section.c_str()); + + it = credentialInformation.find(USERNAME); + std::string username; + if (it == credentialInformation.end()) { + username = EMPTY_FIELD; + } else { + username = it->second; + } + Manager::instance().setConfig (section, USERNAME, username); + + it = credentialInformation.find(REALM); + std::string realm; + if (it == credentialInformation.end()) { + realm = EMPTY_FIELD; + } else { + realm = it->second; + } + Manager::instance().setConfig (section, REALM, realm); + + + it = credentialInformation.find(PASSWORD); + std::string password; + if (it == credentialInformation.end()) { + password = EMPTY_FIELD; + } else { + password = it->second; + } + + if(getMd5CredentialHashing()) { + // TODO: Fix this. + // This is an extremly weak test in order to check + // if the password is a hashed value. This is done + // because deleteCredential() is called before this + // method. Therefore, we cannot check if the value + // is different from the one previously stored in + // the configuration file. + + if(password.length() != 32) { + password = computeMd5HashFromCredential(username, password, realm); + } + } + + Manager::instance().setConfig (section, PASSWORD, password); +} + +//TODO: tidy this up. Make a macro or inline +// method to reduce the if/else mess. + void ManagerImpl::setAccountDetails (const std::string& accountID, const std::map< std::string, std::string >& details) { @@ -2512,22 +2636,61 @@ void ManagerImpl::setAccountDetails (const std::string& accountID, const std::ma ( (iter = map_cpy.find (CONFIG_ACCOUNT_ENABLE)) == map_cpy.end ()) ? setConfig (accountID, CONFIG_ACCOUNT_ENABLE, "0") : setConfig (accountID, CONFIG_ACCOUNT_ENABLE, iter->second == "TRUE" ? "1" : "0"); - + + if(!getMd5CredentialHashing()) { + if((iter = map_cpy.find(AUTHENTICATION_USERNAME)) == map_cpy.end()) + { setConfig (accountID, AUTHENTICATION_USERNAME, EMPTY_FIELD); } + else + { setConfig (accountID, AUTHENTICATION_USERNAME, iter->second); } + + if((iter = map_cpy.find(USERNAME)) == map_cpy.end()) + { setConfig (accountID, USERNAME, EMPTY_FIELD); } + else + { setConfig (accountID, USERNAME, iter->second); } + + if((iter = map_cpy.find(PASSWORD)) == map_cpy.end()) + { setConfig (accountID, PASSWORD, EMPTY_FIELD); } + else + { setConfig (accountID, PASSWORD, iter->second); } + + if((iter = map_cpy.find(REALM)) == map_cpy.end()) + { setConfig (accountID, REALM, EMPTY_FIELD); } + else + { setConfig (accountID, REALM, iter->second); } + } else { + + std::string username; + std::string authenticationName; + std::string password; + std::string realm; + + if((iter = map_cpy.find(AUTHENTICATION_USERNAME)) == map_cpy.end()) { authenticationName = EMPTY_FIELD; } else { authenticationName = iter->second; } + if((iter = map_cpy.find(USERNAME)) == map_cpy.end()) { username = EMPTY_FIELD; } else { username = iter->second; } + if((iter = map_cpy.find(PASSWORD)) == map_cpy.end()) { password = EMPTY_FIELD; } else { password = iter->second; } + if((iter = map_cpy.find(REALM)) == map_cpy.end()) { realm = EMPTY_FIELD; } else { realm = iter->second; } + + // Make sure not to re-hash the password field if + // it is already saved as a MD5 Hash. + // TODO: This test is weak. Fix this. + if ((password.compare(getConfigString(accountID, PASSWORD)) != 0) && (password.length() != 32)) { + _debug("Password sent and password from config are different. Re-hashing\n"); + std::string hash; + if(authenticationName.empty()) { + hash = computeMd5HashFromCredential(username, password, realm); + } else { + hash = computeMd5HashFromCredential(authenticationName, password, realm); + } + setConfig(accountID, PASSWORD, hash); + } + } + ( (iter = map_cpy.find (CONFIG_ACCOUNT_RESOLVE_ONCE)) == map_cpy.end ()) ? setConfig (accountID, CONFIG_ACCOUNT_RESOLVE_ONCE, DFT_RESOLVE_ONCE) : setConfig (accountID, CONFIG_ACCOUNT_RESOLVE_ONCE, iter->second == "TRUE" ? "1" : "0"); - ( (iter = map_cpy.find (USERNAME)) == map_cpy.end ()) ? setConfig (accountID, USERNAME, EMPTY_FIELD) - : setConfig (accountID, USERNAME, iter->second); - - ( (iter = map_cpy.find (PASSWORD)) == map_cpy.end ()) ? setConfig (accountID, PASSWORD, EMPTY_FIELD) - : setConfig (accountID, PASSWORD, iter->second); - ( (iter = map_cpy.find (HOSTNAME)) == map_cpy.end ()) ? setConfig (accountID, HOSTNAME, EMPTY_FIELD) : setConfig (accountID, HOSTNAME, iter->second); - ( (iter = map_cpy.find (REALM)) == map_cpy.end ()) ? setConfig (accountID, REALM, std::string("*")) - : setConfig (accountID, REALM, iter->second); ( (iter = map_cpy.find (CONFIG_ACCOUNT_MAILBOX)) == map_cpy.end ()) ? setConfig (accountID, CONFIG_ACCOUNT_MAILBOX, EMPTY_FIELD) : setConfig (accountID, CONFIG_ACCOUNT_MAILBOX, iter->second); @@ -2535,8 +2698,6 @@ void ManagerImpl::setAccountDetails (const std::string& accountID, const std::ma ( (iter = map_cpy.find (CONFIG_ACCOUNT_REGISTRATION_EXPIRE)) == map_cpy.end ()) ? setConfig (accountID, CONFIG_ACCOUNT_REGISTRATION_EXPIRE, DFT_EXPIRE_VALUE) : setConfig (accountID, CONFIG_ACCOUNT_REGISTRATION_EXPIRE, iter->second); - ( (iter = map_cpy.find (AUTHENTICATION_USERNAME)) == map_cpy.end ()) ? setConfig (accountID, AUTHENTICATION_USERNAME, EMPTY_FIELD) - : setConfig (accountID, AUTHENTICATION_USERNAME, iter->second); saveConfig(); acc = getAccount (accountID); @@ -2545,8 +2706,9 @@ void ManagerImpl::setAccountDetails (const std::string& accountID, const std::ma if (acc->isEnabled()) { acc->unregisterVoIPLink(); acc->registerVoIPLink(); - } else + } else { acc->unregisterVoIPLink(); + } // Update account details to the client side if (_dbus) _dbus->getConfigurationManager()->accountsChanged(); diff --git a/sflphone-common/src/managerimpl.h b/sflphone-common/src/managerimpl.h index 47a825c62047103d3e00193c6124763abfdcacbe..9c05867a93bf62740cedd25b7d0e9831f795bf32 100644 --- a/sflphone-common/src/managerimpl.h +++ b/sflphone-common/src/managerimpl.h @@ -491,6 +491,26 @@ class ManagerImpl { */ void setRecordPath( const std::string& recPath); + /** + * Set a credential for a given account. If it + * does not exist yet, it will be created. + */ + void setCredential (const std::string& accountID, const int32_t& index, const std::map< std::string, std::string >& details); + + /** + * Set whether we should pre-hash the credentials + * in config file. + * + * @param enabled True if hashing should be used, false otherwise. + */ + void setMd5CredentialHashing(bool enabled); + + /** + * Retreive the value set in the configuration file. + * @return True if credentials hashing is enabled. + */ + bool getMd5CredentialHashing(void); + /** * Tells if the user wants to display the dialpad or not * @return int 1 if dialpad has to be displayed @@ -906,6 +926,22 @@ class ManagerImpl { bool initAudioDriver(void); private: + /* Transform digest to string. + * output must be at least PJSIP_MD5STRLEN+1 bytes. + * Helper function taken from sip_auth_client.c in + * pjproject-1.0.3. + * + * NOTE: THE OUTPUT STRING IS NOT NULL TERMINATED! + */ + void digest2str(const unsigned char digest[], char *output); + + /** + * Helper function that creates an MD5 Hash from the credential + * information provided as parameters. The hash is computed as + * MD5(username ":" realm ":" password). + * + */ + std::string computeMd5HashFromCredential(const std::string& username, const std::string& password, const std::string& realm); /** * Check if a process is running with the system command diff --git a/sflphone-common/src/sipaccount.cpp b/sflphone-common/src/sipaccount.cpp index 38f3e8ce8bf29e792add997dc7dcf5883a9aa0d0..a160b99270057bdb34c43db69cb34ed8b4efe3b5 100644 --- a/sflphone-common/src/sipaccount.cpp +++ b/sflphone-common/src/sipaccount.cpp @@ -71,7 +71,17 @@ int SIPAccount::registerVoIPLink() int credentialCount = 0; credentialCount = Manager::instance().getConfigInt (_accountID, CONFIG_CREDENTIAL_NUMBER); credentialCount += 1; - + + int md5HashingEnabled = 0; + int dataType = 0; + md5HashingEnabled = Manager::instance().getConfigInt(PREFERENCES, CONFIG_MD5HASH); + std::string digest; + if (md5HashingEnabled) { + dataType = PJSIP_CRED_DATA_DIGEST; + } else { + dataType = PJSIP_CRED_DATA_PLAIN_PASSWD; + } + pjsip_cred_info * cred_info = (pjsip_cred_info *) malloc(sizeof(pjsip_cred_info)*(credentialCount)); if (cred_info == NULL) { _debug("Failed to set cred_info for account %s\n", _accountID.c_str()); @@ -86,7 +96,7 @@ int SIPAccount::registerVoIPLink() } cred_info[0].data = pj_str(strdup(_password.c_str())); cred_info[0].realm = pj_str(strdup(_realm.c_str())); - cred_info[0].data_type = PJSIP_CRED_DATA_PLAIN_PASSWD; + cred_info[0].data_type = dataType; cred_info[0].scheme = pj_str("digest"); int i; @@ -105,7 +115,7 @@ int SIPAccount::registerVoIPLink() cred_info[i].username = pj_str(strdup(username.c_str())); cred_info[i].data = pj_str(strdup(password.c_str())); cred_info[i].realm = pj_str(strdup(realm.c_str())); - cred_info[i].data_type = PJSIP_CRED_DATA_PLAIN_PASSWD; + cred_info[i].data_type = dataType; cred_info[i].scheme = pj_str("digest"); _debug("Setting credential %d realm = %s passwd = %s username = %s data_type = %d\n", i, realm.c_str(), password.c_str(), username.c_str(), cred_info[i].data_type); diff --git a/sflphone-common/src/user_cfg.h b/sflphone-common/src/user_cfg.h index 09129cb11f4a229d1b7ee94d19c91bde5609d551..6304af81084dd4db15f4158630f5b1ea87fe826e 100644 --- a/sflphone-common/src/user_cfg.h +++ b/sflphone-common/src/user_cfg.h @@ -46,6 +46,7 @@ #define RECORD_PATH "Record.path" /** Recording path */ #define PREFERENCES "Preferences" /** Section Preferences */ +#define CONFIG_MD5HASH "md5Hash" #define CONFIG_DIALPAD "Dialpad.display" /** Display dialpad preferences */ #define CONFIG_SEARCHBAR "Searchbar.display" /** Whether or nor display the search bar */ #define CONFIG_HISTORY_LIMIT "History.limit" /** Set the maximum number of days kept */