summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRemko Tronçon <git@el-tramo.be>2010-11-10 21:02:12 (GMT)
committerRemko Tronçon <git@el-tramo.be>2010-11-11 12:50:12 (GMT)
commit91b828a6e94f15c675e03baff4d45a7feb939eb9 (patch)
tree2ca432e79b05b58235b0f791fc8e4a6dd0e96db7 /Swiften/IDN
parent2fec654b2345ba974b843a0868d580f9c12fdfea (diff)
downloadswift-91b828a6e94f15c675e03baff4d45a7feb939eb9.zip
swift-91b828a6e94f15c675e03baff4d45a7feb939eb9.tar.bz2
Added server identity check.
Diffstat (limited to 'Swiften/IDN')
-rw-r--r--Swiften/IDN/IDNA.cpp27
-rw-r--r--Swiften/IDN/IDNA.h16
-rw-r--r--Swiften/IDN/SConscript10
-rw-r--r--Swiften/IDN/StringPrep.cpp39
-rw-r--r--Swiften/IDN/StringPrep.h23
5 files changed, 115 insertions, 0 deletions
diff --git a/Swiften/IDN/IDNA.cpp b/Swiften/IDN/IDNA.cpp
new file mode 100644
index 0000000..a21ca63
--- /dev/null
+++ b/Swiften/IDN/IDNA.cpp
@@ -0,0 +1,27 @@
+/*
+ * Copyright (c) 2010 Remko Tronçon
+ * Licensed under the GNU General Public License v3.
+ * See Documentation/Licenses/GPLv3.txt for more information.
+ */
+
+#include "Swiften/IDN/IDNA.h"
+
+#include <stringprep.h>
+#include <vector>
+#include <idna.h>
+
+namespace Swift {
+
+String IDNA::getEncoded(const String& domain) {
+ char* output;
+ if (idna_to_ascii_8z(domain.getUTF8Data(), &output, 0) == IDNA_SUCCESS) {
+ String result(output);
+ free(output);
+ return result;
+ }
+ else {
+ return domain;
+ }
+}
+
+}
diff --git a/Swiften/IDN/IDNA.h b/Swiften/IDN/IDNA.h
new file mode 100644
index 0000000..cc4144b
--- /dev/null
+++ b/Swiften/IDN/IDNA.h
@@ -0,0 +1,16 @@
+/*
+ * 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 "Swiften/Base/String.h"
+
+namespace Swift {
+ class IDNA {
+ public:
+ static String getEncoded(const String& s);
+ };
+}
diff --git a/Swiften/IDN/SConscript b/Swiften/IDN/SConscript
new file mode 100644
index 0000000..bfdb42c
--- /dev/null
+++ b/Swiften/IDN/SConscript
@@ -0,0 +1,10 @@
+Import("swiften_env")
+
+myenv = swiften_env.Clone()
+myenv.MergeFlags(swiften_env["LIBIDN_FLAGS"])
+
+objects = myenv.StaticObject([
+ "StringPrep.cpp",
+ "IDNA.cpp",
+ ])
+swiften_env.Append(SWIFTEN_OBJECTS = [objects])
diff --git a/Swiften/IDN/StringPrep.cpp b/Swiften/IDN/StringPrep.cpp
new file mode 100644
index 0000000..d9e061e
--- /dev/null
+++ b/Swiften/IDN/StringPrep.cpp
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2010 Remko Tronçon
+ * Licensed under the GNU General Public License v3.
+ * See Documentation/Licenses/GPLv3.txt for more information.
+ */
+
+#include "Swiften/IDN/StringPrep.h"
+
+#include <stringprep.h>
+#include <vector>
+
+namespace Swift {
+
+static const int MAX_STRINGPREP_SIZE = 1024;
+
+const Stringprep_profile* getLibIDNProfile(StringPrep::Profile profile) {
+ switch(profile) {
+ case StringPrep::NamePrep: return stringprep_nameprep; break;
+ case StringPrep::XMPPNodePrep: return stringprep_xmpp_nodeprep; break;
+ case StringPrep::XMPPResourcePrep: return stringprep_xmpp_resourceprep; break;
+ case StringPrep::SASLPrep: return stringprep_saslprep; break;
+ }
+ assert(false);
+ return 0;
+}
+
+String StringPrep::getPrepared(const String& s, Profile profile) {
+
+ std::vector<char> input(s.getUTF8String().begin(), s.getUTF8String().end());
+ input.resize(MAX_STRINGPREP_SIZE);
+ if (stringprep(&input[0], MAX_STRINGPREP_SIZE, static_cast<Stringprep_profile_flags>(0), getLibIDNProfile(profile)) == 0) {
+ return String(&input[0]);
+ }
+ else {
+ return "";
+ }
+}
+
+}
diff --git a/Swiften/IDN/StringPrep.h b/Swiften/IDN/StringPrep.h
new file mode 100644
index 0000000..3b27efa
--- /dev/null
+++ b/Swiften/IDN/StringPrep.h
@@ -0,0 +1,23 @@
+/*
+ * 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 "Swiften/Base/String.h"
+
+namespace Swift {
+ class StringPrep {
+ public:
+ enum Profile {
+ NamePrep,
+ XMPPNodePrep,
+ XMPPResourcePrep,
+ SASLPrep,
+ };
+
+ static String getPrepared(const String& s, Profile profile);
+ };
+}