<?php

/**------------------------------------------------
*
* Rooty, 2018 <rooty@rooty.me>
*
*
* This software is protected by copyright, please
* read the file COPYRIGHT.
* 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. Please
* read the file LICENCE.
*
* Fichier SystemError.php
*
* Ce fichier contient la classe SystemError
*
* @author Initiance <www.initiance.com|olivier@initiance.com et HEURTAUX Christophe>
* @link www.rooty.me
* @since 2004/04/14
* @version 0.2
* @package system_error
* @copyright Copyright &copy; 2009-2018, Rooty
*/

#####################################################################################################
################################# Parametrage
#####################################################################################################
/**
* declaration du system... si cette variable n'est pas définie, les fichier inclus ne marche pas...
* cette variable est déclarée sur la page d'execution du script.
*<p> if ( !defined('SYSTEM_IN') )
* {
* die("Hacking attempt");
* }</p>
*/
if ( !defined('SYSTEM_IN') )
{
 die("Hacking attempt");
}

/**
* Classe System
*
* classe du system d'information
*
* @package system_error
*/
class SystemError
{

/**#@+

* @access private
* @var array
*/

/**
* @desc niveau d'affichage des erreurs
*/
var $debug			=null;

/**
* @desc niveau d'affichage ou de mail des erreurs
*/
var $verboseLevel		=null;

/**
* @desc niveau de log  des erreurs
*/
var $logLevel			=null;

/**
* @desc nom du fichier de log
*/
var $logFile			=null;

/**
* @desc envoi des erreurs par mail (sert pour le stockage des messages)
*/
var $messagemail		="";

/**
* @desc destinataire des messages d'erreurs
*/
var $sendto			=null;

/**#@-*/

/**#@+
* @access private
* @var object
*/
/**#@-*/

	//
	// Constructor
	//
/**
* Constructeur de la classe SystemError
*<p>Création de la gestion d'erreur et des redirection... d'affichage</p>
* @access public
*/
	function __construct()
	{
		$this->verboseLevel	=$GLOBALS['CONF_ERROR_VERBOSELEVEL'];
		$this->logLevel		=$GLOBALS['CONF_ERROR_LOGLEVEL'];
		$this->logFile		=$GLOBALS['CONF_ERROR_LOGFILE'];
		$this->debug		=$GLOBALS['CONF_ERROR_DEBUG'];
		$this->sendto		=$GLOBALS['CONF_ERROR_MAIL'];

		if ($this->debug==false)
		{
			ob_start('systemErrorCallBack');
		}
		$oldErrorHandler=set_error_handler('systemErrorPhp');			/* Configure la fonction d'affichage des sorties */
	}

/**
* printScreenError : affiche les erreur
*<P>affiche les erreurs stockées dans le Tampon si le tampon est actif</P>
* @access public
*/
	function printScreenError($errno, $errstr, $errfile, $errline)
	{
		// Pour la gestion de l'affichage des erreurs
		if (($errno > 0) && ($errno <= $this->verboseLevel))
		{
			# D๏ฟฝinition des couleurs d'affichage
			switch ($errno)
			{
				case 1 :
					echo "\n<span style='background-color: #DDDDDD; font-size: 11pt;'><font  color='#CC0000'>";
					break;

				case 2 :

				case 3 :

				case 4 :
					echo "\n<span style='background-color: #DDDDDD ; font-size: 11pt'><font  color='#CC9900'>";
					break;

				case 5 :

				case 6 :

	 			case 7 :
					echo "\n<span style='background-color: #DDDDDD; font-size: 11pt'><font  color='#009900'>";
					break;

				default :
					echo "\n<span style='background-color: #DDDDDD; font-size: 11pt'><font  color='#000000'>";
					break;
			}

			if ($errfile!="") echo "Fichier : <b>".$errfile."</b> ";
			echo "ERREUR de niveau <b>".$errno."</b>";

			if ($errline!="") echo " เ la ligne <b>".$errline."</b>";
			echo "<BR><b>".$errstr."</b>";
			echo "</b></font></span><br>";
		 }
	}

/**
* printFileError : affiche les erreur
*
* <P>affiche les erreurs stockées dans le Tampon si le tampon est actif<br/>
* Stocke les messages d'erreurs pour l'envoi par mail</P>
* @access public
*/
	function printFileError($errno, $errstr, $errfile, $errline)
	{
		global $CONF_LOG_PATH, $_SERVER;

		// Pour la gestion de l'affichage des erreurs
		if (($errno > 0) && ($errno <= $this->logLevel))
		{
			if ($this->logFile!="")
			{
				if (file_exists($CONF_LOG_PATH.$this->logFile))
				{
					$message="Date:".date("Y-m-d H:i:s").", Errno:".$errno.", Message:".$errstr.", File:".$errfile.", Line:".$errline.", Page:".urlencode($_SERVER["SCRIPT_NAME"].(isset($_SERVER["QUERY_STRING"])?"?".$_SERVER["QUERY_STRING"]:""));
					$file=new File($CONF_LOG_PATH.$this->logFile, "a");
					$file->addLine($message);
					$file->close();
				}
			}
		}
		return true;
	}

/**
* printFileError : affiche les erreur
*<P>affiche les erreurs stockées dans le Tampon si le tampon est actif</P>
* @access public
*/
	function printError($errno, $errstr, $errfile, $errline)
	{
		global $CONF_PAGE_EXECUTION;

		if ($this->debug!=false){
			$this->printScreenError($errno, $errstr, $errfile, $errline);
		}else{
			$this->addMailError($errno, $errstr, $errfile, $errline);
		}
		$this->printFileError($errno, $errstr, $errfile, $errline);

		/* gestion des erreurs fatales */
		if ($errno==1)
		{
			if ($this->debug==false)
			{
				/* on casse les redir */
				ob_end_clean();

				/* redirection vers la page + demande d'erreur */
				redirect( addIdToUrl($CONF_PAGE_EXECUTION."?msg=wrongArgument") );
			}else{
				$this->outputError();
			}
			$this->outputError();
			die();
		}
	}

/**
* addMailError : Ajout de données dans le mail
*
* <P>affiche les erreurs stockées dans le Tampon si le tampon est actif<br/>
* Stocke les messages d'erreurs pour l'envoi par mail</P>
* @access public
*/
	function addMailError($errno, $errstr, $errfile, $errline){

		// Pour la gestion de l'affichage des erreurs
		if (($errno > 0) && ($errno <= $this->verboseLevel))
		{
			$message="Date:".date("Y-m-d H:i:s").", Errno:".$errno.", Message:".$errstr.", File:".$errfile.", Line:".$errline.", Page:".urlencode($_SERVER["SCRIPT_NAME"].(isset($_SERVER["QUERY_STRING"])?"?".$_SERVER["QUERY_STRING"]:""));
			$this->messagemail .= $message;
		}
		return true;
	}

/**
* sendErrMail : envoi de mail
*
* <P>Envoi des messages d'erreur par mail. A voir la var. $this->messagemail ne contient plus rien une fois ds la fonction sendErrMail</P>
* @access public
*/
	function sendErrMail($message)
	{
		$subject=utf8_encode("Renvoi d'erreurs");
		$headers=utf8_encode("From: no-reply.php-error@".(isset($_SERVER['HTTP_HOST'])?$_SERVER['HTTP_HOST']:"granilim.install\n") . "Reply-To: no-reply.php-error@granilim.install\n" . "X-Mailer: PHP/ toto1.1\n");
		mail($this->sendto, $subject, $message, $headers);
	}

/**
* outPutError : affiche les erreur
*
* <P>affiche les erreurs stock้s dans le Tampon si le tampon est actif</P>
* @access public
*/
	function outputError()
	{
		global $CONF_LOG_PATH;
		$var=ob_get_contents();

		/*On teste la longueur du buffer avant de le supprimer*/
		if(ob_get_length())
			ob_end_flush();//while (@ob_end_flush());

		if ($this->debug==false)			/* On affiche les erreurs dans le cas ou on debug */
		{
			if ($var!="")
			{
				$message="Date:".date("Y-m-d H:i:s").", Errno:4, Message: Try to output DATA: ".$var.", File: ". __file__ .", Line: ". __line__ .", Page:".urlencode($_SERVER["SCRIPT_NAME"].(isset($_SERVER["QUERY_STRING"])?"?".$_SERVER["QUERY_STRING"]:""));
				$file=new File($CONF_LOG_PATH.$this->logFile, "a");
				$file->addLine($message);
				$file->close();
				$this->sendErrMail($message);
			}
			ob_end_clean();
		}
	}
}

