From 00924ac32f82d6063c4b4fbb4cb0de91157290fd Mon Sep 17 00:00:00 2001 From: Kevin Harwell Date: Tue, 5 Nov 2013 15:16:21 +0000 Subject: [PATCH] chan_sip: notify dialog info ignores presentation indicator in callerid The presentation indicator in a callerid (e.g. set by dialplan function Set(CALLERID(name-pres)= ...)) is not checked when SIP Dialog Info Notifies are generated during extension monitoring. Added a check to make sure the name and/or number presentations on the callee (remote identity) are set to allow. If they are restricted then "anonymous" is used instead. (closes issue AST-1175) Reported by: Thomas Arimont Review: https://reviewboard.asterisk.org/r/2976/ ........ Merged revisions 402468 from http://svn.asterisk.org/svn/asterisk/branches/1.8 git-svn-id: https://origsvn.digium.com/svn/asterisk/certified/branches/1.8.15@402470 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- channels/chan_sip.c | 39 +++++++++++++++++++++++++++++++-------- 1 file changed, 31 insertions(+), 8 deletions(-) diff --git a/channels/chan_sip.c b/channels/chan_sip.c index cd94b2a0d4..dfbe4ef3ae 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -5473,6 +5473,7 @@ static int create_addr_from_peer(struct sip_pvt *dialog, struct sip_peer *peer) dialog->chanvars = copy_vars(peer->chanvars); if (peer->fromdomainport) dialog->fromdomainport = peer->fromdomainport; + dialog->callingpres = peer->callingpres; return 0; } @@ -12877,29 +12878,51 @@ static void state_notify_build_xml(struct state_notify_data *data, int full, con struct ast_channel *caller; if ((caller = ast_channel_callback(find_calling_channel, NULL, p, 0))) { + static char *anonymous = "anonymous"; + static char *invalid = "anonymous.invalid"; char *cid_num; char *connected_num; int need; + int cid_num_restricted, connected_num_restricted; ast_channel_lock(caller); + + cid_num_restricted = (caller->caller.id.number.presentation & + AST_PRES_RESTRICTION) == AST_PRES_RESTRICTED; cid_num = S_COR(caller->caller.id.number.valid, - caller->caller.id.number.str, ""); - need = strlen(cid_num) + strlen(p->fromdomain) + sizeof("sip:@"); + S_COR(cid_num_restricted, anonymous, + caller->caller.id.number.str), ""); + + need = strlen(cid_num) + (cid_num_restricted ? strlen(invalid) : + strlen(p->fromdomain)) + sizeof("sip:@"); + remote_target = alloca(need); - snprintf(remote_target, need, "sip:%s@%s", cid_num, p->fromdomain); + snprintf(remote_target, need, "sip:%s@%s", cid_num, + cid_num_restricted ? invalid : p->fromdomain); ast_xml_escape(S_COR(caller->caller.id.name.valid, - caller->caller.id.name.str, ""), + S_COR((caller->caller.id.name.presentation & + AST_PRES_RESTRICTION) == AST_PRES_RESTRICTED, anonymous, + caller->caller.id.name.str), ""), remote_display, sizeof(remote_display)); + connected_num_restricted = (caller->connected.id.number.presentation & + AST_PRES_RESTRICTION) == AST_PRES_RESTRICTED; connected_num = S_COR(caller->connected.id.number.valid, - caller->connected.id.number.str, ""); - need = strlen(connected_num) + strlen(p->fromdomain) + sizeof("sip:@"); + S_COR(connected_num_restricted, anonymous, + caller->connected.id.number.str), ""); + + need = strlen(connected_num) + (connected_num_restricted ? strlen(invalid) : + strlen(p->fromdomain)) + sizeof("sip:@"); local_target = alloca(need); - snprintf(local_target, need, "sip:%s@%s", connected_num, p->fromdomain); + + snprintf(local_target, need, "sip:%s@%s", connected_num, + connected_num_restricted ? invalid : p->fromdomain); ast_xml_escape(S_COR(caller->connected.id.name.valid, - caller->connected.id.name.str, ""), + S_COR((caller->connected.id.name.presentation & + AST_PRES_RESTRICTION) == AST_PRES_RESTRICTED, anonymous, + caller->connected.id.name.str), ""), local_display, sizeof(local_display)); ast_channel_unlock(caller); -- 2.47.2