Commit 3899599d1e3b0e29f4626e77f35515c42ab000fb

Authored by Lucas D'Avila
1 parent f0337155
Exists in master

Implementado recuperação de senha do usuário / refatorado lógica de login, para evitar sql injection

ieducar/intranet/include/clsControlador.inc.php
1 -<?php  
2 -  
3 -/*  
4 - * i-Educar - Sistema de gestão escolar  
5 - *  
6 - * Copyright (C) 2006 Prefeitura Municipal de Itajaí  
7 - * <ctima@itajai.sc.gov.br>  
8 - *  
9 - * Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo  
10 - * sob os termos da Licença Pública Geral GNU conforme publicada pela Free  
11 - * Software Foundation; tanto a versão 2 da Licença, como (a seu critério)  
12 - * qualquer versão posterior.  
13 - *  
14 - * Este programa é distribuí­do na expectativa de que seja útil, porém, SEM  
15 - * NENHUMA GARANTIA; nem mesmo a garantia implí­cita de COMERCIABILIDADE OU  
16 - * ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral  
17 - * do GNU para mais detalhes.  
18 - *  
19 - * Você deve ter recebido uma cópia da Licença Pública Geral do GNU junto  
20 - * com este programa; se não, escreva para a Free Software Foundation, Inc., no  
21 - * endereço 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA.  
22 - */  
23 -  
24 -require_once 'include/clsBanco.inc.php';  
25 -  
26 -  
27 -/**  
28 - * clsControlador class.  
29 - *  
30 - * @author Prefeitura Municipal de Itajaí <ctima@itajai.sc.gov.br>  
31 - * @license http://creativecommons.org/licenses/GPL/2.0/legalcode.pt CC GNU GPL  
32 - * @package Core  
33 - * @since Classe disponível desde a versão 1.0.0  
34 - * @version $Id$  
35 - */  
36 -class clsControlador  
37 -{  
38 -  
39 - /**  
40 - * @var boolean  
41 - */  
42 - public $logado;  
43 -  
44 - /**  
45 - * @var string  
46 - */  
47 - public $erroMsg;  
48 -  
49 -  
50 - /**  
51 - * Construtor.  
52 - */  
53 - public function clsControlador()  
54 - {  
55 - @session_set_cookie_params(1200);  
56 - @session_start();  
57 -  
58 - if ('logado' == $_SESSION['itj_controle']) {  
59 - $this->logado = TRUE;  
60 - }  
61 - else {  
62 - $this->logado = FALSE;  
63 - }  
64 -  
65 - // Controle dos menus  
66 - if (isset($_GET['mudamenu']) && isset($_GET['categoria']) && isset($_GET['acao']))  
67 - {  
68 - if ($_GET['acao']) {  
69 - $_SESSION['menu_opt'][$_GET['categoria']] = 1;  
70 - $_SESSION['menu_atual'] = $_GET['categoria'];  
71 - }  
72 - else {  
73 - // Está apagando variável session com o índice dado por $_GET  
74 - unset($_SESSION['menu_opt'][$_GET['categoria']]);  
75 - if ($_SESSION['menu_atual'] == $_GET['categoria']) {  
76 - unset($_SESSION['menu_atual']);  
77 - }  
78 - }  
79 -  
80 - $db = new clsBanco();  
81 - if (isset($_SESSION['id_pessoa'])) {  
82 - $db->Consulta("UPDATE funcionario SET opcao_menu = '" . serialize( $_SESSION['menu_opt'] ) . "' WHERE ref_cod_pessoa_fj = '" . $_SESSION['id_pessoa'] . "'");  
83 - }  
84 - }  
85 -  
86 - session_write_close();  
87 - }  
88 -  
89 - /**  
90 - * Retorna TRUE para usuário logado  
91 - * @return boolean  
92 - */  
93 - public function Logado()  
94 - {  
95 - return $this->logado;  
96 - }  
97 -  
98 - /**  
99 - * Faz o login do usuário.  
100 - * @param mixed $acao  
101 - */  
102 - public function Logar($acao)  
103 - {  
104 - if ($acao)  
105 - {  
106 - $login = @$_POST['login'];  
107 - $senha = md5(@$_POST['senha']);  
108 - $db = new clsBanco();  
109 -  
110 - $db->Consulta("SELECT ref_cod_pessoa_fj FROM funcionario WHERE matricula = '{$login}'");  
111 - if ($db->ProximoRegistro())  
112 - {  
113 - list($idpes) = $db->Tupla();  
114 -  
115 - // Padrão: meia hora atrás  
116 - $intervalo = date("Y-m-d H:i", time() - (60 * 1 ));  
117 -  
118 - // Se o último login bem sucedido foi em menos de meia hora, conta somente dali para a frente  
119 - $db->consulta("SELECT data_hora FROM acesso WHERE cod_pessoa = '{$idpes}' AND data_hora > '{$intervalo}' AND sucesso = 't' ORDER BY data_hora DESC LIMIT 1" );  
120 - if ($db->Num_Linhas()) {  
121 - $db->ProximoRegistro();  
122 - list($intervalo) = $db->Tupla();  
123 - }  
124 -  
125 - // Trava usuário se tentar login mais de 5 vezes  
126 - $tentativas = $db->CampoUnico("SELECT COUNT(0) FROM acesso WHERE cod_pessoa = '{$idpes}' AND data_hora > '{$intervalo}' AND sucesso = 'f'" );  
127 - if ($tentativas > 5)  
128 - {  
129 - $hora_ultima_tentativa = $db->CampoUnico("SELECT data_hora FROM acesso WHERE cod_pessoa = '{$idpes}' ORDER BY data_hora DESC LIMIT 1 OFFSET 4" );  
130 - $hora_ultima_tentativa = explode(".",$hora_ultima_tentativa);  
131 - $hora_ultima_tentativa = $hora_ultima_tentativa[0];  
132 -  
133 - $data_libera = date("d/m/Y H:i",  
134 - strtotime($hora_ultima_tentativa) + (60 * 30));  
135 -  
136 - die("<html><body></body><script>alert('Houveram mais de 5 tentativas frustradas de acessar a sua conta na última meia hora.\\nPor segurança, sua conta ficará interditada até: {$data_libera}');document.location.href='/intranet';</script></html>");  
137 - }  
138 -  
139 - $db->Consulta( "SELECT ref_cod_pessoa_fj, opcao_menu, ativo, tempo_expira_senha, tempo_expira_conta, data_troca_senha, data_reativa_conta, proibido, ref_cod_setor_new, tipo_menu FROM funcionario WHERE ref_cod_pessoa_fj = '{$idpes}' AND senha = '{$senha}'" );  
140 - if ($db->ProximoRegistro())  
141 - {  
142 - list($id_pessoa, $opcaomenu, $ativo, $tempo_senha,  
143 - $tempo_conta, $data_senha, $data_conta, $proibido,  
144 - $setor_new, $tipo_menu) = $db->Tupla();  
145 -  
146 - if (!$proibido)  
147 - {  
148 - if ($ativo)  
149 - {  
150 - // Usuário ativo, verifica se a conta expirou  
151 - $expirada = FALSE;  
152 - if (!empty($tempo_conta) && !empty($data_conta))  
153 - {  
154 - if (time() - strtotime($data_conta) > $tempo_conta * 60 * 60 * 24) {  
155 - // Conta expirada  
156 - $db->Consulta("UPDATE funcionario SET ativo='0' WHERE ref_cod_pessoa_fj = '$id_pessoa'");  
157 - die("<html><body></body><script>alert( 'Sua conta na intranet expirou.\nContacte um administrador para reativa-la.' );document.location.href='/intranet';</script></html>");  
158 - }  
159 - }  
160 -  
161 - // Vendo se a senha não expirou  
162 - if (!empty($tempo_senha) && ! empty($data_senha)) {  
163 - if (time() - strtotime($data_senha) > $tempo_senha * 60 * 60 * 24) {  
164 - // Senha expirada, pede que mude a senha  
165 - die("<html><body><form id='reenvio' name='reenvio' action='usuario_trocasenha.php' method='POST'><input type='hidden' name='cod_pessoa' value='{$id_pessoa}'></form></body><script>document.getElementById('reenvio').submit();</script></html>");  
166 - }  
167 - }  
168 -  
169 - // Pega o endereço IP do host, primeiro com HTTP_X_FORWARDED_FOR (para pegar o IP real  
170 - // caso o host esteja atrás de um proxy)  
171 - if (isset($_SERVER['HTTP_X_FORWARDED_FOR']) && $_SERVER['HTTP_X_FORWARDED_FOR'] != '') {  
172 - // No caso de múltiplos IPs, pega o último da lista  
173 - $ip = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);  
174 - $ip_maquina = trim(array_pop($ip));  
175 - }  
176 - else {  
177 - $ip_maquina = $_SERVER['REMOTE_ADDR'];  
178 - }  
179 -  
180 - $sql = "SELECT ip_logado, data_login FROM funcionario WHERE ref_cod_pessoa_fj = {$id_pessoa}";  
181 - $db2 = new clsBanco();  
182 - $db2->Consulta($sql);  
183 - while ($db2->ProximoRegistro())  
184 - {  
185 - list($ip_banco, $data_login) = $db2->Tupla();  
186 - if ($ip_banco)  
187 - {  
188 - if (abs(time() - strftime("now") - strtotime($data_login)) <= 10 * 60  
189 - && $ip_banco != $ip_maquina) {  
190 - die("<html><body></body><script>alert('Conta já em uso.\\nTente novamente mais tarde');document.location.href='/intranet';</script></html>");  
191 - }  
192 - else {  
193 - $sql = "UPDATE funcionario SET data_login = NOW() WHERE ref_cod_pessoa_fj = {$id_pessoa}";  
194 - $db2->Consulta($sql);  
195 - }  
196 - }  
197 - else {  
198 - $sql = "UPDATE funcionario SET ip_logado = '{$ip_maquina}', data_login = NOW() WHERE ref_cod_pessoa_fj = {$id_pessoa}";  
199 - $db2->Consulta($sql);  
200 - }  
201 - }  
202 -  
203 - // Login do usuário, grava dados na sessão  
204 - @session_start();  
205 - $_SESSION = array();  
206 - $_SESSION['itj_controle'] = 'logado';  
207 - $_SESSION['id_pessoa'] = $id_pessoa;  
208 - $_SESSION['pessoa_setor'] = $setor_new;  
209 - $_SESSION['menu_opt'] = unserialize( $opcaomenu );  
210 - $_SESSION['tipo_menu'] = $tipo_menu;  
211 - @session_write_close();  
212 -  
213 - $this->logado = TRUE;  
214 - }  
215 - else  
216 - {  
217 - if (!empty($tempo_conta) && !empty($data_conta))  
218 - {  
219 - if (time() - strtotime( $data_conta ) > $tempo_conta * 60 * 60 * 24) {  
220 - $this->erroMsg = "Sua conta expirou. Contacte o administrador para reativá-la.";  
221 - $expirada = 1;  
222 - }  
223 - else {  
224 - $this->erroMsg = "Sua conta n&atilde;o est&aacute; ativa. Use a op&ccedil;&atilde;o 'Nunca usei a intrenet'.";  
225 - $expirada = 0;  
226 - }  
227 - }  
228 - }  
229 - }  
230 - else  
231 - {  
232 - $this->erroMsg = "Imposs&iacute;vel realizar login.";  
233 - $this->logado = FALSE;  
234 - }  
235 - }  
236 - else  
237 - {  
238 - if (isset($_SERVER['HTTP_X_FORWARDED_FOR']) && $_SERVER['HTTP_X_FORWARDED_FOR'] != '') {  
239 - // No caso de múltiplos IPs, pega o último da lista  
240 - $ip = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);  
241 - $ip_de_rede = trim(array_pop($ip));  
242 - }  
243 -  
244 - $ip = empty($_SERVER['REMOTE_ADDR']) ? 'NULL' : $_SERVER['REMOTE_ADDR'];  
245 - $ip_de_rede = empty($ip_de_rede) ? 'NULL' : $ip_de_rede;  
246 -  
247 - $db->Consulta("INSERT INTO acesso (data_hora, ip_externo, ip_interno, cod_pessoa, sucesso) VALUES (now(), '{$ip}', '{$ip_de_rede}', {$idpes}, 'f')");  
248 -  
249 - $this->erroMsg = 'Login ou Senha incorretos.';  
250 - $this->logado = FALSE;  
251 - }  
252 - }  
253 - else {  
254 - $this->erroMsg = "Login ou Senha incorretos.";  
255 - $this->logado = FALSE;  
256 - }  
257 - }  
258 - else  
259 - {  
260 - $arquivo = 'templates/nvp_htmlloginintranet.tpl';  
261 - $ptrTpl = fopen($arquivo, "r");  
262 - $strArquivo = fread($ptrTpl, filesize($arquivo));  
263 -  
264 - if ($this->erroMsg) {  
265 - $strArquivo = str_replace( "<!-- #&ERROLOGIN&# -->", $this->erroMsg, $strArquivo );  
266 - }  
267 -  
268 - fclose($ptrTpl);  
269 - die($strArquivo);  
270 - // @todo  
271 - #throw new Exception($strArquivo);  
272 - }  
273 - }  
274 -  
275 - /**  
276 - * Executa o login do usuário.  
277 - */  
278 - public function obriga_Login()  
279 - {  
280 - if ($_POST['login'] && $_POST['senha']) {  
281 - $this->logar(TRUE);  
282 - }  
283 - if (!$this->logado) {  
284 - $this->logar(FALSE);  
285 - }  
286 - }  
287 -  
288 -}  
289 \ No newline at end of file 1 \ No newline at end of file
  2 +<?php
  3 +
  4 +/*
  5 + * i-Educar - Sistema de gestão escolar
  6 + *
  7 + * Copyright (C) 2006 Prefeitura Municipal de Itajaí
  8 + * <ctima@itajai.sc.gov.br>
  9 + *
  10 + * Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo
  11 + * sob os termos da Licença Pública Geral GNU conforme publicada pela Free
  12 + * Software Foundation; tanto a versão 2 da Licença, como (a seu critério)
  13 + * qualquer versão posterior.
  14 + *
  15 + * Este programa é distribuí­do na expectativa de que seja útil, porém, SEM
  16 + * NENHUMA GARANTIA; nem mesmo a garantia implí­cita de COMERCIABILIDADE OU
  17 + * ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral
  18 + * do GNU para mais detalhes.
  19 + *
  20 + * Você deve ter recebido uma cópia da Licença Pública Geral do GNU junto
  21 + * com este programa; se não, escreva para a Free Software Foundation, Inc., no
  22 + * endereço 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA.
  23 + */
  24 +
  25 +require_once 'include/clsBanco.inc.php';
  26 +require_once 'Portabilis/Messenger.php';
  27 +require_once 'Portabilis/Mailer.php';
  28 +require_once 'Portabilis/Utils/User.php';
  29 +require_once 'Portabilis/Utils/ReCaptcha.php';
  30 +
  31 +/**
  32 + * clsControlador class.
  33 + *
  34 + * @author Prefeitura Municipal de Itajaí <ctima@itajai.sc.gov.br>
  35 + * @license http://creativecommons.org/licenses/GPL/2.0/legalcode.pt CC GNU GPL
  36 + * @package Core
  37 + * @since Classe disponível desde a versão 1.0.0
  38 + * @version $Id: /ieducar/branches/1.1.0-avaliacao/ieducar/intranet/include/clsControlador.inc.php 662 2009-11-17T18:28:48.404882Z eriksen $
  39 + */
  40 +class clsControlador
  41 +{
  42 +
  43 + /**
  44 + * @var boolean
  45 + */
  46 + public $logado;
  47 +
  48 + /**
  49 + * @var string
  50 + */
  51 + public $erroMsg;
  52 +
  53 +
  54 + /**
  55 + * Construtor.
  56 + */
  57 + public function clsControlador()
  58 + {
  59 +
  60 + /*
  61 + Desabilitado esta linha para usar o valor setado no php.ini > session.cookie_lifetime
  62 + @session_set_cookie_params(200);
  63 + */
  64 +
  65 + @session_start();
  66 +
  67 + if ('logado' == $_SESSION['itj_controle']) {
  68 + $this->logado = TRUE;
  69 + }
  70 + else {
  71 + $this->logado = FALSE;
  72 + }
  73 +
  74 + // Controle dos menus
  75 + if (isset($_GET['mudamenu']) && isset($_GET['categoria']) && isset($_GET['acao']))
  76 + {
  77 + if ($_GET['acao']) {
  78 + $_SESSION['menu_opt'][$_GET['categoria']] = 1;
  79 + $_SESSION['menu_atual'] = $_GET['categoria'];
  80 + }
  81 + else {
  82 + // Está apagando variável session com o índice dado por $_GET
  83 + unset($_SESSION['menu_opt'][$_GET['categoria']]);
  84 + if ($_SESSION['menu_atual'] == $_GET['categoria']) {
  85 + unset($_SESSION['menu_atual']);
  86 + }
  87 + }
  88 +
  89 + $db = new clsBanco();
  90 + if (isset($_SESSION['id_pessoa'])) {
  91 + $db->Consulta("UPDATE funcionario SET opcao_menu = '" . serialize( $_SESSION['menu_opt'] ) . "' WHERE ref_cod_pessoa_fj = '" . $_SESSION['id_pessoa'] . "'");
  92 + }
  93 + }
  94 +
  95 + session_write_close();
  96 +
  97 + $this->_maximoTentativasFalhas = 7;
  98 + $this->messenger = new Portabilis_Messenger();
  99 + }
  100 +
  101 +
  102 + /**
  103 + * Retorna TRUE para usuário logado
  104 + * @return boolean
  105 + */
  106 + public function Logado()
  107 + {
  108 + return $this->logado;
  109 + }
  110 +
  111 +
  112 + /**
  113 + * Executa o login do usuário.
  114 + */
  115 + public function obriga_Login()
  116 + {
  117 + if (! $this->logado)
  118 + $validateUserCredentials = false;
  119 +
  120 + elseif ($_POST['login'] && $_POST['senha'])
  121 + $validateUserCredentials = true;
  122 +
  123 + $this->logar($validateUserCredentials);
  124 + }
  125 +
  126 +
  127 + // novo metodo login, logica quebrada em metodos menores
  128 + public function Logar($validateUserCredentials) {
  129 + if ($validateUserCredentials) {
  130 + $user = $this->validateUserCredentials($username = @$_POST['login'], $password = md5(@$_POST['senha']));
  131 +
  132 + if ($this->canStartLoginSession($user)) {
  133 + $this->startLoginSession($user);
  134 + return null;
  135 + }
  136 + }
  137 +
  138 + $this->renderLoginPage();
  139 + }
  140 +
  141 +
  142 + // valida se o usuário e senha informados, existem no banco de dados.
  143 + protected function validateUserCredentials($username, $password) {
  144 + if (! $this->validateHumanAccess()) {
  145 + $msg = "Você errou a senha muitas vezes, por favor, preencha o campo de " .
  146 + "confirmação visual ou <a class='light decorated' href='/module/Usuario/Rede" .
  147 + "finirSenha'>redefina sua senha</a>.";
  148 + $this->messenger->append($msg, "error", false, "error");
  149 + }
  150 +
  151 + else {
  152 + $user = Portabilis_Utils_User::loadUsingCredentials($username, $password);
  153 +
  154 + if (is_null($user)) {
  155 + $this->messenger->append("Usuário ou senha incorreta.", "error");
  156 + $this->incrementTentativasLogin();
  157 + }
  158 + else {
  159 + $this->unsetTentativasLogin();
  160 + return $user;
  161 + }
  162 + }
  163 +
  164 + return false;
  165 + }
  166 +
  167 +
  168 + public function startLoginSession($user, $redirectTo = '') {
  169 + // unsetting login attempts here, because when the password is recovered the login attempts should be reseted.
  170 + $this->unsetTentativasLogin();
  171 +
  172 + @session_start();
  173 + $_SESSION = array();
  174 + $_SESSION['itj_controle'] = 'logado';
  175 + $_SESSION['id_pessoa'] = $user['id'];
  176 + $_SESSION['pessoa_setor'] = $user['ref_cod_setor_new'];
  177 + $_SESSION['menu_opt'] = unserialize($user['opcao_menu']);
  178 + $_SESSION['tipo_menu'] = $user['tipo_menu'];
  179 + @session_write_close();
  180 +
  181 + Portabilis_Utils_User::logAccessFor($user['id']);
  182 + Portabilis_Utils_User::destroyStatusTokenFor($user['id'], 'redefinir_senha');
  183 +
  184 + $this->logado = true;
  185 + $this->messenger->append("Usuário logado com sucesso.", "success");
  186 +
  187 + // solicita email para recuperação de senha, caso usuário ainda não tenha informado.
  188 + if (! filter_var($user['email'], FILTER_VALIDATE_EMAIL))
  189 + header("Location: /module/Usuario/AlterarEmail");
  190 +
  191 + elseif($user['expired_password'])
  192 + header("Location: /module/Usuario/AlterarSenha");
  193 +
  194 + elseif(! empty($redirectTo))
  195 + header("Location: $redirectTo");
  196 + }
  197 +
  198 +
  199 + public function canStartLoginSession($user) {
  200 + if (! $this->messenger->hasMsgWithType("error")) {
  201 + $this->checkForDisabledAccount($user);
  202 + $this->checkForBannedAccount($user);
  203 + $this->checkForExpiredAccount($user);
  204 + $this->checkForMultipleAccess($user);
  205 + // #TODO verificar se conta nunca usada (exibir "Sua conta n&atilde;o est&aacute; ativa. Use a op&ccedil;&atilde;o 'Nunca usei a intrenet'." ?)
  206 + }
  207 +
  208 + return ! $this->messenger->hasMsgWithType("error");
  209 + }
  210 +
  211 +
  212 + // renderiza o template de login, com as mensagens adicionadas durante validações
  213 + protected function renderLoginPage() {
  214 + $this->destroyLoginSession();
  215 +
  216 + $templateName = 'templates/nvp_htmlloginintranet.tpl';
  217 + $templateFile = fopen($templateName, "r");
  218 + $templateText = fread($templateFile, filesize($templateName));
  219 + $templateText = str_replace( "<!-- #&ERROLOGIN&# -->", $this->messenger->toHtml('p'), $templateText);
  220 + $templateText = str_replace( "#&GOOGLE_ANALYTICS_DOMAIN_NAME&#", $_SERVER['HTTP_HOST'], $templateText);
  221 +
  222 + $requiresHumanAccessValidation = isset($_SESSION['tentativas_login_falhas']) &&
  223 + is_numeric($_SESSION['tentativas_login_falhas']) &&
  224 + $_SESSION['tentativas_login_falhas'] >= $this->_maximoTentativasFalhas;
  225 +
  226 + if ($requiresHumanAccessValidation)
  227 + $templateText = str_replace( "<!-- #&RECAPTCHA&# -->", Portabilis_Utils_ReCaptcha::getWidget(), $templateText);
  228 +
  229 + fclose($templateFile);
  230 + die($templateText);
  231 + }
  232 +
  233 +
  234 + protected function destroyLoginSession($addMsg = false) {
  235 + $tentativasLoginFalhas = $_SESSION['tentativas_login_falhas'];
  236 +
  237 + @session_start();
  238 + $_SESSION = array();
  239 + @session_destroy();
  240 +
  241 + //mantem tentativas_login_falhas, até que senha senha informada corretamente
  242 + @session_start();
  243 + $_SESSION['tentativas_login_falhas'] = $tentativasLoginFalhas;
  244 + @session_write_close();
  245 +
  246 + if ($addMsg)
  247 + $this->messenger->append("Usuário deslogado com sucesso.", "success");
  248 + }
  249 +
  250 +
  251 + protected function getClientIP() {
  252 + if (isset($_SERVER['HTTP_X_FORWARDED_FOR']) && $_SERVER['HTTP_X_FORWARDED_FOR'] != '') {
  253 + // pega o (ultimo) IP real caso o host esteja atrás de um proxy
  254 + $ip = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
  255 + $ip = trim(array_pop($ip));
  256 + }
  257 + else
  258 + $ip = $_SERVER['REMOTE_ADDR'];
  259 + return $ip;
  260 + }
  261 +
  262 +
  263 + protected function validateHumanAccess() {
  264 + $result = false;
  265 +
  266 + if (! $this->atingiuTentativasLogin())
  267 + $result = true;
  268 +
  269 + elseif (Portabilis_Utils_ReCaptcha::getWidget()->validate()) {
  270 + $this->unsetTentativasLogin();
  271 + $result = true;
  272 + }
  273 +
  274 + return $result;
  275 + }
  276 +
  277 +
  278 + protected function atingiuTentativasLogin() {
  279 + return isset($_SESSION['tentativas_login_falhas']) &&
  280 + is_numeric($_SESSION['tentativas_login_falhas']) &&
  281 + $_SESSION['tentativas_login_falhas'] >= $this->_maximoTentativasFalhas;
  282 + }
  283 +
  284 +
  285 + protected function incrementTentativasLogin() {
  286 + @session_start();
  287 + if (! isset($_SESSION['tentativas_login_falhas']) or ! is_numeric($_SESSION['tentativas_login_falhas']))
  288 + $_SESSION['tentativas_login_falhas'] = 1;
  289 + else
  290 + $_SESSION['tentativas_login_falhas'] += 1;
  291 + @session_write_close();
  292 + }
  293 +
  294 +
  295 + protected function unsetTentativasLogin() {
  296 + @session_start();
  297 + unset($_SESSION['tentativas_login_falhas']);
  298 + @session_write_close();
  299 + }
  300 +
  301 +
  302 + protected function checkForDisabledAccount($user) {
  303 + if ($user['ativo'] != '1') {
  304 + $this->messenger->append("Sua conta de usuário foi desativada ou expirou, por favor, " .
  305 + "entre em contato com o responsável pelo sistema do seu município.", "error", false, "error");
  306 + }
  307 + }
  308 +
  309 +
  310 + protected function checkForBannedAccount($user) {
  311 + if ($user['proibido'] != '0') {
  312 + $this->messenger->append("Sua conta de usuário não pode mais acessar o sistema, " .
  313 + "por favor, entre em contato com o responsável pelo sistema do seu município.",
  314 + "error", false, "error");
  315 + }
  316 + }
  317 +
  318 +
  319 + protected function checkForExpiredAccount($user) {
  320 + if($user['expired_account']) {
  321 +
  322 + if ($user['ativo'] == 1)
  323 + Portabilis_Utils_User::disableAccount($user['id']);
  324 +
  325 + $this->messenger->append("Sua conta de usuário expirou, por favor, " .
  326 + "entre em contato com o responsável pelo sistema do seu município.", "error", false, "error");
  327 + }
  328 + }
  329 +
  330 +
  331 + protected function checkForMultipleAccess($user) {
  332 + // considera como acesso multiplo, acesso em diferentes IPs em menos de $tempoMultiploAcesso minutos
  333 + $tempoMultiploAcesso = 10;
  334 + $tempoEmEspera = abs(time() - strftime("now") - strtotime($user['data_login'])) / 60;
  335 +
  336 + $multiploAcesso = $tempoEmEspera <= $tempoMultiploAcesso &&
  337 + $user['ip_ultimo_acesso'] != $this->getClientIP();
  338 +
  339 + if ($multiploAcesso and $user['super']) {
  340 +
  341 + // #TODO mover lógica email, para mailer especifico
  342 +
  343 + $subject = "Conta do super usuário {$_SERVER['HTTP_HOST']} acessada em mais de um local";
  344 +
  345 + $message = ("Aparentemente a conta do super usuário {$user['matricula']} foi acessada em " .
  346 + "outro computador nos últimos $tempoMultiploAcesso " .
  347 + "minutos, caso não tenha sido você, por favor, altere sua senha.\n\n" .
  348 + "Endereço IP último acesso: {$user['ip_ultimo_acesso']}\n".
  349 + "Endereço IP acesso atual: {$this->getClientIP()}");
  350 +
  351 + $mailer = new Portabilis_Mailer();
  352 + $mailer->sendMail($user['email'], $subject, $message);
  353 + }
  354 + elseif ($multiploAcesso) {
  355 + $minutosEmEspera = round($tempoMultiploAcesso - $tempoEmEspera) + 1;
  356 + $this->messenger->append("Aparentemente sua conta foi acessada em outro computador nos últimos " .
  357 + "$tempoMultiploAcesso minutos, caso não tenha sido você, " .
  358 + "por favor, altere sua senha ou tente novamente em $minutosEmEspera minutos",
  359 + "error", false, "error");
  360 + }
  361 + }
  362 +
  363 +}
