asterisk/tests/test_xml_escape.c
David M. Lee aecd2429bd Fix XML encoding of 'identity display' in NOTIFY messages.
XML encoding in chan_sip is accomplished by naively building the XML
directly from strings. While this usually works, it fails to take into
account escaping the reserved characters in XML.

This patch adds an 'ast_xml_escape' function, which works similarly to
'ast_uri_encode'. This is used to properly escape the local_display
attribute in XML formatted NOTIFY messages.

Several things to note:
 * The Right Thing(TM) to do would probably be to replace the
   ast_build_string stuff with building an ast_xml_doc. That's a much
   bigger change, and out of scope for the original ticket, so I
   refrained myself.
 * It is with great sadness that I wrote my own ast_xml_escape
   function. There's one in libxml2, but it's knee-deep in
   libxml2-ness, and not easily used to one-off escape a
   string.
 * I only escaped the string we know is causing problems
   (local_display). At least some of the other strings are
   URI-encoded, which should be XML safe. Rather than figuring out
   what's safe and escaping what's not, it would be much cleaner to
   simply build an ast_xml_doc for the messages and let the XML
   library do the XML escaping. Like I said, that's out of scope.

(closes issue ABE-2902)
Reported by: Guenther Kelleter
Tested by: Guenther Kelleter
Review: http://reviewboard.digium.internal/r/365/

........

Merged revision 378919 from https://origsvn.digium.com/svn/asterisk/be/branches/C.3-bier
........

Merged revisions 378933 from http://svn.asterisk.org/svn/asterisk/branches/1.8
........

Merged revisions 378934 from http://svn.asterisk.org/svn/asterisk/branches/11


git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@378935 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2013-01-12 06:43:37 +00:00

119 lines
2.6 KiB
C

/*
* Asterisk -- An open source telephony toolkit.
*
* Copyright (C) 2013, Digium, Inc.
*
* David M. Lee, II <dlee@digium.com>
*
* See http://www.asterisk.org for more information about
* the Asterisk project. Please do not directly contact
* any of the maintainers of this project for assistance;
* the project provides a web site, mailing lists and IRC
* channels for your use.
*
* This program is free software, distributed under the terms of
* the GNU General Public License Version 2. See the LICENSE file
* at the top of the source tree.
*/
/*!
* \file
* \brief Test ast_xml_escape
*
* \author\verbatim David M. Lee, II <dlee@digium.com> \endverbatim
*
* \ingroup tests
*/
/*** MODULEINFO
<depend>TEST_FRAMEWORK</depend>
<support_level>core</support_level>
***/
#include "asterisk.h"
ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
#include "asterisk/utils.h"
#include "asterisk/module.h"
#include "asterisk/test.h"
static enum ast_test_result_state test_res = AST_TEST_PASS;
static void test_xml(struct ast_test *test, const char *input, const char *expected, int max_len, int expected_res)
{
char actual[256] = "";
int res;
if (max_len == -1) {
max_len = sizeof(actual);
}
res = ast_xml_escape(input, actual, max_len);
if (res != expected_res) {
ast_test_status_update(test, "Expected result '%d', got '%d'\n", expected_res, res);
test_res = AST_TEST_FAIL;
}
if (strcmp(expected, actual) != 0) {
ast_test_status_update(test, "Expected output '%s', got '%s'\n", expected, actual);
test_res = AST_TEST_FAIL;
}
}
AST_TEST_DEFINE(xml_escape_test)
{
char *input;
char *expected;
switch (cmd) {
case TEST_INIT:
info->name = "xml_escape_test";
info->category = "/main/xml_escape/";
info->summary = "Test XML escaping";
info->description =
"Test XML escaping";
return AST_TEST_NOT_RUN;
case TEST_EXECUTE:
break;
}
test_res = AST_TEST_PASS;
/* happy path */
input = "encode me: <&>'\"";
expected = "encode me: &lt;&amp;&gt;&apos;&quot;";
test_xml(test, input, expected, -1, 0);
/* size 0 should fail without changing anything */
input = "foo";
expected = "";
test_xml(test, input, expected, 0, -1);
/* truncate chars */
input = "<truncated>";
expected = "&lt;trunc";
test_xml(test, input, expected, 10, -1);
/* truncate entity */
input = "trunc<";
expected = "trunc";
test_xml(test, input, expected, 9, -1);
return test_res;
}
static int unload_module(void)
{
AST_TEST_UNREGISTER(xml_escape_test);
return 0;
}
static int load_module(void)
{
AST_TEST_REGISTER(xml_escape_test);
return AST_MODULE_LOAD_SUCCESS;
}
AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Skeleton (sample) Test");