RADIUS

The system provides two Python objects alc.radius and alc.radius.attributes to inspect and modify RADIUS packets.

The alc.radius object

Provides packet level operations.

alc.radius.header()

Returns a dictionary containing the value of the RADIUS header fields:

  • code (integer)

  • id (integer)

  • len (integer)

  • authenticator (bytes)

print(alc.radius.header())
# {'code': 1, 'id': 202, 'len': 133, 'authenticator': b'\xe5C\xabM\xa1\x82(\x95\xe2\x84\xfai\xe6|\xd8\x92'}
alc.radius.drop()

Drops the packet.

The alc.radius.attributes object

Provides attribute level operations.

alc.radius.attributes.isSet(type, /)

Checks if a specified attribute is present.

Parameters

type (int|tuple) – Attribute type. If the parameter is a tuple, it should be interpreted as an attribute identifier. See Attribute identifiers.

Return type

bool

alc.radius.attributes.get(type, /)

Retrieves the value of a specified attribute.

Parameters

type (int|tuple) – Attribute type. If the parameter is a tuple, it should be interpreted as an attribute identifier. See Attribute identifiers.

Returns

Value of the attribute, or None if not present.

Return type

bytes

alc.radius.attributes.getTuple(type, /)

Retrieves all values of a specified attribute.

Parameters

type (int|tuple) – Attribute type. If the parameter is a tuple, it should be interpreted as an attribute identifier. See Attribute identifiers.

Returns

All values collected in a tuple.

Return type

tuple

alc.radius.attributes.set(type, value, /)

Adds an attribute with the specified type and value. This overwrites previously existing values if present.

Parameters
  • type (int|tuple) – Attribute type. If the parameter is a tuple, it should be interpreted as an attribute identifier. See Attribute identifiers.

  • value (bytes|tuple) – Attribute value. If it is a tuple, multiple attributes with the same type are added, one for each item in the tuple.

alc.radius.attributes.clear(type, /)

Removes all attributes with the specified type.

Parameters

type (int|tuple) – Attribute type. If the parameter is a tuple, it should be interpreted as an attribute identifier. See Attribute identifiers.

alc.radius.attributes.isVSASet(vendor, vendor_type, /)

Verifies if a specified vendor-specific attribute is present.

Parameters
  • vendor (int) – Vendor.

  • vendor_type (int) – Vendor type.

Return type

bool

alc.radius.attributes.getVSA(vendor, vendor_type, /)

Retrieves the value of a specified vendor-specific attribute.

Parameters
  • vendor (int) – Vendor.

  • vendor_type (int) – Vendor type.

Returns

Value of the attribute, or None if not present.

Return type

bytes, None

alc.radius.attributes.getVSATuple(vendor, vendor_type, /)

Retrieves all values of a specified vendor-specific attribute.

Parameters
  • vendor (int) – Vendor.

  • vendor_type (int) – Vendor type.

Returns

All values collected in a tuple.

Return type

tuple

alc.radius.attributes.setVSA(vendor, vendor_type, value, /)

Adds a vendor-specific attribute. If already present, the attribute is overwritten.

Parameters
  • vendor (int) – Vendor.

  • vendor_type (int) – Vendor type.

  • value (bytes|tuple) – Attribute value. If it is a tuple, multiple attributes with the same type are added, one for each item in the tuple.

alc.radius.attributes.clearVSA(vendor, vendor_type, /)

Removes all specified vendor-specific attributes.

Parameters
  • vendor (int) – Vendor.

  • vendor_type (int) – Vendor type.

alc.radius.attributes.isExtSet(type, ext_type, /)

Verifies if a specified extended attribute is present.

Parameters
  • type (int) – Type. Must be one of 241, 242, 243, 244, 245, 246.

  • ext_type (int) – Extended type.

Return type

bool

alc.radius.attributes.getExt(type, ext_type, /)

Retrieves the value of a specified extended attribute.

Parameters
  • type (int) – Type. Must be one of 241, 242, 243, 244, 245, 246.

  • ext_type (int) – Extended type.

Returns

All values collected in a tuple.

Return type

tuple

alc.radius.attributes.getExtTuple(type, ext_type, /)

Retrieves all values of a specified extended attribute.

