Asterisk - The Open Source Telephony Project GIT-master-27fb039
Loading...
Searching...
No Matches
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 = ASTERISK_GPL_KEY , .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:7346
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:6553
int ast_answer(struct ast_channel *chan)
Answer a channel.
Definition channel.c:2803
int ast_safe_sleep(struct ast_channel *chan, int ms)
Wait for a specified amount of time, looking for hangups.
Definition channel.c:1560
ast_channel_state
ast_channel states
@ AST_STATE_UP
int ast_streamfile(struct ast_channel *c, const char *filename, const char *preflang)
Streams a file.
Definition file.c:1312
int ast_waitstream(struct ast_channel *c, const char *breakon)
Waits for a stream to stop or digit to be pressed.
Definition file.c:1874
#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:4196
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
static struct @519 args
#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.
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 = ASTERISK_GPL_KEY , .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.