[svn-commits] kmoore: branch kmoore/pjsip_path_support r403158 - in /team/kmoore/pjsip_path...

SVN commits to the Digium repositories svn-commits at lists.digium.com
Tue Nov 26 13:05:20 CST 2013


Author: kmoore
Date: Tue Nov 26 13:05:18 2013
New Revision: 403158

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=403158
Log:
Move path storage to the contact and support_path to the AoR

Modified:
    team/kmoore/pjsip_path_support/include/asterisk/res_pjsip.h
    team/kmoore/pjsip_path_support/res/res_pjsip/location.c
    team/kmoore/pjsip_path_support/res/res_pjsip/pjsip_configuration.c
    team/kmoore/pjsip_path_support/res/res_pjsip_registrar.c

Modified: team/kmoore/pjsip_path_support/include/asterisk/res_pjsip.h
URL: http://svnview.digium.com/svn/asterisk/team/kmoore/pjsip_path_support/include/asterisk/res_pjsip.h?view=diff&rev=403158&r1=403157&r2=403158
==============================================================================
--- team/kmoore/pjsip_path_support/include/asterisk/res_pjsip.h (original)
+++ team/kmoore/pjsip_path_support/include/asterisk/res_pjsip.h Tue Nov 26 13:05:18 2013
@@ -144,6 +144,8 @@
 	AST_DECLARE_STRING_FIELDS(
 		/*! Full URI of the contact */
 		AST_STRING_FIELD(uri);
+		/*! Path information to place in Route headers */
+		AST_STRING_FIELD(path);
 	);
 	/*! Absolute time that this contact is no longer valid after */
 	struct timeval expiration_time;
@@ -216,6 +218,8 @@
 	unsigned int remove_existing;
 	/*! Any permanent configured contacts */
 	struct ao2_container *permanent_contacts;
+	/*! Determines whether SIP Path headers are supported */
+	unsigned int support_path;
 };
 
 /*!
@@ -541,8 +545,6 @@
 		AST_STRING_FIELD(fromuser);
 		/*! Domain to place in From header */
 		AST_STRING_FIELD(fromdomain);
-		/*! Path information to place in the Route header */
-		AST_STRING_FIELD(path);
 	);
 	/*! Configuration for extensions */
 	struct ast_sip_endpoint_extensions extensions;
@@ -576,8 +578,6 @@
 	unsigned int faxdetect;
 	/*! Determines if transfers (using REFER) are allowed by this endpoint */
 	unsigned int allowtransfer;
-	/*! Determines whether SIP Path headers are supported */
-	unsigned int support_path;
 };
 
 /*!
@@ -919,11 +919,13 @@
  * \param aor Pointer to the AOR
  * \param uri Full contact URI
  * \param expiration_time Optional expiration time of the contact
+ * \param path_info Path information
  *
  * \retval -1 failure
  * \retval 0 success
  */
