(RADIATOR) Session-Timeout getting set too late
Jeff Cave
jeff.cave at sunergon.com
Mon Jan 20 11:26:55 CST 2003
Two questions:
1. I have had Radiator thrown at me. I have no knowledge of the system and feel like I am in way over my head. Can anyone recommend good reading, courses or other ways to get educated?
2. The problem I have had thrown at me...
I have been asked to set a session timeout based on the amount of time left in a users account. I can hard code a timeout in the realm but I need to set it on a user-to-user basis. The system's code has been heavily modified and a lot of what is in the Radiator manual no longer seems to apply.
The Realm handler is a modified AuthSQL file.
In the file AuthCOMPNAME, I have added a couple of lines that add a session timeout to the response packet, but it seems that it does not calculate how much time the user has (SQL Procedure: isp_requestauth) until after the ACCESS-ACCEPT packet is sent to the NAS. When I check the log, it appears that isp_requestauth is being run before the ACCESS-ACCEPT packet is sent, this makes sense since isp_requestauth is also where the user's password and filename are verified and Radiator is catching invalid logins (infact it knows it was an invalid login because they had 0 minutes returned).
SEQUENCE OF EVENTS:
1. ACCESS-ACCEPT Sent with SESSION-TIMEOUT=0
2. AuthCOMPNAME calculates session-timeout to be ?????
3. Accounting-Response Sent with SESSION-TIMEOUT = ?????
The problem with this is that with the initial timeout of 0, it seems that the timeout is not taking when it is sent in the accounting-response.
WANTED SEQUENCE OF EVENTS:
1. AuthCOMPNAME calculates session-timeout to be ?????
2. ACCESS-ACCEPT Sent with SESSION-TIMEOUT = ?????
Does anyone have any suggestions on where/how I should be setting the session-timeout to ensure that the user has their appropriate timeout?
THE CONFIG FILE:
<Realm DEFAULT>
AcctLogFileName %L/account.log
<AuthBy COMPNAME>
NoDefault
DBSource dbi:ODBC:ilink
DBUsername xxxxxxx
DBAuth xxxxxxx
FailureBackoffTime 30
Timeout 10
# Authentication
AuthBlock \
isp_requestauth '%U','%P','%{NAS-IP-Address}/%{NAS-Port}','%{Calling_Station_ID}'
# Accounting
AccountingStopsOnly
AcctSQLStatement \
isp_accounting '%U', \
'%g-%i-%f %j:%k:%p', \
%{Acct-Session-Time}, \
'%{Acct-Session-Id}', \
'%{Acct-Terminate-Cause}', \
'%N', \
'%{NAS-Port}', \
'%{Framed-IP-Address}', \
%{Acct-Input-Octets}, \
%{Acct-Output-Octets}
</Authby>
</Realm>
Signifigant Bits from AuthCOMPNAME:
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
#This is the only place that I can find that the response packet is built
#I have only added the one line and set it to a global variable $SessTime
#I know gobal is probably not the best for this but I'm panicking.
sub handle_request
{
my ($self, $p, $rp, $extra_checks) = @_;
my $type = ref($self);
$self->log($main::LOG_DEBUG, "Handling with $type (special)");
if ($p->decodedPassword() =~ /'/)
{
$self->log($main::LOG_DEBUG, "$type rejected because invalid char in password");
return ($main::REJECT, 'Invalid Char in password');
} else {
$self->log($main::LOG_DEBUG, "$type accepted char in password");
}
#
# This is where the timeout gets stuffed into the response packet
#
$rp->addAttrByNum($Radius::Radius::SESSION_TIMEOUT,$SessTime);
#
#
#
return $self->SUPER::handle_request($p, $rp, $extra_checks);
}
#####################################################################
# Find a the named user by looking in the database, and constructing
# User object if we found the named user
# $name is the user name we want
# $p is the current request we are handling
sub findUser
{
my ($self, $name, $p) = @_;
.
.
.
my $q = &Radius::Util::format_special($self->{AuthBlock}, $p);
#
# I set the global $SessTime in here
#
my $sth = $self->prepareAndExecute($q);
#
#
#
.
.
.
return ($User)
}
#####################################################################
# Convenience function to prepare and execute a query.
# If it fails to execute, complain, and try to reconnect and reexecute.
# If it still fails to execute, return undef, else a statement handle
sub prepareAndExecute
{
my ($self, $q) = @_;
my ($attempts, $sth, $rc);
$sth = $Radius::SqlDb::handles{$self->{dbname}}->prepare($q);
$rc = $sth->execute if $sth;
my $row = $sth->fetchrow_arrayref;
&main::log($main::LOG_DEBUG, "2 rc = @$row[0], balance = @$row[1]\n");
#
# Here is where I set SessTime
#
$SessTime = @$row[1] * 60;
#
#
#
return $sth;
}
===
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