- LSsession :
[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
24  /**
25   * Données de configuration pour le support SAMBA
26   */
27
28       // SID du domaine Samba géré
29       define('LS_SAMBA_DOMAIN_SID','S-1-5-21-2421470416-3566881284-3047381809');
30
31       // Nombre de base pour le calcul des sambaSID Utilisateur
32       define('LS_SAMBA_SID_BASE_USER',1000);
33
34       // Nombre de base pour le calcul des sambaSID Groupe
35       define('LS_SAMBA_SID_BASE_GROUP',1001); 
36
37      /**
38       * NB : C'est deux nombres doivent être pour l'un paire et pour l'autre impaire
39       * pour conserver l'unicité des SID
40       */
41  
42       // Nom de l'attribut LDAP uidNumber
43       define('LS_SAMBA_UIDNUMBER_ATTR','uidNumber');
44
45       // Nom de l'attribut LDAP gidNumber
46       define('LS_SAMBA_GIDNUMBER_ATTR','gidNumber');
47
48       // Nom de l'attribut LDAP userPassword
49       define('LS_SAMBA_USERPASSWORD_ATTR','userPassword');
50
51       // Message d'erreur
52
53       $GLOBALS['LSerror_code']['SAMBA_SUPPORT_01']= array (
54         'msg' => _("SAMBA Support : la classe smHash ne peut pas être chargée."),
55         'level' => 'c'
56       );
57       $GLOBALS['LSerror_code']['SAMBA_SUPPORT_02']= array (
58         'msg' => _("SAMBA Support : La constante %{const} n'est pas définie."),
59         'level' => 'c'
60       );
61
62       $GLOBALS['LSerror_code']['SAMBA_SUPPORT_03']= array (
63         'msg' => _("SAMBA Support : Les constantes LS_SAMBA_SID_BASE_USER et LS_SAMBA_SID_BASE_GROUP ne doivent pas avoir la même parité pour l'unicité des sambaSID."),
64         'level' => 'c'
65       );
66
67
68       $GLOBALS['LSerror_code']['SAMBA_01']= array (
69         'msg' => _("SAMBA Support : L'attribut %{dependency} est introuvable. Impossible de générer l'attribut %{attr}."),
70         'level' => 'c'
71       );
72       
73  /**
74   * Fin des données de configuration
75   */
76
77
78  /**
79   * Verification du support Samba par ldapSaisie
80   * 
81   * @author Benjamin Renard <brenard@easter-eggs.com>
82   *
83   * @retval boolean true si Samba est pleinement supporté, false sinon
84   */
85   function LSaddon_samba_support() {
86     
87     $retval=true;
88
89     // Dependance de librairie
90     if ( !class_exists('smbHash') ) {
91       if ( ! @include_once(LS_LIB_DIR . 'class.smbHash.php') ) {
92         $GLOBALS['LSerror'] -> addErrorCode('SAMBA_SUPPORT_01');
93         $retval=false;
94       }
95     }
96
97
98     $MUST_DEFINE_CONST= array(
99       'LS_SAMBA_DOMAIN_SID',
100       'LS_SAMBA_SID_BASE_USER',
101       'LS_SAMBA_SID_BASE_GROUP',
102       'LS_SAMBA_UIDNUMBER_ATTR',
103       'LS_SAMBA_GIDNUMBER_ATTR',
104       'LS_SAMBA_USERPASSWORD_ATTR'
105     );
106
107     foreach($MUST_DEFINE_CONST as $const) {
108       if ( constant($const) == '' ) {
109         $GLOBALS['LSerror'] -> addErrorCode('SAMBA_SUPPORT_02',$const);
110         $retval=false;
111       }
112     }
113
114     // Pour l'intégrité des SID
115     if ( (LS_SAMBA_SID_BASE_USER % 2) == (LS_SAMBA_SID_BASE_GROUP % 2) ) {
116         $GLOBALS['LSerror'] -> addErrorCode('SAMBA_SUPPORT_03');
117         $retval=false;
118     }
119     
120     return $retval;
121   }
122
123  /**
124   * Generation de sambaSID
125   * 
126   * @author Benjamin Renard <brenard@easter-eggs.com>
127   * 
128   *   Number   = LS_SAMBA_UIDNUMBER_ATTR * 2 + LS_SAMBA_SID_BASE_USER
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_sambaSID($ldapObject) {
136     if ( get_class($ldapObject -> attrs[ LS_SAMBA_UIDNUMBER_ATTR ]) != 'LSattribute' ) {
137       $GLOBALS['LSerror'] -> addErrorCode('SAMBA_01',array('dependency' => LS_SAMBA_UIDNUMBER_ATTR, 'attr' => 'sambaSID'));
138       return;
139     }
140
141     $uidnumber_attr_val = $ldapObject -> attrs[ LS_SAMBA_UIDNUMBER_ATTR ] -> getValue();
142     $uidnumber_attr_val = $uidnumber_attr_val[0];
143     $uidNumber = $uidnumber_attr_val * 2 + LS_SAMBA_SID_BASE_USER;
144     $sambaSID = LS_SAMBA_DOMAIN_SID . '-' . $uidNumber;
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       $GLOBALS['LSerror'] -> addErrorCode('SAMBA_02',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       $GLOBALS['LSerror'] -> addErrorCode('SAMBA_03',array('dependency' => LS_SAMBA_USERPASSWORD_ATTR, 'attr' => 'sambaNTPassword'));
186       return;
187     }
188
189     $password = $ldapObject -> attrs[ LS_SAMBA_USERPASSWORD_ATTR ] -> ldap -> getClearPassword();
190     debug('pwd : '.$password);
191     $sambapassword = new smbHash;
192     $sambaNTPassword = $sambapassword -> nthash($password);
193
194     if($sambaNTPassword == '') {
195       return;
196     }
197     return $sambaNTPassword;
198   }
199
200  /**
201   * Generation de sambaLMPassword
202   * 
203   * @author Benjamin Renard <brenard@easter-eggs.com>
204   * 
205   * @param[in] $ldapObject L'objet ldap
206   *
207   * @retval string sambaLMPassword ou false si il y a un problème durant la génération
208   */
209   function generate_sambaLMPassword($ldapObject) {
210     if ( get_class($ldapObject -> attrs[ LS_SAMBA_USERPASSWORD_ATTR ]) != 'LSattribute' ) {
211       $GLOBALS['LSerror'] -> addErrorCode('SAMBA_04',array('dependency' => LS_SAMBA_USERPASSWORD_ATTR, 'attr' => 'sambaLMPassword'));
212       return;
213     }
214
215     $password = $ldapObject -> attrs[ LS_SAMBA_USERPASSWORD_ATTR ] -> ldap -> getClearPassword();
216     $sambapassword = new smbHash;
217     $sambaLMPassword = $sambapassword -> lmhash($password);
218
219     if($sambaLMPassword == '') {
220       return;
221     }
222     return $sambaLMPassword;
223   }
224
225 ?>