Files
asterisk/apps/app_privacy.c
T

223 lines
6.2 KiB
C
Raw Normal View History

2003-02-27 06:00:12 +00:00
/*
* Asterisk -- An open source telephony toolkit.
2003-02-27 06:00:12 +00:00
*
2005-01-21 07:06:25 +00:00
* Copyright (C) 1999 - 2005, Digium, Inc.
2003-02-27 06:00:12 +00:00
*
* Mark Spencer <markster@digium.com>
2003-02-27 06:00:12 +00:00
*
* See http://www.asterisk.org for more information about
* the Asterisk project. Please do not directly contact
* any of the maintainers of this project for assistance;
* the project provides a web site, mailing lists and IRC
* channels for your use.
*
2003-02-27 06:00:12 +00:00
* This program is free software, distributed under the terms of
* the GNU General Public License Version 2. See the LICENSE file
* at the top of the source tree.
*/
/*! \file
*
* \brief Block all calls without Caller*ID, require phone # to be entered
2005-12-30 21:18:06 +00:00
*
* \author Mark Spencer <markster@digium.com>
*
2005-11-06 15:09:47 +00:00
* \ingroup applications
2003-02-27 06:00:12 +00:00
*/
2011-07-14 20:28:54 +00:00
/*** MODULEINFO
<support_level>core</support_level>
***/
2005-06-06 22:39:32 +00:00
#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"
2003-02-27 06:00:12 +00:00
2008-11-01 21:10:07 +00:00
/*** DOCUMENTATION
<application name="PrivacyManager" language="en_US">
<synopsis>
Require phone number to be entered, if no CallerID sent
</synopsis>
<syntax>
<parameter name="maxretries">
<para>Total tries caller is allowed to input a callerid. Defaults to <literal>3</literal>.</para>
</parameter>
<parameter name="minlength">
<para>Minimum allowable digits in the input callerid number. Defaults to <literal>10</literal>.</para>
</parameter>
2011-05-27 22:09:03 +00:00
<parameter name="options">
<para>Position reserved for options.</para>
</parameter>
2008-11-01 21:10:07 +00:00
<parameter name="context">
<para>Context to check the given callerid against patterns.</para>
</parameter>
</syntax>
<description>
<para>If no Caller*ID is sent, PrivacyManager answers the channel and asks
the caller to enter their phone number. The caller is given
<replaceable>maxretries</replaceable> attempts to do so. The application does
<emphasis>nothing</emphasis> if Caller*ID was received on the channel.</para>
<para>The application sets the following channel variable upon completion:</para>
<variablelist>
<variable name="PRIVACYMGRSTATUS">
<para>The status of the privacy manager's attempt to collect a phone number from the user.</para>
<value name="SUCCESS"/>
<value name="FAILED"/>
</variable>
</variablelist>
</description>
2008-11-05 14:37:07 +00:00
<see-also>
<ref type="application">Zapateller</ref>
</see-also>
2008-11-01 21:10:07 +00:00
</application>
***/
2003-02-27 06:00:12 +00:00
2008-11-01 21:10:07 +00:00
static char *app = "PrivacyManager";
2003-02-27 06:00:12 +00:00
static int privacy_exec(struct ast_channel *chan, const char *data)
2003-02-27 06:00:12 +00:00
{
int res=0;
int retries;
2003-03-26 21:52:26 +00:00
int maxretries = 3;
2004-12-12 01:24:35 +00:00
int minlength = 10;
2005-11-07 23:03:28 +00:00
int x = 0;
2004-12-12 01:24:35 +00:00
char phone[30];
2005-11-07 23:03:28 +00:00
char *parse = NULL;
AST_DECLARE_APP_ARGS(args,
AST_APP_ARG(maxretries);
AST_APP_ARG(minlength);
2011-05-27 21:34:04 +00:00
AST_APP_ARG(options);
2011-05-27 22:09:03 +00:00
AST_APP_ARG(checkcontext);
2005-11-07 23:03:28 +00:00
);
2003-02-27 06:00:12 +00:00
2012-02-29 16:52:47 +00:00
if (ast_channel_caller(chan)->id.number.valid
&& !ast_strlen_zero(ast_channel_caller(chan)->id.number.str)) {
2010-07-14 15:48:36 +00:00
ast_verb(3, "CallerID number present: Skipping\n");
} else {
2003-02-27 06:00:12 +00:00
/*Answer the channel if it is not already*/
if (ast_channel_state(chan) != AST_STATE_UP) {
if ((res = ast_answer(chan))) {
2003-02-27 06:00:12 +00:00
return -1;
}
2003-02-27 06:00:12 +00:00
}
2005-11-07 23:03:28 +00:00
2011-01-20 16:12:35 +00:00
parse = ast_strdupa(data);
2005-11-07 23:03:28 +00:00
AST_STANDARD_APP_ARGS(args, parse);
if (!ast_strlen_zero(args.maxretries)) {
if (sscanf(args.maxretries, "%30d", &x) == 1 && x > 0) {
maxretries = x;
} else {
ast_log(LOG_WARNING, "Invalid max retries argument: '%s'\n", args.maxretries);
2005-11-07 23:03:28 +00:00
}
}
if (!ast_strlen_zero(args.minlength)) {
if (sscanf(args.minlength, "%30d", &x) == 1 && x > 0) {
minlength = x;
} else {
ast_log(LOG_WARNING, "Invalid min length argument: '%s'\n", args.minlength);
2005-11-07 23:03:28 +00:00
}
}
2005-11-07 23:03:28 +00:00
/* Play unidentified call */
res = ast_safe_sleep(chan, 1000);
if (!res) {
2012-01-24 20:12:09 +00:00
res = ast_streamfile(chan, "privacy-unident", ast_channel_language(chan));
}
if (!res) {
2003-02-27 06:00:12 +00:00
res = ast_waitstream(chan, "");
}
2003-02-27 06:00:12 +00:00
/* Ask for 10 digit number, give 3 attempts */
2003-03-26 21:52:26 +00:00
for (retries = 0; retries < maxretries; retries++) {
if (!res) {
2012-01-24 20:12:09 +00:00
res = ast_streamfile(chan, "privacy-prompt", ast_channel_language(chan));
}
if (!res) {
2004-12-12 01:24:35 +00:00
res = ast_waitstream(chan, "");
}
2004-12-12 01:24:35 +00:00
if (!res) {
2004-12-12 01:24:35 +00:00
res = ast_readstring(chan, phone, sizeof(phone) - 1, /* digit timeout ms */ 3200, /* first digit timeout */ 5000, "#");
}
2004-12-12 01:24:35 +00:00
if (res < 0) {
2003-02-27 06:00:12 +00:00
break;
}
2003-02-27 06:00:12 +00:00
/* Make sure we get at least digits */
if (strlen(phone) >= minlength ) {
/* if we have a checkcontext argument, do pattern matching */
if (!ast_strlen_zero(args.checkcontext)) {
if (!ast_exists_extension(NULL, args.checkcontext, phone, 1, NULL)) {
2012-01-24 20:12:09 +00:00
res = ast_streamfile(chan, "privacy-incorrect", ast_channel_language(chan));
if (!res) {
res = ast_waitstream(chan, "");
}
} else {
break;
}
} else {
break;
}
} else {
2012-01-24 20:12:09 +00:00
res = ast_streamfile(chan, "privacy-incorrect", ast_channel_language(chan));
if (!res) {
2003-02-27 06:00:12 +00:00
res = ast_waitstream(chan, "");
}
2003-02-27 06:00:12 +00:00
}
}
/* Got a number, play sounds and send them on their way */
if ((retries < maxretries) && res >= 0) {
2012-01-24 20:12:09 +00:00
res = ast_streamfile(chan, "privacy-thankyou", ast_channel_language(chan));
if (!res) {
2003-02-27 06:00:12 +00:00
res = ast_waitstream(chan, "");
}
2006-05-02 02:24:58 +00:00
2010-07-14 15:48:36 +00:00
/*
* This is a caller entered number that is going to be used locally.
* Therefore, the given number presentation is allowed and should
* be passed out to other channels. This is the point of the
* privacy application.
2006-05-02 02:24:58 +00:00
*/
2012-02-29 16:52:47 +00:00
ast_channel_caller(chan)->id.name.presentation = AST_PRES_ALLOWED_USER_NUMBER_NOT_SCREENED;
ast_channel_caller(chan)->id.number.presentation = AST_PRES_ALLOWED_USER_NUMBER_NOT_SCREENED;
ast_channel_caller(chan)->id.number.plan = 0;/* Unknown */
2010-07-14 15:48:36 +00:00
ast_set_callerid(chan, phone, "Privacy Manager", NULL);
2006-05-02 02:24:58 +00:00
2010-07-14 15:48:36 +00:00
ast_verb(3, "Changed Caller*ID number to '%s'\n", phone);
2005-11-07 23:03:28 +00:00
pbx_builtin_setvar_helper(chan, "PRIVACYMGRSTATUS", "SUCCESS");
2003-02-27 06:00:12 +00:00
} else {
2005-11-07 23:03:28 +00:00
pbx_builtin_setvar_helper(chan, "PRIVACYMGRSTATUS", "FAILED");
2003-02-27 06:00:12 +00:00
}
}
return 0;
2003-02-27 06:00:12 +00:00
}
static int unload_module(void)
2003-02-27 06:00:12 +00:00
{
return ast_unregister_application(app);
2003-02-27 06:00:12 +00:00
}
static int load_module(void)
2003-02-27 06:00:12 +00:00
{
2008-11-01 21:10:07 +00:00
return ast_register_application_xml(app, privacy_exec);
2003-02-27 06:00:12 +00:00
}
AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Require phone number to be entered, if no CallerID sent");