diff options
author | Edwin Mons <edwin.mons@isode.com> | 2018-04-18 15:12:35 (GMT) |
---|---|---|
committer | Edwin Mons <edwin.mons@isode.com> | 2018-04-18 15:12:35 (GMT) |
commit | 8fe63ff4b47cfa3b1e988f348b34ac7d36ce7b9b (patch) | |
tree | ad8808aa5fda08174dc0f5f54540f621c471d513 /Swiften/JID | |
parent | fa2c9c62260ad793edf7082922d4ccda2a9564d8 (diff) | |
download | swift-8fe63ff4b47cfa3b1e988f348b34ac7d36ce7b9b.zip swift-8fe63ff4b47cfa3b1e988f348b34ac7d36ce7b9b.tar.bz2 |
Mark jids with an empty domainpart as invalid
When Swiften parsed jids with an empty domainpart (e.g. user@/resource),
it would mark the jid as valid, and treat the localpart as domainpart.
RFC 6122 states in 2.2 that "A domainpart MUST NOT be zero bytes in
length".
Unit tests for both a bare jid and a full jid with an empty domainpart
have been added.
Test-Information:
Unit tests pass on Debian 9
Change-Id: Iadaf399cd4158666bfcdd6c075b8bf2102ff5538
Diffstat (limited to 'Swiften/JID')
-rw-r--r-- | Swiften/JID/JID.cpp | 8 | ||||
-rw-r--r-- | Swiften/JID/UnitTest/JIDTest.cpp | 14 |
2 files changed, 18 insertions, 4 deletions
diff --git a/Swiften/JID/JID.cpp b/Swiften/JID/JID.cpp index c82674d..e8a4700 100644 --- a/Swiften/JID/JID.cpp +++ b/Swiften/JID/JID.cpp @@ -104,12 +104,12 @@ void JID::initializeFromString(const std::string& jid) { hasResource_ = false; bare = jid; } - std::pair<std::string,std::string> nodeAndDomain = String::getSplittedAtFirst(bare, '@'); - if (nodeAndDomain.second.empty()) { - nameprepAndSetComponents("", nodeAndDomain.first, resource); + auto firstMatch = bare.find('@'); + if (firstMatch != bare.npos) { + nameprepAndSetComponents(bare.substr(0, firstMatch), bare.substr(firstMatch + 1), resource); } else { - nameprepAndSetComponents(nodeAndDomain.first, nodeAndDomain.second, resource); + nameprepAndSetComponents("", bare, resource); } } diff --git a/Swiften/JID/UnitTest/JIDTest.cpp b/Swiften/JID/UnitTest/JIDTest.cpp index ca3e5ae..0101a4f 100644 --- a/Swiften/JID/UnitTest/JIDTest.cpp +++ b/Swiften/JID/UnitTest/JIDTest.cpp @@ -25,6 +25,8 @@ class JIDTest : public CppUnit::TestFixture CPPUNIT_TEST(testConstructorWithString_UpperCaseDomain); CPPUNIT_TEST(testConstructorWithString_UpperCaseResource); CPPUNIT_TEST(testConstructorWithString_EmptyNode); + CPPUNIT_TEST(testConstructorWithString_EmptyDomain); + CPPUNIT_TEST(testConstructorWithString_EmptyDomainWithResource); CPPUNIT_TEST(testConstructorWithString_IllegalResource); CPPUNIT_TEST(testConstructorWithString_SpacesInNode); CPPUNIT_TEST(testConstructorWithStrings); @@ -151,6 +153,18 @@ class JIDTest : public CppUnit::TestFixture CPPUNIT_ASSERT(!testling.isValid()); } + void testConstructorWithString_EmptyDomain() { + JID testling("bar@"); + + CPPUNIT_ASSERT(!testling.isValid()); + } + + void testConstructorWithString_EmptyDomainWithResource() { + JID testling("bar@/resource"); + + CPPUNIT_ASSERT(!testling.isValid()); + } + void testConstructorWithString_IllegalResource() { JID testling("foo@bar.com/\xd8\xb1\xd9\x85\xd9\x82\xd9\x87\x20\xd8\xaa\xd8\xb1\xd9\x86\xd8\xb3\x20"); |