/** * 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; } } }