Commit 4c8efe3a authored by Paul Selkirk's avatar Paul Selkirk
Browse files

[2521] Handle space-separated base-64 digest in DHCID, per Jinmei's review.

Also added more DHCID base-64 unittest cases.
parent 3bfd98d4
...@@ -33,8 +33,15 @@ using namespace isc::util::encode; ...@@ -33,8 +33,15 @@ using namespace isc::util::encode;
void void
DHCID::createFromLexer(MasterLexer& lexer) { DHCID::createFromLexer(MasterLexer& lexer) {
const string digest_txt = string digest_txt = lexer.getNextToken(MasterToken::STRING).getString();
lexer.getNextToken(MasterToken::STRING).getString(); while (true) {
const MasterToken& token = lexer.getNextToken();
if (token.getType() != MasterToken::STRING) {
break;
}
digest_txt.append(token.getString());
}
lexer.ungetToken();
decodeBase64(digest_txt, digest_); decodeBase64(digest_txt, digest_);
// RFC4701 states DNS software should consider the RDATA section to // RFC4701 states DNS software should consider the RDATA section to
...@@ -67,13 +74,12 @@ DHCID::DHCID(const std::string& dhcid_str) { ...@@ -67,13 +74,12 @@ DHCID::DHCID(const std::string& dhcid_str) {
std::istringstream iss(dhcid_str); std::istringstream iss(dhcid_str);
MasterLexer lexer; MasterLexer lexer;
lexer.pushSource(iss); lexer.pushSource(iss);
createFromLexer(lexer);
createFromLexer(lexer); // RFC4701 says we have to support white-space-separated substrings,
// so we have to read to the end of input. Therefore, we can't detect
if (lexer.getNextToken().getType() != MasterToken::END_OF_FILE) { // extra input past the end of the digest. OTOH, extra text is likely
isc_throw(InvalidRdataText, "extra input text for DHCID: " // to result in a base64 decoding error, so BadValue will be thrown in
<< dhcid_str); // that case.
}
} catch (const MasterLexer::LexerError& ex) { } catch (const MasterLexer::LexerError& ex) {
isc_throw(InvalidRdataText, "Failed to construct DHCID from '" << isc_throw(InvalidRdataText, "Failed to construct DHCID from '" <<
dhcid_str << "': " << ex.what()); dhcid_str << "': " << ex.what());
......
// Copyright (C) 2011 Internet Systems Consortium, Inc. ("ISC") // Copyright (C) 2011-2013 Internet Systems Consortium, Inc. ("ISC")
// //
// Permission to use, copy, modify, and/or distribute this software for any // Permission to use, copy, modify, and/or distribute this software for any
// purpose with or without fee is hereby granted, provided that the above // purpose with or without fee is hereby granted, provided that the above
...@@ -43,6 +43,24 @@ TEST_F(Rdata_DHCID_Test, createFromString) { ...@@ -43,6 +43,24 @@ TEST_F(Rdata_DHCID_Test, createFromString) {
EXPECT_EQ(0, rdata_dhcid2.compare(rdata_dhcid)); EXPECT_EQ(0, rdata_dhcid2.compare(rdata_dhcid));
} }
TEST_F(Rdata_DHCID_Test, spaceSeparatedBase64) {
const in::DHCID rdata_dhcid2(
"0LIg0LvQtdGB0YMg 0YDQvtC00LjQu9Cw 0YHRjCDRkdC70L7R h9C60LA=");
EXPECT_EQ(0, rdata_dhcid2.compare(rdata_dhcid));
}
TEST_F(Rdata_DHCID_Test, multiLineBase64) {
const in::DHCID rdata_dhcid2(
"( 0LIg0LvQtdGB0YMg0YDQvtC00LjQu9Cw\n0YHRjCDRkdC70L7R h9C60LA= )");
EXPECT_EQ(0, rdata_dhcid2.compare(rdata_dhcid));
}
TEST_F(Rdata_DHCID_Test, extraText) {
EXPECT_THROW(const in::DHCID rdata_dhcid2(
"0LIg0LvQtdGB0YMg 0YDQvtC00LjQu9Cw 0YHRjCDRkdC70L7R h9C60LA="
" superextrabogustext"), isc::BadValue);
}
TEST_F(Rdata_DHCID_Test, badBase64) { TEST_F(Rdata_DHCID_Test, badBase64) {
EXPECT_THROW(const in::DHCID rdata_dhcid_bad("00"), isc::BadValue); EXPECT_THROW(const in::DHCID rdata_dhcid_bad("00"), isc::BadValue);
} }
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment