[asterisk-commits] mmichelson: branch 12 r423344 - in /branches/12: include/asterisk/ res/

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Thu Sep 18 10:40:52 CDT 2014


Author: mmichelson
Date: Thu Sep 18 10:40:47 2014
New Revision: 423344

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=423344
Log:
res_pjsip_pubsub: Add some type safety when generating NOTIFY bodies.

res_pjsip_pubsub has two separate checks that it makes when a SUBSCRIBE
arrives.
* It checks that there is a subscription handler for the Event
* It checks that there are body generators for the types in the Accept header

The problem is, there's nothing that ensures that these two things will
actually mesh with each other. For instance, Asterisk will accept a subscription
to MWI that accepts pidf+xml bodies. That doesn't make sense.

With this commit, we add some type information to the mix. Subscription
handlers state they generate data of type X, and body generators state
that they consume data of type X. This way, Asterisk doesn't end up in
some hilariously mismatched situation like the one in the previous paragraph.

ASTERISK-24136 #close
Reported by Mark Michelson

Review: https://reviewboard.asterisk.org/r/3877
Review: https://reviewboard.asterisk.org/r/3878


Modified:
    branches/12/include/asterisk/res_pjsip_pubsub.h
    branches/12/res/res_pjsip_dialog_info_body_generator.c
    branches/12/res/res_pjsip_exten_state.c
    branches/12/res/res_pjsip_mwi.c
    branches/12/res/res_pjsip_mwi_body_generator.c
    branches/12/res/res_pjsip_pidf_body_generator.c
    branches/12/res/res_pjsip_pubsub.c
    branches/12/res/res_pjsip_xpidf_body_generator.c

Modified: branches/12/include/asterisk/res_pjsip_pubsub.h
URL: http://svnview.digium.com/svn/asterisk/branches/12/include/asterisk/res_pjsip_pubsub.h?view=diff&rev=423344&r1=423343&r2=423344
==============================================================================
--- branches/12/include/asterisk/res_pjsip_pubsub.h (original)
+++ branches/12/include/asterisk/res_pjsip_pubsub.h Thu Sep 18 10:40:47 2014
@@ -221,11 +221,18 @@
 	struct ast_sip_body *body;
 };
 
