(RADIATOR) PreAuthHook q'n.

Dean McDonald notdean at hotmail.com
Mon Mar 15 00:57:56 CST 2004


Hiya

Just a question regarding PreAuthHook - Sorry if this has gone thru the list 
many times.

I'm just trying to put in a small DB query as a PreAuthHook, to check 
whether Calling-Station-Id exists in a table before doing the AuthSelect 
(and rejecting if it does exist).

What I'm finding is; after the PreAuthHook is executed, the auth still moves 
on to the next (?) Auth method regardless of what the PreAuthHook returns 
(ie even if an Access-Reject comes back, it still moves on to Auth SQL, and 
the user gets auth'd.

I notice in RadPing the an Access-Reject does come back, and all seems good, 
but when I actually dial it does get connected in the end (shown in the 
logs).

'm sure I've just stuffed up the Handler / AuthBy order.. but I can't seem 
to nail it :(

Note - I'm intending on having Handlers for each access type (dial, DSL, 
etc)

# Global variables
Foreground
DbDir           /opt/Radiator/current
LogDir          /var/log/radius
LogFile         %L/%h-%Y-%m.log
PidFile         %L/radiusd.pid

DictionaryFile %D/dictionary

Trace           4

AuthPort        1645
AcctPort        1646

<Client DEFAULT>
        Secret  foo
        DupInterval 0
</Client>

#
# Auth Methods
#
<AuthBy FILE>
        Identifier reject
        Filename %D/etc/reject.cfg
</AuthBy>

# DIAL
<Handler NAS-Port-Type=Async>
        RewriteUsername s/^([^@]+).*/$1/
        PreAuthHook file:"%D/hooks/cliCheck.pl"
        <AuthBy SQL>
                include %D/etc/mysql_Dial.cfg
        </AuthBy>
</Handler>

<Handler NAS-Port-Type=Virtual>
        RewriteUsername s/^([^@]+).*/$1/
        <AuthBy SQL>
                include %D/etc/mysql_DSL.cfg
        </AuthBy>
</Handler>


*** Received from x.x.x.x port 2101 ....
Code:       Access-Request
Identifier: 64
Authentic:        1079332822
Attributes:
        User-Name = "foo at foo.net"
        CHAP-Password = 
<211>=<15><168>H<194><221>pZ<7><3><213>f;<197><10><217>
        NAS-Port-Type = Async
        Calling-Station-Id = "123456789"

Mon Mar 15 17:40:10 2004: DEBUG: Handling request with Handler 
'NAS-Port-Type=Async'
Mon Mar 15 17:40:10 2004: DEBUG: Rewrote user name to foo
Mon Mar 15 17:40:10 2004: DEBUG:  Deleting session for foo at foo.net, x.x.x.x,
Mon Mar 15 17:40:10 2004: DEBUG: PreAuth cliCheck(): checking foo / 
123456789
Mon Mar 15 17:40:10 2004: DEBUG: PreAuth cliCheck(): block exists for 
123456789 or foo
Mar 15 17:40:10 2004: DEBUG: Packet dump:
*** Sending to x.x.x.x port 2101 ....
Code:       Access-Reject
Identifier: 64
Authentic:        1079332822
Attributes:
        Reply-Message = "rejected for some reason"

** Request should just stop here, not continue on to AuthSQL **  (?)

Mon Mar 15 17:40:10 2004: DEBUG: Handling with Radius::AuthSQL
Mon Mar 15 17:40:10 2004: DEBUG: Handling with Radius::AuthSQL: mysql_Dial
Mon Mar 15 17:40:10 2004: DEBUG: Query is: 'SELECT PASSWORD, CHECKATTR, 
REPLYATTR from SUBSCRIBERS where USERNAME = 'foo' and TIMELEFT > 0':

Mon Mar 15 17:40:10 2004: DEBUG: Radius::AuthSQL looks for match with foo
Mon Mar 15 17:40:10 2004: DEBUG: Radius::AuthSQL ACCEPT:
Mon Mar 15 17:40:10 2004: DEBUG: Access accepted for foo
Mon Mar 15 17:40:10 2004: DEBUG: Packet dump:
*** Sending to x.x.x.x port 2101 ....
Code:       Access-Accept
Identifier: 64
Authentic:        1079332822
Attributes:
        Reply-Message = "rejected for some reason"
        Service-Type = Framed-User
        Framed-Protocol = PPP
        Framed-IP-Netmask = 255.255.255.255

Here is the cliCheck code (sorry, its a big ugly..) - the db query itself 
seems to work fine though.

# -*- mode: Perl -*-
#
sub
{
        my $p = ${$_[0]};
        my $rp = ${$_[1]};

        my $cli = $p->get_attr('Calling-Station-Id');
        my $uname = $p->get_attr('User-Name');

        return if ($p->code ne 'Access-Request');

        &main::log($main::LOG_DEBUG,qq[PreAuth cliCheck(): checking $uname / 
$cli]);

        my $dbh = DBI->connect( 
qq[DBI:mysql:radius:localhost],'dbluser','dbpass' )
                        or die &main::log($main::LOG_DEBUG,qq[PreAuth 
cliCheck(): $DBI::errstr\n]);

        my $sql = qq[select USERNAME,CALLERID,COMMENTS from
                        RADBLOCKS where CALLERID = \'$cli\' or 
USERNAME=\'$uname'];

        my $sth = $dbh->prepare($sql); $sth->execute;

        while (my @r = $sth->fetchrow_array) {
                if (@r) {
                        my ($u, $r, $c) = @r;
                        &main::log($main::LOG_DEBUG,qq[PreAuth cliCheck(): 
block exists for $cli or $uname]);
                        $rp->set_code('Access-Reject');               <--- 
unsure about below here
                        $rp->change_attr('Reply-Message', $c);a
                        $p->{Client}->replyTo($p);
                }
        }
        $dbh->disconnect;
        return;


Any help is appreciated,

Deano.

_________________________________________________________________
Find love today with ninemsn personals. Click here:  
http://ninemsn.match.com

--
Archive at http://www.open.com.au/archives/radiator/
Announcements on radiator-announce at open.com.au
To unsubscribe, email 'majordomo at open.com.au' with
'unsubscribe radiator' in the body of the message.


More information about the radiator mailing list