ieducar/lib/CoreExt/Validate/Email.php 0 → 100644
@@ -0,0 +1,73 @@ @@ -0,0 +1,73 @@
  1 +<?php
  2 +
  3 +/**
  4 + * i-Educar - Sistema de gestão escolar
  5 + *
  6 + * Copyright (C) 2006 Prefeitura Municipal de Itajaí
  7 + * <ctima@itajai.sc.gov.br>
  8 + *
  9 + * Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo
  10 + * sob os termos da Licença Pública Geral GNU conforme publicada pela Free
  11 + * Software Foundation; tanto a versão 2 da Licença, como (a seu critério)
  12 + * qualquer versão posterior.
  13 + *
  14 + * Este programa é distribuí­do na expectativa de que seja útil, porém, SEM
  15 + * NENHUMA GARANTIA; nem mesmo a garantia implí­cita de COMERCIABILIDADE OU
  16 + * ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral
  17 + * do GNU para mais detalhes.
  18 + *
  19 + * Você deve ter recebido uma cópia da Licença Pública Geral do GNU junto
  20 + * com este programa; se não, escreva para a Free Software Foundation, Inc., no
  21 + * endereço 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA.
  22 + *
  23 + * @author Lucas D'Avila <lucasdavila@portabiilis.com.br>
  24 + * @category i-Educar
  25 + * @license @@license@@
  26 + * @package CoreExt_Validate
  27 + * @since Arquivo disponível desde a versão 1.1.0
  28 + * @version $Id$
  29 + */
  30 +
  31 +require_once 'CoreExt/Validate/Abstract.php';
  32 +
  33 +/**
  34 + * CoreExt_Validate_Numeric class.
  35 + *
  36 + * @author Eriksen Costa Paixão <eriksen.paixao_bs@cobra.com.br>
  37 + * @category i-Educar
  38 + * @license @@license@@
  39 + * @package CoreExt_Validate
  40 + * @since Classe disponível desde a versão 1.1.0
  41 + * @version @@package_version@@
  42 + */
  43 +class CoreExt_Validate_Email extends CoreExt_Validate_Abstract
  44 +{
  45 + /**
  46 + * @see CoreExt_Validate_Abstract#_getDefaultOptions()
  47 + */
  48 + protected function _getDefaultOptions()
  49 + {
  50 + return array(
  51 + 'invalid' => 'Email inválido.'
  52 + );
  53 + }
  54 +
  55 + /**
  56 + * @see CoreExt_DataMapper#_getFindStatment($pkey) Sobre a conversão com floatval()
  57 + * @see CoreExt_Validate_Abstract#_validate($value)
  58 + */
  59 + protected function _validate($value)
  60 + {
  61 + if (FALSE === filter_var($value, FILTER_VALIDATE_EMAIL)) {
  62 + throw new Exception($this->_getErrorMessage('invalid'));
  63 + }
  64 +
  65 + return TRUE;
  66 + }
  67 +
  68 + /**
  69 + * Mensagem padrão para erros de valor obrigatório.
  70 + * @var string
  71 + */
  72 + protected $_requiredMessage = 'Informe um email válido.';
  73 +}
