diff --git a/smradius/modules/features/mod_feature_validity.pm b/smradius/modules/features/mod_feature_validity.pm index f5cbd49e12b2767928296b14ecc200be6bdebb25..2d535390f59ada25670849ab40ea8da39e80081a 100644 --- a/smradius/modules/features/mod_feature_validity.pm +++ b/smradius/modules/features/mod_feature_validity.pm @@ -76,43 +76,61 @@ sub checkValidity $server->log(LOG_DEBUG,"[MOD_FEATURE_VALIDITY] POST AUTH HOOK"); - my ($validFrom,$validTo); + my ($validFrom,$validTo,$validWindow); # Get validity start date if (defined($user->{'Attributes'}->{$VALID_FROM_KEY})) { $server->log(LOG_DEBUG,"[MOD_FEATURE_VALIDITY] '".$VALID_FROM_KEY."' is defined"); - # Operator: == - if (defined($user->{'Attributes'}->{$VALID_FROM_KEY}->{'=='})) { + # Operator: := + if (defined($user->{'Attributes'}->{$VALID_FROM_KEY}->{':='})) { # Is it formatted as a date? - if ($user->{'Attributes'}->{$VALID_FROM_KEY}->{'=='}->{'Value'} =~ /^[0-9]{4}-[0-9]{2}-[0-9]{2}$/) { - $validFrom = $user->{'Attributes'}->{$VALID_FROM_KEY}->{'=='}->{'Value'}; + if ($user->{'Attributes'}->{$VALID_FROM_KEY}->{':='}->{'Value'} =~ /^[0-9]{4}-[0-9]{2}-[0-9]{2}$/) { + $validFrom = $user->{'Attributes'}->{$VALID_FROM_KEY}->{':='}->{'Value'}; } else { - $server->log(LOG_NOTICE,"[MOD_FEATURE_VALIDITY] '".$user->{'Attributes'}->{$VALID_FROM_KEY}->{'=='}->{'Value'}. + $server->log(LOG_NOTICE,"[MOD_FEATURE_VALIDITY] '".$user->{'Attributes'}->{$VALID_FROM_KEY}->{':='}->{'Value'}. "' is NOT in ISO standard format 'YYYY-MM-DD'"); } } else { $server->log(LOG_NOTICE,"[MOD_FEATURE_VALIDITY] No valid operators for attribute '$VALID_FROM_KEY'"); - } - } + } # if (defined($user->{'Attributes'}->{$VALID_FROM_KEY}->{':='})) { + } # if (defined($user->{'Attributes'}->{$VALID_FROM_KEY})) { # Get validity end date if (defined($user->{'Attributes'}->{$VALID_TO_KEY})) { $server->log(LOG_DEBUG,"[MOD_FEATURE_VALIDITY] '".$VALID_TO_KEY."' is defined"); - # Operator: == - if (defined($user->{'Attributes'}->{$VALID_TO_KEY}->{'=='})) { + # Operator: := + if (defined($user->{'Attributes'}->{$VALID_TO_KEY}->{':='})) { # Is it formatted as a date? - if ($user->{'Attributes'}->{$VALID_TO_KEY}->{'=='}->{'Value'} =~ /^[0-9]{4}-[0-9]{2}-[0-9]{2}$/) { - $validTo = $user->{'Attributes'}->{$VALID_TO_KEY}->{'=='}->{'Value'}; + if ($user->{'Attributes'}->{$VALID_TO_KEY}->{':='}->{'Value'} =~ /^[0-9]{4}-[0-9]{2}-[0-9]{2}$/) { + $validTo = $user->{'Attributes'}->{$VALID_TO_KEY}->{':='}->{'Value'}; } else { - $server->log(LOG_NOTICE,"[MOD_FEATURE_VALIDITY] '".$user->{'Attributes'}->{$VALID_TO_KEY}->{'=='}->{'Value'}. + $server->log(LOG_NOTICE,"[MOD_FEATURE_VALIDITY] '".$user->{'Attributes'}->{$VALID_TO_KEY}->{':='}->{'Value'}. "' is NOT an ISO standard format 'YYYY-MM-DD'"); } } else { $server->log(LOG_NOTICE,"[MOD_FEATURE_VALIDITY] No valid operators for attribute '$VALID_TO_KEY'"); - } - } + } # if (defined($user->{'Attributes'}->{$VALID_TO_KEY}->{':='})) { + } # if (defined($user->{'Attributes'}->{$VALID_TO_KEY})) { + + # Get validity window + if (defined($user->{'Attributes'}->{$VALID_WINDOW_KEY})) { + $server->log(LOG_DEBUG,"[MOD_FEATURE_VALIDITY] '".$VALID_WINDOW_KEY."' is defined"); + # Operator: := + if (defined($user->{'Attributes'}->{$VALID_WINDOW_KEY}->{':='})) { + # Is it a number? + if ($user->{'Attributes'}->{$VALID_WINDOW_KEY}->{':='}->{'Value'} =~ /^\d+$/) { + $validWindow = $user->{'Attributes'}->{$VALID_WINDOW_KEY}->{':='}->{'Value'}; + } else { + $server->log(LOG_NOTICE,"[MOD_FEATURE_VALIDITY] '".$user->{'Attributes'}->{$VALID_WINDOW_KEY}->{':='}->{'Value'}. + "' is NOT an integer"); + } + } else { + $server->log(LOG_NOTICE,"[MOD_FEATURE_VALIDITY] No valid operators for attribute '$VALID_WINDOW_KEY'"); + } # if (defined($user->{'Attributes'}->{$VALID_WINDOW_KEY}->{':='})) { + } # if (defined($user->{'Attributes'}->{$VALID_WINDOW_KEY})) { + # Now ... @@ -135,8 +153,8 @@ sub checkValidity # Date not within valid period, must be disconnected return MOD_RES_NACK; - } - } + } # if (!defined($validFrom_unixtime)) { + } # if (defined($validFrom)) { # Do we have an end date? if (defined($validTo)) { @@ -153,58 +171,35 @@ sub checkValidity # Date not within valid period, must be disconnected return MOD_RES_NACK; - } - } - - # Get validity window - my $validWindow; - if (defined($user->{'Attributes'}->{$VALID_WINDOW_KEY})) { - $server->log(LOG_DEBUG,"[MOD_FEATURE_VALIDITY] '".$VALID_WINDOW_KEY."' is defined"); - # Operator: := - if (defined($user->{'Attributes'}->{$VALID_WINDOW_KEY}->{':='})) { - # Is it a number? - if ($user->{'Attributes'}->{$VALID_WINDOW_KEY}->{':='}->{'Value'} =~ /^\d+$/) { - $validWindow = $user->{'Attributes'}->{$VALID_WINDOW_KEY}->{':='}->{'Value'}; + } # if (!defined($validTo_unixtime)) { + } # if (defined($validTo)) { + + # Do we have a validity window + if (defined($validWindow)) { + + # Check first if we have the ability to support this feature + if (defined($user->{'_UserDB'}->{'Users_data_get'})) { + # Fetch users_data for first login + if (defined(my $res = $user->{'_UserDB'}->{'Users_data_get'}($server,$user,'global','FirstLogin'))) { + # Check if this user should be disconnected + if (defined($validWindow) && defined($res)) { + my $validUntil = $validWindow + $res->{'Value'}; + # If current time after start of valid pariod + if ($now > $validUntil) { + my $pretty_dt = DateTime->from_epoch( epoch => $validUntil )->strftime('%Y-%m-%d %H:%M:%S'); + $server->log(LOG_DEBUG,"[MOD_FEATURE_VALIDITY] Current date outside valid window end date: '".$pretty_dt."', rejecting"); + # Date not within valid window, must be disconnected + return MOD_RES_NACK; + } + } + } else { - $server->log(LOG_NOTICE,"[MOD_FEATURE_VALIDITY] '".$user->{'Attributes'}->{$VALID_WINDOW_KEY}->{':='}->{'Value'}. - "' is NOT an integer"); - } + $server->log(LOG_NOTICE,"[MOD_FEATURE_VALIDITY] No users_data 'global/FirstLogin' found for user '".$packet->attr('User-Name')."'"); + } # if (defined(my $res = $module->{'Users_data_get'}($server,$user,'global','FirstLogin'))) { } else { - $server->log(LOG_NOTICE,"[MOD_FEATURE_VALIDITY] No valid operators for attribute '$VALID_WINDOW_KEY'"); - } - } - - # Loop with plugins to find anything supporting getting user data - my $user_data; - foreach my $module (@{$server->{'module_list'}}) { - # Do we have the correct plugin? - if ($module->{'Users_data_get'}) { - $server->log(LOG_INFO,"[MOD_FEATURE_VALIDITY] Found plugin: '".$module->{'Name'}."'"); - # Fetch users data - my $res = $module->{'Users_data_get'}($server,$user,'global','FirstLogin'); - if (!defined($res)) { - $server->log(LOG_ERR,"[MOD_FEATURE_VALIDITY] No user data found for user '".$packet->attr('User-Name')."'"); - return MOD_RES_SKIP; - } - - $user_data = $res; - } - } - - # Check if this user should be disconnected - if (defined($validWindow) && defined($user_data)) { - my $validUntil = $validWindow + $user_data->{'Value'}; - if (!defined($validUntil)) { - $server->log(LOG_DEBUG,"[MOD_FEATURE_VALIDITY] Failed to calculate end of valid window using " - .niceUndef($validWindow)." and ".niceUndef($user_data->{'Value'})); - - # If current time after start of valid pariod - } elsif ($now > $validUntil) { - my $pretty_dt = DateTime->from_epoch( epoch => $validUntil )->strftime('%Y-%m-%d %H:%M:%S'); - $server->log(LOG_DEBUG,"[MOD_FEATURE_VALIDITY] Current date outside valid window end date: '".$pretty_dt."', rejecting"); - # Date not within valid window, must be disconnected - return MOD_RES_NACK; - } + $server->log(LOG_WARN,"[MOD_FEATURE_VALIDITY] UserDB module '".$user->{'_UserDB'}->{'Name'}. + "' does not support 'users_data'. Therefore no support for Validity Window feature"); + } # if (defined($user->{'_UserDB'}->{'Users_data_get'})) { } return MOD_RES_ACK; diff --git a/smradiusd.conf b/smradiusd.conf index b8cfedfd5dff6c4de0a9cda81c5b404cf4d32361..1a32bc1abdd6d9ce67351559040280b041de5672 100644 --- a/smradiusd.conf +++ b/smradiusd.conf @@ -157,6 +157,7 @@ EOT modules=<<EOT mod_feature_capping mod_feature_user_stats +mod_feature_validity EOT