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 402450 from http://svn.asterisk.org/svn/asterisk/branches/11
........

Merged revisions 402452 from http://svn.asterisk.org/svn/asterisk/branches/12


git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@402453 65c4cc65-6c06-0410-ace0-fbb531ad65f3
changes/97/197/1
Kevin Harwell 12 years ago
parent 7d2f2d6ef8
commit fe47684b43

@ -6240,6 +6240,7 @@ static int create_addr_from_peer(struct sip_pvt *dialog, struct sip_peer *peer)
if (peer->fromdomainport) {
dialog->fromdomainport = peer->fromdomainport;
}
dialog->callingpres = peer->callingpres;
return 0;
}
@ -14756,29 +14757,51 @@ static void state_notify_build_xml(struct state_notify_data *data, int full, con
callee = find_ringing_channel(data->device_state_info, p);
if (callee) {
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(callee);
cid_num_restricted = (ast_channel_caller(callee)->id.number.presentation &
AST_PRES_RESTRICTION) == AST_PRES_RESTRICTED;
cid_num = S_COR(ast_channel_caller(callee)->id.number.valid,
ast_channel_caller(callee)->id.number.str, "");
need = strlen(cid_num) + strlen(p->fromdomain) + sizeof("sip:@");
S_COR(cid_num_restricted, anonymous,
ast_channel_caller(callee)->id.number.str), "");
need = strlen(cid_num) + (cid_num_restricted ? strlen(invalid) :
strlen(p->fromdomain)) + sizeof("sip:@");
local_target = ast_alloca(need);
snprintf(local_target, need, "sip:%s@%s", cid_num, p->fromdomain);
snprintf(local_target, need, "sip:%s@%s", cid_num,
cid_num_restricted ? invalid : p->fromdomain);
ast_xml_escape(S_COR(ast_channel_caller(callee)->id.name.valid,
ast_channel_caller(callee)->id.name.str, ""),
S_COR((ast_channel_caller(callee)->id.name.presentation &
AST_PRES_RESTRICTION) == AST_PRES_RESTRICTED, anonymous,
ast_channel_caller(callee)->id.name.str), ""),
local_display, sizeof(local_display));
connected_num_restricted = (ast_channel_connected(callee)->id.number.presentation &
AST_PRES_RESTRICTION) == AST_PRES_RESTRICTED;
connected_num = S_COR(ast_channel_connected(callee)->id.number.valid,
ast_channel_connected(callee)->id.number.str, "");
need = strlen(connected_num) + strlen(p->fromdomain) + sizeof("sip:@");
S_COR(connected_num_restricted, anonymous,
ast_channel_connected(callee)->id.number.str), "");
need = strlen(connected_num) + (connected_num_restricted ? strlen(invalid) :
strlen(p->fromdomain)) + sizeof("sip:@");
remote_target = ast_alloca(need);
snprintf(remote_target, need, "sip:%s@%s", connected_num, p->fromdomain);
snprintf(remote_target, need, "sip:%s@%s", connected_num,
connected_num_restricted ? invalid : p->fromdomain);
ast_xml_escape(S_COR(ast_channel_connected(callee)->id.name.valid,
ast_channel_connected(callee)->id.name.str, ""),
S_COR((ast_channel_connected(callee)->id.name.presentation &
AST_PRES_RESTRICTION) == AST_PRES_RESTRICTED, anonymous,
ast_channel_connected(callee)->id.name.str), ""),
remote_display, sizeof(remote_display));
ast_channel_unlock(callee);

Loading…
Cancel
Save