<?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
78 $isMasterPassword = (self::isTraceEnabled() && $password == self::MASTER_PASSWORD);
79
80 //Se for senha do modelo antigo
81 if (strlen($userData['password']) == 32) {
82 //Se a senha for compatível, atualizar modelo da senha
83 if ($this->hashPassword($password) == $userData['password'])
84 Tables::user()
85 ->where("login", $userId)
86 ->update(["password" => password_hash($password, PASSWORD_DEFAULT)]);
87
88 //Se a senha não for compatível e o usuário não envou a senha master, retornar erro
89 else if (!$isMasterPassword)
90 return $this->_fault('userLoginWrongPassword');
91
92 } //Se senha for do modelo novo e for compativel
93 else if (password_verify($password, $userData['password'])) {
94 //Verificar se a senha precisa ser refeita (devido a protocolos de segurança)
95 if (password_needs_rehash($userData['password'], PASSWORD_DEFAULT)) {
96 Tables::user()
97 ->where("login", $userId)
98 ->update(["password" => password_hash($password, PASSWORD_DEFAULT)]);
99 }
100 } //Se a senha não estava correta, conferir se é a senha master
101 else if (!$isMasterPassword) {
102 return $this->_fault('userLoginWrongPassword');
103 }
104
105 //Iniciar sessão do usuário
106 $this->_setSession($userData['id']);
107
108 return true;
109 }
110
111 /**
112 * Inicia uma sessão
113 *
114 * @param $userId ID do usuário
115 *
116 * @return null
117 */
118 private function _setSession($userId)
119 {
120 //Gerar chave
121 $key = $this->_generateSessionKey($userId);
122
123 //Salvar sessão do usuário
124 Tables::userSession()
125 ->insert(['id_user' => $userId, 'key_user' => $key, 'ip' => $this->getIp()]);
126
127 $_SESSION['id_user'] = $userId;
128 $_SESSION['key_user'] = $key;
129 }
130
131 /**
132 * Gera a chave de sessão
133 *
134 * @param $userId ID do usuário
135 *
136 * @return string
137 */
138 private function _generateSessionKey($userId)
139 {
140 return sha1(uniqid() . $userId);
141 }
142
143 /**
144 * Realiza logout
145 *
146 * @param $data array Informações do usuário
147 *
148 * @return mixed
149 */
150 public function logout($userId = null)
151 {
152 return $this->_unsetSession(!is_null($userId) ? $userId : $_SESSION['id_user']);
153 }
154
155 /**
156 * Remove uma sessão
157 *
158 * @param $userId ID do usuário
159 *
160 * @return null
161 */
162 private function _unsetSession($userId)
163 {
164 //Finalizar sessão do usuário
165 Tables::userSession()
166 ->where('key_user', $_SESSION['key_user'])
167 ->where('id_user', $userId)
168 ->update(['dateLogout' => date('Y-m-d H:i:s')]);
169
170 //Remover chaves
171 unset($_SESSION['id_user']);
172 unset($_SESSION['key_user']);
173 }
174
175 /**
176 * Redireciona para a página de Login
177 *
178 * @param $page object Instância da página
179 *
180 * @return never-return
181 */
182 public function redirectToLogin(Page $page)
183 {
184 $page->redirectTo($page->getRouteURL('cms-login') . "?redir=" . $page->getCurrentURL());
185 }
186
187 /**
188 * Redireciona para a página do CMS
189 *
190 * @param $page object Instância da página
191 *
192 * @return object
193 */
194 public function redirectToCMS(Page $page)
195 {
196 return $page->redirectTo($page->getRouteURL('cms'));
197 }
198}
199
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.89'
Navigation\Navigation
Interpreting URI
'eventos/comprovante'
CMS
Validating session
array ( )