-int ast_sip_location_add_contact(struct ast_sip_aor *aor, const char *uri, struct timeval expiration_time);
+int ast_sip_location_add_contact(struct ast_sip_aor *aor, const char *uri,
+	struct timeval expiration_time, pj_str_t *path_info);
 
 /*!
  * \brief Update a contact

Modified: team/kmoore/pjsip_path_support/res/res_pjsip/location.c
URL: http://svnview.digium.com/svn/asterisk/team/kmoore/pjsip_path_support/res/res_pjsip/location.c?view=diff&rev=403158&r1=403157&r2=403158
==============================================================================
--- team/kmoore/pjsip_path_support/res/res_pjsip/location.c (original)
+++ team/kmoore/pjsip_path_support/res/res_pjsip/location.c Tue Nov 26 13:05:18 2013
@@ -222,7 +222,7 @@
 	return ast_sorcery_retrieve_by_id(ast_sip_get_sorcery(), "contact", contact_name);
 }
 
-int ast_sip_location_add_contact(struct ast_sip_aor *aor, const char *uri, struct timeval expiration_time)
+int ast_sip_location_add_contact(struct ast_sip_aor *aor, const char *uri, struct timeval expiration_time, pj_str_t *path_info)
 {
 	char name[AST_UUID_STR_LEN];
 	RAII_VAR(struct ast_sip_contact *, contact, NULL, ao2_cleanup);
@@ -237,6 +237,9 @@
 	contact->expiration_time = expiration_time;
 	contact->qualify_frequency = aor->qualify_frequency;
 	contact->authenticate_qualify = aor->authenticate_qualify;
+	if (path_info && aor->support_path) {
+		ast_string_field_build(contact, path, "%.*s", (int)path_info->slen, path_info->ptr);
+	}
 
 	return ast_sorcery_create(ast_sip_get_sorcery(), contact);
 }
@@ -444,6 +447,7 @@
 	ast_sorcery_object_field_register(sorcery, "aor", "remove_existing", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_aor, remove_existing));
 	ast_sorcery_object_field_register_custom(sorcery, "aor", "contact", "", permanent_uri_handler, NULL, 0, 0);
 	ast_sorcery_object_field_register(sorcery, "aor", "mailboxes", "", OPT_STRINGFIELD_T, 0, STRFLDSET(struct ast_sip_aor, mailboxes));
+	ast_sorcery_object_field_register(sorcery, "aor", "support_path", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_aor, support_path));
 
 	ast_sip_register_endpoint_formatter(&endpoint_aor_formatter);
 	return 0;

Modified: team/kmoore/pjsip_path_support/res/res_pjsip/pjsip_configuration.c
URL: http://svnview.digium.com/svn/asterisk/team/kmoore/pjsip_path_support/res/res_pjsip/pjsip_configuration.c?view=diff&rev=403158&r1=403157&r2=403158
==============================================================================
--- team/kmoore/pjsip_path_support/res/res_pjsip/pjsip_configuration.c (original)
+++ team/kmoore/pjsip_path_support/res/res_pjsip/pjsip_configuration.c Tue Nov 26 13:05:18 2013
@@ -1353,7 +1353,6 @@
 	ast_sorcery_object_field_register_custom(sip_sorcery, "endpoint", "dtls_ca_path", "", dtls_handler, dtlscapath_to_str, 0, 0);
 	ast_sorcery_object_field_register_custom(sip_sorcery, "endpoint", "dtls_setup", "", dtls_handler, dtlssetup_to_str, 0, 0);
 	ast_sorcery_object_field_register(sip_sorcery, "endpoint", "srtp_tag_32", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, media.rtp.srtp_tag_32));
-	ast_sorcery_object_field_register(sip_sorcery, "endpoint", "support_path", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, support_path));
 
 	if (ast_sip_initialize_sorcery_transport(sip_sorcery)) {
 		ast_log(LOG_ERROR, "Failed to register SIP transport support with sorcery\n");

Modified: team/kmoore/pjsip_path_support/res/res_pjsip_registrar.c
URL: http://svnview.digium.com/svn/asterisk/team/kmoore/pjsip_path_support/res/res_pjsip_registrar.c?view=diff&rev=403158&r1=403157&r2=403158
==============================================================================
--- team/kmoore/pjsip_path_support/res/res_pjsip_registrar.c (original)
+++ team/kmoore/pjsip_path_support/res/res_pjsip_registrar.c Tue Nov 26 13:05:18 2013
@@ -347,20 +347,37 @@
 	return task_data;
 }
 
-static void update_path_data(struct rx_task_data *task_data)
-{
-	const pj_str_t path_name = { "Path", 4 };
-	pjsip_generic_string_hdr *hdr;
-
-	if (!task_data->endpoint->support_path) {
-		return;
-	}
-
-	if (!(hdr = pjsip_msg_find_hdr_by_name(task_data->rdata->msg_info.msg, &path_name, NULL))) {
-		return;
-	}
-
-	ast_string_field_build(task_data->endpoint, path, "%.*s", (int)hdr->hvalue.slen, hdr->hvalue.ptr);
+static const pj_str_t path_hdr_name = { "Path", 4 };
+
+static int registrar_validate_path(struct rx_task_data *task_data, pjsip_generic_string_hdr **path_hdr)
+{
+	const pj_str_t path_supported_name = { "path", 4 };
+	pjsip_supported_hdr *supported_hdr;
+	int i;
+
+	if (!task_data->aor->support_path) {
+		return 0;
+	}
+
+	*path_hdr = pjsip_msg_find_hdr_by_name(task_data->rdata->msg_info.msg, &path_hdr_name, NULL);
+	if (!*path_hdr) {
+		return 0;
+	}
+
+	supported_hdr = pjsip_msg_find_hdr(task_data->rdata->msg_info.msg, PJSIP_H_SUPPORTED, NULL);
+	if (!supported_hdr) {
+		return -1;
+	}
+
+	/* Find advertised path support */
+	for (i = 0; i < supported_hdr->count; i++) {
+		if (!pj_stricmp(&supported_hdr->values[i], &path_supported_name)) {
+			return 0;
+		}
+	}
+
+	/* Path header present, but support not advertised */
+	return -1;
 }
 
 static int rx_task(void *data)
