From 2c3f5b4a37fd39ad7ae7ad9b649221750769cad5 Mon Sep 17 00:00:00 2001 From: Lucas D'Avila Date: Thu, 31 Jan 2013 21:19:00 -0200 Subject: [PATCH] Refatorado verificação de expiração de conta de usuário, incluido lógica para redirecionar requisições, conforme url configurada. --- ieducar/intranet/include/clsBase.inc.php | 376 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 1 file changed, 191 insertions(+), 185 deletions(-) diff --git a/ieducar/intranet/include/clsBase.inc.php b/ieducar/intranet/include/clsBase.inc.php index 8ddb375..fa96da6 100755 --- a/ieducar/intranet/include/clsBase.inc.php +++ b/ieducar/intranet/include/clsBase.inc.php @@ -25,11 +25,19 @@ * @license @@license@@ * @package iEd_Include * @since Arquivo disponível desde a versão 1.0.0 - * @version $Id$ + * @version $Id: clsBase.inc.php 773 2010-12-19 20:46:49Z eriksencosta@gmail.com $ */ // Inclui arquivo de bootstrapping -require_once '../includes/bootstrap.php'; +require_once $_SERVER['DOCUMENT_ROOT'] . '/includes/bootstrap.php'; + +// redireciona requisições, caso configurado +if ($GLOBALS['coreExt']['Config']->app->routes && + $GLOBALS['coreExt']['Config']->app->routes->redirect_to) { + + header('HTTP/1.1 503 Service Temporarily Unavailable'); + header("Location: {$GLOBALS['coreExt']['Config']->app->routes->redirect_to}"); +} require_once 'include/clsCronometro.inc.php'; require_once 'clsConfigItajai.inc.php'; @@ -41,6 +49,11 @@ require_once 'include/Geral.inc.php'; require_once 'include/pmicontrolesis/geral.inc.php'; require_once 'include/funcoes.inc.php'; +require_once 'lib/Portabilis/Utils/Database.php'; +require_once 'lib/Portabilis/Utils/User.php'; + +require_once 'modules/Error/Mailers/NotificationMailer.php'; + /** * clsBase class. * @@ -199,10 +212,6 @@ class clsBase extends clsConfig function VerificaPermicaoNumerico($processo_ap) { if (is_numeric($processo_ap)) { - @session_start(); - $id_usuario = $_SESSION['id_pessoa']; - session_write_close(); - $sempermissao = TRUE; if ($processo_ap == 0) { @@ -210,11 +219,9 @@ class clsBase extends clsConfig } if ($processo_ap != 0) { - $db = new clsBanco(); - - $db->Consulta("SELECT 1 FROM menu_funcionario WHERE ref_cod_menu_submenu = 0 AND ref_ref_cod_pessoa_fj = {$id_usuario}"); - if ($db->ProximoRegistro()) { - list($aui) = $db->Tupla(); + $this->db()->Consulta("SELECT 1 FROM menu_funcionario WHERE ref_cod_menu_submenu = 0 AND ref_ref_cod_pessoa_fj = {$this->_currentUserId()}"); + if ($this->db()->ProximoRegistro()) { + list($aui) = $this->db()->Tupla(); $sempermissao = FALSE; } @@ -222,9 +229,9 @@ class clsBase extends clsConfig // permissão de acesso ao processo. Já a segunda, não existe // sentido para nivel = 2 já que processoAp pode ser de níveis // maiores que 2. - $db->Consulta("SELECT 1 FROM menu_funcionario WHERE (ref_cod_menu_submenu = {$processo_ap} AND ref_ref_cod_pessoa_fj = {$id_usuario}) OR (SELECT true FROM menu_submenu WHERE cod_menu_submenu = {$processo_ap} AND nivel = 2)"); - if ($db->ProximoRegistro()) { - list($aui) = $db->Tupla(); + $this->db()->Consulta("SELECT 1 FROM menu_funcionario WHERE (ref_cod_menu_submenu = {$processo_ap} AND ref_ref_cod_pessoa_fj = {$this->_currentUserId()}) OR (SELECT true FROM menu_submenu WHERE cod_menu_submenu = {$processo_ap} AND nivel = 2)"); + if ($this->db()->ProximoRegistro()) { + list($aui) = $this->db()->Tupla(); $sempermissao = FALSE; } @@ -250,11 +257,11 @@ class clsBase extends clsConfig $variaveis = "POST\n{$posts}GET\n{$gets}SESSION\n{$sessions}"; - if ($id_usuario) { - $db->Consulta("INSERT INTO intranet_segur_permissao_negada (ref_ref_cod_pessoa_fj, ip_externo, ip_interno, data_hora, pagina, variaveis) VALUES('$id_usuario', '$ip', '$ip_de_rede', NOW(), '$pagina', '$variaveis')"); + if ($this->_currentUserId()) { + $this->db()->Consulta("INSERT INTO intranet_segur_permissao_negada (ref_ref_cod_pessoa_fj, ip_externo, ip_interno, data_hora, pagina, variaveis) VALUES('{$this->_currentUserId()}', '$ip', '$ip_de_rede', NOW(), '$pagina', '$variaveis')"); } else { - $db->Consulta("INSERT INTO intranet_segur_permissao_negada (ref_ref_cod_pessoa_fj, ip_externo, ip_interno, data_hora, pagina, variaveis) VALUES(NULL, '$ip', '$ip_de_rede', NOW(), '$pagina', '$variaveis')"); + $this->db()->Consulta("INSERT INTO intranet_segur_permissao_negada (ref_ref_cod_pessoa_fj, ip_externo, ip_interno, data_hora, pagina, variaveis) VALUES(NULL, '$ip', '$ip_de_rede', NOW(), '$pagina', '$variaveis')"); } return FALSE; @@ -298,35 +305,33 @@ class clsBase extends clsConfig $menu_tutor = ''; if ($this->processoAp) { - $db = new clsBanco(); - $menu_atual = $db->UnicoCampo("SELECT ref_cod_menu_menu FROM menu_submenu WHERE cod_menu_submenu = '{$this->processoAp}'"); + $menu_atual = $this->db()->UnicoCampo("SELECT ref_cod_menu_menu FROM menu_submenu WHERE cod_menu_submenu = '{$this->processoAp}'"); if ($menu_atual) { - $db->Consulta("SELECT cod_menu_submenu FROM menu_submenu WHERE ref_cod_menu_menu = '{$menu_atual}'"); - while ($db->ProximoRegistro()) { - $tupla = $db->Tupla(); + $this->db()->Consulta("SELECT cod_menu_submenu FROM menu_submenu WHERE ref_cod_menu_menu = '{$menu_atual}'"); + while ($this->db()->ProximoRegistro()) { + $tupla = $this->db()->Tupla(); $submenu[] = $tupla['cod_menu_submenu']; } $where = implode(" OR ref_cod_menu_submenu = ", $submenu); $where = "ref_cod_menu_submenu = $where"; - $menu_tutor = $db->UnicoCampo("SELECT ref_cod_tutormenu FROM pmicontrolesis.menu WHERE $where LIMIT 1 OFFSET 0"); + $menu_tutor = $this->db()->UnicoCampo("SELECT ref_cod_tutormenu FROM pmicontrolesis.menu WHERE $where LIMIT 1 OFFSET 0"); } else { $this->prog_alert .= "O menu pai do processo AP {$this->processoAp} está voltando vazio (cod_menu inexistente?).
"; } } elseif ($_SESSION['menu_atual']) { - $db = new clsBanco(); - $db->Consulta("SELECT cod_menu_submenu FROM menu_submenu WHERE ref_cod_menu_menu = '{$_SESSION['menu_atual']}'"); + $this->db()->Consulta("SELECT cod_menu_submenu FROM menu_submenu WHERE ref_cod_menu_menu = '{$_SESSION['menu_atual']}'"); - while ($db->ProximoRegistro()) { - $tupla = $db->Tupla(); + while ($this->db()->ProximoRegistro()) { + $tupla = $this->db()->Tupla(); $submenu[] = $tupla['cod_menu_submenu']; } $where = implode(" OR ref_cod_menu_submenu = ", $submenu); $where = "ref_cod_menu_submenu = $where"; - $menu_tutor = $db->UnicoCampo("SELECT ref_cod_tutormenu FROM pmicontrolesis.menu WHERE $where LIMIT 1 OFFSET 0"); + $menu_tutor = $this->db()->UnicoCampo("SELECT ref_cod_tutormenu FROM pmicontrolesis.menu WHERE $where LIMIT 1 OFFSET 0"); } if ($menu_tutor) { @@ -353,15 +358,13 @@ class clsBase extends clsConfig $saida = '"; - } - } - } - - // somente para programadores - // @todo Essa linha pode afetar o uso de usuários comuns? - if (($id_usuario == 49659 || $id_usuario == 2151 || $id_usuario == 4637 || $id_usuario == 21330|| $id_usuario == 21317|| $id_usuario == 25109|| $id_usuario == 4702)) { - if($expirando || $this->prog_alert) { - $mensagem = $expirando ? "$mensagem_expirar
" : ""; - $mensagem .= $this->prog_alert ? $this->prog_alert : ""; - $saida = str_replace("", "
$mensagem
", $saida); - } - } - elseif($expirando) { - $saida = str_replace("", "
{$mensagem_expirar}
", $saida); - } - $notificacao = ""; - $db = new clsBanco(); - $db->Consulta("SELECT cod_notificacao, titulo, conteudo, url FROM portal.notificacao WHERE ref_cod_funcionario = '{$id_usuario}' AND data_hora_ativa < NOW()"); + $this->db()->Consulta("SELECT cod_notificacao, titulo, conteudo, url FROM portal.notificacao WHERE ref_cod_funcionario = '{$this->_currentUserId()}' AND data_hora_ativa < NOW()"); - if ($db->numLinhas()) { - while ($db->ProximoRegistro()) { - list($cod_notificacao, $titulo, $conteudo, $url) = $db->Tupla(); + if ($this->db()->numLinhas()) { + while ($this->db()->ProximoRegistro()) { + list($cod_notificacao, $titulo, $conteudo, $url) = $this->db()->Tupla(); $titulo = ($url) ? "{$titulo}": $titulo; @@ -606,14 +560,29 @@ class clsBase extends clsConfig "; } $saida = str_replace( "", $notificacao, $saida ); - $db->Consulta("UPDATE portal.notificacao SET visualizacoes = visualizacoes + 1 WHERE ref_cod_funcionario = '{$id_usuario}' AND data_hora_ativa < NOW()"); - $db->Consulta("DELETE FROM portal.notificacao WHERE visualizacoes > 10"); + $this->db()->Consulta("UPDATE portal.notificacao SET visualizacoes = visualizacoes + 1 WHERE ref_cod_funcionario = '{$this->_currentUserId()}' AND data_hora_ativa < NOW()"); + $this->db()->Consulta("DELETE FROM portal.notificacao WHERE visualizacoes > 10"); } - $saida = str_replace("", $ultimoAcesso, $saida); - $saida = str_replace("", $nome_user, $saida); - $saida = str_replace("", $corpo, $saida); - $saida = str_replace("", $menu_dinamico, $saida); + // nome completo usuario + $nomePessoa = new clsPessoaFisica(); + list($nomePessoa) = $nomePessoa->queryRapida($this->_currentUserId(), "nome"); + $nomePessoa = ($nomePessoa) ? $nomePessoa : "Convidado"; + + + // data ultimo acesso + $ultimoAcesso = $this->db()->UnicoCampo("SELECT data_hora FROM acesso WHERE cod_pessoa = {$this->_currentUserId()} ORDER BY data_hora DESC LIMIT 1,1"); + + if($ultimoAcesso) + $ultimoAcesso = date("d/m/Y H:i", strtotime(substr($ultimoAcesso,0,19))); + + $this->checkUserExpirations(); + + // substitui valores no template + $saida = str_replace("", $ultimoAcesso, $saida); + $saida = str_replace("", $nomePessoa, $saida); + $saida = str_replace("", $corpo, $saida); + $saida = str_replace("", $menu_dinamico, $saida); // Pega o endereço IP do host, primeiro com HTTP_X_FORWARDED_FOR (para pegar o IP real // caso o host esteja atrás de um proxy) @@ -626,9 +595,8 @@ class clsBase extends clsConfig $ip_maquina = $_SERVER['REMOTE_ADDR']; } - $sql = "UPDATE funcionario SET ip_logado = '$ip_maquina' , data_login = NOW() WHERE ref_cod_pessoa_fj = {$id_usuario}"; - $db2 = new clsBanco(); - $db2->Consulta($sql); + $sql = "UPDATE funcionario SET ip_logado = '$ip_maquina' , data_login = NOW() WHERE ref_cod_pessoa_fj = {$this->_currentUserId()}"; + $this->db()->Consulta($sql); return $saida; } @@ -652,11 +620,10 @@ class clsBase extends clsConfig { $retorno = ''; $listaBanners = array(); - $db = new clsBanco(); - $db->Consulta("SELECT caminho, title, prioridade, link FROM portal_banner WHERE lateral=1 ORDER BY prioridade, title"); + $this->db()->Consulta("SELECT caminho, title, prioridade, link FROM portal_banner WHERE lateral=1 ORDER BY prioridade, title"); - while ($db->ProximoRegistro()) { - list($caminho, $title, $prioridade, $link) = $db->Tupla(); + while ($this->db()->ProximoRegistro()) { + list($caminho, $title, $prioridade, $link) = $this->db()->Tupla(); $listaBanners[] = array("titulo"=>$title, "caminho"=>$caminho, "prioridade"=>$prioridade, "link"=>$link, "controle_inicio"=>0, "controle_fim"=>0); } @@ -727,111 +694,128 @@ class clsBase extends clsConfig function MakeAll () { - $cronometro = new clsCronometro(); - $cronometro->marca('inicio'); - $liberado = TRUE; - - $saida_geral = ''; - - if ($this->convidado) { - @session_start(); - $_SESSION['convidado'] = TRUE; - $_SESSION['id_pessoa'] = '0'; - session_write_close(); - } + try { + $cronometro = new clsCronometro(); + $cronometro->marca('inicio'); + $liberado = TRUE; + + $saida_geral = ''; + + if ($this->convidado) { + @session_start(); + $_SESSION['convidado'] = TRUE; + $_SESSION['id_pessoa'] = '0'; + session_write_close(); + } - $controlador = new clsControlador(); - if ($controlador->Logado() && $liberado || $this->convidado) { - $this->Formular(); - $this->VerificaPermicao(); - $this->CadastraAcesso(); - $saida_geral = $this->MakeHeadHtml(); + $controlador = new clsControlador(); + if ($controlador->Logado() && $liberado || $this->convidado) { + $this->Formular(); + $this->VerificaPermicao(); + $this->CadastraAcesso(); + $saida_geral = $this->MakeHeadHtml(); - // @todo else ruim, colocar abre e fecha colchetes ao redor de foreach. - if ($this->renderMenu) { - $saida_geral .= $this->MakeBody(); - } - else { - foreach ($this->clsForm as $form) { - $saida_geral .= $form->RenderHTML(); + // @todo else ruim, colocar abre e fecha colchetes ao redor de foreach. + if ($this->renderMenu) { + $saida_geral .= $this->MakeBody(); + } + else { + foreach ($this->clsForm as $form) { + $saida_geral .= $form->RenderHTML(); + } } - } - $saida_geral .= $this->MakeFootHtml(); + $saida_geral .= $this->MakeFootHtml(); - if ($_GET['suspenso'] == 1 || $_SESSION['suspenso'] == 1 || $_SESSION["tipo_menu"] == 1) { - if ($this->renderMenuSuspenso) { - $saida_geral = str_replace("", $this->makeMenuSuspenso(), $saida_geral); - } + if ($_GET['suspenso'] == 1 || $_SESSION['suspenso'] == 1 || $_SESSION["tipo_menu"] == 1) { + if ($this->renderMenuSuspenso) { + $saida_geral = str_replace("", $this->makeMenuSuspenso(), $saida_geral); + } - if ($_GET['suspenso'] == 1) { - @session_start(); - $_SESSION['suspenso'] = 1; - @session_write_close(); + if ($_GET['suspenso'] == 1) { + @session_start(); + $_SESSION['suspenso'] = 1; + @session_write_close(); + } } } - } - elseif ((empty($_POST['login'])) || (empty($_POST['senha'])) && $liberado) { - $saida_geral .= $this->MakeHeadHtml(); - $controlador->Logar(FALSE); - $saida_geral .= $this->MakeFootHtml(); - } - else { - $controlador->Logar(TRUE); - if ($controlador->Logado() && $liberado) { - $this->Formular(); - $this->VerificaPermicao(); - $this->CadastraAcesso(); - $saida_geral = $this->MakeHeadHtml(); - $saida_geral .= $this->MakeBody(); + elseif ((empty($_POST['login'])) || (empty($_POST['senha'])) && $liberado) { + $saida_geral .= $this->MakeHeadHtml(); + $controlador->Logar(FALSE); $saida_geral .= $this->MakeFootHtml(); } else { - $saida_geral = $this->MakeHeadHtml(); - $controlador->Logar (false); - $saida_geral .= $this->MakeFootHtml(); + $controlador->Logar(TRUE); + if ($controlador->Logado() && $liberado) { + $this->Formular(); + $this->VerificaPermicao(); + $this->CadastraAcesso(); + $saida_geral = $this->MakeHeadHtml(); + $saida_geral .= $this->MakeBody(); + $saida_geral .= $this->MakeFootHtml(); + } + else { + $saida_geral = $this->MakeHeadHtml(); + $controlador->Logar (false); + $saida_geral .= $this->MakeFootHtml(); + } } - } - echo $saida_geral; + echo $saida_geral; + + $cronometro->marca('fim'); + $tempoTotal = $cronometro->getTempoTotal(); + $tempoTotal += 0; + $objConfig = new clsConfig(); + + if ($tempoTotal > $objConfig->arrayConfig["intSegundosProcessaPagina"]) { + $conteudo = ""; + $conteudo .= ""; + $conteudo .= ""; + $conteudo .= ""; + $conteudo .= ""; + $conteudo .= ""; + $conteudo .= ""; + + if ($_SERVER["REQUEST_METHOD"] == "POST") { + $conteudo .= ""; + } + elseif ($_SERVER["REQUEST_METHOD"] == "GET") { + $conteudo .= ""; + } - $cronometro->marca('fim'); - $tempoTotal = $cronometro->getTempoTotal(); - $tempoTotal += 0; - $objConfig = new clsConfig(); + if ($_SERVER['HTTP_REFERER']) { + $conteudo .= ""; + } - if ($tempoTotal > $objConfig->arrayConfig["intSegundosProcessaPagina"]) { - $conteudo = "
Data:" . date( "d/m/Y H:i:s", time() ) . "
Script:{$_SERVER["PHP_SELF"]}
Tempo de processamento:{$tempoTotal} segundos
Tempo max permitido:{$objConfig->arrayConfig["intSegundosProcessaPagina"]} segundos
URL get:{$_SERVER['QUERY_STRING']}
Metodo:{$_SERVER["REQUEST_METHOD"]}
POST vars:"; + foreach ($_POST as $var => $val) { + $conteudo .= "{$var} => {$val}
"; + } + $conteudo .= "
GET vars:"; + foreach ($_GET as $var => $val) { + $conteudo .= "{$var} => {$val}
"; + } + $conteudo .= "
Referrer:{$_SERVER["HTTP_REFERER"]}
"; - $conteudo .= ""; - $conteudo .= ""; - $conteudo .= ""; - $conteudo .= ""; - $conteudo .= ""; - $conteudo .= ""; + $conteudo .= "
Data:" . date( "d/m/Y H:i:s", time() ) . "
Script:{$_SERVER["PHP_SELF"]}
Tempo de processamento:{$tempoTotal} segundos
Tempo max permitido:{$objConfig->arrayConfig["intSegundosProcessaPagina"]} segundos
URL get:{$_SERVER['QUERY_STRING']}
Metodo:{$_SERVER["REQUEST_METHOD"]}
"; - if ($_SERVER["REQUEST_METHOD"] == "POST") { - $conteudo .= "POST vars:"; - foreach ($_POST as $var => $val) { - $conteudo .= "{$var} => {$val}
"; - } - $conteudo .= ""; - } - elseif ($_SERVER["REQUEST_METHOD"] == "GET") { - $conteudo .= "GET vars:"; - foreach ($_GET as $var => $val) { - $conteudo .= "{$var} => {$val}
"; - } - $conteudo .= ""; + $objMail = new clsEmail($objConfig->arrayConfig['ArrStrEmailsAdministradores'], "[INTRANET - PMI] Desempenho de pagina", $conteudo); + $objMail->envia(); } + } + catch (Exception $e) { + $lastError = error_get_last(); - if ($_SERVER['HTTP_REFERER']) { - $conteudo .= "Referrer:{$_SERVER["HTTP_REFERER"]}"; - } + @session_start(); + $_SESSION['last_error_message'] = $e->getMessage(); + $_SESSION['last_php_error_message'] = $lastError['message']; + $_SESSION['last_php_error_line'] = $lastError['line']; + $_SESSION['last_php_error_file'] = $lastError['file']; + @session_write_close(); - $conteudo .= ""; + error_log("Erro inesperado (pego em clsBase): " . $e->getMessage()); + NotificationMailer::unexpectedError($e->getMessage()); - $objMail = new clsEmail($objConfig->arrayConfig['ArrStrEmailsAdministradores'], "[INTRANET - PMI] Desempenho de pagina", $conteudo); - $objMail->envia(); + die(""); } } @@ -841,4 +825,26 @@ class clsBase extends clsConfig $this->prog_alert = $string; } } -} \ No newline at end of file + + protected function checkUserExpirations() { + $user = Portabilis_Utils_User::load('current_user'); + $uri = $_SERVER['REQUEST_URI']; + $forcePasswordUpdate = $GLOBALS['coreExt']['Config']->app->user_accounts->force_password_update == true; + + if($user['expired_account'] || $user['proibido'] != '0' || $user['ativo'] != '1') + header("Location: /intranet/logof.php"); + + elseif($user['expired_password'] && $forcePasswordUpdate && $uri != '/module/Usuario/AlterarSenha') + header("Location: /module/Usuario/AlterarSenha"); + } + + // wrappers for Portabilis_*Utils* + + protected function db() { + return Portabilis_Utils_Database::db(); + } + + function _currentUserId() { + return Portabilis_Utils_User::currentUserId(); + } +} -- libgit2 0.21.2