Kea 3.1.1
client_attribute.h
Go to the documentation of this file.
1// Copyright (C) 2023-2025 Internet Systems Consortium, Inc. ("ISC")
2//
3// This Source Code Form is subject to the terms of the Mozilla Public
4// License, v. 2.0. If a copy of the MPL was not distributed with this
5// file, You can obtain one at http://mozilla.org/MPL/2.0/.
6
7#ifndef RADIUS_CLIENT_ATTRIBUTE_H
8#define RADIUS_CLIENT_ATTRIBUTE_H
9
11#include <cc/cfg_to_element.h>
12#include <cc/data.h>
13#include <cc/simple_parser.h>
14#include <asiolink/io_address.h>
15#include <client_dictionary.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>
22#include <string>
23#include <vector>
24
25namespace isc {
26namespace radius {
27
29static constexpr size_t MAX_STRING_LEN = 253;
30
32using isc::data::TypeError;
33
35class Attribute;
36typedef boost::shared_ptr<Attribute> AttributePtr;
37typedef boost::shared_ptr<const Attribute> ConstAttributePtr;
38
41protected:
42
48 explicit Attribute(const uint8_t type) : type_(type) {
49 }
50
51public:
53 virtual ~Attribute() = default;
54
58 uint8_t getType() const {
59 return (type_);
60 }
61
65 virtual AttrValueType getValueType() const = 0;
66
68
74 static AttributePtr fromText(const std::string& repr);
75
81 static AttributePtr fromBytes(const std::vector<uint8_t>& bytes);
82
84
91 static AttributePtr fromText(const AttrDefPtr& def,
92 const std::string& value);
93
100 static AttributePtr fromBytes(const AttrDefPtr& def,
101 const std::vector<uint8_t>& value);
102
106
113 static AttributePtr fromString(const uint8_t type,
114 const std::string& value);
115
122 static AttributePtr fromBinary(const uint8_t type,
123 const std::vector<uint8_t>& value);
124
131 static AttributePtr fromInt(const uint8_t type, const uint32_t value);
132
139 static AttributePtr fromIpAddr(const uint8_t type,
140 const asiolink::IOAddress& value);
141
148 static AttributePtr fromIpv6Addr(const uint8_t type,
149 const asiolink::IOAddress& value);
150
158 static AttributePtr fromIpv6Prefix(const uint8_t type,
159 const uint8_t len,
160 const asiolink::IOAddress& value);
161
163
167 virtual size_t getValueLen() const = 0;
168
173 virtual std::string toText(size_t indent = 0) const = 0;
174
178 virtual std::vector<uint8_t> toBytes() const = 0;
179
183
188 virtual std::string toString() const;
189
194 virtual std::vector<uint8_t> toBinary() const;
195
200 virtual uint32_t toInt() const;
201
206 virtual asiolink::IOAddress toIpAddr() const;
207
212 virtual asiolink::IOAddress toIpv6Addr() const;
213
218 virtual asiolink::IOAddress toIpv6Prefix() const;
219
224 virtual uint8_t toIpv6PrefixLen() const;
225
227 const uint8_t type_;
228};
229
232
234class AttrString : public Attribute {
235protected:
240 AttrString(const uint8_t type, const std::string& value)
241 : Attribute(type), value_(value) {
242 if (value.empty()) {
243 isc_throw(BadValue, "value is empty");
244 }
245 if (value.size() > MAX_STRING_LEN) {
246 isc_throw(BadValue, "value is too large " << value.size()
247 << " > " << MAX_STRING_LEN);
248 }
249 }
250
255 AttrString(const uint8_t type, const std::vector<uint8_t>& value);
256
262 static AttributePtr fromText(const uint8_t type, const std::string& repr);
263
269 static AttributePtr fromBytes(const uint8_t type,
270 const std::vector<uint8_t>& bytes);
271
273 friend class Attribute;
274
275public:
279 virtual AttrValueType getValueType() const override {
280 return (PW_TYPE_STRING);
281 }
282
286 virtual size_t getValueLen() const override {
287 return (value_.size());
288 }
289
294 virtual std::string toText(size_t indent = 0) const override;
295
299 virtual std::vector<uint8_t> toBytes() const override;
300
304 virtual std::string toString() const override {
305 return (value_);
306 }
307
311 virtual std::vector<uint8_t> toBinary() const override;
312
316 virtual data::ElementPtr toElement() const override;
317
318private:
320 std::string value_;
321};
322
324class AttrInt : public Attribute {
325protected:
326
331 AttrInt(const uint8_t type, const int32_t value)
332 : Attribute(type), value_(static_cast<uint32_t>(value)) {
333 }
334
339 AttrInt(const uint8_t type, const uint32_t value)
340 : Attribute(type), value_(value) {
341 }
342
348 static AttributePtr fromText(const uint8_t type, const std::string& repr);
349
355 static AttributePtr fromBytes(const uint8_t type,
356 const std::vector<uint8_t>& bytes);
357
359 friend class Attribute;
360
361public:
362
366 virtual AttrValueType getValueType() const override {
367 return (PW_TYPE_INTEGER);
368 }
369
373 virtual size_t getValueLen() const override {
374 return (4);
375 }
376
381 virtual std::string toText(size_t indent = 0) const override;
382
386 virtual std::vector<uint8_t> toBytes() const override;
387
391 virtual uint32_t toInt() const override {
392 return (value_);
393 }
394
398 virtual data::ElementPtr toElement() const override;
399
400private:
402 const uint32_t value_;
403};
404
406class AttrIpAddr : public Attribute {
407protected:
408
413 AttrIpAddr(const uint8_t type, const asiolink::IOAddress& value)
414 : Attribute(type), value_(value) {
415 if (!value.isV4()) {
416 isc_throw(BadValue, "not v4 address " << value);
417 }
418 }
419
425 static AttributePtr fromText(const uint8_t type, const std::string& repr);
426
432 static AttributePtr fromBytes(const uint8_t type,
433 const std::vector<uint8_t>& bytes);
434
436 friend class Attribute;
437
438public:
442 virtual AttrValueType getValueType() const override {
443 return (PW_TYPE_IPADDR);
444 }
445
449 virtual size_t getValueLen() const override {
450 return (4);
451 }
452
457 virtual std::string toText(size_t indent = 0) const override;
458
462 virtual std::vector<uint8_t> toBytes() const override;
463
467 virtual asiolink::IOAddress toIpAddr() const override {
468 return (value_);
469 }
470
474 virtual data::ElementPtr toElement() const override;
475
476private:
478 asiolink::IOAddress value_;
479};
480
482class AttrIpv6Addr : public Attribute {
483protected:
484
489 AttrIpv6Addr(const uint8_t type, const asiolink::IOAddress& value)
490 : Attribute(type), value_(value) {
491 if (!value.isV6()) {
492 isc_throw(BadValue, "not v6 address " << value);
493 }
494 }
495
501 static AttributePtr fromText(const uint8_t type, const std::string& repr);
502
508 static AttributePtr fromBytes(const uint8_t type,
509 const std::vector<uint8_t>& bytes);
510
512 friend class Attribute;
513
514public:
515
519 virtual AttrValueType getValueType() const override {
520 return (PW_TYPE_IPV6ADDR);
521 }
522
526 virtual size_t getValueLen() const override {
527 return (16);
528 }
529
534 virtual std::string toText(size_t indent = 0) const override;
535
539 virtual std::vector<uint8_t> toBytes() const override;
540
544 virtual asiolink::IOAddress toIpv6Addr() const override {
545 return (value_);
546 }
547
551 virtual data::ElementPtr toElement() const override;
552
553private:
555 asiolink::IOAddress value_;
556};
557
559class AttrIpv6Prefix : public Attribute {
560protected:
561
567 AttrIpv6Prefix(const uint8_t type, const uint8_t len,
568 const asiolink::IOAddress& value)
569 : Attribute(type), len_(len), value_(value) {
570 if (!value.isV6()) {
571 isc_throw(BadValue, "not v6 address " << value);
572 }
573 if (len > 128) {
574 isc_throw(BadValue, "too long prefix "
575 << static_cast<unsigned>(len));
576 }
577 }
578
584 static AttributePtr fromText(const uint8_t type, const std::string& repr);
585
591 static AttributePtr fromBytes(const uint8_t type,
592 const std::vector<uint8_t>& bytes);
593
595 friend class Attribute;
596
597public:
598
602 virtual AttrValueType getValueType() const override {
603 return (PW_TYPE_IPV6PREFIX);
604 }
605
609 virtual size_t getValueLen() const override {
610 return (17);
611 }
612
617 virtual std::string toText(size_t indent = 0) const override;
618
622 virtual std::vector<uint8_t> toBytes() const override;
623
627 virtual asiolink::IOAddress toIpv6Prefix() const override {
628 return (value_);
629 }
630
634 virtual uint8_t toIpv6PrefixLen() const override {
635 return (len_);
636 }
637
641 virtual data::ElementPtr toElement() const override;
642
643private:
645 const uint8_t len_;
646
648 asiolink::IOAddress value_;
649};
650
653public:
654
656 typedef boost::multi_index_container<
657 // This container stores pointers to attributes.
659 // Start specification of indexes here.
660 boost::multi_index::indexed_by<
661 // Sequenced index to keep insert order.
662 boost::multi_index::sequenced<>,
663 // Hash index for direct retrieval.
664 boost::multi_index::hashed_non_unique<
665 boost::multi_index::member<
666 Attribute, const uint8_t, &Attribute::type_
667 >
668 >
669 >
671
674 }
675
680 }
681
683 virtual ~Attributes() {
684 clear();
685 }
686
690 bool empty() const {
691 return (container_.empty());
692 }
693
697 size_t size() const {
698 return (container_.size());
699 }
700
704 void add(const ConstAttributePtr& attr);
705
712 bool del(const uint8_t type);
713
715 void clear() {
716 container_.clear();
717 }
718
722 void append(const Attributes& other);
723
728 size_t count(const uint8_t type) const;
729
734 ConstAttributePtr get(const uint8_t type) const;
735
740 std::string toText(size_t indent = 0) const;
741
745 data::ElementPtr toElement() const override;
746
751 static Attributes fromElement(const data::ConstElementPtr& attr_list);
752
756 AttributeContainer::iterator begin() {
757 return (container_.begin());
758 }
759
763 AttributeContainer::const_iterator begin() const {
764 return (container_.begin());
765 }
766
770 AttributeContainer::const_iterator cbegin() const {
771 return (container_.cbegin());
772 }
773
777 AttributeContainer::iterator end() {
778 return (container_.end());
779 }
780
784 AttributeContainer::const_iterator end() const {
785 return (container_.end());
786 }
787
789 AttributeContainer::const_iterator cend() const {
790 return (container_.cend());
791 }
792
793protected:
796};
797
799typedef boost::shared_ptr<Attributes> AttributesPtr;
800
801} // end of namespace isc::radius
802} // end of namespace isc
803
804#endif
if(!(yy_init))
A generic exception that is thrown if a parameter given to a method is considered invalid in that con...
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.
const uint8_t type_
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
Definition data.h:29
boost::shared_ptr< Element > ElementPtr
Definition data.h:28
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.