]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
chan_pjsip/res_pjsip: Add CHANNEL(pjsip,request_uri)
authorRichard Mudgett <rmudgett@digium.com>
Thu, 7 Dec 2017 23:51:08 +0000 (17:51 -0600)
committerRichard Mudgett <rmudgett@digium.com>
Tue, 12 Dec 2017 19:46:35 +0000 (13:46 -0600)
This patch does three things associated with the initial incoming INVITE
request URI.

1) Add access to the full initial incoming INVITE request URI.

2) We were not setting DNID on incoming PJSIP channels.  The DNID is the
user portion of the initial incoming INVITE Request-URI.  The value is
accessed by reading CALLERID(dnid).

3) Fix CHANNEL(pjsip,target_uri) documentation.

* The initial incoming INVITE request URI is now available using
CHANNEL(pjsip,request_uri).

* Set the DNID on PJSIP channel creation so CALLERID(dnid) can return the
initial incoming INVITE request URI user portion.

* CHANNEL(pjsip,target_uri) now correctly documents that the target URI is
the contact URI.

* Refactored print_escaped_uri() out of channel_read_pjsip() to handle
pjsip_uri_print() error condition when the buffer is too small.

ASTERISK-27478

Change-Id: I512e60d1f162395c946451becb37af3333337b33

channels/chan_pjsip.c
channels/pjsip/dialplan_functions.c
include/asterisk/res_pjsip_session.h
res/res_pjsip_session.c

