/**
  * Magic __set() function.
  *
  * @param string $name
  *   The name of the attribute to set.
  * @param mixed $value
  *   The value to assigned to the given attribute.
  */
 public function __set($name, $value)
 {
     $attribute_name = simple_ldap_role_variable_get('simple_ldap_role_attribute_name');
     switch ($name) {
         case 'attributes':
         case 'exists':
             break;
         case 'dn':
             if ($this->dn != $value) {
                 try {
                     // Validate the DN format before trying to use it.
                     SimpleLdap::ldap_explode_dn($value);
                     // Save the old DN so a move operation can be done during save().
                     $this->move = $this->dn;
                     $this->dn = $value;
                     $this->dirty = TRUE;
                 } catch (SimpleLdapException $e) {
                 }
             }
             break;
         default:
             // Make sure $value is an array.
             if (!is_array($value)) {
                 $value = array($value);
             }
             // Make sure $this->attributes[$name] exists.
             if (!isset($this->attributes[$name])) {
                 $this->attributes[$name] = array();
             }
             // Compare the curent value with the given value.
             $diff1 = @array_diff($this->attributes[$name], $value);
             $diff2 = @array_diff($value, $this->attributes[$name]);
             // If there are any differences, update the current value.
             if (!empty($diff1) || !empty($diff2)) {
                 $this->attributes[$name] = $value;
                 $this->dirty = TRUE;
                 // Reconstruct the DN if the RDN attribute was just changed.
                 if ($name == $attribute_name) {
                     $parts = SimpleLdap::ldap_explode_dn($this->dn);
                     unset($parts['count']);
                     $parts[0] = $attribute_name . '=' . $value[0];
                     $this->move = $this->dn;
                     $this->dn = implode(',', $parts);
                 }
             }
     }
 }
 /**
  * Move an entry to a new DN.
  *
  * @param string $dn
  *   The distinguished name of an LDAP entry.
  * @param string $newdn
  *   The new distinguished name of the LDAP entry.
  * @param boolean $deleteoldrdn
  *   If TRUE the old RDN value(s) is removed, else the old RDN value(s) is
  *   retained as non-distinguished values of the entry.
  *
  * @return boolean
  *   TRUE on success
  *
  * @throw SimpleLdapException
  */
 public function move($dn, $newdn, $deleteoldrdn = TRUE)
 {
     // Make sure changes are allowed.
     if ($this->readonly) {
         throw new SimpleLdapException('The LDAP Server is configured as read-only');
     }
     // Make sure there is a valid binding.
     $this->bind();
     // Parse $newdn into a format that ldap_rename() can use.
     $parts = SimpleLdap::ldap_explode_dn($newdn, 0);
     $rdn = $parts[0];
     $parent = '';
     for ($i = 1; $i < $parts['count']; $i++) {
         $parent .= $parts[$i];
         if ($i < $parts['count'] - 1) {
             $parent .= ',';
         }
     }
     // Move the entry.
     return SimpleLdap::ldap_rename($this->resource, $dn, $rdn, $parent, $deleteoldrdn);
 }
 /**
  * Magic __set() function.
  *
  * @param string $name
  *   The name of the attribute to set.
  * @param mixed $value
  *   The value to assigned to the given attribute.
  */
 public function __set($name, $value)
 {
     $attribute_pass = simple_ldap_user_variable_get('simple_ldap_user_attribute_pass');
     switch ($name) {
         // Read-only values.
         case 'attributes':
         case 'exists':
             break;
         case 'dn':
             if ($this->dn != $value) {
                 try {
                     // Validate the DN format before trying to use it.
                     SimpleLdap::ldap_explode_dn($value);
                     // Save the old DN, so a move operation can be done during save().
                     $this->move = $this->dn;
                     $this->dn = $value;
                 } catch (SimpleLdapException $e) {
                 }
             }
             break;
             // Look up the raw password from the internal reverse hash map. This
             // intentionally falls through to default:.
         // Look up the raw password from the internal reverse hash map. This
         // intentionally falls through to default:.
         case $attribute_pass:
             if (isset(self::$hash[$value[0]])) {
                 $algorithm = simple_ldap_user_variable_get('simple_ldap_user_password_hash');
                 $value = SimpleLdap::hash(self::$hash[$value[0]], $algorithm);
             } else {
                 // A plain text copy of the password is not available. Do not
                 // overwrite the existing value.
                 return;
             }
         default:
             // Make sure $value is an array.
             if (!is_array($value)) {
                 $value = array($value);
             }
             if (!array_key_exists('count', $value)) {
                 $value['count'] = count($value);
             }
             // Make sure $this->attributes[$name] is an array.
             if (!isset($this->attributes[$name])) {
                 $this->attributes[$name] = array();
             }
             // Compare the current value with the given value.
             $diff1 = @array_diff($this->attributes[$name], $value);
             $diff2 = @array_diff($value, $this->attributes[$name]);
             // Don't trigger a write if the only difference is the count field,
             // which may be missing from the $value array.
             unset($diff1['count']);
             unset($diff2['count']);
             // If there are any differences, update the current value.
             if (!empty($diff1) || !empty($diff2)) {
                 $this->attributes[$name] = $value;
                 $this->dirty[$name] = $value;
             }
     }
 }