diff --git a/src/include/switch_apr.h b/src/include/switch_apr.h index eccfc8dd65..8e98893eda 100644 --- a/src/include/switch_apr.h +++ b/src/include/switch_apr.h @@ -510,6 +510,7 @@ SWITCH_DECLARE(switch_status_t) switch_thread_cond_destroy(switch_thread_cond_t #define SWITCH_UUID_FORMATTED_LENGTH 36 #define SWITCH_MD5_DIGESTSIZE 16 +#define SWITCH_MD5_DIGEST_STRING_SIZE 33 /** * Format a UUID into a string, following the standard format @@ -540,6 +541,7 @@ SWITCH_DECLARE(switch_status_t) switch_uuid_parse(switch_uuid_t *uuid, const cha * @param inputLen The length of the message block */ SWITCH_DECLARE(switch_status_t) switch_md5(unsigned char digest[SWITCH_MD5_DIGESTSIZE], const void *input, switch_size_t inputLen); +SWITCH_DECLARE(switch_status_t) switch_md5_string(char digest_str[SWITCH_MD5_DIGEST_STRING_SIZE], const void *input, switch_size_t inputLen); /** @} */ diff --git a/src/mod/applications/mod_commands/mod_commands.c b/src/mod/applications/mod_commands/mod_commands.c index 38e5452de7..0e49e644f2 100644 --- a/src/mod/applications/mod_commands/mod_commands.c +++ b/src/mod/applications/mod_commands/mod_commands.c @@ -192,6 +192,22 @@ static switch_status_t _find_user(const char *cmd, switch_core_session_t *sessio return SWITCH_STATUS_SUCCESS; } + + +SWITCH_STANDARD_API(md5_function) +{ + char digest[SWITCH_MD5_DIGEST_STRING_SIZE] = { 0 }; + + if (switch_strlen_zero(cmd)) { + stream->write_function(stream, "%s", "!err!"); + } else { + switch_md5_string(digest, (void *) cmd, strlen(cmd)); + stream->write_function(stream, "%s", digest); + } + + return SWITCH_STATUS_SUCCESS; +} + SWITCH_STANDARD_API(url_decode_function) { char *reply = ""; @@ -2725,6 +2741,7 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_commands_load) switch_api_interface_t *commands_api_interface; *module_interface = switch_loadable_module_create_module_interface(pool, modname); + SWITCH_ADD_API(commands_api_interface, "md5", "md5", md5_function, "<data>"); SWITCH_ADD_API(commands_api_interface, "hupall", "hupall", hupall_api_function, "<cause> [<var> <value>]"); SWITCH_ADD_API(commands_api_interface, "strftime_tz", "strftime_tz", strftime_tz_api_function, "<Timezone_name> [format string]"); SWITCH_ADD_API(commands_api_interface, "originate", "Originate a Call", originate_function, ORIGINATE_SYNTAX); diff --git a/src/mod/applications/mod_voicemail/mod_voicemail.c b/src/mod/applications/mod_voicemail/mod_voicemail.c index bfb93bf972..e61162b541 100644 --- a/src/mod/applications/mod_voicemail/mod_voicemail.c +++ b/src/mod/applications/mod_voicemail/mod_voicemail.c @@ -2003,9 +2003,9 @@ static void voicemail_check_main(switch_core_session_t *session, const char *pro if (!auth && (thepass || thehash) && mypass) { if (thehash) { - unsigned char digest[SWITCH_MD5_DIGESTSIZE] = { 0 }; + char digest[SWITCH_MD5_DIGEST_STRING_SIZE] = { 0 }; char *lpbuf = switch_mprintf("%s:%s:%s", myid, domain_name, mypass); - switch_md5(digest, (void *) lpbuf, strlen(lpbuf)); + switch_md5_string(digest, (void *) lpbuf, strlen(lpbuf)); if (!strcmp(digest, thehash)) { auth++; } diff --git a/src/switch_apr.c b/src/switch_apr.c index 0afb5a3625..d46b8608d0 100644 --- a/src/switch_apr.c +++ b/src/switch_apr.c @@ -813,6 +813,20 @@ SWITCH_DECLARE(switch_status_t) switch_md5(unsigned char digest[SWITCH_MD5_DIGES return apr_md5(digest, input, inputLen); } +SWITCH_DECLARE(switch_status_t) switch_md5_string(char digest_str[SWITCH_MD5_DIGEST_STRING_SIZE], const void *input, switch_size_t inputLen) +{ + unsigned char digest[SWITCH_MD5_DIGESTSIZE]; + apr_status_t status = apr_md5(digest, input, inputLen); + int x; + + digest_str[SWITCH_MD5_DIGEST_STRING_SIZE - 1] = '\0'; + + for( x = 0; x < SWITCH_MD5_DIGESTSIZE; x++) { + switch_snprintf(digest_str + (x * 2), 3, "%02x", digest[x]); + } + + return status; +} /* FIFO queues (apr-util) */