dom mar 16 23:37:23 CET 2003
[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 <string.h>
26 #include <stdlib.h>
27 #include <pthread.h>
28
29 static char *tdesc = "Require phone number to be entered, if no CallerID sent";
30
31 static char *app = "PrivacyManager";
32
33 static char *synopsis = "Require phone number to be entered, if no CallerID sent";
34
35 static char *descrip =
36   "  PrivacyManager: If no Caller*ID is sent, PrivacyManager answers the\n"
37   "channel and asks the caller to enter their 10 digit phone number.\n"
38   "The caller is given 3 attempts.  If after 3 attempts, they do no enter\n"
39   "their 10 digit phone number, and if there exists a priority n + 101,\n"
40   "where 'n' is the priority of the current instance, then  the\n"
41   "channel  will  be  setup  to continue at that priority level.\n"
42   "Otherwise, it returns 0.  Does nothing if Caller*ID was received on the\n"
43   "channel.\n";
44
45 STANDARD_LOCAL_USER;
46
47 LOCAL_USER_DECL;
48
49 static int
50 privacy_exec (struct ast_channel *chan, void *data)
51 {
52         int res=0;
53         int retries;
54         char phone[10];
55         char new_cid[144];
56         struct localuser *u;
57
58         LOCAL_USER_ADD (u);
59         if (chan->callerid)
60         {
61                 if (option_verbose > 2)
62                         ast_verbose (VERBOSE_PREFIX_3 "CallerID Present: Skipping\n");
63         }
64         else
65         {
66                 /*Answer the channel if it is not already*/
67                 if (chan->_state != AST_STATE_UP) {
68                         res = ast_answer(chan);
69                         if (res) {
70                                 LOCAL_USER_REMOVE(u);
71                                 return -1;
72                         }
73                 }
74                 /*Just a quick sleep*/
75                 sleep(1);
76                 
77                 /*Play unidentified call*/
78                 res = ast_streamfile(chan, "privacy-unident", chan->language);
79                 if (!res)
80                         res = ast_waitstream(chan, "");
81
82                 /*Ask for 10 digit number, give 3 attempts*/
83                 for (retries = 0; retries < 3; retries++) {
84                         res = ast_app_getdata(chan, "privacy-prompt", phone, sizeof(phone), 0);
85                         if (res < 0)
86                                 break;
87
88                         /*Make sure we get 10 digits*/
89                         if (strlen(phone) == 10) 
90                                 break;
91                         else {
92                                 res = ast_streamfile(chan, "privacy-incorrect", chan->language);
93                                 if (!res)
94                                         res = ast_waitstream(chan, "");
95                         }
96                 }
97                 
98                 /*Got a number, play sounds and send them on their way*/
99                 if ((retries < 3) && !res) {
100                         res = ast_streamfile(chan, "privacy-thankyou", chan->language);
101                         if (!res)
102                                 res = ast_waitstream(chan, "");
103                         snprintf (new_cid, sizeof (new_cid), "\"%s\" <%s>", "Privacy Manager", phone);
104                         ast_set_callerid (chan, new_cid, 0);
105                         if (option_verbose > 2)
106                                 ast_verbose (VERBOSE_PREFIX_3 "Changed Caller*ID to %s\n",new_cid);
107                 } else {
108                         /*Send the call to n+101 priority, where n is the current priority*/
109                         if (ast_exists_extension(chan, chan->context, chan->exten, chan->priority + 101, chan->callerid))
110                                 chan->priority+=100;
111                 }
112         }
113
114   LOCAL_USER_REMOVE (u);
115   return 0;
116 }
117
118 int
119 unload_module (void)
120 {
121   STANDARD_HANGUP_LOCALUSERS;
122   return ast_unregister_application (app);
123 }
124
125 int
126 load_module (void)
127 {
128   return ast_register_application (app, privacy_exec, synopsis,
129                                    descrip);
130 }
131
132 char *
133 description (void)
134 {
135   return tdesc;
136 }
137
138 int
139 usecount (void)
140 {
141   int res;
142   STANDARD_USECOUNT (res);
143   return res;
144 }
145
146 char *
147 key ()
148 {
149   return ASTERISK_GPL_KEY;
150 }