ieducar/modules/Usuario/Mailers/UsuarioMailer.php 0 → 100644
@@ -0,0 +1,59 @@ @@ -0,0 +1,59 @@
  1 +<?php
  2 +
  3 +/**
  4 + * i-Educar - Sistema de gestão escolar
  5 + *
  6 + * Copyright (C) 2006 Prefeitura Municipal de Itajaí
  7 + * <ctima@itajai.sc.gov.br>
  8 + *
  9 + * Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo
  10 + * sob os termos da Licença Pública Geral GNU conforme publicada pela Free
  11 + * Software Foundation; tanto a versão 2 da Licença, como (a seu critério)
  12 + * qualquer versão posterior.
  13 + *
  14 + * Este programa é distribuí­do na expectativa de que seja útil, porém, SEM
  15 + * NENHUMA GARANTIA; nem mesmo a garantia implí­cita de COMERCIABILIDADE OU
  16 + * ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral
  17 + * do GNU para mais detalhes.
  18 + *
  19 + * Você deve ter recebido uma cópia da Licença Pública Geral do GNU junto
  20 + * com este programa; se não, escreva para a Free Software Foundation, Inc., no
  21 + * endereço 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA.
  22 + *
  23 + * @author Lucas D'Avila <lucasdavila@portabilis.com.br>
  24 + * @category i-Educar
  25 + * @license @@license@@
  26 + * @package Usuario
  27 + * @subpackage Modules
  28 + * @since Arquivo disponível desde a versão ?
  29 + * @version $Id$
  30 + */
  31 +
  32 +require_once 'lib/Portabilis/Mailer.php';
  33 +
  34 +class UsuarioMailer extends Portabilis_Mailer
  35 +{
  36 +
  37 + static function updatedPassword($user, $link) {
  38 + $to = $user->email;
  39 +
  40 + $subject = "Sua senha foi alterada - i-Educar - " . self::host();
  41 + $message = "Olá!\n\n" .
  42 + "A senha da matrícula '{$user->matricula}' foi alterada recentemente.\n\n" .
  43 + "Caso você não tenha feito esta alteração, por favor, tente alterar sua senha acessando o link $link ou entre em contato com o administrador do sistema (solicitando mudança da sua senha), pois sua conta pode estar sendo usada por alguma pessoa não autorizada.";
  44 +
  45 + return self::mail($to, $subject, $message);
  46 + }
  47 +
  48 + static function passwordReset($user, $link) {
  49 + $to = $user->email;
  50 +
  51 + $subject = "Redefinição de senha - i-Educar - " . self::host();
  52 + $message = "Olá!\n\n" .
  53 + "Recebemos uma solicitação de redefinição de senha para a matrícula {$user->matricula}.\n\n" .
  54 + "Para redefinir sua senha acesse o link: $link\n\n" .
  55 + "Caso você não tenha feito esta solicitação, por favor, ignore esta mensagem.";
  56 +
  57 + return self::mail($to, $subject, $message);
  58 + }
  59 +}
