From a068ee28e2733ac9f0799fb3d54c09dee872c458 Mon Sep 17 00:00:00 2001
From: Nigel Kukard <nkukard@lbsd.net>
Date: Sat, 2 May 2009 14:51:00 +0000
Subject: [PATCH] * Fixed up configuration variables handling in modules *
 Fixed up configuration module and cleaned up code

---
 .../modules/accounting/mod_accounting_sql.pm  | 28 +++++++++++++---
 smradius/modules/config/mod_config_sql.pm     | 15 +++++----
 smradius/modules/userdb/mod_userdb_sql.pm     | 27 ++++++++++++---
 smradiusd                                     | 33 +++++++++++--------
 4 files changed, 73 insertions(+), 30 deletions(-)

diff --git a/smradius/modules/accounting/mod_accounting_sql.pm b/smradius/modules/accounting/mod_accounting_sql.pm
index a3676282..fb9d4735 100644
--- a/smradius/modules/accounting/mod_accounting_sql.pm
+++ b/smradius/modules/accounting/mod_accounting_sql.pm
@@ -166,19 +166,39 @@ sub init
 		# Pull in queries
 		if (defined($scfg->{'mod_accounting_sql'}->{'accounting_start_query'}) &&
 				$scfg->{'mod_accounting_sql'}->{'accounting_start_query'} ne "") {
-			$config->{'accounting_start_query'} = $scfg->{'mod_accounting_sql'}->{'accounting_start_query'};
+			if (ref($scfg->{'mod_accounting_sql'}->{'accounting_start_query'}) eq "ARRAY") {
+				$config->{'accounting_start_query'} = join(' ',
+						@{$scfg->{'mod_accounting_sql'}->{'accounting_start_query'}});
+			} else {
+				$config->{'accounting_start_query'} = $scfg->{'mod_accounting_sql'}->{'accounting_start_query'};
+			}
 		}
 		if (defined($scfg->{'mod_accounting_sql'}->{'accounting_update_query'}) &&
 				$scfg->{'mod_accounting_sql'}->{'accounting_update_query'} ne "") {
-			$config->{'accounting_update_query'} = $scfg->{'mod_accounting_sql'}->{'accounting_update_query'};
+			if (ref($scfg->{'mod_accounting_sql'}->{'accounting_update_query'}) eq "ARRAY") {
+				$config->{'accounting_update_query'} = join(' ',
+						@{$scfg->{'mod_accounting_sql'}->{'accounting_update_query'}});
+			} else {
+				$config->{'accounting_update_query'} = $scfg->{'mod_accounting_sql'}->{'accounting_update_query'};
+			}
 		}
 		if (defined($scfg->{'mod_accounting_sql'}->{'accounting_stop_query'}) &&
 				$scfg->{'mod_accounting_sql'}->{'accounting_stop_query'} ne "") {
-			$config->{'accounting_stop_query'} = $scfg->{'mod_accounting_sql'}->{'accounting_stop_query'};
+			if (ref($scfg->{'mod_accounting_sql'}->{'accounting_stop_query'}) eq "ARRAY") {
+				$config->{'accounting_stop_query'} = join(' ',
+						@{$scfg->{'mod_accounting_sql'}->{'accounting_stop_query'}});
+			} else {
+				$config->{'accounting_stop_query'} = $scfg->{'mod_accounting_sql'}->{'accounting_stop_query'};
+			}
 		}
 		if (defined($scfg->{'mod_accounting_sql'}->{'get_usage_query'}) &&
 				$scfg->{'mod_accounting_sql'}->{'get_usage_query'} ne "") {
-			$config->{'get_usage_query'} = $scfg->{'mod_accounting_sql'}->{'get_usage_query'};
+			if (ref($scfg->{'mod_accounting_sql'}->{'get_usage_query'}) eq "ARRAY") {
+				$config->{'get_usage_query'} = join(' ',
+						@{$scfg->{'mod_accounting_sql'}->{'get_usage_query'}});
+			} else {
+				$config->{'get_usage_query'} = $scfg->{'mod_accounting_sql'}->{'get_usage_query'};
+			}
 		}
 	}
 }
