diff --git a/callerid.c b/callerid.c index 68b42f8d4335b66b199d6952c314858d02401249..58891d0fab0aa5bd33f2baac6154af44a4ec65aa 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 c16817dfa8879c2053014384a87ca03e33793e1a..4ce8a121f19ee048818bd04cefef6beb613b6ea7 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 066dc7888d77ceca6a29eb9d2bf4788c5e6233db..a49d686abffb350dfa016c291817ceaab77870bb 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);