SPOPS::Secure::Util - Common utilities for SPOPS::Secure and subclasses


SPOPS documentation Contained in the SPOPS distribution.

Index


Code Index:

NAME

Top

SPOPS::Secure::Util - Common utilities for SPOPS::Secure and subclasses

SYNOPSIS

Top

 my $levels = SPOPS::Secure::Util->parse_object_into_hashref( \@security_objects );
 print "Given security from objects:\n",
       "USER: $levels->{ SEC_SCOPE_USER() }\n",
       "WORLD: $levels->{ SEC_SCOPE_WORLD() }\n";
       "GROUP [ID/LEVEL]: ";
 print join( ' ', map { "[$_/$levels->{ SEC_SCOPE_GROUP() }{ $_ }" }
                      keys %{ $levels->{ SEC_SCOPE_GROUP() } } );

 # Not sure if $item is class or object?

 sub somesub {
     my ( $item, $params ) = @_;
     my ( $object_class, $object_id ) =
                         SPOPS::Secure::Util->find_class_and_oid( $item, $params );
 }

DESCRIPTION

Top

Common utility methods for security tasks.

METHODS

Top

All methods are class methods.

parse_objects_into_hashref( \@security_objects )

Places the relevant information from \@security_objects into a hashref for easy analysis. If no objects are in \@security_objects it returns undef. Otherwise the returned hashref should have as the three keys the constants SEC_SCOPE_WORLD, SEC_SCOPE_GROUP and SEC_SCOPE_USER.

The values of SEC_SCOPE_WORLD and SEC_SCOPE_USER are a single value corresponding to one of the SEC_LEVEL_* constants. The value of SEC_LEVEL_GROUP is another hashref with the keys as the group IDs each of which has a single value corresponding to one of the SEC_LEVEL_* constants.

find_class_and_oid( [$class|$object], \%params )

Useful when a method can be called as a class or object method and the class/ID to be analyzed can be either in the object calling or in the class and the parameters.

Returns a two-argument list. The first is the object class, the second is the object ID.

If the first argument is an object and it has a method id(), we assign the result of calling it to the object ID; for the object class we call ref on the object.

Otherwise we look in \%params for a parameter 'class'. If it is not found we use the first argument. For the object ID we look in \%params for a parameter 'object_id' or 'oid'. If neither are found we assign '0' to the object ID. For example:

 my $class = 'My::Object'; my ( $object_class, $object_id ) =
                    SPOPS::Secure::Util->find_class_and_oid( $class, { object_id => 5 } );
 # $object_class = 'My::Object'; $object_id = 5

 my $object = My::OtherObject->new({ id => 99 });
 my ( $object_class, $object_id ) =
                    SPOPS::Secure::Util->find_class_and_oid( $object );
 # $object_class = 'My::OtherObject'; $object_id = 99

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::Util;

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

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

my $log = get_logger();

# Setup a hashref where w/u => security_level and g points to a
# hashref where the key is the group_id value is the security level.

sub parse_objects_into_hashref {
    my ( $class, $security_objects ) = @_;

    my %items = ( SEC_SCOPE_WORLD() => undef,
                  SEC_SCOPE_USER()  => undef,
                  SEC_SCOPE_GROUP() => {} );
    unless ( ref $security_objects eq 'ARRAY'
             and scalar @{ $security_objects } > 0 ) {
        return undef;
    }

ITEM:
    foreach my $sec ( @{ $security_objects } ) {
        if ( $sec->{scope} eq SEC_SCOPE_WORLD || $sec->{scope} eq SEC_SCOPE_USER ) {
            $items{ $sec->{scope} } = $sec->{security_level};
            $log->is_debug &&
                $log->debug( "Assign [$sec->{security_level}] to [$sec->{scope}]" );
        }
        elsif ( $sec->{scope} eq SEC_SCOPE_GROUP ) {
            $items{ $sec->{scope} }->{ $sec->{scope_id} } = $sec->{security_level};
            $log->is_debug &&
                $log->debug( "Assign [$sec->{security_level}] to ",
                            "[$sec->{scope}][$sec->{scope_id}]" );
        }
    }
    $log->is_info &&
        $log->info( "All security parsed: ", Dumper( \%items ) );;
    return \%items;
}

sub find_class_and_oid {
    my ( $class, $item, $p ) = @_;

    # First assume it's a class we're passed in to check

    my $obj_class = $p->{class} || $item;
    my $oid       = $p->{object_id} || $p->{oid} || '0';

    # If this is an object, modify lines accordingly

    if ( ref $item and UNIVERSAL::can( $item, 'id' ) ) {
        $oid        = eval { $item->id } || '0';
        $obj_class  = ref $item;
    }
    return ( $obj_class, $oid );
}


1;

__END__