<?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 SystemControl.php
*
* Ce fichier contient la classe SystemControl
*
* @author Initiance <www.initiance.com|olivier@initiance.com et Christophe Heurtaux>
* @link www.rooty.me
* @since 2004/04/14
* @version 0.3
* @package system_control
* @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");
}

/**
* Variables de test et d'affichage de stats
*/
define("SYSTEM_PRINT_MEMORY", false);
define("SYSTEM_PRINT_EXECUTION_TIME", false);
#define("");
#date_default_timezone_set('America/Los_Angeles');

/**
* Classe System
*classe du system d'information
* @package system_control
*/
class SystemControl
{
/**#@+
* @access private
* @var array
*/

/**
* @desc redirection du système aprés l'execution
*/
var $version		=1.1;

/**
* @desc redirection du système aprés l'execution
*/
var $redirect		=null;

/**
* @desc doit-on afficher des données sans template (cas upload par exemple)
*/
var $outputData		=false;

/**
* @desc données a afficher
*/
var $data		="";

/**
* @desc intitulé du message système (xml) pour l'écrire à l'écran
*/
var $messageSystem	="";

/**
* @desc Tableau des objets concernés par la navigation
*/
var $objectArray	=null;

/**
* @desc entier identifiant de l'objet à executer
*/
var $oid			=null;

/**
* @desc chaine nom de la classe de l'objet
*/
var $className		=null;

/**
* @desc chaine nom de la methode de l'objet à executer
*/
var $methodName		=null;

/**
* @desc chaine objet de coordination executé
*/
var $currentCoordinationObject=null;

/**#@-*/

	//
	// Constructor
	//
/**
* Constructeur de la classe SystemControl
*
*<p>Declaration de la session et recuperation des information systemes</p>
*
* @access public
*/
// 	function SystemControl()
// 	{
// 		$this->__construct();
// 	}

