[Pkg-owncloud-commits] [owncloud] 110/121: backport of #10340

David Prévot taffit at moszumanska.debian.org
Thu Aug 21 16:44:42 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 899035bfd3f047b374f2c50356f46794767a553f
Author: Arthur Schiwon <blizzz at owncloud.com>
Date:   Mon Aug 11 16:40:41 2014 +0200

    backport of #10340
    
    better check whether string resembles a DN, fixes #9887
    
    adjust login test to code changes
    
    unify tests
---
 apps/user_ldap/lib/access.php          | 12 +++++++
 apps/user_ldap/lib/user/iusertools.php |  2 ++
 apps/user_ldap/lib/user/manager.php    |  3 +-
 apps/user_ldap/tests/access.php        | 57 ++++++++++++++++++++++++++++++++++
 apps/user_ldap/tests/user/manager.php  | 47 ++++++++++++++++++++++++++++
 apps/user_ldap/tests/user_ldap.php     |  5 +++
 6 files changed, 124 insertions(+), 2 deletions(-)

diff --git a/apps/user_ldap/lib/access.php b/apps/user_ldap/lib/access.php
index 23ba425..570f445 100644
--- a/apps/user_ldap/lib/access.php
+++ b/apps/user_ldap/lib/access.php
@@ -141,6 +141,18 @@ class Access extends LDAPUtility implements user\IUserTools {
 	}
 
 	/**
+	 * checks whether the given string is probably a DN
+	 * @param string $string
+	 * @return boolean
+	 */
+	public function stringResemblesDN($string) {
+		$r = $this->ldap->explodeDN($string, 0);
+		// if exploding a DN succeeds and does not end up in
+		// an empty array except for $r[count] being 0.
+		return (is_array($r) && count($r) > 1);
+	}
+
+	/**
 	 * sanitizes a DN received from the LDAP server
 	 * @param array $dn the DN in question
 	 * @return array the sanitized DN
diff --git a/apps/user_ldap/lib/user/iusertools.php b/apps/user_ldap/lib/user/iusertools.php
index e409f3a..bbc6781 100644
--- a/apps/user_ldap/lib/user/iusertools.php
+++ b/apps/user_ldap/lib/user/iusertools.php
@@ -33,6 +33,8 @@ interface IUserTools {
 
 	public function readAttribute($dn, $attr, $filter = 'objectClass=*');
 
+	public function stringResemblesDN($string);
+
 	public function dn2username($dn, $ldapname = null);
 
 	public function username2dn($name);
diff --git a/apps/user_ldap/lib/user/manager.php b/apps/user_ldap/lib/user/manager.php
index 0f17900..0ed3d09 100644
--- a/apps/user_ldap/lib/user/manager.php
+++ b/apps/user_ldap/lib/user/manager.php
@@ -143,8 +143,7 @@ class Manager {
 			return $this->users['byUid'][$id];
 		}
 
-		if(strpos(mb_strtolower($id, 'UTF-8'), 'dc=') === false
-		   && strpos(mb_strtolower($id, 'UTF-8'), 'uid=') === false ) {
+		if(!$this->access->stringResemblesDN($id) ) {
 			//most likely a uid
 			$dn = $this->access->username2dn($id);
 			if($dn !== false) {
diff --git a/apps/user_ldap/tests/access.php b/apps/user_ldap/tests/access.php
index e77aad7..f436784 100644
--- a/apps/user_ldap/tests/access.php
+++ b/apps/user_ldap/tests/access.php
@@ -156,4 +156,61 @@ class Test_Access extends \PHPUnit_Framework_TestCase {
 
 		$this->assertSame($expected, $access->getDomainDNFromDN($inputDN));
 	}
+
+	private function getResemblesDNInputData() {
+		return  $cases = array(
+			array(
+				'input' => 'foo=bar,bar=foo,dc=foobar',
+				'interResult' => array(
+					'count' => 3,
+					0 => 'foo=bar',
+					1 => 'bar=foo',
+					2 => 'dc=foobar'
+				),
+				'expectedResult' => true
+			),
+			array(
+				'input' => 'foobarbarfoodcfoobar',
+				'interResult' => false,
+				'expectedResult' => false
+			)
+		);
+	}
+
+	public function testStringResemblesDN() {
+		list($lw, $con, $um) = $this->getConnecterAndLdapMock();
+		$access = new Access($con, $lw, $um);
+
+		$cases = $this->getResemblesDNInputData();
+
+		$lw->expects($this->exactly(2))
+			->method('explodeDN')
+			->will($this->returnCallback(function ($dn) use ($cases) {
+				foreach($cases as $case) {
+					if($dn === $case['input']) {
+						return $case['interResult'];
+					}
+				}
+			}));
+
+		foreach($cases as $case) {
+			$this->assertSame($case['expectedResult'], $access->stringResemblesDN($case['input']));
+		}
+	}
+
+	public function testStringResemblesDNLDAPmod() {
+		list($lw, $con, $um) = $this->getConnecterAndLdapMock();
+		$lw = new \OCA\user_ldap\lib\LDAP();
+		$access = new Access($con, $lw, $um);
+
+		if(!function_exists('ldap_explode_dn')) {
+			$this->markTestSkipped('LDAP Module not available');
+		}
+
+		$cases = $this->getResemblesDNInputData();
+
+		foreach($cases as $case) {
+			$this->assertSame($case['expectedResult'], $access->stringResemblesDN($case['input']));
+		}
+	}
 }
diff --git a/apps/user_ldap/tests/user/manager.php b/apps/user_ldap/tests/user/manager.php
index 7599980..7d68786 100644
--- a/apps/user_ldap/tests/user/manager.php
+++ b/apps/user_ldap/tests/user/manager.php
@@ -44,6 +44,11 @@ class Test_User_Manager extends \PHPUnit_Framework_TestCase {
         $inputDN = 'cn=foo,dc=foobar,dc=bar';
         $uid = '563418fc-423b-1033-8d1c-ad5f418ee02e';
 
+		$access->expects($this->once())
+            ->method('stringResemblesDN')
+            ->with($this->equalTo($inputDN))
+            ->will($this->returnValue(true));
+
         $access->expects($this->once())
             ->method('dn2username')
             ->with($this->equalTo($inputDN))
@@ -66,6 +71,38 @@ class Test_User_Manager extends \PHPUnit_Framework_TestCase {
         $inputDN = 'uid=foo,o=foobar,c=bar';
         $uid = '563418fc-423b-1033-8d1c-ad5f418ee02e';
 
+		$access->expects($this->once())
+            ->method('stringResemblesDN')
+            ->with($this->equalTo($inputDN))
+            ->will($this->returnValue(true));
+
+        $access->expects($this->once())
+            ->method('dn2username')
+            ->with($this->equalTo($inputDN))
+            ->will($this->returnValue($uid));
+
+        $access->expects($this->never())
+            ->method('username2dn');
+
+        $manager = new Manager($config, $filesys, $log, $avaMgr, $image);
+        $manager->setLdapAccess($access);
+        $user = $manager->get($inputDN);
+
+        $this->assertInstanceOf('\OCA\user_ldap\lib\user\User', $user);
+    }
+
+    public function testGetByExoticDN() {
+        list($access, $config, $filesys, $image, $log, $avaMgr) =
+            $this->getTestInstances();
+
+        $inputDN = 'ab=cde,f=ghei,mno=pq';
+        $uid = '563418fc-423b-1033-8d1c-ad5f418ee02e';
+
+		$access->expects($this->once())
+            ->method('stringResemblesDN')
+            ->with($this->equalTo($inputDN))
+            ->will($this->returnValue(true));
+
         $access->expects($this->once())
             ->method('dn2username')
             ->with($this->equalTo($inputDN))
@@ -87,6 +124,11 @@ class Test_User_Manager extends \PHPUnit_Framework_TestCase {
 
         $inputDN = 'cn=gone,dc=foobar,dc=bar';
 
+		$access->expects($this->once())
+            ->method('stringResemblesDN')
+            ->with($this->equalTo($inputDN))
+            ->will($this->returnValue(true));
+
         $access->expects($this->once())
             ->method('dn2username')
             ->with($this->equalTo($inputDN))
@@ -119,6 +161,11 @@ class Test_User_Manager extends \PHPUnit_Framework_TestCase {
             ->with($this->equalTo($uid))
             ->will($this->returnValue($dn));
 
+        $access->expects($this->once())
+            ->method('stringResemblesDN')
+            ->with($this->equalTo($uid))
+            ->will($this->returnValue(false));
+
         $manager = new Manager($config, $filesys, $log, $avaMgr, $image);
         $manager->setLdapAccess($access);
         $user = $manager->get($uid);
diff --git a/apps/user_ldap/tests/user_ldap.php b/apps/user_ldap/tests/user_ldap.php
index 8787e02..e51f6cb 100644
--- a/apps/user_ldap/tests/user_ldap.php
+++ b/apps/user_ldap/tests/user_ldap.php
@@ -131,6 +131,11 @@ class Test_User_Ldap_Direct extends \PHPUnit_Framework_TestCase {
 			   ->will($this->returnValue('gunslinger'));
 
 		$access->expects($this->any())
+			   ->method('stringResemblesDN')
+			   ->with($this->equalTo('dnOfRoland,dc=test'))
+			   ->will($this->returnValue(true));
+
+		$access->expects($this->any())
 			   ->method('areCredentialsValid')
 			   ->will($this->returnCallback(function($dn, $pwd) {
 					if($pwd === 'dt19') {

-- 
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