diff --git a/include/class_Combinations.inc b/include/class_Combinations.inc new file mode 100644 index 0000000000000000000000000000000000000000..d0ef2ac59839c0074c3adeb860d36b93d3e8d782 --- /dev/null +++ b/include/class_Combinations.inc @@ -0,0 +1,88 @@ +<?php +/* + This code is part of FusionDirectory (http://www.fusiondirectory.org/) + Copyright (C) 2018 FusionDirectory + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. +*/ + +/*!brief Iterator that returns all combinations of $size element from $input array + */ +class Combinations implements Iterator +{ + protected $current = NULL; + protected $input = NULL; + protected $n = 0; + protected $size = 0; + protected $pos = 0; + + function __construct($input, $size) + { + $this->input = array_values($input); + $this->n = count($this->input); + $this->size = $size; + $this->rewind(); + } + + function key() + { + return $this->pos; + } + + function current() + { + $r = array(); + for ($i = 0; $i < $this->size; $i++) { + $r[] = $this->input[$this->current[$i]]; + } + return $r; + } + + function next() + { + if ($this->_next()) { + $this->pos++; + } else { + $this->pos = -1; + } + } + + function rewind() + { + $this->current = range(0, $this->size); + $this->pos = 0; + } + + function valid() + { + return ($this->pos >= 0); + } + + protected function _next() + { + $i = $this->size - 1; + while (($i >= 0) && ($this->current[$i] == $this->n - $this->size + $i)) { + $i--; + } + if ($i < 0) { + return FALSE; + } + $this->current[$i]++; + while ($i++ < $this->size - 1) { + $this->current[$i] = $this->current[$i - 1] + 1; + } + return TRUE; + } +} diff --git a/include/simpleplugin/class_simplePlugin.inc b/include/simpleplugin/class_simplePlugin.inc index 38ac3ae2b124125d7fbcaa538ee6b6890f7a73c5..8fe11514e5a8d47ad5b7e6422c57b0a2a3e939cd 100644 --- a/include/simpleplugin/class_simplePlugin.inc +++ b/include/simpleplugin/class_simplePlugin.inc @@ -1731,27 +1731,27 @@ class simplePlugin /* Try to use plain entry first */ $dn = $attribute.'='.ldap_escape_dn($this->$attribute).','.$base; - if ($dn == $this->orig_dn) { - return $dn; - } - $ldap->cat($dn, array('dn')); - if (!$ldap->fetch()) { + if (($dn == $this->orig_dn) || !$ldap->dn_exists($dn)) { return $dn; } - /* Look for additional attributes */ + /* Build DN with multiple attributes */ + $usableAttributes = array(); foreach ($this->attributes as $attr) { - if (($attr == $attribute) || ($this->$attr == '') || is_array($this->$attr)) { - continue; - } - - $dn = $attribute.'='.ldap_escape_dn($this->$attribute).'+'.$attr.'='.ldap_escape_dn($this->$attr).','.$base; - if ($dn == $this->orig_dn) { - return $dn; + if (($attr != $attribute) && is_string($this->$attr) && ($this->$attr != '')) { + $usableAttributes[] = $attr; } - $ldap->cat($dn, array('dn')); - if (!$ldap->fetch()) { - return $dn; + } + for ($i = 1; $i < count($usableAttributes); $i++) { + foreach (new Combinations($usableAttributes, $i) as $attrs) { + $dn = $attribute.'='.ldap_escape_dn($this->$attribute); + foreach ($attrs as $attr) { + $dn .= '+'.$attr.'='.ldap_escape_dn($this->$attr); + } + $dn .= ','.$base; + if (($dn == $this->orig_dn) || !$ldap->dn_exists($dn)) { + return $dn; + } } } diff --git a/plugins/generic/references/class_reference.inc b/plugins/generic/references/class_reference.inc index a9ca0aa781be4553f5f6d78dd8dbcfd873a8aad8..de8b2e5b0104aeea9b0ac21e32d91167188b8f8f 100644 --- a/plugins/generic/references/class_reference.inc +++ b/plugins/generic/references/class_reference.inc @@ -83,6 +83,12 @@ class reference extends simplePlugin function save() { + return array(); + } + + function remove($fulldelete = FALSE) + { + return array(); } }