From: Thomas Markwalder Date: Wed, 18 Mar 2015 14:07:07 +0000 (-0400) Subject: [3675] Corrected extraneous dots added by D2ClientMgr::qualifyName X-Git-Tag: kea-0.9.1~11^2~1 X-Git-Url: http://git.ipfire.org/gitweb/gitweb.cgi?a=commitdiff_plain;h=0b08a451f857f5f92c662e87c164ea02e1ff178e;p=thirdparty%2Fkea.git [3675] Corrected extraneous dots added by D2ClientMgr::qualifyName d2_client_mgr.cc qualifyName() - Changed to only append a dot if needed before adding a non-blank suffix --- diff --git a/src/lib/dhcpsrv/d2_client_mgr.cc b/src/lib/dhcpsrv/d2_client_mgr.cc index 3da14ab27e..22bb74da52 100644 --- a/src/lib/dhcpsrv/d2_client_mgr.cc +++ b/src/lib/dhcpsrv/d2_client_mgr.cc @@ -188,12 +188,21 @@ D2ClientMgr::qualifyName(const std::string& partial_name, const bool trailing_dot) const { std::ostringstream gen_name; - gen_name << partial_name << "." << d2_client_config_->getQualifyingSuffix(); + gen_name << partial_name; + if (!d2_client_config_->getQualifyingSuffix().empty()) { + std::string str = gen_name.str(); + size_t len = str.length(); + if ((len > 0) && (str[len - 1] != '.')) { + gen_name << "."; + } + + gen_name << d2_client_config_->getQualifyingSuffix(); + } std::string str = gen_name.str(); size_t len = str.length(); - if(trailing_dot) { + if (trailing_dot) { // If trailing dot should be added but there is no trailing dot, // append it. if ((len > 0) && (str[len - 1] != '.')) { diff --git a/src/lib/dhcpsrv/d2_client_mgr.h b/src/lib/dhcpsrv/d2_client_mgr.h index 1a589d9eb4..a45f957b1a 100644 --- a/src/lib/dhcpsrv/d2_client_mgr.h +++ b/src/lib/dhcpsrv/d2_client_mgr.h @@ -187,8 +187,10 @@ public: /// .. /// /// @param partial_name domain name to qualify - /// @param trailing_dot A boolean value which indicates whether trailing - /// dot should be appended (if true) or not (false). + /// @param trailing_dot A boolean value which when true guarantees the + /// result will end with a "." and when false that the result will not + /// end with a "." Note that this rule is applied even if the qualifying + /// suffix itself is empty (i.e. ""). /// /// @return std::string containing the qualified name. std::string qualifyName(const std::string& partial_name, diff --git a/src/lib/dhcpsrv/tests/d2_client_unittest.cc b/src/lib/dhcpsrv/tests/d2_client_unittest.cc index 94338793d0..bcde681990 100644 --- a/src/lib/dhcpsrv/tests/d2_client_unittest.cc +++ b/src/lib/dhcpsrv/tests/d2_client_unittest.cc @@ -614,7 +614,7 @@ TEST(D2ClientMgr, qualifyName) { // Verify that the qualifying suffix gets appended with trailing dot added. std::string partial_name = "somehost"; - std::string qualified_name = mgr.qualifyName(partial_name,true); + std::string qualified_name = mgr.qualifyName(partial_name, true); EXPECT_EQ("somehost.suffix.com.", qualified_name); @@ -628,7 +628,7 @@ TEST(D2ClientMgr, qualifyName) { "prefix", "suffix.com"))); ASSERT_NO_THROW(mgr.setD2ClientConfig(cfg)); partial_name = "somehost"; - qualified_name = mgr.qualifyName(partial_name,false); //false means no dot + qualified_name = mgr.qualifyName(partial_name, false); //false means no dot EXPECT_EQ("somehost.suffix.com", qualified_name); @@ -642,7 +642,7 @@ TEST(D2ClientMgr, qualifyName) { "prefix", ""))); //empty suffix ASSERT_NO_THROW(mgr.setD2ClientConfig(cfg)); partial_name = "somehost"; - qualified_name = mgr.qualifyName(partial_name,false); //false means no dot + qualified_name = mgr.qualifyName(partial_name, false); //false means no dot EXPECT_EQ("somehost", qualified_name); // Verify that the qualifying suffix gets appended with trailing dot added. @@ -656,8 +656,44 @@ TEST(D2ClientMgr, qualifyName) { ASSERT_NO_THROW(mgr.setD2ClientConfig(cfg)); // Verify that the qualifying suffix gets appended without dot added. - qualified_name = mgr.qualifyName(partial_name,true); + qualified_name = mgr.qualifyName(partial_name, true); EXPECT_EQ("somehost.hasdot.com.", qualified_name); + + // Verify that the qualifying suffix gets appended without an + // extraneous dot when parital_name ends with a "." + qualified_name = mgr.qualifyName("somehost.", true); + EXPECT_EQ("somehost.hasdot.com.", qualified_name); + + // Reconfigure to a "" suffix + ASSERT_NO_THROW(cfg.reset(new D2ClientConfig(true, + isc::asiolink::IOAddress("127.0.0.1"), 477, + isc::asiolink::IOAddress("127.0.0.1"), 478, + 1024, + dhcp_ddns::NCR_UDP, dhcp_ddns::FMT_JSON, + false, false, true, false, + "prefix", ""))); + ASSERT_NO_THROW(mgr.setD2ClientConfig(cfg)); + + // Verify that a name with a trailing dot does not get an extraneous + // dot when the suffix is blank + qualified_name = mgr.qualifyName("somehost.", true); + EXPECT_EQ("somehost.", qualified_name); + + // Verify that a name with no trailing dot gets just a dot when the + // suffix is blank + qualified_name = mgr.qualifyName("somehost", true); + EXPECT_EQ("somehost.", qualified_name); + + // Verify that a name with no trailing dot does not get dotted when the + // suffix is blank and trailing dot is false + qualified_name = mgr.qualifyName("somehost", false); + EXPECT_EQ("somehost", qualified_name); + + // Verify that a name with trailing dot gets "undotted" when the + // suffix is blank and trailing dot is false + qualified_name = mgr.qualifyName("somehost.", false); + EXPECT_EQ("somehost", qualified_name); + }