Lang file : Update lang french file
[ldapsaisie.git] / trunk / 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  /**
52   * Verification du support Samba par ldapSaisie
53   * 
54   * @author Benjamin Renard <brenard@easter-eggs.com>
55   *
56   * @retval boolean true si Samba est pleinement supporté, false sinon
57   */
58   function LSaddon_samba_support() {
59     
60     $retval=true;
61
62     // Dependance de librairie
63     if ( !class_exists('smbHash') ) {
64       if ( !LSsession::includeFile(LS_LIB_DIR . 'class.smbHash.php') ) {
65         LSerror :: addErrorCode('SAMBA_SUPPORT_01');
66         $retval=false;
67       }
68     }
69
70
71     $MUST_DEFINE_CONST= array(
72       'LS_SAMBA_DOMAIN_SID',
73       'LS_SAMBA_DOMAIN_OBJECT_DN',
74       'LS_SAMBA_SID_BASE_USER',
75       'LS_SAMBA_SID_BASE_GROUP',
76       'LS_SAMBA_UIDNUMBER_ATTR',
77       'LS_SAMBA_GIDNUMBER_ATTR',
78       'LS_SAMBA_USERPASSWORD_ATTR'
79     );
80
81     foreach($MUST_DEFINE_CONST as $const) {
82       if ( (!defined($const)) || (constant($const) == "")) {
83         LSerror :: addErrorCode('SAMBA_SUPPORT_02',$const);
84         $retval=false;
85       }
86     }
87
88     // Pour l'intégrité des SID
89     if ( (LS_SAMBA_SID_BASE_USER % 2) == (LS_SAMBA_SID_BASE_GROUP % 2) ) {
90         LSerror :: addErrorCode('SAMBA_SUPPORT_03');
91         $retval=false;
92     }
93     
94     return $retval;
95   }
96
97  /**
98   * Generation de sambaSID d'un utilisateur
99   * 
100   * @author Benjamin Renard <brenard@easter-eggs.com>
101   * 
102   *   Number   = LS_SAMBA_UIDNUMBER_ATTR * 2 + LS_SAMBA_SID_BASE_USER
103   *   sambaSID = LS_SAMBA_DOMAIN_SID-Number
104   *
105   * @param[in] $ldapObject L'objet ldap
106   *
107   * @retval string SambaSID ou false si il y a un problème durant la génération
108   */
109   function generate_sambaUserSID($ldapObject) {
110     if ( get_class($ldapObject -> attrs[ LS_SAMBA_UIDNUMBER_ATTR ]) != 'LSattribute' ) {
111       LSerror :: addErrorCode('SAMBA_01',array('dependency' => LS_SAMBA_UIDNUMBER_ATTR, 'attr' => 'sambaSID'));
112       return;
113     }
114
115     $uidnumber_attr_val = $ldapObject -> attrs[ LS_SAMBA_UIDNUMBER_ATTR ] -> getValue();
116     $uidnumber_attr_val = $uidnumber_attr_val[0];
117     $uidNumber = $uidnumber_attr_val * 2 + LS_SAMBA_SID_BASE_USER;
118     $sambaSID = LS_SAMBA_DOMAIN_SID . '-' . $uidNumber;
119
120     return ($sambaSID);
121   }
122   
123  /**
124   * Generation de sambaSID d'un groupe
125   * 
126   * @author Benjamin Renard <brenard@easter-eggs.com>
127   * 
128   *   Number   = LS_SAMBA_GIDNUMBER_ATTR * 2 + LS_SAMBA_SID_BASE_GROUP
129   *   sambaSID = LS_SAMBA_DOMAIN_SID-Number
130   *
131   * @param[in] $ldapObject L'objet ldap
132   *
133   * @retval string SambaSID ou false si il y a un problème durant la génération
134   */
135   function generate_sambaGroupSID($ldapObject) {
136     if ( get_class($ldapObject -> attrs[ LS_SAMBA_GIDNUMBER_ATTR ]) != 'LSattribute' ) {
137       LSerror :: addErrorCode('SAMBA_01',array('dependency' => LS_SAMBA_GIDNUMBER_ATTR, 'attr' => 'sambaSID'));
138       return;
139     }
140
141     $gidnumber_attr_val = $ldapObject -> attrs[ LS_SAMBA_GIDNUMBER_ATTR ] -> getValue();
142     $gidnumber_attr_val = $gidnumber_attr_val[0];
143     $gidNumber = $gidnumber_attr_val * 2 + LS_SAMBA_SID_BASE_GROUP;
144     $sambaSID = LS_SAMBA_DOMAIN_SID . '-' . $gidNumber;
145
146     return ($sambaSID);
147   }
148
149  /**
150   * Generation de sambaPrimaryGroupSID
151   * 
152   * @author Benjamin Renard <brenard@easter-eggs.com>
153   * 
154   *   Number   = LS_SAMBA_GIDNUMBER_ATTR * 2 + LS_SAMBA_SID_BASE_GROUP
155   *   sambaSID = LS_SAMBA_DOMAIN_SID-Number
156   *
157   * @param[in] $ldapObject L'objet ldap
158   *
159   * @retval string sambaPrimaryGroupSID ou false si il y a un problème durant la génération
160   */
161   function generate_sambaPrimaryGroupSID($ldapObject) {
162     if ( get_class($ldapObject -> attrs[ LS_SAMBA_GIDNUMBER_ATTR ]) != 'LSattribute' ) {
163       LSerror :: addErrorCode('SAMBA_01',array('dependency' => LS_SAMBA_GIDNUMBER_ATTR, 'attr' => 'sambaPrimaryGroupSID'));
164       return;
165     }
166     
167     $gidNumber = $ldapObject -> attrs[ LS_SAMBA_GIDNUMBER_ATTR ] -> getValue();
168     $gidNumber = $gidNumber[0] * 2 + LS_SAMBA_SID_BASE_GROUP;
169     $sambaPrimaryGroupSID = LS_SAMBA_DOMAIN_SID . '-' . $gidNumber;
170
171     return ($sambaPrimaryGroupSID);
172   }
173
174  /**
175   * Generation de sambaNTPassword
176   * 
177   * @author Benjamin Renard <brenard@easter-eggs.com>
178   * 
179   * @param[in] $ldapObject L'objet ldap
180   *
181   * @retval string sambaNTPassword ou false si il y a un problème durant la génération
182   */
183   function generate_sambaNTPassword($ldapObject) {
184     if ( get_class($ldapObject -> attrs[ LS_SAMBA_USERPASSWORD_ATTR ]) != 'LSattribute' ) {
185       LSerror :: addErrorCode('SAMBA_01',array('dependency' => LS_SAMBA_USERPASSWORD_ATTR, 'attr' => 'sambaNTPassword'));
186       return;
187     }
188
189     $password = $ldapObject -> attrs[ LS_SAMBA_USERPASSWORD_ATTR ] -> ldap -> getClearPassword();
190     $sambapassword = new smbHash;
191     $sambaNTPassword = $sambapassword -> nthash($password);
192
193     if($sambaNTPassword == '') {
194       return;
195     }
196     return $sambaNTPassword;
197   }
198
199  /**
200   * Generation de sambaLMPassword
201   * 
202   * @author Benjamin Renard <brenard@easter-eggs.com>
203   * 
204   * @param[in] $ldapObject L'objet ldap
205   *
206   * @retval string sambaLMPassword ou false si il y a un problème durant la génération
207   */
208   function generate_sambaLMPassword($ldapObject) {
209     if ( get_class($ldapObject -> attrs[ LS_SAMBA_USERPASSWORD_ATTR ]) != 'LSattribute' ) {
210       LSerror :: addErrorCode('SAMBA_01',array('dependency' => LS_SAMBA_USERPASSWORD_ATTR, 'attr' => 'sambaLMPassword'));
211       return;
212     }
213
214     $password = $ldapObject -> attrs[ LS_SAMBA_USERPASSWORD_ATTR ] -> ldap -> getClearPassword();
215     $sambapassword = new smbHash;
216     $sambaLMPassword = $sambapassword -> lmhash($password);
217
218     if($sambaLMPassword == '') {
219       return;
220     }
221     return $sambaLMPassword;
222   }
223
224 /**
225   * Generation de uidNumber en utilisant l'objet sambaDomain
226   * 
227   * @author Benjamin Renard <brenard@easter-eggs.com>
228   * 
229   * @param[in] $ldapObject L'objet ldap
230   *
231   * @retval integer uidNumber ou false si il y a un problème durant la génération
232   */
233   function generate_uidNumber_withSambaDomainObject($ldapObject) {
234     $sambaDomain = LSldap :: getLdapEntry ( LS_SAMBA_DOMAIN_OBJECT_DN );
235     if ($sambaDomain === false) {
236       LSerror :: addErrorCode('SAMBA_02');
237       return;
238     }
239     
240     $uidNumber = $sambaDomain->getValue('uidNumber','single');
241     if (Net_LDAP2::isError($uidNumber) || $uidNumber==0) {
242       LSerror :: addErrorCode('SAMBA_04','uidNumber');
243       return;
244     }
245
246     $sambaDomain->replace(array('uidNumber' => ($uidNumber+1)));
247     $res = $sambaDomain->update();
248     if(!Net_LDAP2::isError($res)) {
249       return $uidNumber;
250     }
251     else {
252       LSerror :: addErrorCode('SAMBA_03');
253       return;
254     }
255   }
256
257  /**
258   * Generation de gidNumber en utilisant l'objet sambaDomain
259   * 
260   * @author Benjamin Renard <brenard@easter-eggs.com>
261   * 
262   * @param[in] $ldapObject L'objet ldap
263   *
264   * @retval integer gidNumber ou false si il y a un problème durant la génération
265   */
266   function generate_gidNumber_withSambaDomainObject($ldapObject) {
267     $sambaDomain = LSldap :: getLdapEntry ( LS_SAMBA_DOMAIN_OBJECT_DN );
268     if ($sambaDomain === false) {
269       LSerror :: addErrorCode('SAMBA_02');
270       return;
271     }
272     
273     $gidNumber = $sambaDomain->getValue('gidNumber','single');
274     if (Net_LDAP2::isError($gidNumber) || $gidNumber==0) {
275       LSerror :: addErrorCode('SAMBA_04','gidNumber');
276       return;
277     }
278
279     $sambaDomain->replace(array('gidNumber' => ($gidNumber+1)));
280     $res = $sambaDomain->update();
281     if(!Net_LDAP2::isError($res)) {
282       return $gidNumber;
283     }
284     else {
285       LSerror :: addErrorCode('SAMBA_03');
286       return;
287     }
288   }
289
290 ?>