aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkpfleming <kpfleming@f38db490-d61c-443f-a65b-d21fe96a405b>2005-05-04 04:05:34 +0000
committerkpfleming <kpfleming@f38db490-d61c-443f-a65b-d21fe96a405b>2005-05-04 04:05:34 +0000
commitce9a0b7459733b1c74d196f6076fdd77858596a9 (patch)
treeef383426d6a691d67f95b3285a996b13754ccd21
parent1d2cc0bca445bdfd8a45920b6f52553215ca5414 (diff)
add MD5 and CHECK_MD5 functions, deprecate MD5 and MD5Check apps (bug #4123)
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@5567 f38db490-d61c-443f-a65b-d21fe96a405b
-rwxr-xr-xapps/app_md5.c12
-rwxr-xr-xpbx.c62
-rwxr-xr-xutils.c21
3 files changed, 85 insertions, 10 deletions
diff --git a/apps/app_md5.c b/apps/app_md5.c
index dfc8dd5db..369e683b2 100755
--- a/apps/app_md5.c
+++ b/apps/app_md5.c
@@ -48,6 +48,12 @@ static int md5_exec(struct ast_channel *chan, void *data)
char *varname= NULL; /* Variable to set */
char *string = NULL; /* String to calculate on */
char retvar[50]; /* Return value */
+ static int dep_warning = 0;
+
+ if (!dep_warning) {
+ ast_log(LOG_WARNING, "This application has been deprecated, please use the MD5 function instead.\n");
+ dep_warning = 1;
+ }
if (!data) {
ast_log(LOG_WARNING, "Syntax: md5(<varname>=<string>) - missing argument!\n");
@@ -77,7 +83,13 @@ static int md5check_exec(struct ast_channel *chan, void *data)
char *hash= NULL; /* Hash to compare with */
char *string = NULL; /* String to calculate on */
char newhash[50]; /* Return value */
+ static int dep_warning = 0;
+ if (!dep_warning) {
+ ast_log(LOG_WARNING, "This application has been deprecated, please use the CHECK_MD5 function instead.\n");
+ dep_warning = 1;
+ }
+
if (!data) {
ast_log(LOG_WARNING, "Syntax: MD5Check(<md5hash>,<string>) - missing argument!\n");
return -1;
diff --git a/pbx.c b/pbx.c
index bf9db3d0a..311ab075f 100755
--- a/pbx.c
+++ b/pbx.c
@@ -1370,6 +1370,51 @@ static char *builtin_function_regex(struct ast_channel *chan, char *cmd, char *d
return ret;
}
+static char *builtin_function_md5(struct ast_channel *chan, char *cmd, char *data, char *buf, size_t len)
+{
+ char md5[33];
+
+ if (!data || ast_strlen_zero(data)) {
+ ast_log(LOG_WARNING, "Syntax: MD5(<data>) - missing argument!\n");
+ return NULL;
+ }
+
+ ast_md5_hash(md5, data);
+ ast_copy_string(buf, md5, len);
+
+ return buf;
+}
+
+static char *builtin_function_checkmd5(struct ast_channel *chan, char *cmd, char *data, char *buf, size_t len)
+{
+ int argc;
+ char *argv[2];
+ char *args;
+ char newmd5[33];
+
+ if (!data || ast_strlen_zero(data)) {
+ ast_log(LOG_WARNING, "Syntax: CHECK_MD5(<digest>,<data>) - missing argument!\n");
+ return NULL;
+ }
+
+ args = ast_strdupa(data);
+ argc = ast_separate_app_args(args, '|', argv, sizeof(argv) / sizeof(argv[0]));
+
+ if (argc < 2) {
+ ast_log(LOG_WARNING, "Syntax: CHECK_MD5(<digest>,<data>) - missing argument!\n");
+ return NULL;
+ }
+
+ ast_md5_hash(newmd5, argv[1]);
+
+ if (!strcasecmp(newmd5, argv[0])) /* they match */
+ ast_copy_string(buf, "1", len);
+ else
+ ast_copy_string(buf, "0", len);
+
+ return buf;
+}
+
static void pbx_substitute_variables_helper_full(struct ast_channel *c, const char *cp1, char *cp2, int count, struct varshead *headp)
{
char *cp4;
@@ -3554,6 +3599,21 @@ static struct ast_custom_function_obj cdr_function = {
.write = builtin_function_cdr_write,
};
+static struct ast_custom_function_obj md5_function = {
+ .name = "MD5",
+ .desc = "Computes an MD5 digest",
+ .syntax = "MD5(<data>)",
+ .read = builtin_function_md5,
+ .write = NULL,
+};
+
+static struct ast_custom_function_obj checkmd5_function = {
+ .name = "CHECK_MD5",
+ .desc = "Checks an MD5 digest. Returns 1 on a match, 0 otherwise",
+ .syntax = "CHECK_MD5(<digest>,<data>)",
+ .read = builtin_function_checkmd5,
+ .write = NULL,
+};
/*
* CLI entries for upper commands ...
@@ -6000,6 +6060,8 @@ int load_pbx(void)
ast_custom_function_register(&env_function);
ast_custom_function_register(&len_function);
ast_custom_function_register(&cdr_function);
+ ast_custom_function_register(&md5_function);
+ ast_custom_function_register(&checkmd5_function);
/* Register builtin applications */
for (x=0; x<sizeof(builtins) / sizeof(struct pbx_builtin); x++) {
diff --git a/utils.c b/utils.c
index e83d86fca..f5fe76e20 100755
--- a/utils.c
+++ b/utils.c
@@ -252,16 +252,17 @@ int test_for_thread_safety(void)
/*--- ast_md5_hash: Produce 16 char MD5 hash of value. ---*/
void ast_md5_hash(char *output, char *input)
{
- struct MD5Context md5;
- unsigned char digest[16];
- char *ptr;
- int x;
- MD5Init(&md5);
- MD5Update(&md5, input, strlen(input));
- MD5Final(digest, &md5);
- ptr = output;
- for (x=0;x<16;x++)
- ptr += sprintf(ptr, "%2.2x", digest[x]);
+ struct MD5Context md5;
+ unsigned char digest[16];
+ char *ptr;
+ int x;
+
+ MD5Init(&md5);
+ MD5Update(&md5, input, strlen(input));
+ MD5Final(digest, &md5);
+ ptr = output;
+ for (x=0; x<16; x++)
+ ptr += sprintf(ptr, "%2.2x", digest[x]);
}
int ast_base64decode(unsigned char *dst, char *src, int max)