Skip to content

Commit

Permalink
check user state when fetching to avoid dealing with offline objects
Browse files Browse the repository at this point in the history
fixes #9502

Signed-off-by: Arthur Schiwon <blizzz@arthur-schiwon.de>
  • Loading branch information
blizzz authored and MorrisJobke committed May 29, 2018
1 parent c61e957 commit d33ba08
Show file tree
Hide file tree
Showing 2 changed files with 56 additions and 7 deletions.
24 changes: 19 additions & 5 deletions apps/user_ldap/lib/Access.php
Original file line number Diff line number Diff line change
Expand Up @@ -651,6 +651,7 @@ public function nextcloudGroupNames($ldapGroups) {
* @param array $ldapObjects as returned by fetchList()
* @param bool $isUsers
* @return array
* @throws \Exception
*/
private function ldap2NextcloudNames($ldapObjects, $isUsers) {
if($isUsers) {
Expand All @@ -659,7 +660,7 @@ private function ldap2NextcloudNames($ldapObjects, $isUsers) {
} else {
$nameAttribute = $this->connection->ldapGroupDisplayName;
}
$nextcloudNames = array();
$nextcloudNames = [];

foreach($ldapObjects as $ldapObject) {
$nameByLDAP = null;
Expand All @@ -675,6 +676,7 @@ private function ldap2NextcloudNames($ldapObjects, $isUsers) {
if($ncName) {
$nextcloudNames[] = $ncName;
if($isUsers) {
$this->updateUserState($ncName);
//cache the user names so it does not need to be retrieved
//again later (e.g. sharing dialogue).
if(is_null($nameByLDAP)) {
Expand All @@ -689,6 +691,19 @@ private function ldap2NextcloudNames($ldapObjects, $isUsers) {
return $nextcloudNames;
}

/**
* removes the deleted-flag of a user if it was set
*
* @param string $ncname
* @throws \Exception
*/
public function updateUserState($ncname) {
$user = $this->userManager->get($ncname);
if($user instanceof OfflineUser) {
$user->unmark();
}
}

/**
* caches the user display name
* @param string $ocName the internal Nextcloud username
Expand Down Expand Up @@ -862,7 +877,9 @@ public function fetchListOfUsers($filter, $attr, $limit = null, $offset = null,
* provided with an array of LDAP user records the method will fetch the
* user object and requests it to process the freshly fetched attributes and
* and their values
*
* @param array $ldapRecords
* @throws \Exception
*/
public function batchApplyUserAttributes(array $ldapRecords){
$displayNameAttribute = strtolower($this->connection->ldapUserDisplayName);
Expand All @@ -875,11 +892,8 @@ public function batchApplyUserAttributes(array $ldapRecords){
if($ocName === false) {
continue;
}
$this->updateUserState($ocName);
$user = $this->userManager->get($ocName);
if($user instanceof OfflineUser) {
$user->unmark();
$user = $this->userManager->get($ocName);
}
if ($user !== null) {
$user->processAttributes($userRecord);
} else {
Expand Down
39 changes: 37 additions & 2 deletions apps/user_ldap/tests/AccessTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@
use OCA\User_LDAP\LogWrapper;
use OCA\User_LDAP\Mapping\UserMapping;
use OCA\User_LDAP\User\Manager;
use OCA\User_LDAP\User\OfflineUser;
use OCA\User_LDAP\User\User;
use OCP\IAvatarManager;
use OCP\IConfig;
Expand Down Expand Up @@ -312,7 +313,7 @@ public function testBatchApplyUserAttributes() {
$userMock->expects($this->exactly(count($data)))
->method('processAttributes');

$this->userManager->expects($this->exactly(count($data)))
$this->userManager->expects($this->exactly(count($data) * 2))
->method('get')
->will($this->returnValue($userMock));

Expand Down Expand Up @@ -394,7 +395,7 @@ public function testBatchApplyUserAttributesDontSkip() {
$userMock->expects($this->exactly(count($data)))
->method('processAttributes');

$this->userManager->expects($this->exactly(count($data)))
$this->userManager->expects($this->exactly(count($data) * 2))
->method('get')
->will($this->returnValue($userMock));

Expand Down Expand Up @@ -662,6 +663,40 @@ public function testSanitizeUsername($name, $expected) {
$this->assertSame($expected, $sanitizedName);
}

public function testUserStateUpdate() {
$this->connection->expects($this->any())
->method('__get')
->willReturnMap([
[ 'ldapUserDisplayName', 'displayName' ],
[ 'ldapUserDisplayName2', null],
]);

$offlineUserMock = $this->createMock(OfflineUser::class);
$offlineUserMock->expects($this->once())
->method('unmark');

$regularUserMock = $this->createMock(User::class);

$this->userManager->expects($this->atLeastOnce())
->method('get')
->with('detta')
->willReturnOnConsecutiveCalls($offlineUserMock, $regularUserMock);

/** @var UserMapping|\PHPUnit_Framework_MockObject_MockObject $mapperMock */
$mapperMock = $this->createMock(UserMapping::class);
$mapperMock->expects($this->any())
->method('getNameByDN')
->with('uid=detta,ou=users,dc=hex,dc=ample')
->willReturn('detta');
$this->access->setUserMapper($mapperMock);

$records = [
[
'dn' => ['uid=detta,ou=users,dc=hex,dc=ample'],
'displayName' => ['Detta Detkova'],
]
];
$this->access->nextcloudUserNames($records);
}

}

0 comments on commit d33ba08

Please sign in to comment.