Asterisk - The Open Source Telephony Project GIT-master-f36a736
app_privacy.c
Go to the documentation of this file.
1/*
2 * Asterisk -- An open source telephony toolkit.
3 *
4 * Copyright (C) 1999 - 2005, Digium, Inc.
5 *
6 * Mark Spencer <markster@digium.com>
7 *
8 * See http://www.asterisk.org for more information about
9 * the Asterisk project. Please do not directly contact
10 * any of the maintainers of this project for assistance;
11 * the project provides a web site, mailing lists and IRC
12 * channels for your use.
13 *
14 * This program is free software, distributed under the terms of
15 * the GNU General Public License Version 2. See the LICENSE file
16 * at the top of the source tree.
17 */
18
19/*! \file
20 *
21 * \brief Block all calls without Caller*ID, require phone # to be entered
22 *
23 * \author Mark Spencer <markster@digium.com>
24 *
25 * \ingroup applications
26 */
27
28/*** MODULEINFO
29 <support_level>core</support_level>
30 ***/
31
32#include "asterisk.h"
33
34#include "asterisk/lock.h"
35#include "asterisk/file.h"
36#include "asterisk/utils.h"
37#include "asterisk/channel.h"
38#include "asterisk/pbx.h"
39#include "asterisk/module.h"
40#include "asterisk/translate.h"
41#include "asterisk/callerid.h"
42#include "asterisk/app.h"
43#include "asterisk/config.h"
44
45/*** DOCUMENTATION
46 <application name="PrivacyManager" language="en_US">
47 <synopsis>
48 Require phone number to be entered, if no CallerID sent
49 </synopsis>
50 <syntax>
51 <parameter name="maxretries">
52 <para>Total tries caller is allowed to input a callerid. Defaults to <literal>3</literal>.</para>
53 </parameter>
54 <parameter name="minlength">
55 <para>Minimum allowable digits in the input callerid number. Defaults to <literal>10</literal>.</para>
56 </parameter>
57 <parameter name="options">
58 <para>Position reserved for options.</para>
59 </parameter>
60 <parameter name="context">
61 <para>Context to check the given callerid against patterns.</para>
62 </parameter>
63 </syntax>
64 <description>
65 <para>If no Caller*ID is sent, PrivacyManager answers the channel and asks
66 the caller to enter their phone number. The caller is given
67 <replaceable>maxretries</replaceable> attempts to do so. The application does
68 <emphasis>nothing</emphasis> if Caller*ID was received on the channel.</para>
69 <para>The application sets the following channel variable upon completion:</para>
70 <variablelist>
71 <variable name="PRIVACYMGRSTATUS">
72 <para>The status of the privacy manager's attempt to collect a phone number from the user.</para>
73 <value name="SUCCESS"/>
74 <value name="FAILED"/>
75 </variable>
76 </variablelist>
77 </description>
78 <see-also>
79 <ref type="application">Zapateller</ref>
80 </see-also>
81 </application>
82 ***/
83
84
85static char *app = "PrivacyManager";
86
87static int privacy_exec(struct ast_channel *chan, const char *data)
88{
89 int res=0;
90 int retries;
91 int maxretries = 3;
92 int minlength = 10;
93 int x = 0;
94 char phone[30];
95 char *parse = NULL;
98 AST_APP_ARG(minlength);
100 AST_APP_ARG(checkcontext);
101 );
102
104 && !ast_strlen_zero(ast_channel_caller(chan)->id.number.str)) {
105 ast_verb(3, "CallerID number present: Skipping\n");
106 } else {
107 /*Answer the channel if it is not already*/
108 if (ast_channel_state(chan) != AST_STATE_UP) {
109 if ((res = ast_answer(chan))) {
110 return -1;
111 }
112 }
113
114 parse = ast_strdupa(data);
115
117
118 if (!ast_strlen_zero(args.maxretries)) {
119 if (sscanf(args.maxretries, "%30d", &x) == 1 && x > 0) {
120 maxretries = x;
121 } else {
122 ast_log(LOG_WARNING, "Invalid max retries argument: '%s'\n", args.maxretries);
123 }
124 }
125 if (!ast_strlen_zero(args.minlength)) {
126 if (sscanf(args.minlength, "%30d", &x) == 1 && x > 0) {
127 minlength = x;
128 } else {
129 ast_log(LOG_WARNING, "Invalid min length argument: '%s'\n", args.minlength);
130 }
131 }
132
133 /* Play unidentified call */
134 res = ast_safe_sleep(chan, 1000);
135 if (!res) {
136 res = ast_streamfile(chan, "privacy-unident", ast_channel_language(chan));
137 }
138 if (!res) {
139 res = ast_waitstream(chan, "");
140 }
141
142 /* Ask for 10 digit number, give 3 attempts */
143 for (retries = 0; retries < maxretries; retries++) {
144 if (!res) {
145 res = ast_streamfile(chan, "privacy-prompt", ast_channel_language(chan));
146 }
147 if (!res) {
148 res = ast_waitstream(chan, "");
149 }
150
151 if (!res) {
152 res = ast_readstring(chan, phone, sizeof(phone) - 1, /* digit timeout ms */ 3200, /* first digit timeout */ 5000, "#");
153 }
154
155 if (res < 0) {
156 break;
157 }
158
159 /* Make sure we get at least digits */
160 if (strlen(phone) >= minlength ) {
161 /* if we have a checkcontext argument, do pattern matching */
162 if (!ast_strlen_zero(args.checkcontext)) {
163 if (!ast_exists_extension(NULL, args.checkcontext, phone, 1, NULL)) {
164 res = ast_streamfile(chan, "privacy-incorrect", ast_channel_language(chan));
165 if (!res) {
166 res = ast_waitstream(chan, "");
167 }
168 } else {
169 break;
170 }
171 } else {
172 break;
173 }
174 } else {
175 res = ast_streamfile(chan, "privacy-incorrect", ast_channel_language(chan));
176 if (!res) {
177 res = ast_waitstream(chan, "");
178 }
179 }
180 }
181
182 /* Got a number, play sounds and send them on their way */
183 if ((retries < maxretries) && res >= 0) {
184 res = ast_streamfile(chan, "privacy-thankyou", ast_channel_language(chan));
185 if (!res) {
186 res = ast_waitstream(chan, "");
187 }
188
189 /*
190 * This is a caller entered number that is going to be used locally.
191 * Therefore, the given number presentation is allowed and should
192 * be passed out to other channels. This is the point of the
193 * privacy application.
194 */
197 ast_channel_caller(chan)->id.number.plan = 0;/* Unknown */
198
199 ast_set_callerid(chan, phone, "Privacy Manager", NULL);
200
201 ast_verb(3, "Changed Caller*ID number to '%s'\n", phone);
202
203 pbx_builtin_setvar_helper(chan, "PRIVACYMGRSTATUS", "SUCCESS");
204 } else {
205 pbx_builtin_setvar_helper(chan, "PRIVACYMGRSTATUS", "FAILED");
206 }
207 }
208
209 return 0;
210}
211
212static int unload_module(void)
213{
215}
216
217static int load_module(void)
218{
220}
221
222AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Require phone number to be entered, if no CallerID sent");
static int privacy_exec(struct ast_channel *chan, const char *data)
Definition: app_privacy.c:87
static char * app
Definition: app_privacy.c:85
static int load_module(void)
Definition: app_privacy.c:217
static int unload_module(void)
Definition: app_privacy.c:212
Asterisk main include file. File version handling, generic pbx functions.
#define ast_strdupa(s)
duplicate a string in memory from the stack
Definition: astmm.h:298
#define ast_log
Definition: astobj2.c:42
CallerID (and other GR30) management and generation Includes code and algorithms from the Zapata libr...
#define AST_PRES_ALLOWED_USER_NUMBER_NOT_SCREENED
Definition: callerid.h:437
General Asterisk PBX channel definitions.
void ast_set_callerid(struct ast_channel *chan, const char *cid_num, const char *cid_name, const char *cid_ani)
Set caller ID number, name and ANI and generate AMI event.
Definition: channel.c:7356
const char * ast_channel_language(const struct ast_channel *chan)
struct ast_party_caller * ast_channel_caller(struct ast_channel *chan)
int ast_readstring(struct ast_channel *c, char *s, int len, int timeout, int rtimeout, char *enders)
Reads multiple digits.
Definition: channel.c:6577
int ast_answer(struct ast_channel *chan)
Answer a channel.
Definition: channel.c:2824
int ast_safe_sleep(struct ast_channel *chan, int ms)
Wait for a specified amount of time, looking for hangups.
Definition: channel.c:1593
ast_channel_state
ast_channel states
Definition: channelstate.h:35
@ AST_STATE_UP
Definition: channelstate.h:42
Generic File Format Support. Should be included by clients of the file handling routines....
int ast_streamfile(struct ast_channel *c, const char *filename, const char *preflang)
Streams a file.
Definition: file.c:1293
int ast_waitstream(struct ast_channel *c, const char *breakon)
Waits for a stream to stop or digit to be pressed.
Definition: file.c:1840
Application convenience functions, designed to give consistent look and feel to Asterisk apps.
#define AST_APP_ARG(name)
Define an application argument.
#define AST_DECLARE_APP_ARGS(name, arglist)
Declare a structure to hold an application's arguments.
#define AST_STANDARD_APP_ARGS(args, parse)
Performs the 'standard' argument separation process for an application.
Configuration File Parser.
#define ast_verb(level,...)
#define LOG_WARNING
Asterisk locking-related definitions:
Asterisk module definitions.
#define AST_MODULE_INFO_STANDARD(keystr, desc)
Definition: module.h:581
#define ASTERISK_GPL_KEY
The text the key() function should return.
Definition: module.h:46
int ast_unregister_application(const char *app)
Unregister an application.
Definition: pbx_app.c:392
#define ast_register_application_xml(app, execute)
Register an application using XML documentation.
Definition: module.h:640
Core PBX routines and definitions.
int ast_exists_extension(struct ast_channel *c, const char *context, const char *exten, int priority, const char *callerid)
Determine whether an extension exists.
Definition: pbx.c:4175
int pbx_builtin_setvar_helper(struct ast_channel *chan, const char *name, const char *value)
Add a variable to the channel variable stack, removing the most recently set value for the same name.
static char phone[80]
Definition: pbx_dundi.c:207
static int maxretries
Definition: res_adsi.c:60
#define NULL
Definition: resample.c:96
static force_inline int attribute_pure ast_strlen_zero(const char *s)
Definition: strings.h:65
Main Channel structure associated with a channel.
struct ast_party_id id
Caller party ID.
Definition: channel.h:422
struct ast_party_name name
Subscriber name.
Definition: channel.h:342
struct ast_party_number number
Subscriber phone number.
Definition: channel.h:344
int presentation
Q.931 encoded presentation-indicator encoded field.
Definition: channel.h:279
int presentation
Q.931 presentation-indicator and screening-indicator encoded fields.
Definition: channel.h:297
unsigned char valid
TRUE if the number information is valid/present.
Definition: channel.h:299
int plan
Q.931 Type-Of-Number and Numbering-Plan encoded fields.
Definition: channel.h:295
Number structure.
Definition: app_followme.c:154
const char * args
static struct test_options options
Support for translation of data formats. translate.c.
Utility functions.