1 |
196 |
ahitrov |
package users::Keeper; |
2 |
|
|
|
3 |
|
|
use strict; |
4 |
|
|
use warnings 'all'; |
5 |
|
|
use base qw(Contenido::Keeper); |
6 |
|
|
|
7 |
|
|
use Digest::MD5; |
8 |
|
|
use Contenido::Globals; |
9 |
|
|
use Data::Dumper; |
10 |
|
|
|
11 |
|
|
# ---------------------------------------------------------------------------- |
12 |
|
|
# Функции: |
13 |
|
|
# ---------------------------------------------------------------------------- |
14 |
|
|
# check_login: Наличие пользователя в системе |
15 |
|
|
# |
16 |
|
|
# login => login пользователя |
17 |
|
|
# email => email пользователя |
18 |
|
|
# ---------------------------------------------------------------------------- |
19 |
|
|
sub check_login { |
20 |
|
|
|
21 |
|
|
my $self = shift; |
22 |
|
|
my %opts = @_; |
23 |
|
|
|
24 |
|
|
return if !$opts{login} && !$opts{email}; |
25 |
|
|
my $class = $self->state->profile_document_class; |
26 |
|
|
my $res = $keeper->get_documents ( |
27 |
|
|
class => $class, |
28 |
|
|
$opts{login} ? (login => $opts{login}) : (), |
29 |
|
|
$opts{email} ? (email => lc($opts{email})) : (), |
30 |
|
|
count => 1, |
31 |
|
|
); |
32 |
|
|
return int($res); |
33 |
|
|
} |
34 |
|
|
|
35 |
|
|
|
36 |
|
|
|
37 |
|
|
# ---------------------------------------------------------------------------- |
38 |
|
|
# login: Авторизация пользователя |
39 |
|
|
# |
40 |
|
|
# login => login пользователя |
41 |
|
|
# email => e-mail пользователя |
42 |
|
|
# passwd => пароль пользователя |
43 |
|
|
# ---------------------------------------------------------------------------- |
44 |
|
|
sub login { |
45 |
|
|
|
46 |
|
|
my $self = shift; |
47 |
|
|
my %opts = @_; |
48 |
|
|
|
49 |
|
|
return if !($opts{login} || $opts{email}) && !$opts{passwd}; |
50 |
|
|
my $passmd5 = Digest::MD5::md5_hex($opts{passwd}); |
51 |
|
|
my $class = $self->state->profile_document_class; |
52 |
|
|
my $res = $keeper->get_documents ( |
53 |
|
|
class => $class, |
54 |
|
|
$opts{login} ? (login => $opts{login}) : (), |
55 |
|
|
$opts{email} ? (email => lc($opts{email})) : (), |
56 |
|
|
status => [1,2,3,4,5], |
57 |
|
|
return_mode => 'array_ref', |
58 |
|
|
); |
59 |
|
|
$res = ref $res eq 'ARRAY' ? $res->[0] : undef; |
60 |
|
|
return unless ref $res; |
61 |
|
|
# warn "Password = ".$opts{passwd}."; Pass MD5 = $passmd5; user MD5 = ".$res->passwd."\n" if $DEBUG; |
62 |
|
|
if ($res->passwd eq $passmd5 ) { |
63 |
|
|
my $lastlogin = Contenido::DateTime->new ( postgres => $res->lastlogin ); |
64 |
|
|
my $now = Contenido::DateTime->new; |
65 |
|
|
my $then = $now->clone; |
66 |
|
|
$then->subtract( hours => 2 ); |
67 |
|
|
if ( DateTime->compare($then, $lastlogin) == 1 ) { |
68 |
|
|
$res->lastlogin( $now->ymd('-').' '.$now->hms ); |
69 |
|
|
$res->passwd(undef); |
70 |
|
|
$res->store; |
71 |
|
|
$res->lastlogin( $lastlogin->ymd('-').' '.$lastlogin->hms ); |
72 |
|
|
} |
73 |
|
|
return $res; |
74 |
|
|
}else{ |
75 |
|
|
return; |
76 |
|
|
} |
77 |
|
|
|
78 |
|
|
} |
79 |
|
|
|
80 |
|
|
|
81 |
|
|
|
82 |
|
|
# ---------------------------------------------------------------------------- |
83 |
|
|
# confirm: Подтверждение аутентификации |
84 |
|
|
# |
85 |
|
|
# login => login пользователя |
86 |
|
|
# email => e-mail пользователя |
87 |
|
|
# md5 => MD5 пароля пользователя |
88 |
|
|
# ---------------------------------------------------------------------------- |
89 |
|
|
sub confirm { |
90 |
|
|
|
91 |
|
|
my $self = shift; |
92 |
|
|
my %opts = @_; |
93 |
|
|
|
94 |
|
|
return if !($opts{login} || $opts{email}) && !$opts{md5}; |
95 |
|
|
my $class = $self->state->profile_document_class; |
96 |
|
|
my $res = $keeper->get_documents ( |
97 |
|
|
class => $class, |
98 |
|
|
$opts{login} ? (login => $opts{login}) : (), |
99 |
|
|
$opts{email} ? (email => lc($opts{email})) : (), |
100 |
|
|
return_mode => 'array_ref', |
101 |
|
|
); |
102 |
|
|
$res = ref $res eq 'ARRAY' && scalar @$res ? $res->[0] : undef; |
103 |
|
|
return unless ref $res; |
104 |
|
|
warn "MD5 = ".$opts{md5}."; user MD5 = ".$res->passwd."\n" if $DEBUG; |
105 |
|
|
if ($res->passwd eq $opts{md5} ) { |
106 |
|
|
my $now = localtime; |
107 |
|
|
$res->lastlogin( $now ); |
108 |
|
|
$res->passwd(undef); |
109 |
|
|
$res->status(1); |
110 |
|
|
$res->store; |
111 |
|
|
return $res; |
112 |
|
|
}else{ |
113 |
|
|
return; |
114 |
|
|
} |
115 |
|
|
|
116 |
|
|
} |
117 |
|
|
|
118 |
|
|
|
119 |
|
|
|
120 |
|
|
# ---------------------------------------------------------------------------- |
121 |
|
|
# get_profile: Вытащить профиль пользователя |
122 |
|
|
# |
123 |
|
|
# id => по ID |
124 |
|
|
# login => по login |
125 |
|
|
# email => по e-mail |
126 |
|
|
# nickname=> по никнейму |
127 |
|
|
# status => фильтр по статусу |
128 |
|
|
# ---------------------------------------------------------------------------- |
129 |
|
|
sub get_profile { |
130 |
|
|
|
131 |
|
|
my $self = shift; |
132 |
|
|
my %opts = @_; |
133 |
|
|
|
134 |
|
|
return if !$opts{login} && !$opts{id} && !$opts{email} && !$opts{nickname}; |
135 |
|
|
my $class = $self->state->profile_document_class; |
136 |
|
|
my $res = $keeper->get_documents ( |
137 |
|
|
class => $class, |
138 |
|
|
%opts, |
139 |
|
|
return_mode => 'array_ref', |
140 |
|
|
); |
141 |
|
|
$res = ref $res eq 'ARRAY' && scalar @$res ? $res->[0] : undef; |
142 |
|
|
return $res; |
143 |
|
|
} |
144 |
|
|
|
145 |
|
|
1; |