Code

- Corrected debian bugnumbers
[gosa.git] / include / class_password-methods.inc
index 6dbe020daf4a35124a00e749fca7687b66aedaa2..8d9021a4cf8d481fbbd91366dd12bc5787be349a 100644 (file)
@@ -22,6 +22,7 @@
 class passwordMethod
 {
   var $config = false;
+  var $attrs= array();
 
   // Konstructor
   function passwordMethod($config)
@@ -91,21 +92,41 @@ class passwordMethod
 // change_password, changes the Password, of the given dn
 function change_password ($dn, $password, $mode=0, $hash= "")
 {
-
   global $config;
   $newpass= "";
 
   // Get all available encryption Methods 
-  $available = passwordMethod::get_available_methods();
+
+  // NON STATIC CALL :)
+  $tmp = new passwordMethod($_SESSION['config']);
+  $available = $tmp->get_available_methods();
 
   // read current password entry for $dn, to detect the encryption Method
   $ldap       = $config->get_ldap_link();
-  $ldap->cat ($dn);
+  $ldap->cat ($dn, array("shadowLastChange", "userPassword", "uid"));
   $attrs      = $ldap->fetch ();
 
-  // Set encryption type to clear if required 
-  if (isset($attrs['userPassword'][0]) && preg_match('/^[^{}]+$/', $attrs['userPassword'][0]) && $hash == ""){
-    $hash= "clear";
+  // Check if user account was deactivated, indicated by ! after } ... {crypt}!###
+  if(isset($attrs['userPassword'][0]) && preg_match("/^[^\}]*+\}!/",$attrs['userPassword'][0])){
+    $deactivated = TRUE;
+  }else{
+    $deactivated = FALSE;
+  }
+
+#  // Get current password hash method if available 
+#  if($hash == "" && isset($attrs['userPassword'][0]) && preg_match("/[\{\}]/",$attrs['userPassword'][0])){
+#    $hash = preg_replace("/^[^\{]*+\{([^\}]*).*$/","\\1",$attrs['userPassword'][0]);
+#    $hash = strtolower($hash);
+#  }
+
+#  // Set encryption type to clear if required 
+#  if (!isset($attrs['userPassword'][0]) || $hash == ""){
+#    $hash= "clear";
+#  }
+
+  /* Is ensure that clear passwords will stay clear */
+  if($hash == "" && isset($attrs['userPassword'][0]) && !preg_match ("/^{([^}]+)}(.+)/", $attrs['userPassword'][0])){
+    $hash = "clear";
   }
 
   // Detect the encryption Method
@@ -119,9 +140,9 @@ function change_password ($dn, $password, $mode=0, $hash= "")
       $hash= strtolower($matches[1]);
     }
 
-
     // Crypt with the detected Method
     $test = new  $available[$hash]($config);
+    $test->attrs= $attrs;
     $newpass =  $test->generate_hash($password);
 
   } else {
@@ -130,8 +151,6 @@ function change_password ($dn, $password, $mode=0, $hash= "")
     $newpass =  $test->generate_hash($password);
   }
 
-
-
   // Update shadow timestamp? 
   if (isset($attrs["shadowLastChange"][0])){
     $shadow= (int)(date("U") / 86400);
@@ -151,7 +170,12 @@ function change_password ($dn, $password, $mode=0, $hash= "")
     }
 
     // Create SMB Password 
-    $attrs =    generate_smb_nt_hash($password);
+    $attrs= generate_smb_nt_hash($password);
+  }
+
+  /* Readd ! if user was deactivated */
+  if($deactivated){
+    $newpass = preg_replace("/(^[^\}]+\})(.*$)/","\\1!\\2",$newpass);
   }
 
   $attrs['userPassword']= array();
@@ -161,15 +185,32 @@ function change_password ($dn, $password, $mode=0, $hash= "")
   $ldap->modify($attrs);
 
 
-  if ($ldap->error != 'Success')
-  {
+  if ($ldap->error != 'Success') {
     print_red(sprintf(_("Setting the password failed. LDAP server says '%s'."),
           $ldap->get_error()));
+  } else {
+
+    /* Find postmodify entries for this class */
+    $command= search_config($config->data['MENU'], "password", "POSTMODIFY");
+
+    if ($command != ""){
+      /* Walk through attribute list */
+      $command= preg_replace("/%userPassword/", $password, $command);
+      $command= preg_replace("/%dn/", $dn, $command);
+
+      if (check_command($command)){
+        @DEBUG (DEBUG_SHELL, __LINE__, __FUNCTION__, __FILE__, $command, "Execute");
+        exec($command);
+      } else {
+        $message= sprintf(_("Command '%s', specified as POSTMODIFY for plugin '%s' doesn't seem to exist."), $command, "password");
+        print_red ($message);
+      }
+    }
   }
 }
 
 
-// Retrun something like array['sambaLMPassword']= "lalla..." 
+// Return something like array['sambaLMPassword']= "lalla..." 
 function generate_smb_nt_hash($password)
 {
   global $config;
@@ -182,7 +223,7 @@ function generate_smb_nt_hash($password)
   $hash= current($ar);
   if ($hash == "")
   {
-    print_red (_("Setting for SMBHASH in gosa.conf is incorrect! Can't change Samba password."));
+    print_red (sprintf(_("Setting for SMBHASH in %s is incorrect! Can't change Samba password."),CONFIG_FILE));
   }
   else 
   {