+/*!
+ * \brief Type information for NOTIFY/PUBLISH body data
+ */
+#define AST_SIP_EXTEN_STATE_DATA "ast_sip_exten_state_data"
+#define AST_SIP_MESSAGE_ACCUMULATOR "ast_sip_message_accumulator"
+
 #define AST_SIP_MAX_ACCEPT 32
 
 struct ast_sip_subscription_handler {
 	/*! The name of the event this handler deals with */
 	const char *event_name;
+	const char *body_type;
 	/*! The types of body this handler accepts.
 	 *
 	 * \note This option has no bearing when the handler is used in the
@@ -566,6 +573,8 @@
 	 * In "plain/text", "text" is the subtype
 	 */
 	const char *subtype;
+	/*! The type of body that the body generator takes as input */
+	const char *body_type;
 	/*!
 	 * \brief allocate body structure.
 	 *
@@ -643,6 +652,16 @@
 	 */
 	int (*supplement_body)(void *body, void *data);
 	AST_LIST_ENTRY(ast_sip_pubsub_body_supplement) list;
+};
+
+/*!
+ * \brief Data used to create bodies for NOTIFY/PUBLISH requests.
+ */
+struct ast_sip_body_data {
+	/*! The type of the data */
+	const char *body_type;
+	/*! The actual data from which the body is generated */
+	void *body_data;
 };
 
 /*!
@@ -662,7 +681,7 @@
  * \retval non-zero Failure
  */
 int ast_sip_pubsub_generate_body_content(const char *content_type,
-		const char *content_subtype, void *data, struct ast_str **str);
+		const char *content_subtype, struct ast_sip_body_data *data, struct ast_str **str);
 
 /*!
  * \since 13.0.0

Modified: branches/12/res/res_pjsip_dialog_info_body_generator.c
URL: http://svnview.digium.com/svn/asterisk/branches/12/res/res_pjsip_dialog_info_body_generator.c?view=diff&rev=423344&r1=423343&r2=423344
==============================================================================
--- branches/12/res/res_pjsip_dialog_info_body_generator.c (original)
+++ branches/12/res/res_pjsip_dialog_info_body_generator.c Thu Sep 18 10:40:47 2014
@@ -187,6 +187,7 @@
 static struct ast_sip_pubsub_body_generator dialog_info_body_generator = {
 	.type = "application",
 	.subtype = "dialog-info+xml",
+	.body_type = AST_SIP_EXTEN_STATE_DATA,
 	.allocate_body = dialog_info_allocate_body,
 	.generate_body_content = dialog_info_generate_body_content,
 	.to_string = dialog_info_to_string,

Modified: branches/12/res/res_pjsip_exten_state.c
URL: http://svnview.digium.com/svn/asterisk/branches/12/res/res_pjsip_exten_state.c?view=diff&rev=423344&r1=423343&r2=423344
==============================================================================
--- branches/12/res/res_pjsip_exten_state.c (original)
+++ branches/12/res/res_pjsip_exten_state.c Thu Sep 18 10:40:47 2014
@@ -81,6 +81,7 @@
 
 struct ast_sip_subscription_handler presence_handler = {
 	.event_name = "presence",
+	.body_type = AST_SIP_EXTEN_STATE_DATA,
 	.accept = { DEFAULT_PRESENCE_BODY, },
 	.default_accept = DEFAULT_PRESENCE_BODY,
 	.subscription_shutdown = subscription_shutdown,
@@ -93,6 +94,7 @@
 
 struct ast_sip_subscription_handler dialog_handler = {
 	.event_name = "dialog",
+	.body_type = AST_SIP_EXTEN_STATE_DATA,
 	.accept = { DEFAULT_DIALOG_BODY, },
 	.default_accept = DEFAULT_DIALOG_BODY,
 	.subscription_shutdown = subscription_shutdown,
@@ -180,12 +182,16 @@
 	const pj_str_t *reason_str_ptr = NULL;
 	pjsip_tx_data *tdata;
 	struct ast_sip_body body;
+	struct ast_sip_body_data body_data = {
+		.body_type = AST_SIP_EXTEN_STATE_DATA,
+		.body_data = exten_state_data,
+	};
 
 	body.type = ast_sip_subscription_get_body_type(exten_state_sub->sip_sub);
 	body.subtype = ast_sip_subscription_get_body_subtype(exten_state_sub->sip_sub);
 
 	if (ast_sip_pubsub_generate_body_content(body.type, body.subtype,
-				exten_state_data, &body_text)) {
+				&body_data, &body_text)) {
 		ast_log(LOG_ERROR, "Unable to create body on NOTIFY request\n");
 		return;
 	}

Modified: branches/12/res/res_pjsip_mwi.c
URL: http://svnview.digium.com/svn/asterisk/branches/12/res/res_pjsip_mwi.c?view=diff&rev=423344&r1=423343&r2=423344
==============================================================================
--- branches/12/res/res_pjsip_mwi.c (original)
+++ branches/12/res/res_pjsip_mwi.c Thu Sep 18 10:40:47 2014
@@ -63,6 +63,7 @@
 
 static struct ast_sip_subscription_handler mwi_handler = {
 	.event_name = "message-summary",
+	.body_type = AST_SIP_MESSAGE_ACCUMULATOR,
 	.accept = { MWI_TYPE"/"MWI_SUBTYPE, },
 	.default_accept =  MWI_TYPE"/"MWI_SUBTYPE,
 	.subscription_shutdown = mwi_subscription_shutdown,
@@ -432,6 +433,10 @@
 	pjsip_tx_data *tdata;
 	pj_str_t reason_str;
 	struct ast_sip_body body;
+	struct ast_sip_body_data body_data = {
+		.body_type = AST_SIP_MESSAGE_ACCUMULATOR,
+		.body_data = &counter,
+	};
 
 	body.type = sub->is_solicited ?
 		ast_sip_subscription_get_body_type(sub->sip_sub) :
@@ -448,7 +453,7 @@
 		reason_str_ptr = &reason_str;
 	}
 
-	if (ast_sip_pubsub_generate_body_content(body.type, body.subtype, &counter, &body_text)) {
+	if (ast_sip_pubsub_generate_body_content(body.type, body.subtype, &body_data, &body_text)) {
 		ast_log(LOG_WARNING, "Unable to generate SIP MWI NOTIFY body.\n");
 		return;
 	}

Modified: branches/12/res/res_pjsip_mwi_body_generator.c
URL: http://svnview.digium.com/svn/asterisk/branches/12/res/res_pjsip_mwi_body_generator.c?view=diff&rev=423344&r1=423343&r2=423344
==============================================================================
--- branches/12/res/res_pjsip_mwi_body_generator.c (original)
+++ branches/12/res/res_pjsip_mwi_body_generator.c Thu Sep 18 10:40:47 2014
@@ -85,6 +85,7 @@
 static struct ast_sip_pubsub_body_generator mwi_generator = {
 	.type = MWI_TYPE,
 	.subtype = MWI_SUBTYPE,
+	.body_type = AST_SIP_MESSAGE_ACCUMULATOR,
 	.allocate_body = mwi_allocate_body,
 	.generate_body_content = mwi_generate_body_content,
 	.to_string = mwi_to_string,

Modified: branches/12/res/res_pjsip_pidf_body_generator.c
URL: http://svnview.digium.com/svn/asterisk/branches/12/res/res_pjsip_pidf_body_generator.c?view=diff&rev=423344&r1=423343&r2=423344
==============================================================================
--- branches/12/res/res_pjsip_pidf_body_generator.c (original)
+++ branches/12/res/res_pjsip_pidf_body_generator.c Thu Sep 18 10:40:47 2014
@@ -109,6 +109,7 @@
 static struct ast_sip_pubsub_body_generator pidf_body_generator = {
 	.type = "application",
 	.subtype = "pidf+xml",
+	.body_type = AST_SIP_EXTEN_STATE_DATA,
 	.allocate_body = pidf_allocate_body,
 	.generate_body_content = pidf_generate_body_content,
 	.to_string = pidf_to_string,

Modified: branches/12/res/res_pjsip_pubsub.c
URL: http://svnview.digium.com/svn/asterisk/branches/12/res/res_pjsip_pubsub.c?view=diff&rev=423344&r1=423343&r2=423344
==============================================================================
--- branches/12/res/res_pjsip_pubsub.c (original)
+++ branches/12/res/res_pjsip_pubsub.c Thu Sep 18 10:40:47 2014
@@ -366,7 +366,7 @@
 
 static struct ast_sip_subscription_handler *find_sub_handler_for_event_name(const char *event_name);
 static struct ast_sip_pubsub_body_generator *find_body_generator(char accept[AST_SIP_MAX_ACCEPT][64],
-		size_t num_accept);
+		size_t num_accept, const char *body_type);
 
 /*! \brief Retrieve a handler using the Event header of an rdata message */
 static struct ast_sip_subscription_handler *subscription_get_handler_from_rdata(pjsip_rx_data *rdata)
