From e9e4b6ed3cb763f66eea016e88cbcd97478d6b9c Mon Sep 17 00:00:00 2001 From: Lucas D'Avila Date: Thu, 31 Jan 2013 20:20:15 -0200 Subject: [PATCH] Adicionado modulo Error (para exibir detalhes de erros ocorridos), adicionado try a /module/index.php para pegar erros e redirecionar para /modules/Error --- ieducar/module/index.php | 61 +++++++++++++++++++++++++++++++++++++++++-------------------- ieducar/modules/Error/Assets/Stylesheets/Error.css | 37 +++++++++++++++++++++++++++++++++++++ ieducar/modules/Error/Mailers/NotificationMailer.php | 117 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ieducar/modules/Error/Views/UnauthorizedController.php | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ieducar/modules/Error/Views/UnexpectedController.php | 91 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 353 insertions(+), 20 deletions(-) create mode 100644 ieducar/modules/Error/Assets/Stylesheets/Error.css create mode 100644 ieducar/modules/Error/Mailers/NotificationMailer.php create mode 100644 ieducar/modules/Error/Views/UnauthorizedController.php create mode 100644 ieducar/modules/Error/Views/UnexpectedController.php diff --git a/ieducar/module/index.php b/ieducar/module/index.php index ef6c8aa..fb5a610 100644 --- a/ieducar/module/index.php +++ b/ieducar/module/index.php @@ -39,29 +39,50 @@ require_once 'CoreExt/Controller/Request.php'; require_once 'CoreExt/Controller/Front.php'; require_once 'CoreExt/DataMapper.php'; -// Objeto de requisição -$request = new CoreExt_Controller_Request(); +require_once 'modules/Error/Mailers/NotificationMailer.php'; -// Helper de URL. Auxilia para criar uma URL no formato http://www.example.org/module -$url = CoreExt_View_Helper_UrlHelper::getInstance(); -$url = $url->url($request->get('REQUEST_URI'), array('components' => CoreExt_View_Helper_UrlHelper::URL_HOST)); +try +{ + // Objeto de requisição + $request = new CoreExt_Controller_Request(); -// Configura o baseurl da request -$request->setBaseurl(sprintf('%s/module', $url)); + // Helper de URL. Auxilia para criar uma URL no formato http://www.example.org/module + $url = CoreExt_View_Helper_UrlHelper::getInstance(); + $url = $url->url($request->get('REQUEST_URI'), array('components' => CoreExt_View_Helper_UrlHelper::URL_HOST)); -// Configura o DataMapper para usar uma instância de clsBanco com fetch de resultados -// usando o tipo FETCH_ASSOC -CoreExt_DataMapper::setDefaultDbAdapter(new clsBanco(array('fetchMode' => clsBanco::FETCH_ASSOC))); + // Configura o baseurl da request + $request->setBaseurl(sprintf('%s/module', $url)); -// Inicia o Front Controller -$frontController = CoreExt_Controller_Front::getInstance(); -$frontController->setRequest($request); + // Configura o DataMapper para usar uma instância de clsBanco com fetch de resultados + // usando o tipo FETCH_ASSOC + CoreExt_DataMapper::setDefaultDbAdapter(new clsBanco(array('fetchMode' => clsBanco::FETCH_ASSOC))); -// Configura o caminho aonde os módulos estão instalados -$frontController->setOptions( - array('basepath' => PROJECT_ROOT . DS . 'modules') -); -$frontController->dispatch(); + // Inicia o Front Controller + $frontController = CoreExt_Controller_Front::getInstance(); + $frontController->setRequest($request); -// Resultado -print $frontController->getViewContents(); \ No newline at end of file + // Configura o caminho aonde os módulos estão instalados + $frontController->setOptions( + array('basepath' => PROJECT_ROOT . DS . 'modules') + ); + + $frontController->dispatch(); + + // Resultado + print $frontController->getViewContents(); +} +catch (Exception $e) { + $lastError = error_get_last(); + + @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(); + + error_log("Erro inesperado (pego em /module/index.php): " . $e->getMessage()); + NotificationMailer::unexpectedError($e->getMessage()); + + die(""); +} diff --git a/ieducar/modules/Error/Assets/Stylesheets/Error.css b/ieducar/modules/Error/Assets/Stylesheets/Error.css new file mode 100644 index 0000000..760fe44 --- /dev/null +++ b/ieducar/modules/Error/Assets/Stylesheets/Error.css @@ -0,0 +1,37 @@ +* { + margin: 0; + padding: 0; +} + +body { + align: center; + font-size: 85%; + font-family: verdana, arial, sans-serif; + line-height: 160% +} + +div#error { + position: absolute; + left: 250px; + top: 35px; + border: 1px solid #666; + width: 800px; +} + +div.content { + padding: 25px; +} + +div.detail { + margin-top: 25px; +} + +h1 { + padding-bottom: 15px; + font-size: 300%; +} + +ol { + list-style-position: inside; + margin-top: 20px; +} \ No newline at end of file diff --git a/ieducar/modules/Error/Mailers/NotificationMailer.php b/ieducar/modules/Error/Mailers/NotificationMailer.php new file mode 100644 index 0000000..a5471ae --- /dev/null +++ b/ieducar/modules/Error/Mailers/NotificationMailer.php @@ -0,0 +1,117 @@ + + * + * Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo + * sob os termos da Licença Pública Geral GNU conforme publicada pela Free + * Software Foundation; tanto a versão 2 da Licença, como (a seu critério) + * qualquer versão posterior. + * + * Este programa é distribuí­do na expectativa de que seja útil, porém, SEM + * NENHUMA GARANTIA; nem mesmo a garantia implí­cita de COMERCIABILIDADE OU + * ADEQUAÇÃO A UMA FINALIDADE ESPECÃFICA. Consulte a Licença Pública Geral + * do GNU para mais detalhes. + * + * Você deve ter recebido uma cópia da Licença Pública Geral do GNU junto + * com este programa; se não, escreva para a Free Software Foundation, Inc., no + * endereço 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA. + * + * @author Lucas D'Avila + * @category i-Educar + * @license @@license@@ + * @package Mailer + * @subpackage Modules + * @since Arquivo disponí­vel desde a versão ? + * @version $Id$ + */ + +require_once 'Portabilis/Mailer.php'; +require_once 'Portabilis/String/Utils.php'; +require_once 'Portabilis/Utils/User.php'; +require_once 'Portabilis/Utils/Database.php'; + +class NotificationMailer extends Portabilis_Mailer +{ + static function unexpectedDataBaseError($appError, $pgError, $sql) { + if (self::canSendEmail()) { + $lastError = error_get_last(); + $userId = Portabilis_Utils_User::currentUserId(); + + $to = self::notificationEmail(); + $subject = "[Erro inesperado bd] i-Educar - " . self::host(); + $message = "Olá!\n\n" . + "Ocorreu um erro inesperado no banco de dados, detalhes abaixo:\n\n" . + " ERRO APP: ' . $appError\n" . + " ERRO PHP: ' . {$lastError['message']}\n" . + " ERRO POSTGRES: $pgError\n" . + " LINHA {$lastError['line']} em {$lastError['file']}\n" . + " SQL: {$sql}\n" . + " ID USUÁRIO {$userId}\n" . + "\n\n-\n\n" . + "Você recebeu este email pois seu email foi configurado para receber " . + "notificações de erros."; + + // only send email, if a notification email was set. + return ($to ? self::mail($to, $subject, $message) : false); + } + } + + static function unexpectedError($appError) { + if (self::canSendEmail()) { + $lastError = error_get_last(); + $user = self::tryLoadUser(); + + $to = self::notificationEmail(); + $subject = "[Erro inesperado] i-Educar - " . self::host(); + $message = "Olá!\n\n" . + "Ocorreu um erro inesperado, detalhes abaixo:\n\n" . + " ERRO APP: ' . $appError\n" . + " ERRO PHP: ' . {$lastError['message']}\n" . + " LINHA {$lastError['line']} em {$lastError['file']}\n" . + " USUÁRIO {$user['matricula']} email {$user['email']}\n" . + "\n\n-\n\n" . + "Você recebeu este email pois seu email foi configurado para receber " . + "notificações de erros."; + + // only send email, if a notification email was set. + return ($to ? self::mail($to, $subject, $message) : false); + } + } + + // common error mailer methods + + protected static function canSendEmail() { + return $GLOBALS['coreExt']['Config']->modules->error->send_notification_email == true; + } + + protected static function notificationEmail() { + $email = $GLOBALS['coreExt']['Config']->modules->error->notification_email; + + if (! is_string($email)) { + error_log("Não foi definido um email para receber detalhes dos erros, por favor adicione a opção " . + "'modules.error_notification.email = email@dominio.com' ao arquivo ini de configuração."); + + return false; + } + + return $email; + } + + protected static function tryLoadUser() { + try { + + $sql = 'select matricula, email from portal.funcionario WHERE ref_cod_pessoa_fj = $1 '; + $options = array('params' => Portabilis_Utils_User::currentUserId(), 'return_only' => 'first-row'); + $user = Portabilis_Utils_Database::fetchPreparedQuery($sql, $options); + + } catch (Exception $e) { + $user = array('matricula' => 'Erro ao obter', 'email' => 'Erro ao obter'); + } + + return $user; + } +} \ No newline at end of file diff --git a/ieducar/modules/Error/Views/UnauthorizedController.php b/ieducar/modules/Error/Views/UnauthorizedController.php new file mode 100644 index 0000000..027d9d8 --- /dev/null +++ b/ieducar/modules/Error/Views/UnauthorizedController.php @@ -0,0 +1,67 @@ + + * + * Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo + * sob os termos da Licença Pública Geral GNU conforme publicada pela Free + * Software Foundation; tanto a versão 2 da Licença, como (a seu critério) + * qualquer versão posterior. + * + * Este programa é distribuí­do na expectativa de que seja útil, porém, SEM + * NENHUMA GARANTIA; nem mesmo a garantia implí­cita de COMERCIABILIDADE OU + * ADEQUAÇÃO A UMA FINALIDADE ESPECÃFICA. Consulte a Licença Pública Geral + * do GNU para mais detalhes. + * + * Você deve ter recebido uma cópia da Licença Pública Geral do GNU junto + * com este programa; se não, escreva para a Free Software Foundation, Inc., no + * endereço 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA. + * + * @author Lucas D'Avila + * @category i-Educar + * @license @@license@@ + * @package Portabilis + * @subpackage lib + * @since Arquivo disponível desde a versão ? + * @version $Id$ + */ + +require_once 'lib/Portabilis/Controller/ErrorCoreController.php'; + +class UnauthorizedController extends Portabilis_Controller_ErrorCoreController +{ + protected $_titulo = 'Acesso não autorizado'; + + protected function setHeader() { + header("HTTP/1.1 403 Forbidden"); + } + + public function Gerar() { + $linkToSupport = $GLOBALS['coreExt']['Config']->modules->error->link_to_support; + + echo " +
+
+

Acesso não autorizado

+ +

+ Seu usuário não possui autorização para realizar esta ação, + tente seguir as etapas abaixo: + +

    +
  1. Volte para o sistema
  2. +
  3. Solicite ao responsável pelo sistema, para adicionar ao seu usuário a permissão necessária e tente novamente
  4. +
  5. Caso o erro persista, por favor, solicite suporte.
  6. +
+

+ +
+
"; + } +} diff --git a/ieducar/modules/Error/Views/UnexpectedController.php b/ieducar/modules/Error/Views/UnexpectedController.php new file mode 100644 index 0000000..3a0b696 --- /dev/null +++ b/ieducar/modules/Error/Views/UnexpectedController.php @@ -0,0 +1,91 @@ + + * + * Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo + * sob os termos da Licença Pública Geral GNU conforme publicada pela Free + * Software Foundation; tanto a versão 2 da Licença, como (a seu critério) + * qualquer versão posterior. + * + * Este programa é distribuí­do na expectativa de que seja útil, porém, SEM + * NENHUMA GARANTIA; nem mesmo a garantia implí­cita de COMERCIABILIDADE OU + * ADEQUAÇÃO A UMA FINALIDADE ESPECÃFICA. Consulte a Licença Pública Geral + * do GNU para mais detalhes. + * + * Você deve ter recebido uma cópia da Licença Pública Geral do GNU junto + * com este programa; se não, escreva para a Free Software Foundation, Inc., no + * endereço 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA. + * + * @author Lucas D'Avila + * @category i-Educar + * @license @@license@@ + * @package Portabilis + * @subpackage lib + * @since Arquivo disponível desde a versão ? + * @version $Id$ + */ + +require_once 'lib/Portabilis/Controller/ErrorCoreController.php'; + +class UnexpectedController extends Portabilis_Controller_ErrorCoreController +{ + protected $_titulo = 'Erro inesperado'; + + protected function setHeader() { + header("HTTP/1.1 500 Internal Server Error"); + } + + public function Gerar() { + $linkToSupport = $GLOBALS['coreExt']['Config']->modules->error->link_to_support; + + if ($GLOBALS['coreExt']['Config']->modules->error->show_details) { + $detail = "

Erro app

{$this->getSession()->last_error_message}"; + $detail .= "

Erro php

{$this->getSession()->last_php_error_message}"; + $detail .= "

Arquivo

(linha: {$this->getSession()->last_php_error_line}) "; + $detail .= "{$this->getSession()->last_php_error_file}"; + + unset($this->getSession()->last_error_message); + unset($this->getSession()->last_php_error_message); + unset($this->getSession()->last_php_error_line); + unset($this->getSession()->last_php_error_file); + + if (! $detail) + $detail = 'Sem detalhes do erro.'; + + $detail = "

Detalhes:

+

$detail

"; + } + else + $detail = '

Visualização de detalhes do erro desativada.

'; + + echo " +
+
+

Erro inesperado

+ +

+ Desculpe-nos, algum erro inesperado ocorreu, + tente seguir as etapas abaixo: + +

    +
  1. Tente novamente
  2. +
  3. Faça logoff do sistema e tente novamente
  4. +
  5. Caso o erro persista, por favor, solicite suporte.
  6. +
+

+ +
+ $detail +
+ +
+
"; + } +} -- libgit2 0.21.2