summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Swiften/JID/JID.cpp38
-rw-r--r--Swiften/SConscript1
-rw-r--r--Swiften/StringPrep/SConscript9
-rw-r--r--Swiften/StringPrep/StringPrep.cpp31
-rw-r--r--Swiften/StringPrep/StringPrep.h17
5 files changed, 62 insertions, 34 deletions
diff --git a/Swiften/JID/JID.cpp b/Swiften/JID/JID.cpp
index dcd6dd1..3be8386 100644
--- a/Swiften/JID/JID.cpp
+++ b/Swiften/JID/JID.cpp
@@ -1,116 +1,86 @@
#include <stringprep.h>
#include <vector>
#include <iostream>
#include "Swiften/JID/JID.h"
+#include "Swiften/StringPrep/StringPrep.h"
namespace Swift {
-
-class StringPrepper {
- private:
- static const int MAX_STRINGPREP_SIZE = 1024;
-
- public:
- static String getNamePrepped(const String& name) {
- return getStringPrepped(name, stringprep_nameprep);
- }
-
- static String getNodePrepped(const String& node) {
- return getStringPrepped(node, stringprep_xmpp_nodeprep);
- }
-
- static String getResourcePrepped(const String& resource) {
- return getStringPrepped(resource, stringprep_xmpp_resourceprep);
- }
-
- static String getStringPrepped(const String& s, const Stringprep_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), profile) == 0) {
- return String(&input[0]);
- }
- else {
- return "";
- }
- }
-};
-
-
JID::JID(const char* jid) {
initializeFromString(String(jid));
}
JID::JID(const String& jid) {
initializeFromString(jid);
}
JID::JID(const String& node, const String& domain) : hasResource_(false) {
nameprepAndSetComponents(node, domain, "");
}
JID::JID(const String& node, const String& domain, const String& resource) : hasResource_(true) {
nameprepAndSetComponents(node, domain, resource);
}
void JID::initializeFromString(const String& jid) {
if (jid.beginsWith('@')) {
return;
}
String bare, resource;
size_t slashIndex = jid.find('/');
if (slashIndex != jid.npos()) {
hasResource_ = true;
bare = jid.getSubstring(0, slashIndex);
resource = jid.getSubstring(slashIndex + 1, jid.npos());
}
else {
hasResource_ = false;
bare = jid;
}
std::pair<String,String> nodeAndDomain = bare.getSplittedAtFirst('@');
if (nodeAndDomain.second.isEmpty()) {
nameprepAndSetComponents("", nodeAndDomain.first, resource);
}
else {
nameprepAndSetComponents(nodeAndDomain.first, nodeAndDomain.second, resource);
}
}
void JID::nameprepAndSetComponents(const String& node, const String& domain, const String& resource) {
- node_ = StringPrepper::getNamePrepped(node);
- domain_ = StringPrepper::getNodePrepped(domain);
- resource_ = StringPrepper::getResourcePrepped(resource);
+ node_ = StringPrep::getPrepared(node, StringPrep::NamePrep);
+ domain_ = StringPrep::getPrepared(domain, StringPrep::XMPPNodePrep);
+ resource_ = StringPrep::getPrepared(resource, StringPrep::XMPPResourcePrep);
}
String JID::toString() const {
String string;
if (!node_.isEmpty()) {
string += node_ + "@";
}
string += domain_;
if (!isBare()) {
string += "/" + resource_;
}
return string;
}
int JID::compare(const Swift::JID& o, CompareType compareType) const {
if (node_ < o.node_) { return -1; }
if (node_ > o.node_) { return 1; }
if (domain_ < o.domain_) { return -1; }
if (domain_ > o.domain_) { return 1; }
if (compareType == WithResource) {
if (hasResource_ != o.hasResource_) {
return hasResource_ ? 1 : -1;
}
if (resource_ < o.resource_) { return -1; }
if (resource_ > o.resource_) { return 1; }
}
return 0;
}
} // namespace Swift
diff --git a/Swiften/SConscript b/Swiften/SConscript
index 3b37f90..af3ac97 100644
--- a/Swiften/SConscript
+++ b/Swiften/SConscript
@@ -49,96 +49,97 @@ sources = [
"Serializer/AuthRequestSerializer.cpp",
"Serializer/AuthChallengeSerializer.cpp",
"Serializer/AuthResponseSerializer.cpp",
"Serializer/CompressRequestSerializer.cpp",
"Serializer/ElementSerializer.cpp",
"Serializer/MessageSerializer.cpp",
"Serializer/PayloadSerializer.cpp",
"Serializer/PayloadSerializerCollection.cpp",
"Serializer/PayloadSerializers/CapsInfoSerializer.cpp",
"Serializer/PayloadSerializers/DiscoInfoSerializer.cpp",
"Serializer/PayloadSerializers/ErrorSerializer.cpp",
"Serializer/PayloadSerializers/FullPayloadSerializerCollection.cpp",
"Serializer/PayloadSerializers/MUCPayloadSerializer.cpp",
"Serializer/PayloadSerializers/ResourceBindSerializer.cpp",
"Serializer/PayloadSerializers/RosterSerializer.cpp",
"Serializer/PayloadSerializers/SecurityLabelSerializer.cpp",
"Serializer/PayloadSerializers/SecurityLabelsCatalogSerializer.cpp",
"Serializer/PayloadSerializers/SoftwareVersionSerializer.cpp",
"Serializer/PayloadSerializers/VCardSerializer.cpp",
"Serializer/PayloadSerializers/VCardUpdateSerializer.cpp",
"Serializer/PayloadSerializers/StorageSerializer.cpp",
"Serializer/PayloadSerializers/PrivateStorageSerializer.cpp",
"Serializer/PresenceSerializer.cpp",
"Serializer/StanzaSerializer.cpp",
"Serializer/StreamFeaturesSerializer.cpp",
"Serializer/XML/XMLElement.cpp",
"Serializer/XML/XMLNode.cpp",
"Serializer/XMPPSerializer.cpp",
"Server/ServerFromClientSession.cpp",
"Server/ServerSession.cpp",
"Server/ServerStanzaRouter.cpp",
"Server/SimpleUserRegistry.cpp",
"Server/UserRegistry.cpp",
"Session/Session.cpp",
"Session/SessionStream.cpp",
"Session/BasicSessionStream.cpp",
"StringCodecs/Base64.cpp",
"StringCodecs/SHA1.cpp",
"StringCodecs/HMACSHA1.cpp",
"StringCodecs/PBKDF2.cpp",
]
# "Notifier/GrowlNotifier.cpp",
if myenv.get("HAVE_OPENSSL", 0) :
sources += ["TLS/OpenSSL/OpenSSLContext.cpp"]
SConscript(dirs = [
"Base",
+ "StringPrep",
"Application",
"EventLoop",
"Parser",
"JID",
"Network",
"History",
"StreamStack",
"LinkLocal",
"QA",
])
myenv.StaticLibrary("Swiften", sources + swiften_env["SWIFTEN_OBJECTS"])
env.Append(UNITTEST_SOURCES = [
File("Application/UnitTest/ApplicationTest.cpp"),
File("Base/UnitTest/IDGeneratorTest.cpp"),
File("Base/UnitTest/StringTest.cpp"),
File("Base/UnitTest/ByteArrayTest.cpp"),
File("Client/UnitTest/ClientSessionTest.cpp"),
File("Compress/UnitTest/ZLibCompressorTest.cpp"),
File("Compress/UnitTest/ZLibDecompressorTest.cpp"),
File("Disco/UnitTest/CapsInfoGeneratorTest.cpp"),
File("Elements/UnitTest/IQTest.cpp"),
File("Elements/UnitTest/StanzaTest.cpp"),
File("Elements/UnitTest/StanzasTest.cpp"),
File("EventLoop/UnitTest/EventLoopTest.cpp"),
File("EventLoop/UnitTest/SimpleEventLoopTest.cpp"),
File("History/UnitTest/SQLiteHistoryManagerTest.cpp"),
File("JID/UnitTest/JIDTest.cpp"),
File("LinkLocal/UnitTest/LinkLocalConnectorTest.cpp"),
File("LinkLocal/UnitTest/LinkLocalServiceBrowserTest.cpp"),
File("LinkLocal/UnitTest/LinkLocalServiceInfoTest.cpp"),
File("LinkLocal/UnitTest/LinkLocalServiceTest.cpp"),
File("Network/UnitTest/HostAddressTest.cpp"),
File("Network/UnitTest/ConnectorTest.cpp"),
File("Parser/PayloadParsers/UnitTest/BodyParserTest.cpp"),
File("Parser/PayloadParsers/UnitTest/DiscoInfoParserTest.cpp"),
File("Parser/PayloadParsers/UnitTest/ErrorParserTest.cpp"),
File("Parser/PayloadParsers/UnitTest/PriorityParserTest.cpp"),
File("Parser/PayloadParsers/UnitTest/RawXMLPayloadParserTest.cpp"),
File("Parser/PayloadParsers/UnitTest/ResourceBindParserTest.cpp"),
File("Parser/PayloadParsers/UnitTest/RosterParserTest.cpp"),
File("Parser/PayloadParsers/UnitTest/SecurityLabelParserTest.cpp"),
File("Parser/PayloadParsers/UnitTest/SecurityLabelsCatalogParserTest.cpp"),
File("Parser/PayloadParsers/UnitTest/SoftwareVersionParserTest.cpp"),
File("Parser/PayloadParsers/UnitTest/StatusParserTest.cpp"),
File("Parser/PayloadParsers/UnitTest/StatusShowParserTest.cpp"),
File("Parser/PayloadParsers/UnitTest/VCardParserTest.cpp"),
diff --git a/Swiften/StringPrep/SConscript b/Swiften/StringPrep/SConscript
new file mode 100644
index 0000000..480d81a
--- /dev/null
+++ b/Swiften/StringPrep/SConscript
@@ -0,0 +1,9 @@
+Import("swiften_env")
+
+myenv = swiften_env.Clone()
+myenv.MergeFlags(swiften_env["LIBIDN_FLAGS"])
+
+objects = myenv.StaticObject([
+ "StringPrep.cpp"
+ ])
+swiften_env.Append(SWIFTEN_OBJECTS = [objects])
diff --git a/Swiften/StringPrep/StringPrep.cpp b/Swiften/StringPrep/StringPrep.cpp
new file mode 100644
index 0000000..3e85177
--- /dev/null
+++ b/Swiften/StringPrep/StringPrep.cpp
@@ -0,0 +1,31 @@
+#include "Swiften/StringPrep/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;
+ }
+}
+
+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/StringPrep/StringPrep.h b/Swiften/StringPrep/StringPrep.h
new file mode 100644
index 0000000..7dbb03a
--- /dev/null
+++ b/Swiften/StringPrep/StringPrep.h
@@ -0,0 +1,17 @@
+#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);
+ };
+}