From 984d6500ce28dc1d0c95394c818700b56c07974a Mon Sep 17 00:00:00 2001 From: David Vossel Date: Wed, 21 Oct 2009 14:39:10 +0000 Subject: Merged revisions 225032 via svnmerge from https://origsvn.digium.com/svn/asterisk/branches/1.4 ........ r225032 | dvossel | 2009-10-21 09:37:04 -0500 (Wed, 21 Oct 2009) | 20 lines IAX/SIP shrinkcallerid option The shrinking of caller id removes '(', ' ', ')', non-trailing '.', and '-' from the string. This means values such as 555.5555 and test-test result in 555555 and testtest. There are instances, such as Skype integration, where a specific value is passed via caller id that must be preserved unmodified. This patch makes the shrinking of caller id optional in chan_sip and chan_iax in order to support such cases. By default this option is on to preserve previous expected behavior. (closes issue #15940) Reported by: dimas Patches: v2-15940.patch uploaded by dimas (license 88) 15940_shrinkcallerid_trunk.c uploaded by dvossel (license 671) Tested by: dvossel Review: https://reviewboard.asterisk.org/r/408/ ........ git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@225033 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- channels/chan_iax2.c | 17 ++++++++++++++--- channels/chan_sip.c | 18 ++++++++++++++---- 2 files changed, 28 insertions(+), 7 deletions(-) (limited to 'channels') diff --git a/channels/chan_iax2.c b/channels/chan_iax2.c index 0feec77d1..11d55d364 100644 --- a/channels/chan_iax2.c +++ b/channels/chan_iax2.c @@ -421,7 +421,7 @@ struct iax2_context { #define IAX_SENDCONNECTEDLINE (uint64_t)(1 << 28) /*!< Allow sending of connected line updates */ #define IAX_RECVCONNECTEDLINE (uint64_t)(1 << 29) /*!< Allow receiving of connected line updates */ #define IAX_FORCE_ENCRYPT (uint64_t)(1 << 30) /*!< Forces call encryption, if encryption not possible hangup */ - +#define IAX_SHRINKCALLERID (uint64_t)(1 << 31) /*!< Turn on and off caller id shrinking */ static int global_rtautoclear = 120; static int reload_config(void); @@ -7224,7 +7224,9 @@ static int check_access(int callno, struct sockaddr_in *sin, struct iax_ies *ies if (ies->called_number) ast_string_field_set(iaxs[callno], exten, ies->called_number); if (ies->calling_number) { - ast_shrink_phone_number(ies->calling_number); + if (ast_test_flag64(&globalflags, IAX_SHRINKCALLERID)) { + ast_shrink_phone_number(ies->calling_number); + } ast_string_field_set(iaxs[callno], cid_num, ies->calling_number); } if (ies->calling_name) @@ -12563,6 +12565,7 @@ static int set_config(const char *config_file, int reload) /* Reset Global Flags */ memset(&globalflags, 0, sizeof(globalflags)); ast_set_flag64(&globalflags, IAX_RTUPDATE); + ast_set_flag64((&globalflags), IAX_SHRINKCALLERID); #ifdef SO_NO_CHECK nochecksums = 0; @@ -12829,10 +12832,18 @@ static int set_config(const char *config_file, int reload) if (sscanf(v->value, "%10hu", &global_maxcallno_nonval) != 1) { ast_log(LOG_WARNING, "maxcallnumbers_nonvalidated must be set to a valid number. %s is not valid at line %d.\n", v->value, v->lineno); } - } else if(!strcasecmp(v->name, "calltokenoptional")) { + } else if (!strcasecmp(v->name, "calltokenoptional")) { if (add_calltoken_ignore(v->value)) { ast_log(LOG_WARNING, "Invalid calltokenoptional address range - '%s' line %d\n", v->value, v->lineno); } + } else if (!strcasecmp(v->name, "shrinkcallerid")) { + if (ast_true(v->value)) { + ast_set_flag64((&globalflags), IAX_SHRINKCALLERID); + } else if (ast_false(v->value)) { + ast_clear_flag64((&globalflags), IAX_SHRINKCALLERID); + } else { + ast_log(LOG_WARNING, "shrinkcallerid value %s is not valid at line %d.\n", v->value, v->lineno); + } }/*else if (strcasecmp(v->name,"type")) */ /* ast_log(LOG_WARNING, "Ignoring %s\n", v->name); */ v = v->next; diff --git a/channels/chan_sip.c b/channels/chan_sip.c index 529562cc0..98a0173d5 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -1227,6 +1227,7 @@ static int global_rtpholdtimeout; /*!< Time out call if no RTP during hold */ static int global_rtpkeepalive; /*!< Send RTP keepalives */ static int global_reg_timeout; /*!< Global time between attempts for outbound registrations */ static int global_regattempts_max; /*!< Registration attempts before giving up */ +static int global_shrinkcallerid; /*!< enable or disable shrinking of caller id */ static int global_callcounter; /*!< Enable call counters for all devices. This is currently enabled by setting the peer call-limit to INT_MAX. When we remove the call-limit from the code, we can make it with just a boolean flag in the device structure */ @@ -13420,7 +13421,7 @@ static int get_pai(struct sip_pvt *p, struct sip_request *req) cid_num = (char *)p->cid_num; } else if (!strncasecmp(start, "sip:", 4)) { cid_num = start + 4; - if (ast_is_shrinkable_phonenumber(cid_num)) + if (global_shrinkcallerid && ast_is_shrinkable_phonenumber(cid_num)) ast_shrink_phone_number(cid_num); start = end; @@ -13499,7 +13500,7 @@ static int get_rpid(struct sip_pvt *p, struct sip_request *oreq) if (strncasecmp(start, "sip:", 4)) return 0; cid_num = start + 4; - if (ast_is_shrinkable_phonenumber(cid_num)) + if (global_shrinkcallerid && ast_is_shrinkable_phonenumber(cid_num)) ast_shrink_phone_number(cid_num); start = end; @@ -14347,7 +14348,7 @@ static enum check_auth_result check_peer_ok(struct sip_pvt *p, char *of, if (!get_rpid(p, req)) { if (!ast_strlen_zero(peer->cid_num)) { char *tmp = ast_strdupa(peer->cid_num); - if (ast_is_shrinkable_phonenumber(tmp)) + if (global_shrinkcallerid && ast_is_shrinkable_phonenumber(tmp)) ast_shrink_phone_number(tmp); ast_string_field_set(p, cid_num, tmp); } @@ -14456,7 +14457,7 @@ static enum check_auth_result check_user_full(struct sip_pvt *p, struct sip_requ */ tmp = strsep(&tmp, ";"); - if (ast_is_shrinkable_phonenumber(tmp)) + if (global_shrinkcallerid && ast_is_shrinkable_phonenumber(tmp)) ast_shrink_phone_number(tmp); ast_string_field_set(p, cid_num, tmp); } @@ -25058,6 +25059,7 @@ static int reload_config(enum channelreloadreason reason) global_t1min = DEFAULT_T1MIN; global_qualifyfreq = DEFAULT_QUALIFYFREQ; global_t38_maxdatagram = -1; + global_shrinkcallerid = 1; sip_cfg.matchexterniplocally = DEFAULT_MATCHEXTERNIPLOCALLY; @@ -25513,6 +25515,14 @@ static int reload_config(enum channelreloadreason reason) mark_parsed_methods(&sip_cfg.disallowed_methods, disallow); } else if (!strcasecmp(v->name, "constantssrc")) { ast_set2_flag(&global_flags[1], ast_true(v->value), SIP_PAGE2_CONSTANT_SSRC); + } else if (!strcasecmp(v->name, "shrinkcallerid")) { + if (ast_true(v->value)) { + global_shrinkcallerid = 1; + } else if (ast_false(v->value)) { + global_shrinkcallerid = 0; + } else { + ast_log(LOG_WARNING, "shrinkcallerid value %s is not valid at line %d.\n", v->value, v->lineno); + } } } -- cgit v1.2.3