Index: apps/app_md5.c =================================================================== RCS file: /usr/cvsroot/asterisk/apps/app_md5.c,v retrieving revision 1.1 diff -u -r1.1 app_md5.c --- apps/app_md5.c 18 Feb 2005 05:29:31 -0000 1.1 +++ apps/app_md5.c 18 Feb 2005 16:10:50 -0000 @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -20,16 +21,25 @@ #include #include -static char *tdesc = "MD5 checksum application"; +static char *tdesc_md5 = "MD5 checksum application"; static char *app_md5 = "md5"; -static char *synopsis = +static char *synopsis_md5 = " md5(=): Calculates a MD5 checksum on .\n" "Returns hash value in a channel variable. Always return 0\n"; +static char *tdesc_md5check = "MD5 checksum verification application"; +static char *app_md5check = "md5check"; +static char *synopsis_md5check = +" md5check(,): Calculates a MD5 checksum on \n" +"and compares it with the hash. Returns 0 if is correct for .\n" +"Jumps to priority+101 if incorrect.\n"; + STANDARD_LOCAL_USER; LOCAL_USER_DECL; +/*--- md5_exec: Calculate MD5 checksum (hash) on given string and + return it in channel variable ---*/ static int md5_exec(struct ast_channel *chan, void *data) { int res=0; @@ -57,20 +67,69 @@ return res; } +/*--- md5check_exec: Calculate MD5 checksum and compare it with + existing checksum. ---*/ +static int md5check_exec(struct ast_channel *chan, void *data) +{ + int res=0; + struct localuser *u; + char *hash= NULL; /* Hash to compare with */ + char *string = NULL; /* String to calculate on */ + char newhash[50]; /* Return value */ + + if (!data) { + ast_log(LOG_WARNING, "Syntax: md5check(,) - missing argument!\n"); + return -1; + } + LOCAL_USER_ADD(u); + memset(newhash,0, sizeof(newhash)); + + string = ast_strdupa(data); + hash = strsep(&string,"|"); + if (ast_strlen_zero(hash)) { + ast_log(LOG_WARNING, "Syntax: md5check(,) - missing argument!\n"); + LOCAL_USER_REMOVE(u); + return -1; + } + ast_md5_hash(newhash, string); + if (!strcmp(newhash, hash)) { /* Verification ok */ + if (option_debug > 2) + ast_log(LOG_DEBUG, "MD5 verified ok: %s -- %s\n", hash, string); + LOCAL_USER_REMOVE(u); + return 0; + } + if (option_debug > 2) + ast_log(LOG_DEBUG, "ERROR: MD5 not verified: %s -- %s\n", hash, string); + if (ast_exists_extension(chan, chan->context, chan->exten, chan->priority + 101, chan->cid.cid_num)) + chan->priority += 100; + else if (option_debug > 2) + ast_log(LOG_DEBUG, "ERROR: Can't jump to exten+101 (e%s,p%d), sorry\n", chan->exten,chan->priority+101); + LOCAL_USER_REMOVE(u); + return res; +} + int unload_module(void) { + int res; + STANDARD_HANGUP_LOCALUSERS; - return ast_unregister_application(app_md5); + res =ast_unregister_application(app_md5); + res |= ast_unregister_application(app_md5check); + return res; } int load_module(void) { - return ast_register_application(app_md5, md5_exec, synopsis, tdesc); + int res; + + res = ast_register_application(app_md5check, md5check_exec, synopsis_md5check, tdesc_md5check); + res |= ast_register_application(app_md5, md5_exec, synopsis_md5, tdesc_md5); + return res; } char *description(void) { - return tdesc; + return tdesc_md5; } int usecount(void)