0 \ No newline at end of file 60 \ No newline at end of file
ieducar/modules/Usuario/Model/Funcionario.php 0 → 100644
@@ -0,0 +1,90 @@ @@ -0,0 +1,90 @@
  1 +<?php
  2 +
  3 +#error_reporting(E_ALL);
  4 +#ini_set("display_errors", 1);
  5 +
  6 +/**
  7 + * i-Educar - Sistema de gestão escolar
  8 + *
  9 + * Copyright (C) 2006 Prefeitura Municipal de Itajaí
  10 + * <ctima@itajai.sc.gov.br>
  11 + *
  12 + * Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo
  13 + * sob os termos da Licença Pública Geral GNU conforme publicada pela Free
  14 + * Software Foundation; tanto a versão 2 da Licença, como (a seu critério)
  15 + * qualquer versão posterior.
  16 + *
  17 + * Este programa é distribuí­do na expectativa de que seja útil, porém, SEM
  18 + * NENHUMA GARANTIA; nem mesmo a garantia implí­cita de COMERCIABILIDADE OU
  19 + * ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral
  20 + * do GNU para mais detalhes.
  21 + *
  22 + * Você deve ter recebido uma cópia da Licença Pública Geral do GNU junto
  23 + * com este programa; se não, escreva para a Free Software Foundation, Inc., no
  24 + * endereço 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA.
  25 + *
  26 + * @author Lucas D'Avila <lucasdavila@portabilis.com.br>
  27 + * @category i-Educar
  28 + * @license @@license@@
  29 + * @package ComponenteCurricular
  30 + * @subpackage Modules
  31 + * @since Arquivo disponível desde a versão 1.1.0
  32 + * @version $Id$
  33 + */
  34 +
  35 +require_once 'CoreExt/Entity.php';
  36 +require_once 'App/Model/IedFinder.php';
  37 +require_once 'CoreExt/Validate/Email.php';
  38 +
  39 +/**
  40 + * ComponenteCurricular_Model_Componente class.
  41 + *
  42 + * @author Lucas D'Avila <lucasdavila@portabilis.com.br>
  43 + * @category i-Educar
  44 + * @license @@license@@
  45 + * @package ComponenteCurricular
  46 + * @subpackage Modules
  47 + * @since Classe disponível desde a versão 1.1.0
  48 + * @version @@package_version@@
  49 + */
  50 +class Usuario_Model_Funcionario extends CoreExt_Entity
  51 +{
  52 + protected $_data = array(
  53 + #'ref_cod_pessoa_fj' => NULL,
  54 + 'matricula' => NULL,
  55 + 'email' => NULL,
  56 + 'senha' => NULL,
  57 + 'data_troca_senha' => NULL,
  58 + 'status_token' => NULL
  59 + );
  60 +
  61 + protected $_dataTypes = array(
  62 + 'matricula' => 'string'
  63 + );
  64 +
  65 + protected $_references = array(
  66 + );
  67 +
  68 + public function getDataMapper()
  69 + {
  70 + if (is_null($this->_dataMapper)) {
  71 + require_once 'Usuario/Model/FuncionarioDataMapper.php';
  72 + $this->setDataMapper(new Usuario_Model_FuncionarioDataMapper());
  73 + }
  74 + return parent::getDataMapper();
  75 + }
  76 +
  77 + public function getDefaultValidatorCollection()
  78 + {
  79 + return array(
  80 + 'email' => new CoreExt_Validate_Email()
  81 + );
  82 + }
  83 +
  84 + protected function _createIdentityField()
  85 + {
  86 + $id = array('ref_cod_pessoa_fj' => NULL);
  87 + $this->_data = array_merge($id, $this->_data);
  88 + return $this;
  89 + }
  90 +}
