/usr/local/CPAN/Decision-ACL/Decision/ACL/Rule.pm
package Decision::ACL::Rule;
use strict;
use Carp;
use Data::Dumper;
use Decision::ACL::Constants qw(:rule);
use constant DEBUG_LEVEL => 0;
sub new
{
my $parent = shift;
my $args = shift;
croak "No arguments to new()" if not defined $args;
croak "Arguments to new() is not a hashref" if !UNIVERSAL::isa($args, 'HASH');
croak "No fields specified for new()" if not defined $args->{fields};
croak "Fields argument is not a hashref" if !UNIVERSAL::isa($args->{fields}, 'HASH');
my $self = {};
bless $self, $parent;
$self->Now($args->{now});
$self->Action($args->{action});
$self->Fields($args->{fields});
return $self;
}
sub Fields
{
my $self = shift;
my $fields = shift;
if(defined $fields && (UNIVERSAL::isa($fields, 'HASH')))
{
foreach my $field (keys %$fields)
{
$self->{_fields}->{$field} = $fields->{$field};
$self->{_fields}->{$field} = uc $fields->{$field} if $fields->{$field} eq 'all';
}
$self->{_fields_loaded} = 1;
}
return $self->{_fields} || {};
}
sub Now
{
my $self = shift;
my $flag = shift;
if(not defined $flag) { return $self->{_now}; }
if($flag == 1) { $self->{_now} = 1; }
elsif($flag == 0) { $self->{_now} = 0; }
return $self->{_now};
}
sub Action
{
my $self = shift;
my $action = shift;
if(defined $action && ($action =~ /^ALLOW$/i
|| $action =~ /^DENY$/i
|| $action =~ /^PERMIT$/i
|| $action =~ /^BLOCK$/i))
{
$self->{_action} = $action;
return $self->{_action};
}
return $self->{_action};
}
sub Control
{
my $self = shift;
my $args = shift;
croak "Rule parameters not specified" if(!$self->{_fields_loaded});
croak "Rule action is not set" if(!$self->Action());
croak "Nothing to control" if(!$args);
croak "Arguments to control() is not a hashref" if !UNIVERSAL::isa($args, 'HASH');
# Applying our action...
# - Check if we are concerned
# - If so, apply our action
my $concern_status = $self->Concerned($args);
print STDERR "Concerned -> $concern_status\n" if $self->DEBUG_LEVEL();
#It's ours, apply.
if($concern_status != ACL_RULE_UNCONCERNED)
{
print STDERR "We are concerned, action is '". $self->Action()."'\n" if $self->DEBUG_LEVEL();;
return ACL_RULE_ALLOW if($self->Action() =~ /^ALLOW$/i
|| $self->Action() =~ /^PERMIT/i);
return ACL_RULE_DENY if($self->Action() =~ /^DENY$/i
|| $self->ACtion() =~ /^BLOCK$/i);
}
return ACL_RULE_UNCONCERNED;
}
sub Concerned
{
my $self = shift;
my $args = shift;
croak "No args to concern with" if (!$args);
#Foreach field of this rule, check to see if we are concerned.
foreach my $field (keys %{$self->Fields()})
{
my $field_value = $self->Fields()->{$field};
print STDERR "$field control (".$field_value.")->" if $self->DEBUG_LEVEL();;
return ACL_RULE_UNCONCERNED if(
$field_value ne $args->{$field}
&& $field_value
&& $field_value ne 'ALL'
&& $args->{$field} ne 'ALL'
&& $args->{$field});
print STDERR " 1\n" if $self->DEBUG_LEVEL();;
}
return ACL_RULE_CONCERNED;
}
666;