diff --git a/smradius/modules/config/mod_config_sql.pm b/smradius/modules/config/mod_config_sql.pm
index 1ca90b29..52350e20 100644
--- a/smradius/modules/config/mod_config_sql.pm
+++ b/smradius/modules/config/mod_config_sql.pm
@@ -78,7 +78,11 @@ sub init
 		# Pull in queries
 		if (defined($scfg->{'mod_config_sql'}->{'get_config_query'}) &&
 				$scfg->{'mod_config_sql'}->{'get_config_query'} ne "") {
-			$config->{'get_config_query'} = $scfg->{'mod_config_sql'}->{'get_config_query'};
+			if (ref($scfg->{'mod_config_sql'}->{'get_config_query'}) eq "ARRAY") {
+				$config->{'get_config_query'} = join(' ',@{$scfg->{'mod_config_sql'}->{'get_config_query'}});
+			} else {
+				$config->{'get_config_query'} = $scfg->{'mod_config_sql'}->{'get_config_query'};
+			}
 			
 		}
 	}
@@ -98,26 +102,23 @@ sub getConfig
 	my ($server,$user,$packet) = @_;
 
 
-	# Attributes to return
-	my %configAttributes = ();
-
 	# Replace template entries
 	my @dbDoParams = $config->{'get_config_query'};
 	# Query database
 	my $sth = DBSelect(@dbDoParams);
 	if (!$sth) {
 		$server->log(LOG_ERR,"Failed to get config attributes: ".smradius::dblayer::Error());
-		return -1;
+		return MOD_RES_NACK;
 	}
 	
 	# Loop with user attributes
 	while (my $row = $sth->fetchrow_hashref()) {
-		addAttribute($server,\%configAttributes,hashifyLCtoMC($row,qw(Name Operator Value)));
+		processConfigAttribute($server,$user->{'ConfigAttributes'},hashifyLCtoMC($row,qw(Name Operator Value)));
 	}
 
 	DBFreeRes($sth);
 
-	return \%configAttributes;
+	return MOD_RES_ACK;
 }
 
 
diff --git a/smradius/modules/userdb/mod_userdb_sql.pm b/smradius/modules/userdb/mod_userdb_sql.pm
index d0774859..985a5cea 100644
--- a/smradius/modules/userdb/mod_userdb_sql.pm
+++ b/smradius/modules/userdb/mod_userdb_sql.pm
@@ -81,7 +81,7 @@ sub init
 		FROM 
 			@TP@group_attributes, @TP@users_to_groups 
 		WHERE 
-			users_to_groups.UserID = %{userdb.ID}
+			users_to_groups.UserID = %{userdb.id}
 			AND group_attributes.GroupID = users_to_groups.GroupID
 	';
 	
@@ -100,17 +100,33 @@ sub init
 		# Pull in queries
 		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'};
+			if (ref($scfg->{'mod_userdb_sql'}->{'userdb_find_query'}) eq "ARRAY") {
+				$config->{'userdb_find_query'} = join(' ', @{$scfg->{'mod_userdb_sql'}->{'userdb_find_query'}});
+			} else {
+				$config->{'userdb_find_query'} = $scfg->{'mod_userdb_sql'}->{'userdb_find_query'};
+			}
 		}
 
 		if (defined($scfg->{'mod_userdb_sql'}->{'userdb_get_group_attributes_query'}) &&
 				$scfg->{'mod_userdb_sql'}->{'userdb_get_group_attributes_query'} ne "") {
-			$config->{'userdb_get_group_attributes_query'} = $scfg->{'mod_userdb_sql'}->{'userdb_get_group_attributes_query'};
+			if (ref($scfg->{'mod_userdb_sql'}->{'userdb_get_group_attributes_query'}) eq "ARRAY") {
+				$config->{'userdb_get_group_attributes_query'} = join(' ', 
+						@{$scfg->{'mod_userdb_sql'}->{'userdb_get_group_attributes_query'}});
+			} else {
+				$config->{'userdb_get_group_attributes_query'} = 
+						$scfg->{'mod_userdb_sql'}->{'userdb_get_group_attributes_query'};
+			}
 		}
 
 		if (defined($scfg->{'mod_userdb_sql'}->{'userdb_get_user_attributes_query'}) &&
 				$scfg->{'mod_userdb_sql'}->{'userdb_get_user_attributes_query'} ne "") {
-			$config->{'userdb_get_user_attributes_query'} = $scfg->{'mod_userdb_sql'}->{'userdb_get_user_attributes_query'};
+			if (ref($scfg->{'mod_userdb_sql'}->{'userdb_get_user_attributes_query'}) eq "ARRAY") {
+				$config->{'userdb_get_user_attributes_query'} = join(' ',
+						@{$scfg->{'mod_userdb_sql'}->{'userdb_get_user_attributes_query'}});
+			} else {
+					$config->{'userdb_get_user_attributes_query'} = 
+						$scfg->{'mod_userdb_sql'}->{'userdb_get_user_attributes_query'};
+			}
 		}
 	}
 }