ieducar/modules/Usuario/Model/FuncionarioDataMapper.php 0 → 100644
@@ -0,0 +1,72 @@ @@ -0,0 +1,72 @@
  1 +<?php
  2 +
  3 +/**
  4 + * i-Educar - Sistema de gestão escolar
  5 + *
  6 + * Copyright (C) 2006 Prefeitura Municipal de Itajaí
  7 + * <ctima@itajai.sc.gov.br>
  8 + *
  9 + * Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo
  10 + * sob os termos da Licença Pública Geral GNU conforme publicada pela Free
  11 + * Software Foundation; tanto a versão 2 da Licença, como (a seu critério)
  12 + * qualquer versão posterior.
  13 + *
  14 + * Este programa é distribuí­do na expectativa de que seja útil, porém, SEM
  15 + * NENHUMA GARANTIA; nem mesmo a garantia implí­cita de COMERCIABILIDADE OU
  16 + * ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral
  17 + * do GNU para mais detalhes.
  18 + *
  19 + * Você deve ter recebido uma cópia da Licença Pública Geral do GNU junto
  20 + * com este programa; se não, escreva para a Free Software Foundation, Inc., no
  21 + * endereço 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA.
  22 + *
  23 + * @author Lucas D'Avila <lucasdavila@portabilis.com.br>
  24 + * @category i-Educar
  25 + * @license @@license@@
  26 + * @package Usuario
  27 + * @subpackage Modules
  28 + * @since Arquivo disponível desde a versão 1.1.0
  29 + * @version $Id$
  30 + */
  31 +
  32 +require_once 'CoreExt/DataMapper.php';
  33 +require_once 'Usuario/Model/Funcionario.php';
  34 +
  35 +/**
  36 + * Usuario_Model_FuncionarioDataMapper class.
  37 + *
  38 + * @author Lucas D'Avila <lucasdavila@portabilis.com.br>
  39 + * @category i-Educar
  40 + * @license @@license@@
  41 + * @package Usuario
  42 + * @subpackage Modules
  43 + * @since Classe disponível desde a versão 1.1.0
  44 + * @version @@package_version@@
  45 + */
  46 +class Usuario_Model_FuncionarioDataMapper extends CoreExt_DataMapper
  47 +{
  48 + protected $_entityClass = 'Usuario_Model_Funcionario';
  49 + protected $_tableName = 'funcionario';
  50 + protected $_tableSchema = 'portal';
  51 +
  52 + protected $_attributeMap = array(
  53 + #'ref_cod_pessoa_fj' => 'ref_cod_pessoa_fj',
  54 + #'matricula' => 'matricula',
  55 + #'email' => 'email',
  56 + #'data_troca_senha' => 'data_troca_senha'
  57 + );
  58 +
  59 + protected $_notPersistable = array(
  60 + #'ippes'
  61 + );
  62 +
  63 + protected $_primaryKey = array('ref_cod_pessoa_fj');
  64 +
  65 + protected function _getFindStatment($pkey)
  66 + {
  67 + if (!is_array($pkey))
  68 + $pkey = array("ref_cod_pessoa_fj" => $pkey);
  69 +
  70 + return parent::_getFindStatment($pkey);
  71 + }
  72 +}
ieducar/modules/Usuario/Model/Usuario.php 0 → 100644
@@ -0,0 +1,91 @@ @@ -0,0 +1,91 @@
  1 +<?php
  2 +
  3 +#error_reporting(E_ALL);
  4 +#ini_set("display_errors", 1);
  5 +
  6 +/**
  7 + * i-Educar - Sistema de gestão escolar
  8 + *
  9 + * Copyright (C) 2006 Prefeitura Municipal de Itajaí
  10 + * <ctima@itajai.sc.gov.br>
  11 + *
  12 + * Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo
  13 + * sob os termos da Licença Pública Geral GNU conforme publicada pela Free
  14 + * Software Foundation; tanto a versão 2 da Licença, como (a seu critério)
  15 + * qualquer versão posterior.
  16 + *
  17 + * Este programa é distribuí­do na expectativa de que seja útil, porém, SEM
  18 + * NENHUMA GARANTIA; nem mesmo a garantia implí­cita de COMERCIABILIDADE OU
  19 + * ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral
  20 + * do GNU para mais detalhes.
  21 + *
  22 + * Você deve ter recebido uma cópia da Licença Pública Geral do GNU junto
  23 + * com este programa; se não, escreva para a Free Software Foundation, Inc., no
  24 + * endereço 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA.
  25 + *
  26 + * @author Lucas D'Avila <lucasdavila@portabilis.com.br>
  27 + * @category i-Educar
  28 + * @license @@license@@
  29 + * @package ComponenteCurricular
  30 + * @subpackage Modules
  31 + * @since Arquivo disponível desde a versão 1.1.0
  32 + * @version $Id$
  33 + */
  34 +
  35 +require_once 'CoreExt/Entity.php';
  36 +require_once 'App/Model/IedFinder.php';
  37 +require_once 'CoreExt/Validate/Email.php';
  38 +
  39 +/**
  40 + * ComponenteCurricular_Model_Componente class.
  41 + *
  42 + * @author Lucas D'Avila <lucasdavila@portabilis.com.br>
  43 + * @category i-Educar
  44 + * @license @@license@@
  45 + * @package ComponenteCurricular
  46 + * @subpackage Modules
  47 + * @since Classe disponível desde a versão 1.1.0
  48 + * @version @@package_version@@
  49 + */
  50 +class Usuario_Model_Usuario extends CoreExt_Entity
  51 +{
  52 + protected $_data = array(
  53 + 'id' => NULL,
  54 + 'escolaId' => NULL,
  55 + 'instituicaoId' => NULL,
  56 + 'funcionarioCadId' => NULL,
  57 + 'funcionarioExcId' => NULL,
  58 + 'tipoUsuarioId' => NULL,
  59 + 'dataCadastro' => NULL,
  60 + 'dataExclusao' => NULL,
  61 + 'ativo' => NULL
  62 + );
  63 +
  64 + /*protected $_dataTypes = array(
  65 + );
  66 +
  67 + protected $_references = array(
  68 + );*/
  69 +
  70 + public function getDataMapper()
  71 + {
  72 + if (is_null($this->_dataMapper)) {
  73 + require_once 'Usuario/Model/UsuarioDataMapper.php';
  74 + $this->setDataMapper(new Usuario_Model_UsuarioDataMapper());
  75 + }
  76 + return parent::getDataMapper();
  77 + }
  78 +
  79 + public function getDefaultValidatorCollection()
  80 + {
  81 + return array();
  82 + }
  83 +
  84 + // TODO remover metodo? já que foi usado $_attributeMap id
  85 + protected function _createIdentityField()
  86 + {
  87 + $id = array('id' => NULL);
  88 + $this->_data = array_merge($id, $this->_data);
  89 + return $this;
  90 + }
  91 +}
ieducar/modules/Usuario/Model/UsuarioDataMapper.php 0 → 100644
@@ -0,0 +1,78 @@ @@ -0,0 +1,78 @@
  1 +<?php
  2 +
  3 +/**
  4 + * i-Educar - Sistema de gestão escolar
  5 + *
  6 + * Copyright (C) 2006 Prefeitura Municipal de Itajaí
  7 + * <ctima@itajai.sc.gov.br>
  8 + *
  9 + * Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo
  10 + * sob os termos da Licença Pública Geral GNU conforme publicada pela Free
  11 + * Software Foundation; tanto a versão 2 da Licença, como (a seu critério)
  12 + * qualquer versão posterior.
  13 + *
  14 + * Este programa é distribuí­do na expectativa de que seja útil, porém, SEM
  15 + * NENHUMA GARANTIA; nem mesmo a garantia implí­cita de COMERCIABILIDADE OU
  16 + * ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral
  17 + * do GNU para mais detalhes.
  18 + *
  19 + * Você deve ter recebido uma cópia da Licença Pública Geral do GNU junto
  20 + * com este programa; se não, escreva para a Free Software Foundation, Inc., no
  21 + * endereço 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA.
  22 + *
  23 + * @author Lucas D'Avila <lucasdavila@portabilis.com.br>
  24 + * @category i-Educar
  25 + * @license @@license@@
  26 + * @package Usuario
  27 + * @subpackage Modules
  28 + * @since Arquivo disponível desde a versão 1.1.0
  29 + * @version $Id$
  30 + */
  31 +
  32 +require_once 'CoreExt/DataMapper.php';
  33 +require_once 'Usuario/Model/Usuario.php';
  34 +
  35 +/**
  36 + * Usuario_Model_UsuarioDataMapper class.
  37 + *
  38 + * @author Lucas D'Avila <lucasdavila@portabilis.com.br>
  39 + * @category i-Educar
  40 + * @license @@license@@
  41 + * @package Usuario
  42 + * @subpackage Modules
  43 + * @since Classe disponível desde a versão 1.1.0
  44 + * @version @@package_version@@
  45 + */
  46 +class Usuario_Model_UsuarioDataMapper extends CoreExt_DataMapper
  47 +{
  48 + protected $_entityClass = 'Usuario_Model_Usuario';
  49 + protected $_tableName = 'usuario';
  50 + protected $_tableSchema = 'pmieducar';
  51 +
  52 + protected $_attributeMap = array(
  53 + 'id' => 'cod_usuario',
  54 + 'escolaId' => 'ref_cod_escola',
  55 + 'instituicaoId' => 'ref_cod_instituicao',
  56 + 'funcionarioCadId' => 'ref_funcionario_cad',
  57 + 'funcionarioExcId' => 'ref_funcionario_exc',
  58 + 'tipoUsuarioId' => 'ref_cod_tipo_usuario',
  59 + 'dataCadastro' => 'data_cadastro',
  60 + 'dataExclusao' => 'data_exclusao',
  61 + 'ativo' => 'ativo'
  62 + );
  63 +
  64 + protected $_notPersistable = array(
  65 + );
  66 +
  67 + // TODO remover? já que foi usado $_attributeMap id
  68 + protected $_primaryKey = array('id');
  69 +
  70 + // TODO remover metodo? já que foi usado $_attributeMap id
  71 + protected function _getFindStatment($pkey)
  72 + {
  73 + if (!is_array($pkey))
  74 + $pkey = array("id" => $pkey);
  75 +
  76 + return parent::_getFindStatment($pkey);
  77 + }
  78 +}
