Re: problems getting rewrite hook right

Charles Sprickman <[email protected]> Wed, 1 Nov 2006 18:25:15 -0500 (EST)
Newsgroups gmane.comp.gnu.radius.general
Message-ID <[email protected]>
On Tue, 31 Oct 2006, Sergey Poznyakoff wrote:

> Charles Sprickman <[email protected]> wrote:
>
>> We also have domain accounts where the user's actual username is
>> "[email protected]".  We instruct those users to use
>> "username%[email protected]" when dialing in.
>
> As a side note: they could have safely used another '@', as the proxying
> protocol allows for stacking the user domains
> (e.g. [email protected]@bway.net).
>
>> The "@bway.net" is stripped by our dial provider and we see the user as
>> "username%domain.com".
>
> From what I see in your previous posting, they seem to fail to do so:
>
>>> Oct 25 15:53:10 elephant radiusd: Auth.debug:
>>> mysql.c:216:rad_mysql_exec: query:
>>> SELECT attr,value FROM radius_attrib WHERE username='[email protected]' AND
>>> op IS NULL AND domain='[email protected]'
>>>
>>> The test user logs in using "test%[email protected]"...  I'm so lost
>>> with this since I haven't touched it for years (literally).
>
> So, your server received the name as "test%[email protected]" anyway.
>
>> Does that pretty much make sense?  It's kind of a strange setup...
>
> If I get it right, the domain_split function should return the part
> between '%' and '@', if there is a percent sign, the part after '@',
> if there's none, and "bway.net" otherwise. Does that make sense? If
> so, the following function will do it:

And that seems to be very close to doing what I want... :)

> string
> domain_split(string name)
> {
>         integer a;
> 	 string localpart;
>         string domainpart;
>
> 	 domainpart = "bway.net"; /* provide the default value */
>         if (name =~ "\(.*\)@\(.*\)") {
> 		localpart = \1;
> 	        domainpart = \2;
> 	 } else {
> 	        localpart = name;
> 	 }
>
>         if (localpart =~ "\(.*\)%\(.*\)")
> 	        domainpart = \2;
>
>         return domainpart;
> }

This gets me what I want in the domain part of the query, but the username 
still comes up as "foo%foo.com".

I thought the following might fix it up.

I made another rewrite rule named "login_pct" that will return everything 
to the left of the "%" in a username:

string
login_pct(string name)
{
     integer i;

     if ((i = index(name, '\%')) != -1)
         return substr(name, 0, i);
     return name;
}

But I'm not sure how to get it going.  I tried the following in the hints 
file:

DEFAULT NULL    User-Name = "=login_pct(%[User-Name])"
DEFAULT NULL    Auth-Dom = "=domain_split(%[User-Name])"

But that seems to screw everything up...

Nov  1 18:23:20 elephant radiusd: Auth.debug: mysql.c:57:do_mysql_query: 
called with SELECT attr,value FROM radius_attrib WHERE
username='test%maniform.com' AND op IS NULL AND domain=''

BTW, that test shell is pretty neat, I had no idea that even existed!

Thanks,

Charles

> Here's its output in the test run:
>
> ** TEST SHELL **
> (radiusd) source /home/gray/1.rw
> 0
> (radiusd) r domain_split("username%domain.com")
> domain.com
> (radiusd) r domain_split("[email protected]")
> domain.com
> (radiusd) r domain_split("username%[email protected]")
> domain.com
> (radiusd) r domain_split("username")
> bway.net
> (radiusd)
>
>> I'd like to get it setup with FreeBSD 4.11 and 6.2, would that be helpful?
>
> Sure, that would be great.
>
>
> Regards,
> Sergey
>
>