oracular (3) Net::Radius::Packet.3pm.gz

Provided by: libnet-radius-perl_2.103+dfsg-1.1_all bug

NAME

       Net::Radius::Packet - Object-oriented Perl interface to RADIUS packets

SYNOPSIS

         use Net::Radius::Packet;
         use Net::Radius::Dictionary;

         my $d = new Net::Radius::Dictionary "/etc/radius/dictionary";

         my $p = new Net::Radius::Packet $d, $data;
         $p->dump;

         if ($p->attr('User-Name' eq "lwall") {
           my $resp = new Net::Radius::Packet $d;
           $resp->set_code('Access-Accept');
           $resp->set_identifier($p->identifier);
           $resp->set_authenticator($p->authenticator);
           $resp->set_attr('Reply-Message' => "Welcome, Larry!\r\n");
           my $respdat = auth_resp($resp->pack, "mysecret");
           ...

         die "Packet is a fake response\n" if ($p->code eq 'Access-Accept'
           and not auth_req_verify($data, $secret, $req->authenticator))

         die "Packet is a fake\n" if ($p->code eq 'Accounting-Request'
           and not auth_acct_verify($data, $secret))

DESCRIPTION

       RADIUS (RFC2138) specifies a binary packet format which contains various values and attributes.
       Net::Radius::Packet provides an interface to turn RADIUS packets into Perl data structures and vice-
       versa.

       Net::Radius::Packet does not provide functions for obtaining RADIUS packets from the network.  A simple
       network RADIUS server is provided as an example at the end of this document.

   PACKAGE METHODS
       new Net::Radius::Packet $dictionary, $data
           Returns a new Net::Radius::Packet object. $dictionary is an optional reference to a
           Net::Radius::Dictionary object.  If not supplied, you must call set_dict.

           If $data is supplied, unpack will be called for you to initialize the object.

   Proxy-State, RFC specification
       From RFC-2865:

         2. Operation

         If any Proxy-State attributes were present in the Access-Request,
         they MUST be copied unmodified and in order into the response packet.
         Other Attributes can be placed before, after, or even between the
         Proxy-State attributes.

         2.3 Proxy

         The forwarding server MUST treat any Proxy-State attributes already
         in the packet as opaque data.  Its operation MUST NOT depend on the
         content of Proxy-State attributes added by previous servers.

         If there are any Proxy-State attributes in the request received from
         the client, the forwarding server MUST include those Proxy-State
         attributes in its reply to the client.  The forwarding server MAY
         include the Proxy-State attributes in the access-request when it
         forwards the request, or MAY omit them in the forwarded request.  If
         the forwarding server omits the Proxy-State attributes in the
         forwarded access-request, it MUST attach them to the response before
         sending it to the client.

   Proxy-State, Implementation
       "->pack()" and "->dump()" now work properly with multiple atributes, in particular the Proxy-State
       attribute - This means that the packet will be encoded with the multiple attributes present. This change
       makes Net::Radius::PacketOrdered likely redundant.

       "->attr()" method always return the last attribute inserted.

       "->set_attr()" and "->set_vsattr()" methods push either the attribute or the vendor-specific attribute,
       onto the Attributes stack, or overwrites it in specific circumnstances, as described in method
       documentation. The "->unset_attr()" and "->unset_vsattr()" perform the opposite function.

   OBJECT METHODS
       There are actually two families of object methods. The ones described below deal with standard RADIUS
       attributes. An additional set of methods handle the Vendor-Specific attributes as defined in the RADIUS
       protocol.  Those methods behave in much the same way as the ones below with the exception that the prefix
       vs must be applied before the attr in most of the names. The vendor code must also be included as the
       first parameter of the call.

       The vsattr and set_vsattr methods, used to query and set Vendor-Specific attributes return an array
       reference with the values of each instance of the particular attribute in the packet. This difference is
       required to support multiple VSAs with different parameters in the same packet.

       ->set_dict($dictionary)
           Net::Radius::Packet needs access to a Net::Radius::Dictionary object to do packing and unpacking.
           set_dict must be called with an appropriate dictionary reference (see Net::Radius::Dictionary) before
           you can use ->pack or ->unpack.

       ->unpack($data)
           Given a raw RADIUS packet $data, unpacks its contents so that they can be retrieved with the other
           methods (code, attr, etc.).

       ->pack
           Returns a raw RADIUS packet suitable for sending to a RADIUS client or server.

       ->code
           Returns the Code field as a string.  As of this writing, the following codes are defined:

               Access-Request
               Access-Accept
               Access-Reject
               Accounting-Request
               Accounting-Response
               Accounting-Status
               Interim-Accounting
               Password-Request
               Password-Ack
               Password-Reject
               Accounting-Message
               Access-Challenge
               Status-Server
               Status-Client
               Resource-Free-Request
               Resource-Free-Response
               Resource-Query-Request
               Resource-Query-Response
               Alternate-Resource-Reclaim-Request
               NAS-Reboot-Request
               NAS-Reboot-Response
               Next-Passcode
               New-Pin
               Terminate-Session
               Password-Expired
               Event-Request
               Event-Response
               Disconnect-Request
               Disconnect-ACK
               Disconnect-NAK
               CoA-Request
               CoA-ACK
               CoA-NAK
               IP-Address-Allocate
               IP-Address-Release

       ->set_code($code)
           Sets the Code field to the string supplied.

       ->identifier()
           Returns the one-byte Identifier used to match requests with responses, as a character value.

       ->set_identifier($id)
           Sets the Identifier byte to the character supplied.

       ->authenticator()
           Returns the 16-byte Authenticator field as a character string.

       ->set_authenticator($authenticator)
           Sets the Authenticator field to the character string supplied.

       ->attr($name)
           Retrieves the value of the named Attribute.  Attributes will be converted automatically based on
           their dictionary type:

                   STRING     Returned as a string.
                   INTEGER    Returned as a Perl integer.
                   IPADDR     Returned as a string (a.b.c.d)
                   TIME       Returned as an integer

           The following types are simply mapped to other types until correct encoding is implemented:

           ipv6addr
               Treated as a string

           date
               Treated as a string

           ifid
               Treated as a string

           When multiple attributes are inserted in the packet, the last one is returned.

       ->set_attr($name, $val, $rewrite_flag)
           Sets the named Attributes to the given value. Values should be supplied as they would be returned
           from the attr method. If rewrite_flag is set, and a single attribute with such name already exists on
           the Attributes stack, its value will be overwriten with the supplied one. In all other cases (if
           there are more than one attributes with such name already on the stack, there are no attributes with
           such name, rewrite_flag is omitted) name/pair array will be pushed onto the stack.

       ->set_vsattr($vendor, $name, $val, $rewrite_flag)
           Analogous to "->set_attr()", but operates on vendor-specific attributes for vendor $vendor.

       ->unset_attr($name)
           Sets the named Attribute to the given value.  Values should be supplied as they would be returned
           from the attr method.

       ->unset_vsattr($vendor, $name)
           Analogous to "->unset_attr()", but operates on vendor-specific attributes for vendor $vendor.

       ->attr_slot($integer)
           Deprecated synonym for "->attr_slot_val()".

       ->attr_slots()
           Return the number of attribute slots in the packet.

       ->attr_slot_name($integer)
           Retrieves the attribute name of the given slot number from the Attributes stack. Returns undef when
           the slot is vacant.

       ->attr_slot_val($integer)
           Retrieves the attribute value of the given slot number from the Attributes stack. Returns undef when
           the slot is vacant.

       ->unset_attr_slot($integer)
           Removes given stack position from the Attributes stack.

       ->password($secret, [$attr])
           The RADIUS User-Password attribute is encoded with a shared secret.  Use this method to return the
           decoded version. By default, the password will be looked for in the User-Password attribute. You can
           specify an alternate RADIUS attribute, by using the second argument.

       ->set_password($passwd, $secret, [$attribute])
           The RADIUS User-Password attribute is encoded with a shared secret.  Use this method to prepare the
           encoded version. The encoded password will be stored in the attribute $attribute, which defaults to
           'User-Password'.

           Some servers have been reported on insisting on this attribute to be 'Password' instead. You may have
           to tweak this call or the dictionary accordingly.

       ->dump()
           Prints the content of the packet to STDOUT.

       ->show_unknown_entries($bool)
           Controls the generation of a "warn()" whenever an unknown tuple is seen.

   EXPORTED SUBROUTINES
       auth_resp($packed_packet, $secret [, accounting])
           Given a (packed) RADIUS packet and a shared secret, returns a new packet with the Authenticator field
           changed in accordace with RADIUS protocol requirements.

           If the third optional parameter is true, the Authenticator is encoded for an accounting packet, using
           16 0x0 octets as the placeholder for the authenticator.

       auth_acct_verify($packet, $secret)
           Verifies the authenticator in an Accounting-Request packet as explained in RFC-2866. Returns 1 if the
           authenticator matches the packet and the secret, undef otherwise.

           $packet is the packet data, as received. $secret is the corresponding shared secret.

       auth_req_verify($packet, $secret, $prev_auth)
           Verifies the authenticator in Access-Accept, Access-Reject, and Access-Challenge packets as explained
           in RFC-2865. Returns 1 if the authenticator matches the packet and the secret, undef otherwise.

           $packet is the packet data, as received. $secret is the corresponding shared secret. $prev_auth is
           the authenticator taken from the corresponding Access-Accept packet.

           It's the application's job to keep track of the authenticators in each request.

EXAMPLE

       See the examples included in the examples/ directory of the distribution. Also see Net::Radius::Server(3)
       for a more complete implementation of a RADIUS server.

AUTHOR

       Christopher Masto, <chris@netmonger.net>. VSA support by Luis E. Muñoz, <luismunoz@cpan.org>. Fix for
       unpacking 3COM VSAs contributed by Ian Smith <iansmith@ncinter.net>. Information for packing of 3Com VSAs
       provided by Quan Choi <Quan_Choi@3com.com>. Some functions contributed by Tony Mountifield
       <tony@mountifield.org>. Attribute ordering provided by Toni Prug, <toni@irational.org>, idea by Bill
       Hulley.

SEE ALSO

       Perl, Net::Radius::Server(3), Net::Radius::Dictionary(3), RFCs 2865, 2866, 2882 and 3575.