summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRemko Tronçon <git@el-tramo.be>2012-12-13 13:35:53 (GMT)
committerRemko Tronçon <git@el-tramo.be>2013-04-06 20:22:02 (GMT)
commit9eff25182d1bea576d1910200909384ce79d90fe (patch)
treef5dadbce5fa2c37c34fcc6bb32550e6930abce14 /Swiften/IDN
parente9f2f7675b11ce36b3f66250156b78fae524a351 (diff)
downloadswift-9eff25182d1bea576d1910200909384ce79d90fe.zip
swift-9eff25182d1bea576d1910200909384ce79d90fe.tar.bz2
Make IDN implementation abstract.
Change-Id: I4c64f954ddeca7147d729b8be07237baa15c1795
Diffstat (limited to 'Swiften/IDN')
-rw-r--r--Swiften/IDN/IDNConverter.cpp14
-rw-r--r--Swiften/IDN/IDNConverter.h31
-rw-r--r--Swiften/IDN/LibIDNConverter.cpp80
-rw-r--r--Swiften/IDN/LibIDNConverter.h23
-rw-r--r--Swiften/IDN/PlatformIDNConverter.cpp27
-rw-r--r--Swiften/IDN/PlatformIDNConverter.h (renamed from Swiften/IDN/IDNA.h)13
-rw-r--r--Swiften/IDN/SConscript21
-rw-r--r--Swiften/IDN/StringPrep.h26
8 files changed, 193 insertions, 42 deletions
diff --git a/Swiften/IDN/IDNConverter.cpp b/Swiften/IDN/IDNConverter.cpp
new file mode 100644
index 0000000..7705812
--- /dev/null
+++ b/Swiften/IDN/IDNConverter.cpp
@@ -0,0 +1,14 @@
+/*
+ * Copyright (c) 2013 Remko Tronçon
+ * Licensed under the GNU General Public License v3.
+ * See Documentation/Licenses/GPLv3.txt for more information.
+ */
+
+#include <Swiften/IDN/IDNConverter.h>
+
+namespace Swift {
+
+IDNConverter::~IDNConverter() {
+}
+
+}
diff --git a/Swiften/IDN/IDNConverter.h b/Swiften/IDN/IDNConverter.h
new file mode 100644
index 0000000..c55d969
--- /dev/null
+++ b/Swiften/IDN/IDNConverter.h
@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 2013 Remko Tronçon
+ * Licensed under the GNU General Public License v3.
+ * See Documentation/Licenses/GPLv3.txt for more information.
+ */
+
+#pragma once
+
+#include <string>
+#include <Swiften/Base/API.h>
+#include <Swiften/Base/SafeByteArray.h>
+
+namespace Swift {
+ class SWIFTEN_API IDNConverter {
+ public:
+ virtual ~IDNConverter();
+
+ enum StringPrepProfile {
+ NamePrep,
+ XMPPNodePrep,
+ XMPPResourcePrep,
+ SASLPrep
+ };
+
+ virtual std::string getStringPrepared(const std::string& s, StringPrepProfile profile) = 0;
+ virtual SafeByteArray getStringPrepared(const SafeByteArray& s, StringPrepProfile profile) = 0;
+
+ // Thread-safe
+ virtual std::string getIDNAEncoded(const std::string& s) = 0;
+ };
+}
diff --git a/Swiften/IDN/LibIDNConverter.cpp b/Swiften/IDN/LibIDNConverter.cpp
new file mode 100644
index 0000000..c4a1c18
--- /dev/null
+++ b/Swiften/IDN/LibIDNConverter.cpp
@@ -0,0 +1,80 @@
+/*
+ * Copyright (c) 2012-2013 Remko Tronçon
+ * Licensed under the GNU General Public License v3.
+ * See Documentation/Licenses/GPLv3.txt for more information.
+ */
+
+#include <Swiften/IDN/LibIDNConverter.h>
+
+extern "C" {
+ #include <stringprep.h>
+ #include <idna.h>
+}
+
+#include <vector>
+#include <cassert>
+#include <cstdlib>
+#include <Swiften/Base/ByteArray.h>
+#include <Swiften/Base/SafeAllocator.h>
+#include <boost/shared_ptr.hpp>
+
+using namespace Swift;
+
+namespace {
+ static const int MAX_STRINGPREP_SIZE = 1024;
+
+ const Stringprep_profile* getLibIDNProfile(IDNConverter::StringPrepProfile profile) {
+ switch(profile) {
+ case IDNConverter::NamePrep: return stringprep_nameprep;
+ case IDNConverter::XMPPNodePrep: return stringprep_xmpp_nodeprep;
+ case IDNConverter::XMPPResourcePrep: return stringprep_xmpp_resourceprep;
+ case IDNConverter::SASLPrep: return stringprep_saslprep;
+ }
+ assert(false);
+ return 0;
+ }
+
+ template<typename StringType, typename ContainerType>
+ ContainerType getStringPreparedInternal(const StringType& s, IDNConverter::StringPrepProfile profile) {
+ ContainerType input(s.begin(), s.end());
+ input.resize(MAX_STRINGPREP_SIZE);
+ if (stringprep(&input[0], MAX_STRINGPREP_SIZE, static_cast<Stringprep_profile_flags>(0), getLibIDNProfile(profile)) == 0) {
+ return input;
+ }
+ else {
+ return ContainerType();
+ }
+ }
+}
+
+namespace Swift {
+
+std::string LibIDNConverter::getStringPrepared(const std::string& s, StringPrepProfile profile) {
+ std::vector<char> preparedData = getStringPreparedInternal< std::string, std::vector<char> >(s, profile);
+ if (preparedData.empty()) {
+ throw std::exception();
+ }
+ return std::string(vecptr(preparedData));
+}
+
+SafeByteArray LibIDNConverter::getStringPrepared(const SafeByteArray& s, StringPrepProfile profile) {
+ std::vector<char, SafeAllocator<char> > preparedData = getStringPreparedInternal<SafeByteArray, std::vector<char, SafeAllocator<char> > >(s, profile);
+ if (preparedData.empty()) {
+ throw std::exception();
+ }
+ return createSafeByteArray(reinterpret_cast<const char*>(vecptr(preparedData)));
+}
+
+std::string LibIDNConverter::getIDNAEncoded(const std::string& domain) {
+ char* output;
+ if (idna_to_ascii_8z(domain.c_str(), &output, 0) == IDNA_SUCCESS) {
+ std::string result(output);
+ free(output);
+ return result;
+ }
+ else {
+ return domain;
+ }
+}
+
+}
diff --git a/Swiften/IDN/LibIDNConverter.h b/Swiften/IDN/LibIDNConverter.h
new file mode 100644
index 0000000..23f6bbd
--- /dev/null
+++ b/Swiften/IDN/LibIDNConverter.h
@@ -0,0 +1,23 @@
+/*
+ * Copyright (c) 2012-2013 Remko Tronçon
+ * Licensed under the GNU General Public License v3.
+ * See Documentation/Licenses/GPLv3.txt for more information.
+ */
+
+#pragma once
+
+#include <string>
+#include <Swiften/Base/API.h>
+#include <Swiften/Base/Override.h>
+#include <Swiften/IDN/IDNConverter.h>
+
+namespace Swift {
+ class SWIFTEN_API LibIDNConverter : public IDNConverter {
+ public:
+ virtual std::string getStringPrepared(const std::string& s, StringPrepProfile profile) SWIFTEN_OVERRIDE;
+ virtual SafeByteArray getStringPrepared(const SafeByteArray& s, StringPrepProfile profile) SWIFTEN_OVERRIDE;
+
+ virtual std::string getIDNAEncoded(const std::string& s) SWIFTEN_OVERRIDE;
+ };
+}
+
diff --git a/Swiften/IDN/PlatformIDNConverter.cpp b/Swiften/IDN/PlatformIDNConverter.cpp
new file mode 100644
index 0000000..6d9cff7
--- /dev/null
+++ b/Swiften/IDN/PlatformIDNConverter.cpp
@@ -0,0 +1,27 @@
+/*
+ * Copyright (c) 2012 Remko Tronçon
+ * Licensed under the GNU General Public License v3.
+ * See Documentation/Licenses/GPLv3.txt for more information.
+ */
+
+#include <Swiften/IDN/PlatformIDNConverter.h>
+#if defined(HAVE_LIBIDN)
+#include <Swiften/IDN/LibIDNConverter.h>
+#elif defined(HAVE_ICU)
+#include <Swiften/IDN/ICUConverter.h>
+#endif
+
+namespace Swift {
+
+IDNConverter* PlatformIDNConverter::create() {
+#if defined(HAVE_LIBIDN)
+ return new LibIDNConverter();
+#elif defined(HAVE_ICU)
+ return new ICUConverter();
+#else
+#error "No IDN implementation"
+ return 0;
+#endif
+}
+
+}
diff --git a/Swiften/IDN/IDNA.h b/Swiften/IDN/PlatformIDNConverter.h
index 6ac51bf..82a4a87 100644
--- a/Swiften/IDN/IDNA.h
+++ b/Swiften/IDN/PlatformIDNConverter.h
@@ -1,18 +1,17 @@
/*
- * Copyright (c) 2010 Remko Tronçon
+ * Copyright (c) 2012 Remko Tronçon
* Licensed under the GNU General Public License v3.
* See Documentation/Licenses/GPLv3.txt for more information.
*/
#pragma once
-#include <string>
-
#include <Swiften/Base/API.h>
namespace Swift {
- class SWIFTEN_API IDNA {
- public:
- static std::string getEncoded(const std::string& s);
- };
+ class IDNConverter;
+
+ namespace SWIFTEN_API PlatformIDNConverter {
+ IDNConverter* create();
+ }
}
diff --git a/Swiften/IDN/SConscript b/Swiften/IDN/SConscript
index 1433318..1011563 100644
--- a/Swiften/IDN/SConscript
+++ b/Swiften/IDN/SConscript
@@ -1,20 +1,23 @@
Import("swiften_env", "env")
+
+objects = swiften_env.SwiftenObject(["IDNConverter.cpp"])
+
myenv = swiften_env.Clone()
if myenv.get("HAVE_ICU") :
myenv.MergeFlags(swiften_env["ICU_FLAGS"])
myenv.Append(CPPDEFINES = ["HAVE_ICU"])
-elif myenv.get("HAVE_LIBIDN") :
+ objects += myenv.SwiftenObject(["ICUConverter.cpp"])
+if myenv.get("HAVE_LIBIDN") :
myenv.MergeFlags(swiften_env["LIBIDN_FLAGS"])
myenv.Append(CPPDEFINES = ["HAVE_LIBIDN"])
+ objects += myenv.SwiftenObject(["LibIDNConverter.cpp"])
+objects += myenv.SwiftenObject(["PlatformIDNConverter.cpp"])
-objects = myenv.SwiftenObject([
- "StringPrep.cpp",
- "IDNA.cpp",
- ])
swiften_env.Append(SWIFTEN_OBJECTS = [objects])
-env.Append(UNITTEST_SOURCES = [
- File("UnitTest/StringPrepTest.cpp"),
- File("UnitTest/IDNATest.cpp"),
- ])
+#env.Append(UNITTEST_OBJECTS = myenv.SwiftenObject([
+# File("UnitTest/IDNATest.cpp"),
+#])
+
+
diff --git a/Swiften/IDN/StringPrep.h b/Swiften/IDN/StringPrep.h
deleted file mode 100644
index 35c4593..0000000
--- a/Swiften/IDN/StringPrep.h
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (c) 2010 Remko Tronçon
- * Licensed under the GNU General Public License v3.
- * See Documentation/Licenses/GPLv3.txt for more information.
- */
-
-#pragma once
-
-#include <string>
-#include <Swiften/Base/API.h>
-#include <Swiften/Base/SafeByteArray.h>
-
-namespace Swift {
- class SWIFTEN_API StringPrep {
- public:
- enum Profile {
- NamePrep,
- XMPPNodePrep,
- XMPPResourcePrep,
- SASLPrep
- };
-
- static std::string getPrepared(const std::string& s, Profile profile);
- static SafeByteArray getPrepared(const SafeByteArray& s, Profile profile);
- };
-}