issue #5605
[asterisk/asterisk.git] / apps / app_md5.c
1 /*
2  * Asterisk -- An open source telephony toolkit.
3  *
4  * Copyright (C) 2005, Olle E. Johansson, Edvina.net
5  *
6  * See http://www.asterisk.org for more information about
7  * the Asterisk project. Please do not directly contact
8  * any of the maintainers of this project for assistance;
9  * the project provides a web site, mailing lists and IRC
10  * channels for your use.
11  *
12  * This program is free software, distributed under the terms of
13  * the GNU General Public License Version 2. See the LICENSE file
14  * at the top of the source tree.
15  */
16
17
18 /*! \file
19  *
20  * \brief MD5 checksum application
21  * 
22  * \todo Remove this deprecated application in 1.3dev
23  * \ingroup applications
24  */
25
26 #include <stdlib.h>
27 #include <unistd.h>
28 #include <string.h>
29
30 #include "asterisk.h"
31
32 ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
33
34 #include "asterisk/file.h"
35 #include "asterisk/logger.h"
36 #include "asterisk/utils.h"
37 #include "asterisk/options.h"
38 #include "asterisk/channel.h"
39 #include "asterisk/pbx.h"
40 #include "asterisk/module.h"
41 #include "asterisk/lock.h"
42
43 static char *tdesc_md5 = "MD5 checksum applications";
44 static char *app_md5 = "MD5";
45 static char *desc_md5 = "Calculate MD5 checksum";
46 static char *synopsis_md5 = 
47 "  MD5(<var>=<string>): Calculates a MD5 checksum on <string>.\n"
48 "Returns hash value in a channel variable. Always return 0\n";
49
50 static char *app_md5check = "MD5Check";
51 static char *desc_md5check = "Check MD5 checksum";
52 static char *synopsis_md5check = 
53 "  MD5Check(<md5hash>,<string>): Calculates a MD5 checksum on <string>\n"
54 "and compares it with the hash. Returns 0 if <md5hash> is correct for <string>.\n"
55 "Jumps to priority+101 if incorrect.\n";
56
57 STANDARD_LOCAL_USER;
58
59 LOCAL_USER_DECL;
60
61 /*--- md5_exec: Calculate MD5 checksum (hash) on given string and
62         return it in channel variable ---*/
63 static int md5_exec(struct ast_channel *chan, void *data)
64 {
65         int res=0;
66         struct localuser *u;
67         char *varname= NULL; /* Variable to set */
68         char *string = NULL; /* String to calculate on */
69         char retvar[50]; /* Return value */
70         static int dep_warning = 0;
71
72         if (!dep_warning) {
73                 ast_log(LOG_WARNING, "This application has been deprecated, please use the MD5 function instead.\n");
74                 dep_warning = 1;
75         }       
76
77         if (ast_strlen_zero(data)) {
78                 ast_log(LOG_WARNING, "Syntax: md5(<varname>=<string>) - missing argument!\n");
79                 return -1;
80         }
81         
82         LOCAL_USER_ADD(u);
83
84         memset(retvar,0, sizeof(retvar));
85         string = ast_strdupa(data);
86         varname = strsep(&string,"=");
87         if (ast_strlen_zero(varname)) {
88                 ast_log(LOG_WARNING, "Syntax: md5(<varname>=<string>) - missing argument!\n");
89                 LOCAL_USER_REMOVE(u);
90                 return -1;
91         }
92         ast_md5_hash(retvar, string);
93         pbx_builtin_setvar_helper(chan, varname, retvar);
94         LOCAL_USER_REMOVE(u);
95         return res;
96 }
97
98 /*--- md5check_exec: Calculate MD5 checksum and compare it with
99         existing checksum. ---*/
100 static int md5check_exec(struct ast_channel *chan, void *data)
101 {
102         int res=0;
103         struct localuser *u;
104         char *hash= NULL; /* Hash to compare with */
105         char *string = NULL; /* String to calculate on */
106         char newhash[50]; /* Return value */
107         static int dep_warning = 0;
108
109         if (!dep_warning) {
110                 ast_log(LOG_WARNING, "This application has been deprecated, please use the CHECK_MD5 function instead.\n");
111                 dep_warning = 1;
112         }
113         
114         if (ast_strlen_zero(data)) {
115                 ast_log(LOG_WARNING, "Syntax: MD5Check(<md5hash>,<string>) - missing argument!\n");
116                 return -1;
117         }
118         
119         LOCAL_USER_ADD(u);
120         
121         memset(newhash,0, sizeof(newhash));
122
123         string = ast_strdupa(data);
124         hash = strsep(&string,"|");
125         if (ast_strlen_zero(hash)) {
126                 ast_log(LOG_WARNING, "Syntax: MD5Check(<md5hash>,<string>) - missing argument!\n");
127                 LOCAL_USER_REMOVE(u);
128                 return -1;
129         }
130         ast_md5_hash(newhash, string);
131         if (!strcmp(newhash, hash)) {   /* Verification ok */
132                 if (option_debug > 2)
133                         ast_log(LOG_DEBUG, "MD5 verified ok: %s -- %s\n", hash, string);
134                 LOCAL_USER_REMOVE(u);
135                 return 0;
136         }
137         if (option_debug > 2)
138                 ast_log(LOG_DEBUG, "ERROR: MD5 not verified: %s -- %s\n", hash, string);
139         if (!ast_goto_if_exists(chan, chan->context, chan->exten, chan->priority + 101))
140                 if (option_debug > 2)
141                         ast_log(LOG_DEBUG, "ERROR: Can't jump to exten+101 (e%s,p%d), sorry\n", chan->exten,chan->priority+101);
142         LOCAL_USER_REMOVE(u);
143         return res;
144 }
145
146 int unload_module(void)
147 {
148         int res;
149
150         res = ast_unregister_application(app_md5);
151         res |= ast_unregister_application(app_md5check);
152
153         STANDARD_HANGUP_LOCALUSERS;
154
155         return res;
156 }
157
158 int load_module(void)
159 {
160         int res;
161
162         res = ast_register_application(app_md5check, md5check_exec, desc_md5check, synopsis_md5check);
163         res |= ast_register_application(app_md5, md5_exec, desc_md5, synopsis_md5);
164         
165         return res;
166 }
167
168 char *description(void)
169 {
170         return tdesc_md5;
171 }
172
173 int usecount(void)
174 {
175         int res;
176         STANDARD_USECOUNT(res);
177         return res;
178 }
179
180 char *key()
181 {
182         return ASTERISK_GPL_KEY;
183 }