00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include <stdlib.h>
00027 #include <stdio.h>
00028 #include <string.h>
00029 #include <unistd.h>
00030
00031 #include "asterisk.h"
00032
00033 ASTERISK_FILE_VERSION(__FILE__, "$Revision: 7221 $")
00034
00035 #include "asterisk/file.h"
00036 #include "asterisk/logger.h"
00037 #include "asterisk/utils.h"
00038 #include "asterisk/options.h"
00039 #include "asterisk/channel.h"
00040 #include "asterisk/pbx.h"
00041 #include "asterisk/module.h"
00042 #include "asterisk/lock.h"
00043 #include "asterisk/app.h"
00044
00045 static char *tdesc_md5 = "MD5 checksum applications";
00046 static char *app_md5 = "MD5";
00047 static char *desc_md5 = "Calculate MD5 checksum";
00048 static char *synopsis_md5 =
00049 " MD5(<var>=<string>): Calculates a MD5 checksum on <string>.\n"
00050 "Returns hash value in a channel variable. \n";
00051
00052 static char *app_md5check = "MD5Check";
00053 static char *desc_md5check = "Check MD5 checksum";
00054 static char *synopsis_md5check =
00055 " MD5Check(<md5hash>|<string>[|options]): Calculates a MD5 checksum on <string>\n"
00056 "and compares it with the hash. Returns 0 if <md5hash> is correct for <string>.\n"
00057 "The option string may contain zero or more of the following characters:\n"
00058 " 'j' -- jump to priority n+101 if the hash and string do not match \n"
00059 "This application sets the following channel variable upon completion:\n"
00060 " CHECKMD5STATUS The status of the MD5 check, one of the following\n"
00061 " MATCH | NOMATCH\n";
00062
00063 STANDARD_LOCAL_USER;
00064
00065 LOCAL_USER_DECL;
00066
00067
00068
00069 static int md5_exec(struct ast_channel *chan, void *data)
00070 {
00071 int res=0;
00072 struct localuser *u;
00073 char *varname= NULL;
00074 char *string = NULL;
00075 char retvar[50];
00076 static int dep_warning = 0;
00077
00078 if (!dep_warning) {
00079 ast_log(LOG_WARNING, "This application has been deprecated, please use the MD5 function instead.\n");
00080 dep_warning = 1;
00081 }
00082
00083 if (ast_strlen_zero(data)) {
00084 ast_log(LOG_WARNING, "Syntax: md5(<varname>=<string>) - missing argument!\n");
00085 return -1;
00086 }
00087
00088 LOCAL_USER_ADD(u);
00089
00090 memset(retvar,0, sizeof(retvar));
00091 string = ast_strdupa(data);
00092 varname = strsep(&string,"=");
00093 if (ast_strlen_zero(varname)) {
00094 ast_log(LOG_WARNING, "Syntax: md5(<varname>=<string>) - missing argument!\n");
00095 LOCAL_USER_REMOVE(u);
00096 return -1;
00097 }
00098 ast_md5_hash(retvar, string);
00099 pbx_builtin_setvar_helper(chan, varname, retvar);
00100 LOCAL_USER_REMOVE(u);
00101 return res;
00102 }
00103
00104
00105
00106 static int md5check_exec(struct ast_channel *chan, void *data)
00107 {
00108 int res=0;
00109 struct localuser *u;
00110 char *string = NULL;
00111 char newhash[50];
00112 static int dep_warning = 0;
00113 int priority_jump = 0;
00114 AST_DECLARE_APP_ARGS(args,
00115 AST_APP_ARG(md5hash);
00116 AST_APP_ARG(string);
00117 AST_APP_ARG(options);
00118 );
00119
00120 if (!dep_warning) {
00121 ast_log(LOG_WARNING, "This application has been deprecated, please use the CHECK_MD5 function instead.\n");
00122 dep_warning = 1;
00123 }
00124
00125 LOCAL_USER_ADD(u);
00126
00127 if (!(string = ast_strdupa(data))) {
00128 ast_log(LOG_WARNING, "Memory Error!\n");
00129 LOCAL_USER_REMOVE(u);
00130 return -1;
00131 }
00132
00133 AST_STANDARD_APP_ARGS(args, string);
00134
00135 if (args.options) {
00136 if (strchr(args.options, 'j'))
00137 priority_jump = 1;
00138 }
00139
00140 if (ast_strlen_zero(args.md5hash) || ast_strlen_zero(args.string)) {
00141 ast_log(LOG_WARNING, "Syntax: MD5Check(<md5hash>|<string>[|options]) - missing argument!\n");
00142 LOCAL_USER_REMOVE(u);
00143 return -1;
00144 }
00145
00146 memset(newhash,0, sizeof(newhash));
00147
00148 ast_md5_hash(newhash, args.string);
00149 if (!strcmp(newhash, args.md5hash)) {
00150 if (option_debug > 2)
00151 ast_log(LOG_DEBUG, "MD5 verified ok: %s -- %s\n", args.md5hash, args.string);
00152 pbx_builtin_setvar_helper(chan, "CHECKMD5STATUS", "MATCH");
00153 LOCAL_USER_REMOVE(u);
00154 return 0;
00155 }
00156 if (option_debug > 2)
00157 ast_log(LOG_DEBUG, "ERROR: MD5 not verified: %s -- %s\n", args.md5hash, args.string);
00158 pbx_builtin_setvar_helper(chan, "CHECKMD5STATUS", "NOMATCH");
00159 if (priority_jump || option_priority_jumping) {
00160 if (ast_goto_if_exists(chan, chan->context, chan->exten, chan->priority + 101))
00161 if (option_debug > 2)
00162 ast_log(LOG_DEBUG, "Can't jump to exten+101 (e%s,p%d), sorry\n", chan->exten,chan->priority+101);
00163 }
00164 LOCAL_USER_REMOVE(u);
00165 return res;
00166 }
00167
00168 int unload_module(void)
00169 {
00170 int res;
00171
00172 res = ast_unregister_application(app_md5);
00173 res |= ast_unregister_application(app_md5check);
00174
00175 STANDARD_HANGUP_LOCALUSERS;
00176
00177 return res;
00178 }
00179
00180 int load_module(void)
00181 {
00182 int res;
00183
00184 res = ast_register_application(app_md5check, md5check_exec, desc_md5check, synopsis_md5check);
00185 res |= ast_register_application(app_md5, md5_exec, desc_md5, synopsis_md5);
00186
00187 return res;
00188 }
00189
00190 char *description(void)
00191 {
00192 return tdesc_md5;
00193 }
00194
00195 int usecount(void)
00196 {
00197 int res;
00198 STANDARD_USECOUNT(res);
00199 return res;
00200 }
00201
00202 char *key()
00203 {
00204 return ASTERISK_GPL_KEY;
00205 }