From: Mark Michelson Date: Thu, 23 Jan 2014 21:09:35 +0000 (+0000) Subject: Fix presence body errors found during testing: X-Git-Tag: 12.1.0-rc1~3^2~52 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=466120a29f231edd0a13125c9d005bc3b7e59cbc;p=thirdparty%2Fasterisk.git Fix presence body errors found during testing: * PIDF bodies were reporting an "open" state in many cases where it should have been reporting "closed" * XPIDF bodies had XML nodes placed incorrectly within the hierarchy. * SIP URIs in XPIDF bodies did not go through XML sanitization * XML sanitization had some errors: * Right angle bracket was being replaced with "&rt;" instead of ">" * Double quote, apostrophe, and ampersand were not being escaped. git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/12@406295 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- diff --git a/res/res_pjsip_pidf.c b/res/res_pjsip_pidf.c index 4f1d3b3cd3..f9e4206198 100644 --- a/res/res_pjsip_pidf.c +++ b/res/res_pjsip_pidf.c @@ -115,22 +115,19 @@ static pj_xml_node *create_node(pj_pool_t *pool, pj_xml_node *parent, return node; } -static pj_xml_attr *find_node_attr(pj_pool_t* pool, pj_xml_node *parent, - const char *node_name, const char *attr_name) +static void find_node_attr(pj_pool_t* pool, pj_xml_node *parent, + const char *node_name, const char *attr_name, + pj_xml_node **node, pj_xml_attr **attr) { pj_str_t name; - pj_xml_node *node; - pj_xml_attr *attr; - if (!(node = pj_xml_find_node(parent, pj_cstr(&name, node_name)))) { - node = create_node(pool, parent, node_name); + if (!(*node = pj_xml_find_node(parent, pj_cstr(&name, node_name)))) { + *node = create_node(pool, parent, node_name); } - if (!(attr = pj_xml_find_attr(node, pj_cstr(&name, attr_name), NULL))) { - attr = create_attr(pool, node, attr_name, ""); + if (!(*attr = pj_xml_find_attr(*node, pj_cstr(&name, attr_name), NULL))) { + *attr = create_attr(pool, *node, attr_name, ""); } - - return attr; } /*! @@ -312,32 +309,28 @@ static int xpidf_xml_create_body(struct ast_sip_exten_state_data *data, const ch return -1; } - ast_sip_presence_xml_find_node_attr(state_data->pool, pres, "atom", "id", - &atom, &attr); - pj_strdup2(state_data->pool, &attr->value, state_data->exten); + find_node_attr(pool, pres, "atom", "id", &atom, &attr); + pj_strdup2(pool, &attr->value, data->exten); - ast_sip_presence_xml_find_node_attr(state_data->pool, atom, "address", - "uri", &address, &attr); + find_node_attr(pool, atom, "address", "uri", &address, &attr); - ast_sip_sanitize_xml(state_data->remote, sanitized, sizeof(sanitized)); + sanitize_xml(remote, sanitized, sizeof(sanitized)); - uri.ptr = (char*) pj_pool_alloc(state_data->pool, - strlen(sanitized) + STR_ADDR_PARAM.slen); + uri.ptr = (char*) pj_pool_alloc(pool, strlen(sanitized) + STR_ADDR_PARAM.slen); pj_strcpy2( &uri, sanitized); + pj_strcat( &uri, &STR_ADDR_PARAM); pj_strdup(state_data->pool, &attr->value, &uri); - ast_sip_presence_xml_create_attr(state_data->pool, address, "priority", "0.80000"); + create_attr(pool, address, "priority", "0.80000"); - ast_sip_presence_xml_find_node_attr(state_data->pool, address, - "status", "status", &status, &attr); - pj_strdup2(state_data->pool, &attr->value, + find_node_attr(pool, address, "status", "status", &status, &attr); + pj_strdup2(pool, &attr->value, (local_state == NOTIFY_OPEN) ? "open" : (local_state == NOTIFY_INUSE) ? "inuse" : "closed"); - ast_sip_presence_xml_find_node_attr(state_data->pool, address, - "msnsubstatus", "substatus", &msnsubstatus, &attr); - pj_strdup2(state_data->pool, &attr->value, + find_node_attr(pool, address, "msnsubstatus", "substatus", &msnsubstatus, &attr); + pj_strdup2(pool, &attr->value, (local_state == NOTIFY_OPEN) ? "online" : (local_state == NOTIFY_INUSE) ? "onthephone" : "offline");