index e4e8fa586bada4b25e659c73854b6bfe0d89cde7..69bcc187fd2f217de1da557e98e87818d5244fc0 100644 (file)
@@ -605,6 +605,11 @@ static struct ast_channel *chan_pjsip_new(struct ast_sip_session *session, int s
        ast_party_id_copy(&ast_channel_caller(chan)->id, &session->id);
        ast_party_id_copy(&ast_channel_caller(chan)->ani, &session->id);
 
+       if (!ast_strlen_zero(exten)) {
+               /* Set provided DNID on the new channel. */
+               ast_channel_dialed(chan)->number.str = ast_strdup(exten);
+       }
+
        ast_channel_priority_set(chan, 1);
 
        ast_channel_callgroup_set(chan, session->endpoint->pickup.callgroup);
index 861edf72d362603a89b7574196e48b9d4173bd4a..aa376f89218b07c8f49890a478f3d3c37feec2f9 100644 (file)
                                                </enumlist>
                                        </enum>
                                        <enum name="target_uri">
-                                               <para>The request URI of the <literal>INVITE</literal> request associated with the creation of this channel.</para>
+                                               <para>The contact URI where requests are sent.</para>
                                        </enum>
                                        <enum name="local_uri">
                                                <para>The local URI.</para>
                                        <enum name="remote_tag">
                                                <para>Tag in To header</para>
                                        </enum>
+                                       <enum name="request_uri">
+                                               <para>The request URI of the incoming <literal>INVITE</literal>
+                                               associated with the creation of this channel.</para>
+                                       </enum>
                                        <enum name="t38state">
                                                <para>The current state of any T.38 fax on this channel.</para>
                                                <enumlist>
@@ -656,6 +660,27 @@ static int channel_read_rtcp(struct ast_channel *chan, const char *type, const c
        return 0;
 }
 
+static int print_escaped_uri(struct ast_channel *chan, const char *type,
+       pjsip_uri_context_e context, const void *uri, char *buf, size_t size)
+{
+       int res;
+       char *buf_copy;
+
+       res = pjsip_uri_print(context, uri, buf, size);
+       if (res < 0) {
+               ast_log(LOG_ERROR, "Channel %s: Unescaped %s too long for %d byte buffer\n",
+                       ast_channel_name(chan), type, (int) size);
+
+               /* Empty buffer that likely is not terminated. */
+               buf[0] = '\0';
+               return -1;
+       }
+
+       buf_copy = ast_strdupa(buf);
+       ast_escape_quoted(buf_copy, buf, size);
+       return 0;
+}
+
 /*!
  * \internal \brief Handle reading signalling information
  */
@@ -664,6 +689,7 @@ static int channel_read_pjsip(struct ast_channel *chan, const char *type, const
        struct ast_sip_channel_pvt *channel = ast_channel_tech_pvt(chan);
        char *buf_copy;
        pjsip_dialog *dlg;
+       int res = 0;
 
        if (!channel) {
                ast_log(AST_LOG_WARNING, "Channel %s has no pvt!\n", ast_channel_name(chan));
@@ -689,25 +715,27 @@ static int channel_read_pjsip(struct ast_channel *chan, const char *type, const
                return -1;
 #endif
        } else if (!strcmp(type, "target_uri")) {
-               pjsip_uri_print(PJSIP_URI_IN_REQ_URI, dlg->target, buf, buflen);
-               buf_copy = ast_strdupa(buf);
-               ast_escape_quoted(buf_copy, buf, buflen);
+               res = print_escaped_uri(chan, type, PJSIP_URI_IN_REQ_URI, dlg->target, buf,
+                       buflen);
        } else if (!strcmp(type, "local_uri")) {
-               pjsip_uri_print(PJSIP_URI_IN_FROMTO_HDR, dlg->local.info->uri, buf, buflen);
-               buf_copy = ast_strdupa(buf);
-               ast_escape_quoted(buf_copy, buf, buflen);
+               res = print_escaped_uri(chan, type, PJSIP_URI_IN_FROMTO_HDR, dlg->local.info->uri,
+                       buf, buflen);
        } else if (!strcmp(type, "local_tag")) {
                ast_copy_pj_str(buf, &dlg->local.info->tag, buflen);
                buf_copy = ast_strdupa(buf);
                ast_escape_quoted(buf_copy, buf, buflen);
        } else if (!strcmp(type, "remote_uri")) {
-               pjsip_uri_print(PJSIP_URI_IN_FROMTO_HDR, dlg->remote.info->uri, buf, buflen);
-               buf_copy = ast_strdupa(buf);
-               ast_escape_quoted(buf_copy, buf, buflen);
+               res = print_escaped_uri(chan, type, PJSIP_URI_IN_FROMTO_HDR,
+                       dlg->remote.info->uri, buf, buflen);
        } else if (!strcmp(type, "remote_tag")) {
                ast_copy_pj_str(buf, &dlg->remote.info->tag, buflen);
                buf_copy = ast_strdupa(buf);
                ast_escape_quoted(buf_copy, buf, buflen);
+       } else if (!strcmp(type, "request_uri")) {
+               if (channel->session->request_uri) {
+                       res = print_escaped_uri(chan, type, PJSIP_URI_IN_REQ_URI,
+                               channel->session->request_uri, buf, buflen);
+               }
        } else if (!strcmp(type, "t38state")) {
                ast_copy_string(buf, t38state_to_string[channel->session->t38state], buflen);
        } else if (!strcmp(type, "local_addr")) {
@@ -743,7 +771,7 @@ static int channel_read_pjsip(struct ast_channel *chan, const char *type, const
                return -1;
        }
 
-       return 0;
+       return res;
 }
 
 /*! \brief Struct used to push function arguments to task processor */
index de6589abd3dd61d0c90ba328d81bd4e0d6c98d82..6d506a35b06d5aa572f1b0e7e0fde02cf893cb82 100644 (file)
@@ -211,6 +211,8 @@ struct ast_sip_session {
        unsigned int ended_while_deferred:1;
        /*! DTMF mode to use with this session, from endpoint but can change */
        enum ast_sip_dtmf_mode dtmf;
+       /*! Initial incoming INVITE Request-URI.  NULL otherwise. */
+       pjsip_uri *request_uri;
 };
 
 typedef int (*ast_sip_session_request_creation_cb)(struct ast_sip_session *session, pjsip_tx_data *tdata);
index 781d3e4eb7f4d3785dbc8d7f2c8a6058b2aa9ed1..55b91208a33fed07710dd2169b9563978f2530f0 100644 (file)
@@ -2818,6 +2818,12 @@ static enum sip_get_destination_result get_destination(struct ast_sip_session *s
                ast_copy_pj_str(domain, &sip_ruri->host, size);
                pbx_builtin_setvar_helper(session->channel, "SIPDOMAIN", domain);
 
+               /*
+                * Save off the INVITE Request-URI in case it is
+                * needed: CHANNEL(pjsip,request_uri)
+                */
+               session->request_uri = pjsip_uri_clone(session->inv_session->pool, ruri);
+
                return SIP_GET_DEST_EXTEN_FOUND;
        }