ieducar/modules/Usuario/Validators/UsuarioValidator.php 0 → 100644
@@ -0,0 +1,61 @@ @@ -0,0 +1,61 @@
  1 +<?php
  2 +
  3 +/**
  4 + * i-Educar - Sistema de gestão escolar
  5 + *
  6 + * Copyright (C) 2006 Prefeitura Municipal de Itajaí
  7 + * <ctima@itajai.sc.gov.br>
  8 + *
  9 + * Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo
  10 + * sob os termos da Licença Pública Geral GNU conforme publicada pela Free
  11 + * Software Foundation; tanto a versão 2 da Licença, como (a seu critério)
  12 + * qualquer versão posterior.
  13 + *
  14 + * Este programa é distribuí­do na expectativa de que seja útil, porém, SEM
  15 + * NENHUMA GARANTIA; nem mesmo a garantia implí­cita de COMERCIABILIDADE OU
  16 + * ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral
  17 + * do GNU para mais detalhes.
  18 + *
  19 + * Você deve ter recebido uma cópia da Licença Pública Geral do GNU junto
  20 + * com este programa; se não, escreva para a Free Software Foundation, Inc., no
  21 + * endereço 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA.
  22 + *
  23 + * @author Lucas D'Avila <lucasdavila@portabilis.com.br>
  24 + * @category i-Educar
  25 + * @license @@license@@
  26 + * @package Usuario
  27 + * @subpackage Modules
  28 + * @since Arquivo disponível desde a versão ?
  29 + * @version $Id$
  30 + */
  31 +
  32 +class UsuarioValidator
  33 +{
  34 + static function validatePassword($messenger,
  35 + $oldPassword,
  36 + $newPassword,
  37 + $confirmation,
  38 + $encriptedPassword,
  39 + $matricula)
  40 + {
  41 + $newPassword = strtolower($newPassword);
  42 + $confirmation = strtolower($confirmation);
  43 +
  44 + if (empty($newPassword))
  45 + $messenger->append('Por favor informe uma senha.', 'error');
  46 +
  47 + elseif (strlen($newPassword) < 8)
  48 + $messenger->append('Por favor informe uma senha mais segura, com pelo menos 8 caracteres.', 'error');
  49 +
  50 + elseif ($newPassword != $confirmation)
  51 + $messenger->append('A confirma&ccedil;&atilde;o de senha n&atilde;o confere com a senha.', 'error');
  52 +
  53 + elseif (strpos($newPassword, $matricula) != false)
  54 + $messenger->append('A senha informada &eacute; similar a sua matricula, informe outra senha.', 'error');
  55 +
  56 + elseif ($encriptedPassword == $oldPassword)
  57 + $messenger->append('Informe uma senha diferente da atual.', 'error');
  58 +
  59 + return ! $messenger->hasMsgWithType('error');
  60 + }
  61 +}
0 \ No newline at end of file 62 \ No newline at end of file
ieducar/modules/Usuario/Views/AlterarEmailController.php 0 → 100644
@@ -0,0 +1,98 @@ @@ -0,0 +1,98 @@
  1 +<?php
  2 +
  3 +/**
  4 + * i-Educar - Sistema de gestão escolar
  5 + *
  6 + * Copyright (C) 2006 Prefeitura Municipal de Itajaí
  7 + * <ctima@itajai.sc.gov.br>
  8 + *
  9 + * Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo
  10 + * sob os termos da Licença Pública Geral GNU conforme publicada pela Free
  11 + * Software Foundation; tanto a versão 2 da Licença, como (a seu critério)
  12 + * qualquer versão posterior.
  13 + *
  14 + * Este programa é distribuí­do na expectativa de que seja útil, porém, SEM
  15 + * NENHUMA GARANTIA; nem mesmo a garantia implí­cita de COMERCIABILIDADE OU
  16 + * ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral
  17 + * do GNU para mais detalhes.
  18 + *
  19 + * Você deve ter recebido uma cópia da Licença Pública Geral do GNU junto
  20 + * com este programa; se não, escreva para a Free Software Foundation, Inc., no
  21 + * endereço 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA.
  22 + *
  23 + * @author Lucas D'Avila <lucasdavila@portabilis.com.br>
  24 + * @category i-Educar
  25 + * @license @@license@@
  26 + * @package Avaliacao
  27 + * @subpackage Modules
  28 + * @since Arquivo disponível desde a versão ?
  29 + * @version $Id$
  30 + */
  31 +
  32 +require_once 'lib/Portabilis/Controller/Page/EditController.php';
  33 +require_once 'Usuario/Model/FuncionarioDataMapper.php';
  34 +require_once 'Usuario/Mailers/UsuarioMailer.php';
  35 +
  36 +class AlterarEmailController extends Portabilis_Controller_Page_EditController
  37 +{
  38 + protected $_dataMapper = 'Usuario_Model_FuncionarioDataMapper';
  39 + protected $_titulo = 'Alterar e-mail';
  40 + protected $_processoAp = 0;
  41 +
  42 + protected $backwardCompatibility = true;
  43 +
  44 + protected $_formMap = array(
  45 + 'matricula' => array(
  46 + 'label' => 'Matr&iacute;cula',
  47 + 'help' => '',
  48 + ),
  49 + 'email' => array(
  50 + 'label' => 'E-mail',
  51 + 'help' => 'E-mail utilizado para recuperar sua senha.',
  52 + ),
  53 + );
  54 +
  55 +
  56 + protected function _preConstruct()
  57 + {
  58 + $this->_options = $this->mergeOptions(array('edit_success' => 'intranet/index.php'), $this->_options);
  59 + }
  60 +
  61 +
  62 + // this controller always edit an existing resource
  63 + protected function _initNovo() {
  64 + return false;
  65 + }
  66 +
  67 +
  68 + protected function _initEditar() {
  69 + $this->setEntity($this->getDataMapper()->find($this->getOption('id_usuario')));
  70 + return true;
  71 + }
  72 +
  73 +
  74 + public function Gerar()
  75 + {
  76 + $validEmail = filter_var($this->getEntity()->email, FILTER_VALIDATE_EMAIL) == true;
  77 +
  78 + if (empty($this->getRequest()->email) && ! $validEmail)
  79 + $this->messenger()->append("Por favor informe um e-mail v&aacute;lido, para ser usado caso voc&ecirc; esque&ccedil;a sua senha.");
  80 +
  81 + $this->campoRotulo('matricula', $this->_getLabel('matricula'), $this->getEntity()->matricula);
  82 + $this->campoTexto('email', $this->_getLabel('email'), $this->getEntity()->email,
  83 + 50, 50, TRUE, FALSE, FALSE, $this->_getHelp('email'));
  84 +
  85 + $this->url_cancelar = '/intranet/index.php';
  86 +
  87 + if (! $validEmail)
  88 + $this->nome_url_cancelar = 'Deixar para depois';
  89 + }
  90 +
  91 +
  92 + public function save()
  93 + {
  94 + $this->getEntity()->setOptions(array('email' => $_POST['email']));
  95 + $this->getDataMapper()->save($this->getEntity());
  96 + }
  97 +}
  98 +?>
