LSaddon :: Samba : Added generate_sambaDomainName() function
[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_NAME',
79       'LS_SAMBA_DOMAIN_OBJECT_DN',
80       'LS_SAMBA_SID_BASE_USER',
81       'LS_SAMBA_SID_BASE_GROUP',
82       'LS_SAMBA_UIDNUMBER_ATTR',
83       'LS_SAMBA_GIDNUMBER_ATTR',
84       'LS_SAMBA_USERPASSWORD_ATTR'
85     );
86
87     foreach($MUST_DEFINE_CONST as $const) {
88       if ( (!defined($const)) || (constant($const) == "")) {
89         LSerror :: addErrorCode('SAMBA_SUPPORT_02',$const);
90         $retval=false;
91       }
92     }
93
94     // Pour l'intégrité des SID
95     if ( (LS_SAMBA_SID_BASE_USER % 2) == (LS_SAMBA_SID_BASE_GROUP % 2) ) {
96         LSerror :: addErrorCode('SAMBA_SUPPORT_03');
97         $retval=false;
98     }
99     
100     return $retval;
101   }
102
103  /**
104   * Generation de sambaSID d'un utilisateur
105   * 
106   * @author Benjamin Renard <brenard@easter-eggs.com>
107   * 
108   *   Number   = LS_SAMBA_UIDNUMBER_ATTR * 2 + LS_SAMBA_SID_BASE_USER
109   *   sambaSID = LS_SAMBA_DOMAIN_SID-Number
110   *
111   * @param[in] $ldapObject L'objet ldap
112   *
113   * @retval string SambaSID ou false si il y a un problème durant la génération
114   */
115   function generate_sambaUserSID($ldapObject) {
116     if ( get_class($ldapObject -> attrs[ LS_SAMBA_UIDNUMBER_ATTR ]) != 'LSattribute' ) {
117       LSerror :: addErrorCode('SAMBA_01',array('dependency' => LS_SAMBA_UIDNUMBER_ATTR, 'attr' => 'sambaSID'));
118       return;
119     }
120
121     $uidnumber_attr_val = $ldapObject -> attrs[ LS_SAMBA_UIDNUMBER_ATTR ] -> getValue();
122     $uidnumber_attr_val = $uidnumber_attr_val[0];
123     $uidNumber = $uidnumber_attr_val * 2 + LS_SAMBA_SID_BASE_USER;
124     $sambaSID = LS_SAMBA_DOMAIN_SID . '-' . $uidNumber;
125
126     return ($sambaSID);
127   }
128   
129  /**
130   * Generation de sambaSID d'un groupe
131   * 
132   * @author Benjamin Renard <brenard@easter-eggs.com>
133   * 
134   *   Number   = LS_SAMBA_GIDNUMBER_ATTR * 2 + LS_SAMBA_SID_BASE_GROUP
135   *   sambaSID = LS_SAMBA_DOMAIN_SID-Number
136   *
137   * @param[in] $ldapObject L'objet ldap
138   *
139   * @retval string SambaSID ou false si il y a un problème durant la génération
140   */
141   function generate_sambaGroupSID($ldapObject) {
142     if ( get_class($ldapObject -> attrs[ LS_SAMBA_GIDNUMBER_ATTR ]) != 'LSattribute' ) {
143       LSerror :: addErrorCode('SAMBA_01',array('dependency' => LS_SAMBA_GIDNUMBER_ATTR, 'attr' => 'sambaSID'));
144       return;
145     }
146
147     $gidnumber_attr_val = $ldapObject -> attrs[ LS_SAMBA_GIDNUMBER_ATTR ] -> getValue();
148     $gidnumber_attr_val = $gidnumber_attr_val[0];
149     $gidNumber = $gidnumber_attr_val * 2 + LS_SAMBA_SID_BASE_GROUP;
150     $sambaSID = LS_SAMBA_DOMAIN_SID . '-' . $gidNumber;
151
152     return ($sambaSID);
153   }
154
155  /**
156   * Generation de sambaPrimaryGroupSID
157   * 
158   * @author Benjamin Renard <brenard@easter-eggs.com>
159   * 
160   *   Number   = LS_SAMBA_GIDNUMBER_ATTR * 2 + LS_SAMBA_SID_BASE_GROUP
161   *   sambaSID = LS_SAMBA_DOMAIN_SID-Number
162   *
163   * @param[in] $ldapObject L'objet ldap
164   *
165   * @retval string sambaPrimaryGroupSID ou false si il y a un problème durant la génération
166   */
167   function generate_sambaPrimaryGroupSID($ldapObject) {
168     if ( get_class($ldapObject -> attrs[ LS_SAMBA_GIDNUMBER_ATTR ]) != 'LSattribute' ) {
169       LSerror :: addErrorCode('SAMBA_01',array('dependency' => LS_SAMBA_GIDNUMBER_ATTR, 'attr' => 'sambaPrimaryGroupSID'));
170       return;
171     }
172     
173     $gidNumber = $ldapObject -> attrs[ LS_SAMBA_GIDNUMBER_ATTR ] -> getValue();
174     $gidNumber = $gidNumber[0] * 2 + LS_SAMBA_SID_BASE_GROUP;
175     $sambaPrimaryGroupSID = LS_SAMBA_DOMAIN_SID . '-' . $gidNumber;
176
177     return ($sambaPrimaryGroupSID);
178   }
179
180  /**
181   * Generation de sambaNTPassword
182   * 
183   * @author Benjamin Renard <brenard@easter-eggs.com>
184   * 
185   * @param[in] $ldapObject L'objet ldap
186   *
187   * @retval string sambaNTPassword ou false si il y a un problème durant la génération
188   */
189   function generate_sambaNTPassword($ldapObject) {
190     if ( get_class($ldapObject -> attrs[ LS_SAMBA_USERPASSWORD_ATTR ]) != 'LSattribute' ) {
191       LSerror :: addErrorCode('SAMBA_01',array('dependency' => LS_SAMBA_USERPASSWORD_ATTR, 'attr' => 'sambaNTPassword'));
192       return;
193     }
194
195     $password = $ldapObject -> attrs[ LS_SAMBA_USERPASSWORD_ATTR ] -> ldap -> getClearPassword();
196     $sambapassword = new smbHash;
197     $sambaNTPassword = $sambapassword -> nthash($password);
198
199     if($sambaNTPassword == '') {
200       return;
201     }
202     return $sambaNTPassword;
203   }
204
205  /**
206   * Generation de sambaLMPassword
207   * 
208   * @author Benjamin Renard <brenard@easter-eggs.com>
209   * 
210   * @param[in] $ldapObject L'objet ldap
211   *
212   * @retval string sambaLMPassword ou false si il y a un problème durant la génération
213   */
214   function generate_sambaLMPassword($ldapObject) {
215     if ( get_class($ldapObject -> attrs[ LS_SAMBA_USERPASSWORD_ATTR ]) != 'LSattribute' ) {
216       LSerror :: addErrorCode('SAMBA_01',array('dependency' => LS_SAMBA_USERPASSWORD_ATTR, 'attr' => 'sambaLMPassword'));
217       return;
218     }
219
220     $password = $ldapObject -> attrs[ LS_SAMBA_USERPASSWORD_ATTR ] -> ldap -> getClearPassword();
221     $sambapassword = new smbHash;
222     $sambaLMPassword = $sambapassword -> lmhash($password);
223
224     if($sambaLMPassword == '') {
225       return;
226     }
227     return $sambaLMPassword;
228   }
229
230 /**
231   * Generation de uidNumber en utilisant l'objet sambaDomain
232   * 
233   * @author Benjamin Renard <brenard@easter-eggs.com>
234   * 
235   * @param[in] $ldapObject L'objet ldap
236   *
237   * @retval integer uidNumber ou false si il y a un problème durant la génération
238   */
239   function generate_uidNumber_withSambaDomainObject($ldapObject) {
240     $sambaDomain = LSldap :: getLdapEntry ( LS_SAMBA_DOMAIN_OBJECT_DN );
241     if ($sambaDomain === false) {
242       LSerror :: addErrorCode('SAMBA_02');
243       return;
244     }
245     
246     $uidNumber = $sambaDomain->getValue('uidNumber','single');
247     if (Net_LDAP2::isError($uidNumber) || $uidNumber==0) {
248       LSerror :: addErrorCode('SAMBA_04','uidNumber');
249       return;
250     }
251
252     $sambaDomain->replace(array('uidNumber' => ($uidNumber+1)));
253     $res = $sambaDomain->update();
254     if(!Net_LDAP2::isError($res)) {
255       return $uidNumber;
256     }
257     else {
258       LSerror :: addErrorCode('SAMBA_03');
259       return;
260     }
261   }
262
263  /**
264   * Generation de gidNumber en utilisant l'objet sambaDomain
265   * 
266   * @author Benjamin Renard <brenard@easter-eggs.com>
267   * 
268   * @param[in] $ldapObject L'objet ldap
269   *
270   * @retval integer gidNumber ou false si il y a un problème durant la génération
271   */
272   function generate_gidNumber_withSambaDomainObject($ldapObject) {
273     $sambaDomain = LSldap :: getLdapEntry ( LS_SAMBA_DOMAIN_OBJECT_DN );
274     if ($sambaDomain === false) {
275       LSerror :: addErrorCode('SAMBA_02');
276       return;
277     }
278     
279     $gidNumber = $sambaDomain->getValue('gidNumber','single');
280     if (Net_LDAP2::isError($gidNumber) || $gidNumber==0) {
281       LSerror :: addErrorCode('SAMBA_04','gidNumber');
282       return;
283     }
284
285     $sambaDomain->replace(array('gidNumber' => ($gidNumber+1)));
286     $res = $sambaDomain->update();
287     if(!Net_LDAP2::isError($res)) {
288       return $gidNumber;
289     }
290     else {
291       LSerror :: addErrorCode('SAMBA_03');
292       return;
293     }
294   }
295
296  /**
297   * Retourne le temps infini au sens NT
298   * 
299   * @author Benjamin Renard <brenard@easter-eggs.com>
300   * 
301   * @param[in] $ldapObject L'objet ldap
302   *
303   * @retval integer le temps infinie au sens NT
304   */
305   function return_sambaInfinityTime($ldapObject) {
306     return LS_SAMBA_INFINITY_TIME;
307   }
308
309  /**
310   * Generation de l'attribut sambaPwdLastSet
311   * 
312   * @author Benjamin Renard <brenard@easter-eggs.com>
313   * 
314   * @param[in] $ldapObject L'objet ldap
315   *
316   * @retval string sambaPwdLastSet
317   */
318   function generate_sambaPwdLastSet($ldapObject) {
319     return time();
320   }
321
322  /**
323   * Generation du sambaDomainName
324   *
325   * @author Benjamin Renard <brenard@easter-eggs.com>
326   *
327   * @retval string Le sambaDomainName
328   */
329   function generate_sambaDomainName($ldapObject) {
330     return LS_SAMBA_DOMAIN_NAME;
331   }
332
333 ?>