Revision 196 (by ahitrov, 2012/03/15 18:28:32) |
Users plugin
|
package users::Keeper;
use strict;
use warnings 'all';
use base qw(Contenido::Keeper);
use Digest::MD5;
use Contenido::Globals;
use Data::Dumper;
# ----------------------------------------------------------------------------
# Функции:
# ----------------------------------------------------------------------------
# check_login: Наличие пользователя в системе
#
# login => login пользователя
# email => email пользователя
# ----------------------------------------------------------------------------
sub check_login {
my $self = shift;
my %opts = @_;
return if !$opts{login} && !$opts{email};
my $class = $self->state->profile_document_class;
my $res = $keeper->get_documents (
class => $class,
$opts{login} ? (login => $opts{login}) : (),
$opts{email} ? (email => lc($opts{email})) : (),
count => 1,
);
return int($res);
}
# ----------------------------------------------------------------------------
# login: Авторизация пользователя
#
# login => login пользователя
# email => e-mail пользователя
# passwd => пароль пользователя
# ----------------------------------------------------------------------------
sub login {
my $self = shift;
my %opts = @_;
return if !($opts{login} || $opts{email}) && !$opts{passwd};
my $passmd5 = Digest::MD5::md5_hex($opts{passwd});
my $class = $self->state->profile_document_class;
my $res = $keeper->get_documents (
class => $class,
$opts{login} ? (login => $opts{login}) : (),
$opts{email} ? (email => lc($opts{email})) : (),
status => [1,2,3,4,5],
return_mode => 'array_ref',
);
$res = ref $res eq 'ARRAY' ? $res->[0] : undef;
return unless ref $res;
# warn "Password = ".$opts{passwd}."; Pass MD5 = $passmd5; user MD5 = ".$res->passwd."\n" if $DEBUG;
if ($res->passwd eq $passmd5 ) {
my $lastlogin = Contenido::DateTime->new ( postgres => $res->lastlogin );
my $now = Contenido::DateTime->new;
my $then = $now->clone;
$then->subtract( hours => 2 );
if ( DateTime->compare($then, $lastlogin) == 1 ) {
$res->lastlogin( $now->ymd('-').' '.$now->hms );
$res->passwd(undef);
$res->store;
$res->lastlogin( $lastlogin->ymd('-').' '.$lastlogin->hms );
}
return $res;
}else{
return;
}
}
# ----------------------------------------------------------------------------
# confirm: Подтверждение аутентификации
#
# login => login пользователя
# email => e-mail пользователя
# md5 => MD5 пароля пользователя
# ----------------------------------------------------------------------------
sub confirm {
my $self = shift;
my %opts = @_;
return if !($opts{login} || $opts{email}) && !$opts{md5};
my $class = $self->state->profile_document_class;
my $res = $keeper->get_documents (
class => $class,
$opts{login} ? (login => $opts{login}) : (),
$opts{email} ? (email => lc($opts{email})) : (),
return_mode => 'array_ref',
);
$res = ref $res eq 'ARRAY' && scalar @$res ? $res->[0] : undef;
return unless ref $res;
warn "MD5 = ".$opts{md5}."; user MD5 = ".$res->passwd."\n" if $DEBUG;
if ($res->passwd eq $opts{md5} ) {
my $now = localtime;
$res->lastlogin( $now );
$res->passwd(undef);
$res->status(1);
$res->store;
return $res;
}else{
return;
}
}
# ----------------------------------------------------------------------------
# get_profile: Вытащить профиль пользователя
#
# id => по ID
# login => по login
# email => по e-mail
# nickname=> по никнейму
# status => фильтр по статусу
# ----------------------------------------------------------------------------
sub get_profile {
my $self = shift;
my %opts = @_;
return if !$opts{login} && !$opts{id} && !$opts{email} && !$opts{nickname};
my $class = $self->state->profile_document_class;
my $res = $keeper->get_documents (
class => $class,
%opts,
return_mode => 'array_ref',
);
$res = ref $res eq 'ARRAY' && scalar @$res ? $res->[0] : undef;
return $res;
}
1;