1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203
|
/*****************************************************************************
Date de création: 13/06/2012
Auteur : MOREL Meriadeg
FICHIER INCLUDE = CREATION D'UNE CLASS OBJET PHP POUR LES CONNEXIONS LDAP
******************************************************************************/
CLASS Ldap
{
/* ATTRIBUTS */
private $Link_ID = null;
private $Res_ID = null;
private $Search_ID = null;
private $LastErr = null;
private $LnkStat = False; //etat de la connexion
private $ldap_port = 389;
private $Win2003Opt = True;
public $serveur = null;
public $identifiant = null;
public $motdepasse = null;
public $Resultat = null;
/* FONCTIONS */
/////////////////////////////////////////////////////////
public function __construct($srv=null,$prt=389,$id=null,$pwd=null,$W2003=true) //constructeur
/////////////////////////////////////////////////////////
{
/*
srv = ip ou nom du serveur ldap:// ou ldaps:// , on peut aussi spécifier plusieur ip serveur séparer par des espaces et la connexion echoué sur l'un redebutera sur l'autre automatiquement
prt = port utilisé par le serveur ldap
w2003 = si true set les options pour une connection en mode windows 2003 active directory
ussl = usage du protocole ssl pour se connecter au serveur -> pas implémenté car pas besoin
*/
// si classe parente alors parent::__construct();
register_shutdown_function(array($this, '__destruct')); // déclaration de la procedure de destruction pour appel même si le code plante entre temps.
$this->serveur = $srv;
$this->ldap_port = $prt;
$this->Win2003Opt = $W2003;
if ($id !== null) { $this->identifiant = $id;}
if ($pwd !== null){ $this->motdepasse = $pwd;}
$this->Link_ID = @ldap_connect($this->serveur,$ldap_port); // On initialise la connexion au domaine (doit être un serveur LDAP valide !)
if ($w2003){ $this->SetWin2003ADOptions(); }
if (@ldap_bind ($this->Link_ID)) //connexion test en annonyme
{
$this->LnkStat = true;
@ldap_unbind($this->Link_ID);
} else {
$this->LastErr = "Erreur lors de la tentative pour trouver le serveur :".$this->serveur."\n".ldap_err2str(ldap_errno($this->Link_ID))."\n";
$this->LnkStat = false;
}
if ($this->LnkStat) // si connexion test ok
{
if ($this->identifiant==null)
{ //connexion anonyme
$this->Res_ID=@ldap_bind($this->Link_ID);
} else { // connexion authentifié
if ($this->motdepasse == null) {$this->motdepasse="";}
$this->Res_ID=@ldap_bind($this->Link_ID,$this->identifiant,$this->motdepasse);
}
if (! $this->Res_ID)
{ // echec de connexion
$this->LnkStat = False;
$this->LastErr = "Erreur lors de la tentative d'authentification :\n".ldap_err2str(ldap_errno($this->Link_ID))."\n";
} else { // connexion ok
$this->LnkStat = true;
$this->LastErr = null;
}
}
}
/////////////////////////////////////////////////////////
public function connected()
/////////////////////////////////////////////////////////
/* Test l'etat de la connection et renvoi true si ok ou false si pas de connection*/
{
if ($this->LnkStat){return true; } else {return false;}
}
/////////////////////////////////////////////////////////
public function GetLastErrorTxt()
/////////////////////////////////////////////////////////
/* renvoie false si pas de message d'erreur ou le message d'erreur quand il y en a un*/
{
if ($this->LastErr !== null){return $this->LastErr; } else {return false;}
}
/////////////////////////////////////////////////////////
public function SetWin2003ADOptions()
/////////////////////////////////////////////////////////
{
$ret = true;
if (! @ldap_set_option($this->Link_ID, LDAP_OPT_PROTOCOL_VERSION, 3))
{
$ret = false;
$this->LastErr == "La tentative de changer l'option ldap à échoué\n";
}
if (! @ldap_set_option($this->Link_ID, LDAP_OPT_REFERRALS, 0))
{
$ret = false;
$this->LastErr == "La tentative de changer l'option ldap à échoué\n";
}
if (! @ldap_set_option($ds, LDAP_SCOPE_ONELEVEL,0 ))
{
$ret = false;
$this->LastErr == "La tentative de changer l'option ldap à échoué\n";
}
return $ret;
unset($ret);
}
/////////////////////////////////////////////////////////
public function SetLinkOption($opt,$val)
/////////////////////////////////////////////////////////
{
if ($this->Link_ID)
{
if (! @ldap_set_option($this->Link_ID, $opt,$val))
{//erreur
$this->LastErr == "La tentative de changer l'option [".$opt."] a la valeur [".$val."] à échoué\n";
return false;
} else {// pas erreur
return true;
}
}
}
/////////////////////////////////////////////////////////
public function searchquery($basedn,$filter='*',$attrib='*',$timelimit=0,$mode=LDAP_DEREF_NEVER )
/////////////////////////////////////////////////////////
{
if (($filter !== null )&&($this->LnkStat !== false))
{
$err=@ldap_search($this->Link_ID,$basedn,$filter,$attrib,0,0,$timelimit,$mode);
if (!$err)
{
$this->LastErr = "La recherche à échoué, vérifiez vos paramètres \n";
}
}
$this->$Search_ID = $err;
return $this->$Search_ID;
unset($err);
$this->GetEntries();
}
/////////////////////////////////////////////////////////
public function GetEntries()
/////////////////////////////////////////////////////////
/* renvoi un tableau tab[N°entree]['NomAttribut'][N°entréesoustableau]etc.. */
{
if (($this->Search_ID !== false )&&($this->LnkStat !== false))
{
$this->Resultat = @ldap_get_entries($this->Link_ID,$this->Search_ID);
if ( ! $this->Resultat)
{
$this->Resultat = false;
$this->LastErr = "La récupération des entrées de la recherche à échoué\n";
}
return $this->Resultat;
}
}
/////////////////////////////////////////////////////////
public function GetAttribut($Entry=0,$AttribName='dn')
/////////////////////////////////////////////////////////
/* $Entry numero de l'entrée dans le tableau
$Attribname nom de l'attribut
->renvoi une valeur ou un tableau ou false sur erreur */
{
if (($this->Resultat !== null )&&($this->LnkStat !== false))
{
try
{
return $this->Resultat[(integer)$Entry][(string)$AttribName];
} catch (Exception $e) {
$this->LastErr == "La récupération de l'attibut a échoué, verifiez l'existance de l'attribut ou du numero d'entrée dans le filtre de recherche\n";
return false;
}
}
}
/////////////////////////////////////////////////////////
public function GetNbrAttribut($Entry=0)
/////////////////////////////////////////////////////////
{
if (($this->Resultat !== null )&&($this->LnkStat !== false))
{
return $this->Resultat[(Integer)$Entry]["count"];
}
}
/////////////////////////////////////////////////////////
public function __destruct()
/////////////////////////////////////////////////////////
{
// si classe parente alors parent::__destruct();
if (( $this->Link_ID !== False )and($this->Res_ID !== False))
{
@ldap_close($this->Link_ID);
}
foreach ($this as $key => $value) { unset($this->$key); } // nettoyage des variables de la classe
}
} |
Partager