From fd0b9cc522a2c1b8c5e35cede42322b6ae72795b Mon Sep 17 00:00:00 2001 From: Mark Spencer <markster@digium.com> Date: Sun, 12 Dec 2004 01:24:35 +0000 Subject: [PATCH] Merge privacy enhancements (bug #2091) git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@4433 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- apps/app_privacy.c | 36 ++++++++++++++++++++++++++++-------- sounds.txt | 2 +- sounds/privacy-prompt.gsm | Bin 6930 -> 5973 bytes 3 files changed, 29 insertions(+), 9 deletions(-) diff --git a/apps/app_privacy.c b/apps/app_privacy.c index 2972ee73aa..8cfbd88f31 100755 --- a/apps/app_privacy.c +++ b/apps/app_privacy.c @@ -36,27 +36,34 @@ static char *synopsis = "Require phone number to be entered, if no CallerID sent static char *descrip = " PrivacyManager: If no Caller*ID is sent, PrivacyManager answers the\n" - "channel and asks the caller to enter their 10 digit phone number.\n" + "channel and asks the caller to enter their phone number.\n" "The caller is given 3 attempts. If after 3 attempts, they do not enter\n" - "their 10 digit phone number, and if there exists a priority n + 101,\n" + "at least a 10 digit phone number, and if there exists a priority n + 101,\n" "where 'n' is the priority of the current instance, then the\n" "channel will be setup to continue at that priority level.\n" "Otherwise, it returns 0. Does nothing if Caller*ID was received on the\n" - "channel.\n"; + "channel.\n" + " Configuration file privacy.conf contains two variables:\n" + " maxretries default 3 -maximum number of attempts the caller is allowed to input a callerid.\n" + " minlength default 10 -minimum allowable digits in the input callerid number.\n" +; STANDARD_LOCAL_USER; LOCAL_USER_DECL; + + static int privacy_exec (struct ast_channel *chan, void *data) { int res=0; int retries; int maxretries = 3; + int minlength = 10; int x; char *s; - char phone[10]; + char phone[30]; char new_cid[144]; struct localuser *u; struct ast_config *cfg; @@ -95,16 +102,29 @@ privacy_exec (struct ast_channel *chan, void *data) ast_log(LOG_WARNING, "Invalid max retries argument\n"); } } + if (cfg && (s = ast_variable_retrieve(cfg, "general", "minlength"))) { + if (sscanf(s, "%d", &x) == 1) { + minlength = x; + } else { + ast_log(LOG_WARNING, "Invalid min length argument\n"); + } + } /*Ask for 10 digit number, give 3 attempts*/ for (retries = 0; retries < maxretries; retries++) { if (!res) - res = ast_app_getdata(chan, "privacy-prompt", phone, sizeof(phone), 0); + res = ast_streamfile(chan, "privacy-prompt", chan->language); + if (!res) + res = ast_waitstream(chan, ""); + + if (!res ) + res = ast_readstring(chan, phone, sizeof(phone) - 1, /* digit timeout ms */ 3200, /* first digit timeout */ 5000, "#"); + if (res < 0) break; - /*Make sure we get 10 digits*/ - if (strlen(phone) == 10) + /*Make sure we get at least digits*/ + if (strlen(phone) >= minlength ) break; else { res = ast_streamfile(chan, "privacy-incorrect", chan->language); @@ -114,7 +134,7 @@ privacy_exec (struct ast_channel *chan, void *data) } /*Got a number, play sounds and send them on their way*/ - if ((retries < maxretries) && !res) { + if ((retries < maxretries) && res == 1 ) { res = ast_streamfile(chan, "privacy-thankyou", chan->language); if (!res) res = ast_waitstream(chan, ""); diff --git a/sounds.txt b/sounds.txt index 411e6614be..976101f0c5 100755 --- a/sounds.txt +++ b/sounds.txt @@ -246,7 +246,7 @@ %privacy-unident.gsm%The party you are trying to reach does not accept unidentified calls. -%privacy-prompt.gsm%Please enter your 10 digit phone number, starting with the area code. +%privacy-prompt.gsm%Please enter your phone number, starting with the area code. %privacy-incorrect.gsm%I'm sorry, that number is not valid. diff --git a/sounds/privacy-prompt.gsm b/sounds/privacy-prompt.gsm index 97f2fca615f311f35df92648f3a64944edc7d74e..24fdf83a1ea2b95ac4f0d74b15b007e62e9ed601 100755 GIT binary patch literal 5973 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 a=@LlR0PGORXOFuCKLhsJ0|OIa;Qt5O5iTYG literal 6930 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 -- GitLab