<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40"><head><meta http-equiv=Content-Type content="text/html; charset=us-ascii"><meta name=Generator content="Microsoft Word 14 (filtered medium)"><title>Regex question</title><style><!--
/* Font Definitions */
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Tahoma;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman","serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
p
        {mso-style-priority:99;
        mso-margin-top-alt:auto;
        margin-right:0cm;
        mso-margin-bottom-alt:auto;
        margin-left:0cm;
        font-size:12.0pt;
        font-family:"Times New Roman","serif";}
span.EmailStyle18
        {mso-style-type:personal-reply;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:72.0pt 72.0pt 72.0pt 72.0pt;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]--></head><body lang=EN-GB link=blue vlink=purple><div class=WordSection1><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Hi, thanks for the reply.<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>My original regex was <o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>/^email:([a-z0-9_-]+(\\.[a-z0-9_-]+)<a href="mailto:*@[a-z0-9_-]+(\\.%5ba-z0-9_-%5d+)*(\\.%5ba-z%5d%7b2,4%7d))/">*@[a-z0-9_-]+(\\.[a-z0-9_-]+)*(\\.[a-z]{2,4}))/</a><o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>You’re correct with the escaping thing, I was just quickly trying a shorter simpler version. I didn’t know you needed to escape characters inside a match [] though.<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Anyway, online testers are working fine, just FR or the internal regex library that isn’t. I tried compiling with and without libpcre3-dev and no change.<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Thanks<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Andy<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p> </o:p></span></p><div><div style='border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0cm 0cm 0cm'><p class=MsoNormal><b><span lang=EN-US style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'>From:</span></b><span lang=EN-US style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'> freeradius-users-bounces+andy.franks=sath.nhs.uk@lists.freeradius.org [mailto:freeradius-users-bounces+andy.franks=sath.nhs.uk@lists.freeradius.org] <b>On Behalf Of </b>JDL<br><b>Sent:</b> 23 October 2013 21:54<br><b>To:</b> FreeRadius users mailing list<br><b>Subject:</b> Re: Regex question<o:p></o:p></span></p></div></div><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Not speaking to any FreeRADIUS issues but just to the regular expression, you typically need to escape the period, dash, and other special characters within the pattern if you are looking to match them.  For example<o:p></o:p></p><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>^email:([a-z0-9\._\-]<a href="mailto:+@[a-z0-9\.\-%5d+\.%5ba-z%5d%7b2,4%7d">+@[a-z0-9\.\-]+\.[a-z]{2,4}</a>)<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>There are a number of regex test tools on the web as well as tools you can download and install.  I would suggest that you start with those and make sure the pattern is working first and then try to implement it in FreeRADIUS.<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>Jim Lohiser<o:p></o:p></p></div><div><p class=MsoNormal>Imagine Net, inc.<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p><div><p class=MsoNormal><o:p> </o:p></p><div><div><p class=MsoNormal>On Oct 23, 2013, at 4:36 PM, Franks Andy (RLZ) IT Systems Engineer <<a href="mailto:Andy.Franks@sath.nhs.uk">Andy.Franks@sath.nhs.uk</a>> wrote:<o:p></o:p></p></div><p class=MsoNormal><br><br><o:p></o:p></p><div><p><span style='font-family:"Calibri","sans-serif"'>Hi All,</span><o:p></o:p></p><p><span style='font-family:"Calibri","sans-serif"'>  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.</span><o:p></o:p></p><p><span style='font-family:"Calibri","sans-serif"'>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.</span><o:p></o:p></p><p><span style='font-family:"Calibri","sans-serif"'>This is a via the user-password string in the format</span> <span style='font-family:"Calibri","sans-serif"'>field:<string> field2:<string></span> <span style='font-family:"Calibri","sans-serif"'> - fields, with the string following a colon, separated by spaces.</span><o:p></o:p></p><p><span style='font-family:"Calibri","sans-serif"'>e.g.</span> <o:p></o:p></p><p><span style='font-family:"Calibri","sans-serif"'>email:my.email@<a href="http://address.com">address.com</a> browseragent:safari version:7 os:ios5</span><o:p></o:p></p><p><span style='font-family:"Calibri","sans-serif"'>The string is passed through a few regexes, each picking off the field string in a</span> <span style='font-family:"Calibri","sans-serif"'>capture</span> <span style='font-family:"Calibri","sans-serif"'>group. It’s failing on the first, the email regex being pretty simple:</span><o:p></o:p></p><div><p class=MsoNormal><o:p> </o:p></p></div><p><span style='font-family:"Calibri","sans-serif"'>^email:([a-z0-9._-]</span><a href="mailto:+@[a-z0-9.-]+/.%5ba-z%5d%7b2,4%7d"><span style='font-family:"Calibri","sans-serif"'>+@[a-z0-9.-]+\.[a-z]{2,4}</span></a><span style='font-family:"Calibri","sans-serif"'>)</span><o:p></o:p></p><p><span style='font-family:"Calibri","sans-serif"'>I’ve tried various delimiters</span> <span style='font-family:"Calibri","sans-serif"'> but all result in the same issue:</span><o:p></o:p></p><p><span style='font-family:"Calibri","sans-serif"'>email:my.email@<a href="http://address.com">address.com</a>,browseragent:safari,version:7,os:ios5</span><o:p></o:p></p><p><span style='font-family:"Calibri","sans-serif"'>email:my.email@<a href="http://address.com">address.com</a>#browseragent:safari#version:7#os:ios5</span><o:p></o:p></p><div><p class=MsoNormal><o:p> </o:p></p></div><p><span style='font-family:"Calibri","sans-serif"'>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..</span><o:p></o:p></p><div><p class=MsoNormal><o:p> </o:p></p></div><p><span style='font-family:"Calibri","sans-serif"'>Code : (in policy.d folder)</span><o:p></o:p></p><div><p class=MsoNormal><o:p> </o:p></p></div><p><span style='font-family:"Calibri","sans-serif"'>email_regexp= "^email:([a-z0-9._-]<a href="mailto:+@[a-z0-9.-]+\\.%5ba-z%5d%7b2,4%7d">+@[a-z0-9.-]+\\.[a-z]{2,4}</a>)"</span><o:p></o:p></p><p><span style='font-family:"Calibri","sans-serif"'>  if ("%{User-Password}" =~ /${policy.email_regexp}/){</span><o:p></o:p></p><p><span style='font-family:"Calibri","sans-serif"'>    update control {</span><o:p></o:p></p><p><span style='font-family:"Calibri","sans-serif"'>      Email-Address := "%{1}"</span><o:p></o:p></p><p><span style='font-family:"Calibri","sans-serif"'>    }</span><o:p></o:p></p><p><span style='font-family:"Calibri","sans-serif"'>}</span><o:p></o:p></p><div><p class=MsoNormal><o:p> </o:p></p></div><p><span style='font-family:"Calibri","sans-serif"'>Result:</span><o:p></o:p></p><p><span style='font-family:"Calibri","sans-serif"'>    ? if ("%{User-Password}" =~ /^email:([a-z0-9._-]<a href="mailto:+@[a-z0-9.-]+\.%5ba-z%5d%7b2,4%7d)/">+@[a-z0-9.-]+\.[a-z]{2,4})/</a>)</span><o:p></o:p></p><p><span style='font-family:"Calibri","sans-serif"'>(0)     expand: "%{User-Password}" -> 'email:my.email@<a href="http://address.com">address.com</a> browseragent:safari version:7 os:ios5'</span><o:p></o:p></p><p><span style='font-family:"Calibri","sans-serif"'>(0)    ? if ("%{User-Password}" =~ /^email:([a-z0-9._-]<a href="mailto:+@[a-z0-9.-]+\.%5ba-z%5d%7b2,4%7d)/">+@[a-z0-9.-]+\.[a-z]{2,4})/</a>) -> TRUE</span><o:p></o:p></p><p><span style='font-family:"Calibri","sans-serif"'>(0)    if ("%{User-Password}" =~ /^email:([a-z0-9._-]<a href="mailto:+@[a-z0-9.-]+\.%5ba-z%5d%7b2,4%7d)/">+@[a-z0-9.-]+\.[a-z]{2,4})/</a>) {</span><o:p></o:p></p><p><span style='font-family:"Calibri","sans-serif"'>(0)     update control {</span><o:p></o:p></p><p><span style='font-family:"Calibri","sans-serif"'>(0)     expand: "%{1}" -> '<a href="mailto:my.email@address.com">my.email@address.com</a> brow'</span><o:p></o:p></p><p><span style='font-family:"Calibri","sans-serif"'>(0)             Email-Address := "<a href="mailto:my.email@address.com">my.email@address.com</a> brow"</span><o:p></o:p></p><p><span style='font-family:"Calibri","sans-serif"'>(0)     } # update control = noop</span><o:p></o:p></p><p><span style='font-family:"Calibri","sans-serif"'>(0)     [noop] = noop</span><o:p></o:p></p><p><span style='font-family:"Calibri","sans-serif"'>(0)    } # if ("%{User-Password}" =~ /^email:([a-z0-9._-]<a href="mailto:+@[a-z0-9.-]+\.%5ba-z%5d%7b2,4%7d)/">+@[a-z0-9.-]+\.[a-z]{2,4})/</a>) = noop</span><o:p></o:p></p><p><span style='font-family:"Calibri","sans-serif"'>(0)     ... skipping else for request 0: Preceding "if" was taken</span><o:p></o:p></p><p><span style='font-family:"Calibri","sans-serif"'>(0)   } # check_email_address check_email_address = noop</span><o:p></o:p></p><p><span style='font-family:"Calibri","sans-serif"'>(0)   check_browser_agent check_browser_agent {</span><o:p></o:p></p><p><span style='font-family:"Calibri","sans-serif"'>(0)    ? if ("%{User-Password}" =~ /browseragent:([a-z0-9_-]+)/)</span><o:p></o:p></p><p><span style='font-family:"Calibri","sans-serif"'>(0)     expand: "%{User-Password}" -> 'email:my.email@<a href="http://address.com">address.com</a> browseragent:safari version:7 os:ios5'</span><o:p></o:p></p><p><span style='font-family:"Calibri","sans-serif"'>(0)    ? if ("%{User-Password}" =~ /browseragent:([a-z0-9_-]+)/)  -> TRUE</span><o:p></o:p></p><p><span style='font-family:"Calibri","sans-serif"'>(0)    if ("%{User-Password}" =~ /browseragent:([a-z0-9_-]+)/)  {</span><o:p></o:p></p><p><span style='font-family:"Calibri","sans-serif"'>(0)     update control {</span><o:p></o:p></p><p><span style='font-family:"Calibri","sans-serif"'>(0)     expand: "%{1}" -> 'safari'</span><o:p></o:p></p><p><span style='font-family:"Calibri","sans-serif"'>(0)             Browser-Agent := "safari"</span><o:p></o:p></p><p><span style='font-family:"Calibri","sans-serif"'>(0)     } # update control = noop</span><o:p></o:p></p><p><span style='font-family:"Calibri","sans-serif"'>(0)    } # if ("%{User-Password}" =~ /browseragent:([a-z0-9_-]+)/)  = noop</span><o:p></o:p></p><p><span style='font-family:"Calibri","sans-serif"'>(0)   } # check_browser_agent check_browser_agent = noop</span><o:p></o:p></p><p><span style='font-family:"Calibri","sans-serif"'>(0)   check_browser_version check_browser_version {</span><o:p></o:p></p><p><span style='font-family:"Calibri","sans-serif"'>(0)    ? if ("%{User-Password}" =~ /version:([a-z0-9_-]+)/)</span><o:p></o:p></p><p><span style='font-family:"Calibri","sans-serif"'>(0)     expand: "%{User-Password}" -> 'email:my.email@<a href="http://address.com">address.com</a> browseragent:safari version:7 os:ios5'</span><o:p></o:p></p><p><span style='font-family:"Calibri","sans-serif"'>(0)    ? if ("%{User-Password}" =~ /version:([a-z0-9_-]+)/)  -> TRUE</span><o:p></o:p></p><p><span style='font-family:"Calibri","sans-serif"'>(0)    if ("%{User-Password}" =~ /version:([a-z0-9_-]+)/)  {</span><o:p></o:p></p><p><span style='font-family:"Calibri","sans-serif"'>(0)     update control {</span><o:p></o:p></p><p><span style='font-family:"Calibri","sans-serif"'>(0)     expand: "%{1}" -> '7'</span><o:p></o:p></p><p><span style='font-family:"Calibri","sans-serif"'>(0)             Browser-Version := "7"</span><o:p></o:p></p><p><span style='font-family:"Calibri","sans-serif"'>(0)     } # update control = noop</span><o:p></o:p></p><p><span style='font-family:"Calibri","sans-serif"'>(0)    } # if ("%{User-Password}" =~ /version:([a-z0-9_-]+)/)  = noop</span><o:p></o:p></p><p><span style='font-family:"Calibri","sans-serif"'>(0)   } # check_browser_version check_browser_version = noop</span><o:p></o:p></p><p><span style='font-family:"Calibri","sans-serif"'>(0)   check_browser_os check_browser_os {</span><o:p></o:p></p><p><span style='font-family:"Calibri","sans-serif"'>(0)    ? if ("%{User-Password}" =~ /os:([a-z0-9_-]+)$/)</span><o:p></o:p></p><p><span style='font-family:"Calibri","sans-serif"'>(0)     expand: "%{User-Password}" -> 'email:my.email@<a href="http://address.com">address.com</a> browseragent:safari version:7 os:ios5'</span><o:p></o:p></p><p><span style='font-family:"Calibri","sans-serif"'>(0)    ? if ("%{User-Password}" =~ /os:([a-z0-9_-]+)$/)  -> TRUE</span><o:p></o:p></p><p><span style='font-family:"Calibri","sans-serif"'>(0)    if ("%{User-Password}" =~ /os:([a-z0-9_-]+)$/)  {</span><o:p></o:p></p><p><span style='font-family:"Calibri","sans-serif"'>(0)     update control {</span><o:p></o:p></p><p><span style='font-family:"Calibri","sans-serif"'>(0)     expand: "%{1}" -> 'ios5'</span><o:p></o:p></p><p><span style='font-family:"Calibri","sans-serif"'>(0)             Browser-OS := "ios5"</span><o:p></o:p></p><div><p class=MsoNormal><o:p> </o:p></p></div><p><span style='font-family:"Calibri","sans-serif"'>I also tried a different regex, but the problems seem worse there..</span><o:p></o:p></p><p><span style='font-family:"Calibri","sans-serif"'>    ? if ("%{User-Password}" =~ /^email:([a-z0-9_-]+(\.[a-z0-9_-]+)<a href="mailto:*@[a-z0-9_-]+(\.%5ba-z0-9_-%5d+)*(\.%5ba-z%5d%7b2,4%7d))/)">*@[a-z0-9_-]+(\.[a-z0-9_-]+)*(\.[a-z]{2,4}))/)</a></span><o:p></o:p></p><p><span style='font-family:"Calibri","sans-serif"'>(1)     expand: "%{User-Password}" -> 'email:my.email@<a href="http://address.com">address.com</a> browseragent:safari version:7 os:ios5'</span><o:p></o:p></p><p><span style='font-family:"Calibri","sans-serif"'>(1)    ? if ("%{User-Password}" =~ /^email:([a-z0-9_-]+(\.[a-z0-9_-]+)<a href="mailto:*@[a-z0-9_-]+(\.%5ba-z0-9_-%5d+)*(\.%5ba-z%5d%7b2,4%7d))/)">*@[a-z0-9_-]+(\.[a-z0-9_-]+)*(\.[a-z]{2,4}))/)</a> -> TRUE</span><o:p></o:p></p><p><span style='font-family:"Calibri","sans-serif"'>(1)    if ("%{User-Password}" =~ /^email:([a-z0-9_-]+(\.[a-z0-9_-]+)<a href="mailto:*@[a-z0-9_-]+(\.%5ba-z0-9_-%5d+)*(\.%5ba-z%5d%7b2,4%7d))/)">*@[a-z0-9_-]+(\.[a-z0-9_-]+)*(\.[a-z]{2,4}))/)</a> {</span><o:p></o:p></p><p><span style='font-family:"Calibri","sans-serif"'>(1)     update control {</span><o:p></o:p></p><p><span style='font-family:"Calibri","sans-serif"'>(1)     expand: "%{1}" -> '<a href="mailto:my.email@address.com">my.email@address.com</a> browseragent:safari version:7 os:ios'</span><o:p></o:p></p><p><span style='font-family:"Calibri","sans-serif"'>(1)             Email-Address := "<a href="mailto:my.email@address.com">my.email@address.com</a> browseragent:safari version:7 os:ios"</span><o:p></o:p></p><p><span style='font-family:"Calibri","sans-serif"'>(1)     } # update control = noop</span><o:p></o:p></p><p><span style='font-family:"Calibri","sans-serif"'>Any ideas what I’m doing wrong?</span><o:p></o:p></p><p><span style='font-family:"Calibri","sans-serif"'>Thanks</span><o:p></o:p></p><p><span style='font-family:"Calibri","sans-serif"'>andy</span><o:p></o:p></p></div><p class=MsoNormal>-<br>List info/subscribe/unsubscribe? See <a href="http://www.freeradius.org/list/users.html">http://www.freeradius.org/list/users.html</a><o:p></o:p></p></div><p class=MsoNormal><o:p> </o:p></p></div></div></div></body></html>