Parameters
  • type (int) – Type. Must be one of 241, 242, 243, 244, 245, 246.

  • ext_type (int) – Extended type.

Returns

All values collected in a tuple.

Return type

tuple

alc.radius.attributes.setExt(type, ext_type, value, /)

Adds an extended attribute. If already present, the attribute is overwritten.

Parameters
  • type (int) – Type. Must be one of 241, 242, 243, 244, 245, 246.

  • ext_type (int) – Extended type.

  • value (bytes|tuple) – Attribute value. If it is a tuple, multiple attributes with the same type are added, one for each item in the tuple.

alc.radius.attributes.clearExt(type, ext_type, /)

Removes all specified extended attributes.

Parameters
  • type (int) – Type. Must be one of 241, 242, 243, 244, 245, 246.

  • ext_type (int) – Extended type.

alc.radius.attributes.isExtVSASet(type, vendor, vendor_type, /)

Verifies if a specified extended-vendor-specific attribute is present.

Parameters
  • type (int) – Type. Must be one of 241, 242, 243, 244, 245, 246.

  • vendor (int) – Vendor.

  • vendor_type (int) – Vendor type.

Return type

bool

alc.radius.attributes.getExtVSA(type, vendor, vendor_type, /)

Retrieves the value of a specified extended-vendor-specific attribute.

Parameters
  • type (int) – Type. Must be one of 241, 242, 243, 244, 245, 246.

  • vendor (int) – Vendor.

  • vendor_type (int) – Vendor type.

Returns

All values collected in a tuple.

Return type

tuple

alc.radius.attributes.getExtVSATuple(type, vendor, vendor_type, /)

Retrieves all values of a specified extended-vendor-specific attribute.

Parameters
  • type (int) – Type. Must be one of 241, 242, 243, 244, 245, 246.

  • vendor (int) – Vendor.

  • vendor_type (int) – Vendor type.

Returns

All values collected in a tuple.

Return type

tuple

alc.radius.attributes.setExtVSA(type, vendor, vendor_type, value, /)

Adds an extended-vendor-specific attribute. If already present, the attribute is overwritten.

Parameters
  • type (int) – Type. Must be one of 241, 242, 243, 244, 245, 246.

  • vendor (int) – Vendor.

  • vendor_type (int) – Vendor type.

  • value (bytes|tuple) – Attribute value. If it is a tuple, multiple attributes with the same type are added, one for each item in the tuple.

alc.radius.attributes.clearExtVSA(type, vendor, vendor_type, /)

Removes all specified extended-vendor-specific attributes.

Parameters
  • type (int) – Type. Must be one of 241, 242, 243, 244, 245, 246.

  • vendor (int) – Vendor.

  • vendor_type (int) – Vendor type.

alc.radius.attributes.getLongExtTuple(type, ext_type, /)

Retrieves all values of a specified long-extended attribute.

Deprecated

use getExtTuple() instead

Parameters
  • type (int) – Type. Must be one of 245, 246.

  • ext_type (int) – Extended type.

Returns

All values collected in a tuple.

Return type

tuple

alc.radius.attributes.setLongExt(type, ext_type, value, /)

Adds a long-extended attribute. If already present, the attribute is overwritten.

Deprecated

use setExt() instead

Parameters
  • type (int) – Type. Must be one of 245, 246.

  • ext_type (int) – Extended type.

  • value (bytes|tuple) – Attribute value. If it is a tuple, multiple attributes with the same type are added, one for each item in the tuple.

alc.radius.attributes.getLongExtVSATuple(type, vendor, vendor_type, /)

Retrieves all values of a specified long-extended vendor-specific attribute.

Deprecated

use getExtVSATuple() instead

Parameters
  • type (int) – Type. Must be one of 245, 246.

  • vendor (int) – Vendor.

  • vendor_type (int) – Vendor type.

Returns

All values collected in a tuple.

Return type

tuple

alc.radius.attributes.setLongExtVSA(type, vendor, vendor_type, value, /)

Adds a long-extended vendor-specific attribute. If already present, the attribute is overwritten.

Deprecated

use setExtVSA() instead

