Merge branch 'master' of ssh://git.labs.libre-entreprise.org/gitroot/ldapsaisie
[ldapsaisie.git] / public_html / includes / class / class.LSformElement_password.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 LSsession :: loadLSclass('LSformElement');
24
25 /**
26  * Element password d'un formulaire pour LdapSaisie
27  *
28  * Cette classe définis les éléments password des formulaires.
29  * Elle étant la classe basic LSformElement.
30  *
31  * @author Benjamin Renard <brenard@easter-eggs.com>
32  */
33
34 class LSformElement_password extends LSformElement {
35   
36   var $fieldTemplate = 'LSformElement_password_field.tpl';
37   var $template = 'LSformElement_password.tpl';
38   
39   var $sendMail = false;
40
41   /**
42    * Recupère la valeur de l'élement passée en POST
43    *
44    * Cette méthode vérifie la présence en POST de la valeur de l'élément et la récupère
45    * pour la mettre dans le tableau passer en paramètre avec en clef le nom de l'élément
46    *
47    * @param[] array Pointeur sur le tableau qui recupèrera la valeur.
48    *
49    * @retval boolean true si la valeur est présente en POST, false sinon
50    */
51   function getPostData(&$return) {
52     // Récupère la valeur dans _POST, et les vérifie avec la fonction générale
53     $retval = parent :: getPostData($return);
54     // Si une valeur est recupérée
55     if ($retval) {
56       $val = $this -> form -> ldapObject -> attrs[$this -> name] -> getValue(); 
57       if( (empty($return[$this -> name][0]) ) && ( ! empty( $val ) ) ) {
58         unset($return[$this -> name]);
59         $this -> form -> _notUpdate[$this -> name] == true;
60         return true;
61       }
62       
63       if ($this -> verifyPassword($return[$this -> name][0])) {
64         LSdebug("Password : no change");
65         unset($return[$this -> name]);
66         $this -> form -> _notUpdate[$this -> name] == true;
67         return true;
68       }
69       
70       //Mail
71       if (isset($_POST['LSformElement_password_'.$this -> name.'_send'])) {
72         if ($_POST['LSformElement_password_'.$this -> name.'_send']==1) {
73           $this -> sendMail = true;
74           LSdebug ('send by form');
75         }
76       }
77       else if ($this -> params['html_options']['mail']['send']==1) {
78         $this -> sendMail = true;
79         LSdebug ('send by config');
80       }
81       if ($this -> sendMail && LSsession :: loadLSaddon('mail')) {
82         $msg = $this -> params['html_options']['mail']['msg'];
83         $subject = $this -> params['html_options']['mail']['subject'];
84         if (isset($_POST['LSformElement_password_'.$this -> name.'_msg'])) {
85           $msgInfos = json_decode($_POST['LSformElement_password_'.$this -> name.'_msg']);
86           if ($msgInfos -> subject) {
87             $subject = $msgInfos -> subject;
88           }
89           if ($msgInfos -> msg) {
90             $msg = $msgInfos -> msg;
91           }
92           if ($msgInfos -> mail) {
93             $mail = $msgInfos -> mail;
94           }
95         }
96         $this -> sendMail = array (
97           'subject' => $subject,
98           'msg' => $msg,
99           'mail' => $mail,
100           'pwd' => $return[$this -> name][0]
101         );
102         $this -> attr_html -> attribute -> addObjectEvent('after_modify',$this,'send');
103       }
104     }
105     return $retval;
106   }
107
108  /**
109   * Retourne les infos d'affichage de l'élément
110   * 
111   * Cette méthode retourne les informations d'affichage de l'élement
112   *
113   * @retval array
114   */
115   function getDisplay(){
116     LSsession :: addCssFile('LSformElement_password.css');
117     $return = $this -> getLabelInfos();
118     $pwd = "";
119     if (!$this -> isFreeze()) {
120       
121       // Help Infos
122       LSsession :: addHelpInfos(
123         'LSformElement_password',
124         array(
125           'generate' => _('Generate a password.'),
126           'verify' => _('Compare with stored password.'),
127           'view' => _('Display password.'),
128           'viewHash' => _('Display hashed password.'),
129           'hide' => _('Hide password.'),
130           'mail' => _("The password will be sent by mail if changed. Click to disable automatic notification."),
131           'nomail' => _("The password will not be sent if changed. Click to enable automatic notification."),
132           'editmail' => _("Modify the mail sent to notice the user")
133         )
134       );
135       
136       if (($this -> params['html_options']['generationTool'])&&($this -> params['html_options']['autoGenerate'])&&(empty($this -> values))) {
137         $pwd=$this->generatePassword($this -> params);
138       }
139       
140       $params = array(
141         'generate' => ($this -> params['html_options']['generationTool']==True),
142         'viewHash' => ($this -> params['html_options']['viewHash']==True),
143         'verify' => ( (!$this -> attr_html -> attribute -> ldapObject-> isNew()) && ( (isset($this -> params['html_options']['verify']) && $this -> params['html_options']['verify']) || (!isset($this -> params['html_options']['verify'])) ) )
144       );
145       if (isset($this -> params['html_options']['mail'])) {
146         $params['mail'] = $this -> params['html_options']['mail'];
147       }
148       LSsession :: addJSconfigParam($this -> name,$params);
149       
150       LSsession :: addJSscript('LSformElement_password_field.js');
151       LSsession :: addJSscript('LSformElement_password.js');
152     }
153     $return['html'] = $this -> fetchTemplate(NULL,array('pwd' => $pwd));
154     return $return;
155   }
156   
157   function generatePassword($params=NULL) {
158     return generatePassword($params['html_options']['chars'],$params['html_options']['lenght']);
159   }
160   
161   function verifyPassword($pwd) {
162     if ($this -> attr_html -> attribute -> ldapObject -> isNew()) {
163       return false;
164     }
165     if ($this -> isLoginPassword()) {
166       return LSsession :: checkUserPwd($this -> attr_html -> attribute -> ldapObject,$pwd);
167     }
168     else {
169       $hash = $this -> attr_html -> attribute -> ldap -> encodePassword($pwd);
170       $find=false;
171       foreach($this -> attr_html -> attribute -> data as $val) {
172         if ($hash == $val)
173           $find=true;
174       }
175       return $find;
176     }
177   }
178   
179   function send($params) {
180     if (is_array($this -> sendMail)) {
181       $mail = (String)$this -> sendMail['mail'];
182       Lsdebug($mail);
183       if ($mail=="") {
184         $mail_attr = $this -> attr_html -> attribute -> ldapObject -> attrs[$this -> params['html_options']['mail']['mail_attr']];
185         if ($mail_attr instanceOf LSattribute) {
186           $mail = $mail_attr -> getValue();
187           $mail=$mail[0];
188         }
189         else {
190           LSdebug("L'attribut $mail_attr pour l'envoie du nouveau mot de passe n'existe pas.");
191           return;
192         }
193       }
194               
195       if (checkEmail($mail,NULL,true)) {
196         $this -> attr_html -> attribute -> ldapObject -> registerOtherValue('password',$this -> sendMail['pwd']);
197         $msg = $this -> attr_html -> attribute -> ldapObject -> getFData($this -> sendMail['msg']);
198         if (sendMail(
199           $mail,
200           $this -> sendMail['subject'],
201           $msg
202         )) {
203           LSsession :: addInfo(_('Notice mail sent.'));
204         }
205       }
206       else {
207         LSdebug('Adresse mail incorrect : '.$mail);
208         return;
209       }
210     }
211     return true;
212   }
213   
214   public static function ajax_verifyPassword(&$data) {
215     if ((isset($_REQUEST['attribute'])) && (isset($_REQUEST['objecttype'])) && (isset($_REQUEST['fieldValue'])) && (isset($_REQUEST['idform'])) && (isset($_REQUEST['objectdn'])) ) {
216       if (LSsession ::loadLSobject($_REQUEST['objecttype'])) {
217         $object = new $_REQUEST['objecttype']();
218         $object -> loadData($_REQUEST['objectdn']);
219         $form = $object -> getForm($_REQUEST['idform']);
220         if ($form) {
221           $field=$form -> getElement($_REQUEST['attribute']);
222           if ($field) {
223             $val = $field -> verifyPassword($_REQUEST['fieldValue']);
224             $data = array(
225               'verifyPassword' => $val
226             );
227           }
228           else {
229             LSdebug('Impossible de récupérer le LSformElement');
230           }
231         }
232         else {
233           LSdebug('Impossible de recuperer le LSform.');
234         }
235       }
236     }
237   }
238   
239   public static function ajax_generatePassword(&$data) {
240     if ((isset($_REQUEST['attribute'])) && (isset($_REQUEST['objecttype'])) && (isset($_REQUEST['objectdn'])) && (isset($_REQUEST['idform'])) ) {
241       if (LSsession ::loadLSobject($_REQUEST['objecttype'])) {
242         $params = LSconfig :: get("LSobjects.".$_REQUEST['objecttype'].".attrs.".$_REQUEST['attribute']);
243         $val = self :: generatePassword($params);
244         if ( $val ) {
245           $data = array(
246             'generatePassword' => $val
247           );
248         }
249       }
250     }
251   }
252
253   public static function ajax_viewHash(&$data) {
254     if ((isset($_REQUEST['attribute'])) && (isset($_REQUEST['objecttype'])) && (isset($_REQUEST['objectdn'])) ) {
255       if (LSsession ::loadLSobject($_REQUEST['objecttype'])) {
256         $object = new $_REQUEST['objecttype']();
257         $object -> loadData($_REQUEST['objectdn']);
258         if (LSsession::canAccess($_REQUEST['objecttype'],$_REQUEST['objectdn'],null,$_REQUEST['attribute'])) {
259           $values = $object -> getValue($_REQUEST['attribute']);
260           if (is_string($values[0])) {
261             $data = array (
262               'hash' => $values[0]
263             );
264           }
265         }
266       }
267     }
268   }
269
270   public function isLoginPassword() {
271     if (!isset($this -> params['html_options']['isLoginPassword']) || $this -> params['html_options']['isLoginPassword']) {
272       return true;
273     }
274     return false;
275   }
276
277 }
278   
279 ?>