Regex question

Franks Andy (RLZ) IT Systems Engineer Andy.Franks at sath.nhs.uk
Wed Oct 23 22:36:54 CEST 2013


Hi All,
  Got a regex thing I can't explain, but it may of course be down to my
inexperience with regexs generally. Please forgive the non-ideal email
address regex, it's not great, but not really my focus here at this
point, I aim to improve it. For now it's as simple as I can make it,
having paired it down to hopefully find the problem.
We're using a captive portal which only allows pass-through of a
username and password as user "fields". The system uses voucher auth, so
we don't actually use the password field for a password, rather using it
to capture email address, browser agent, version and OS details from the
client's browser.
This is a via the user-password string in the format field:<string>
field2:<string>  - fields, with the string following a colon, separated
by spaces.
e.g. 
email:my.email at address.com browseragent:safari version:7 os:ios5

The string is passed through a few regexes, each picking off the field
string in a capture group. It's failing on the first, the email regex
being pretty simple:

^email:([a-z0-9._-]+@[a-z0-9.-]+\.[a-z]{2,4})

I've tried various delimiters  but all result in the same issue:
email:my.email at address.com,browseragent:safari,version:7,os:ios5
email:my.email at address.com#browseragent:safari#version:7#os:ios5

I've also tried compiling with and without libpcre3-dev, same - the
regex is not stopping at the space or , or #, whatever delimiter I
choose. The non email regexes seem to work ok..

Code : (in policy.d folder)

email_regexp= "^email:([a-z0-9._-]+@[a-z0-9.-]+\\.[a-z]{2,4})"
  if ("%{User-Password}" =~ /${policy.email_regexp}/){
    update control {
      Email-Address := "%{1}"
    }
}

Result:
    ? if ("%{User-Password}" =~
/^email:([a-z0-9._-]+@[a-z0-9.-]+\.[a-z]{2,4})/)
(0)     expand: "%{User-Password}" -> 'email:my.email at address.com
browseragent:safari version:7 os:ios5'
(0)    ? if ("%{User-Password}" =~
/^email:([a-z0-9._-]+@[a-z0-9.-]+\.[a-z]{2,4})/) -> TRUE
(0)    if ("%{User-Password}" =~
/^email:([a-z0-9._-]+@[a-z0-9.-]+\.[a-z]{2,4})/) {
(0)     update control {
(0)     expand: "%{1}" -> 'my.email at address.com brow'
(0)             Email-Address := "my.email at address.com brow"
(0)     } # update control = noop
(0)     [noop] = noop
(0)    } # if ("%{User-Password}" =~
/^email:([a-z0-9._-]+@[a-z0-9.-]+\.[a-z]{2,4})/) = noop
(0)     ... skipping else for request 0: Preceding "if" was taken
(0)   } # check_email_address check_email_address = noop
(0)   check_browser_agent check_browser_agent {
(0)    ? if ("%{User-Password}" =~ /browseragent:([a-z0-9_-]+)/)
(0)     expand: "%{User-Password}" -> 'email:my.email at address.com
browseragent:safari version:7 os:ios5'
(0)    ? if ("%{User-Password}" =~ /browseragent:([a-z0-9_-]+)/)  ->
TRUE
(0)    if ("%{User-Password}" =~ /browseragent:([a-z0-9_-]+)/)  {
(0)     update control {
(0)     expand: "%{1}" -> 'safari'
(0)             Browser-Agent := "safari"
(0)     } # update control = noop
(0)    } # if ("%{User-Password}" =~ /browseragent:([a-z0-9_-]+)/)  =
noop
(0)   } # check_browser_agent check_browser_agent = noop
(0)   check_browser_version check_browser_version {
(0)    ? if ("%{User-Password}" =~ /version:([a-z0-9_-]+)/)
(0)     expand: "%{User-Password}" -> 'email:my.email at address.com
browseragent:safari version:7 os:ios5'
(0)    ? if ("%{User-Password}" =~ /version:([a-z0-9_-]+)/)  -> TRUE
(0)    if ("%{User-Password}" =~ /version:([a-z0-9_-]+)/)  {
(0)     update control {
(0)     expand: "%{1}" -> '7'
(0)             Browser-Version := "7"
(0)     } # update control = noop
(0)    } # if ("%{User-Password}" =~ /version:([a-z0-9_-]+)/)  = noop
(0)   } # check_browser_version check_browser_version = noop
(0)   check_browser_os check_browser_os {
(0)    ? if ("%{User-Password}" =~ /os:([a-z0-9_-]+)$/)
(0)     expand: "%{User-Password}" -> 'email:my.email at address.com
browseragent:safari version:7 os:ios5'
(0)    ? if ("%{User-Password}" =~ /os:([a-z0-9_-]+)$/)  -> TRUE
(0)    if ("%{User-Password}" =~ /os:([a-z0-9_-]+)$/)  {
(0)     update control {
(0)     expand: "%{1}" -> 'ios5'
(0)             Browser-OS := "ios5"

I also tried a different regex, but the problems seem worse there..

    ? if ("%{User-Password}" =~
/^email:([a-z0-9_-]+(\.[a-z0-9_-]+)*@[a-z0-9_-]+(\.[a-z0-9_-]+)*(\.[a-z]
{2,4}))/)
(1)     expand: "%{User-Password}" -> 'email:my.email at address.com
browseragent:safari version:7 os:ios5'
(1)    ? if ("%{User-Password}" =~
/^email:([a-z0-9_-]+(\.[a-z0-9_-]+)*@[a-z0-9_-]+(\.[a-z0-9_-]+)*(\.[a-z]
{2,4}))/) -> TRUE
(1)    if ("%{User-Password}" =~
/^email:([a-z0-9_-]+(\.[a-z0-9_-]+)*@[a-z0-9_-]+(\.[a-z0-9_-]+)*(\.[a-z]
{2,4}))/) {
(1)     update control {
(1)     expand: "%{1}" -> 'my.email at address.com browseragent:safari
version:7 os:ios'
(1)             Email-Address := "my.email at address.com
browseragent:safari version:7 os:ios"
(1)     } # update control = noop

Any ideas what I'm doing wrong?

Thanks
andy
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freeradius.org/pipermail/freeradius-users/attachments/20131023/ad088f61/attachment-0001.html>


More information about the Freeradius-Users mailing list