Asterisk - The Open Source Telephony Project GIT-master-66c01d8
Functions | Variables
app_privacy.c File Reference

Block all calls without Caller*ID, require phone # to be entered. More...

#include "asterisk.h"
#include "asterisk/lock.h"
#include "asterisk/file.h"
#include "asterisk/utils.h"
#include "asterisk/channel.h"
#include "asterisk/pbx.h"
#include "asterisk/module.h"
#include "asterisk/translate.h"
#include "asterisk/callerid.h"
#include "asterisk/app.h"
#include "asterisk/config.h"
Include dependency graph for app_privacy.c:

Go to the source code of this file.

Functions

static void __reg_module (void)
 
static void __unreg_module (void)
 
struct ast_moduleAST_MODULE_SELF_SYM (void)
 
static int load_module (void)
 
static int privacy_exec (struct ast_channel *chan, const char *data)
 
static int unload_module (void)
 

Variables

static struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_LOAD_ORDER , .description = "Require phone number to be entered, if no CallerID sent" , .key = "This paragraph is copyright (c) 2006 by Digium, Inc. \In order for your module to load, it must return this \key via a function called \"key\". Any code which \includes this paragraph must be licensed under the GNU \General Public License version 2 or later (at your \option). In addition to Digium's general reservations \of rights, Digium expressly reserves the right to \allow other parties to license this paragraph under \different terms. Any use of Digium, Inc. trademarks or \logos (including \"Asterisk\" or \"Digium\") without \express written permission of Digium, Inc. is prohibited.\n" , .buildopt_sum = AST_BUILDOPT_SUM, .load = load_module, .unload = unload_module, .load_pri = AST_MODPRI_DEFAULT, .support_level = AST_MODULE_SUPPORT_CORE, }
 
static char * app = "PrivacyManager"
 
static const struct ast_module_infoast_module_info = &__mod_info
 

Detailed Description

Block all calls without Caller*ID, require phone # to be entered.

Author
Mark Spencer marks.nosp@m.ter@.nosp@m.digiu.nosp@m.m.co.nosp@m.m

Definition in file app_privacy.c.

Function Documentation

◆ __reg_module()

static void __reg_module ( void  )
static

Definition at line 225 of file app_privacy.c.

◆ __unreg_module()

static void __unreg_module ( void  )
static

Definition at line 225 of file app_privacy.c.

◆ AST_MODULE_SELF_SYM()

struct ast_module * AST_MODULE_SELF_SYM ( void  )

Definition at line 225 of file app_privacy.c.

◆ load_module()

static int load_module ( void  )
static

Definition at line 220 of file app_privacy.c.

221{
223}
static int privacy_exec(struct ast_channel *chan, const char *data)
Definition: app_privacy.c:90
static char * app
Definition: app_privacy.c:88
#define ast_register_application_xml(app, execute)
Register an application using XML documentation.
Definition: module.h:640

References app, ast_register_application_xml, and privacy_exec().

◆ privacy_exec()

static int privacy_exec ( struct ast_channel chan,
const char *  data 
)
static

Definition at line 90 of file app_privacy.c.

