From 2c4ebe356e19b02617fbaffe95d03610aeb6182e Mon Sep 17 00:00:00 2001 From: Olle Johansson <oej@edvina.net> Date: Thu, 30 Mar 2006 04:16:38 +0000 Subject: [PATCH] Issue #6450 - Don't remove characters from SIP uri's when not needed 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 | 35 ++++++++++++++++++++++++++++------- channels/chan_sip.c | 15 ++++++++++----- include/asterisk/callerid.h | 11 +++++++++-- 3 files changed, 47 insertions(+), 14 deletions(-) diff --git a/callerid.c b/callerid.c index 68b42f8d43..58891d0fab 100644 --- a/callerid.c +++ b/callerid.c @@ -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 diff --git a/channels/chan_sip.c b/channels/chan_sip.c index c16817dfa8..4ce8a121f1 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -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); diff --git a/include/asterisk/callerid.h b/include/asterisk/callerid.h index 066dc7888d..a49d686abf 100644 --- a/include/asterisk/callerid.h +++ b/include/asterisk/callerid.h @@ -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); -- GitLab