package Data::ACL::Realm;
use Carp;
use strict;
use vars qw/ $VERSION /;
$VERSION = $Data::ACL::VERSION;
sub AddPolicy {
my ( $self, $right, @args ) = @_;
$right = uc $right;
unless( $right eq 'ALLOW' or $right eq 'DENY' ) {
croak( __PACKAGE__, "->AddPolicy : Policy should be either 'ALLOW' or 'DENY'" );
}
push @{ $self->{'policies'} }, [ $right, @args ];
}
sub Allow {
my ( $self, @args ) = @_;
push @{ $self->{'policies'} }, [ 'ALLOW', @args ];
}
sub Deny {
my ( $self, @args ) = @_;
push @{ $self->{'policies'} }, [ 'DENY', @args ];
}
sub Is {
my ( $self, $user, $group ) = @_;
my $set = $self->{'set'};
return 1 if $group =~ /^all$/i;
return ( $group eq $user ) if $group =~ s/^\.//;
return undef unless $set->member( $user );
return $set->member( $user, $group );
}
sub IsAuthorized {
my ( $self, $user ) = @_;
my $result = 0;
foreach my $policy ( @{ $self->{'policies'} } ) {
my ( $right, $group, $exception ) = @{ $policy };
if ( ( $self->Is( $user, $group ) ) and ( !( $exception and $self->Is( $user, $exception ) ) ) ) {
$result = ( $right eq 'ALLOW' );
}
}
return $result;
}
sub new {
my ( $class, $set ) = @_;
my $self = bless {
'policies' => [],
'set' => $set
}, $class;
return $self;
}
1;
__END__
syntax highlighted by Code2HTML, v. 0.9.1