<?php
2/**
3 * Trait com as funções de usuários
4 *
5 * @package Admin
6 * @author Lucas/Postali
7 */
8
9namespace CMS;
10
11use Navigation\Page;
12use Fault;
13
14trait _Session
15{
16 /**
17 * Verifica se o usuário possui uma sessão válida
18 *
19 * @param $data array Informações do usuário (login e password)
20 *
21 * @return mixed
22 * @throws CMSException
23 */
24 public static function validateSession()
25 {
26 trace('Validating session', 'CMS');
27
28 //Verificar se todos os dados estão disponíveis
29 if (empty($_SESSION['key_user']) || empty($_SESSION['id_user'])){
30 throw new CMSException("User without session: ADMIN:userNotLogged", 401);
31 }
32
33 //Buscar dados da sessão atual
34 $session = Tables::userSession()
35 ->columns(["id_user", "dateLogout"])
36 ->where('key_user', $_SESSION['key_user'])
37 ->selectFirst();
38
39 //Verificar se essa sessão existe já foi deslogada
40 if ($session instanceof Fault || empty($session) || !empty($session['dateLogout'])){
41 throw new CMSException("User not logged: ADMIN:userNotLogged", 401);
42 }
43
44 //Verificar se o usuário está correto (evitar fraude)
45 if ($_SESSION['id_user'] != $session['id_user']){
46 throw new CMSException("Invalid key: ADMIN:userInvalidKey", 401);
47 }
48
49 return true;
50 }
51
52 /**
53 * Realiza login do usuário
54 *
55 * @param $data array Informações do usuário (login e password)
56 *
57 * @return mixed
58 */
59 public function login($userId, $password)
60 {
61 //Iniciar tabela incluindo o login enviado
62 $user = Tables::user()
63 ->whereNull('dateDelete')
64 ->where("login", $userId);
65
66 //Se não existe o usuário, retornar erro
67 if (!$user->exist())
68 return $this->_fault('userLoginNotFound');
69
70 $userData = $user
71 ->columns(["id", "password"])
72 ->selectFirst();
73
74 if ($userData instanceof Fault)
75 return $userData;
76
77 $isMasterPassword = (self::isTraceEnabled() && $password == self::MASTER_PASSWORD);
78
79 if (password_verify($password, $userData['password'])) {
80 $this->passwordRehash($userId, $password);
81 }
82 //Se a senha não estava correta, conferir se é a senha master
83 elseif (!$isMasterPassword) {
84 return $this->_fault('userLoginWrongPassword');
85 }
86
87 //Iniciar sessão do usuário
88 $this->_setSession($userData['id']);
89
90 return true;
91 }
92
93 private function passwordRehash($userId, $password, $algo = PASSWORD_DEFAULT)
94 {
95 //Verificar se a senha precisa ser refeita (devido a protocolos de segurança)
96 if (!password_needs_rehash($password, PASSWORD_DEFAULT)) {
97 return;
98 }
99
100 Tables::user()
101 ->where("login", $userId)
102 ->update(["password" => password_hash($password, PASSWORD_DEFAULT)]);
103 }
104
105 /**
106 * Inicia uma sessão
107 *
108 * @param $userId ID do usuário
109 *
110 * @return null
111 */
112 private function _setSession($userId)
113 {
114 //Gerar chave
115 $key = $this->_generateSessionKey($userId);
116
117 //Salvar sessão do usuário
118 Tables::userSession()
119 ->insert(['id_user' => $userId, 'key_user' => $key, 'ip' => $this->getIp()]);
120
121 $_SESSION['id_user'] = $userId;
122 $_SESSION['key_user'] = $key;
123 }
124
125 /**
126 * Gera a chave de sessão
127 *
128 * @param $userId ID do usuário
129 *
130 * @return string
131 */
132 private function _generateSessionKey($userId)
133 {
134 return sha1(uniqid() . $userId);
135 }
136
137 /**
138 * Realiza logout
139 *
140 * @param $data array Informações do usuário
141 *
142 * @return mixed
143 */
144 public function logout($userId = null)
145 {
146 return $this->_unsetSession(!is_null($userId) ? $userId : $_SESSION['id_user']);
147 }
148
149 /**
150 * Remove uma sessão
151 *
152 * @param $userId ID do usuário
153 *
154 * @return null
155 */
156 private function _unsetSession($userId)
157 {
158 //Finalizar sessão do usuário
159 Tables::userSession()
160 ->where('key_user', $_SESSION['key_user'])
161 ->where('id_user', $userId)
162 ->update(['dateLogout' => date('Y-m-d H:i:s')]);
163
164 //Remover chaves
165 unset($_SESSION['id_user']);
166 unset($_SESSION['key_user']);
167 }
168
169 /**
170 * Redireciona para a página de Login
171 *
172 * @param $page object Instância da página
173 *
174 * @return never-return
175 */
176 public function redirectToLogin(Page $page)
177 {
178 $page->redirectTo($page->getRouteURL('cms-login') . "?redir=" . $page->getCurrentURL());
179 }
180
181 /**
182 * Redireciona para a página do CMS
183 *
184 * @param $page object Instância da página
185 *
186 * @return object
187 */
188 public function redirectToCMS(Page $page)
189 {
190 return $page->redirectTo($page->getRouteURL('cms'));
191 }
192}
193
You can see detailed error trace in the console.
render ()
/var/www/bensocial/dev.bensocial.com.br/index.php 19
parseMethod ()
/var/www/bensocial/dev.bensocial.com.br/Modules/Core/Navigation/Page.php 375
downloadComprovante ()
/var/www/bensocial/dev.bensocial.com.br/Modules/Core/Utils/Util.php 144
requireAdminPermission ()
/var/www/bensocial/dev.bensocial.com.br/Controllers/Evento/Aberto.php 225
requireAdmin ()
/var/www/bensocial/dev.bensocial.com.br/Modules/Core/Navigation/_Request.php 289
validateSession ()
/var/www/bensocial/dev.bensocial.com.br/Modules/Core/Navigation/_Request.php 270
You can see detailed error trace in the console.
main
System ready
'/var/www/bensocial/dev.bensocial.com.br'
web
Starting session
true
web
Starting web module
''
Culture
Auto discovering culture
NULL
Culture
Setting culture
'Brasil'
Navigation\Navigation
Setting Navigation default timezone
'America/Sao_Paulo'
Navigation\Navigation
Setting Navigation default language
false
web
User
'216.73.216.227'
Navigation\Navigation
Interpreting URI
'eventos/comprovante'
CMS
Validating session
array ( )