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 )