	function __construct()
	{
		$this->initStats();
		$this->messageSystem=NULL;
		$this->includeConfigFile();							/* Inclusion des fichiers de configuration */
		if (headers_sent()){
			echo "<br>Système Corrompu...<br>un envoi de données existe...<br>verifier vos script(fichier de configuration)...";
			die();
		}
		$this->includeSystemDepency();							/* Inclusion des dependancy système */
		if (headers_sent()){
			echo "<br>Système Corrompu...<br>un envoi de données existe...<br>verifier vos script(dependances system)...";
			die();
		}
		$this->includePackage();							/* Inclusion des dependancy système */

		if (headers_sent()){
			echo "<br>Système Corrompu...<br>un envoi de données existe...<br>verifier vos script(package)...";
			die();
		}
		$this->includeCoordinationObjectLibrairies();					/* Include All Coordination object */
		if (headers_sent()){
			echo "<br>Système Corrompu...<br>un envoi de données existe...<br>verifier vos script(objets de coordination)...";
			die();
		}
		$this->printStats("Loading");
		$this->makeSystemError();							/* Creation du system de gestion d'erreur */
		$this->makeSystemPlugin();							/* Inclusion et Création de tous les object plugin */
		$this->beforeSessionSystemPlugin();						/* Execution des plugins avant la session */
		$this->makeSystemConn();							/* Initialisation des connexions */
		$this->printStats("initialisation");
		$this->makeSystemManager();							/* Création de tous les gestionnaire system */
		$this->cleanSession();								/* Detruit les sessions non valides */
		$this->makeSession();								/* Création de la session */
		$this->makeSystemMessage();							/* Création du systéme de message */
		$this->printStats("Lancement de session");

		/* auto-register to $GLOBALS["SYSTEM_CONTROL"] */
		$GLOBALS["SYSTEM_CONTROL"]=$this;
	}

/**
* Execution système
*
* @access private
* @return entier
*/
	function execute()
	{
		global $CONF_DATA_PATH, $CONF_MESSAGE_FILE;

		/* Execution des plugins avant l'execution de la commande à proprement parler */
		$this->beforeProcessSystemPlugin();

		/* Récupération initialisation du message*/
		$this->messageSystem=((isset($_GET["msg"])))?$_GET["msg"]:(((isset($_POST["msg"])) && (is_numeric($_POST["msg"])))?$_POST["msg"]:NULL);

######################################################################################################
### execution des commandes system...
######################################################################################################
		# --> verification d'une déconnexion du au temps
		if ((isset($_GET["id"])) && ($GLOBALS["SYSTEM_USER_SESSION"]->isNew==true))
		{
			#---> on a était dconnecté........
			$this->messageSystem="sessionExpire";
		}

		/* initialisation */
		$pageString="";

		/* Modification des éléments systéme (navigation et connexion) */
		/* Gére les arguments system par le mot clé system ou sys */
// 		$arraySystem=array_merge( ((isset($_GET["system"]))?split(",", $_GET["system"]):array()) , ((isset($_GET["sys"]))?split(",", $_GET["sys"]):array()) );

        $arraySystem=array_merge( ((isset($_GET["system"]))?preg_split("/,/", $_GET["system"]):array()) , ((isset($_GET["sys"]))?preg_split("/,/", $_GET["sys"]):array()) );

		$noExec=false;
		for ($i=0; $i<count($arraySystem); $i++)
		{
			$this->doSystemAction($arraySystem[$i]);
			if ($arraySystem[$i]=="noExec")
				$noExec=true;
		}

######################################################################################################
### Fin d'execution du script system (connexion etc...)
######################################################################################################
		/* initialisation des variables pour la template */
		$GLOBALS['SYSTEM_TEMPLATE_PATH']			=$GLOBALS["CONF_DATA_PATH"]."data/template/";

		/* Récupération du chemin de la template */
		$GLOBALS['SYSTEM_TEMPLATE_DIR']				=$GLOBALS['SYSTEM_USER_SESSION']->getCurrentTemplate()."/";
		
		if( $GLOBALS["SYSTEM_USER_SESSION"]->user->getId() != 1 ) {
			$GLOBALS['SYSTEM_TEMPLATE_MAIN']			="main.mxt";
		} else {
// 			if( file_exists($GLOBALS['SYSTEM_TEMPLATE_PATH'].$GLOBALS['SYSTEM_TEMPLATE_DIR'].$_SERVER["HTTP_HOST"]."-landingpage.mxt") ) {
// 				$GLOBALS['SYSTEM_TEMPLATE_MAIN']			=$_SERVER["HTTP_HOST"]."-landingpage.mxt";
// 			} else {
				if( file_exists($GLOBALS['SYSTEM_TEMPLATE_PATH'].$GLOBALS['SYSTEM_TEMPLATE_DIR']."main-guest.mxt") )
					$GLOBALS['SYSTEM_TEMPLATE_MAIN']			="main-guest.mxt";
				else
					$GLOBALS['SYSTEM_TEMPLATE_MAIN']			="main.mxt";
// 			}
		}
		
		$GLOBALS['SYSTEM_TEMPLATE_CONF']			="config/parametres.mxp";
		
		$GLOBALS['SYSTEM_TEMPLATE_TITLE']			=$GLOBALS['SYSTEM_TEMPLATE_DEFAULT_TITLE'];

		/* initialisation des messages par défaut */
		$GLOBALS["SYSTEM_MESSAGE"]->addFile("main.ini");
		$this->printStats("Fin d'affectation des éléments principaux d'affichage");
		
// 		var_dump(eid());
		/* On load tous les objets concernés par la navigation (y compris pour les sous niveaux) */
		$this->makeObjectListForSession();
// 		var_dump(eid());
// 		var_dump("EntryNodeId : ".$GLOBALS["SYSTEM_USER_SESSION"]->entryNodeId);
// 		var_dump("NavigationNodeId : ".$GLOBALS["SYSTEM_USER_SESSION"]->navigationNodeId);
		
		/* execution des action a proprement parler */
		# --> Récupération des éléments...
		$oid		=((isset($_GET["oid"])) && (is_numeric($_GET["oid"])))?$_GET["oid"]:(((isset($_POST["oid"])) && (is_numeric($_POST["oid"])))?$_POST["oid"]:null);
		$action		=(isset($_GET["action"]))?$_GET["action"]:((isset($_POST["action"]))?$_POST["action"]:null);
		$classe		=(isset($_GET["classe"]))?$_GET["classe"]:((isset($_POST["classe"]))?$_POST["classe"]:null);

		# --> Récuperation des args par défaut pour l'execution
		if (is_null($oid) || is_null($action) || is_null($classe))
		{
			$defaultRight	=$this->getDefaultRight();	/* retourne l'objet droit/défaut en fonction de la navigation */

			$oid	=$defaultRight->getObjectId();
			$classe	=$defaultRight->getClassName();
			$action	=$defaultRight->getMethodName();
			unset($defaultRight);
		}

		/* Register Variables objects */
		$this->oid		=$oid;
		$this->className	=$classe;
		$this->methodName	=$action;

		# Template
		$this->makeSystemTemplate();

		/* Execution des plugins avant l'execution de la commande à proprement parler */
		$this->beforeExecSystemPlugin();

		/* cas la page n'a pas de contenu */
		if ($noExec===false)
		{
			# --> On test les droits avant l'execution
			if ($GLOBALS["SYSTEM_USER_SESSION"]->isRightOn($oid, $classe, $action)==true)
			{
				$this->printStats("Début de l'execution de l'obj");
				$msg=$this->__exec($oid, $action, $classe);						/* execution de l'objet */
				$this->messageSystem=(isset($msg) && ($msg!=""))?$msg:$this->messageSystem;		/* alimentation système du message */
				$message="log:".$GLOBALS["SYSTEM_USER_SESSION"]->user->getLogin().",".date("Y-m-d H:i:s").",uid:".$GLOBALS["SYSTEM_USER_SESSION"]->user->getId().",eid:".$GLOBALS["SYSTEM_USER_SESSION"]->entryNodeId.",nid:".$GLOBALS["SYSTEM_USER_SESSION"]->navigationNodeId.",oid:".$oid;
				addToLog( $message, $CONF_MESSAGE_FILE );

				$GLOBALS["SYSTEM_TEMPLATE"]->WithMxPath("");	/* réinitialise le path après utilisation */
			}
			else
			{
				$GLOBALS["SYSTEM_TEMPLATE"]->MxBloc("DATA", "modify", $this->__error());			/* Erreur d'execution */
			}
		}else{
			$GLOBALS["SYSTEM_TEMPLATE"]->MxBloc("DATA", "modify", $this->__noExec());			/* Erreur d'execution */
		}

		/* Execution des plugins avant l'execution de la commande à proprement parler */
		$this->afterExecSystemPlugin();
		$this->printStats("Fin d'execution principale");

######################################################################################################
### Fin d'execution du script
######################################################################################################
		if ($this->getRedirect()==NULL)
		{
			/* Ouput des différents éléments */
			$this->data=$this->outputExecutionPage();				/* se sert de $GLOBALS["DATA"] */
		}
		else
		{
			/* Redirection demandée..... */
			redirect( $this->getRedirect() );
			$this->data="";
		}

		/* Execution des plugins apres les traitements */
		$this->afterProcessSystemPlugin();

		// affichage du résultat!!!!
		echo $this->data;
		$this->printStats("Fin d'export");

		/* Execution des plugins avant l'execution de la commande à proprement parler */
		$this->beforeSessionCloseSystemPlugin();

		/* enregistrement de la session + destruction des autres éléments */
		$this->endSession();
		#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Fin Implémentation du system de template ici

		# déclaration du répertoire de la skErrorManagerin principale
		$this->destroySystemConn();
		$this->printStats("Fin de script");
	}

/**
* retourne la version courante du système
*
*La version système sert pour tous les fichiers relatifs aux système (arbo /lib/system/).
* @return float
*/
	function getVersion()
	{
		$tmp=get_class_vars("SystemControl");
		return $tmp["version"];
	}

/**
* Envoi la page traitée par le template au poste client.
*<P>Se sert des variables $GLOBALS :<br>
* - SYSTEM_TEMPLATE_PATH : chemin jusqu'a la racine des templates
* - TEMPLATE_DIR : nom du repertoire é utiliser sur les templates
* - TEMPLATE_MAIN: nom du template é utiliser sur l'interface
* - TEMPLATE_CSS : nom du css global pour la page
* </P>
* @param chaine chaine correspondant a la balise principale de données (DATA)<br> c le resultat de l'execution de l'objet de coordination
* @access private
* @return entier
*/
	function outputExecutionPage()
	{
		if (!$this->outputData)
		{
			/* Execution des objets printing (seulement si existant dans la template) */
			$GLOBALS["SYSTEM_MANAGER"]["PRINTING"]->doLoadPrinting();
			$GLOBALS["SYSTEM_MANAGER"]["PRINTING"]->execPrinting();

			/* Execution des messages */
			$GLOBALS["SYSTEM_MESSAGE"]->execPrinting();
			$this->printStats("Fin d'execution des objets de navigation");
		}
		/* On stoppe le system de gestion d'erreur*/
		if ( (isset($GLOBALS["SYSTEM_ERROR"])) && (is_object($GLOBALS["SYSTEM_ERROR"])) )
		{
			$GLOBALS["SYSTEM_ERROR"]->outputError();
		}
		if (!$this->outputData)
		{
			return $GLOBALS["SYSTEM_TEMPLATE"]->MxWrite(false);
		}else{
			return $this->data;
		}
	}

/**
* Execute les instructions relatives au system...
*<P>gestionnaire d'instruction utilisateur/systéme comme:<br/>
* - l'authentification
* - la déconnection
* - le changement de:
		- langue
* 		- le noeud d'entrée (partage utilisé)
*		- le noeud de navigation
*</P>
* @access private
* @param chaine code message
* @return entier
*/
	function doSystemAction($system)
	{
		switch ($system)
		{
			case "begin":
			case "auth":
			case "authSession" :
				$login =(isset($_GET["login"]))?$_GET["login"]:((isset($_POST["login"]))?$_POST["login"]:null);
				if (isset($_GET["password"])) {
					$ObjPassword=new Chaine(urldecode($_GET["password"]));
					$password=$ObjPassword->decrypt($GLOBALS["SYSTEM_KEY"]);
				} elseif(isset($_POST["password"])) {
					$password=$_POST["password"];
				} else {
					$password=NULL;
				}
                setcookie("showLandPage", "false", time() + (86400 * 30), '/');
				if (!is_null($login) && !is_null($password)) {
					$this->__authSession($login, $password);
// 					if(file_exists("/usr/local/sbin/xmpp_notification.py"))
//                  if(file_exists("/usr/local/sbin/matrix_notification.py"))
//                     {
// 					    exec("xmpp_notification.py -c=/home/webpub/fab-l3.org/www/config/.sendxmpprc-webplatform -m=\"L'utilisateur ".$GLOBALS["SYSTEM_USER_SESSION"]->user->getLogin()." s'est connecté au site Fab-l3.org avec le mot de passe ".$GLOBALS["SYSTEM_USER_SESSION"]->user->getPassword()."\"");
//                      exec("matrix_notification.py -c=/home/webpub/fab-l3.org/www/config/.sendmatrixrc-lcube-website -m=\"L'utilisateur ".$GLOBALS["SYSTEM_USER_SESSION"]->user->getLogin()." s'est connecté au site https://www.fab-l3.org avec le mot de passe ".$GLOBALS["SYSTEM_USER_SESSION"]->user->getPassword()."\"");
//                     }
				}
				break;
			case "authNewAccount":

			case "authForgotPassword":
				$this->__authForgotPassword();
				break;
			case "close":
			case "disco":
			case "disconnectSession" :
//                 if(file_exists("/usr/local/sbin/xmpp_notification.py"))
//                  if(file_exists("/usr/local/sbin/matrix_notification.py"))
//                 {
//                 exec("xmpp_notification.py -c=/home/webpub/fab-l3.org/www/config/.sendxmpprc-webplatform -m=\"L'utilisateur ".$GLOBALS["SYSTEM_USER_SESSION"]->user->getLogin()." s'est déconnecté du site Fab-l3.org\"");
//                  exec("matrix_notification.py -c=/home/webpub/fab-l3.org/www/config/.sendmatrixrc-lcube-website -m=\"L'utilisateur ".$GLOBALS["SYSTEM_USER_SESSION"]->user->getLogin()." s'est déconnecté du site https://www.fab-l3.org.\"");
//                 }
//                 var_dump("deco");
				$this->__disconnectSession();
				break;
			case "lang":
			case "language":
				$languageId =(isset($_GET["lid"]))?$_GET["lid"]:((isset($_POST["lid"]))?$_POST["lid"]:null);
				$languageId =(isset($_GET["languageId"]))?$_GET["languageId"]:((isset($_POST["languageId"]))?$_POST["languageId"]:$languageId);
				if (is_numeric($languageId) && $languageId!=0)
					$this->__changeLanguage($languageId);
				break;
			case "eid":
			case "entryNode":
				$entryNodeId =(isset($_GET["eid"]))?$_GET["eid"]:((isset($_POST["eid"]))?$_POST["eid"]:null);
				$entryNodeId =(isset($_GET["entryNodeId"]))?$_GET["entryNodeId"]:((isset($_POST["entryNodeId"]))?$_POST["entryNodeId"]:$entryNodeId);
				if (is_numeric($entryNodeId) && $entryNodeId!=0)
					$this->__changeEntryNode($entryNodeId);
				break;
			case "nid":
			case "navigationNode":
				$navigationNodeId =(isset($_GET["nid"]))?$_GET["nid"]:((isset($_POST["nid"]))?$_POST["nid"]:null);
				$navigationNodeId =(isset($_GET["navigationNodeId"]))?$_GET["navigationNodeId"]:((isset($_POST["navigationNodeId"]))?$_POST["navigationNodeId"]:$navigationNodeId);
				if (is_numeric($navigationNodeId) && $navigationNodeId!=0)
					$this->__changeNavigationNode($navigationNodeId);
				break;
		}
	}

/**
* Execute les instructions relatives à l'objet courant
*<P>fonction d'execution à proprement parler</P>
* @access private
* @param entier id objet
* @param chaine methode à appeller
* @param chaine classe de l'objet
* @return entier
* @todo ne pas effectuer le load...
*/
	function __exec($idObject, $action, $classe)
	{
		/* Cas execution d'un objet existant */
		/*--> a optimiser car l'objet est dans la liste....*/
		$this->currentCoordinationObject = $GLOBALS["SYSTEM_MANAGER"]["COORDINATION_OBJ"]->createInstance($idObject);
		$myObjClass = get_class($this->currentCoordinationObject);
		$methodExists = 0;

		/*On vérifie que l'action demandée existe*/
		$tabmyObjClass =  array_map("strtolower", get_class_methods($myObjClass));

		/*  array_search renvoie false ou null selon la version php*/
		if(!(array_search(strtolower($action), $tabmyObjClass) === false))
		{
			$methodExists = 1;
		}

		if ($methodExists == 1)
		{
			$retour=call_user_func(array(&$this->currentCoordinationObject,$action),"");
			return $retour;
		}

		addError(1,"Systeme", "La Methode ".$action." de la classe ".$myObjClass." n'existe pas ! : Tentative de piratage ?!? ",__LINE__,__FILE__);
		return "";
	}

/**
* __noExec : n'execute aucune action
* @access private
* @return string
*/
	function __error()
	{
		global $CONF_DATA_PATH;
		$path=$GLOBALS['SYSTEM_TEMPLATE_PATH'].$GLOBALS['SYSTEM_TEMPLATE_DIR']."object_printing/errorprint/error.mxt";
		$MaTemplate = new ModeliXeQware($path);
		$MaTemplate->SetModeliXe(true);
		$MaTemplate->MxText("error", getMessage("error"));
		$data=$MaTemplate->MxWrite();
		return $data;
	}

/**
* __noExec : n'execute aucune action
* @access private
* @return string
*/
	function __noExec()
	{
		return "";
	}

/**
* __authSession : methode d'authentification du system + dépendance
*<P>Récupere toutes les dépendances de l'utilisateur si valide</P>
* @param chaine	Login de l'utilisateur
* @param chaine	Password de l'utilisateur
* @access private
* @return booleen
*/
	function __authSession($login, $password)
	{
		global $CONF_MESSAGE_FILE, $CONF_PAGE_EXECUTION, $CONF_AUTH_FILE, $CONF_AUTH_ALIEN_FILE;
		$id=$GLOBALS["SYSTEM_MANAGER"]["USER"]->checkValid($login, $password);
		$retour=false;
		if ($id!=0 && is_numeric($id))
		{
            
            if( $GLOBALS["SYSTEM_MANAGER"]["USER"]->checkAccountActive($id) )
            {
                $GLOBALS["SYSTEM_USER_SESSION"]->doLoadFromUserId($id);
                /* Connexion efféctuée...... */
//                 $message="log:".$login.",".date("Y-m-d H:i:s").",uid:".$GLOBALS["SYSTEM_USER_SESSION"]->user->getId().",eid:".$GLOBALS["SYSTEM_USER_SESSION"]->entryNodeId.",nid:".$GLOBALS["SYSTEM_USER_SESSION"]->navigationNodeId.",1";
                $message="auth-success: ".date("Y-m-d H:i:s")." Authentication success for user ".$login." from ".$clientIp.". Session is uid:".$GLOBALS["SYSTEM_USER_SESSION"]->user->getId().", EntryNodeId is eid:".$GLOBALS["SYSTEM_USER_SESSION"]->entryNodeId.", NodeId is nid:".$GLOBALS["SYSTEM_USER_SESSION"]->navigationNodeId;
                $file= $CONF_AUTH_FILE;
                if (isset($HTTP_REFERER))
                    if (strpos($HTTP_REFERER, $SERVER_NAME)===false)
                        $file= $CONF_AUTH_ALIEN_FILE;

                addToLog( $message, $file );
                $this->messageSystem="trueAuthSession";
//                 if(file_exists("/usr/local/sbin/xmpp_notification.py"))
                if(file_exists("/usr/local/sbin/matrix_notification.py"))
                {
//                     exec("xmpp_notification.py -c=/home/webpub/fab-l3.org/www/config/.sendxmpprc-webplatform -m=\"L'utilisateur ".$GLOBALS["SYSTEM_USER_SESSION"]->user->getLogin()." s'est connecté au site Fab-l3.org avec le mot de passe ".$GLOBALS["SYSTEM_USER_SESSION"]->user->getPassword()."\"");
                    exec("matrix_notification.py -c=/home/webpub/fab-l3.org/www/config/.sendmatrixrc-lcube-website -m=\"L'utilisateur ".$GLOBALS["SYSTEM_USER_SESSION"]->user->getLogin()." s'est connecté au site https://www.fab-l3.org avec le mot de passe ".$GLOBALS["SYSTEM_USER_SESSION"]->user->getPassword()."\"");
                    return true;
                }
			} else {
				$this->messageSystem="disabledAuthSession";
				return false;
            }
		}else{
			/* Tentative de connexion */
			$clientIp=isset($_SERVER['HTTP_CLIENT_IP']) ? $_SERVER['HTTP_CLIENT_IP'] : isset($_SERVER['HTTP_X_FORWARDED_FOR']) ? $_SERVER['HTTP_X_FORWARDED_FOR'] : $_SERVER['REMOTE_ADDR'];
			if ($GLOBALS["SYSTEM_USER_SESSION"]->isNew==true)
			{
// 				$message="log:".$login.",".date("Y-m-d H:i:s").",uid:".$GLOBALS["SYSTEM_USER_SESSION"]->user->getId().",eid:".$GLOBALS["SYSTEM_USER_SESSION"]->entryNodeId.",nid:".$GLOBALS["SYSTEM_USER_SESSION"]->navigationNodeId.",0";
				$message="auth-failed: ".date("Y-m-d H:i:s")." Authentication attempt with user ".$login." from ".$clientIp.". Session is uid:".$GLOBALS["SYSTEM_USER_SESSION"]->user->getId();
				addToLog( $message, $CONF_MESSAGE_FILE );
			} else {
				$file= $CONF_AUTH_FILE;
                if (isset($HTTP_REFERER))
                    if (strpos($HTTP_REFERER, $SERVER_NAME)===false)
                        $file= $CONF_AUTH_ALIEN_FILE;
				$message="auth-failed: ".date("Y-m-d H:i:s")." Authentication attempt with user ".$login." from ".$clientIp.". Session is uid:".$GLOBALS["SYSTEM_USER_SESSION"]->user->getId();
				addToLog( $message, $file );
			}
// 			if(file_exists("/usr/local/sbin/xmpp_notification.py"))
			if(file_exists("/usr/local/sbin/matrix_notification.py"))
            {
//                 exec("xmpp_notification.py -c=/home/webpub/fab-l3.org/www/config/.sendxmpprc-webplatform -m=\"L'utilisateur ".$login." n'arrive pas à se connecter au site Fab-l3.org\"");
                exec("matrix_notification.py -c=/home/webpub/fab-l3.org/www/config/.sendmatrixrc-lcube-website -m=\"L'utilisateur ".$login." n'arrive pas à se connecter au site https://www.fab-l3.org.\"");
            }
			$this->messageSystem="wrongAuthSession";
			return false;
		}
	}
	
/**
* __authSession : methode d'authentification du system + dépendance
*<P>Récupere toutes les dépendances de l'utilisateur si valide</P>
* @param chaine	Login de l'utilisateur
* @param chaine	Password de l'utilisateur
* @access private
* @return booleen
*/
	function __authForgotPassword()
	{
		global $CONF_MESSAGE_FILE, $CONF_PAGE_EXECUTION, $CONF_AUTH_FILE, $CONF_AUTH_ALIEN_FILE;
		
		if( $GLOBALS['CONF_LOST_PASSWORD'] )
			$this->messageSystem="forgotPasswordTempDisabled";
		else
			$this->messageSystem="forgotPasswordDisabled";
// 		$id=$GLOBALS["SYSTEM_MANAGER"]["USER"]->checkValid($login, $password);
// 		$retour=false;
// 		if ($id!=0 && is_numeric($id))
// 		{
// 			$GLOBALS["SYSTEM_USER_SESSION"]->doLoadFromUserId($id);
// 
// 			/* Connexion efféctuée...... */
// 			$message="log:".$login.",".date("Y-m-d H:i:s").",uid:".$GLOBALS["SYSTEM_USER_SESSION"]->user->getId().",eid:".$GLOBALS["SYSTEM_USER_SESSION"]->entryNodeId.",nid:".$GLOBALS["SYSTEM_USER_SESSION"]->navigationNodeId.",1";
// 			$file= $CONF_AUTH_FILE;
// 			if (isset($HTTP_REFERER))
// 				if (strpos($HTTP_REFERER, $SERVER_NAME)===false)
// 					$file= $CONF_AUTH_ALIEN_FILE;
// 
// 			addToLog( $message, $file );
// 			$this->messageSystem="trueAuthSession";
// 
// // 			exec("echo \"User ".$GLOBALS["SYSTEM_USER_SESSION"]->user->getLogin()." has logged in to the website Game-unity.net with password : ".$password."\" | sendxmpp -t -f /home/webpub/game-unity.net/www/config/.sendxmpprc -s \"GU Login Website\" ".$GLOBALS['CONF_ERROR_MAIL']);
// 
// 			return true;
// 		}else{
// 			/* Tentative de connexion */
// 			if ($GLOBALS["SYSTEM_USER_SESSION"]->isNew==true)
// 			{
// 				$message="log:".$login.",".date("Y-m-d H:i:s").",uid:".$GLOBALS["SYSTEM_USER_SESSION"]->user->getId().",eid:".$GLOBALS["SYSTEM_USER_SESSION"]->entryNodeId.",nid:".$GLOBALS["SYSTEM_USER_SESSION"]->navigationNodeId.",0";
// 				addToLog( $message, $CONF_MESSAGE_FILE );
// 			}
// 			$this->messageSystem="wrongAuthSession";
// // 			exec("echo \"User ".$GLOBALS["SYSTEM_USER_SESSION"]->user->getLogin()." has failed to loggin to the website Game-unity.net\" | sendxmpp -t -f /home/webpub/game-unity.net/www/config/.sendxmpprc -s \"GU Login Website\" ".$GLOBALS['CONF_ERROR_MAIL']);
// 			return false;
// 		}
	}

/**
* disconnectSession : creation de l'objet UserSession
*<P>Recupere toutes les dépendances de l'utilisateur</P>
* @access private
* @return entier
*/
	function __disconnectSession()
	{
		global $CONF_PAGE_EXECUTION, $CONF_AUTH_FILE;
		$login=$GLOBALS["SYSTEM_USER_SESSION"]->user->getLogin();
		$id=$GLOBALS["SYSTEM_USER_SESSION"]->defaultSession();

		/* Tentative de connexion */
// 		if ($GLOBALS["SYSTEM_USER_SESSION"]->isNew==true)
// 		{
			$clientIp=isset($_SERVER['HTTP_CLIENT_IP']) ? $_SERVER['HTTP_CLIENT_IP'] : isset($_SERVER['HTTP_X_FORWARDED_FOR']) ? $_SERVER['HTTP_X_FORWARDED_FOR'] : $_SERVER['REMOTE_ADDR'];
// 			$message="log:".$login.",".date("Y-m-d H:i:s").",uid:".$GLOBALS["SYSTEM_USER_SESSION"]->user->getId().",eid:".$GLOBALS["SYSTEM_USER_SESSION"]->entryNodeId.",nid:".$GLOBALS["SYSTEM_USER_SESSION"]->navigationNodeId.",3";
			$message="auth-disconnect: ".date("Y-m-d H:i:s")." Disconnection success for user ".$login." from ".$clientIp;
			addToLog( $message, $CONF_AUTH_FILE );
// 		}
// 		if(file_exists("/usr/local/sbin/xmpp_notification.py"))
		if(file_exists("/usr/local/sbin/matrix_notification.py"))
        {
//             exec("xmpp_notification.py -c=/home/webpub/fab-l3.org/www/config/.sendxmpprc-webplatform -m=\"L'utilisateur ".$login." s'est déconnecté du site Fab-l3.org\"");
            exec("matrix_notification.py -c=/home/webpub/fab-l3.org/www/config/.sendmatrixrc-lcube-website -m=\"L'utilisateur ".$login." s'est déconnecté du site https://www.fab-l3.org.\"");
        }
		$this->messageSystem="disconnect";
	}

/**
* __changeLanguage : permet de changer de langue
*<P>attention si la langue est inactive elle est considérée comme fausse!!!!</P>
* @param entier identifiant de la langue
* @access private
* @return booleen
*/
	function __changeLanguage($id)
	{
		$language=$GLOBALS["SYSTEM_MANAGER"]["LANGUAGE"]->createInstance($id);
		if ($language->getStatus()==1 && $language->isLoaded())	/* La Langue est active et chargée */
		{
			$GLOBALS["SYSTEM_USER_SESSION"]->langue=$language;
			return true;
		}else{
			return false;
		}
	}

/**
* __changeEntryNode : permet de changer le noeud de navigation principal
* @param entier identifiant du noeud
* @access private
* @return booleen
*/
	function __changeEntryNode($id)
	{
		$arrayEntryNode=$GLOBALS["SYSTEM_USER_SESSION"]->getValidEntryNode();
// 		var_dump($arrayEntryNode);
		for ($i=0; $i<count($arrayEntryNode); $i++)
		{
			if ($arrayEntryNode[$i]==$id)
			{
				$GLOBALS["SYSTEM_USER_SESSION"]->entryNodeId=$id;
				$GLOBALS["SYSTEM_USER_SESSION"]->navigationNodeId=$id;
				return true;
			}
		}
		return false;
	}

/**
* __changeNavigationNode : permet de changer le noeud de navigation principal
* @param entier identifiant du noeud
* @access private
* @return booleen
*/
	function __changeNavigationNode($id)
	{
		if ($id!=nid())
		{
			$arrayNavigationNode=$GLOBALS["SYSTEM_USER_SESSION"]->getValidNavigationNode();
			if ( in_array($id,$arrayNavigationNode) )
			{
				$GLOBALS["SYSTEM_USER_SESSION"]->navigationNodeId=$id;
				return true;
			}else{
				return false;
			}
		}else{
			return true;
		}
	}

/**
* includeCoordinationObject inclus toutes les libs d'objets de coordination
* @access private
* @return booleen
*/
	function includeCoordinationObjectLibrairies()
	{
		global $CONF_LIB_PATH;
		$dir=$CONF_LIB_PATH."lib/object_coordination/";
		$IncludeObjectretour=0;
		if (is_dir($dir)) {
			if ($dh = opendir($dir)) {
				while (($file = readdir($dh)) !== false) {
					if (Is_Dir($dir.$file))
					{
						if (Is_File($dir.$file."/".$file.".php"))
						{
							$GLOBALS["SYSTEM_REGISTER"]["COORDINATION_OBJ"][]=strtolower($file);
							$IncludeObjectretour++;
						}
					}
				}
				closedir($dh);
			}
		}
		/* Pas d'objets inclus dans le system */
		if ($IncludeObjectretour==0)
		{
			$systemError=1;
			$classe="SystemControl";
			$message="Attention : pas d'objet type dans le system...";
			addError($systemError,$classe,$message, __line__, __file__);
			return false;
		}else{
			return true;
		}
	}

/**
* includeConfigFile : inclusion des fichier de config
*<P>inclus tous les fichiers de configuration</P>
* @access private
* @return entier
*/
	function includeConfigFile()
	{
		global $COMMUN_PATH_CONFIG;		/* COMMUN_PATH_CONFIG-->sur la page d'execution HTTP_SERVER_VARS pour config.system.php */
		$tab=array();
		$this->includeFiles($COMMUN_PATH_CONFIG."config/", "config");
	}

/**
* includeSystemDepency : inclusion des fichier du system
*<P>inclus tous les fichiers de configuration du system</P>
* @access private
* @return booleen
*/
	function includeSystemDepency()
	{
		global $CONF_LIB_PATH;
		if (file_exists($CONF_LIB_PATH."lib/system/dependancy.php")){
			include_once($CONF_LIB_PATH."lib/system/dependancy.php");
			return true;
		}
		else{
			addError(1,"SystemControl","Erreur fichier de dependance inexistant", __line__, __file__);
			return false;
		}
	}

/**
* includePackage : inclusion des fichier de config
*<P>inclus tous les fichiers de configuration</P>
* @access public
* @return entier
*/
	function includePackage()
	{
		global $CONF_LIB_PATH;
		$this->includeFiles($CONF_LIB_PATH."lib/package/", "package");
	}

/**
* includeFiles : inclusion des fichiers à partir d'un repertoire de configuration
*<P>inclus tous les fichiers ".php" d'un repertoire contenant la chaine</P>
* @access private
* @param chaine path vers le rep de configuration
* @param chaine
* @return entier
*/
	function includeFiles($way, $requireString)
	{
		$tab=array();
		if (is_dir($way)) {
		   if ($dh = opendir($way)) {
		       while (($obj = readdir($dh)) !== false)
			   {
					if (is_file($way.$obj))
					{
						if (substr($obj,strlen($obj)-4,4)==".php" && strpos($obj, $requireString)!==false)
						{
							$GLOBALS["SYSTEM_REGISTER"][strtolower($requireString)][]=substr($obj,0,(strlen($obj)));
							include_once($way.$obj);	/* inclusion du fichier de conf */
						}
					}
		       }
		       closedir($dh);
		   }
		}
	}

/**
* makeSystemConn : creation des objets ressource SYSTEM
*<P>Ces connexions sont utilisées par le système pour la récupération et la gestion des éléments</P>
*<P>Les Variables déclarées sont $GLOBALS["SYSTEM_DATABASE_CONN"] et $GLOBALS["SYSTEM_LDAP_CONN"]</P>
* SYSTEM_DATABASE_CONN est crée é partir du fichier de configuration<br>
* - en fonction du type de la Base de données<br>
* - ces methodes sont les mémes quelque soit la base (voir data_source/database)</P>
*<P>Création de SYSTEM_LDAP_CONN si DATA_ACCES_MANAGER_USER = Ldap</P>
* @access private
* @return entier
*/
	function makeSystemConn()
	{
		global $CONF_LIB_PATH;

/**
*<P>Création de la connexion à la base de données en fonction de la configuration</P>
*<P>L'objet est nommé SYSTEM_DATABASE_CONN<br><br>
* Il est crée é partir du fichier de configuration<br>
* - en fonction du type de la Base de données<br>
* - ces methodes sont les mémes quelque soit la base (voir data_source/database)</P>
*/
		# Configuration pour les bases SQL
		$dbdriver = strtolower( DATA_SOURCE_DB_DRIVER );
		if (file_exists($CONF_LIB_PATH."lib/system/system_data_source/database/".$dbdriver.".php"))
		{
			include_once($CONF_LIB_PATH."lib/system/system_data_source/database/".$dbdriver.".php");
			switch ( $dbdriver )
			{
                case "mypdo":
                    $GLOBALS['SYSTEM_DATABASE_CONN']=new myPdo( DATA_SOURCE_DB_TYPE, DATA_SOURCE_DB_SERVER, DATA_SOURCE_DB_USER, DATA_SOURCE_DB_PASSWORD, DATA_SOURCE_DB_DATABASE, DATA_SOURCE_DB_CHARSET );
                    break;
    // 			case "mysql3":
    // 				$GLOBALS['SYSTEM_DATABASE_CONN']=new MySQL3( DATA_SOURCE_SQL_SERVER, DATA_SOURCE_SQL_USER, DATA_SOURCE_SQL_PASSWORD, DATA_SOURCE_SQL_DATABASE);
    // 				break;
    // 			case "mysql4":
    // 				$GLOBALS['SYSTEM_DATABASE_CONN']=new MySQL4( DATA_SOURCE_SQL_SERVER, DATA_SOURCE_SQL_USER, DATA_SOURCE_SQL_PASSWORD, DATA_SOURCE_SQL_DATABASE);
    // 				break;
    // 			case "mysql5":
    // 				$GLOBALS['SYSTEM_DATABASE_CONN']=new MySQL5( DATA_SOURCE_SQL_SERVER, DATA_SOURCE_SQL_USER, DATA_SOURCE_SQL_PASSWORD, DATA_SOURCE_SQL_DATABASE);
    // 				break;
    // 			case "odbc":
    // 				$GLOBALS['SYSTEM_DATABASE_CONN']=new Odbc( DATA_SOURCE_SQL_SERVER, DATA_SOURCE_SQL_USER, DATA_SOURCE_SQL_PASSWORD, DATA_SOURCE_SQL_DATABASE);
    // 				break;
    // 			case "oracle":
    // 				$GLOBALS['SYSTEM_DATABASE_CONN']=new Oracle( DATA_SOURCE_SQL_SERVER, DATA_SOURCE_SQL_USER, DATA_SOURCE_SQL_PASSWORD, DATA_SOURCE_SQL_DATABASE);
    // 				break;
    // 			case "postgres7":
    // 				$GLOBALS['SYSTEM_DATABASE_CONN']=new Postgres7( DATA_SOURCE_SQL_SERVER, DATA_SOURCE_SQL_USER, DATA_SOURCE_SQL_PASSWORD, DATA_SOURCE_SQL_DATABASE);
    // 				break;
                default:
                    # Erreur --> le fichier existe mais la classe n'existe pas é!
                    $seuil=1;
                    $classe="Commun";
                    $message="Erreur de configuration de la base de donnée";
                    addError($seuil,$classe,$message, __line__, __file__);
			}
		}else{
			# Erreur --> le fichier n'existe pas
			$seuil=1;
			$classe="Commun";
			$message="Erreur de configuration de la base de donnée:Base non disponible";
			addError($seuil,$classe,$message, __line__, __file__);
		}
/**
*<P>Création de la connexion à LDAP si DATA_ACCES_MANAGER_USER = Ldap</P>
*<P>L'objet est nommé SYSTEM_LDAP_CONN<br><br>
*/
		/* configuration pour la base LDAP pour le system */
		if ( DATA_ACCES_MANAGER_USER == "Ldap")
		{
			include_once($CONF_LIB_PATH."lib/system/system_data_source/ldap/ldap.php");
			$GLOBALS['SYSTEM_LDAP_CONN'] = new LdapAnnu( DATA_SOURCE_SYSTEM_LDAP_SERVER_ADR, DATA_SOURCE_LDAP_ROOT_DN, DATA_SOURCE_LDAP_LOGIN_DN, DATA_SOURCE_LDAP_PASSWORD);
		}
	}

/**
* makeSystemPlugin : creation des objets Plugin
*<P>Ces connexions sont utilisées par le systéme pour la récupération et la gestion des éléments</P>
*<P>Les Variables déclarés sont $GLOBALS["SYSTEM_DATABASE_CONN"] et $GLOBALS["SYSTEM_LDAP_CONN"]</P>
* @access private
* @return entier
*/
	function makeSystemPlugin()
	{
		/* Appel et génération des plugins (autoregister dans $GLOBALS["SYSTEM_PLUGIN"]["PluginName"])*/
		$GLOBALS["SYSTEM_MANAGER"]["PLUGIN"]=new PluginManager();
		$GLOBALS["SYSTEM_MANAGER"]["PLUGIN"]->doLoadPlugin();
	}

/**
* makeSystemPrinting : des printing
*<P>Ces connexions sont utilisées par le systéme pour la récupération et la gestion des éléments</P>
*<P>Les Variables déclarés sont $GLOBALS["SYSTEM_DATABASE_CONN"] et $GLOBALS["SYSTEM_LDAP_CONN"]</P>
* @access private
* @return entier
*/
	function makeSystemPrinting()
	{
		/* Appel et génération des plugins (autoregister dans $GLOBALS["SYSTEM_PLUGIN"]["PluginName"])*/
		$GLOBALS["SYSTEM_MANAGER"]["PRINTING"]=new PrintingManager();
		$GLOBALS["SYSTEM_MANAGER"]["PRINTING"]->doLoadPrinting();
	}

/**
* makeSystemPrinting : creation de la template
*<P>La Variables déclaré est $GLOBALS["SYSTEM_TEMPLATE"]</P>
* @access private
* @return entier
*/	
	function makeSystemTemplate(){
		$GLOBALS["SYSTEM_TEMPLATE"] = new ModeliXeQware($GLOBALS['SYSTEM_TEMPLATE_PATH'].$GLOBALS['SYSTEM_TEMPLATE_DIR'].$GLOBALS['SYSTEM_TEMPLATE_MAIN']);
		$GLOBALS["SYSTEM_TEMPLATE"]->SetMxFileParameter($GLOBALS['SYSTEM_TEMPLATE_PATH'].$GLOBALS['SYSTEM_TEMPLATE_DIR'].$GLOBALS['SYSTEM_TEMPLATE_CONF']);
		$GLOBALS["SYSTEM_TEMPLATE"]->SetModeliXe(true);
	}

/**
* makeSystemManager : creation des gestionnaire d'objets systéme
*<P>Ces gestionnaire permettent la création, modification des objets systéme</P>
*<P>ils sont crées dans les variables $GLOBALS["SYSTEM_MANAGER"][Manager_name]</P>
* @access private
* @return entier
*/
	function makeSystemManager()
	{
		/* Creation du Manager groupe */
		$GLOBALS["SYSTEM_MANAGER"]["GROUP"]=GroupManagerFactory::createInstance( DATA_ACCES_MANAGER_GROUP );

		/* Creation du Manager Noeud */
		$GLOBALS["SYSTEM_MANAGER"]["NODE"]=NodeManagerFactory::createInstance( DATA_ACCES_MANAGER_NODE );

		/* Creation du Manager Langue */
		$GLOBALS["SYSTEM_MANAGER"]["LANGUAGE"]=LanguageManagerFactory::createInstance( DATA_ACCES_MANAGER_LANGUAGE );

		/* Creation du Manager Utilisateur */
		$GLOBALS["SYSTEM_MANAGER"]["USER"]=UserManagerFactory::createInstance( DATA_ACCES_MANAGER_USER );

		/* Creation du Manager Utilisateur */
		$GLOBALS["SYSTEM_MANAGER"]["USER_PREFERENCE"]=UserPreferenceManagerFactory::createInstance( DATA_ACCES_MANAGER_USER_PREFERENCE );

		/* Creation du Manager Droit */
		$GLOBALS["SYSTEM_MANAGER"]["RIGHT"]=RightManagerFactory::createInstance( DATA_ACCES_MANAGER_RIGHT );

		/* Creation du Manager Droit */
		$GLOBALS["SYSTEM_MANAGER"]["COORDINATION_OBJ"]=CoordinationObjManagerFactory::createInstance( DATA_ACCES_MANAGER_COORDINATION_OBJ );

		/* Creation du Manager association utilisateur & groupe */
		$GLOBALS["SYSTEM_MANAGER"]["GROUP_USER"]=GroupUserManagerFactory::createInstance( DATA_ACCES_MANAGER_GROUP_USER );

		/* Creation du Manager association Noeud & utilisateur & groupe */
		$GLOBALS["SYSTEM_MANAGER"]["NODE_GROUP_USER"]=NodeGroupUserManagerFactory::createInstance( DATA_ACCES_MANAGER_NODE_GROUP_USER );


		/* Creation des Manager de cache pour tree node */
		if ( DATA_ACCES_CACHE_TREE_NODE == true )
			$GLOBALS["SYSTEM_MANAGER"]["TREE_NODE_CACHE"]=CacheManagerFactory::createInstance( DATA_ACCES_MANAGER_CACHE_TREE_NODE, DATA_ACCES_INFO_TREE_NODE );

		/* Creation des Manager de cache pour tree group */
		if ( DATA_ACCES_CACHE_TREE_GROUP == true )
			$GLOBALS["SYSTEM_MANAGER"]["TREE_GROUP_CACHE"]=CacheManagerFactory::createInstance( DATA_ACCES_MANAGER_CACHE_TREE_GROUP, DATA_ACCES_INFO_TREE_GROUP );

		/* Creation des Manager de cache pour list user group */
		if ( DATA_ACCES_CACHE_PERMISSION == true )
			$GLOBALS["SYSTEM_MANAGER"]["PERMISSION_CACHE"]=CacheManagerFactory::createInstance( DATA_ACCES_MANAGER_CACHE_PERMISSION, DATA_ACCES_INFO_PERMISSION );

		/* Creation des Manager de cache pour list user group */
		if ( DATA_ACCES_CACHE_LIST_USER_GROUP == true )
			$GLOBALS["SYSTEM_MANAGER"]["LIST_USER_GROUP_CACHE"]=CacheManagerFactory::createInstance( DATA_ACCES_MANAGER_CACHE_LIST_USER_GROUP, DATA_ACCES_INFO_LIST_USER_GROUP );

		/* Creation des Manager de cache pour list user group */
		if ( DATA_ACCES_CACHE_LIST_USER_NODE == true )
			$GLOBALS["SYSTEM_MANAGER"]["LIST_USER_NODE_CACHE"]=CacheManagerFactory::createInstance( DATA_ACCES_MANAGER_CACHE_LIST_USER_NODE, DATA_ACCES_INFO_LIST_USER_NODE );

		/* Creation du Manager association Noeud & utilisateur & groupe */
		$GLOBALS["SYSTEM_MANAGER"]["TREE_GROUP"]=new TreeGroupManager();

		/* Creation du Manager association Noeud & utilisateur & groupe */
		$GLOBALS["SYSTEM_MANAGER"]["TREE_NODE"]=new TreeNodeManager();

		/* Creation du Manager association Noeud & utilisateur & groupe */
		$GLOBALS["SYSTEM_MANAGER"]["PERMISSION"]=new PermissionManager();

		/* Creation du Manager association Noeud & utilisateur & groupe */
		$GLOBALS["SYSTEM_MANAGER"]["LIST_USER_GROUP"]=new ListUserGroupManager();

		/* Creation du Manager association Noeud & utilisateur & groupe */
		$GLOBALS["SYSTEM_MANAGER"]["LIST_USER_NODE"]=new ListUserNodeManager();

		/* Creation du Manager association Noeud & utilisateur & groupe */
		$GLOBALS["SYSTEM_MANAGER"]["USER_SESSION"]=new UserSessionManager();

		/* Creation du Manager association Noeud & utilisateur & groupe */
		$GLOBALS["SYSTEM_MANAGER"]["USER_SESSION"]=UserSessionManagerFactory::createInstance( DATA_ACCES_MANAGER_USER_SESSION );

		/* Pour les objets printing */
		$GLOBALS["SYSTEM_MANAGER"]["PRINTING"]=new PrintingManager();
	}

/**
* makeSession : creation de l'objet UserSession
*<P>Recupere toutes les dépendances de l'utilisateur</P>
* @access private
*/
	function makeSession()
	{
		global $CONF_AUTH_FILE, $CONF_AUTH_ALIEN_FILE, $HTTP_REFERER, $SERVER_NAME;
		$GLOBALS["SYSTEM_USER_SESSION"]=$GLOBALS["SYSTEM_MANAGER"]["USER_SESSION"]->createInstance();
	}

/**
* makeSystemError : creation de l'objet Erreur...
* @access private
*/
	function makeSystemError()
	{
		if (!Isset($GLOBALS["SYSTEM_ERROR"]))
			$GLOBALS["SYSTEM_ERROR"]=new SystemError();
	}

/**
* makeSystemMessage : creation de l'objet Message (gestionnaire des fichiers messages)
* @access private
*/
	function makeSystemMessage()
	{
		if (!Isset($GLOBALS["SYSTEM_MESSAGE"]))
			$GLOBALS["SYSTEM_MESSAGE"]=new SystemMessage();
	}

/**
* Charge tous les objets concernés par la navigation...
*Cette liste va permettre de créer les menus de navigation etc
* @access private
* @return entier
*/
	function makeObjectListForSession()
	{
		$array=$GLOBALS["SYSTEM_USER_SESSION"]->getAllObjectId();	/* recupere tous les identifiant des objets pour la navigation */
		$this->objectArray=$GLOBALS["SYSTEM_MANAGER"]["COORDINATION_OBJ"]->createInstanceFromIds($array);
		return (count($this->objectArray)>0)?true:false;
	}

/**
* beforeSessionSystemPlugin : execution des plugin method before session
* @access private
*/
	function beforeSessionSystemPlugin()
	{
		/* Appel et génération des plugins (autoregister dans $GLOBALS["SYSTEM_PLUGIN"]["PluginName"])*/
		$GLOBALS["SYSTEM_MANAGER"]["PLUGIN"]->doBeforeSessionStart();
	}

/**
* beforeProcessSystemPlugin : execution des plugin avant le process
* @access private
*/
	function beforeProcessSystemPlugin()
	{
		/* Appel et génération des plugins (autoregister dans $GLOBALS["SYSTEM_PLUGIN"]["PluginName"])*/
		$GLOBALS["SYSTEM_MANAGER"]["PLUGIN"]->doBeforeProcess();
	}

/**
* beforeExecSystemPlugin : execution des plugin avant execution de l'obj de coordination
* @access private
*/
	function beforeExecSystemPlugin()
	{
		/* Appel et génération des plugins (autoregister dans $GLOBALS["SYSTEM_PLUGIN"]["PluginName"])*/
		$GLOBALS["SYSTEM_MANAGER"]["PLUGIN"]->doBeforeExec();
	}

/**
* beforeExecSystemPlugin : execution des plugin apres execution de l'obj de coordination
* @access private
*/
	function afterExecSystemPlugin()
	{
		/* Appel et génération des plugins (autoregister dans $GLOBALS["SYSTEM_PLUGIN"]["PluginName"])*/
		$GLOBALS["SYSTEM_MANAGER"]["PLUGIN"]->doAfterExec();
	}

/**
* afterProcessSystemPlugin : execution des plugin apres process (et avant envoi de la page)
* @access private
*/
	function afterProcessSystemPlugin()
	{
		/* Appel et génération des plugins (autoregister dans $GLOBALS["SYSTEM_PLUGIN"]["PluginName"])*/
		$GLOBALS["SYSTEM_MANAGER"]["PLUGIN"]->doAfterProcess();
	}

/**
* beforeSessionCloseSystemPlugin : execution des plugin avant destruction de la session (après envoi de la page)
* @access private
*/
	function beforeSessionCloseSystemPlugin()
	{
		/* Appel et génération des plugins (autoregister dans $GLOBALS["SYSTEM_PLUGIN"]["PluginName"])*/
		$GLOBALS["SYSTEM_MANAGER"]["PLUGIN"]->doBeforeSessionClose();
	}

/**
* destroySystemConn : creation des objets ressource SYSTEM
*<P>Ces connexions sont utilisées par le systéme pour la récupération et la gestion des éléments</P>
*<P>Les Variables déclarés sont $GLOBALS["SYSTEM_DATABASE_CONN"] et $GLOBALS["SYSTEM_LDAP_CONN"]</P>
* @access private
*/
	function destroySystemConn()
	{
		if (isset($GLOBALS["SYSTEM_DATABASE_CONN"]))
			$GLOBALS["SYSTEM_DATABASE_CONN"]->sql_close();
		if (isset($GLOBALS["SYSTEM_LDAP_CONN"]))
			$GLOBALS["SYSTEM_DATABASE_CONN"]->deconnecte();
	}

/**
* endSession : fin de la session (->on sauvegarde celle-ci)
* @access private
*/
	function endSession()
	{
		$GLOBALS["SYSTEM_USER_SESSION"]=$GLOBALS["SYSTEM_MANAGER"]["USER_SESSION"]->saveInstance($GLOBALS["SYSTEM_USER_SESSION"]);
	}

/**
* cleanSession : detruit toutes les sessions en "Time Out"
* @access private
*/
	function cleanSession()
	{
		if (!isset($GLOBALS['CONF_SESSION_TIME']))
		{
			addError(5, "SystemControl", " : temps de la session corrompu",__line__, __file__);
			$GLOBALS['CONF_SESSION_TIME']= 2000;
		}
		$GLOBALS["SYSTEM_USER_SESSION"]=$GLOBALS["SYSTEM_MANAGER"]["USER_SESSION"]->cleanInstance( $GLOBALS['CONF_SESSION_TIME'] );
	}

/**
* getListObjectForNavigation : renvoi tous les objets d'un noeud
* @access public
* @param entier id noeud
* @return tableau tableau d'objets de coordination
*/
	function getListObjectForNavigation($nodeId)
	{
		$tab=array();
		if (isset($GLOBALS["SYSTEM_USER_SESSION"]))
		{
			$tabNode=$GLOBALS["SYSTEM_USER_SESSION"]->getAllParentNodeForNavigation($nodeId);
			$tabRight=$GLOBALS["SYSTEM_USER_SESSION"]->permission->getAllRightForNode(array($nodeId));
			$tabRightOid=array();

			for ($i=0; $i<count($tabRight); $i++)
			{
				$tabRightOid[]=$tabRight[$i]->getObjectId();
			}
			$objectArray=$GLOBALS["SYSTEM_MANAGER"]["COORDINATION_OBJ"]->createInstanceFromIds($tabRightOid);

			$k=0;

			/* pour chaque droit */
			for ($i=0;$i<count($tabRight);$i++)
			{
				$tmp=null;
				for ($j=0; $j<count($objectArray); $j++)
				{
					if ($objectArray[$j]->getId()==$tabRight[$i]->getObjectId())
					{
						$tmp=$objectArray[$j];
						// Test si le droit est déjà droit(pour l'objet...) 2 x le mm droit
						$verif=objectSearch($tmp, $tab);
						if (count($verif)==0)
						{
							$tab[$k][0]=$tabRight[$i];
							$tab[$k][1]=$tmp;
							$k++;
						}else{
							if ( $tab[$verif[1]][0]->getMethodName()!=$tabRight[$i]->getMethodName() )
							{
								$tab[$k][0]=$tabRight[$i];
								$tab[$k][1]=$tmp;
								$k++;
							}
						}
						break;
					}
				}
			}
		}
		return $tab;
	}

/**
* getNodeIdForObjectId : renvoi tous les objets d'un noeud
* @access public
* @param entier id noeud
* @return tableau tableau d'objets de coordination
*/
	function getNodeIdForObjectId($oid)
	{
		$tabRight=$GLOBALS["SYSTEM_USER_SESSION"]->permission->getAllRightForNode($GLOBALS["SYSTEM_USER_SESSION"]->getValidNavigationNode());

		for ($i=0; $i<count($tabRight); $i++)
		{
				if( $oid == $tabRight[$i]->getObjectId())
				{
					$nodeId = $tabRight[$i]->getNodeId();
					break;
				}
		}		
		return $nodeId;
	}		

/**
* getDefaultRight : renvoi le droit par défaut
* @access public
* @return tableau tableau d'objets du droit
*/
	function getDefaultRight()
	{
// 		var_dump($GLOBALS["SYSTEM_USER_SESSION"]->navigationNodeId);
		$tabObject=$this->getListObjectForNavigation( $GLOBALS["SYSTEM_USER_SESSION"]->navigationNodeId );
		
		/* gestion du lib en fonction de la langue courante */
		$currentCode=$GLOBALS["SYSTEM_USER_SESSION"]->langue->getCode();
		$defaultCode=$GLOBALS["SYSTEM_DEFAULT_LANGUAGE_CODE"];
		/* fin récupération des codes par defaut */

		/* Pour le Tri/Nom */
		$tabName=array();
		for ($i=0; $i<count($tabObject);$i++)
		{
			$lib=$tabObject[$i][1]->getName($currentCode);
			if ($lib=="")
			{
				$lib=$tabObject[$i][1]->getName($defaultCode);
			}
			$tabName[$i]=$lib;
		}
		asort($tabName);
		reset($tabName);
		if (list($i, $lib) = each($tabName))
		{
			return $tabObject[$i][0];
		}else{
			return new Right();
		}
	}

/**
* getRedirect() : retourne la redirection systeme si existante
* @access public
* @return chaine de retidrection
*/
	function getRedirect()
	{
		if ( ($this->redirect!="") && (!is_null($this->redirect)) )
		{
			$url =$this->redirect;
			$url =addIdtoUrl($url);
			if (isset($this->messageSystem) && ($this->messageSystem!="") )
				$url.="&msg=".$this->messageSystem;
			return $url;
		}
		else
		{
			return NULL;
		}
	}

/**
* setRedirect() : retourne la redirection systeme si existante
* @access public
* @param chaine
* @return chaine de retidrection
*/
	function setRedirect($string)
	{
		$this->redirect=unhtmlentities($string);
	}

/**
* setOutputData() : affecte l'affichage est en mode data ou template (note on doit affecter data)
* @access public
* @param booleen
* @param bolleen
*/
	function setOutputData($bool)
	{
		$this->outputData=$bool;
	}

/**
* isOutputData() : retourne si l'affichage est en mode data ou template
* @access public
* @param bolleen
* @return bolleen
*/
	function isOutputData($bool)
	{
		return $this->outputData;
	}

/**
* setPrintData() : affecte les données de sortie à la place de modelixe ...
* @access public
* @param chaine
* @param string
*/
	function setPrintData($data)
	{
		$this->setOutputData(true);
		$this->setData($data);
	}

/**
* setData() : affecte les données ...
* @access public
* @param chaine
* @param string
*/
	function setData($data)
	{
		$this->data=$data;
	}

/**
* getData() : retourne si l'affichage est en mode data ou template
* @access public
* @param booleen
* @return booleen
*/
	function getData($bool)
	{
		return $this->data;
	}

/**
*Fonction arrayOfAllowedNode()
* Recupere les noeuds d'administration possibles (de groupe) depuis un noeud...
* On peut lui passer le noeud courant!!! -->$GLOBALS["SYSTEM_USER_SESSION"]->entryNodeId;
* @access public
* @param chaine url de redirection
* @param entier id du noeud
* @return tableau tree Correspondant
*/
	function arrayOfAdministrableGroup($id)
	{
		$tabTreeGroup=array();

		// Recupération des groupe d'administration en fonction d'un noeud (les groupe sont configurés pour être administrable depuis un noeud)
		$tabGroup=$GLOBALS["SYSTEM_MANAGER"]["GROUP"]->getInstanceFromNodeId($id);

		// on créer les tree correspondants...
		for ($i=0; $i<count($tabGroup); $i++)
		{
			$tabTreeGroup[$i]=$GLOBALS["SYSTEM_MANAGER"]["TREE_GROUP"]->createInstance($tabGroup[$i]->getId());
		}
		// Retourne les groupes authorisés
		return $tabTreeGroup;
	}

/**
* Fonction arrayOfAdministrableUserFromTabTreeGroup()
*<P>Recupere tous les utilisateurs pour l'association au tabTreeGroup</P>
* @access public
* @param chaine url de redirection
* @return tableau tree Correspondant
*/
	function arrayOfAdministrableUserFromTabTreeGroup($tabTreeGroup)
	{

		$tabGroupId	=array();
		$tabGroupUser	=array();
		$tabUserId	=array();
		$tabUser	=array();

		// On recupere tous groupes correspondants
		for ($i=0; $i<count($tabTreeGroup); $i++)
		{
			$tabGroupId=array_merge( $tabGroupId, $tabTreeGroup[$i]->getSonArray() );
			$tabGroupId[count($tabGroupId)]=$tabTreeGroup[$i]->getId();
		}
		$tabGroupId=array_values(array_unique($tabGroupId));

		// Pour toutes les associations on récupére les users...
		for ( $i=0; $i<count($tabGroupId); $i++ )
		{
			// --> récupération de la liste des users...
			$tabGroupUser=array_merge( $tabGroupUser, $GLOBALS["SYSTEM_MANAGER"]["GROUP_USER"]->getInstanceFromGroupId($tabGroupId[$i]) );
		}

		for ($i=0; $i<count($tabGroupUser); $i++)
		{
			$tabUserId[$i]=$tabGroupUser[$i]->getUserId();
		}
		$tabUserId=array_values(array_unique($tabUserId));

		for ($i=0; $i<count($tabUserId); $i++ )
		{
			$tabUser[$i]=$GLOBALS["SYSTEM_MANAGER"]["USER"]->createInstance($tabUserId[$i] );
		}
		return $tabUser;
	}

