<p>N A has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.asterisk.org/c/asterisk/+/19604">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">res_pjsip_session: Use Caller ID for extension matching.<br><br>Currently, there is no Caller ID available to us when<br>checking for an extension match when handling INVITEs.<br>As a result, extension patterns that depend on the Caller ID<br>are not matched and calls may be incorrectly rejected.<br><br>The Caller ID is not available because the supplement that<br>adds Caller ID to the session does not execute until after<br>this check. Supplement callbacks cannot yet be executed<br>at this point since the session is not yet in the appropriate<br>state.<br><br>To fix this without impacting existing behavior, the Caller ID<br>number is now retrieved before attempting to pattern match.<br>This ensures pattern matching works correctly and there is<br>no behavior change to the way supplements are called.<br><br>ASTERISK-28767 #close<br><br>Change-Id: Iec7f5a3b90e51b65ccf74342f96bf80314b7cfc7<br>---<br>M res/res_pjsip_session.c<br>1 file changed, 100 insertions(+), 2 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.asterisk.org:29418/asterisk refs/changes/04/19604/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/res/res_pjsip_session.c b/res/res_pjsip_session.c</span><br><span>index c5890e0..04a24ec 100644</span><br><span>--- a/res/res_pjsip_session.c</span><br><span>+++ b/res/res_pjsip_session.c</span><br><span>@@ -3641,6 +3641,74 @@</span><br><span>   return session;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static pjsip_fromto_hdr *get_id_header(pjsip_rx_data *rdata, const pj_str_t *header_name)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        static const pj_str_t from = { "From", 4 };</span><br><span style="color: hsl(120, 100%, 40%);">+ pj_str_t header_content;</span><br><span style="color: hsl(120, 100%, 40%);">+      pjsip_fromto_hdr *parsed_hdr;</span><br><span style="color: hsl(120, 100%, 40%);">+ pjsip_generic_string_hdr *ident = pjsip_msg_find_hdr_by_name(rdata->msg_info.msg, header_name, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+      int parsed_len;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     if (!ident) {</span><br><span style="color: hsl(120, 100%, 40%);">+         return NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   pj_strdup_with_null(rdata->tp_info.pool, &header_content, &ident->hvalue);</span><br><span style="color: hsl(120, 100%, 40%);">+      parsed_hdr = pjsip_parse_hdr(rdata->tp_info.pool, &from, header_content.ptr,</span><br><span style="color: hsl(120, 100%, 40%);">+                   pj_strlen(&header_content), &parsed_len);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   return parsed_hdr;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static int set_id_from_hdr(pjsip_fromto_hdr *hdr, char *buf, size_t len)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  char cid_num[AST_CHANNEL_NAME];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     if (!hdr) {</span><br><span style="color: hsl(120, 100%, 40%);">+           return -1;</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   ast_copy_pj_str(cid_num, ast_sip_pjsip_uri_get_username(hdr->uri), sizeof(cid_num));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Always truncate caller-id number at a semicolon. */</span><br><span style="color: hsl(120, 100%, 40%);">+        AST_SIP_USER_OPTIONS_TRUNCATE_CHECK(cid_num);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       if (ast_strlen_zero(cid_num)) {</span><br><span style="color: hsl(120, 100%, 40%);">+               return -1;</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   ast_copy_string(buf, cid_num, len);</span><br><span style="color: hsl(120, 100%, 40%);">+   return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/*! \brief Fetch just the Caller ID number in order of PAI, RPID, From */</span><br><span style="color: hsl(120, 100%, 40%);">+static int fetch_callerid_num(struct ast_sip_session *session, pjsip_rx_data *rdata, char *buf, size_t len)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     /* The Caller ID supplement hasn't yet been called to fill in the session ID,</span><br><span style="color: hsl(120, 100%, 40%);">+      * and we can't execute the supplement earlier than we do,</span><br><span style="color: hsl(120, 100%, 40%);">+         * so minimally grab the number so dialplan pattern matching against Caller ID number works. */</span><br><span style="color: hsl(120, 100%, 40%);">+       pjsip_fromto_hdr *from, *pai, *rpid;</span><br><span style="color: hsl(120, 100%, 40%);">+  static const pj_str_t pai_str = { "P-Asserted-Identity", 19 };</span><br><span style="color: hsl(120, 100%, 40%);">+      static const pj_str_t rpid_str = { "Remote-Party-ID", 15 };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       if (session->endpoint->id.trust_inbound) {</span><br><span style="color: hsl(120, 100%, 40%);">+              pai = get_id_header(rdata, &pai_str);</span><br><span style="color: hsl(120, 100%, 40%);">+             if (!set_id_from_hdr(pai, buf, len)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                        return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+             rpid = get_id_header(rdata, &rpid_str);</span><br><span style="color: hsl(120, 100%, 40%);">+           if (!set_id_from_hdr(rpid, buf, len)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                       return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+     if (session->endpoint->id.self.number.valid) {</span><br><span style="color: hsl(120, 100%, 40%);">+          ast_copy_string(buf, session->endpoint->id.self.number.str, len);</span><br><span style="color: hsl(120, 100%, 40%);">+               return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+     from = pjsip_msg_find_hdr(rdata->msg_info.msg, PJSIP_H_FROM, rdata->msg_info.msg->hdr.next);</span><br><span style="color: hsl(120, 100%, 40%);">+ return set_id_from_hdr(from, buf, len);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> enum sip_get_destination_result {</span><br><span>    /*! The extension was successfully found */</span><br><span>  SIP_GET_DEST_EXTEN_FOUND,</span><br><span>@@ -3664,6 +3732,7 @@</span><br><span>  */</span><br><span> static enum sip_get_destination_result get_destination(struct ast_sip_session *session, pjsip_rx_data *rdata)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+        char cid_num[AST_CHANNEL_NAME];</span><br><span>      pjsip_uri *ruri = rdata->msg_info.msg->line.req.uri;</span><br><span>   struct ast_features_pickup_config *pickup_cfg;</span><br><span>       const char *pickupexten;</span><br><span>@@ -3690,8 +3759,10 @@</span><br><span>            ao2_ref(pickup_cfg, -1);</span><br><span>     }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ fetch_callerid_num(session, rdata, cid_num, sizeof(cid_num));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>      if (!strcmp(session->exten, pickupexten) ||</span><br><span style="color: hsl(0, 100%, 40%);">-          ast_exists_extension(NULL, session->endpoint->context, session->exten, 1, NULL)) {</span><br><span style="color: hsl(120, 100%, 40%);">+           ast_exists_extension(NULL, session->endpoint->context, session->exten, 1, S_OR(cid_num, NULL))) {</span><br><span>           /*</span><br><span>            * Save off the INVITE Request-URI in case it is</span><br><span>              * needed: CHANNEL(pjsip,request_uri)</span><br><span>@@ -3706,7 +3777,7 @@</span><br><span>         */</span><br><span>  if (session->endpoint->allow_overlap && (</span><br><span>              !strncmp(session->exten, pickupexten, strlen(session->exten)) ||</span><br><span style="color: hsl(0, 100%, 40%);">-          ast_canmatch_extension(NULL, session->endpoint->context, session->exten, 1, NULL))) {</span><br><span style="color: hsl(120, 100%, 40%);">+                ast_canmatch_extension(NULL, session->endpoint->context, session->exten, 1, S_OR(cid_num, NULL)))) {</span><br><span>                /* Overlap partial match */</span><br><span>          return SIP_GET_DEST_EXTEN_PARTIAL;</span><br><span>   }</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.asterisk.org/c/asterisk/+/19604">change 19604</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.asterisk.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.asterisk.org/c/asterisk/+/19604"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: asterisk </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: Iec7f5a3b90e51b65ccf74342f96bf80314b7cfc7 </div>
<div style="display:none"> Gerrit-Change-Number: 19604 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: N A <asterisk@phreaknet.org> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>