chan_sip: notify dialog info ignores presentation indicator in callerid
authorKevin Harwell <kharwell@digium.com>
Mon, 4 Nov 2013 21:02:18 +0000 (21:02 +0000)
committerKevin Harwell <kharwell@digium.com>
Mon, 4 Nov 2013 21:02:18 +0000 (21:02 +0000)
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

channels/chan_sip.c

index 9364a11..d143dc1 100644 (file)
@@ -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);