]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Fix presence body errors found during testing:
authorMark Michelson <mmichelson@digium.com>
Thu, 23 Jan 2014 21:09:35 +0000 (21:09 +0000)
committerMark Michelson <mmichelson@digium.com>
Thu, 23 Jan 2014 21:09:35 +0000 (21:09 +0000)
* 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 "&gt;"
* 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

res/res_pjsip_pidf.c

index 4f1d3b3cd315bbb873594d9ef6d68e6f9a3c242d..f9e4206198428d13c8cbde0b950b77a3d5afa1a5 100644 (file)
@@ -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");