From ef746b6c35129710264cdb3b6990e3ff1a43e7b2 Mon Sep 17 00:00:00 2001 From: Nigel Kukard <nkukard@lbsd.net> Date: Sun, 8 Mar 2009 13:29:59 +0000 Subject: [PATCH] * More work on the userdb sql module --- smradius/modules/userdb/mod_userdb_sql.pm | 101 ++++++++++++++++++---- 1 file changed, 86 insertions(+), 15 deletions(-) diff --git a/smradius/modules/userdb/mod_userdb_sql.pm b/smradius/modules/userdb/mod_userdb_sql.pm index 90a66ef8..fc4dfba0 100644 --- a/smradius/modules/userdb/mod_userdb_sql.pm +++ b/smradius/modules/userdb/mod_userdb_sql.pm @@ -26,6 +26,7 @@ use smradius::constants; use smradius::logging; use smradius::dblayer; use smradius::util; +use smradius::attributes; # Exporter stuff require Exporter; @@ -65,8 +66,8 @@ sub init $server->{'smradius'}->{'database'}->{'enabled'} = 1; } - #Default configs... - $config->{'userdb_select_query'} = ' + # Default configs... + $config->{'userdb_find_query'} = ' SELECT ID FROM @@ -75,13 +76,32 @@ sub init UserName = %{authentication.User-Name} '; + $config->{'userdb_get_group_attributes_query'} = ' + SELECT + group_attributes.Name, group_attributes.Operator, group_attributes.Value + FROM + @TP@group_attributes, @TP@users_to_groups + WHERE + users_to_groups.UserID = %{user.ID} + AND group_attributes.GroupID = users_to_groups.GroupID + '; + + $config->{'userdb_get_user_attributes_query'} = ' + SELECT + Name, Operator, Value + FROM + @TP@users_attributes + WHERE + UserID = %{user.ID} + '; + # Setup SQL queries if (defined($scfg->{'mod_userdb_sql'})) { # Pull in queries - if (defined($scfg->{'mod_userdb_sql'}->{'userdb_select_query'}) && - $scfg->{'mod_userdb_sql'}->{'userdb_select_query'} ne "") { - $config->{'userdb_select_query'} = $scfg->{'mod_userdb_sql'}->{'userdb_select_query'}; + if (defined($scfg->{'mod_userdb_sql'}->{'userdb_find_query'}) && + $scfg->{'mod_userdb_sql'}->{'userdb_find_query'} ne "") { + $config->{'userdb_find_query'} = $scfg->{'mod_userdb_sql'}->{'userdb_find_query'}; } } @@ -101,26 +121,36 @@ sub find # Build template my $template; - $server->log(LOG_DEBUG,"[MOD_USERDB_SQL] Find function called"); foreach my $attr ($packet->attributes) { $template->{'authentication'}->{$attr} = $packet->rawattr($attr) } $template->{'user'} = $user; # Replace template entries - my @dbDoParams = templateReplace($config->{'userdb_select_query'},$template); + my @dbDoParams = templateReplace($config->{'userdb_find_query'},$template); my $sth = DBSelect(@dbDoParams); if (!$sth) { - $server->log(LOG_ERR,"Failed to find user data: ".smradius::dblayer::Error()); - return -1; + $server->log(LOG_ERR,"[MOD_USERDB_SQL] Failed to find user data: ".smradius::dblayer::Error()); + return MOD_RES_SKIP; + } + + # Check if we got a result, if we did not NACK + my $rows = $sth->rows(); + if ($rows > 1) { + $server->log(LOG_ERR,"[MOD_USERDB_SQL] More than one result returned for user '".$user->{'Username'}."'"); + return MOD_RES_SKIP; + } elsif ($rows < 1) { + $server->log(LOG_DEBUG,"[MOD_USERDB_SQL] User '".$user->{'Username'}."' not found in database"); + return MOD_RES_SKIP; } - $server->log(LOG_NOTICE,"Number of rows : ".$sth->rows()); + # Grab record data + my $row = $sth->fetchrow_hashref(); - # TODO: Query database and see if this user exists + DBFreeRes($sth); - return MOD_RES_SKIP; + return (MOD_RES_ACK,$row); } @@ -136,10 +166,51 @@ sub get { my ($server,$user,$packet) = @_; - my $userDetails; - # TODO: Query user and get attributes, return in $userDetails hash + # Build template + my $template; + foreach my $attr ($packet->attributes) { + $template->{'authentication'}->{$attr} = $packet->rawattr($attr) + } + $template->{'user'}->{'Username'} = $user->{'Username'}; + $template->{'user'}->{'ID'} = $user->{'_UserDB_Data'}->{'id'}; + + + # Replace template entries + my @dbDoParams = templateReplace($config->{'userdb_get_group_attributes_query'},$template); + # Query database + my $sth = DBSelect(@dbDoParams); + if (!$sth) { + $server->log(LOG_ERR,"Failed to get group attributes: ".smradius::dblayer::Error()); + return -1; + } + + # Loop with group attributes + while (my $row = $sth->fetchrow_hashref()) { + addAttribute($server,$user->{'Attributes'},$row); + } + + $sth->DBFreeRes(); + + + + # Replace template entries again + @dbDoParams = templateReplace($config->{'userdb_get_user_attributes_query'},$template); + # Query database + $sth = DBSelect(@dbDoParams); + if (!$sth) { + $server->log(LOG_ERR,"Failed to get user attributes: ".smradius::dblayer::Error()); + return -1; + } + + # Loop with group attributes + while (my $row = $sth->fetchrow_hashref()) { + addAttribute($server,$user->{'Attributes'},$row); + } + + $sth->DBFreeRes(); + - return $userDetails; +# return $userDetails; } -- GitLab