@@ -374,6 +391,7 @@
 	pjsip_tx_data *tdata;
 	pjsip_response_addr addr;
 	const char *aor_name = ast_sorcery_object_get_id(task_data->aor);
+	pjsip_generic_string_hdr *path_hdr = NULL;
 
 	/* Retrieve the current contacts, we'll need to know whether to update or not */
 	contacts = ast_sip_location_retrieve_aor_contacts(task_data->aor);
@@ -386,6 +404,14 @@
 		pjsip_endpt_respond_stateless(ast_sip_get_pjsip_endpoint(), task_data->rdata, 400, NULL, NULL, NULL);
 		ast_sip_report_failed_acl(task_data->endpoint, task_data->rdata, "registrar_invalid_contacts_provided");
 		ast_log(LOG_WARNING, "Failed to validate contacts in REGISTER request from '%s'\n",
+				ast_sorcery_object_get_id(task_data->endpoint));
+		return PJ_TRUE;
+	}
+
+	if (registrar_validate_path(task_data, &path_hdr)) {
+		/* Ensure that intervening proxies did not make invalid modifications to the request */
+		pjsip_endpt_respond_stateless(ast_sip_get_pjsip_endpoint(), task_data->rdata, 420, NULL, NULL, NULL);
+		ast_log(LOG_WARNING, "Invalid modifications made to REGISTER request from '%s' by intervening proxy\n",
 				ast_sorcery_object_get_id(task_data->endpoint));
 		return PJ_TRUE;
 	}
@@ -433,7 +459,8 @@
 				continue;
 			}
 
-			ast_sip_location_add_contact(task_data->aor, contact_uri, ast_tvadd(ast_tvnow(), ast_samp2tv(expiration, 1)));
+			ast_sip_location_add_contact(task_data->aor, contact_uri, ast_tvadd(ast_tvnow(),
+				ast_samp2tv(expiration, 1)), &path_hdr->hvalue);
 			ast_verb(3, "Added contact '%s' to AOR '%s' with expiration of %d seconds\n",
 				contact_uri, aor_name, expiration);
 			ast_test_suite_event_notify("AOR_CONTACT_ADDED",
@@ -448,6 +475,9 @@
 			updated->expiration_time = ast_tvadd(ast_tvnow(), ast_samp2tv(expiration, 1));
 			updated->qualify_frequency = task_data->aor->qualify_frequency;
 			updated->authenticate_qualify = task_data->aor->authenticate_qualify;
+			if (path_hdr) {
+				ast_string_field_build(updated, path, "%.*s", (int)path_hdr->hvalue.slen, path_hdr->hvalue.ptr);
+			}
 
 			ast_sip_location_update_contact(updated);
 			ast_debug(3, "Refreshed contact '%s' on AOR '%s' with new expiration of %d seconds\n",
@@ -479,9 +509,6 @@
 		ao2_callback(contacts, OBJ_NODATA | OBJ_MULTIPLE, registrar_delete_contact, NULL);
 	}
 
-	/* Process Path information */
-	update_path_data(task_data);
-
 	/* Update the contacts as things will probably have changed */
 	ao2_cleanup(contacts);
 	contacts = ast_sip_location_retrieve_aor_contacts(task_data->aor);




More information about the svn-commits mailing list