@@ -414,7 +414,7 @@
 		num_accept_headers = 1;
 	}
 
-	return find_body_generator(accept, num_accept_headers);
+	return find_body_generator(accept, num_accept_headers, handler->body_type);
 }
 
 /*! \brief Callback function to perform the actual recreation of a subscription */
@@ -1092,7 +1092,7 @@
 }
 
 static struct ast_sip_pubsub_body_generator *find_body_generator(char accept[AST_SIP_MAX_ACCEPT][64],
-		size_t num_accept)
+		size_t num_accept, const char *body_type)
 {
 	int i;
 	struct ast_sip_pubsub_body_generator *generator = NULL;
@@ -1101,6 +1101,12 @@
 		generator = find_body_generator_accept(accept[i]);
 		if (generator) {
 			ast_debug(3, "Body generator %p found for accept type %s\n", generator, accept[i]);
+			if (strcmp(generator->body_type, body_type)) {
+				ast_log(LOG_WARNING, "Body generator '%s/%s'(%p) does not accept the type of data this event generates\n",
+						generator->type, generator->subtype, generator);
+				generator = NULL;
+				continue;
+			}
 			break;
 		} else {
 			ast_debug(3, "No body generator found for accept type %s\n", accept[i]);
@@ -1511,7 +1517,7 @@
 }
 
 int ast_sip_pubsub_generate_body_content(const char *type, const char *subtype,
-		void *data, struct ast_str **str)
+		struct ast_sip_body_data *data, struct ast_str **str)
 {
 	struct ast_sip_pubsub_body_supplement *supplement;
 	struct ast_sip_pubsub_body_generator *generator;
@@ -1525,14 +1531,19 @@
 		return -1;
 	}
 
-	body = generator->allocate_body(data);
+	if (strcmp(data->body_type, generator->body_type)) {
+		ast_log(LOG_WARNING, "Body generator does not accept the type of data provided\n");
+		return -1;
+	}
+
+	body = generator->allocate_body(data->body_data);
 	if (!body) {
 		ast_log(LOG_WARNING, "Unable to allocate a NOTIFY body of type %s/%s\n",
 				type, subtype);
 		return -1;
 	}
 
-	if (generator->generate_body_content(body, data)) {
+	if (generator->generate_body_content(body, data->body_data)) {
 		res = -1;
 		goto end;
 	}
@@ -1541,7 +1552,7 @@
 	AST_RWLIST_TRAVERSE(&body_supplements, supplement, list) {
 		if (!strcmp(generator->type, supplement->type) &&
 				!strcmp(generator->subtype, supplement->subtype)) {
-			res = supplement->supplement_body(body, data);
+			res = supplement->supplement_body(body, data->body_data);
 			if (res) {
 				break;
 			}

Modified: branches/12/res/res_pjsip_xpidf_body_generator.c
URL: http://svnview.digium.com/svn/asterisk/branches/12/res/res_pjsip_xpidf_body_generator.c?view=diff&rev=423344&r1=423343&r2=423344
==============================================================================
--- branches/12/res/res_pjsip_xpidf_body_generator.c (original)
+++ branches/12/res/res_pjsip_xpidf_body_generator.c Thu Sep 18 10:40:47 2014
@@ -126,6 +126,7 @@
 static struct ast_sip_pubsub_body_generator xpidf_body_generator = {
 	.type = "application",
 	.subtype = "xpidf+xml",
+	.body_type = AST_SIP_EXTEN_STATE_DATA,
 	.allocate_body = xpidf_allocate_body,
 	.generate_body_content = xpidf_generate_body_content,
 	.to_string = xpidf_to_string,
@@ -135,6 +136,7 @@
 static struct ast_sip_pubsub_body_generator cpim_pidf_body_generator = {
 	.type = "application",
 	.subtype = "cpim-pidf+xml",
+	.body_type = AST_SIP_EXTEN_STATE_DATA,
 	.allocate_body = xpidf_allocate_body,
 	.generate_body_content = xpidf_generate_body_content,
 	.to_string = xpidf_to_string,




More information about the asterisk-commits mailing list