summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'Swiften/JID/JID.cpp')
-rw-r--r--Swiften/JID/JID.cpp2
1 files changed, 1 insertions, 1 deletions
diff --git a/Swiften/JID/JID.cpp b/Swiften/JID/JID.cpp
index 0f2d8d1..fcd49f9 100644
--- a/Swiften/JID/JID.cpp
+++ b/Swiften/JID/JID.cpp
@@ -145,71 +145,71 @@ JID::JID(const std::string& node, const std::string& domain) : valid_(true), has
nameprepAndSetComponents(node, domain, "");
}
JID::JID(const std::string& node, const std::string& domain, const std::string& resource) : valid_(true), hasResource_(true) {
nameprepAndSetComponents(node, domain, resource);
}
void JID::initializeFromString(const std::string& jid) {
if (String::beginsWith(jid, '@')) {
valid_ = false;
return;
}
std::string bare, resource;
size_t slashIndex = jid.find('/');
if (slashIndex != jid.npos) {
hasResource_ = true;
bare = jid.substr(0, slashIndex);
resource = jid.substr(slashIndex + 1, jid.npos);
}
else {
hasResource_ = false;
bare = jid;
}
std::pair<std::string,std::string> nodeAndDomain = String::getSplittedAtFirst(bare, '@');
if (nodeAndDomain.second.empty()) {
nameprepAndSetComponents("", nodeAndDomain.first, resource);
}
else {
nameprepAndSetComponents(nodeAndDomain.first, nodeAndDomain.second, resource);
}
}
void JID::nameprepAndSetComponents(const std::string& node, const std::string& domain, const std::string& resource) {
- if (domain.empty()) {
+ if (domain.empty() || !idnConverter->getIDNAEncoded(domain)) {
valid_ = false;
return;
}
#ifndef SWIFTEN_CACHE_JID_PREP
node_ = idnConverter->getStringPrepared(node, IDNConverter::XMPPNodePrep);
domain_ = idnConverter->getStringPrepared(domain, IDNConverter::NamePrep);
resource_ = idnConverter->getStringPrepared(resource, IDNConverter::XMPPResourcePrep);
#else
boost::mutex::scoped_lock lock(namePrepCacheMutex);
std::pair<PrepCache::iterator, bool> r;
r = nodePrepCache.insert(std::make_pair(node, std::string()));
if (r.second) {
try {
r.first->second = idnConverter->getStringPrepared(node, IDNConverter::XMPPNodePrep);
}
catch (...) {
nodePrepCache.erase(r.first);
valid_ = false;
return;
}
}
node_ = r.first->second;
r = domainPrepCache.insert(std::make_pair(domain, std::string()));
if (r.second) {
try {
r.first->second = idnConverter->getStringPrepared(domain, IDNConverter::NamePrep);
}
catch (...) {
domainPrepCache.erase(r.first);
valid_ = false;
return;
}