Parameters
  • type (int) – Type. Must be one of 245, 246.

  • vendor (int) – Vendor.

  • vendor_type (int) – Vendor type.

  • value (bytes|tuple) – Attribute value. If it is a tuple, multiple attributes with the same type are added, one for each item in the tuple.

Note

The following RADIUS attributes or VSAs are read-only:

  • Message-Authenticator (80)

  • Alc-LI-Action (26.6527.122)

  • Alc-LI-Destination (26.6527.123)

  • Alc-LI-FC (26.6527.124)

  • Alc-LI-Direction (26.6527.125)

  • Alc-LI-Intercept-Id (26.6527.138)

  • Alc-LI-Session-Id (26.6527.139)

Warning

All methods in alc.RadiusAttributes raise appropriate TypeError or ValueError messages in cases of invalid arguments. See Breaking changes for differences with the previous version.

Attribute iteration

The class alc.RadiusAttributes acts as an iterator over the attributes, yielding a tuple (identifier, value) for each attribute present.

import alc

print(list(alc.radius.attributes))
# [((8,), b'\xc0\xa8\x01\x14'), ((26, 6527, 9), b'\x08\x08\x08\x08'), ((26, 6527, 10), b'\x08\x08\x04\x04')]
for attr, value in alc.radius.attributes:
   dotted_number = ".".join(map(str, attr))
   print("{} = {}".format(dotted_number, value))
#8 = b'\xc0\xa8\x01\x14'
#26.6527.9 = b'\x08\x08\x08\x08'
#26.6527.10 = b\x08\x08\x04\x04'

Warning

The type of object returned by the iterator has changed between the Python 2 and Python 3 version of this module. See Breaking changes.

Attribute access

Besides the methods defined for the alc.Radius class, the attributes can also be fetched, set, and cleared using the container syntax of Python. The keys by which the attributes can be reached are the identifier tuples as described in Attribute identifiers. The values are tuples of bytes.

print(alc.radius.attributes[(8,)])
#(b'\xc0\xa8\x01\x14',)
print(alc.radius.attributes[(241, 26, 6527, 4)])
#()

Checking if an attribute is present can be done via the in operator.

print((8,) in alc.radius.attributes)
#True
print((241, 26, 6527, 4) in alc.radius.attributes)
#False

Adding or overwriting an attribute can be done by assigning a value to the indexed attributes object. When setting multiple values for an attribute, the value should be a tuple of bytes. When setting a single value for an attribute, the value can be a 1-tuple of bytes or the individual bytes.

alc.radius.attributes[(8,)] = b'\xc0\xa8\x01\x14'
alc.radius.attributes[(8,)] = (b'\xc0\xa8\x01\x14',)
alc.radius.attributes[(25,)] = (b'red', b'green', b'blue')

Clearing an attribute can be performed with the del operator.

del alc.radius.attributes[(8,)]

Attribute identifiers

Attribute identifiers as described in RFC 6929#section-2.7 can be used to target a specific attribute. They are specified in Python as a tuple of integers, where each item in the tuple corresponds to a number in the “dotted number” format.

Type

Name

Identifier

Python object

Normal

NAS-IP-Address

4

(4, )

Extended

Frag-Status

241.1

(241, 1)

Vendor-Specific

Alc-Subsc-Prof-Str

26.6527.12

(26, 6527, 12)

Extended-Vendor-Specific

Alc-PPPoE-Client-Service

241.26.6527.1

(241, 26, 6527, 1)

Breaking changes

Radius attribute iteration

Warning

With Python 2 API, the result of iterating over the alc.RadiusAttributes object returns tuples of length 3: (vendor, type, value), where vendor was set to 0 for regular attributes.

With Python 3, the iterator has been changed to return tuples of length 2: (identifier, value), where the identifier is itself a tuple as specified in Attribute identifiers, which uniquely identifies an attribute.

Radius invalid arguments

Warning

With Python 2 API, all functions on the alc.RadiusAttributes object fail silently when one of the arguments (type, vendor, ext-type, or vendor-type) is invalid.

With Python 3, a TypeError or ValueError exception is raised in cases of invalid arguments.

Radius attribute not present

Warning

With Python 2 API, all functions on the alc.RadiusAttributes object returning a single attribute (not the getTuple variants) return the empty bytes if the attribute is not present.

With Python 3, None is returned when the attribute is not present.