All pastes #898460 Raw Edit

Untitled

public text v1 · immutable
·published 2008-02-10 10:44 UTC
rendered paste body
use strict;

use CDB_File;

use vars qw(%RAD_REQUEST %RAD_REPLY %RAD_CHECK);

# for standaline testing
#my %RAD_REQUEST;
#my %RAD_REPLY;
#my %RAD_CHECK;

# This the remapping of return values

use constant    RLM_MODULE_REJECT=>    0;#  /* immediately reject the request */
use constant    RLM_MODULE_FAIL=>      1;#  /* module failed, don't reply */
use constant    RLM_MODULE_OK=>        2;#  /* the module is OK, continue */
use constant    RLM_MODULE_HANDLED=>   3;#  /* the module handled the request, so stop. */
use constant    RLM_MODULE_INVALID=>   4;#  /* the module considers the request invalid. */
use constant    RLM_MODULE_USERLOCK=>  5;#  /* reject the request (user is locked out) */
use constant    RLM_MODULE_NOTFOUND=>  6;#  /* user not found */
use constant    RLM_MODULE_NOOP=>      7;#  /* module succeeded without doing anything */
use constant    RLM_MODULE_UPDATED=>   8;#  /* OK (pairs modified) */
use constant    RLM_MODULE_NUMCODES=>  9;#  /* How many return codes there are */

sub authorize {
        return RLM_MODULE_OK
}

sub authenticate {
        my %isplookup;
        my $isp;
        my $tie;
        my $username;
        my %ispconfig;
        my @ispconfarray;


        &log_request_attributes;
        ##$RAD_REQUEST{'User-Name'} = "nasport:192.168.1.41:2/0/0/400";
        if ($RAD_REQUEST{'User-Name'}=~ /^nasport:/) {
                $tie = tie %isplookup, 'CDB_File', 'ispuser.cdb' or return RLM_MODULE_FAIL;
                $username = $RAD_REQUEST{'User-Name'};
                $username =~ s/^nasport://;
                ##print "Username:$username\n";

                $isp = $isplookup{$username};
                ##print "ISP:$isp\n";
                if($isp) {
                        # Lookup ISP config and return reply AVPs
                        $tie = tie %ispconfig, 'CDB_File', 'ispconfig.cdb' or return RLM_MODULE_FAIL;
                        @ispconfarray = split(/\t/,$ispconfig{$isp}); # fields are tab delimited
                        my $lns_ipaddr = $ispconfarray[0];
                        my $lns_passwd = $ispconfarray[1];
                        my $vrf = $ispconfarray[2];

                        ##print "IPADDR:$lns_ipaddr, PASSWD:$lns_passwd, VRF:$vrf\n";

                        $RAD_REPLY{'Cisco-AVpair'} = "vpdn:tunnel-type=l2tp\n";
                        $RAD_REPLY{'Cisco-AVpair'} .= "vpdn:vpn-vrf=$vrf\n";
                        $RAD_REPLY{'Cisco-AVpair'} .= "vpdn:ip-addresses=$lns_ipaddr";
                        $RAD_REPLY{'Cisco-AVpair'} .= "vpdn:l2tp-tunnel-password=$lns_passwd";


                        return RLM_MODULE_OK;

                } else {
                        # No ISP found
                        return RLM_MODULE_INVALID;
                }

                undef $tie;
                untie %isplookup;
        } else {
                return RLM_MODULE_INVALID;
        }

        undef $tie;
        untie %isplookup;
}


sub log_request_attributes {
        # This shouldn't be done in production environments!
        # This is only meant for debugging!
        for (keys %RAD_REQUEST) {
                &radiusd::radlog(1, "RAD_REQUEST: $_ = $RAD_REQUEST{$_}");
        }
}

# standalone
#authenticate();