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;