Cisco-AVPair regex
Alan DeKok
aland at deployingradius.com
Fri Jul 14 15:35:24 CEST 2017
On Jul 14, 2017, at 9:22 AM, Kylián Martin <kylianm at plzen.eu> wrote:
>
> I'm trying to save some of the Cisco-AVPair attributes into sql while acounting. Specifically, I'm interested in the dhcp-options and http-tlv attributes. WLC describes the connected device in these.
>
> Unfortunately, Freeradius 3.12 expands these values unregexable way.
> (With_cisco_vsa_hack = yes in preprocess the result is the same)
> Correctly expanded is just Cisco-AVPair = "audit-session-id=1ef1a8c000014809cba76859"
That's just text. There shouldn't be a problem.
> Policy file:
>
> device_regex = '^((dhcp-option=)|(http-tlv=)){1}([\\].{2,5})([\\].{2,5})([\\].{3})([\\].{3})?(.*)'
That seems much too complicated. And doesn't match the Cisco-AVPair you have above.
> (98) Cisco-AVPair = "dhcp-option=\000\014\000\0056spMK"
> (98) Cisco-AVPair = "http-tlv=\000\001\000\030iPhone8,2/10.3.2 (14F89)"
>
> How to regex these ?
Use a regex library which can handle embedded NUL bytes.
Regexes normally work on strings. i.e. printable data. The attributes above are binary, not printable data.
> Both attributes are expanded till first whitespace char
No, they stop on the first NUL character. i.e. embedded zero.
> (98) if ("%{Foreach-Variable-0}" =~ /^((dhcp-option=)|(http-tlv=)){1}([\\].{2,5})([\\].{2,5})([\\].{3})([\\].{3})?(.*)/i) -> FALSE
> (98) } # foreach &Cisco-AVPair = updated
> (98) } # if (&Cisco-AVPair) = updated
>
> How to get text values following whitespaces?
> I've already tried if ("unescape:%{Foreach-Variable-0}" =~ /${policy.device_regex}/i) with no luck
Install pcre, and use it as the regex engine. It can handle embedded NUL bytes.
Or, use another method to parse the Cisco-AVPairs. e.g. rlm_perl.
Or, use the "unpack" module to unpack binary data. See raddb/mods-available/unpack for documentation.
Alan DeKok.
More information about the Freeradius-Users
mailing list