/** * Copies a LDAP entry from one DN to another DN. * * @param string|Dn $from * @param string|Dn $to * @param boolean $recursively * @return Ldap Provides a fluid interface * @throws Exception\LdapException */ public function copy($from, $to, $recursively = false) { $entry = $this->getEntry($from, array(), true); if ($to instanceof Dn) { $toDnParts = $to->toArray(); } else { $toDnParts = Dn::explodeDn($to); } $this->add($to, $entry); if ($recursively === true && $this->countChildren($from) > 0) { $children = $this->getChildrenDns($from); foreach ($children as $c) { $cDnParts = Dn::explodeDn($c); $newChildParts = array_merge(array(array_shift($cDnParts)), $toDnParts); $newChild = Dn::implodeDn($newChildParts); $this->copy($c, $newChild, true); } } return $this; }
/** * Checks if given $childDn is beneath $parentDn subtree. * * @param string|Dn $childDn * @param string|Dn $parentDn * @return bool */ public static function isChildOf($childDn, $parentDn) { try { $keys = []; $vals = []; if ($childDn instanceof Dn) { $cdn = $childDn->toArray(DN::ATTR_CASEFOLD_LOWER); } else { $cdn = static::explodeDn($childDn, $keys, $vals, DN::ATTR_CASEFOLD_LOWER); } if ($parentDn instanceof Dn) { $pdn = $parentDn->toArray(DN::ATTR_CASEFOLD_LOWER); } else { $pdn = static::explodeDn($parentDn, $keys, $vals, DN::ATTR_CASEFOLD_LOWER); } } catch (Exception\LdapException $e) { return false; } $startIndex = count($cdn) - count($pdn); if ($startIndex < 0) { return false; } for ($i = 0, $count = count($pdn); $i < $count; $i++) { if ($cdn[$i + $startIndex] != $pdn[$i]) { return false; } } return true; }