diff options
author | Remko Tronçon <git@el-tramo.be> | 2010-11-10 21:02:12 (GMT) |
---|---|---|
committer | Remko Tronçon <git@el-tramo.be> | 2010-11-11 12:50:12 (GMT) |
commit | 91b828a6e94f15c675e03baff4d45a7feb939eb9 (patch) | |
tree | 2ca432e79b05b58235b0f791fc8e4a6dd0e96db7 /Swiften/IDN | |
parent | 2fec654b2345ba974b843a0868d580f9c12fdfea (diff) | |
download | swift-91b828a6e94f15c675e03baff4d45a7feb939eb9.zip swift-91b828a6e94f15c675e03baff4d45a7feb939eb9.tar.bz2 |
Added server identity check.
Diffstat (limited to 'Swiften/IDN')
-rw-r--r-- | Swiften/IDN/IDNA.cpp | 27 | ||||
-rw-r--r-- | Swiften/IDN/IDNA.h | 16 | ||||
-rw-r--r-- | Swiften/IDN/SConscript | 10 | ||||
-rw-r--r-- | Swiften/IDN/StringPrep.cpp | 39 | ||||
-rw-r--r-- | Swiften/IDN/StringPrep.h | 23 |
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); + }; +} |