7#ifndef RADIUS_CLIENT_ATTRIBUTE_H 
    8#define RADIUS_CLIENT_ATTRIBUTE_H 
   16#include <boost/multi_index_container.hpp> 
   17#include <boost/multi_index/hashed_index.hpp> 
   18#include <boost/multi_index/member.hpp> 
   19#include <boost/multi_index/sequenced_index.hpp> 
   20#include <boost/noncopyable.hpp> 
   21#include <boost/shared_ptr.hpp> 
   29static constexpr size_t MAX_STRING_LEN = 253;
 
   32using isc::data::TypeError;
 
   92                                 const std::string& value);
 
  101                                  const std::vector<uint8_t>& value);
 
  114                                   const std::string& value);
 
  123                                   const std::vector<uint8_t>& value);
 
  173    virtual std::string 
toText(
size_t indent = 0) 
const = 0;
 
  178    virtual std::vector<uint8_t> 
toBytes() 
const = 0;
 
  188    virtual std::string 
toString() 
const;
 
  194    virtual std::vector<uint8_t> 
toBinary() 
const;
 
  200    virtual uint32_t 
toInt() 
const;
 
 
  243            isc_throw(BadValue, 
"value is empty");
 
  245        if (value.size() > MAX_STRING_LEN) {
 
  246            isc_throw(BadValue, 
"value is too large " << value.size()
 
  247                      << 
" > " << MAX_STRING_LEN);
 
 
  255    AttrString(
const uint8_t type, 
const std::vector<uint8_t>& value);
 
  270                                  const std::vector<uint8_t>& bytes);
 
  287        return (value_.size());
 
 
  294    virtual std::string 
toText(
size_t indent = 0) 
const override;
 
  299    virtual std::vector<uint8_t> 
toBytes() 
const override;
 
  311    virtual std::vector<uint8_t> 
toBinary() 
const override;
 
 
  331    AttrInt(
const uint8_t type, 
const int32_t value)
 
  332        : 
Attribute(type), value_(static_cast<uint32_t>(value)) {
 
 
  339    AttrInt(
const uint8_t type, 
const uint32_t value)
 
 
  356                                  const std::vector<uint8_t>& bytes);
 
  381    virtual std::string 
toText(
size_t indent = 0) 
const override;
 
  386    virtual std::vector<uint8_t> 
toBytes() 
const override;
 
  391    virtual uint32_t 
toInt()
 const override {
 
 
  402    const uint32_t value_;
 
 
  416            isc_throw(BadValue, 
"not v4 address " << value);
 
 
  433                                  const std::vector<uint8_t>& bytes);
 
  457    virtual std::string 
toText(
size_t indent = 0) 
const override;
 
  462    virtual std::vector<uint8_t> 
toBytes() 
const override;
 
 
  492            isc_throw(BadValue, 
"not v6 address " << value);
 
 
  509                                  const std::vector<uint8_t>& bytes);
 
  534    virtual std::string 
toText(
size_t indent = 0) 
const override;
 
  539    virtual std::vector<uint8_t> 
toBytes() 
const override;
 
 
  569        : 
Attribute(type), len_(len), value_(value) {
 
  571            isc_throw(BadValue, 
"not v6 address " << value);
 
  575                      << 
static_cast<unsigned>(len));
 
 
  592                                  const std::vector<uint8_t>& bytes);
 
  617    virtual std::string 
toText(
size_t indent = 0) 
const override;
 
  622    virtual std::vector<uint8_t> 
toBytes() 
const override;
 
 
  656    typedef boost::multi_index_container<
 
  660        boost::multi_index::indexed_by<
 
  662            boost::multi_index::sequenced<>,
 
  664            boost::multi_index::hashed_non_unique<
 
  665                boost::multi_index::member<
 
  712    bool del(
const uint8_t type);
 
  728    size_t count(
const uint8_t type) 
const;
 
  740    std::string 
toText(
size_t indent = 0) 
const;
 
  756    AttributeContainer::iterator 