91{
92 int res=0;
93 int retries;
94 int maxretries = 3;
95 int minlength = 10;
96 int x = 0;
97 char phone[30];
98 char *parse = NULL;
101 AST_APP_ARG(minlength);
103 AST_APP_ARG(checkcontext);
104 );
105
107 && !ast_strlen_zero(ast_channel_caller(chan)->id.number.str)) {
108 ast_verb(3, "CallerID number present: Skipping\n");
109 } else {
110 /*Answer the channel if it is not already*/
111 if (ast_channel_state(chan) != AST_STATE_UP) {
112 if ((res = ast_answer(chan))) {
113 return -1;
114 }
115 }
116
117 parse = ast_strdupa(data);
118
120
121 if (!ast_strlen_zero(args.maxretries)) {
122 if (sscanf(args.maxretries, "%30d", &x) == 1 && x > 0) {
123 maxretries = x;
124 } else {
125 ast_log(LOG_WARNING, "Invalid max retries argument: '%s'\n", args.maxretries);
126 }
127 }
128 if (!ast_strlen_zero(args.minlength)) {
129 if (sscanf(args.minlength, "%30d", &x) == 1 && x > 0) {
130 minlength = x;
131 } else {
132 ast_log(LOG_WARNING, "Invalid min length argument: '%s'\n", args.minlength);
133 }
134 }
135
136 /* Play unidentified call */
137 res = ast_safe_sleep(chan, 1000);
138 if (!res) {
139 res = ast_streamfile(chan, "privacy-unident", ast_channel_language(chan));
140 }
141 if (!res) {
142 res = ast_waitstream(chan, "");
143 }
144
145 /* Ask for 10 digit number, give 3 attempts */
146 for (retries = 0; retries < maxretries; retries++) {
147 if (!res) {
148 res = ast_streamfile(chan, "privacy-prompt", ast_channel_language(chan));
149 }
150 if (!res) {
151 res = ast_waitstream(chan, "");
152 }
153
154 if (!res) {
155 res = ast_readstring(chan, phone, sizeof(phone) - 1, /* digit timeout ms */ 3200, /* first digit timeout */ 5000, "#");
156 }
157
158 if (res < 0) {
159 break;
160 }
161
162 /* Make sure we get at least digits */
163 if (strlen(phone) >= minlength ) {
164 /* if we have a checkcontext argument, do pattern matching */
165 if (!ast_strlen_zero(args.checkcontext)) {
166 if (!ast_exists_extension(NULL, args.checkcontext, phone, 1, NULL)) {
167 res = ast_streamfile(chan, "privacy-incorrect", ast_channel_language(chan));
168 if (!res) {
169 res = ast_waitstream(chan, "");
170 }
171 } else {
172 break;
173 }
174 } else {
175 break;
176 }
177 } else {
178 res = ast_streamfile(chan, "privacy-incorrect", ast_channel_language(chan));
179 if (!res) {
180 res = ast_waitstream(chan, "");
181 }
182 }
183 }
184
185 /* Got a number, play sounds and send them on their way */
186 if ((retries < maxretries) && res >= 0) {
187 res = ast_streamfile(chan, "privacy-thankyou", ast_channel_language(chan));
188 if (!res) {
189 res = ast_waitstream(chan, "");
190 }
191
192 /*
193 * This is a caller entered number that is going to be used locally.
194 * Therefore, the given number presentation is allowed and should
195 * be passed out to other channels. This is the point of the
196 * privacy application.
197 */
200 ast_channel_caller(chan)->id.number.plan = 0;/* Unknown */
201
202 ast_set_callerid(chan, phone, "Privacy Manager", NULL);
203
204 ast_verb(3, "Changed Caller*ID number to '%s'\n", phone);
205
206 pbx_builtin_setvar_helper(chan, "PRIVACYMGRSTATUS", "SUCCESS");
207 } else {
208 pbx_builtin_setvar_helper(chan, "PRIVACYMGRSTATUS", "FAILED");
209 }
210 }
211
212 return 0;
213}
#define ast_strdupa(s)
duplicate a string in memory from the stack
Definition: astmm.h:298
#define ast_log
Definition: astobj2.c:42
#define AST_PRES_ALLOWED_USER_NUMBER_NOT_SCREENED
Definition: callerid.h:437
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:7355
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:6575
int ast_answer(struct ast_channel *chan)
Answer a channel.
Definition: channel.c:2834
int ast_safe_sleep(struct ast_channel *chan, int ms)
Wait for a specified amount of time, looking for hangups.
Definition: channel.c:1601
ast_channel_state
ast_channel states
Definition: channelstate.h:35
@ AST_STATE_UP
Definition: channelstate.h:42
int ast_streamfile(struct ast_channel *c, const char *filename, const char *preflang)
Streams a file.
Definition: file.c:1301
int ast_waitstream(struct ast_channel *c, const char *breakon)
Waits for a stream to stop or digit to be pressed.
Definition: file.c:1848
#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.
#define ast_verb(level,...)
#define LOG_WARNING
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:4190
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:216
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
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:157
const char * args
static struct test_options options

References args, ast_answer(), AST_APP_ARG, ast_channel_caller(), ast_channel_language(), AST_DECLARE_APP_ARGS, ast_exists_extension(), ast_log, AST_PRES_ALLOWED_USER_NUMBER_NOT_SCREENED, ast_readstring(), ast_safe_sleep(), ast_set_callerid(), AST_STANDARD_APP_ARGS, AST_STATE_UP, ast_strdupa, ast_streamfile(), ast_strlen_zero(), ast_verb, ast_waitstream(), ast_party_caller::id, LOG_WARNING, maxretries, ast_party_id::name, NULL, ast_party_id::number, options, pbx_builtin_setvar_helper(), phone, ast_party_number::plan, ast_party_name::presentation, ast_party_number::presentation, and ast_party_number::valid.

Referenced by load_module().

◆ unload_module()

static int unload_module ( void  )
static

Definition at line 215 of file app_privacy.c.

216{
218}
int ast_unregister_application(const char *app)
Unregister an application.
Definition: pbx_app.c:392

References app, and ast_unregister_application().

Variable Documentation

◆ __mod_info

struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_LOAD_ORDER , .description = "Require phone number to be entered, if no CallerID sent" , .key = "This paragraph is copyright (c) 2006 by Digium, Inc. \In order for your module to load, it must return this \key via a function called \"key\". Any code which \includes this paragraph must be licensed under the GNU \General Public License version 2 or later (at your \option). In addition to Digium's general reservations \of rights, Digium expressly reserves the right to \allow other parties to license this paragraph under \different terms. Any use of Digium, Inc. trademarks or \logos (including \"Asterisk\" or \"Digium\") without \express written permission of Digium, Inc. is prohibited.\n" , .buildopt_sum = AST_BUILDOPT_SUM, .load = load_module, .unload = unload_module, .load_pri = AST_MODPRI_DEFAULT, .support_level = AST_MODULE_SUPPORT_CORE, }
static

Definition at line 225 of file app_privacy.c.

◆ app

char* app = "PrivacyManager"
static

Definition at line 88 of file app_privacy.c.

Referenced by load_module(), and unload_module().

◆ ast_module_info

const struct ast_module_info* ast_module_info = &__mod_info
static

Definition at line 225 of file app_privacy.c.