@@ -180,7 +196,7 @@ sub get
 		$template->{'request'}->{$attr} = $packet->rawattr($attr)
 	}
 	# Add in userdb data
-	foreach my $item ($user->{'_UserDB_Data'}) {
+	foreach my $item (keys %{$user->{'_UserDB_Data'}}) {
 		$template->{'userdb'}->{$item} =  $user->{'_UserDB_Data'}->{$item};
 	}
 
@@ -189,6 +205,7 @@ sub get
 
 	# Replace template entries
 	my @dbDoParams = templateReplace($config->{'userdb_get_group_attributes_query'},$template);
+
 	# Query database
 	my $sth = DBSelect(@dbDoParams);
 	if (!$sth) {
diff --git a/smradiusd b/smradiusd
index b6b913e7..b6a57744 100755
--- a/smradiusd
+++ b/smradiusd
@@ -494,20 +494,24 @@ sub process_request {
 		if ($module->{'Config_get'}) {
 
 			# Get result from config module
-			$self->log(LOG_INFO,"[SMRADIUS] FIND: Trying plugin '".$module->{'Name'}."' for incoming connection");
-			my ($configData) = $module->{'Config_get'}($self,$user,$pkt);
-			# If we got some config back, process it
-			if ($configData) {
-				# Loop with attributes we got from the user
-				foreach my $attrName (keys %{$configData}) {
-					# Loop with operators
-					foreach my $attrOp (keys %{$configData->{$attrName}}) {
-						# Grab attribute
-						my $attr = $configData->{$attrName}->{$attrOp};
-						# Process attribute
-						my $res = processConfigAttribute($self,$user->{'ConfigAttributes'},$attr);
-					}
-				}
+			$self->log(LOG_INFO,"[SMRADIUS] CONFIG: Trying plugin '".$module->{'Name'}."' for incoming connection");
+			my $res = $module->{'Config_get'}($self,$user,$pkt);
+
+			# Check result
+			if (!defined($res)) {
+				$self->log(LOG_DEBUG,"[SMRADIUS] CONFIG: Error with plugin '".$module->{'Name'}."'");
+
+			# Check if we skipping this plugin
+			} elsif ($res == MOD_RES_SKIP) {
+				$self->log(LOG_DEBUG,"[SMRADIUS] CONFIG: Skipping '".$module->{'Name'}."'");
+
+			# Check if we got a positive result back
+			} elsif ($res == MOD_RES_ACK) {
+				$self->log(LOG_NOTICE,"[SMRADIUS] CONFIG: Configuration retrieved from '".$module->{'Name'}."'");
+
+			# Check if we got a negative result back
+			} elsif ($res == MOD_RES_NACK) {
+				$self->log(LOG_NOTICE,"[SMRADIUS] CONFIG: Configuration problem when using '".$module->{'Name'}."'");
 			}
 		}
 	}
@@ -866,6 +870,7 @@ sub process_request {
 					}
 				}
 			}
+use Data::Dumper; print ( STDERR  "ATTRIBUTES: ".Dumper($user->{'ConfigAttributes'}) );
 			$udp_packet = auth_resp($resp->pack, getAttributeValue($user->{'ConfigAttributes'},"SMRadius-Config-Secret"));
 			$server->{'client'}->send($udp_packet);
 
-- 
GitLab