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__ =head1 NAME SPOPS::Secure::Loopback - Security object implementation for testing (loopback) objects =head1 SYNOPSIS =head1 DESCRIPTION =head1 METHODS =head1 BUGS None known. =head1 TO DO Nothing known. =head1 SEE ALSO =head1 COPYRIGHT Copyright (c) 2002-2004 intes.net, inc.. All rights reserved. This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =head1 AUTHORS Chris Winters Echris@cwinters.comE