Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nextcloud/server.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorblizzz <blizzz@owncloud.com>2014-06-16 19:42:46 +0400
committerblizzz <blizzz@owncloud.com>2014-06-16 19:42:46 +0400
commit659a3d4a3743c9e6915cdcde9241f6388c74b723 (patch)
treeedcceae51cec9a11deba2c56d0a23adf1a2c3d63
parent3d26896431a8ff0fed5b7275f64447a517bb3930 (diff)
parent516f75fc6bc13fdedabc1a597e3ad505b08f2012 (diff)
Merge pull request #8623 from owncloud/fix-8457
LDAP: fix possible infinite loop, that causes hanging wizard, fixes #8457
-rw-r--r--apps/user_ldap/lib/wizard.php4
-rw-r--r--apps/user_ldap/tests/wizard.php80
2 files changed, 81 insertions, 3 deletions
diff --git a/apps/user_ldap/lib/wizard.php b/apps/user_ldap/lib/wizard.php
index 5d029a1f00a..8f827d7f383 100644
--- a/apps/user_ldap/lib/wizard.php
+++ b/apps/user_ldap/lib/wizard.php
@@ -909,6 +909,7 @@ class Wizard extends LDAPUtility {
if(!$this->ldap->isResource($entry)) {
continue 2;
}
+ $rr = $entry; //will be expected by nextEntry next round
$attributes = $this->ldap->getAttributes($cr, $entry);
$dn = $this->ldap->getDN($cr, $entry);
if($dn === false || in_array($dn, $dnRead)) {
@@ -922,7 +923,6 @@ class Wizard extends LDAPUtility {
$foundItems = array_merge($foundItems, $newItems);
$this->resultCache[$dn][$attr] = $newItems;
$dnRead[] = $dn;
- $rr = $entry; //will be expected by nextEntry next round
} while(($state === self::LRESULT_PROCESSED_SKIP
|| $this->ldap->isResource($entry))
&& ($dnReadLimit === 0 || $dnReadCount < $dnReadLimit));
@@ -1088,4 +1088,4 @@ class Wizard extends LDAPUtility {
}
-} \ No newline at end of file
+}
diff --git a/apps/user_ldap/tests/wizard.php b/apps/user_ldap/tests/wizard.php
index 2b5cabc705d..f5a9a1dfe8e 100644
--- a/apps/user_ldap/tests/wizard.php
+++ b/apps/user_ldap/tests/wizard.php
@@ -207,4 +207,82 @@ class Test_Wizard extends \PHPUnit_Framework_TestCase {
unset($uidnumber);
}
-} \ No newline at end of file
+ public function testCumulativeSearchOnAttributeSkipReadDN() {
+ // tests that there is no infinite loop, when skipping already processed
+ // DNs (they can be returned multiple times for multiple filters )
+ list($wizard, $configuration, $ldap) = $this->getWizardAndMocks();
+
+ $configuration->expects($this->any())
+ ->method('__get')
+ ->will($this->returnCallback(function($name) {
+ if($name === 'ldapBase') {
+ return array('base');
+ }
+ return null;
+ }));
+
+ $this->prepareLdapWrapperForConnections($ldap);
+
+ $ldap->expects($this->any())
+ ->method('isResource')
+ ->will($this->returnCallback(function($res) {
+ return (bool)$res;
+ }));
+
+ $ldap->expects($this->any())
+ ->method('search')
+ //dummy value, usually invalid
+ ->will($this->returnValue(true));
+
+ $ldap->expects($this->any())
+ ->method('countEntries')
+ //an is_resource check will follow, so we need to return a dummy resource
+ ->will($this->returnValue(7));
+
+ //5 DNs per filter means 2x firstEntry and 8x nextEntry
+ $ldap->expects($this->any())
+ ->method('firstEntry')
+ //dummy value, usually invalid
+ ->will($this->returnValue(1));
+
+ global $mark;
+ $mark = false;
+ // entries return order: 1, 2, 3, 4, 4, 5, 6
+ $ldap->expects($this->any())
+ ->method('nextEntry')
+ //dummy value, usually invalid
+ ->will($this->returnCallback(function($a, $prev){
+ $current = $prev + 1;
+ if($current === 7) {
+ return false;
+ }
+ global $mark;
+ if($prev === 4 && !$mark) {
+ $mark = true;
+ return 4;
+ }
+ return $current;
+ }));
+
+ $ldap->expects($this->any())
+ ->method('getAttributes')
+ //dummy value, usually invalid
+ ->will($this->returnCallback(function($a, $entry) {
+ return array('cn' => array($entry), 'count' => 1);
+ }));
+
+ $ldap->expects($this->any())
+ ->method('getDN')
+ //dummy value, usually invalid
+ ->will($this->returnCallback(function($a, $b) {
+ return $b;
+ }));
+
+ # The following expectations are the real test #
+ $filters = array('f1', 'f2', '*');
+ $resultArray = $wizard->cumulativeSearchOnAttribute($filters, 'cn', true, 0);
+ $this->assertSame(6, count($resultArray));
+ unset($mark);
+ }
+
+}