From ea550c899b991fc474b8a63205fff2f62e0570cf Mon Sep 17 00:00:00 2001
From: Robert Anderson <randerson@lbsd.net>
Date: Fri, 20 Mar 2009 06:12:52 +0000
Subject: [PATCH] Return ack/nack for post accounting hook

---
 .../modules/features/mod_feature_capping.pm   | 78 ++++++++++++++++++-
 1 file changed, 75 insertions(+), 3 deletions(-)

diff --git a/smradius/modules/features/mod_feature_capping.pm b/smradius/modules/features/mod_feature_capping.pm
index 8d4cc686..f889e673 100644
--- a/smradius/modules/features/mod_feature_capping.pm
+++ b/smradius/modules/features/mod_feature_capping.pm
@@ -25,7 +25,7 @@ use warnings;
 use smradius::constants;
 use smradius::logging;
 use smradius::util;
-
+use Data::Dumper;
 
 # Exporter stuff
 require Exporter;
@@ -167,8 +167,80 @@ sub post_acct_hook
 
 	$server->log(LOG_DEBUG,"[MOD_FEATURE_CAPPING] POST ACCT HOOK");
 
-	return MOD_RES_SKIP;
-}
+	my ($trafficLimit,$timeLimit);
+	
+	# Compare SMRadius-Capping-Time-Limit
+	if (defined($user->{'Attributes'}->{$TIME_LIMIT_KEY})) {
+		$server->log(LOG_DEBUG,"[MOD_FEATURE_CAPPING] '".$TIME_LIMIT_KEY."' is defined");
+		# Operator: :=
+		if (defined($user->{'Attributes'}->{$TIME_LIMIT_KEY}->{':='})) {
+			# Is it a number?
+			if ($user->{'Attributes'}->{$TIME_LIMIT_KEY}->{':='}->{'Value'} =~ /^[0-9]+$/) {
+				$timeLimit = $user->{'Attributes'}->{$TIME_LIMIT_KEY};
+			} else {
+				$server->log(LOG_NOTICE,"[MOD_FEATURE_CAPPING] '".$user->{'Attributes'}->{$TIME_LIMIT_KEY}->{':='}->{'Value'}."' is NOT a numeric value");
+			}
+		} else {
+			$server->log(LOG_NOTICE,"[MOD_FEATURE_CAPPING] No valid operators for attribute '".$user->{'Attributes'}->{$TIME_LIMIT_KEY}."'");
+		}
+	}
+
+
+	# Compare SMRadius-Capping-Traffic-Limit
+	if (defined($user->{'Attributes'}->{$TRAFFIC_LIMIT_KEY})) {
+		$server->log(LOG_DEBUG,"[MOD_FEATURE_CAPPING] '".$TRAFFIC_LIMIT_KEY."' is defined");
+		# Operator: +=
+		if (defined($user->{'Attributes'}->{$TRAFFIC_LIMIT_KEY}->{':='})) {
+			# Is it a number?
+			if ($user->{'Attributes'}->{$TRAFFIC_LIMIT_KEY}->{':='}->{'Value'} =~ /^[0-9]+$/) {
+				$trafficLimit = $user->{'Attributes'}->{$TRAFFIC_LIMIT_KEY};
+			} else {
+				$server->log(LOG_NOTICE,"[MOD_FEATURE_CAPPING] '".$user->{'Attributes'}->{$TRAFFIC_LIMIT_KEY}->{':='}->{'Value'}."' is NOT a numeric value");
+			}
+		} else {
+			$server->log(LOG_NOTICE,"[MOD_FEATURE_CAPPING] No valid operators for attribute '".$user->{'Attributes'}->{$TRAFFIC_LIMIT_KEY}."'");
+		}
+	}
+
+	# Check if we need to get the users' usage	
+	my $accountingUsage;
+	if (defined($timeLimit) || defined($trafficLimit)) {
+		# Loop with plugins to find anyting supporting getting of usage
+		foreach my $module (@{$server->{'plugins'}}) {
+			# Do we have the correct plugin?
+			if ($module->{'Accounting_getUsage'}) {
+				$server->log(LOG_INFO,"[MOD_FEATURE_CAPPING] Found plugin: '".$module->{'Name'}."'");
+				# Fetch users session time & bandwidth used
+				my $res = $module->{'Accounting_getUsage'}($server,$user,$packet);
+				if (!defined($res)) {
+					$server->log(LOG_ERR,"[MOD_FEATURE_CAPPING] No usage data found for user '".$packet->attr('User-Name')."'");
+					return MOD_RES_SKIP;
+				}
+
+				$accountingUsage = $res;
+			}
+		}
+	}
 
+	# Check values against limits
+	if (defined($timeLimit)) {
+		if ($accountingUsage->{'TotalTimeUsage'} >= $timeLimit->{':='}->{'Value'}) {
+			$server->log(LOG_DEBUG,"[MOD_FEATURE_CAPPING] Usage exceeds ".$timeLimit->{':='}->{'Value'}.", returning [NACK]");
+			# Exceeding maximum, must be disconnected
+			return MOD_RES_NACK;
+		}
+	}
+	if (defined($trafficLimit)) {
+		if ($accountingUsage->{'TotalDataUsage'} >= $trafficLimit->{':='}->{'Value'}) {
+			$server->log(LOG_DEBUG,"[MOD_FEATURE_CAPPING] Usage exceeds ".$trafficLimit->{':='}->{'Value'}.", returning [NACK]");
+			# Exceeding maximum, must be disconnected
+			if ($packet->attr('Acct-Status-Type') eq "Alive") {
+				return MOD_RES_NACK;
+			}
+		}
+	}
+
+	return MOD_RES_ACK;
+}
 
 1;
-- 
GitLab