begin() {
 
 
  763    AttributeContainer::const_iterator 
begin()
 const {
 
 
  770    AttributeContainer::const_iterator 
cbegin()
 const {
 
 
  777    AttributeContainer::iterator 
end() {
 
 
  784    AttributeContainer::const_iterator 
end()
 const {
 
 
  789    AttributeContainer::const_iterator 
cend()
 const {
 
 
 
A generic exception that is thrown if a parameter given to a method is considered invalid in that con...
The IOAddress class represents an IP addresses (version agnostic)
bool isV6() const
Convenience function to check for an IPv6 address.
bool isV4() const
Convenience function to check for an IPv4 address.
virtual uint32_t toInt() const override
To integer.
static AttributePtr fromText(const uint8_t type, const std::string &repr)
From text.
virtual std::vector< uint8_t > toBytes() const override
To bytes.
virtual size_t getValueLen() const override
Value length.
virtual data::ElementPtr toElement() const override
Unparse attribute.
AttrInt(const uint8_t type, const uint32_t value)
Constructor (unsigned).
friend class Attribute
Make Attribute a friend class.
virtual std::string toText(size_t indent=0) const override
Returns text representation of the attribute.
AttrInt(const uint8_t type, const int32_t value)
Constructor (signed).
static AttributePtr fromBytes(const uint8_t type, const std::vector< uint8_t > &bytes)
From bytes.
virtual AttrValueType getValueType() const override
Get value type.
AttrIpAddr(const uint8_t type, const asiolink::IOAddress &value)
Constructor.
virtual data::ElementPtr toElement() const override
Unparse attribute.
virtual std::vector< uint8_t > toBytes() const override
To bytes.
static AttributePtr fromText(const uint8_t type, const std::string &repr)
From text.
virtual asiolink::IOAddress toIpAddr() const override
To IPv4 address.
static AttributePtr fromBytes(const uint8_t type, const std::vector< uint8_t > &bytes)
From bytes.
virtual size_t getValueLen() const override
Value length.
friend class Attribute
Make Attribute a friend class.
virtual AttrValueType getValueType() const override
Get value type.
virtual std::string toText(size_t indent=0) const override
Returns text representation of the attribute.
virtual std::string toText(size_t indent=0) const override
Returns text representation of the attribute.
virtual asiolink::IOAddress toIpv6Addr() const override
To IPv6 address.
static AttributePtr fromBytes(const uint8_t type, const std::vector< uint8_t > &bytes)
From bytes.
virtual std::vector< uint8_t > toBytes() const override
To bytes.
virtual AttrValueType getValueType() const override
Get value type.
virtual size_t getValueLen() const override
Value length.
static AttributePtr fromText(const uint8_t type, const std::string &repr)
From text.
AttrIpv6Addr(const uint8_t type, const asiolink::IOAddress &value)
Constructor.
friend class Attribute
Make Attribute a friend class.
virtual data::ElementPtr toElement() const override
Unparse attribute.
virtual asiolink::IOAddress toIpv6Prefix() const override
To IPv6 prefix.
AttrIpv6Prefix(const uint8_t type, const uint8_t len, const asiolink::IOAddress &value)
Constructor.
virtual std::vector< uint8_t > toBytes() const override
To bytes.
virtual data::ElementPtr toElement() const override
Unparse attribute.
virtual size_t getValueLen() const override
Value length.
virtual uint8_t toIpv6PrefixLen() const override
To IPv6 prefix length.
friend class Attribute
Make Attribute a friend class.
virtual AttrValueType getValueType() const override
Get value type.
static AttributePtr fromText(const uint8_t type, const std::string &repr)
From text.
static AttributePtr fromBytes(const uint8_t type, const std::vector< uint8_t > &bytes)
From bytes.
virtual std::string toText(size_t indent=0) const override
Returns text representation of the attribute.
static AttributePtr fromBytes(const uint8_t type, const std::vector< uint8_t > &bytes)
From bytes.
static AttributePtr fromText(const uint8_t type, const std::string &repr)
From text.
virtual std::vector< uint8_t > toBytes() const override
To bytes.
virtual data::ElementPtr toElement() const override
Unparse attribute.
virtual std::string toText(size_t indent=0) const override
Returns text representation of the attribute.
AttrString(const uint8_t type, const std::string &value)
Constructor.
virtual std::vector< uint8_t > toBinary() const override
To binary.
virtual size_t getValueLen() const override
Value length.
friend class Attribute
Make Attribute a friend class.
virtual std::string toString() const override
To string.
virtual AttrValueType getValueType() const override
Get value type.
RADIUS attribute base class.
static AttributePtr fromBytes(const std::vector< uint8_t > &bytes)
From bytes (wire format).
virtual std::string toString() const
Specific get methods.
virtual size_t getValueLen() const =0
Generic get methods.
static AttributePtr fromInt(const uint8_t type, const uint32_t value)
From integer with type.
static AttributePtr fromIpAddr(const uint8_t type, const asiolink::IOAddress &value)
From IPv4 address with type.
virtual uint32_t toInt() const
To integer.
Attribute(const uint8_t type)
Constructor.
static AttributePtr fromString(const uint8_t type, const std::string &value)
From type specific factories.
virtual std::vector< uint8_t > toBytes() const =0
To bytes (wire format).
uint8_t getType() const
Get type.
virtual ~Attribute()=default
Virtual destructor.
virtual asiolink::IOAddress toIpAddr() const
To IPv4 address.
virtual asiolink::IOAddress toIpv6Addr() const
To IPv6 address.
static AttributePtr fromBinary(const uint8_t type, const std::vector< uint8_t > &value)
From binary with type.
static AttributePtr fromText(const std::string &repr)
Generic factories.
virtual uint8_t toIpv6PrefixLen() const
To IPv6 prefix length.
static AttributePtr fromIpv6Prefix(const uint8_t type, const uint8_t len, const asiolink::IOAddress &value)
From IPv6 prefix with type.
virtual std::string toText(size_t indent=0) const =0
Returns text representation of the attribute.
static AttributePtr fromIpv6Addr(const uint8_t type, const asiolink::IOAddress &value)
From IPv6 address with type.
virtual asiolink::IOAddress toIpv6Prefix() const
To IPv6 prefix.
virtual AttrValueType getValueType() const =0
Get value type.
virtual std::vector< uint8_t > toBinary() const
To binary.
Collection of attributes.
boost::multi_index_container< ConstAttributePtr, boost::multi_index::indexed_by< boost::multi_index::sequenced<>, boost::multi_index::hashed_non_unique< boost::multi_index::member< Attribute, const uint8_t, &Attribute::type_ > > > > AttributeContainer
Type of the container.
void add(const ConstAttributePtr &attr)
Adds instance of the attribute to the collection.
AttributeContainer container_
The container.
size_t size() const
Returns the number of elements.
AttributeContainer::const_iterator begin() const
Get the iterator to the beginning.
std::string toText(size_t indent=0) const
Returns text representation of the collection.
bool empty() const
Indicates the object is empty.
void append(const Attributes &other)
Append another collection.
size_t count(const uint8_t type) const
Counts instance of the attribute in the collection.
virtual ~Attributes()
Destructor.
AttributeContainer::const_iterator cend() const
Get the const iterator to the past-the-end.
ConstAttributePtr get(const uint8_t type) const
Get instance of the attribute in the collection.
data::ElementPtr toElement() const override
Unparse collection.
Attributes(const Attributes &other)
Copy constructor.
AttributeContainer::const_iterator cbegin() const
Get the const iterator to the beginning.
void clear()
Clear the collection.
AttributeContainer::iterator begin()
Get the iterator to the beginning.
bool del(const uint8_t type)
Deletes an attribute from the collection.
static Attributes fromElement(const data::ConstElementPtr &attr_list)
Parse collection.
AttributeContainer::iterator end()
Get the iterator to the past-the-end.
AttributeContainer::const_iterator end() const
Get the iterator to the past-the-end.
#define isc_throw(type, stream)
A shortcut macro to insert known values into exception arguments.
boost::shared_ptr< const Element > ConstElementPtr
boost::shared_ptr< Element > ElementPtr
boost::shared_ptr< Attributes > AttributesPtr
Shared pointers to attribute collection.
boost::shared_ptr< const Attribute > ConstAttributePtr
AttrValueType
Attribute value types.
boost::shared_ptr< AttrDef > AttrDefPtr
Shared pointers to Attribute definition.
boost::shared_ptr< Attribute > AttributePtr
Defines the logger used by the top-level component of kea-lfc.
Abstract class for configuration Cfg_* classes.