<?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 UserManagerLdap.php
*
*Ce fichier contient la classe FetchUserDb
*
* @author Initiance <www.initiance.com|Vincent Narbeburu | olivier@initiance.com>
* @link www.rooty.me
* @since 2004/05/17
* @version 0.3
* @package system_data
* @subpackage User
* @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 UserManagerLdap
*
* classe de gestion des utilisateurs pour une source de données Ldap <br><br>
* Sont configuré dans /config/config.php:<br>
*
*
* @package system_data
* @subpackage User
*/
class UserManagerLdap extends UserManager
{

/**
* @var tableau
* @access private
* @desc information retournés
*/
var $tabinfo	= null;

/**
* @var objet
* @access private
* @desc objet LdapAnnu portant la connexion a l'annuaire
*/
var $annuaire = null;

/**
*Constructeur de la classe FetchUserLdap
*
*<p>Initialise la FetchUserLdap</p>
* Le constructeur vérifie que la connexion LDAP globale est établie. Dans le cas contraire, une erreur est renvoyée.
*
*Pour fonctionner correctement, cette classe requiert qu'une connexion ldap globale soit déclarée.
*
* @access public
*/
function UserManagerLdap()
	{
		$this->__construct();
	}

	function __construct()
	{
		$this->tabinfo=="";

		if ($GLOBALS['SYSTEM_LDAP_CONN'] == null )
		{
			addError($GLOBALS['SYSTEM_ERROR'],"LDAP","Connexion impossible: ".ldap_error($GLOBALS['SYSTEM_LDAP_CONN']->idConnexion),__LINE__,__FILE__);
		}
	}

/**
* doInsert: Insère l'utilisateur dans l'annuaire.
*<p>les param doivent être traités avec la classe chaine!</p>
*
* @param chaine titre de la personne (M,Mmme,Mlle)
* @param chaine prénom de la personne
* @param chaine nom de la personne
* @param chaine login
* @param chaine password
* @param chaine mail
* @param chaine adresse
* @param chaine code postal
* @param chaine état (région)
* @param chaine pays
* @param chaine oraganisation
* @param chaine telephone
* @param chaine fax
*
* @param tableau commentaires
* @param tableau informations
*
* @access public
* @return booleen ou tableau
*/
function doInsert($title, $firstName, $lastName, $login, $password, $mail, $postalAddress, $postalCode, $city, $state, $country, $organisation, $tel, $fax, $comment, $info,$id= -1)
	{
	#construction des informations a inserer
	if (isset($info_user)) unset($info_user);

	if ($id==-1) # mode de generation automatique

	do
		{
			$autoid=GetAnId();
			$chaine="uid=".$autoid;
			$user=$GLOBALS['SYSTEM_LDAP_CONN']->Recherche( $chaine, "" );
		}
	while( ! $user );

	else $autoid=$id;

	$info_user["uid"]=$autoid; 
	//$info_user["commonName"]=$login; # > Passé en paramètre a AjoutUser
	$info_user["userPassword"]=$password; 
	$info_user["givenName"]=$firstName; 
	$info_user["surname"]=$lastName; 
	$info_user["title"]=$title; 
	$info_user["mail"]=$mail; 
	$info_user["postalAddress"]=$postalAddress; 
	$info_user["postalCode"]=$postalCode; 
	$info_user["l"]=$city; 
	$info_user["st"]=$state; 
	$info_user["c"]=$country; 
	$info_user["o"]=$organisation; 
	$info_user["telephoneNumber"]=$tel; 
	$info_user["facsimileTelephoneNumber"]=$fax; 
	$info_user["comment"]=$comment; 
	$info_user["description"]=$info; 
	#$info_user["street"]=$;  # > Pourrait etre employé, actuellement redondant avec $postalAddress

	if ($GLOBALS['SYSTEM_LDAP_CONN']->AjoutUser($info_user,$login,"")) return $autoid;
		else return null;
	}

/**
* doLoadFromLogin: Charge l'utilisateur depuis la BD
*
*<p>Retourne un tableau contenant les infos de l'objets
*<br>ou un tableau vide si n'existe pas;<br>
*Précondition : id doit être un entier
*</p>
*
* @access public
* @param chaine login
* @return booleen ou tableau
*/
function doLoadFromId($login)
	{
		$chaine="cn=".$login;
		$user=$GLOBALS['SYSTEM_LDAP_CONN']->Recherche( $chaine, "" );

		if ( isset($user["count"]) )
		{
			if ( $user["count"] ==1 )
			{
				$result=array();
				$result["id"]=$user[0]["uid"][0];
				$result["title"]=$user[0]["title"][0];
				$result["firstName"]=$user[0]["givenname"][0];
				$result["lastName"]=$user[0]["sn"][0];
				$result["login"]=$user[0]["cn"][0];
				$result["password"]=$user[0]["userpassword"][0];
				$result["mail"]=$user[0]["mail"][0];
				$result["postalAddress"]=$user[0]["postaladdress"][0];
				$result["postalCode"]=$user[0]["postalcode"][0];
				$result["city"]=$user[0]["l"][0];
				$result["state"]=$user[0]["st"][0];
				$result["country"]=$user[0]["c"][0];
				$result["organisation"]=$user[0]["o"][0];
				$result["tel"]= $user[0]["telephonenumber"][0];
				$result["fax"]=$user[0]["facsimiletelephonenumber"][0];
				$result["comment"]=$user[0]["comment"];

				# ruse pour retourner un tableau propre 
				unset($result["comment"]["count"]); 
				$result["info"]=$user[0]["description"];					
				unset($result["info"]["count"]);
				return $result;
				}
			else 
				{
					$systemError=1;
					$classe="FetchLdapUser";
					$message="Bug grave: Récupération de plusieurs utilisateurs avec le même ID...";
					addError($systemError,$classe,$message, __line__, __file__);
					return array();
				}
		} else {
			return array();
		}
	}

/**
* doLoadFromId: Charge l'utilisateur depuis la BD
*
*<p>Retourne un tableau contenant les infos de l'objets
*<br>ou un tableau vide si n'existe pas;<br>
*Précondition : id doit être un entier
*</p>
*
* @access public
* @param entier
* @return booleen ou tableau
*/
function doLoadFromId($id)
	{
		$chaine="uid=".$id;
		$user=$GLOBALS['SYSTEM_LDAP_CONN']->Recherche( $chaine, "" );

		if ( isset($user["count"]) )
		{
			if ( $user["count"] ==1 )
			{
				$result=array();
				$result["id"]=$user[0]["uid"][0];
				$result["title"]=$user[0]["title"][0];
				$result["firstName"]=$user[0]["givenname"][0];
				$result["lastName"]=$user[0]["sn"][0];
				$result["login"]=$user[0]["cn"][0];
				$result["password"]=$user[0]["userpassword"][0];
				$result["mail"]=$user[0]["mail"][0];
				$result["postalAddress"]=$user[0]["postaladdress"][0];
				$result["postalCode"]=$user[0]["postalcode"][0];
				$result["city"]=$user[0]["l"][0];
				$result["state"]=$user[0]["st"][0];
				$result["country"]=$user[0]["c"][0];
				$result["organisation"]=$user[0]["o"][0];
				$result["tel"]= $user[0]["telephonenumber"][0];
				$result["fax"]=$user[0]["facsimiletelephonenumber"][0];
				$result["comment"]=$user[0]["comment"];

					# ruse pour retourner un tableau propre 
				unset($result["comment"]["count"]); 
				$result["info"]=$user[0]["description"];					
				unset($result["info"]["count"]);
				return $result;
				}
			else 
				{
					$systemError=1;
					$classe="FetchLdapUser";
					$message="Bug grave: Récupération de plusieurs utilisateurs avec le même ID...";
					addError($systemError,$classe,$message, __line__, __file__);
					return array();
				}
		} else {
			return array();
		}
	}

/**
* doCheckValid:Utilisateur Valide
*<p>les param doivent être traités avec la classe chaine</p>
* @param chaine login de l'utilisateur
* @param chaine password de l'utilisateur
* @access public 
* @return booleen
*/
function doCheckValid($login, $password)
	{
		$chaine="cn=".$login;
		$user=$GLOBALS['SYSTEM_LDAP_CONN']->Recherche( $chaine, "" );

		if ( $user["count"]==1 ) 
			{
				# première phase: le login existe
				if ($user[0]["userpassword"][0]==$password) 
					return $user[0]["uid"][0];  #> mot de passe valide
				else return 0;#> mot de passe invalide
			}
		else return 0;
	}

/**
* doDelete : Detruit l'utilisateur dans LDAP
*
* @param entier identifiant de l'utilisateur
* @access public
* @return booleen
*/
function doDelete($id)
	{
		$chaine="uid=".$id;
		$user=$GLOBALS['SYSTEM_LDAP_CONN']->Recherche( $chaine, "" );

		if ( $user["count"] != 1 ) 
			{
				$systemError=2;
				addError($systemError,"LDAP","Suppression d'utilisateur impossible: ".ldap_error($GLOBALS['SYSTEM_LDAP_CONN']->erreur),__LINE__,__FILE__);
				return false;	
			}
		return $GLOBALS['SYSTEM_LDAP_CONN']->Supprimer("cn=".$user[0]["cn"][0]);
	}

/**
* doUpdate:Modifie l'utilisateur dans la BD
*
*<p>les param doivent être traités avec la classe chaine!</p>
* @param entier identifiant
* @param chaine titre de la personne
* @param chaine prénom de la personne
* @param chaine nom de la personne
* @param chaine login
* @param chaine password
* @param chaine mail
* @param chaine adresse
* @param chaine code postal
* @param chaine état
* @param chaine pays
* @param chaine telephone
* @param chaine fax
*
* @param tableau commentaires
* @param tableau informations
*
* @access public 
* @return false true
*/
function doUpdate($id, $title, $firstName, $lastName, $login, $password, $mail, $postalAddress, $postalCode, $city, $state, $country, $organisation, $tel, $fax, $comment, $info)
	{
		$chaine="uid=".$id;
		$user=$GLOBALS['SYSTEM_LDAP_CONN']->Recherche( $chaine, "" );

		if ( $user["count"] != 1 ) return false;

		$this->DeleteU($id);
		$this->Insert($title, $firstName, $lastName, $login, $password, $mail, $postalAddress, $postalCode, $city, $state, $country, $organisation, $tel, $fax, $comment, $info,$id);

	/*
		$info_user["commonName"]=$login; 
		$info_user["userPassword"]=$password; 
		$info_user["givenName"]=$firstName; 
		$info_user["surname"]=$lastName; 
		$info_user["title"]=$title; 
		$info_user["mail"]=$mail; 
		$info_user["postalAddress"]=$postalAddress; 
		$info_user["postalCode"]=$postalCode; 
		$info_user["l"]=$city; 
		$info_user["st"]=$state; 
		$info_user["c"]=$country; 
		$info_user["o"]=$organisation; 
		$info_user["telephoneNumber"]=$tel; 
		$info_user["facsimileTelephoneNumber"]=$fax; 
		$info_user["comment"]=$comment; 
		$info_user["description"]=$info; 
		#$info_user["street"]=$;  # > Pourrait etre employé, actuellement redondant avec $postalAddress
		*/
		#return $GLOBALS['SYSTEM_LDAP_CONN']->RemplacementAttribut("cn=".$user[0]["cn"][0],$info_user);
	}

/**
* Recherche: permet depuis un objet FetchUserLdap de rechercher tous les utilisateurs répondant a certains critères
*
* différentes méthodes de recherche sont possibles sur des champs différents
* methodes possibles  : exacte;commence;finit;contient
* champs ou rechercher: mail;description;commentaire;tel;fax;login;adrp;cp;region;organisation;country;nom
*
* @param chaine type de recherche
* @param chaine champ ou effectuer la recherche
* @param chaine critère de recherche
*
* @access public
* @return tableau utilisateurs (formattage ldap)
*/
	function Recherche($type,$champ,$chaine)
	{
		switch($champ)
		{
			case "mail":$critere="mail";break;
			case "description":$critere="description";break;
			case "commentaire":$critere="comment";break;
			case "tel":$critere="telephoneNumber";break;
			case "fax":$critere="facsimileTelephoneNumber";break;
			case "login":$critere="cn";break;
			case "adrp":$critere="postalAddress";break;
			case "cp":$critere="postalCode";break;
			case "region":$critere="l";break;	
			case "organisation":$critere="o";break;	
			case "country":$critere="c";break;
			case "nom":	
			default : $critere="sn";break;
		}

		switch ($type)
		{
			case "exacte":$argument=$critere."=".$chaine.""; break;
			case "commence":$argument=$critere."=".$chaine."*"; break;
			case "finit" :$argument=$critere."=*".$chaine.""; break;
			case "contient": 
			default: $argument=$critere."=*".$chaine."*"; break;
		}
		return $GLOBALS['SYSTEM_LDAP_CONN']->Recherche( $argument, "" );
	}
}
?>
