void
DHCID::createFromLexer(MasterLexer& lexer) {
- const string digest_txt =
- lexer.getNextToken(MasterToken::STRING).getString();
+ string digest_txt = 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_);
// RFC4701 states DNS software should consider the RDATA section to
std::istringstream iss(dhcid_str);
MasterLexer lexer;
lexer.pushSource(iss);
-
- createFromLexer(lexer);
-
- if (lexer.getNextToken().getType() != MasterToken::END_OF_FILE) {
- isc_throw(InvalidRdataText, "extra input text for DHCID: "
- << dhcid_str);
- }
+ 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
+ // extra input past the end of the digest. OTOH, extra text is likely
+ // to result in a base64 decoding error, so BadValue will be thrown in
+ // that case.
} catch (const MasterLexer::LexerError& ex) {
isc_throw(InvalidRdataText, "Failed to construct DHCID from '" <<
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
// purpose with or without fee is hereby granted, provided that the above
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) {
EXPECT_THROW(const in::DHCID rdata_dhcid_bad("00"), isc::BadValue);
}