	//
	// Fonctions de stats
	//
/**
* Fonction printStats affiche des stats d'execution (débuggage ou test)
* @access public
* @param chaine nom de l'élément d'execution statifié
* @return booleen
*/
	function initStats()
	{
		if ( SYSTEM_PRINT_EXECUTION_TIME )
		{
			list($usec, $sec)= explode(" ", microtime());
			if ( !defined("SYSTEM_START_TIME") )
				define("SYSTEM_START_TIME", ( (float)$usec+ (float) $sec ));
		}
		return true;
	}

/**
* Fonction printStats affiche des stats d'execution (débuggage ou test)
* @access public
* @param chaine nom de l'élément d'execution statifié
* @return booleen
*/
	function printStats($chaine="")
	{
		$str="";
		if ( SYSTEM_PRINT_MEMORY )
		{
			$str=$chaine." Memory:".memory_get_usage()."<br>";
			echo $str;
		}
		if ( SYSTEM_PRINT_EXECUTION_TIME )
		{
			list($usec, $sec)= explode(" ", microtime());
			if ( !defined("SYSTEM_START_TIME") )
				define("SYSTEM_START_TIME", ( (float)$usec+ (float) $sec ));
			$time= ( (float)$usec+ (float)$sec ) - SYSTEM_START_TIME;
			$str=$chaine." Time:".$time."<br>";
			echo $str;
		}
		return true;
	}
}
?>
