Ambrosia

 view release on metacpan or  search on metacpan

lib/Ambrosia/Addons/Accessor.pm  view on Meta::CPAN

{
    package Ambrosia::Addons::Accessor;
    use strict;
    use warnings;

    use Ambrosia::Meta;

    class abstract
    {
        extends => [qw/Exporter/],
        public  => [qw/user/],
        private => [qw/authorize/],
    };

    our $VERSION = 0.010;

    our @EXPORT = qw/accessor/;

    our %PROCESS_MAP = ();
    our %ACCESSOR = ();

    sub import
    {
        my $pkg = shift;
        my %prm = @_;
        assign($prm{assign}) if $prm{assign};
    
        __PACKAGE__->export_to_level(1, @EXPORT);
    }

    sub assign
    {
        $PROCESS_MAP{$$} = shift;
    }

    {
        sub instance
        {
            my $package = shift;
            my $key = shift;
            return $ACCESSOR{$key} ||= $package->new(@_);
        }
    
        sub accessor
        {
            no warnings;
            return __PACKAGE__->instance($PROCESS_MAP{$$} || throw Ambrosia::error::Exception::BadUsage("First access to Ambrosia::Addons::Accessor without assign to access."), @_);
        }
    }

    sub authenticate
    {
        my $self = shift;
        my $login = shift;
        my $passwd = shift;
        my $level = shift;

        unless ( $level )
        {#Authorization is not required
            return new Ambrosia::Addons::Accessor::Result()->SET_PERMIT;
        }

        #If no username or password then prohibit
        return new Ambrosia::Addons::Accessor::Result()->SET_DENIED unless $login && $passwd;

        #check username and password
        return $self->check_password($login, $passwd, $level);
    }

    sub exit :Abstract
    {
    }

    sub remember_authorize_info :Abstract
    {
    }

    sub check_password
    {
        my $self = shift;
        my $login = shift || '';
        my $passwd = shift || '';
        my $level = shift;

        unless ( $self->user = $self->authorize->get($login, $level) )
        {
            return new Ambrosia::Addons::Accessor::Result()->SET_DENIED;
        }

        if ( $self->user->Password eq $passwd )
        {
            $self->remember_authorize_info($login, $passwd);
            return new Ambrosia::Addons::Accessor::Result()->SET_REDIRECT;
        }

        if ( crypt($self->user->Password, $passwd) eq $passwd )
        {
            return new Ambrosia::Addons::Accessor::Result()->SET_PERMIT;
        }

        return new Ambrosia::Addons::Accessor::Result()->SET_DENIED;
    }

    1;
}

{



( run in 1.099 second using v1.01-cache-2.11-cpan-524268b4103 )