]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
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 68b42f8d4335b66b199d6952c314858d02401249..58891d0fab0aa5bd33f2baac6154af44a4ec65aa 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 c16817dfa8879c2053014384a87ca03e33793e1a..4ce8a121f19ee048818bd04cefef6beb613b6ea7 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 066dc7888d77ceca6a29eb9d2bf4788c5e6233db..a49d686abffb350dfa016c291817ceaab77870bb 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);