fix spelling
[asterisk/asterisk.git] / apps / app_privacy.c
1 /*
2  * Asterisk -- A telephony toolkit for Linux.
3  *
4  * Block all calls without Caller*ID, require phone # to be entered
5  * 
6  * Copyright (C) 1999, Mark Spencer
7  *
8  * Mark Spencer <markster@linux-support.net>
9  *
10  * This program is free software, distributed under the terms of
11  * the GNU General Public License
12  */
13
14 #include <asterisk/lock.h>
15 #include <asterisk/file.h>
16 #include <asterisk/logger.h>
17 #include <asterisk/options.h>
18 #include <asterisk/channel.h>
19 #include <asterisk/pbx.h>
20 #include <asterisk/module.h>
21 #include <asterisk/translate.h>
22 #include <asterisk/image.h>
23 #include <asterisk/callerid.h>
24 #include <asterisk/app.h>
25 #include <asterisk/config.h>
26 #include <string.h>
27 #include <stdlib.h>
28 #include <pthread.h>
29
30 #define PRIV_CONFIG "privacy.conf"
31
32 static char *tdesc = "Require phone number to be entered, if no CallerID sent";
33
34 static char *app = "PrivacyManager";
35
36 static char *synopsis = "Require phone number to be entered, if no CallerID sent";
37
38 static char *descrip =
39   "  PrivacyManager: If no Caller*ID is sent, PrivacyManager answers the\n"
40   "channel and asks the caller to enter their 10 digit phone number.\n"
41   "The caller is given 3 attempts.  If after 3 attempts, they do not enter\n"
42   "their 10 digit phone number, and if there exists a priority n + 101,\n"
43   "where 'n' is the priority of the current instance, then  the\n"
44   "channel  will  be  setup  to continue at that priority level.\n"
45   "Otherwise, it returns 0.  Does nothing if Caller*ID was received on the\n"
46   "channel.\n";
47
48 STANDARD_LOCAL_USER;
49
50 LOCAL_USER_DECL;
51
52 static int
53 privacy_exec (struct ast_channel *chan, void *data)
54 {
55         int res=0;
56         int retries;
57         int maxretries = 3;
58         int x;
59         char *s;
60         char phone[10];
61         char new_cid[144];
62         struct localuser *u;
63         struct ast_config *cfg;
64
65         LOCAL_USER_ADD (u);
66         if (chan->callerid)
67         {
68                 if (option_verbose > 2)
69                         ast_verbose (VERBOSE_PREFIX_3 "CallerID Present: Skipping\n");
70         }
71         else
72         {
73                 /*Answer the channel if it is not already*/
74                 if (chan->_state != AST_STATE_UP) {
75                         res = ast_answer(chan);
76                         if (res) {
77                                 LOCAL_USER_REMOVE(u);
78                                 return -1;
79                         }
80                 }
81                 /*Read in the config file*/
82                 cfg = ast_load(PRIV_CONFIG);
83                 
84                 
85                 /*Play unidentified call*/
86                 res = ast_safe_sleep(chan, 1000);
87                 if (!res)
88                         res = ast_streamfile(chan, "privacy-unident", chan->language);
89                 if (!res)
90                         res = ast_waitstream(chan, "");
91
92         if (cfg && (s = ast_variable_retrieve(cfg, "general", "maxretries"))) {
93                 if (sscanf(s, "%d", &x) == 1) {
94                         maxretries = x;
95                 } else {
96                         ast_log(LOG_WARNING, "Invalid max retries argument\n");
97                 }
98         }
99                         
100                 /*Ask for 10 digit number, give 3 attempts*/
101                 for (retries = 0; retries < maxretries; retries++) {
102                         if (!res)
103                                 res = ast_app_getdata(chan, "privacy-prompt", phone, sizeof(phone), 0);
104                         if (res < 0)
105                                 break;
106
107                         /*Make sure we get 10 digits*/
108                         if (strlen(phone) == 10) 
109                                 break;
110                         else {
111                                 res = ast_streamfile(chan, "privacy-incorrect", chan->language);
112                                 if (!res)
113                                         res = ast_waitstream(chan, "");
114                         }
115                 }
116                 
117                 /*Got a number, play sounds and send them on their way*/
118                 if ((retries < maxretries) && !res) {
119                         res = ast_streamfile(chan, "privacy-thankyou", chan->language);
120                         if (!res)
121                                 res = ast_waitstream(chan, "");
122                         snprintf (new_cid, sizeof (new_cid), "\"%s\" <%s>", "Privacy Manager", phone);
123                         ast_set_callerid (chan, new_cid, 0);
124                         if (option_verbose > 2)
125                                 ast_verbose (VERBOSE_PREFIX_3 "Changed Caller*ID to %s\n",new_cid);
126                 } else {
127                         /*Send the call to n+101 priority, where n is the current priority*/
128                         if (ast_exists_extension(chan, chan->context, chan->exten, chan->priority + 101, chan->callerid))
129                                 chan->priority+=100;
130                 }
131                 if (cfg) 
132                         ast_destroy(cfg);
133         }
134
135   LOCAL_USER_REMOVE (u);
136   return 0;
137 }
138
139 int
140 unload_module (void)
141 {
142   STANDARD_HANGUP_LOCALUSERS;
143   return ast_unregister_application (app);
144 }
145
146 int
147 load_module (void)
148 {
149   return ast_register_application (app, privacy_exec, synopsis,
150                                    descrip);
151 }
152
153 char *
154 description (void)
155 {
156   return tdesc;
157 }
158
159 int
160 usecount (void)
161 {
162   int res;
163   STANDARD_USECOUNT (res);
164   return res;
165 }
166
167 char *
168 key ()
169 {
170   return ASTERISK_GPL_KEY;
171 }