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