diff --git a/.gitignore b/.gitignore index 4b760b40..590d8d19 100644 --- a/.gitignore +++ b/.gitignore @@ -31,6 +31,7 @@ Makefile /modules/*.pyc /test/ConfigTest +/test/EscapeTest # Compiled Object files *.o diff --git a/ZNCString.cpp b/ZNCString.cpp index d8e0e9fa..a9d9eb24 100644 --- a/ZNCString.cpp +++ b/ZNCString.cpp @@ -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) { diff --git a/test/EscapeTest.cpp b/test/EscapeTest.cpp new file mode 100644 index 00000000..dc06aba0 --- /dev/null +++ b/test/EscapeTest.cpp @@ -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; +} diff --git a/test/Makefile.in b/test/Makefile.in index efa1cf7f..89a19f4d 100644 --- a/test/Makefile.in +++ b/test/Makefile.in @@ -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