Issue #6450 - Don't remove characters from SIP uri's when not needed
authorOlle Johansson <oej@edvina.net>
Thu, 30 Mar 2006 04:16:38 +0000 (04:16 +0000)
committerOlle Johansson <oej@edvina.net>
Thu, 30 Mar 2006 04:16:38 +0000 (04:16 +0000)
  Patch by jcomellas, heavily modified by oej

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@16425 65c4cc65-6c06-0410-ace0-fbb531ad65f3

callerid.c
channels/chan_sip.c
include/asterisk/callerid.h

index 68b42f8..58891d0 100644 (file)
@@ -905,21 +905,42 @@ void ast_shrink_phone_number(char *n)
        n[y] = '\0';
 }
 
-/*! \brief checks if string consists only of digits and * \# and + 
-       \return 1 if string is valid AST phone number
-       \return 0 if not
+/*! \brief Checks if phone number consists of valid characters 
+       \param exten    String that needs to be checked
+       \param valid    Valid characters in string
+       \return 1 if valid string, 0 if string contains invalid characters
 */
-int ast_isphonenumber(char *n)
+static int ast_is_valid_string(const char *exten, const char *valid)
 {
        int x;
-       if (ast_strlen_zero(n))
+
+       if (ast_strlen_zero(exten))
                return 0;
-       for (x=0;n[x];x++)
-               if (!strchr("0123456789*#+", n[x]))
+       for (x=0; exten[x]; x++)
+               if (!strchr(valid, exten[x]))
                        return 0;
        return 1;
 }
 
+/*! \brief checks if string consists only of digits and * \# and + 
+       \return 1 if string is valid AST phone number
+       \return 0 if not
+*/
+int ast_isphonenumber(const char *n)
+{
+       return ast_is_valid_string(n, "0123456789*#+");
+}
+
+/*! \brief checks if string consists only of digits and ( ) - * \# and + 
+       Pre-qualifies the string for ast_shrink_phone_number()
+       \return 1 if string is valid AST shrinkable phone number
+       \return 0 if not
+*/
+int ast_is_shrinkable_phonenumber(const char *exten)
+{
+       return ast_is_valid_string(exten, "0123456789*#+()-.");
+}
+
 /*! \brief parse string for caller id information 
        \return always returns 0, as the code always returns something.
   XXX note that 'name' is not parsed consistently e.g. we have
index c16817d..4ce8a12 100644 (file)
@@ -7234,7 +7234,8 @@ static int check_user_full(struct sip_pvt *p, struct sip_request *req, int sipme
                        *c = '\0';
                tmp = ast_strdupa(of);
                if (tmp) {
-                       ast_shrink_phone_number(tmp);
+                       if (ast_is_shrinkable_phonenumber(tmp))
+                               ast_shrink_phone_number(tmp);
                        ast_string_field_set(p, cid_num, tmp);
                } else {
                        ast_string_field_set(p, cid_num, of);
@@ -7265,7 +7266,8 @@ static int check_user_full(struct sip_pvt *p, struct sip_request *req, int sipme
                                ast_string_field_set(p, cid_name, calleridname);
                        tmp = ast_strdupa(rpid_num);
                        if (tmp) {
-                               ast_shrink_phone_number(tmp);
+                               if (ast_is_shrinkable_phonenumber(tmp))
+                                       ast_shrink_phone_number(tmp);
                                ast_string_field_set(p, cid_num, tmp);
                        } else {
                                ast_string_field_set(p, cid_num, rpid_num);
@@ -7301,7 +7303,8 @@ static int check_user_full(struct sip_pvt *p, struct sip_request *req, int sipme
                        if (!ast_strlen_zero(user->cid_num) && !ast_strlen_zero(p->cid_num)) {
                                char *tmp = ast_strdupa(user->cid_num);
                                if (tmp) {
-                                       ast_shrink_phone_number(tmp);
+                                       if (ast_is_shrinkable_phonenumber(tmp))
+                                               ast_shrink_phone_number(tmp);
                                        ast_string_field_set(p, cid_num, tmp);
                                } else {
                                        ast_string_field_set(p, cid_num, user->cid_num);
@@ -7376,7 +7379,8 @@ static int check_user_full(struct sip_pvt *p, struct sip_request *req, int sipme
                                if (*calleridname)
                                        ast_string_field_set(p, cid_name, calleridname);
                                if (tmp) {
-                                       ast_shrink_phone_number(tmp);
+                                       if (ast_is_shrinkable_phonenumber(tmp))
+                                               ast_shrink_phone_number(tmp);
                                        ast_string_field_set(p, cid_num, tmp);
                                } else {
                                        ast_string_field_set(p, cid_num, rpid_num);
@@ -7430,7 +7434,8 @@ static int check_user_full(struct sip_pvt *p, struct sip_request *req, int sipme
                                if (!ast_strlen_zero(peer->cid_num) && !ast_strlen_zero(p->cid_num)) {
                                        char *tmp = ast_strdupa(peer->cid_num);
                                        if (tmp) {
-                                               ast_shrink_phone_number(tmp);
+                                               if (ast_is_shrinkable_phonenumber(tmp))
+                                                       ast_shrink_phone_number(tmp);
                                                ast_string_field_set(p, cid_num, tmp);
                                        } else {
                                                ast_string_field_set(p, cid_num, peer->cid_num);
index 066dc78..a49d686 100644 (file)
@@ -193,11 +193,18 @@ extern int ast_gen_cas(unsigned char *outbuf, int sas, int len, int codec);
  */
 extern void ast_shrink_phone_number(char *n);
 
-/*! \brief Check if a string consists only of digits.   
+/*! \brief Check if a string consists only of digits and + \#
     \param n number to be checked.
     \return Returns 0 if n is a number, 1 if it's not.
  */
-extern int ast_isphonenumber(char *n);
+extern int ast_isphonenumber(const char *n);
+
+/*! \brief Check if a string consists only of digits and and + \# ( ) - .
+       (meaning it can be cleaned with ast_shrink_phone_number)
+    \param exten The extension (or URI) to be checked.
+    \return Returns 0 if n is a number, 1 if it's not.
+ */
+extern int ast_is_shrinkable_phonenumber(const char *exten);
 
 extern int ast_callerid_split(const char *src, char *name, int namelen, char *num, int numlen);