ieducar/modules/Usuario/Views/AlterarSenhaController.php 0 → 100644
@@ -0,0 +1,109 @@ @@ -0,0 +1,109 @@
  1 + <?php
  2 +
  3 +#error_reporting(E_ALL);
  4 +#ini_set("display_errors", 1);
  5 +
  6 +/**
  7 + * i-Educar - Sistema de gestão escolar
  8 + *
  9 + * Copyright (C) 2006 Prefeitura Municipal de Itajaí
  10 + * <ctima@itajai.sc.gov.br>
  11 + *
  12 + * Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo
  13 + * sob os termos da Licença Pública Geral GNU conforme publicada pela Free
  14 + * Software Foundation; tanto a versão 2 da Licença, como (a seu critério)
  15 + * qualquer versão posterior.
  16 + *
  17 + * Este programa é distribuí­do na expectativa de que seja útil, porém, SEM
  18 + * NENHUMA GARANTIA; nem mesmo a garantia implí­cita de COMERCIABILIDADE OU
  19 + * ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral
  20 + * do GNU para mais detalhes.
  21 + *
  22 + * Você deve ter recebido uma cópia da Licença Pública Geral do GNU junto
  23 + * com este programa; se não, escreva para a Free Software Foundation, Inc., no
  24 + * endereço 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA.
  25 + *
  26 + * @author Lucas D'Avila <lucasdavila@portabilis.com.br>
  27 + * @category i-Educar
  28 + * @license @@license@@
  29 + * @package Usuario
  30 + * @subpackage Modules
  31 + * @since Arquivo disponível desde a versão ?
  32 + * @version $Id$
  33 + */
  34 +
  35 +require_once 'lib/Portabilis/Controller/Page/EditController.php';
  36 +require_once 'Usuario/Model/FuncionarioDataMapper.php';
  37 +require_once 'Usuario/Mailers/UsuarioMailer.php';
  38 +require_once 'Usuario/Validators/UsuarioValidator.php';
  39 +
  40 +class AlterarSenhaController extends Portabilis_Controller_Page_EditController
  41 +{
  42 + protected $_dataMapper = 'Usuario_Model_FuncionarioDataMapper';
  43 + protected $_titulo = 'Alterar senha';
  44 + protected $_processoAp = 0;
  45 +
  46 + protected $backwardCompatibility = true;
  47 +
  48 + protected $_formMap = array(
  49 + 'matricula' => array('label' => 'Matr&iacute;cula', 'help' => ''),
  50 + 'nova_senha' => array('label' => 'Nova senha', 'help' => ''),
  51 + 'confirmacao_senha' => array('label' => 'Confirma&ccedil;&atilde;o de senha', 'help' => ''),
  52 + );
  53 +
  54 +
  55 + protected function _preConstruct()
  56 + {
  57 + $this->_options = $this->mergeOptions(array('edit_success' => 'intranet/index.php'), $this->_options);
  58 + }
  59 +
  60 +
  61 + // this controller always edit an existing resource
  62 + protected function _initNovo() {
  63 + return false;
  64 + }
  65 +
  66 +
  67 + protected function _initEditar() {
  68 + $this->setEntity($this->getDataMapper()->find($this->getOption('id_usuario')));
  69 + return true;
  70 + }
  71 +
  72 +
  73 + public function Gerar()
  74 + {
  75 + if (! isset($_POST['password']))
  76 + $this->messenger()->append('Para sua seguran&ccedil;a mude sua senha periodicamente, por favor, informe uma nova senha.', 'info');
  77 +
  78 + $this->campoRotulo('matricula', $this->_getLabel('matricula'), $this->getEntity()->matricula);
  79 + $this->campoSenha('password', $this->_getLabel('nova_senha'), @$_POST['password'], TRUE);
  80 + $this->campoSenha('password_confirmation', $this->_getLabel('confirmacao_senha'), @$_POST['password_confirmation'], TRUE);
  81 +
  82 + $this->nome_url_sucesso = 'Alterar';
  83 + $this->nome_url_cancelar = 'Deixar para depois';
  84 +
  85 + if ($GLOBALS['coreExt']['Config']->app->user_accounts->force_password_update != true)
  86 + $this->url_cancelar = '/intranet/index.php';
  87 + }
  88 +
  89 +
  90 + protected function canSave()
  91 + {
  92 + return UsuarioValidator::validatePassword($this->messenger(),
  93 + $this->getEntity()->senha,
  94 + $_POST['password'],
  95 + $_POST['password_confirmation'],
  96 + md5($_POST['password']),
  97 + $this->getEntity()->matricula);
  98 + }
  99 +
  100 + protected function save()
  101 + {
  102 + $this->getEntity()->setOptions(array('senha' => md5($_POST['password']), 'data_troca_senha' => 'now()'));
  103 + $this->getDataMapper()->save($this->getEntity());
  104 +
  105 + $linkToReset = $_SERVER['HTTP_HOST'] . $this->getRequest()->getBaseurl() . '/' . 'Usuario/AlterarSenha';
  106 + UsuarioMailer::updatedPassword($user = $this->getEntity(), $linkToReset);
  107 + }
  108 +}
  109 +?>
