- LSerror : D├ęclaration des messages d'erreurs avec la m├ęthode statique
[ldapsaisie.git] / trunk / includes / class / class.LSattr_ldap_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 /**
24  * Ldap attribute type password
25  *
26  */
27 class LSattr_ldap_password extends LSattr_ldap {
28
29   var $clearPassword = NULL;
30
31   /**
32    * Return the display value of this attribute
33    *
34    * @param[in] $data mixed The value of this attribute
35    *
36    * @retval mixed The display value of this attribute
37    */
38   function getDisplayValue($data) {
39     return '********';
40   }
41
42   /**
43    * Return the value of this attribute to be stocked
44    *
45    * Note : Password encoding was strongly inspired of the project phpLdapAdmin.
46    * URL : http://phpldapadmin.sourceforge.net/
47    * 
48    * @param[in] $data mixed The attribute value
49    *
50    * @retval mixed The value of this attribute to be stocked
51    */
52   function getUpdateData($data) {
53     $this -> clearPassword = $data[0];
54     if (!$this -> config['ldap_options']['encode']) {
55       $this -> config['ldap_options']['encode'] = 'md5crypt';
56     }
57     switch($this -> config['ldap_options']['encode']) {
58       case 'crypt':
59         if ($this -> config['ldap_options']['no_random_crypt_salt']) {
60           return '{CRYPT}' . crypt($this -> clearPassword,substr($this -> clearPassword,0,2));
61         }
62         else {
63           return '{CRYPT}' . crypt($this -> clearPassword,$this -> getSalt(2));
64         }
65         break;
66       case 'ext_des':
67         if ( ! defined( 'CRYPT_EXT_DES' ) || CRYPT_EXT_DES == 0 ) {
68           LSerror :: addErrorCode('LSattr_ldap_password_01','ext_des');
69         }
70         else {
71           return '{CRYPT}' . crypt( $this -> clearPassword, '_' . $this -> getSalt(8) );
72         }
73         break;
74       case 'blowfish':
75         if( ! defined( 'CRYPT_BLOWFISH' ) || CRYPT_BLOWFISH == 0 ) {
76           LSerror :: addErrorCode('LSattr_ldap_password_01','blowfish');
77         }
78         else {
79           return '{CRYPT}' . crypt( $this -> clearPassword, '$2a$12$' . $this -> getSalt(13) );
80         }
81         break;
82       case 'sha':
83         if( function_exists('sha1') ) {
84           return '{SHA}' . base64_encode( pack( 'H*' , sha1( $this -> clearPassword ) ) );
85         }
86         elseif( function_exists( 'mhash' ) ) {
87           return '{SHA}' . base64_encode( mhash( MHASH_SHA1, $this -> clearPassword ) );
88         } else {
89           LSerror :: addErrorCode('LSattr_ldap_password_01','sha');
90         }
91         break;
92       case 'ssha':
93         if( function_exists( 'mhash' ) && function_exists( 'mhash_keygen_s2k' ) ) {
94           mt_srand( (double) microtime() * 1000000 );
95           $salt = mhash_keygen_s2k( MHASH_SHA1, $this -> clearPassword, substr( pack( "h*", md5( mt_rand() ) ), 0, 8 ), 4 );
96           return "{SSHA}".base64_encode( mhash( MHASH_SHA1, $this -> clearPassword.$salt ).$salt );
97         }
98         else {
99           LSerror :: addErrorCode('LSattr_ldap_password_01','ssha');
100         }
101         break;
102       case 'smd5':
103         if( function_exists( 'mhash' ) && function_exists( 'mhash_keygen_s2k' ) ) {
104           mt_srand( (double) microtime() * 1000000 );
105           $salt = mhash_keygen_s2k( MHASH_MD5, $password_clear, substr( pack( "h*", md5( mt_rand() ) ), 0, 8 ), 4 );
106           return "{SMD5}".base64_encode( mhash( MHASH_MD5, $password_clear.$salt ).$salt );
107         }
108         else {
109           LSerror :: addErrorCode('LSattr_ldap_password_01','smd5');
110         }
111         break;
112       case 'md5':
113         return '{MD5}' . base64_encode( pack( 'H*' , md5( $this -> clearPassword ) ) );
114         break;
115       case 'md5crypt':
116         if( ! defined( 'CRYPT_MD5' ) || CRYPT_MD5 == 0 ) {
117           LSerror :: addErrorCode('LSattr_ldap_password_01','md5crypt');
118         }
119         else {
120           return '{CRYPT}'.crypt($this -> clearPassword,'$1$'.$this -> getSalt().'$');
121         }
122         break;
123     }
124     return $this -> clearPassword;
125   }
126  
127   /**
128    * Return salt (random string)
129    *
130    * @param[in] integer Number of caracters in this salt
131    *
132    * @retval string A salt
133    */
134   function getSalt($length=8) {
135     $pattern = "1234567890abcdefghijklmnopqrstuvwxyz";
136     $key  = $pattern{rand(0,35)};
137     for($i=1;$i<$length;$i++)
138     {
139         $key .= $pattern{rand(0,35)};
140     }
141     return $key;
142   }
143
144   /**
145    * Return the password in clear text
146    *
147    * @retval string The password in clear text
148    */
149   function getClearPassword() {
150     return $this -> clearPassword;
151   }
152 }
153
154 /**
155  * Error Codes
156  **/
157 LSerror :: defineError('LSattr_ldap_password_01',
158 _("LSattr_ldap_password : Encoding type %{type} is not supported. This password will be stocked in clear text.")
159 );
160 ?>