|
|
@@ -60,6 +60,8 @@ use Test\TestCase; |
|
|
|
* @package OCA\User_LDAP\Tests |
|
|
|
*/ |
|
|
|
class AccessTest extends TestCase { |
|
|
|
/** @var UserMapping|\PHPUnit_Framework_MockObject_MockObject */ |
|
|
|
protected $userMapper; |
|
|
|
/** @var Connection|\PHPUnit_Framework_MockObject_MockObject */ |
|
|
|
private $connection; |
|
|
|
/** @var LDAP|\PHPUnit_Framework_MockObject_MockObject */ |
|
|
@@ -79,6 +81,7 @@ class AccessTest extends TestCase { |
|
|
|
$this->userManager = $this->createMock(Manager::class); |
|
|
|
$this->helper = $this->createMock(Helper::class); |
|
|
|
$this->config = $this->createMock(IConfig::class); |
|
|
|
$this->userMapper = $this->createMock(UserMapping::class); |
|
|
|
|
|
|
|
$this->access = new Access( |
|
|
|
$this->connection, |
|
|
@@ -87,6 +90,7 @@ class AccessTest extends TestCase { |
|
|
|
$this->helper, |
|
|
|
$this->config |
|
|
|
); |
|
|
|
$this->access->setUserMapper($this->userMapper); |
|
|
|
} |
|
|
|
|
|
|
|
private function getConnectorAndLdapMock() { |
|
|
@@ -217,6 +221,7 @@ class AccessTest extends TestCase { |
|
|
|
|
|
|
|
/** |
|
|
|
* @dataProvider dnInputDataProvider |
|
|
|
* @param array $case |
|
|
|
*/ |
|
|
|
public function testStringResemblesDN($case) { |
|
|
|
list($lw, $con, $um, $helper) = $this->getConnectorAndLdapMock(); |
|
|
@@ -440,6 +445,7 @@ class AccessTest extends TestCase { |
|
|
|
->method('__get') |
|
|
|
->willReturn(false); |
|
|
|
|
|
|
|
/** @noinspection PhpUnhandledExceptionInspection */ |
|
|
|
$this->access->setPassword('CN=foo', 'MyPassword'); |
|
|
|
} |
|
|
|
|
|
|
@@ -458,6 +464,7 @@ class AccessTest extends TestCase { |
|
|
|
->with($connection) |
|
|
|
->willReturn(false); |
|
|
|
|
|
|
|
/** @noinspection PhpUnhandledExceptionInspection */ |
|
|
|
$this->assertFalse($this->access->setPassword('CN=foo', 'MyPassword')); |
|
|
|
} |
|
|
|
|
|
|
@@ -485,6 +492,7 @@ class AccessTest extends TestCase { |
|
|
|
->with($connection, 'CN=foo', 'MyPassword') |
|
|
|
->willThrowException(new ConstraintViolationException()); |
|
|
|
|
|
|
|
/** @noinspection PhpUnhandledExceptionInspection */ |
|
|
|
$this->access->setPassword('CN=foo', 'MyPassword'); |
|
|
|
} |
|
|
|
|
|
|
@@ -508,6 +516,114 @@ class AccessTest extends TestCase { |
|
|
|
->with($connection, 'CN=foo', 'MyPassword') |
|
|
|
->willReturn(true); |
|
|
|
|
|
|
|
/** @noinspection PhpUnhandledExceptionInspection */ |
|
|
|
$this->assertTrue($this->access->setPassword('CN=foo', 'MyPassword')); |
|
|
|
} |
|
|
|
|
|
|
|
protected function prepareMocksForSearchTests( |
|
|
|
$base, |
|
|
|
$fakeConnection, |
|
|
|
$fakeSearchResultResource, |
|
|
|
$fakeLdapEntries |
|
|
|
) { |
|
|
|
$this->connection |
|
|
|
->expects($this->any()) |
|
|
|
->method('getConnectionResource') |
|
|
|
->willReturn($fakeConnection); |
|
|
|
$this->connection->expects($this->any()) |
|
|
|
->method('__get') |
|
|
|
->willReturnCallback(function($key) use ($base) { |
|
|
|
if(stripos($key, 'base') !== false) { |
|
|
|
return $base; |
|
|
|
} |
|
|
|
return null; |
|
|
|
}); |
|
|
|
|
|
|
|
$this->ldap |
|
|
|
->expects($this->any()) |
|
|
|
->method('isResource') |
|
|
|
->willReturnCallback(function ($resource) use ($fakeConnection) { |
|
|
|
return $resource === $fakeConnection; |
|
|
|
}); |
|
|
|
$this->ldap |
|
|
|
->expects($this->any()) |
|
|
|
->method('errno') |
|
|
|
->willReturn(0); |
|
|
|
$this->ldap |
|
|
|
->expects($this->once()) |
|
|
|
->method('search') |
|
|
|
->willReturn([$fakeSearchResultResource]); |
|
|
|
$this->ldap |
|
|
|
->expects($this->exactly(count($base))) |
|
|
|
->method('getEntries') |
|
|
|
->willReturn($fakeLdapEntries); |
|
|
|
|
|
|
|
$this->helper->expects($this->any()) |
|
|
|
->method('sanitizeDN') |
|
|
|
->willReturnArgument(0); |
|
|
|
} |
|
|
|
|
|
|
|
public function testSearchNoPagedSearch() { |
|
|
|
// scenario: no pages search, 1 search base |
|
|
|
$filter = 'objectClass=nextcloudUser'; |
|
|
|
$base = ['ou=zombies,dc=foobar,dc=nextcloud,dc=com']; |
|
|
|
|
|
|
|
$fakeConnection = new \stdClass(); |
|
|
|
$fakeSearchResultResource = new \stdClass(); |
|
|
|
$fakeLdapEntries = [ |
|
|
|
'count' => 2, |
|
|
|
[ |
|
|
|
'dn' => 'uid=sgarth,' . $base[0], |
|
|
|
], |
|
|
|
[ |
|
|
|
'dn' => 'uid=wwilson,' . $base[0], |
|
|
|
] |
|
|
|
]; |
|
|
|
|
|
|
|
$expected = $fakeLdapEntries; |
|
|
|
unset($expected['count']); |
|
|
|
|
|
|
|
$this->prepareMocksForSearchTests($base, $fakeConnection, $fakeSearchResultResource, $fakeLdapEntries); |
|
|
|
|
|
|
|
/** @noinspection PhpUnhandledExceptionInspection */ |
|
|
|
$result = $this->access->search($filter, $base); |
|
|
|
$this->assertSame($expected, $result); |
|
|
|
} |
|
|
|
|
|
|
|
public function testFetchListOfUsers() { |
|
|
|
$filter = 'objectClass=nextcloudUser'; |
|
|
|
$base = ['ou=zombies,dc=foobar,dc=nextcloud,dc=com']; |
|
|
|
$attrs = ['dn', 'uid']; |
|
|
|
|
|
|
|
$fakeConnection = new \stdClass(); |
|
|
|
$fakeSearchResultResource = new \stdClass(); |
|
|
|
$fakeLdapEntries = [ |
|
|
|
'count' => 2, |
|
|
|
[ |
|
|
|
'dn' => 'uid=sgarth,' . $base[0], |
|
|
|
'uid' => [ 'sgarth' ], |
|
|
|
], |
|
|
|
[ |
|
|
|
'dn' => 'uid=wwilson,' . $base[0], |
|
|
|
'uid' => [ 'wwilson' ], |
|
|
|
] |
|
|
|
]; |
|
|
|
$expected = $fakeLdapEntries; |
|
|
|
unset($expected['count']); |
|
|
|
array_walk($expected, function(&$v) { |
|
|
|
$v['dn'] = [$v['dn']]; // dn is translated into an array internally for consistency |
|
|
|
}); |
|
|
|
|
|
|
|
$this->prepareMocksForSearchTests($base, $fakeConnection, $fakeSearchResultResource, $fakeLdapEntries); |
|
|
|
|
|
|
|
$this->connection->expects($this->exactly($fakeLdapEntries['count'])) |
|
|
|
->method('writeToCache') |
|
|
|
->with($this->stringStartsWith('userExists'), true); |
|
|
|
|
|
|
|
/** @noinspection PhpUnhandledExceptionInspection */ |
|
|
|
$list = $this->access->fetchListOfUsers($filter, $attrs); |
|
|
|
$this->assertSame($expected, $list); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
} |