ieducar/modules/Usuario/Views/RedefinirSenhaController.php 0 → 100644
@@ -0,0 +1,354 @@ @@ -0,0 +1,354 @@
  1 +<?php
  2 +
  3 +#error_reporting(E_ALL);
  4 +#ini_set("display_errors", 1);
  5 +
  6 +/**
  7 + * i-Educar - Sistema de gestão escolar
  8 + *
  9 + * Copyright (C) 2006 Prefeitura Municipal de Itajaí
  10 + * <ctima@itajai.sc.gov.br>
  11 + *
  12 + * Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo
  13 + * sob os termos da Licença Pública Geral GNU conforme publicada pela Free
  14 + * Software Foundation; tanto a versão 2 da Licença, como (a seu critério)
  15 + * qualquer versão posterior.
  16 + *
  17 + * Este programa é distribuí­do na expectativa de que seja útil, porém, SEM
  18 + * NENHUMA GARANTIA; nem mesmo a garantia implí­cita de COMERCIABILIDADE OU
  19 + * ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA. Consulte a Licença Pública Geral
  20 + * do GNU para mais detalhes.
  21 + *
  22 + * Você deve ter recebido uma cópia da Licença Pública Geral do GNU junto
  23 + * com este programa; se não, escreva para a Free Software Foundation, Inc., no
  24 + * endereço 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA.
  25 + *
  26 + * @author Lucas D'Avila <lucasdavila@portabilis.com.br>
  27 + * @category i-Educar
  28 + * @license @@license@@
  29 + * @package Usuario
  30 + * @subpackage Modules
  31 + * @since Arquivo disponível desde a versão ?
  32 + * @version $Id$
  33 + */
  34 +
  35 +require_once 'lib/Portabilis/Controller/Page/EditController.php';
  36 +require_once 'Usuario/Model/FuncionarioDataMapper.php';
  37 +require_once 'Usuario/Mailers/UsuarioMailer.php';
  38 +require_once 'Portabilis/View/Helper/Application.php';
  39 +require_once 'lib/Portabilis/Utils/ReCaptcha.php';
  40 +require_once 'Usuario/Validators/UsuarioValidator.php';
  41 +
  42 +require_once 'include/clsControlador.inc.php';
  43 +
  44 +class RedefinirSenhaController extends Portabilis_Controller_Page_EditController
  45 +{
  46 + protected $_dataMapper = 'Usuario_Model_FuncionarioDataMapper';
  47 + protected $_titulo = 'Redefinir senha';
  48 + protected $_processoAp = 0;
  49 +
  50 + protected $backwardCompatibility = true;
  51 +
  52 + protected $_formMap = array(
  53 + 'matricula' => array(
  54 + 'label' => 'Matr&iacute;cula',
  55 + 'help' => '',
  56 + ),
  57 + 'nova_senha' => array(
  58 + 'label' => 'Nova senha',
  59 + 'help' => '',
  60 + ),
  61 + 'confirmacao_senha' => array(
  62 + 'label' => 'Confirma&ccedil;&atilde;o de senha',
  63 + 'help' => '',
  64 + ),
  65 + );
  66 +
  67 +
  68 + public function _preConstruct() {
  69 + $this->_options = $this->mergeOptions(array('edit_success' => 'intranet/index.php'), $this->_options);
  70 + }
  71 +
  72 +
  73 + /* overwrite Core/Controller/Page/Abstract.php para renderizar html
  74 + sem necessidade de usuário estar logado */
  75 + public function generate(CoreExt_Controller_Page_Interface $instance)
  76 + {
  77 + require_once 'Core/View.php';
  78 + $viewBase = new Core_View($instance);
  79 + $viewBase->titulo = 'i-Educar - Redefini&ccedil;&atilde;o senha';
  80 + $instance->titulo = 'Redefini&ccedil;&atilde;o senha';
  81 + $viewBase->addForm($instance);
  82 + //$viewBase->Formular();
  83 +
  84 + $html = $viewBase->MakeHeadHtml();
  85 + foreach ($viewBase->clsForm as $form) {
  86 + $html .= $form->RenderHTML();
  87 + }
  88 +
  89 + $html .= $form->getAppendedOutput();
  90 + $html .= $viewBase->MakeFootHtml();
  91 +
  92 + echo $html;
  93 + }
  94 +
  95 +
  96 + // inicia um novo processo de redefinição de senha, quando nao recebe um token
  97 + protected function _initNovo()
  98 + {
  99 + return ! isset($_GET['token']);
  100 + }
  101 +
  102 +
  103 + // continua o processo de redefinição de senha, quando recebe o token
  104 + protected function _initEditar()
  105 + {
  106 + return isset($_GET['token']);
  107 + }
  108 +
  109 +
  110 + public function Gerar()
  111 + {
  112 + if (! isset($_GET['token']))
  113 + $this->GerarNovo();
  114 + else
  115 + $this->GerarEditar();
  116 +
  117 + $this->url_cancelar = '/intranet/index.php';
  118 + $this->nome_url_sucesso = 'Redefinir';
  119 + }
  120 +
  121 +
  122 + protected function GerarNovo() {
  123 + $this->nome_url_cancelar = 'Entrar';
  124 + $matricula = $_POST['matricula'];
  125 +
  126 + if (empty($matricula) && is_numeric($this->getOption('id_usuario'))) {
  127 + $user = Portabilis_Utils_User::load($id = $this->getOption('id_usuario'));
  128 + $matricula = $user['matricula'];
  129 + }
  130 +
  131 + $this->campoTexto('matricula', $this->_getLabel('matricula'), $matricula,
  132 + 50, 50, TRUE, FALSE, FALSE, $this->_getHelp('matricula'));
  133 +
  134 + echo Portabilis_Utils_ReCaptcha::getWidget();
  135 + $this->reCaptchaFixup();
  136 + }
  137 +
  138 +
  139 + protected function GerarEditar()
  140 + {
  141 + $this->loadUserByStatusToken('redefinir_senha-' . $_GET['token']);
  142 +
  143 + $this->campoRotulo('matricula', $this->_getLabel('matricula'), $this->getEntity()->matricula);
  144 + $this->campoSenha('password', $this->_getLabel('nova_senha'), @$_POST['password'], TRUE);
  145 + $this->campoSenha('password_confirmation', $this->_getLabel('confirmacao_senha'), @$_POST['password_confirmation'], TRUE);
  146 + }
  147 +
  148 +
  149 + public function Novo()
  150 + {
  151 + if (! $this->messenger()->hasMsgWithType('error')) {
  152 + if (! Portabilis_Utils_ReCaptcha::getWidget()->validate()) {
  153 + $this->messenger()->append('Por favor, informe a confirma&ccedil;&atilde;o visual no respectivo campo.', 'error');
  154 + }
  155 + elseif ($this->loadUserByMatricula($_POST['matricula']))
  156 + $this->sendResetPasswordMail();
  157 + }
  158 +
  159 + return ! $this->messenger()->hasMsgWithType('error');
  160 + }
  161 +
  162 +
  163 + public function Editar()
  164 + {
  165 + if (! $this->messenger()->hasMsgWithType('error') && $this->loadUserByStatusToken('redefinir_senha-' . $_GET['token']))
  166 + $this->updatePassword();
  167 +
  168 + return ! $this->messenger()->hasMsgWithType('error');
  169 + }
  170 +
  171 +
  172 + protected function updatePassword() {
  173 + $user = $this->getEntity();
  174 +
  175 + try {
  176 + if ($this->canUpdate($user)) {
  177 + $user->setOptions(array('senha' => md5($_POST['password']), 'status_token' => '', 'data_troca_senha' => 'now()'));
  178 + $this->getDataMapper()->save($user);
  179 +
  180 + $linkToReset = $_SERVER['HTTP_HOST'] . $this->getRequest()->getBaseurl() . '/' . 'Usuario/RedefinirSenha';
  181 + UsuarioMailer::updatedPassword($user = $this->getEntity(), $linkToReset);
  182 +
  183 + // #FIXME adicionar flash ao session, para persistr ao redirecionar ?
  184 + $this->messenger()->append('Senha alterada com sucesso.', 'success');
  185 +
  186 + $this->logInUser();
  187 + }
  188 + }
  189 + catch (Exception $e) {
  190 + $this->messenger()->append('Erro ao atualizar de senha.', 'error');
  191 + error_log("Exception ocorrida ao atualizar senha, matricula: {$user->matricula}, erro: " . $e->getMessage());
  192 + }
  193 + }
  194 +
  195 +
  196 + protected function canUpdate($user)
  197 + {
  198 + return UsuarioValidator::validatePassword($this->messenger(),
  199 + $user->senha,
  200 + $_POST['password'],
  201 + $_POST['password_confirmation'],
  202 + md5($_POST['password']),
  203 + $user->matricula);
  204 + }
  205 +
  206 +
  207 + protected function setTokenRedefinicaoSenha() {
  208 + $user = $this->getEntity();
  209 + try {
  210 + $token = md5(uniqid($user->email));
  211 + $statusToken = 'redefinir_senha-' . $token;
  212 +
  213 + $user->setOptions(array('status_token' => $statusToken));
  214 + $this->getDataMapper()->save($user);
  215 + return $token;
  216 + }
  217 + catch (Exception $e) {
  218 + $this->messenger()->append('Erro ao setar token redefini&ccedil;&atilde;o de senha.', 'error');
  219 + error_log("Exception ocorrida ao setar token reset senha, matricula: {$user->matricula}, erro: " . $e->getMessage());
  220 + return false;
  221 + }
  222 + }
  223 +
  224 +
  225 + protected function loadUserByStatusToken($statusToken) {
  226 + $result = false;
  227 + try {
  228 + if(empty($statusToken) && ! is_numeric($statusToken))
  229 + $this->messenger()->append('Deve ser recebido um token.', 'error');
  230 + else {
  231 + $user = $this->getDataMapper()->findAllUsingPreparedQuery(array(),
  232 + array('status_token' => '$1'),
  233 + array($statusToken),
  234 + array(),
  235 + false);
  236 +
  237 + if(! empty($user) && ! empty($user[0]->ref_cod_pessoa_fj)) {
  238 + $this->setEntity($user[0]);
  239 + $result = true;
  240 + }
  241 + else
  242 + $this->messenger()->append('Link inv&aacutelido ou j&aacute utilizado, por favor, <a class="light decorated" href="RedefinirSenha">solicite a redefini&ccedil;&atilde;o de senha novamente</a>.', 'error', false, 'error');
  243 + }
  244 + }
  245 + catch (Exception $e) {
  246 + $this->messenger()->append('Ocorreu um erro inesperado ao recuperar o usu&aacute;rio, por favor, ' .
  247 + 'tente novamente.', 'error');
  248 +
  249 + error_log("Exception ocorrida ao redefinir senha (loadUserByStatusToken), " .
  250 + "matricula: $matricula, erro: " . $e->getMessage());
  251 + }
  252 +
  253 + return $result;
  254 + }
  255 +
  256 +
  257 + protected function loadUserByMatricula($matricula) {
  258 + $result = false;
  259 + $user = null;
  260 +
  261 + try {
  262 + if(empty($matricula) && ! is_numeric($matricula))
  263 + $this->messenger()->append('Informe uma matr&iacute;cula.', 'error');
  264 + else {
  265 + $user = $this->getDataMapper()->findAllUsingPreparedQuery(array(),
  266 + array('matricula' => '$1'),
  267 + array($matricula),
  268 + array(),
  269 + false);
  270 +
  271 + if(! empty($user) && ! empty($user[0]->ref_cod_pessoa_fj)) {
  272 + $this->setEntity($user[0]);
  273 + $result = true;
  274 + }
  275 + else
  276 + $this->messenger()->append('Nenhum usu&aacute;rio encontrado com a matr&iacute;cula informada.',
  277 + 'error', false, 'error');
  278 + }
  279 + }
  280 + catch (Exception $e) {
  281 + $this->messenger()->append('Ocorreu um erro inesperado ao recuperar o usu&aacute;rio, por favor, ' .
  282 + 'verifique o valor informado e tente novamente.', 'error');
  283 +
  284 + error_log("Exception ocorrida ao redefinir senha (loadUserByMatricula), " .
  285 + "matricula: $matricula, erro: " . $e->getMessage());
  286 + }
  287 +
  288 + return $result;
  289 + }
  290 +
  291 +
  292 + protected function sendResetPasswordMail() {
  293 + $user = $this->getEntity();
  294 +
  295 + if(empty($user->email)) {
  296 + $this->messenger()->append('Parece que seu usu&aacute;rio n&atilde;o possui um e-mail definido, por favor, '.
  297 + 'solicite ao administrador do sistema para definir seu e-mail (em DRH > Cadastro '.
  298 + 'de funcion&aacute;rios) e tente novamente.', 'error');
  299 + }
  300 + else {
  301 + $token = $this->setTokenRedefinicaoSenha();
  302 +
  303 + if ($token != false) {
  304 + $link = $_SERVER['HTTP_REFERER'] . "?token=$token";
  305 +
  306 + if(UsuarioMailer::passwordReset($user, $link)) {
  307 + $successMsg = 'Enviamos um e-mail para voc&ecirc;, por favor, clique no link recebido para redefinir sua senha.';
  308 + $this->messenger()->append($successMsg, 'success');
  309 + }
  310 + else {
  311 + $errorMsg = 'N&atilde;o conseguimos enviar um e-mail para voc&ecirc;, por favor, tente novamente mais tarde.';
  312 + $this->messenger()->append($errorMsg, 'error');
  313 + }
  314 +
  315 + }
  316 + }
  317 + }
  318 +
  319 +
  320 + public function logInUser()
  321 + {
  322 + $controlador = new clsControlador();
  323 +
  324 + // #TODO migrar para Portabilis_Utils_User carregar usuário usando funcionario data mapper
  325 + // e então nesta classe usar $this->getEntity
  326 + $user = Portabilis_Utils_User::load($id = $this->getEntity()->ref_cod_pessoa_fj);
  327 +
  328 + if ($controlador->canStartLoginSession($user))
  329 + $controlador->startLoginSession($user, '/intranet/index.php');
  330 +
  331 + $this->messenger()->merge($controlador->messages);
  332 + }
  333 +
  334 +
  335 + // fixup para mover o widget para o local correto, necessário pois chrome não executa
  336 + // o script caso seja usado $this->campoRotulo('...', '...', '<script...>')
  337 + protected function reCaptchaFixup() {
  338 + $this->campoRotulo('replace_by_recaptcha_widget_wrapper',
  339 + 'Confirma&ccedil;&atilde;o visual',
  340 + '<div id="replace_by_recaptcha_widget"></div>');
  341 +
  342 + $js = "function replaceRecaptchaWidget() {
  343 + var emptyElement = document.getElementById('replace_by_recaptcha_widget');
  344 + var originElement = document.getElementById('recaptcha_widget_div');
  345 + emptyElement.parentNode.replaceChild(originElement, emptyElement);
  346 + }
  347 +
  348 + window.onload = replaceRecaptchaWidget;";
  349 +
  350 + Portabilis_View_Helper_Application::embedJavascript($this, $js);
  351 + }
  352 +
  353 +}
  354 +?>