-
Côme Chilliet authored
Adds FusionDirectoryError base class and one child class for check failures. Use this new class for IntAttribute as first test. Build HTML dialog from error class using attribute data. issue #6071
<?php
/*
This code is part of FusionDirectory (http://www.fusiondirectory.org/)
Copyright (C) 2003-2010 Cajus Pollmeier
Copyright (C) 2011-2020 FusionDirectory
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
*/
/*!
* \file class_msg_dialog.inc
* Source code for class message dialog
*/
define('INFO_DIALOG', 10001);
define('WARNING_DIALOG', 10002);
define('ERROR_DIALOG', 10003);
// LDAP_ERROR is the same as ERROR_DIALOG
define('LDAP_ERROR', 10003);
define('CONFIRM_DIALOG', 10004);
define('FATAL_ERROR_DIALOG', 10006);
/*!
* \brief This class contains all the function needed to make messages
* dialogs
*/
class msg_dialog
{
private $s_Title;
private $s_Message;
private $i_Type;
private $i_ID;
private $a_Trace = [];
/*!
* \brief Message dialog constructor
*
* \param string $title The title of the message dialog
*
* \param string $message The message of the message dialog
*
* \param string $type The type of the message dialog, by default = INFO_DIALOG
*/
public function __construct ($title, $message, $type = INFO_DIALOG)
{
if (!in_array($type, [INFO_DIALOG,WARNING_DIALOG,ERROR_DIALOG,CONFIRM_DIALOG,FATAL_ERROR_DIALOG])) {
trigger_error('Invalid msg_dialog type.');
$type = INFO_DIALOG;
}
$this->i_ID = (int)preg_replace('/[^0-9]*/', '', microtime());
$this->s_Title = $title;
$this->s_Message = $message;
$this->i_Type = $type;
}
protected function show ()
{
global $config;
7172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
if (empty($this->s_Message)) {
return;
}
if ((!session::is_set('errorsAlreadyPosted')) || !is_array(session::get('errorsAlreadyPosted'))) {
session::set('errorsAlreadyPosted', []);
}
$errorsAlreadyPosted = session::get('errorsAlreadyPosted');
if (!isset($errorsAlreadyPosted[$this->s_Title.$this->s_Message])) {
$errorsAlreadyPosted[$this->s_Title.$this->s_Message] = 0;
}
$errorsAlreadyPosted[$this->s_Title.$this->s_Message]++;
session::set('errorsAlreadyPosted', $errorsAlreadyPosted);
if ($errorsAlreadyPosted[$this->s_Title.$this->s_Message] > 1) {
/* Skip if the same message was already reported once */
return;
}
/* Append trace information, only if error messages are enabled */
if (isset($config) && is_object($config) &&
$config->get_cfg_value('displayerrors') == 'TRUE') {
$this->a_Trace = debug_backtrace();
}
if ($this->i_Type == FATAL_ERROR_DIALOG) {
restore_error_handler();
error_reporting(E_ALL);
echo $this->renderFatalErrorDialog();
} else {
if (session::is_set('msg_dialogs')) {
$msg_dialogs = session::get('msg_dialogs');
} else {
$msg_dialogs = [];
}
$msg_dialogs[] = $this;
session::set('msg_dialogs', $msg_dialogs);
}
}
/*!
* \brief Display a message dialog
*
* \param string $title The title of the message dialog
*
* \param string $message The message of the message dialog
*
* \param string $type The type of the message dialog, by default = INFO_DIALOG
*/
public static function display ($title, $message, $type = INFO_DIALOG)
{
$dialog = new msg_dialog($title, $message, $type);
$dialog->show();
}
/*
* \brief Display checks
*
* \param array $messages Contains messages
*/
public static function displayChecks ($messages)
{
foreach ($messages as $error) {
if ($error instanceof FusionDirectoryError) {
static::display(...$error->computeMsgDialogParameters());
} else {
static::display(_('Error'), $error, ERROR_DIALOG);
}
141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
}
}
/*
* \brief Accessor of message dialog's identifier
*
* \return The identifier of the message dialog
*/
public function getId (): int
{
return $this->i_ID;
}
/*!
* \brief Run the message dialog
*/
protected function renderFatalErrorDialog ()
{
global $config;
$display =
'<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/transitional.dtd">
<html><head>
<title>FusionDirectory startup failed</title>
</head><body>';
if (isset($config) && is_object($config) &&
$config->get_cfg_value('displayerrors') == 'TRUE') {
list($trace, ) = html_trace();
$display .= $trace;
}
$display .=
'<table style="width:100%; border:2px solid red;">
<tr>
<td style="vertical-align:top;padding:10px">
<img src="geticon.php?context=status&icon=dialog-error&size=32" alt="'._('Error').'"/>
</td>
<td style="width:100%">
<b>'.$this->s_Title.'</b><br/>
'.$this->s_Message.'<br><br/>
'._('Please fix the above error and reload the page.').'
</td>
</tr>
</table></body></html>';
return $display;
}
/*!
* \brief Check if the message is confirmed by user
*
* \return True if is confirmed, else return false
*/
public function is_confirmed (): bool
{
return isset($_POST['MSG_OK'.$this->i_ID]);
}
/*!
* \brief Return an array with infos for the template
*/
protected function getDialogInfos (): array
{
return [
'id' => $this->i_ID,
'type' => $this->i_Type,
'title' => $this->s_Title,
'message' => $this->s_Message,
'trace' => ((count($this->a_Trace) > 0) ? print_a($this->a_Trace, TRUE) : ''),
];
}
211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
/*!
* \brief Accessor of the message dialog rendered HTML
*/
public static function get_dialogs (): string
{
if (session::is_set('msg_dialogs') &&
is_array(session::get('msg_dialogs')) &&
count(session::get('msg_dialogs'))) {
$smarty = get_smarty();
$msg_dialogs = session::get('msg_dialogs');
$dialogInfos = [];
$dialogIds = [];
foreach ($msg_dialogs as $dialog) {
$dialogInfos[] = $dialog->getDialogInfos();
$dialogIds[] = $dialog->getId();
}
session::set('msg_dialogs', []);
$smarty->assign('dialogInfos', $dialogInfos);
$smarty->assign('dialogIds', $dialogIds);
return $smarty->fetch(get_template_path('msg_dialog.tpl'));
} else {
return '';
}
}
}