[asterisk-commits] mjordan: branch 13 r430083 - in /branches/13: ./ include/asterisk/ res/ res/r...

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Wed Dec 24 07:20:06 CST 2014


Author: mjordan
Date: Wed Dec 24 07:20:00 2014
New Revision: 430083

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=430083
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/


Modified:
    branches/13/CHANGES
    branches/13/include/asterisk/res_pjsip.h
    branches/13/res/res_pjsip.c
    branches/13/res/res_pjsip/pjsip_configuration.c
    branches/13/res/res_pjsip_caller_id.c

Modified: branches/13/CHANGES
URL: http://svnview.digium.com/svn/asterisk/branches/13/CHANGES?view=diff&rev=430083&r1=430082&r2=430083
==============================================================================
--- branches/13/CHANGES (original)
+++ branches/13/CHANGES Wed Dec 24 07:20:00 2014
@@ -11,6 +11,11 @@
 --- Functionality changes from Asterisk 13.1.0 to Asterisk 13.2.0 ------------
 ------------------------------------------------------------------------------
 
+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.
+
 res_pjsip_config_wizard
 ------------------
  * This is a new module that adds streamlined configuration capability for
@@ -121,7 +126,6 @@
 
 Finally, all users upgrading to Asterisk 13 should read the UPGRADE.txt file
 delivered with this release.
-
 
 Build System
 ------------------

Modified: branches/13/include/asterisk/res_pjsip.h
URL: http://svnview.digium.com/svn/asterisk/branches/13/include/asterisk/res_pjsip.h?view=diff&rev=430083&r1=430082&r2=430083
==============================================================================
--- branches/13/include/asterisk/res_pjsip.h (original)
+++ branches/13/include/asterisk/res_pjsip.h Wed Dec 24 07:20:00 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: branches/13/res/res_pjsip.c
URL: http://svnview.digium.com/svn/asterisk/branches/13/res/res_pjsip.c?view=diff&rev=430083&r1=430082&r2=430083
==============================================================================
--- branches/13/res/res_pjsip.c (original)
+++ branches/13/res/res_pjsip.c Wed Dec 24 07:20:00 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: branches/13/res/res_pjsip/pjsip_configuration.c
URL: http://svnview.digium.com/svn/asterisk/branches/13/res/res_pjsip/pjsip_configuration.c?view=diff&rev=430083&r1=430082&r2=430083
==============================================================================
--- branches/13/res/res_pjsip/pjsip_configuration.c (original)
+++ branches/13/res/res_pjsip/pjsip_configuration.c Wed Dec 24 07:20:00 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: branches/13/res/res_pjsip_caller_id.c
URL: http://svnview.digium.com/svn/asterisk/branches/13/res/res_pjsip_caller_id.c?view=diff&rev=430083&r1=430082&r2=430083
==============================================================================
--- branches/13/res/res_pjsip_caller_id.c (original)
+++ branches/13/res/res_pjsip_caller_id.c Wed Dec 24 07:20:00 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);




More information about the asterisk-commits mailing list