16#include <boost/algorithm/string/predicate.hpp>
27 if (boost::iequals(fmt_str,
"JSON")) {
40 std::ostringstream stream;
41 stream <<
"UNKNOWN(" <<
format <<
")";
42 return (stream.str());
53const uint8_t DHCID_ID_HWADDR = 0x0;
55const uint8_t DHCID_ID_CLIENTID = 0x1;
57const uint8_t DHCID_ID_DUID = 0x2;
69 const std::vector<uint8_t>& wire_fqdn) {
74 const std::vector<uint8_t>& wire_fqdn) {
79 const std::vector<uint8_t>& wire_fqdn) {
101 const std::vector<uint8_t>& wire_fqdn) {
102 createDigest(DHCID_ID_CLIENTID, clientid_data, wire_fqdn);
107 const std::vector<uint8_t>& wire_fqdn) {
110 "unable to compute DHCID from the HW address, "
111 "NULL pointer has been specified");
112 }
else if (hwaddr->hwaddr_.empty()) {
114 "unable to compute DHCID from the HW address, "
115 "HW address is empty");
117 std::vector<uint8_t> hwaddr_data;
118 hwaddr_data.push_back(hwaddr->htype_);
119 hwaddr_data.insert(hwaddr_data.end(), hwaddr->hwaddr_.begin(),
120 hwaddr->hwaddr_.end());
121 createDigest(DHCID_ID_HWADDR, hwaddr_data, wire_fqdn);
127 const std::vector<uint8_t>& wire_fqdn) {
129 createDigest(DHCID_ID_DUID, duid.
getDuid(), wire_fqdn);
133D2Dhcid::createDigest(
const uint8_t identifier_type,
134 const std::vector<uint8_t>& identifier_data,
135 const std::vector<uint8_t>& wire_fqdn) {
139 if (wire_fqdn.empty()) {
141 "empty FQDN used to create DHCID");
148 if (identifier_data.empty()) {
150 "empty DUID used to create DHCID");
154 std::vector<uint8_t> data = identifier_data;
157 data.insert(data.end(), wire_fqdn.begin(), wire_fqdn.end());
166 }
catch (
const std::exception& ex) {
168 "error while generating DHCID from DUID: "
180 bytes_.resize(3 + hash.getLength());
183 bytes_[1] = identifier_type;
187 std::memcpy(&bytes_[3], hash.getData(), hash.getLength());
201 : change_type_(
CHG_ADD), forward_change_(false),
202 reverse_change_(false), fqdn_(
""), ip_io_address_(
"0.0.0.0"),
203 dhcid_(), lease_expires_on_(), lease_length_(0), conflict_resolution_(true),
208 const bool forward_change,
const bool reverse_change,
209 const std::string& fqdn,
const std::string& ip_address,
211 const uint64_t lease_expires_on,
212 const uint32_t lease_length,
213 const bool conflict_resolution)
214 : change_type_(change_type), forward_change_(forward_change),
215 reverse_change_(reverse_change), fqdn_(fqdn), ip_io_address_(
"0.0.0.0"),
216 dhcid_(dhcid), lease_expires_on_(lease_expires_on),
217 lease_length_(lease_length), conflict_resolution_(conflict_resolution),
244 std::vector<uint8_t> vec;
248 std::string string_data(vec.begin(), vec.end());
279 std::string json =
toJSON();
280 uint16_t length = json.size();
307 "Malformed NameChangeRequest JSON: " << ex.
what());
311 ElementMap element_map = elements->mapValue();
323 element = ncr->getElement(
"change-type", element_map);
324 ncr->setChangeType(element);
326 element = ncr->getElement(
"forward-change", element_map);
327 ncr->setForwardChange(element);
329 element = ncr->getElement(
"reverse-change", element_map);
330 ncr->setReverseChange(element);
332 element = ncr->getElement(
"fqdn", element_map);
333 ncr->setFqdn(element);
335 element = ncr->getElement(
"ip-address", element_map);
336 ncr->setIpAddress(element);
338 element = ncr->getElement(
"dhcid", element_map);
339 ncr->setDhcid(element);
341 element = ncr->getElement(
"lease-expires-on", element_map);
342 ncr->setLeaseExpiresOn(element);
344 element = ncr->getElement(
"lease-length", element_map);
345 ncr->setLeaseLength(element);
349 auto found = element_map.find(
"use-conflict-resolution");
350 if (found != element_map.end()) {
351 ncr->setConflictResolution(found->second);
353 ncr->setConflictResolution(
true);
359 ncr->validateContent();
370 std::ostringstream stream;
373 <<
"\"forward-change\":"
375 <<
"\"reverse-change\":"
377 <<
"\"fqdn\":\"" <<
getFqdn() <<
"\","
382 <<
"\"use-conflict-resolution\":"
385 return (stream.str());
399 if (dhcid_.
getBytes().size() == 0) {
404 if (!forward_change_ && !reverse_change_) {
406 "Invalid Request, forward and reverse flags are both false");
414 ElementMap::const_iterator it = element_map.find(name);
415 if (it == element_map.end()) {
418 "NameChangeRequest value missing for: " << name );
427 change_type_ = value;
436 raw_value = element->intValue();
440 "Wrong data type for change_type: " << ex.
what());
446 "Invalid data value for change_type: " << raw_value);
455 forward_change_ = value;
463 value = element->boolValue();
467 "Wrong data type for forward-change: " << ex.
what());
476 reverse_change_ = value;
484 value = element->boolValue();
488 "Wrong data type for reverse_change: " << ex.
what());
498 setFqdn(element->stringValue());
506 }
catch (
const std::exception& ex) {
508 "Invalid FQDN value: " << value <<
", reason: "
520 "Invalid ip address string for ip_address: " << value);
552 "Invalid date-time string: [" << value <<
"]");
564 lease_length_ = value;
572 value = element->intValue();
576 "Wrong data type for lease_length: " << ex.
what());
580 if (value > std::numeric_limits<uint32_t>::max()) {
582 "is too large for unsigned 32-bit integer.");
586 "is negative. It must greater than or equal to zero ");
595 conflict_resolution_ = value;
603 value = element->boolValue();
607 "Wrong data type for use-conflict-resolution: " << ex.
what());
621 std::ostringstream stream;
623 stream <<
"Type: " <<
static_cast<int>(change_type_) <<
" (";
624 switch (change_type_) {
626 stream <<
"CHG_ADD)\n";
629 stream <<
"CHG_REMOVE)\n";
633 stream <<
"Invalid Value\n";
636 stream <<
"Forward Change: " << (forward_change_ ?
"yes" :
"no")
638 <<
"Reverse Change: " << (reverse_change_ ?
"yes" :
"no")
640 <<
"FQDN: [" << fqdn_ <<
"]" << std::endl
641 <<
"IP Address: [" << ip_io_address_ <<
"]" << std::endl
642 <<
"DHCID: [" << dhcid_.
toStr() <<
"]" << std::endl
644 <<
"Lease Length: " << lease_length_ << std::endl
645 <<
"Conflict Resolution: " << (conflict_resolution_ ?
"yes" :
"no")
648 return (stream.str());
653 return ((change_type_ == other.change_type_) &&
654 (forward_change_ == other.forward_change_) &&
655 (reverse_change_ == other.reverse_change_) &&
656 (fqdn_ == other.fqdn_) &&
657 (ip_io_address_ == other.ip_io_address_) &&
658 (dhcid_ == other.dhcid_) &&
659 (lease_expires_on_ == other.lease_expires_on_) &&
660 (lease_length_ == other.lease_length_) &&
661 (conflict_resolution_ == other.conflict_resolution_));
666 return (!(*
this == other));
A generic exception that is thrown if a parameter given to a method is considered invalid in that con...
This is a base class for exceptions thrown from the DNS library module.
virtual const char * what() const
Returns a C-style character string of the cause of the exception.
The IOAddress class represents an IP addresses (version agnostic)
An exception that is thrown if an error occurs within the IO module.
static ElementPtr fromJSON(const std::string &in, bool preproc=false)
These functions will parse the given string (JSON) representation of a compound element.
A standard Data module exception that is thrown if a parse error is encountered when constructing an ...
A standard Data module exception that is thrown if a function is called for an Element that has a wro...
Holds DUID (DHCPv6 Unique Identifier)
const std::vector< uint8_t > & getDuid() const
Returns a const reference to the actual DUID value.
Container class for handling the DHCID value within a NameChangeRequest.
void fromHWAddr(const isc::dhcp::HWAddrPtr &hwaddr, const std::vector< uint8_t > &wire_fqdn)
Sets the DHCID value based on the HW address and FQDN.
void fromDUID(const isc::dhcp::DUID &duid, const std::vector< uint8_t > &wire_fqdn)
Sets the DHCID value based on the DUID and FQDN.
const std::vector< uint8_t > & getBytes() const
Returns a reference to the DHCID byte vector.
D2Dhcid()
Default constructor.
void fromClientId(const std::vector< uint8_t > &clientid_data, const std::vector< uint8_t > &wire_fqdn)
Sets the DHCID value based on the Client Identifier.
void fromStr(const std::string &data)
Sets the DHCID value based on the given string.
std::string toStr() const
Returns the DHCID value as a string of hexadecimal digits.
Exception thrown when there is an error occurred during computation of the DHCID.
Represents a DHCP-DDNS client request.
bool useConflictResolution() const
Checks if conflict resolution is enabled.
void setStatus(const NameChangeStatus value)
Sets the request status to the given value.
void setChangeType(const NameChangeType value)
Sets the change type to the given value.
std::string toText() const
Returns a text rendition of the contents of the request.
uint32_t getLeaseLength() const
Fetches the request lease length.
void setIpAddress(const std::string &value)
Sets the IP address to the given value.
const D2Dhcid & getDhcid() const
Fetches the request DHCID.
void setDhcid(const std::string &value)
Sets the DHCID based on the given string value.
std::string toJSON() const
Instance method for marshalling the contents of the request into a string of JSON text.
std::string getIpAddress() const
Fetches the request IP address string.
void setFqdn(const std::string &value)
Sets the FQDN to the given value.
void setReverseChange(const bool value)
Sets the reverse change flag to the given value.
bool operator!=(const NameChangeRequest &b)
void setLeaseLength(const uint32_t value)
Sets the lease length to the given value.
bool operator==(const NameChangeRequest &b)
void setLeaseExpiresOn(const std::string &value)
Sets the lease expiration based on the given string.
void toFormat(const NameChangeFormat format, isc::util::OutputBuffer &buffer) const
Instance method for marshalling the contents of the request into the given buffer in the given format...
NameChangeRequest()
Default Constructor.
NameChangeType getChangeType() const
Fetches the request change type.
static NameChangeRequestPtr fromJSON(const std::string &json)
Static method for creating a NameChangeRequest from a string containing a JSON rendition of a request...
void setForwardChange(const bool value)
Sets the forward change flag to the given value.
std::string getLeaseExpiresOnStr() const
Fetches the request lease expiration as string.
isc::data::ConstElementPtr getElement(const std::string &name, const ElementMap &element_map) const
Given a name, finds and returns an element from a map of elements.
void setConflictResolution(const bool value)
Sets the conflict resolution flag to the given value.
bool isForwardChange() const
Checks forward change flag.
static NameChangeRequestPtr fromFormat(const NameChangeFormat format, isc::util::InputBuffer &buffer)
Static method for creating a NameChangeRequest from a buffer containing a marshalled request in a giv...
void validateContent()
Validates the content of a populated request.
const std::string getFqdn() const
Fetches the request FQDN.
bool isReverseChange() const
Checks reverse change flag.
Exception thrown when NameChangeRequest marshalling error occurs.
The Name class encapsulates DNS names.
std::string toText(bool omit_final_dot=false) const
Convert the Name to a string.
A standard DNS module exception that is thrown if an out-of-range buffer operation is being performed...
The OutputBuffer class is a buffer abstraction for manipulating mutable data.
void writeUint16(uint16_t data)
Write an unsigned 16-bit integer in host byte order into the buffer in network byte order.
void writeData(const void *data, size_t len)
Copy an arbitrary length of data into the buffer.
#define isc_throw(type, stream)
A shortcut macro to insert known values into exception arguments.
void digest(const void *data, const size_t data_len, const HashAlgorithm hash_algorithm, isc::util::OutputBuffer &result, size_t len)
Create an Hash digest for the given data.
boost::shared_ptr< const Element > ConstElementPtr
boost::shared_ptr< Element > ElementPtr
NameChangeFormat
Defines the list of data wire formats supported.
NameChangeStatus
Defines the runtime processing status values for requests.
std::map< std::string, isc::data::ConstElementPtr > ElementMap
Defines a map of Elements, keyed by their string name.
std::ostream & operator<<(std::ostream &os, const D2Dhcid &dhcid)
NameChangeFormat stringToNcrFormat(const std::string &fmt_str)
Function which converts labels to NameChangeFormat enum values.
boost::shared_ptr< NameChangeRequest > NameChangeRequestPtr
Defines a pointer to a NameChangeRequest.
std::string ncrFormatToString(NameChangeFormat format)
Function which converts NameChangeFormat enums to text labels.
NameChangeType
Defines the types of DNS updates that can be requested.
boost::shared_ptr< HWAddr > HWAddrPtr
Shared pointer to a hardware address structure.
string encodeHex(const vector< uint8_t > &binary)
Encode binary data in the base16 ('hex') format.
void decodeHex(const string &input, vector< uint8_t > &result)
Decode a text encoded in the base16 ('hex') format into the original data.
std::string format(const std::string &format, const std::vector< std::string > &args)
Apply Formatting.
string timeToText64(uint64_t value)
Convert integral DNSSEC time to textual form, 64-bit version.
uint64_t timeFromText64(const string &time_txt)
Convert textual DNSSEC time to integer, 64-bit version.
Defines the logger used by the top-level component of kea-lfc.
This file provides the classes needed to embody, compose, and decompose DNS update requests that are ...