mirror of
https://github.com/znc/znc.git
synced 2026-08-06 17:03:14 +02:00
Fix CString::Escape_n() and add some tests for it
This bug was originally reported by someone on irc, but sadly I forgot who it was. Sorry! Signed-off-by: Uli Schlachter <psychon@znc.in>
This commit is contained in:
@@ -31,6 +31,7 @@ Makefile
|
||||
/modules/*.pyc
|
||||
|
||||
/test/ConfigTest
|
||||
/test/EscapeTest
|
||||
|
||||
# Compiled Object files
|
||||
*.o
|
||||
|
||||
+4
-4
@@ -212,10 +212,10 @@ CString CString::Escape_n(EEscape eFrom, EEscape eTo) const {
|
||||
}
|
||||
|
||||
if (ch == 0) {
|
||||
if (!strncasecmp((const char*) &pTmp, "lt", 2)) ch = '<';
|
||||
else if (!strncasecmp((const char*) &pTmp, "gt", 2)) ch = '>';
|
||||
else if (!strncasecmp((const char*) &pTmp, "quot", 4)) ch = '"';
|
||||
else if (!strncasecmp((const char*) &pTmp, "amp", 3)) ch = '&';
|
||||
if (!strncasecmp((const char*) &pTmp, "<", 2)) ch = '<';
|
||||
else if (!strncasecmp((const char*) &pTmp, ">", 2)) ch = '>';
|
||||
else if (!strncasecmp((const char*) &pTmp, """, 4)) ch = '"';
|
||||
else if (!strncasecmp((const char*) &pTmp, "&", 3)) ch = '&';
|
||||
}
|
||||
|
||||
if (ch > 0) {
|
||||
|
||||
@@ -0,0 +1,55 @@
|
||||
/*
|
||||
* Copyright (C) 2004-2011 See the AUTHORS file for details.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 as published
|
||||
* by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#include "ZNCString.h"
|
||||
#include "ZNCDebug.h"
|
||||
|
||||
static int testEqual(const CString& a, const CString& b, const CString& what)
|
||||
{
|
||||
if (a == b)
|
||||
return 0;
|
||||
std::cout << what << " failed for '" << b << "', result is '" << a << "'\n";
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int testString(const CString& in, const CString& url,
|
||||
const CString& html, const CString& sql) {
|
||||
CString out;
|
||||
int errors = 0;
|
||||
|
||||
// Encode, then decode again and check we still got the same string
|
||||
|
||||
out = in.Escape_n(CString::EASCII, CString::EURL);
|
||||
errors += testEqual(out, url, "EURL encode");
|
||||
out = out.Escape_n(CString::EURL, CString::EASCII);
|
||||
errors += testEqual(out, in, "EURL decode");
|
||||
|
||||
out = in.Escape_n(CString::EASCII, CString::EHTML);
|
||||
errors += testEqual(out, html, "EHTML encode");
|
||||
out = out.Escape_n(CString::EHTML, CString::EASCII);
|
||||
errors += testEqual(out, in, "EHTML decode");
|
||||
|
||||
out = in.Escape_n(CString::EASCII, CString::ESQL);
|
||||
errors += testEqual(out, sql, "ESQL encode");
|
||||
out = out.Escape_n(CString::ESQL, CString::EASCII);
|
||||
errors += testEqual(out, in, "ESQL decode");
|
||||
|
||||
return errors;
|
||||
}
|
||||
|
||||
int main() {
|
||||
unsigned int failed = 0;
|
||||
|
||||
// input url html sql
|
||||
failed += testString("abcdefg", "abcdefg", "abcdefg", "abcdefg");
|
||||
failed += testString("\n\t\r", "%0A%09%0D", "\n\t\r", "\\n\\t\\r");
|
||||
failed += testString("'\"", "%27%22", "'"", "\\'\\\"");
|
||||
failed += testString("&<>", "%26%3C%3E", "&<>", "&<>");
|
||||
|
||||
return failed;
|
||||
}
|
||||
+6
-2
@@ -9,7 +9,7 @@ CXXFLAGS := @DEFS@ @CPPFLAGS@ @CXXFLAGS@ -I..
|
||||
LDFLAGS := @LDFLAGS@
|
||||
LIBS := @LIBS@
|
||||
|
||||
TARGETS := ConfigTest
|
||||
TARGETS := ConfigTest EscapeTest
|
||||
OBJS := $(addsuffix .o, $(TARGETS))
|
||||
ZNC_OBJS := Config.o ZNCDebug.o FileUtils.o Utils.o ZNCString.o MD5.o SHA256.o
|
||||
ZNC_OBJS := $(addprefix ../, $(ZNC_OBJS))
|
||||
@@ -35,6 +35,10 @@ ConfigTest: ConfigTest.o
|
||||
$(E) Linking $@...
|
||||
$(Q)$(CXX) $(LDFLAGS) -o $@ $< $(ZNC_OBJS) $(LIBS)
|
||||
|
||||
EscapeTest: EscapeTest.o
|
||||
$(E) Linking $@...
|
||||
$(Q)$(CXX) $(LDFLAGS) -o $@ $< $(ZNC_OBJS) $(LIBS)
|
||||
|
||||
%.o: %.cpp Makefile
|
||||
@mkdir -p .depend
|
||||
$(E) Building $@...
|
||||
@@ -42,5 +46,5 @@ ConfigTest: ConfigTest.o
|
||||
|
||||
test: $(TARGETS)
|
||||
for test in $(TARGETS) ; do \
|
||||
$$test || exit 1 ; \
|
||||
./$$test || exit 1 ; \
|
||||
done
|
||||
|
||||
Reference in New Issue
Block a user