<?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 Permission.php
*
* @author Rooty <www.rooty.me|rooty@rooty.me>
* @link www.rooty.me
* @since 2018/05/17
* @version 0.3
* @package system_data
* @subpackage Permission
* @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 Permission
*
* Classe de gestion des Permission<br>
*
* @package system_data
* @subpackage Permission
*/

class Permission
{

/**#@+
* @access public
*/

/**
* @var entier
* @desc identifiant de l'utilisateur
*/
var $id;	/* =identifiant de l'utilisateur */

/**
* @var tableau
* @desc tableau des objets droits
*/
var $tabDroit = array();

/**#@-*/

/**
* Constructeur de la classe Permission PHP5
*
* <p>Initialise la classe Permission</p>
* @access public
*/
	function __construct()
	{
		$this->setId($GLOBALS['SYSTEM_DEFAULT_USER_GUEST']);
		$this->tabDroit= array();
	}

/**
* "Getteur" de l'attribut Id.
* @access public
* @return entier Id du Permission
*/
	function getId()
	{
		return $this->id;
	}

/**
* "Setteur" de l'attribut Id.
* @access public
* @param entier Id du Permission
*/
	function setId($Id)
	{
		$this->id=$Id;
	}

/**
* load de l'objet Permission.
*
* (utilise essentiellement pour charger un Permission depuis une base de donnees)
* @access public
* @param entier identifiant numérique de l'objet Perm
* @param chaine libelle du Permission
* @return booleen charg? ou non charg?
*/
	function doLoad($id, $tabDroitAll)
	{
		if (!is_array($tabDroitAll) || !is_numeric($id))
		{
			return false;
		}
		$this->setId($id);
		$this->tabDroit=$tabDroitAll;
		return true;
	}

/**
* getAllObjectIdForNode : objets utilises dans une arborescence (sert essentiellement au systeme)
*
* @access public
* @param tableau tableau de noeuds (arborescence des objets courants)
* @return object objet droit par d?faut
*/
	function getAllObjectIdForNode($array)
	{
		$tab=array();

		for ($i=0; $i<count($array); $i++)
		{
			for ($j=0; $j<count($this->tabDroit); $j++)
			{
				if ($array[$i]==$this->tabDroit[$j]->getNodeId())
				{
					/* le droit correspond a un noeud...  */
					$tab[]=$this->tabDroit[$j]->getObjectId();
				}
			}
		}
		return array_values(array_unique($tab));
	}

	function getObjectIdByLabel($array)
	{
		$value="";
// 		var_dump($this->tabDroit);

// 		for ($i=0; $i<count($this->tabDroit); $i++)
// 		{
			for ($j=0; $j<count($this->tabDroit); $j++)
			{
				if ($array[0]==$this->tabDroit[$j]->getNodeId())
				{
					if( $array[1]==$this->tabDroit[$j]->getClassName() )
						/* le droit correspond a un noeud...  */
						$value=$this->tabDroit[$j]->getObjectId();
				}
			}
// 		}
// 		var_dump($value);
		return $value;
	}

/**
* getAllRightIdForNode : récpure les id de droits pour les noeuds
*
* @access public
* @param tableau tableau de noeuds (arborescence des objets courants)
* @return tableau tableau d'objet droit par défaut
*/
	function getAllRightIdForNode($array)
	{
		$tab=array();

		for ($i=0; $i<count($array); $i++)
		{
			for ($j=0; $j<count($this->tabDroit); $j++)
			{
				if ($array[$i]==$this->tabDroit[$j]->getNodeId())
				{
					/* le droit correspond a un noeud...  */
					$tab[]=$this->tabDroit[$j]->getId();
				}
			}
		}
		return array_values(array_unique($tab));
	}

/**
* getAllRightForNode : récupére les objets droit pour les noeuds
*
* @access public
* @param tableau tableau de noeuds (arborescence des objets courants)
* @return tableau tableau d'objet droit par défaut
*/
	function getAllRightForNode($array)
	{
		$tab=array();

		for ($i=0; $i<count($array); $i++)
		{
			for ($j=0; $j<count($this->tabDroit); $j++)
			{
				if ($array[$i]==$this->tabDroit[$j]->getNodeId())
				{
					/* le droit correspond a un noeud...  */
					$tab[]=$this->tabDroit[$j];
				}
			}
		}
		return $tab;
	}

/**
* defaultRight : droit par defaut dans une arborescence...
*
* @access public
* @param tableau tableau de noeuds
* @return object objet droit par défaut
*/
	function defaultRightFromNode($array)
	{
		for ($i=0; $i<count($array); $i++)
		{
			for ($j=0; $j<count($this->tabDroit); $j++)
			{
				if ($array[$i]==$this->tabDroit[$j]->getNodeId())
				{
					return $this->tabDroit[$j];
				}
			}
		}
		return null;
	}

/**
* isRightsOn : a les droit sur l'objet
*
* <P>utilise essentiellement pour charger un Permission depuis une base de donnees</P>
* @access public
* @param entier identifiant du noeud courant
* @param entier identifiant de l'objet
* @param chaine nom de la classe
* @param chaine nom de la methode
* @param entier identifiant de l'utilisateur
* @param tableau tableau des identifiant de groupe
* @param tableau tableau des identifiant de noeuds
* @return booleen charg? ou non charg?
*/
	function isRightOn($nodeId, $objId, $className, $methodName, $userId, $groupIds, $nodeIds)
	{
		$retour=array();
		$nbGroup=count($groupIds);
		$nbNode=count($nodeIds);
		/* Pour tous les droits */
		//print_r($this->tabDroit);

		for ($i=0; $i<count($this->tabDroit);$i++)
		{
			if ($nbGroup>0)
			{
				/* Pour tous les groupes */
				for ($j=0; $j<$nbGroup;$j++)
				{
					if ($nbNode>0)
					{
						/* Pour tous les noeuds */
						for ($k=0; $k<$nbNode;$k++)
						{
							$tmp=$this->tabDroit[$i]->isRightOn($className, $methodName, $objId, $nodeIds[$k], $userId, $groupIds[$j]);

							if($tmp==1)
							{
								return true;
							}
						}
					}else{
						$tmp=$this->tabDroit[$i]->isRightOn($className, $methodName, $objId, 0, $userId, $groupIds[$j]);

						if($tmp==1)
						{
								return true;
						}
					}
				}
			/* Cas pour l'utilisateur uniquement */
			}else{
				if ($nbNode>0)
				{
					/* Pour tous les noeuds */
					for ($k=0; $k<$nbNode;$k++)
					{
						$tmp=$this->tabDroit[$i]->isRightOn($className, $methodName, $objId, $nodeIds[$k], $userId, 0);
						if($tmp==1)
						{
							return true;
						}
					}
				}else{
					$tmp=$this->tabDroit[$i]->isRightOn($className, $methodName, $objId, 0, $userId, 0);
					if($tmp==1)
					{
						return true;
					}
				}
			}
		}
		return false;
	}
}
?>
