273dcd5bba661a9fd573cb23e1931fb08cf6361c
[ldapsaisie.git] / public_html / includes / addons / LSaddons.samba.php
1 <?php
2 /*******************************************************************************
3  * Copyright (C) 2007 Easter-eggs
4  * http://ldapsaisie.labs.libre-entreprise.org
5  *
6  * Author: See AUTHORS file in top-level directory.
7  *
8  * This program is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU General Public License version 2
10  * as published by the Free Software Foundation.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
20
21 ******************************************************************************/
22
23 // Messages d'erreur
24
25 // Support
26 LSerror :: defineError('SAMBA_SUPPORT_01',
27   _("SAMBA Support : Unable to load smbHash class.")
28 );
29 LSerror :: defineError('SAMBA_SUPPORT_02',
30   _("SAMBA Support : The constant %{const} is not defined.")
31 );
32
33 LSerror :: defineError('SAMBA_SUPPORT_03',
34   _("SAMBA Support : The constants LS_SAMBA_SID_BASE_USER and LS_SAMBA_SID_BASE_GROUP must'nt have the same parity to keep SambaSID's unicity.")
35 );
36
37 // Autres erreurs
38 LSerror :: defineError('SAMBA_01',
39   _("SAMBA Support : The attribute %{dependency} is missing. Unable to forge the attribute %{attr}.")
40 );
41 LSerror :: defineError('SAMBA_02',
42   _("SAMBA Support : Can't get the sambaDomain object.")
43 );
44 LSerror :: defineError('SAMBA_03',
45   _("SAMBA Support : Error modifying the sambaDomain object.")
46 );
47 LSerror :: defineError('SAMBA_04',
48   _("SAMBA Support : The %{attr} of the sambaDomain object is incorrect.")
49 );
50
51 // CONSTANTES
52
53 // Le temps infini au sens NT
54 define('LS_SAMBA_INFINITY_TIME',2147483647);
55
56  /**
57   * Verification du support Samba par ldapSaisie
58   * 
59   * @author Benjamin Renard <brenard@easter-eggs.com>
60   *
61   * @retval boolean true si Samba est pleinement supporté, false sinon
62   */
63   function LSaddon_samba_support() {
64     
65     $retval=true;
66
67     // Dependance de librairie
68     if ( !class_exists('smbHash') ) {
69       if ( !LSsession::includeFile(LS_LIB_DIR . 'class.smbHash.php') ) {
70         LSerror :: addErrorCode('SAMBA_SUPPORT_01');
71         $retval=false;
72       }
73     }
74
75
76     $MUST_DEFINE_CONST= array(
77       'LS_SAMBA_DOMAIN_SID',
78       'LS_SAMBA_DOMAIN_OBJECT_DN',
79       'LS_SAMBA_SID_BASE_USER',
80       'LS_SAMBA_SID_BASE_GROUP',
81       'LS_SAMBA_UIDNUMBER_ATTR',
82       'LS_SAMBA_GIDNUMBER_ATTR',
83       'LS_SAMBA_USERPASSWORD_ATTR'
84     );
85
86     foreach($MUST_DEFINE_CONST as $const) {
87       if ( (!defined($const)) || (constant($const) == "")) {
88         LSerror :: addErrorCode('SAMBA_SUPPORT_02',$const);
89         $retval=false;
90       }
91     }
92
93     // Pour l'intégrité des SID
94     if ( (LS_SAMBA_SID_BASE_USER % 2) == (LS_SAMBA_SID_BASE_GROUP % 2) ) {
95         LSerror :: addErrorCode('SAMBA_SUPPORT_03');
96         $retval=false;
97     }
98     
99     return $retval;
100   }
101
102  /**
103   * Generation de sambaSID d'un utilisateur
104   * 
105   * @author Benjamin Renard <brenard@easter-eggs.com>
106   * 
107   *   Number   = LS_SAMBA_UIDNUMBER_ATTR * 2 + LS_SAMBA_SID_BASE_USER
108   *   sambaSID = LS_SAMBA_DOMAIN_SID-Number
109   *
110   * @param[in] $ldapObject L'objet ldap
111   *
112   * @retval string SambaSID ou false si il y a un problème durant la génération
113   */
114   function generate_sambaUserSID($ldapObject) {
115     if ( get_class($ldapObject -> attrs[ LS_SAMBA_UIDNUMBER_ATTR ]) != 'LSattribute' ) {
116       LSerror :: addErrorCode('SAMBA_01',array('dependency' => LS_SAMBA_UIDNUMBER_ATTR, 'attr' => 'sambaSID'));
117       return;
118     }
119
120     $uidnumber_attr_val = $ldapObject -> attrs[ LS_SAMBA_UIDNUMBER_ATTR ] -> getValue();
121     $uidnumber_attr_val = $uidnumber_attr_val[0];
122     $uidNumber = $uidnumber_attr_val * 2 + LS_SAMBA_SID_BASE_USER;
123     $sambaSID = LS_SAMBA_DOMAIN_SID . '-' . $uidNumber;
124
125     return ($sambaSID);
126   }
127   
128  /**
129   * Generation de sambaSID d'un groupe
130   * 
131   * @author Benjamin Renard <brenard@easter-eggs.com>
132   * 
133   *   Number   = LS_SAMBA_GIDNUMBER_ATTR * 2 + LS_SAMBA_SID_BASE_GROUP
134   *   sambaSID = LS_SAMBA_DOMAIN_SID-Number
135   *
136   * @param[in] $ldapObject L'objet ldap
137   *
138   * @retval string SambaSID ou false si il y a un problème durant la génération
139   */
140   function generate_sambaGroupSID($ldapObject) {
141     if ( get_class($ldapObject -> attrs[ LS_SAMBA_GIDNUMBER_ATTR ]) != 'LSattribute' ) {
142       LSerror :: addErrorCode('SAMBA_01',array('dependency' => LS_SAMBA_GIDNUMBER_ATTR, 'attr' => 'sambaSID'));
143       return;
144     }
145
146     $gidnumber_attr_val = $ldapObject -> attrs[ LS_SAMBA_GIDNUMBER_ATTR ] -> getValue();
147     $gidnumber_attr_val = $gidnumber_attr_val[0];
148     $gidNumber = $gidnumber_attr_val * 2 + LS_SAMBA_SID_BASE_GROUP;
149     $sambaSID = LS_SAMBA_DOMAIN_SID . '-' . $gidNumber;
150
151     return ($sambaSID);
152   }
153
154  /**
155   * Generation de sambaPrimaryGroupSID
156   * 
157   * @author Benjamin Renard <brenard@easter-eggs.com>
158   * 
159   *   Number   = LS_SAMBA_GIDNUMBER_ATTR * 2 + LS_SAMBA_SID_BASE_GROUP
160   *   sambaSID = LS_SAMBA_DOMAIN_SID-Number
161   *
162   * @param[in] $ldapObject L'objet ldap
163   *
164   * @retval string sambaPrimaryGroupSID ou false si il y a un problème durant la génération
165   */
166   function generate_sambaPrimaryGroupSID($ldapObject) {
167     if ( get_class($ldapObject -> attrs[ LS_SAMBA_GIDNUMBER_ATTR ]) != 'LSattribute' ) {
168       LSerror :: addErrorCode('SAMBA_01',array('dependency' => LS_SAMBA_GIDNUMBER_ATTR, 'attr' => 'sambaPrimaryGroupSID'));
169       return;
170     }
171     
172     $gidNumber = $ldapObject -> attrs[ LS_SAMBA_GIDNUMBER_ATTR ] -> getValue();
173     $gidNumber = $gidNumber[0] * 2 + LS_SAMBA_SID_BASE_GROUP;
174     $sambaPrimaryGroupSID = LS_SAMBA_DOMAIN_SID . '-' . $gidNumber;
175
176     return ($sambaPrimaryGroupSID);
177   }
178
179  /**
180   * Generation de sambaNTPassword
181   * 
182   * @author Benjamin Renard <brenard@easter-eggs.com>
183   * 
184   * @param[in] $ldapObject L'objet ldap
185   *
186   * @retval string sambaNTPassword ou false si il y a un problème durant la génération
187   */
188   function generate_sambaNTPassword($ldapObject) {
189     if ( get_class($ldapObject -> attrs[ LS_SAMBA_USERPASSWORD_ATTR ]) != 'LSattribute' ) {
190       LSerror :: addErrorCode('SAMBA_01',array('dependency' => LS_SAMBA_USERPASSWORD_ATTR, 'attr' => 'sambaNTPassword'));
191       return;
192     }
193
194     $password = $ldapObject -> attrs[ LS_SAMBA_USERPASSWORD_ATTR ] -> ldap -> getClearPassword();
195     $sambapassword = new smbHash;
196     $sambaNTPassword = $sambapassword -> nthash($password);
197
198     if($sambaNTPassword == '') {
199       return;
200     }
201     return $sambaNTPassword;
202   }
203
204  /**
205   * Generation de sambaLMPassword
206   * 
207   * @author Benjamin Renard <brenard@easter-eggs.com>
208   * 
209   * @param[in] $ldapObject L'objet ldap
210   *
211   * @retval string sambaLMPassword ou false si il y a un problème durant la génération
212   */
213   function generate_sambaLMPassword($ldapObject) {
214     if ( get_class($ldapObject -> attrs[ LS_SAMBA_USERPASSWORD_ATTR ]) != 'LSattribute' ) {
215       LSerror :: addErrorCode('SAMBA_01',array('dependency' => LS_SAMBA_USERPASSWORD_ATTR, 'attr' => 'sambaLMPassword'));
216       return;
217     }
218
219     $password = $ldapObject -> attrs[ LS_SAMBA_USERPASSWORD_ATTR ] -> ldap -> getClearPassword();
220     $sambapassword = new smbHash;
221     $sambaLMPassword = $sambapassword -> lmhash($password);
222
223     if($sambaLMPassword == '') {
224       return;
225     }
226     return $sambaLMPassword;
227   }
228
229 /**
230   * Generation de uidNumber en utilisant l'objet sambaDomain
231   * 
232   * @author Benjamin Renard <brenard@easter-eggs.com>
233   * 
234   * @param[in] $ldapObject L'objet ldap
235   *
236   * @retval integer uidNumber ou false si il y a un problème durant la génération
237   */
238   function generate_uidNumber_withSambaDomainObject($ldapObject) {
239     $sambaDomain = LSldap :: getLdapEntry ( LS_SAMBA_DOMAIN_OBJECT_DN );
240     if ($sambaDomain === false) {
241       LSerror :: addErrorCode('SAMBA_02');
242       return;
243     }
244     
245     $uidNumber = $sambaDomain->getValue('uidNumber','single');
246     if (Net_LDAP2::isError($uidNumber) || $uidNumber==0) {
247       LSerror :: addErrorCode('SAMBA_04','uidNumber');
248       return;
249     }
250
251     $sambaDomain->replace(array('uidNumber' => ($uidNumber+1)));
252     $res = $sambaDomain->update();
253     if(!Net_LDAP2::isError($res)) {
254       return $uidNumber;
255     }
256     else {
257       LSerror :: addErrorCode('SAMBA_03');
258       return;
259     }
260   }
261
262  /**
263   * Generation de gidNumber en utilisant l'objet sambaDomain
264   * 
265   * @author Benjamin Renard <brenard@easter-eggs.com>
266   * 
267   * @param[in] $ldapObject L'objet ldap
268   *
269   * @retval integer gidNumber ou false si il y a un problème durant la génération
270   */
271   function generate_gidNumber_withSambaDomainObject($ldapObject) {
272     $sambaDomain = LSldap :: getLdapEntry ( LS_SAMBA_DOMAIN_OBJECT_DN );
273     if ($sambaDomain === false) {
274       LSerror :: addErrorCode('SAMBA_02');
275       return;
276     }
277     
278     $gidNumber = $sambaDomain->getValue('gidNumber','single');
279     if (Net_LDAP2::isError($gidNumber) || $gidNumber==0) {
280       LSerror :: addErrorCode('SAMBA_04','gidNumber');
281       return;
282     }
283
284     $sambaDomain->replace(array('gidNumber' => ($gidNumber+1)));
285     $res = $sambaDomain->update();
286     if(!Net_LDAP2::isError($res)) {
287       return $gidNumber;
288     }
289     else {
290       LSerror :: addErrorCode('SAMBA_03');
291       return;
292     }
293   }
294
295  /**
296   * Retourne le temps infini au sens NT
297   * 
298   * @author Benjamin Renard <brenard@easter-eggs.com>
299   * 
300   * @param[in] $ldapObject L'objet ldap
301   *
302   * @retval integer le temps infinie au sens NT
303   */
304   function return_sambaInfinityTime($ldapObject) {
305     return LS_SAMBA_INFINITY_TIME;
306   }
307
308  /**
309   * Generation de l'attribut sambaPwdLastSet
310   * 
311   * @author Benjamin Renard <brenard@easter-eggs.com>
312   * 
313   * @param[in] $ldapObject L'objet ldap
314   *
315   * @retval string sambaPwdLastSet
316   */
317   function generate_sambaPwdLastSet($ldapObject) {
318     return time();
319   }
320
321 ?>