[Pkg-owncloud-commits] [owncloud] 05/258: backport of #8623

David Prévot taffit at moszumanska.debian.org
Sat Oct 11 17:22:14 UTC 2014


This is an automated email from the git hooks/post-receive script.

taffit pushed a commit to branch master
in repository owncloud.

commit 2b001adce0baadd8ac3f45610b3e3bedba8c11ad
Author: Arthur Schiwon <blizzz at owncloud.com>
Date:   Fri May 16 18:03:15 2014 +0200

    backport of #8623
    
    set result entry identifier earlier, i.e. before a continue for the same level can happen. otherwise  will always get the same value and we end up in an infinite loop
    
    add unit test to make sure the infinite loop never comes back
    
    Conflicts:
    	apps/user_ldap/tests/wizard.php
---
 apps/user_ldap/lib/wizard.php   |  2 +-
 apps/user_ldap/tests/wizard.php | 78 +++++++++++++++++++++++++++++++++++++++++
 2 files changed, 79 insertions(+), 1 deletion(-)

diff --git a/apps/user_ldap/lib/wizard.php b/apps/user_ldap/lib/wizard.php
index eb2a1ab..0cec493 100644
--- a/apps/user_ldap/lib/wizard.php
+++ b/apps/user_ldap/lib/wizard.php
@@ -994,6 +994,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)) {
@@ -1007,7 +1008,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));
diff --git a/apps/user_ldap/tests/wizard.php b/apps/user_ldap/tests/wizard.php
index ff5ee01..786769a 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);
 	}
 
+	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);
+	}
+
 }

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-owncloud/owncloud.git



More information about the Pkg-owncloud-commits mailing list