Merge privacy enhancements (bug #2091)
[asterisk/asterisk.git] / apps / app_privacy.c
index 8db778e..8cfbd88 100755 (executable)
@@ -3,9 +3,9 @@
  *
  * Block all calls without Caller*ID, require phone # to be entered
  * 
  *
  * Block all calls without Caller*ID, require phone # to be entered
  * 
- * Copyright (C) 1999, Mark Spencer
+ * Copyright (C) 1999-2004, Digium, Inc.
  *
  *
- * Mark Spencer <markster@linux-support.net>
+ * Mark Spencer <markster@digium.com>
  *
  * This program is free software, distributed under the terms of
  * the GNU General Public License
  *
  * This program is free software, distributed under the terms of
  * the GNU General Public License
@@ -25,7 +25,6 @@
 #include <asterisk/config.h>
 #include <string.h>
 #include <stdlib.h>
 #include <asterisk/config.h>
 #include <string.h>
 #include <stdlib.h>
-#include <pthread.h>
 
 #define PRIV_CONFIG "privacy.conf"
 
 
 #define PRIV_CONFIG "privacy.conf"
 
@@ -37,33 +36,40 @@ 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"
 
 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"
-  "The caller is given 3 attempts.  If after 3 attempts, they do no enter\n"
-  "their 10 digit phone number, and if there exists a priority n + 101,\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"
+  "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"
   "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;
 
 
 STANDARD_LOCAL_USER;
 
 LOCAL_USER_DECL;
 
+
+
 static int
 privacy_exec (struct ast_channel *chan, void *data)
 {
        int res=0;
        int retries;
        int maxretries = 3;
 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;
        int x;
        char *s;
-       char phone[10];
+       char phone[30];
        char new_cid[144];
        struct localuser *u;
        struct ast_config *cfg;
 
        LOCAL_USER_ADD (u);
        char new_cid[144];
        struct localuser *u;
        struct ast_config *cfg;
 
        LOCAL_USER_ADD (u);
-       if (chan->callerid)
+       if (chan->cid.cid_num)
        {
                if (option_verbose > 2)
                        ast_verbose (VERBOSE_PREFIX_3 "CallerID Present: Skipping\n");
        {
                if (option_verbose > 2)
                        ast_verbose (VERBOSE_PREFIX_3 "CallerID Present: Skipping\n");
@@ -96,16 +102,29 @@ privacy_exec (struct ast_channel *chan, void *data)
                         ast_log(LOG_WARNING, "Invalid max retries argument\n");
                 }
         }
                         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)
                        
                /*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;
 
                        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);
                                break;
                        else {
                                res = ast_streamfile(chan, "privacy-incorrect", chan->language);
@@ -115,17 +134,16 @@ privacy_exec (struct ast_channel *chan, void *data)
                }
                
                /*Got a number, play sounds and send them on their way*/
                }
                
                /*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, "");
                        res = ast_streamfile(chan, "privacy-thankyou", chan->language);
                        if (!res)
                                res = ast_waitstream(chan, "");
-                       snprintf (new_cid, sizeof (new_cid), "\"%s\" <%s>", "Privacy Manager", phone);
-                       ast_set_callerid (chan, new_cid, 0);
+                       ast_set_callerid (chan, phone, "Privacy Manager", NULL);
                        if (option_verbose > 2)
                                ast_verbose (VERBOSE_PREFIX_3 "Changed Caller*ID to %s\n",new_cid);
                } else {
                        /*Send the call to n+101 priority, where n is the current priority*/
                        if (option_verbose > 2)
                                ast_verbose (VERBOSE_PREFIX_3 "Changed Caller*ID to %s\n",new_cid);
                } else {
                        /*Send the call to n+101 priority, where n is the current priority*/
-                       if (ast_exists_extension(chan, chan->context, chan->exten, chan->priority + 101, chan->callerid))
+                       if (ast_exists_extension(chan, chan->context, chan->exten, chan->priority + 101, chan->cid.cid_num))
                                chan->priority+=100;
                }
                if (cfg) 
                                chan->priority+=100;
                }
                if (cfg)