/**
* fonction de traitement des erreurs (sert de tunnel si SYSTEM_ERROR est définie)
*<P>Ne pas utiliser --> générée par la classe d'erreur</P>
* @param entier errno
* @param chaine description de l'erreur
* @param chaine nom du fichier
* @param entier num้ro de ligne
*/
function systemErrorPhp($errno, $errstr, $errfile, $errline)
{
	if ( (isset($GLOBALS["SYSTEM_ERROR"])) && (is_object($GLOBALS["SYSTEM_ERROR"])) )
	{
		$GLOBALS["SYSTEM_ERROR"]->printError($errno, "PHP:".$errstr, $errfile, $errline);
	}else{
		echo "errno:".$errno.", message:PHP:".$errstr.", file:".$errfile.", line:".$errline."<br>";
	}
}

/* fonction de bufferisation des éléments */
function systemErrorCallBack($buffer)
{
	/* met en tampon le buffer */
	echo $buffer;
}

/**
* Fonction d'erreur globale utilisateur : permet une gestion mutualisée des messages d'erreurs.
*
* <P>C'est cette fonction qui est implémentée dans les développements</P>
* <P>seuil   : entier compris entre 1 et 10. 1 est une erreur fatale, 10 une remarque de très peu d'importance.
*              Entre les deux sont placés des nuances pour le programmeur soucieux de la hiérarchie !
* </P>
* <P>classe  : nom de la classe ou fonction appelante </P>
* <P>message : message d'erreur a afficher / enregistrer.</P>
* <P>line : ligne de l'erreur (utiliser __LINE__)</P>
* <P>file : fichier de l'erreur (utiliser __FILE__)</P>
* @param entier
* @param chaine
* @param chaine
* @param entier
* @param chaine
*/
function addError($seuil, $classe, $message, $line="", $file="")
{
	if ( (isset($GLOBALS["SYSTEM_ERROR"])) && (is_object($GLOBALS["SYSTEM_ERROR"])) )
	{
		$GLOBALS["SYSTEM_ERROR"]->printError($seuil, "UTILISATEUR:".$classe.":".$message, $file, $line);
	}else{
		echo "errno:".$seuil.", message:UTILISATEUR:".$classe.":".$message.", file:".$file.", line:".$line."<br>";
	}
}
?>
