SPOPS::Secure::Loopback - Security object implementation for testing (loopback) objects


SPOPS documentation Contained in the SPOPS distribution.

Index


Code Index:

NAME

Top

SPOPS::Secure::Loopback - Security object implementation for testing (loopback) objects

SYNOPSIS

Top

DESCRIPTION

Top

METHODS

Top

BUGS

Top

None known.

TO DO

Top

Nothing known.

SEE ALSO

Top

COPYRIGHT

Top

AUTHORS

Top

Chris Winters <chris@cwinters.com>


SPOPS documentation Contained in the SPOPS distribution.

package SPOPS::Secure::Loopback;

# $Id: Loopback.pm,v 1.5 2004/06/02 00:48:24 lachoy Exp $

use strict;
use Log::Log4perl qw( get_logger );
use SPOPS;
use SPOPS::Secure qw( :level :scope );
use SPOPS::Secure::Util;

my $log = get_logger();

$SPOPS::Secure::Loopback::VERSION = sprintf("%d.%02d", q$Revision: 1.5 $ =~ /(\d+)\.(\d+)/);

sub fetch_by_object {
    my ( $class, $object, $p ) = @_;
    my @security_objects = $class->_fetch_all_by_object( $object, $p );
    my ( @user_match, @group_match, @world_match );
    if ( $p->{user} ) {
        my $user_id = eval { $p->{user}->id };
        if ( $user_id ) {
            @user_match = $class->_filter_by_scope( SEC_SCOPE_USER, $user_id,
                                                    @security_objects );
        }
    }
    if ( ref $p->{group} eq 'ARRAY' ) {
        for ( @{ $p->{group} } ) {
            my $group_id = eval { $_->id };
            if ( $group_id ) {
                push @group_match, $class->_filter_by_scope( SEC_SCOPE_GROUP,
                                                             $group_id, @security_objects );
            }
        }
    }
    @world_match = $class->_filter_by_scope( SEC_SCOPE_WORLD, undef, @security_objects );
    return SPOPS::Secure::Util->parse_objects_into_hashref(
                         [ @user_match, @group_match, @world_match ] );
}

sub _fetch_all_by_object {
    my ( $class, $object, $p ) = @_;
    my ( $find_class, $find_id ) =
               SPOPS::Secure::Util->find_class_and_oid( $object, $p );
    return () unless ( $find_class and $find_id );
    my $all_class_security = $class->fetch_group({
                                        where => "class = $find_class" });
    my @security_objects = ();
    for ( @{ $all_class_security } ) {
        next unless ( $_->{object_id} );
        if ( $_->{object_id} eq $find_id ) {
            push @security_objects, $class->new( $_ );
        }
    }
    return @security_objects;
}

sub fetch_match {
    my ( $class, $object, $p ) = @_;
    return undef  unless ( $p->{scope} );
    my $is_world = 1 if ( $p->{scope} eq SEC_SCOPE_WORLD );
    return undef  unless ( $is_world or $p->{scope_id} );
    my @security_objects = $class->_fetch_all_by_object( $object, $p );
    return ( $class->_filter_by_scope( $p->{scope}, $p->{scope_id}, @security_objects) )[0];
}

sub _filter_by_scope {
    my ( $class, $scope, $scope_id, @objects ) = @_;
    my $is_world = 1   if ( $scope eq SEC_SCOPE_WORLD );
    my @matching = ();
    for ( @objects ) {
        next unless ( $_->{scope} eq $scope );
        if ( $is_world or ( $_->{scope_id} eq $scope_id ) ) {
            push @matching, $_;
        }
    }
    return @matching;
}

1;

__END__