1 | <?php |
||||||
2 | |||||||
3 | namespace Inji; |
||||||
4 | /** |
||||||
5 | * Users module |
||||||
6 | * |
||||||
7 | * @author Alexey Krupskiy <[email protected]> |
||||||
8 | * @link http://inji.ru/ |
||||||
9 | * @copyright 2015 Alexey Krupskiy |
||||||
10 | * @license https://github.com/injitools/cms-Inji/blob/master/LICENSE |
||||||
11 | */ |
||||||
12 | class Users extends Module { |
||||||
13 | public $name = 'Users'; |
||||||
14 | public $cookiePrefix = ''; |
||||||
15 | |||||||
16 | public function init() { |
||||||
17 | if (!empty($this->config['cookieSplit'])) { |
||||||
18 | $this->cookiePrefix = App::$cur->type; |
||||||
19 | } |
||||||
20 | Users\User::$cur = new Users\User(array('group_id' => 1, 'role_id' => 1)); |
||||||
21 | if (!empty($_GET['invite_code']) && is_string($_GET['invite_code'])) { |
||||||
22 | setcookie('invite_code', $_GET['invite_code'], time() + 360000, "/"); |
||||||
23 | } |
||||||
24 | if (!App::$cur->db->connect) { |
||||||
0 ignored issues
–
show
Bug
Best Practice
introduced
by
![]() |
|||||||
25 | return false; |
||||||
26 | } |
||||||
27 | if (isset($_GET['logout'])) { |
||||||
28 | return $this->logOut(); |
||||||
0 ignored issues
–
show
Are you sure the usage of
$this->logOut() targeting Inji\Users::logOut() seems to always return null.
This check looks for function or method calls that always return null and whose return value is used. class A
{
function getObject()
{
return null;
}
}
$a = new A();
if ($a->getObject()) {
The method The reason is most likely that a function or method is imcomplete or has been reduced for debug purposes. ![]() |
|||||||
29 | } |
||||||
30 | if (isset($_GET['passre']) && filter_input(INPUT_GET, 'user_mail')) { |
||||||
31 | $this->passre(trim(filter_input(INPUT_GET, 'user_mail'))); |
||||||
32 | } |
||||||
33 | if (!empty($_GET['passrecont']) && filter_input(INPUT_GET, 'hash')) { |
||||||
34 | $this->passrecont(filter_input(INPUT_GET, 'hash')); |
||||||
35 | } |
||||||
36 | if (isset($_POST['autorization']) && trim(filter_input(INPUT_POST, 'user_login')) && trim(filter_input(INPUT_POST, 'user_pass'))) { |
||||||
37 | unset($_POST['autorization']); |
||||||
38 | return $this->autorization(trim(filter_input(INPUT_POST, 'user_login')), trim(filter_input(INPUT_POST, 'user_pass')), strpos(filter_input(INPUT_POST, 'user_login'), '@') ? 'mail' : 'login', false, false, trim(filter_input(INPUT_POST, 'ref'))); |
||||||
39 | } |
||||||
40 | if (!empty($_COOKIE[$this->cookiePrefix . '_user_session_hash']) && is_string($_COOKIE[$this->cookiePrefix . '_user_session_hash']) && !empty($_COOKIE[$this->cookiePrefix . '_user_id']) && is_string($_COOKIE[$this->cookiePrefix . '_user_id'])) { |
||||||
41 | return $this->cuntinueSession($_COOKIE[$this->cookiePrefix . '_user_session_hash'], $_COOKIE[$this->cookiePrefix . '_user_id']); |
||||||
0 ignored issues
–
show
Are you sure the usage of
$this->cuntinueSession($...iePrefix . '_user_id']) targeting Inji\Users::cuntinueSession() seems to always return null.
This check looks for function or method calls that always return null and whose return value is used. class A
{
function getObject()
{
return null;
}
}
$a = new A();
if ($a->getObject()) {
The method The reason is most likely that a function or method is imcomplete or has been reduced for debug purposes. ![]() |
|||||||
42 | } |
||||||
43 | } |
||||||
44 | |||||||
45 | public function logOut($redirect = true) { |
||||||
46 | if (!empty($_COOKIE[$this->cookiePrefix . "_user_session_hash"]) && !empty($_COOKIE[$this->cookiePrefix . "_user_id"])) { |
||||||
47 | $session = Users\Session::get([ |
||||||
48 | ['user_id', $_COOKIE[$this->cookiePrefix . "_user_id"]], |
||||||
49 | ['hash', $_COOKIE[$this->cookiePrefix . "_user_session_hash"]] |
||||||
50 | ]); |
||||||
51 | if ($session) { |
||||||
52 | $session->delete(); |
||||||
53 | } |
||||||
54 | } |
||||||
55 | if (!headers_sent()) { |
||||||
56 | setcookie($this->cookiePrefix . "_user_session_hash", '', 0, "/"); |
||||||
57 | setcookie($this->cookiePrefix . "_user_id", '', 0, "/"); |
||||||
58 | } |
||||||
59 | if ($redirect) { |
||||||
60 | if (!empty($this->config['logoutUrl'][$this->app->type])) { |
||||||
61 | Tools::redirect($this->config['logoutUrl'][$this->app->type]); |
||||||
62 | } |
||||||
63 | Tools::redirect('/', \I18n\Text::module('Users', 'Вы вышли из своего профиля'), 'success'); |
||||||
0 ignored issues
–
show
The type
I18n\Text was not found. Maybe you did not declare it correctly or list all dependencies?
The issue could also be caused by a filter entry in the build configuration.
If the path has been excluded in your configuration, e.g. filter:
dependency_paths: ["lib/*"]
For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths ![]() |
|||||||
64 | } |
||||||
65 | } |
||||||
66 | |||||||
67 | public function cuntinueSession($hash, $userId) { |
||||||
68 | $session = Users\Session::get([ |
||||||
69 | ['user_id', $userId], |
||||||
70 | ['hash', $hash] |
||||||
71 | ]); |
||||||
72 | if (!$session) { |
||||||
73 | if (!headers_sent()) { |
||||||
74 | setcookie($this->cookiePrefix . "_user_session_hash", '', 0, "/"); |
||||||
75 | setcookie($this->cookiePrefix . "_user_id", '', 0, "/"); |
||||||
76 | } |
||||||
77 | Tools::redirect('/', \I18n\Text::module('Users', 'Произошла непредвиденная ошибка при авторизации сессии')); |
||||||
78 | } |
||||||
79 | if ($session->user->id != $userId) { |
||||||
80 | Tools::redirect('/', \I18n\Text::module('Users', 'Произошла непредвиденная ошибка при авторизации сессии')); |
||||||
81 | } |
||||||
82 | if ($session && $session->user && $session->user->blocked) { |
||||||
83 | if (!headers_sent()) { |
||||||
84 | setcookie($this->cookiePrefix . "_user_session_hash", '', 0, "/"); |
||||||
85 | setcookie($this->cookiePrefix . "_user_id", '', 0, "/"); |
||||||
86 | } |
||||||
87 | \Inji\Msg::add(\I18n\Text::module('Users', 'Ваш аккаунт заблокирован'), 'info'); |
||||||
88 | return; |
||||||
89 | } |
||||||
90 | if ($session && $session->user && !$session->user->blocked) { |
||||||
91 | if (!empty($this->config['needActivation']) && $session->user->activation) { |
||||||
92 | if (!headers_sent()) { |
||||||
93 | setcookie($this->cookiePrefix . "_user_session_hash", '', 0, "/"); |
||||||
94 | setcookie($this->cookiePrefix . "_user_id", '', 0, "/"); |
||||||
95 | } |
||||||
96 | Tools::redirect('/', 'Этот аккаунт ещё не активирован. <br />Если вы не получали письмо с ссылкой для активации, нажмите на - <a href = "/users/resendActivation/' . $session->user->id . '"><b>повторно выслать ссылку активации</b></a>'); |
||||||
97 | } elseif ($session->user->activation) { |
||||||
98 | \Inji\Msg::add('Этот аккаунт ещё не активирован, не все функции могут быть доступны. <br />Если вы не получали письмо с ссылкой для активации, нажмите на - <a href = "/users/resendActivation/' . $session->user->id . '"><b>повторно выслать ссылку активации</b></a>'); |
||||||
99 | } |
||||||
100 | if (!$session->user->mail && !empty($this->config['noMailNotify'])) { |
||||||
101 | \Inji\Msg::add($this->config['noMailNotify']); |
||||||
102 | } |
||||||
103 | Users\User::$cur = $session->user; |
||||||
104 | Users\User::$cur->date_last_active = 'CURRENT_TIMESTAMP'; |
||||||
105 | Users\User::$cur->save(); |
||||||
106 | } else { |
||||||
107 | if (!headers_sent()) { |
||||||
108 | setcookie($this->cookiePrefix . "_user_session_hash", '', 0, "/"); |
||||||
109 | setcookie($this->cookiePrefix . "_user_id", '', 0, "/"); |
||||||
110 | } |
||||||
111 | \Inji\Msg::add(\I18n\Text::module('Users', 'needrelogin'), 'info'); |
||||||
112 | } |
||||||
113 | } |
||||||
114 | |||||||
115 | /** |
||||||
116 | * @param string $user_mail |
||||||
117 | */ |
||||||
118 | public function passre($user_mail) { |
||||||
119 | $user = $this->get($user_mail, 'mail'); |
||||||
120 | if (!$user) { |
||||||
121 | \Inji\Msg::add(\I18n\Text::module('Users', 'mailnotfound', ['user_mail' => $user_mail]), 'danger'); |
||||||
122 | return false; |
||||||
123 | } |
||||||
124 | $passre = Users\Passre::get([['user_id', $user->id], ['status', 1]]); |
||||||
0 ignored issues
–
show
|
|||||||
125 | if ($passre) { |
||||||
126 | $passre->status = 2; |
||||||
127 | $passre->save(); |
||||||
128 | } |
||||||
129 | $hash = $user->id . '_' . Tools::randomString(50); |
||||||
130 | $passre = new Users\Passre(['user_id' => $user->id, 'status' => 1, 'hash' => $hash]); |
||||||
131 | $passre->save(); |
||||||
132 | $domainRaw = App::$cur->getDomain(); |
||||||
133 | $domain = App::$cur->getDomain(true); |
||||||
134 | $title = \I18n\Text::module('Users', 'Восстановление пароля на сайте ${domain}', ['domain' => $domain]); |
||||||
135 | $text = \I18n\Text::module('Users', 'repassmailtext', ['domain' => $domain, 'hash' => $hash]); |
||||||
136 | Tools::sendMail('noreply@' . $domainRaw, $user_mail, $title, $text); |
||||||
137 | Tools::redirect('/', \I18n\Text::module('Users', 'На указанный почтовый ящик была выслана инструкция по восстановлению пароля'), 'success'); |
||||||
138 | } |
||||||
139 | |||||||
140 | public function passrecont($hash) { |
||||||
141 | $passre = Users\Passre::get([['hash', $hash]]); |
||||||
142 | if ($passre) { |
||||||
143 | if ($passre->status != 1) { |
||||||
144 | Tools::redirect('/', 'Этот код восстановление более недействителен', 'danger'); |
||||||
145 | } |
||||||
146 | $passre->status = 3; |
||||||
147 | $passre->save(); |
||||||
148 | $pass = Tools::randomString(10); |
||||||
149 | $user = Users\User::get($passre->user_id); |
||||||
150 | $user->pass = $this->hashpass($pass); |
||||||
0 ignored issues
–
show
|
|||||||
151 | $user->save(); |
||||||
152 | $this->autorization($user->id, $pass, 'id', true, true); |
||||||
0 ignored issues
–
show
|
|||||||
153 | $domainRaw = App::$cur->getDomain(); |
||||||
154 | $domain = App::$cur->getDomain(true); |
||||||
155 | $title = \I18n\Text::module('Users', 'Новый пароль на сайте ${domain}', ['domain' => $domain]); |
||||||
156 | $text = \I18n\Text::module('Users', 'newpassmail', ['domain' => $domain, 'pass' => $pass]); |
||||||
157 | Tools::sendMail('noreply@' . $domainRaw, $user->mail, $title, $text); |
||||||
0 ignored issues
–
show
|
|||||||
158 | Tools::redirect('/', \I18n\Text::module('Users', 'Вы успешно сбросили пароль и были авторизованы на сайте. На ваш почтовый ящик был выслан новый пароль'), 'success'); |
||||||
159 | } |
||||||
160 | } |
||||||
161 | |||||||
162 | public function autorization($login, $pass, $ltype = 'login', $noMsg = true, $skipErrorCheck = false, $redirect = '') { |
||||||
163 | $user = $this->get($login, $ltype); |
||||||
164 | if ($user && !$skipErrorCheck) { |
||||||
165 | $lastSuccessLogin = \Users\User\LoginHistory::lastSuccessLogin($user->id); |
||||||
0 ignored issues
–
show
|
|||||||
166 | $where = [['user_id', $user->id]]; |
||||||
167 | if ($lastSuccessLogin) { |
||||||
168 | $where[] = ['date_create', $lastSuccessLogin->date_create, '>']; |
||||||
169 | } |
||||||
170 | $loginHistoryErrorCount = \Users\User\LoginHistory::getCount(['where' => $where]); |
||||||
171 | if ($loginHistoryErrorCount > 5) { |
||||||
172 | \Inji\Msg::add(\I18n\Text::module('Users', 'logintrylimit', ['user_mail' => $user->mail]), 'danger'); |
||||||
0 ignored issues
–
show
|
|||||||
173 | return false; |
||||||
174 | } |
||||||
175 | } |
||||||
176 | if ($user && $this->verifypass($pass, $user->pass) && !$user->blocked) { |
||||||
0 ignored issues
–
show
|
|||||||
177 | $loginHistory = new \Users\User\LoginHistory([ |
||||||
178 | 'user_id' => $user->id, |
||||||
179 | 'ip' => $_SERVER['REMOTE_ADDR'], |
||||||
180 | 'success' => true |
||||||
181 | ]); |
||||||
182 | $loginHistory->save(); |
||||||
183 | if (!empty($this->config['needActivation']) && $user->activation) { |
||||||
0 ignored issues
–
show
|
|||||||
184 | Tools::redirect('/', 'Этот аккаунт ещё не активирован. <br />Если вы не получали письмо с ссылкой для активации, нажмите на - <a href = "/users/resendActivation/' . $user->id . '"><b>повторно выслать ссылку активации</b></a>'); |
||||||
185 | } elseif ($user->activation) { |
||||||
186 | \Inji\Msg::add('Этот аккаунт ещё не активирован, не все функции могут быть доступны. <br />Если вы не получали письмо с ссылкой для активации, нажмите на - <a href = "/users/resendActivation/' . $user->id . '"><b>повторно выслать ссылку активации</b></a>'); |
||||||
187 | } |
||||||
188 | if (!$user->mail && !empty($this->config['noMailNotify'])) { |
||||||
189 | \Inji\Msg::add($this->config['noMailNotify']); |
||||||
190 | } |
||||||
191 | $this->newSession($user); |
||||||
192 | |||||||
193 | Users\User::$cur = $user; |
||||||
0 ignored issues
–
show
It seems like
$user can also be of type true . However, the property $cur is declared as type Inji\Users\User . Maybe add an additional type check?
Our type inference engine has found a suspicous assignment of a value to a property. This check raises an issue when a value that can be of a mixed type is assigned to a property that is type hinted more strictly. For example, imagine you have a variable Either this assignment is in error or a type check should be added for that assignment. class Id
{
public $id;
public function __construct($id)
{
$this->id = $id;
}
}
class Account
{
/** @var Id $id */
public $id;
}
$account_id = false;
if (starsAreRight()) {
$account_id = new Id(42);
}
$account = new Account();
if ($account instanceof Id)
{
$account->id = $account_id;
}
![]() |
|||||||
194 | Users\User::$cur->date_last_active = 'CURRENT_TIMESTAMP'; |
||||||
0 ignored issues
–
show
|
|||||||
195 | Users\User::$cur->save(); |
||||||
196 | if (!$noMsg) { |
||||||
197 | if (!empty($this->config['loginUrl'][$this->app->type]) && !$redirect) { |
||||||
198 | $redirect = $this->config['loginUrl'][$this->app->type]; |
||||||
199 | } |
||||||
200 | Tools::redirect($redirect); |
||||||
201 | } |
||||||
202 | |||||||
203 | return true; |
||||||
204 | } |
||||||
205 | if (!$noMsg) { |
||||||
206 | if ($user && $user->blocked) { |
||||||
207 | \Inji\Msg::add('Вы заблокированы', 'danger'); |
||||||
208 | } elseif ($user) { |
||||||
209 | $loginHistory = new \Users\User\LoginHistory([ |
||||||
210 | 'user_id' => $user->id, |
||||||
211 | 'ip' => $_SERVER['REMOTE_ADDR'], |
||||||
212 | 'success' => false |
||||||
213 | ]); |
||||||
214 | $loginHistory->save(); |
||||||
215 | \Inji\Msg::add(\I18n\Text::module('Users', 'loginfail', ['user_mail' => $user->mail]), 'danger'); |
||||||
216 | } else { |
||||||
217 | \Inji\Msg::add(\I18n\Text::module('Users', 'Данный почтовый ящик не зарегистрирован в системе'), 'danger'); |
||||||
218 | } |
||||||
219 | } |
||||||
220 | |||||||
221 | return false; |
||||||
222 | } |
||||||
223 | |||||||
224 | public function newSession($user) { |
||||||
225 | $session = $this->createSession($user); |
||||||
226 | if (!headers_sent()) { |
||||||
227 | setcookie($this->cookiePrefix . "_user_session_hash", $session->hash, time() + 360000, "/"); |
||||||
0 ignored issues
–
show
The property
hash does not exist on Inji\Users\Session . Since you implemented __get , consider adding a @property annotation.
![]() |
|||||||
228 | setcookie($this->cookiePrefix . "_user_id", $user->id, time() + 360000, "/"); |
||||||
229 | } else { |
||||||
230 | \Inji\Msg::add('Не удалось провести авторизацию. Попробуйте позже', 'info'); |
||||||
231 | } |
||||||
232 | } |
||||||
233 | |||||||
234 | public function createSession($user) { |
||||||
235 | do { |
||||||
236 | $hash = Tools::randomString(255); |
||||||
237 | } while (Users\Session::get($hash, 'hash')); |
||||||
238 | |||||||
239 | $session = new Users\Session([ |
||||||
240 | 'user_id' => $user->id, |
||||||
241 | 'agent' => $_SERVER['HTTP_USER_AGENT'], |
||||||
242 | 'ip' => $_SERVER['REMOTE_ADDR'], |
||||||
243 | 'hash' => $hash |
||||||
244 | ]); |
||||||
245 | $session->save(); |
||||||
246 | return $session; |
||||||
247 | } |
||||||
248 | |||||||
249 | /** |
||||||
250 | * Return user |
||||||
251 | * |
||||||
252 | * @param integer|string $idn |
||||||
253 | * @param string $ltype |
||||||
254 | * @return boolean|\Users\User |
||||||
255 | */ |
||||||
256 | public function get($idn, $ltype = 'id') { |
||||||
257 | if (!$idn) |
||||||
258 | return false; |
||||||
259 | |||||||
260 | if (is_numeric($idn) && $ltype != 'login') |
||||||
261 | $user = Users\User::get($idn, 'id'); |
||||||
262 | elseif ($ltype == 'login') |
||||||
263 | $user = Users\User::get($idn, 'login'); |
||||||
264 | else |
||||||
265 | $user = Users\User::get($idn, 'mail'); |
||||||
266 | if (!$user) |
||||||
267 | return []; |
||||||
0 ignored issues
–
show
|
|||||||
268 | |||||||
269 | return $user; |
||||||
270 | } |
||||||
271 | |||||||
272 | private function msgOrErr($err, $msg) { |
||||||
273 | if ($msg) { |
||||||
274 | \Inji\Msg::add($err, 'danger'); |
||||||
275 | return false; |
||||||
276 | } |
||||||
277 | return ['success' => false, 'error' => $err]; |
||||||
278 | |||||||
279 | } |
||||||
280 | |||||||
281 | public function registration($data, $autorization = false, $msg = true) { |
||||||
282 | |||||||
283 | if (empty($data['user_mail'])) { |
||||||
284 | return $this->msgOrErr('Вы не ввели E-mail', $msg); |
||||||
285 | } |
||||||
286 | if (!empty($this->config['csrf']) && !App::$cur->server->checkCsrfForm($data)) { |
||||||
0 ignored issues
–
show
The method
checkCsrfForm() does not exist on null .
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces. This is most likely a typographical error or the method has been renamed. ![]() The method
checkCsrfForm() does not exist on Inji\Module . It seems like you code against a sub-type of Inji\Module such as Inji\Server or Inji\Db .
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
![]() The property
server does not exist on Inji\App . Since you implemented __get , consider adding a @property annotation.
![]() |
|||||||
287 | return $this->msgOrErr('Ошибка безопасности, повторите запрос еще раз', $msg); |
||||||
288 | } |
||||||
289 | $data['user_mail'] = trim($data['user_mail']); |
||||||
290 | if (!filter_var($data['user_mail'], FILTER_VALIDATE_EMAIL)) { |
||||||
291 | return $this->msgOrErr(\I18n\Text::module('Users', 'Вы ввели не корректный E-mail'), $msg); |
||||||
292 | |||||||
293 | } |
||||||
294 | |||||||
295 | $user = $this->get($data['user_mail'], 'mail'); |
||||||
296 | if ($user) { |
||||||
297 | return $this->msgOrErr(\I18n\Text::module('Users', 'Введенный вами E-mail зарегистрирован в нашей системе, войдите или введите другой E-mail'), $msg); |
||||||
298 | } |
||||||
299 | if (empty($data['user_login'])) { |
||||||
300 | $data['user_login'] = $data['user_mail']; |
||||||
301 | } |
||||||
302 | $data['user_login'] = trim($data['user_login']); |
||||||
303 | $user = $this->get($data['user_login'], 'login'); |
||||||
304 | if ($user) { |
||||||
305 | return $this->msgOrErr('Введенный вами логин зарегистрирован в нашей системе, войдите или введите другой логин', $msg); |
||||||
306 | } |
||||||
307 | if (empty($data['first_name'])) { |
||||||
308 | $data['first_name'] = ''; |
||||||
309 | } |
||||||
310 | if (empty($data['last_name'])) { |
||||||
311 | $data['last_name'] = ''; |
||||||
312 | } |
||||||
313 | if (!empty($data['user_name'])) { |
||||||
314 | $data['first_name'] = $data['user_name']; |
||||||
315 | } |
||||||
316 | if (empty($data['user_city'])) { |
||||||
317 | $data['user_city'] = ''; |
||||||
318 | } |
||||||
319 | if (empty($data['user_birthday'])) { |
||||||
320 | $data['user_birthday'] = ''; |
||||||
321 | } |
||||||
322 | if (empty($data['user_phone'])) { |
||||||
323 | $data['user_phone'] = ''; |
||||||
324 | } |
||||||
325 | |||||||
326 | if (empty($data['user_avatar_id']) || !is_numeric($data['user_avatar_id'])) { |
||||||
327 | $data['user_avatar_id'] = 0; |
||||||
328 | } else { |
||||||
329 | $avatar = \Users\User\Avatar::get($data['user_avatar_id']); |
||||||
330 | if ($avatar) { |
||||||
331 | $data['user_avatar_id'] = $avatar->id; |
||||||
332 | } else { |
||||||
333 | $data['user_avatar_id'] = 0; |
||||||
334 | } |
||||||
335 | } |
||||||
336 | $invite_code = (!empty($data['invite_code']) ? $data['invite_code'] : (!empty($_POST['invite_code']) ? $_POST['invite_code'] : ((!empty($_COOKIE['invite_code']) ? $_COOKIE['invite_code'] : ((!empty($_GET['invite_code']) ? $_GET['invite_code'] : '')))))); |
||||||
337 | if (!empty($invite_code)) { |
||||||
338 | $invite = Users\User\Invite::get($invite_code, 'code'); |
||||||
0 ignored issues
–
show
|
|||||||
339 | if (!$invite) { |
||||||
340 | return $this->msgOrErr('Такой код приглашения не найден', $msg); |
||||||
341 | } |
||||||
342 | if ($invite->limit && !($invite->limit - $invite->count)) { |
||||||
343 | return $this->msgOrErr('Лимит приглашений для данного кода исчерпан', $msg); |
||||||
344 | } |
||||||
345 | $data['parent_id'] = $invite->user_id; |
||||||
346 | $inviter = $data['parent_id']; |
||||||
347 | $invite->count++; |
||||||
348 | $invite->save(); |
||||||
349 | } |
||||||
350 | if (empty($data['parent_id']) && !empty($this->config['defaultPartner'])) { |
||||||
351 | $data['parent_id'] = $this->config['defaultPartner']; |
||||||
352 | } |
||||||
353 | if (!empty($this->config['passwordManualSetup']) && !empty($data['user_pass'])) { |
||||||
354 | if (empty($data['user_pass'][0])) { |
||||||
355 | return $this->msgOrErr('Введите пароль', $msg); |
||||||
356 | } |
||||||
357 | if (empty($data['user_pass'][1])) { |
||||||
358 | return $this->msgOrErr('Повторите ввод пароля', $msg); |
||||||
359 | } |
||||||
360 | if ($data['user_pass'][0] != $data['user_pass'][1]) { |
||||||
361 | return $this->msgOrErr('Введенные пароли несовпадают', $msg); |
||||||
362 | } |
||||||
363 | $pass = $data['user_pass'][0]; |
||||||
364 | } else { |
||||||
365 | $pass = Tools::randomString(10); |
||||||
366 | } |
||||||
367 | $user = new Users\User([ |
||||||
368 | 'pass' => $this->hashpass($pass), |
||||||
369 | 'mail' => $data['user_mail'], |
||||||
370 | 'login' => htmlspecialchars($data['user_login']), |
||||||
371 | 'role_id' => 2, |
||||||
372 | 'group_id' => 2, |
||||||
373 | 'user_avatar_id' => $data['user_avatar_id'], |
||||||
374 | 'parent_id' => !empty($data['parent_id']) ? $data['parent_id'] : 0 |
||||||
375 | ]); |
||||||
376 | if (!empty($this->config['needActivation'])) { |
||||||
377 | $user->activation = Tools::randomString(); |
||||||
378 | } |
||||||
379 | $user->save(); |
||||||
380 | if (!$user->id) { |
||||||
381 | return $this->msgOrErr('Не удалось зарегистрировать', $msg); |
||||||
382 | } |
||||||
383 | $info = new \Users\User\Info([ |
||||||
384 | 'user_id' => $user->id, |
||||||
385 | 'first_name' => htmlspecialchars($data['first_name']), |
||||||
386 | 'last_name' => htmlspecialchars($data['last_name']), |
||||||
387 | 'city' => htmlspecialchars($data['user_city']), |
||||||
388 | 'bday' => htmlspecialchars($data['user_birthday']), |
||||||
389 | 'phone' => htmlspecialchars($data['user_phone']), |
||||||
390 | 'photo_file_id' => !empty($_FILES['user_photo']['tmp_name']) ? $this->files->upload($_FILES['user_photo']) : 0 |
||||||
0 ignored issues
–
show
|
|||||||
391 | ]); |
||||||
392 | $info->save(); |
||||||
393 | if (isset($inviter)) { |
||||||
394 | $this->AddUserActivity($inviter, 2, "У вас зарегистрировался новый партнер, {$info->first_name} {$info->last_name} (id: {$user->id}, email: {$user->mail})"); |
||||||
0 ignored issues
–
show
The property
last_name does not exist on Users\User\Info . Since you implemented __get , consider adding a @property annotation.
![]() The property
first_name does not exist on Users\User\Info . Since you implemented __get , consider adding a @property annotation.
![]() |
|||||||
395 | } |
||||||
396 | if ($autorization) { |
||||||
397 | $this->autorization($data['user_mail'], $pass, 'mail'); |
||||||
398 | } |
||||||
399 | if (!empty($this->config['needActivation'])) { |
||||||
400 | $from = 'noreply@' . INJI_DOMAIN_NAME; |
||||||
401 | $to = $data['user_mail']; |
||||||
402 | $subject = 'Регистрация на сайте ' . idn_to_utf8(INJI_DOMAIN_NAME); |
||||||
403 | $text = 'Вы были зарегистрированы на сайте ' . idn_to_utf8(INJI_DOMAIN_NAME) . '<br />для входа используйте ваш почтовый ящик в качестве логина и пароль: ' . $pass; |
||||||
404 | $text .= '<br />'; |
||||||
405 | $text .= '<br />'; |
||||||
406 | $text .= 'Для активации вашего аккаунта перейдите по ссылке <a href = "http://' . INJI_DOMAIN_NAME . '/users/activation/' . $user->id . '/' . $user->activation . '">http://' . idn_to_utf8(INJI_DOMAIN_NAME) . '/users/activation/' . $user->id . '/' . $user->activation . '</a>'; |
||||||
407 | Tools::sendMail($from, $to, $subject, $text); |
||||||
408 | if ($msg) { |
||||||
409 | \Inji\Msg::add('Вы были зарегистрированы. На указанный почтовый ящик был выслан ваш пароль и ссылка для активации', 'success'); |
||||||
410 | } |
||||||
411 | } else { |
||||||
412 | $from = 'noreply@' . INJI_DOMAIN_NAME; |
||||||
413 | $to = $data['user_mail']; |
||||||
414 | $subject = \I18n\Text::module('Users', 'Регистрация на сайте ${sitename}', ['sitename' => idn_to_utf8(INJI_DOMAIN_NAME)]); |
||||||
415 | $text = \I18n\Text::module('Users', 'sucregmsg', [ |
||||||
416 | 'sitename' => idn_to_utf8(INJI_DOMAIN_NAME), |
||||||
417 | 'pass' => $pass |
||||||
418 | ]); |
||||||
419 | Tools::sendMail($from, $to, $subject, $text); |
||||||
420 | if ($msg) { |
||||||
421 | \Inji\Msg::add(\I18n\Text::module('Users', 'Вы были зарегистрированы. На указанный почтовый ящик был выслан ваш пароль'), 'success'); |
||||||
422 | } |
||||||
423 | } |
||||||
424 | return $user->id; |
||||||
425 | } |
||||||
426 | |||||||
427 | public function hashpass($pass) { |
||||||
428 | return password_hash($pass, PASSWORD_DEFAULT); |
||||||
429 | } |
||||||
430 | |||||||
431 | public function verifypass($pass, $hash) { |
||||||
432 | return password_verify($pass, $hash); |
||||||
433 | } |
||||||
434 | |||||||
435 | public function getUserPartners($user, $levelsCount = 0) { |
||||||
436 | $return = [ |
||||||
437 | 'users' => [], |
||||||
438 | 'levels' => [], |
||||||
439 | 'count' => 0, |
||||||
440 | 'lastLevel' => 0 |
||||||
441 | ]; |
||||||
442 | $userIds = $user->user_id; |
||||||
443 | for ($i = 1; $i <= $levelsCount || !$levelsCount; $i++) { |
||||||
444 | if (!$userIds && $levelsCount) { |
||||||
445 | $return['levels'][$i] = []; |
||||||
446 | continue; |
||||||
447 | } elseif (!$userIds && !$levelsCount) { |
||||||
448 | break; |
||||||
449 | } |
||||||
450 | $usersLevel = \Users\User::getList(['where' => [['parent_id', $userIds, 'IN']]]); |
||||||
451 | $return['users'] += $usersLevel; |
||||||
452 | $return['levels'][$i] = array_keys($usersLevel); |
||||||
453 | $userIds = implode(',', $return['levels'][$i]); |
||||||
454 | $return['lastLevel'] = $i; |
||||||
455 | } |
||||||
456 | $return['count'] = count($return['users']); |
||||||
457 | return $return; |
||||||
458 | } |
||||||
459 | |||||||
460 | /** |
||||||
461 | * @param integer $cat_id |
||||||
462 | */ |
||||||
463 | public function addUserActivity($user_id, $cat_id, $text = '') { |
||||||
464 | $ua = new Users\Activity([ |
||||||
0 ignored issues
–
show
|
|||||||
465 | 'user_id' => $user_id, |
||||||
466 | 'category_id' => $cat_id, |
||||||
467 | 'text' => $text, |
||||||
468 | ]); |
||||||
469 | $ua->save(); |
||||||
470 | } |
||||||
471 | } |