Author: mjordan Date: Wed Dec 24 07:26:21 2014 New Revision: 430085 URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=430085 Log: res_pjsip: Add 'user_eq_phone' option to add a 'user=phone' parameter when applicable.
Note that this is a backport of r425804 from trunk. This change adds a configuration option which adds a 'user=phone' parameter if the user portion of the request URI or the From URI is determined to be a number. Review: https://reviewboard.asterisk.org/r/4073/ ........ Merged revisions 430083 from http://svn.asterisk.org/svn/asterisk/branches/13 Modified: certified/branches/13.1/ (props changed) certified/branches/13.1/CHANGES certified/branches/13.1/include/asterisk/res_pjsip.h certified/branches/13.1/res/res_pjsip.c certified/branches/13.1/res/res_pjsip/pjsip_configuration.c certified/branches/13.1/res/res_pjsip_caller_id.c Propchange: certified/branches/13.1/ ------------------------------------------------------------------------------ --- branch-13-merged (original) +++ branch-13-merged Wed Dec 24 07:26:21 2014 @@ -1,1 +1,1 @@ -/branches/13:429128-429222,429224-429246,429407,429409,429433,429477,429497,429540,429571,429739,429741,429761,429829,430010,430034 +/branches/13:429128-429222,429224-429246,429407,429409,429433,429477,429497,429540,429571,429739,429741,429761,429829,430010,430034,430083 Modified: certified/branches/13.1/CHANGES URL: http://svnview.digium.com/svn/asterisk/certified/branches/13.1/CHANGES?view=diff&rev=430085&r1=430084&r2=430085 ============================================================================== --- certified/branches/13.1/CHANGES (original) +++ certified/branches/13.1/CHANGES Wed Dec 24 07:26:21 2014 @@ -11,6 +11,11 @@ --- Functionality changes from Asterisk 13.1.0 to Asterisk 13.1-cert1 -------- ------------------------------------------------------------------------------ +chan_pjsip +------------------ + * New 'user_eq_phone' endpoint setting. This adds a 'user=phone' parameter + to the request URI and From URI if the user is determined to be a phone number. + ARI ------------------ * The Originate operation now takes in an originator channel. The linked ID of @@ -105,7 +110,6 @@ Finally, all users upgrading to Asterisk 13 should read the UPGRADE.txt file delivered with this release. - Build System ------------------ Modified: certified/branches/13.1/include/asterisk/res_pjsip.h URL: http://svnview.digium.com/svn/asterisk/certified/branches/13.1/include/asterisk/res_pjsip.h?view=diff&rev=430085&r1=430084&r2=430085 ============================================================================== --- certified/branches/13.1/include/asterisk/res_pjsip.h (original) +++ certified/branches/13.1/include/asterisk/res_pjsip.h Wed Dec 24 07:26:21 2014 @@ -609,6 +609,8 @@ enum ast_sip_session_redirect redirect_method; /*! Variables set on channel creation */ struct ast_variable *channel_vars; + /*! Whether to place a 'user=phone' parameter into the request URI if user is a number */ + unsigned int usereqphone; }; /*! @@ -1485,6 +1487,15 @@ * \return The looked up endpoint */ struct ast_sip_endpoint *ast_pjsip_rdata_get_endpoint(pjsip_rx_data *rdata); + +/*! + * \brief Add 'user=phone' parameter to URI if enabled and user is a phone number. + * + * \param endpoint The endpoint to use for configuration + * \param pool The memory pool to allocate the parameter from + * \param uri The URI to check for user and to add parameter to + */ +void ast_sip_add_usereqphone(const struct ast_sip_endpoint *endpoint, pj_pool_t *pool, pjsip_uri *uri); /*! * \brief Retrieve any endpoints available to sorcery. Modified: certified/branches/13.1/res/res_pjsip.c URL: http://svnview.digium.com/svn/asterisk/certified/branches/13.1/res/res_pjsip.c?view=diff&rev=430085&r1=430084&r2=430085 ============================================================================== --- certified/branches/13.1/res/res_pjsip.c (original) +++ certified/branches/13.1/res/res_pjsip.c Wed Dec 24 07:26:21 2014 @@ -35,6 +35,7 @@ #include "asterisk/taskprocessor.h" #include "asterisk/uuid.h" #include "asterisk/sorcery.h" +#include "asterisk/file.h" /*** MODULEINFO <depend>pjproject</depend> @@ -580,6 +581,9 @@ <configOption name="allow_transfer" default="yes"> <synopsis>Determines whether SIP REFER transfers are allowed for this endpoint</synopsis> </configOption> + <configOption name="user_eq_phone" default="no"> + <synopsis>Determines whether a user=phone parameter is placed into the request URI if the user is determined to be a phone number</synopsis> + </configOption> <configOption name="sdp_owner" default="-"> <synopsis>String placed as the username portion of an SDP origin (o=) line.</synopsis> </configOption> @@ -1567,6 +1571,9 @@ </parameter> <parameter name="AllowTransfer"> <para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='allow_transfer']/synopsis/node())"/></para> + </parameter> + <parameter name="UserEqPhone"> + <para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='user_eq_phone']/synopsis/node())"/></para> </parameter> <parameter name="SdpOwner"> <para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='sdp_owner']/synopsis/node())"/></para> @@ -2127,6 +2134,41 @@ return 0; } +void ast_sip_add_usereqphone(const struct ast_sip_endpoint *endpoint, pj_pool_t *pool, pjsip_uri *uri) +{ + pjsip_sip_uri *sip_uri; + int i = 0; + pjsip_param *param; + const pj_str_t STR_USER = { "user", 4 }; + const pj_str_t STR_PHONE = { "phone", 5 }; + + if (!endpoint || !endpoint->usereqphone || (!PJSIP_URI_SCHEME_IS_SIP(uri) && !PJSIP_URI_SCHEME_IS_SIPS(uri))) { + return; + } + + sip_uri = pjsip_uri_get_uri(uri); + + if (!pj_strlen(&sip_uri->user)) { + return; + } + + /* Test URI user against allowed characters in AST_DIGIT_ANY */ + for (; i < pj_strlen(&sip_uri->user); i++) { + if (!strchr(AST_DIGIT_ANYNUM, pj_strbuf(&sip_uri->user)[i])) { + break; + } + } + + if (i < pj_strlen(&sip_uri->user)) { + return; + } + + param = PJ_POOL_ALLOC_T(pool, pjsip_param); + param->name = STR_USER; + param->value = STR_PHONE; + pj_list_insert_before(&sip_uri->other_param, param); +} + pjsip_dialog *ast_sip_create_dialog_uac(const struct ast_sip_endpoint *endpoint, const char *uri, const char *request_user) { char enclosed_uri[PJSIP_MAX_URL_SIZE]; @@ -2173,6 +2215,9 @@ pj_strdup2(dlg->pool, &sip_uri->user, request_user); } } + + /* Add the user=phone parameter if applicable */ + ast_sip_add_usereqphone(endpoint, dlg->pool, dlg->target); /* We have to temporarily bump up the sess_count here so the dialog is not prematurely destroyed */ dlg->sess_count++; @@ -2373,6 +2418,9 @@ pjsip_endpt_release_pool(ast_sip_get_pjsip_endpoint(), pool); return -1; } + + /* Add the user=phone parameter if applicable */ + ast_sip_add_usereqphone(endpoint, (*tdata)->pool, (*tdata)->msg->line.req.uri); /* If an outbound proxy is specified on the endpoint apply it to this request */ if (endpoint && !ast_strlen_zero(endpoint->outbound_proxy) && Modified: certified/branches/13.1/res/res_pjsip/pjsip_configuration.c URL: http://svnview.digium.com/svn/asterisk/certified/branches/13.1/res/res_pjsip/pjsip_configuration.c?view=diff&rev=430085&r1=430084&r2=430085 ============================================================================== --- certified/branches/13.1/res/res_pjsip/pjsip_configuration.c (original) +++ certified/branches/13.1/res/res_pjsip/pjsip_configuration.c Wed Dec 24 07:26:21 2014 @@ -1740,6 +1740,7 @@ ast_sorcery_object_field_register(sip_sorcery, "endpoint", "record_on_feature", "automixmon", OPT_STRINGFIELD_T, 0, STRFLDSET(struct ast_sip_endpoint, info.recording.onfeature)); ast_sorcery_object_field_register(sip_sorcery, "endpoint", "record_off_feature", "automixmon", OPT_STRINGFIELD_T, 0, STRFLDSET(struct ast_sip_endpoint, info.recording.offfeature)); ast_sorcery_object_field_register(sip_sorcery, "endpoint", "allow_transfer", "yes", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, allowtransfer)); + ast_sorcery_object_field_register(sip_sorcery, "endpoint", "user_eq_phone", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, usereqphone)); ast_sorcery_object_field_register(sip_sorcery, "endpoint", "sdp_owner", "-", OPT_STRINGFIELD_T, 0, STRFLDSET(struct ast_sip_endpoint, media.sdpowner)); ast_sorcery_object_field_register(sip_sorcery, "endpoint", "sdp_session", "Asterisk", OPT_STRINGFIELD_T, 0, STRFLDSET(struct ast_sip_endpoint, media.sdpsession)); ast_sorcery_object_field_register_custom(sip_sorcery, "endpoint", "tos_audio", "0", tos_handler, tos_audio_to_str, NULL, 0, 0); Modified: certified/branches/13.1/res/res_pjsip_caller_id.c URL: http://svnview.digium.com/svn/asterisk/certified/branches/13.1/res/res_pjsip_caller_id.c?view=diff&rev=430085&r1=430084&r2=430085 ============================================================================== --- certified/branches/13.1/res/res_pjsip_caller_id.c (original) +++ certified/branches/13.1/res/res_pjsip_caller_id.c Wed Dec 24 07:26:21 2014 @@ -669,11 +669,7 @@ ast_party_id_copy(&connected_id, &effective_id); ast_channel_unlock(session->channel); - if (session->inv_session->state < PJSIP_INV_STATE_CONFIRMED && - ast_strlen_zero(session->endpoint->fromuser) && - (session->endpoint->id.trust_outbound || - ((connected_id.name.presentation & AST_PRES_RESTRICTION) == AST_PRES_ALLOWED && - (connected_id.number.presentation & AST_PRES_RESTRICTION) == AST_PRES_ALLOWED))) { + if (session->inv_session->state < PJSIP_INV_STATE_CONFIRMED) { /* Only change the From header on the initial outbound INVITE. Switching it * mid-call might confuse some UAs. */ @@ -683,8 +679,16 @@ from = pjsip_msg_find_hdr(tdata->msg, PJSIP_H_FROM, tdata->msg->hdr.next); dlg = session->inv_session->dlg; - modify_id_header(tdata->pool, from, &connected_id); - modify_id_header(dlg->pool, dlg->local.info, &connected_id); + if (ast_strlen_zero(session->endpoint->fromuser) && + (session->endpoint->id.trust_outbound || + ((connected_id.name.presentation & AST_PRES_RESTRICTION) == AST_PRES_ALLOWED && + (connected_id.number.presentation & AST_PRES_RESTRICTION) == AST_PRES_ALLOWED))) { + modify_id_header(tdata->pool, from, &connected_id); + modify_id_header(dlg->pool, dlg->local.info, &connected_id); + } + + ast_sip_add_usereqphone(session->endpoint, tdata->pool, from->uri); + ast_sip_add_usereqphone(session->endpoint, dlg->pool, dlg->local.info->uri); } add_id_headers(session, tdata, &connected_id); ast_party_id_free(&connected_id); -- _____________________________________________________________________ -- Bandwidth and Colocation Provided by http://www.api-digital.com -- svn-commits mailing list To UNSUBSCRIBE or update options visit: http://lists.digium.com/mailman/listinfo/svn-commits
