12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220 |
- <?php
- /**
- * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors
- * SPDX-FileCopyrightText: 2016 ownCloud, Inc.
- * SPDX-License-Identifier: AGPL-3.0-only
- */
- namespace OCA\User_LDAP\Tests\User;
- use OCA\User_LDAP\Access;
- use OCA\User_LDAP\Connection;
- use OCA\User_LDAP\FilesystemHelper;
- use OCA\User_LDAP\User\User;
- use OCP\IAvatar;
- use OCP\IAvatarManager;
- use OCP\IConfig;
- use OCP\Image;
- use OCP\IUser;
- use OCP\IUserManager;
- use OCP\Notification\IManager as INotificationManager;
- use OCP\Notification\INotification;
- use Psr\Log\LoggerInterface;
- /**
- * Class UserTest
- *
- * @group DB
- *
- * @package OCA\User_LDAP\Tests\User
- */
- class UserTest extends \Test\TestCase {
- /** @var Access|\PHPUnit\Framework\MockObject\MockObject */
- protected $access;
- /** @var Connection|\PHPUnit\Framework\MockObject\MockObject */
- protected $connection;
- /** @var IConfig|\PHPUnit\Framework\MockObject\MockObject */
- protected $config;
- /** @var FilesystemHelper|\PHPUnit\Framework\MockObject\MockObject */
- protected $filesystemhelper;
- /** @var INotificationManager|\PHPUnit\Framework\MockObject\MockObject */
- protected $notificationManager;
- /** @var IUserManager|\PHPUnit\Framework\MockObject\MockObject */
- protected $userManager;
- /** @var Image|\PHPUnit\Framework\MockObject\MockObject */
- protected $image;
- /** @var IAvatarManager|\PHPUnit\Framework\MockObject\MockObject */
- protected $avatarManager;
- /** @var LoggerInterface|\PHPUnit\Framework\MockObject\MockObject */
- protected $logger;
- /** @var string */
- protected $uid = 'alice';
- /** @var string */
- protected $dn = 'uid=alice,dc=foo,dc=bar';
- /** @var User */
- protected $user;
- protected function setUp(): void {
- parent::setUp();
- $this->connection = $this->createMock(Connection::class);
- $this->access = $this->createMock(Access::class);
- $this->access->connection = $this->connection;
- $this->access->expects($this->any())
- ->method('getConnection')
- ->willReturn($this->connection);
- $this->config = $this->createMock(IConfig::class);
- $this->filesystemhelper = $this->createMock(FilesystemHelper::class);
- $this->logger = $this->createMock(LoggerInterface::class);
- $this->avatarManager = $this->createMock(IAvatarManager::class);
- $this->image = $this->createMock(Image::class);
- $this->userManager = $this->createMock(IUserManager::class);
- $this->notificationManager = $this->createMock(INotificationManager::class);
- $this->user = new User(
- $this->uid,
- $this->dn,
- $this->access,
- $this->config,
- $this->filesystemhelper,
- $this->image,
- $this->logger,
- $this->avatarManager,
- $this->userManager,
- $this->notificationManager
- );
- }
- public function testGetDNandUsername(): void {
- $this->assertSame($this->dn, $this->user->getDN());
- $this->assertSame($this->uid, $this->user->getUsername());
- }
- public function testUpdateEmailProvided(): void {
- $this->connection->expects($this->once())
- ->method('__get')
- ->with($this->equalTo('ldapEmailAttribute'))
- ->willReturn('email');
- $this->access->expects($this->once())
- ->method('readAttribute')
- ->with($this->equalTo($this->dn),
- $this->equalTo('email'))
- ->willReturn(['alice@foo.bar']);
- $coreUser = $this->getMockBuilder(IUser::class)
- ->disableOriginalConstructor()
- ->getMock();
- $coreUser->expects($this->once())
- ->method('setEMailAddress')
- ->with('alice@foo.bar');
- $this->userManager->expects($this->any())
- ->method('get')
- ->willReturn($coreUser);
- $this->user->updateEmail();
- }
- public function testUpdateEmailNotProvided(): void {
- $this->connection->expects($this->once())
- ->method('__get')
- ->with($this->equalTo('ldapEmailAttribute'))
- ->willReturn('email');
- $this->access->expects($this->once())
- ->method('readAttribute')
- ->with($this->equalTo($this->dn),
- $this->equalTo('email'))
- ->willReturn(false);
- $this->config->expects($this->never())
- ->method('setUserValue');
- $this->user->updateEmail();
- }
- public function testUpdateEmailNotConfigured(): void {
- $this->connection->expects($this->once())
- ->method('__get')
- ->with($this->equalTo('ldapEmailAttribute'))
- ->willReturn('');
- $this->access->expects($this->never())
- ->method('readAttribute');
- $this->config->expects($this->never())
- ->method('setUserValue');
- $this->user->updateEmail();
- }
- public function testUpdateQuotaAllProvided(): void {
- $this->connection->expects($this->exactly(2))
- ->method('__get')
- ->willReturnMap([
- ['ldapQuotaAttribute', 'myquota'],
- ['ldapQuotaDefault', '']
- ]);
- $this->access->expects($this->once())
- ->method('readAttribute')
- ->with($this->equalTo($this->dn),
- $this->equalTo('myquota'))
- ->willReturn(['42 GB']);
- $coreUser = $this->createMock(IUser::class);
- $coreUser->expects($this->once())
- ->method('setQuota')
- ->with('42 GB');
- $this->userManager->expects($this->atLeastOnce())
- ->method('get')
- ->with($this->uid)
- ->willReturn($coreUser);
- $this->user->updateQuota();
- }
- public function testUpdateQuotaToDefaultAllProvided(): void {
- $this->connection->expects($this->exactly(2))
- ->method('__get')
- ->willReturnMap([
- ['ldapQuotaAttribute', 'myquota'],
- ['ldapQuotaDefault', '']
- ]);
- $this->access->expects($this->once())
- ->method('readAttribute')
- ->with($this->equalTo($this->dn),
- $this->equalTo('myquota'))
- ->willReturn(['default']);
- $coreUser = $this->createMock(IUser::class);
- $coreUser->expects($this->once())
- ->method('setQuota')
- ->with('default');
- $this->userManager->expects($this->once())
- ->method('get')
- ->with($this->uid)
- ->willReturn($coreUser);
- $this->user->updateQuota();
- }
- public function testUpdateQuotaToNoneAllProvided(): void {
- $this->connection->expects($this->exactly(2))
- ->method('__get')
- ->willReturnMap([
- ['ldapQuotaAttribute', 'myquota'],
- ['ldapQuotaDefault', '']
- ]);
- $this->access->expects($this->once())
- ->method('readAttribute')
- ->with($this->equalTo($this->dn),
- $this->equalTo('myquota'))
- ->willReturn(['none']);
- $coreUser = $this->createMock(IUser::class);
- $coreUser->expects($this->once())
- ->method('setQuota')
- ->with('none');
- $this->userManager->expects($this->once())
- ->method('get')
- ->with($this->uid)
- ->willReturn($coreUser);
- $this->user->updateQuota();
- }
- public function testUpdateQuotaDefaultProvided(): void {
- $this->connection->expects($this->exactly(2))
- ->method('__get')
- ->willReturnMap([
- ['ldapQuotaAttribute', 'myquota'],
- ['ldapQuotaDefault', '25 GB'],
- ]);
- $this->access->expects($this->once())
- ->method('readAttribute')
- ->with($this->equalTo($this->dn),
- $this->equalTo('myquota'))
- ->willReturn(false);
- $coreUser = $this->createMock(IUser::class);
- $coreUser->expects($this->once())
- ->method('setQuota')
- ->with('25 GB');
- $this->userManager->expects($this->once())
- ->method('get')
- ->with($this->uid)
- ->willReturn($coreUser);
- $this->user->updateQuota();
- }
- public function testUpdateQuotaIndividualProvided(): void {
- $this->connection->expects($this->exactly(2))
- ->method('__get')
- ->willReturnMap([
- ['ldapQuotaAttribute', 'myquota'],
- ['ldapQuotaDefault', '']
- ]);
- $this->access->expects($this->once())
- ->method('readAttribute')
- ->with($this->equalTo($this->dn),
- $this->equalTo('myquota'))
- ->willReturn(['27 GB']);
- $coreUser = $this->createMock(IUser::class);
- $coreUser->expects($this->once())
- ->method('setQuota')
- ->with('27 GB');
- $this->userManager->expects($this->once())
- ->method('get')
- ->with($this->uid)
- ->willReturn($coreUser);
- $this->user->updateQuota();
- }
- public function testUpdateQuotaNoneProvided(): void {
- $this->connection->expects($this->exactly(2))
- ->method('__get')
- ->willReturnMap([
- ['ldapQuotaAttribute', 'myquota'],
- ['ldapQuotaDefault', '']
- ]);
- $this->access->expects($this->once())
- ->method('readAttribute')
- ->with($this->equalTo($this->dn),
- $this->equalTo('myquota'))
- ->willReturn(false);
- $coreUser = $this->createMock(IUser::class);
- $coreUser->expects($this->never())
- ->method('setQuota');
- $this->userManager->expects($this->never())
- ->method('get')
- ->with($this->uid);
- $this->config->expects($this->never())
- ->method('setUserValue');
- $this->user->updateQuota();
- }
- public function testUpdateQuotaNoneConfigured(): void {
- $this->connection->expects($this->exactly(2))
- ->method('__get')
- ->willReturnMap([
- ['ldapQuotaAttribute', ''],
- ['ldapQuotaDefault', '']
- ]);
- $coreUser = $this->createMock(IUser::class);
- $coreUser->expects($this->never())
- ->method('setQuota');
- $this->userManager->expects($this->never())
- ->method('get');
- $this->access->expects($this->never())
- ->method('readAttribute');
- $this->config->expects($this->never())
- ->method('setUserValue');
- $this->user->updateQuota();
- }
- public function testUpdateQuotaFromValue(): void {
- $readQuota = '19 GB';
- $this->connection->expects($this->exactly(2))
- ->method('__get')
- ->willReturnMap([
- ['ldapQuotaAttribute', 'myquota'],
- ['ldapQuotaDefault', '']
- ]);
- $this->access->expects($this->never())
- ->method('readAttribute');
- $user = $this->createMock(IUser::class);
- $user->expects($this->once())
- ->method('setQuota')
- ->with($readQuota);
- $this->userManager->expects($this->once())
- ->method('get')
- ->with($this->uid)
- ->willReturn($user);
- $this->user->updateQuota($readQuota);
- }
- /**
- * Unparseable quota will fallback to use the LDAP default
- */
- public function testUpdateWrongQuotaAllProvided(): void {
- $this->connection->expects($this->exactly(2))
- ->method('__get')
- ->willReturnMap([
- ['ldapQuotaAttribute', 'myquota'],
- ['ldapQuotaDefault', '23 GB']
- ]);
- $this->access->expects($this->once())
- ->method('readAttribute')
- ->with($this->equalTo($this->dn),
- $this->equalTo('myquota'))
- ->willReturn(['42 GBwos']);
- $coreUser = $this->createMock(IUser::class);
- $coreUser->expects($this->once())
- ->method('setQuota')
- ->with('23 GB');
- $this->userManager->expects($this->once())
- ->method('get')
- ->with($this->uid)
- ->willReturn($coreUser);
- $this->user->updateQuota();
- }
- /**
- * No user quota and wrong default will set 'default' as quota
- */
- public function testUpdateWrongDefaultQuotaProvided(): void {
- $this->connection->expects($this->exactly(2))
- ->method('__get')
- ->willReturnMap([
- ['ldapQuotaAttribute', 'myquota'],
- ['ldapQuotaDefault', '23 GBwowowo']
- ]);
- $this->access->expects($this->once())
- ->method('readAttribute')
- ->with($this->equalTo($this->dn),
- $this->equalTo('myquota'))
- ->willReturn(false);
- $coreUser = $this->createMock(IUser::class);
- $coreUser->expects($this->never())
- ->method('setQuota');
- $this->userManager->expects($this->never())
- ->method('get');
- $this->user->updateQuota();
- }
- /**
- * Wrong user quota and wrong default will set 'default' as quota
- */
- public function testUpdateWrongQuotaAndDefaultAllProvided(): void {
- $this->connection->expects($this->exactly(2))
- ->method('__get')
- ->willReturnMap([
- ['ldapQuotaAttribute', 'myquota'],
- ['ldapQuotaDefault', '23 GBwowowo']
- ]);
- $this->access->expects($this->once())
- ->method('readAttribute')
- ->with($this->equalTo($this->dn),
- $this->equalTo('myquota'))
- ->willReturn(['23 flush']);
- $coreUser = $this->createMock(IUser::class);
- $coreUser->expects($this->never())
- ->method('setQuota');
- $this->userManager->expects($this->never())
- ->method('get');
- $this->user->updateQuota();
- }
- /**
- * No quota attribute set and wrong default will set 'default' as quota
- */
- public function testUpdateWrongDefaultQuotaNotProvided(): void {
- $this->connection->expects($this->exactly(2))
- ->method('__get')
- ->willReturnMap([
- ['ldapQuotaAttribute', ''],
- ['ldapQuotaDefault', '23 GBwowowo']
- ]);
- $this->access->expects($this->never())
- ->method('readAttribute');
- $coreUser = $this->createMock(IUser::class);
- $coreUser->expects($this->never())
- ->method('setQuota');
- $this->userManager->expects($this->never())
- ->method('get');
- $this->user->updateQuota();
- }
- //the testUpdateAvatar series also implicitly tests getAvatarImage
- public function XtestUpdateAvatarJpegPhotoProvided() {
- $this->access->expects($this->once())
- ->method('readAttribute')
- ->with($this->equalTo($this->dn),
- $this->equalTo('jpegphoto'))
- ->willReturn(['this is a photo']);
- $this->image->expects($this->once())
- ->method('loadFromBase64')
- ->willReturn('imageResource');
- $this->image->expects($this->once())
- ->method('valid')
- ->willReturn(true);
- $this->image->expects($this->once())
- ->method('width')
- ->willReturn(128);
- $this->image->expects($this->once())
- ->method('height')
- ->willReturn(128);
- $this->image->expects($this->once())
- ->method('centerCrop')
- ->willReturn(true);
- $this->image->expects($this->once())
- ->method('data')
- ->willReturn('this is a photo');
- $this->config->expects($this->once())
- ->method('getUserValue')
- ->with($this->uid, 'user_ldap', 'lastAvatarChecksum', '')
- ->willReturn('');
- $this->config->expects($this->once())
- ->method('setUserValue')
- ->with($this->uid, 'user_ldap', 'lastAvatarChecksum', md5('this is a photo'));
- $this->filesystemhelper->expects($this->once())
- ->method('isLoaded')
- ->willReturn(true);
- $avatar = $this->createMock(IAvatar::class);
- $avatar->expects($this->once())
- ->method('set')
- ->with($this->isInstanceOf($this->image));
- $this->avatarManager->expects($this->once())
- ->method('getAvatar')
- ->with($this->equalTo($this->uid))
- ->willReturn($avatar);
- $this->connection->expects($this->any())
- ->method('resolveRule')
- ->with('avatar')
- ->willReturn(['jpegphoto', 'thumbnailphoto']);
- $this->user->updateAvatar();
- }
- public function testUpdateAvatarKnownJpegPhotoProvided(): void {
- $this->access->expects($this->once())
- ->method('readAttribute')
- ->with($this->equalTo($this->dn),
- $this->equalTo('jpegphoto'))
- ->willReturn(['this is a photo']);
- $this->image->expects($this->once())
- ->method('loadFromBase64')
- ->willReturn('imageResource');
- $this->image->expects($this->never())
- ->method('valid');
- $this->image->expects($this->never())
- ->method('width');
- $this->image->expects($this->never())
- ->method('height');
- $this->image->expects($this->never())
- ->method('centerCrop');
- $this->image->expects($this->once())
- ->method('data')
- ->willReturn('this is a photo');
- $this->config->expects($this->once())
- ->method('getUserValue')
- ->with($this->uid, 'user_ldap', 'lastAvatarChecksum', '')
- ->willReturn(md5('this is a photo'));
- $this->config->expects($this->never())
- ->method('setUserValue');
- $this->filesystemhelper->expects($this->never())
- ->method('isLoaded');
- $avatar = $this->createMock(IAvatar::class);
- $avatar->expects($this->never())
- ->method('set');
- $avatar->expects($this->any())
- ->method('exists')
- ->willReturn(true);
- $avatar->expects($this->any())
- ->method('isCustomAvatar')
- ->willReturn(true);
- $this->avatarManager->expects($this->any())
- ->method('getAvatar')
- ->with($this->uid)
- ->willReturn($avatar);
- $this->connection->expects($this->any())
- ->method('resolveRule')
- ->with('avatar')
- ->willReturn(['jpegphoto', 'thumbnailphoto']);
- $this->assertTrue($this->user->updateAvatar());
- }
- public function XtestUpdateAvatarThumbnailPhotoProvided() {
- $this->access->expects($this->any())
- ->method('readAttribute')
- ->willReturnCallback(function ($dn, $attr) {
- if ($dn === $this->dn
- && $attr === 'jpegphoto') {
- return false;
- } elseif ($dn === $this->dn
- && $attr === 'thumbnailphoto') {
- return ['this is a photo'];
- }
- return null;
- });
- $this->image->expects($this->once())
- ->method('loadFromBase64')
- ->willReturn('imageResource');
- $this->image->expects($this->once())
- ->method('valid')
- ->willReturn(true);
- $this->image->expects($this->once())
- ->method('width')
- ->willReturn(128);
- $this->image->expects($this->once())
- ->method('height')
- ->willReturn(128);
- $this->image->expects($this->once())
- ->method('centerCrop')
- ->willReturn(true);
- $this->image->expects($this->once())
- ->method('data')
- ->willReturn('this is a photo');
- $this->config->expects($this->once())
- ->method('getUserValue')
- ->with($this->uid, 'user_ldap', 'lastAvatarChecksum', '')
- ->willReturn('');
- $this->config->expects($this->once())
- ->method('setUserValue')
- ->with($this->uid, 'user_ldap', 'lastAvatarChecksum', md5('this is a photo'));
- $this->filesystemhelper->expects($this->once())
- ->method('isLoaded')
- ->willReturn(true);
- $avatar = $this->createMock(IAvatar::class);
- $avatar->expects($this->once())
- ->method('set')
- ->with($this->isInstanceOf($this->image));
- $this->avatarManager->expects($this->once())
- ->method('getAvatar')
- ->with($this->equalTo($this->uid))
- ->willReturn($avatar);
- $this->connection->expects($this->any())
- ->method('resolveRule')
- ->with('avatar')
- ->willReturn(['jpegphoto', 'thumbnailphoto']);
- $this->user->updateAvatar();
- }
- public function testUpdateAvatarCorruptPhotoProvided(): void {
- $this->access->expects($this->any())
- ->method('readAttribute')
- ->willReturnCallback(function ($dn, $attr) {
- if ($dn === $this->dn
- && $attr === 'jpegphoto') {
- return false;
- } elseif ($dn === $this->dn
- && $attr === 'thumbnailphoto') {
- return ['this is a photo'];
- }
- return null;
- });
- $this->image->expects($this->once())
- ->method('loadFromBase64')
- ->willReturn(false);
- $this->image->expects($this->never())
- ->method('valid');
- $this->image->expects($this->never())
- ->method('width');
- $this->image->expects($this->never())
- ->method('height');
- $this->image->expects($this->never())
- ->method('centerCrop');
- $this->image->expects($this->never())
- ->method('data');
- $this->config->expects($this->never())
- ->method('getUserValue');
- $this->config->expects($this->never())
- ->method('setUserValue');
- $this->filesystemhelper->expects($this->never())
- ->method('isLoaded');
- $avatar = $this->createMock(IAvatar::class);
- $avatar->expects($this->never())
- ->method('set');
- $this->avatarManager->expects($this->never())
- ->method('getAvatar');
- $this->connection->expects($this->any())
- ->method('resolveRule')
- ->with('avatar')
- ->willReturn(['jpegphoto', 'thumbnailphoto']);
- $this->user->updateAvatar();
- }
- public function XtestUpdateAvatarUnsupportedThumbnailPhotoProvided() {
- $this->access->expects($this->any())
- ->method('readAttribute')
- ->willReturnCallback(function ($dn, $attr) {
- if ($dn === $this->dn
- && $attr === 'jpegphoto') {
- return false;
- } elseif ($dn === $this->dn
- && $attr === 'thumbnailphoto') {
- return ['this is a photo'];
- }
- return null;
- });
- $this->image->expects($this->once())
- ->method('loadFromBase64')
- ->willReturn('imageResource');
- $this->image->expects($this->once())
- ->method('valid')
- ->willReturn(true);
- $this->image->expects($this->once())
- ->method('width')
- ->willReturn(128);
- $this->image->expects($this->once())
- ->method('height')
- ->willReturn(128);
- $this->image->expects($this->once())
- ->method('centerCrop')
- ->willReturn(true);
- $this->image->expects($this->once())
- ->method('data')
- ->willReturn('this is a photo');
- $this->config->expects($this->once())
- ->method('getUserValue')
- ->with($this->uid, 'user_ldap', 'lastAvatarChecksum', '')
- ->willReturn('');
- $this->config->expects($this->never())
- ->method('setUserValue');
- $this->filesystemhelper->expects($this->once())
- ->method('isLoaded')
- ->willReturn(true);
- $avatar = $this->createMock(IAvatar::class);
- $avatar->expects($this->once())
- ->method('set')
- ->with($this->isInstanceOf($this->image))
- ->willThrowException(new \Exception());
- $this->avatarManager->expects($this->once())
- ->method('getAvatar')
- ->with($this->equalTo($this->uid))
- ->willReturn($avatar);
- $this->connection->expects($this->any())
- ->method('resolveRule')
- ->with('avatar')
- ->willReturn(['jpegphoto', 'thumbnailphoto']);
- $this->assertFalse($this->user->updateAvatar());
- }
- public function testUpdateAvatarNotProvided(): void {
- $this->access->expects($this->any())
- ->method('readAttribute')
- ->willReturnCallback(function ($dn, $attr) {
- if ($dn === $this->dn
- && $attr === 'jpegPhoto') {
- return false;
- } elseif ($dn === $this->dn
- && $attr === 'thumbnailPhoto') {
- return false;
- }
- return null;
- });
- $this->image->expects($this->never())
- ->method('valid');
- $this->image->expects($this->never())
- ->method('width');
- $this->image->expects($this->never())
- ->method('height');
- $this->image->expects($this->never())
- ->method('centerCrop');
- $this->image->expects($this->never())
- ->method('data');
- $this->config->expects($this->never())
- ->method('getUserValue');
- $this->config->expects($this->never())
- ->method('setUserValue');
- $this->filesystemhelper->expects($this->never())
- ->method('isLoaded');
- $this->avatarManager->expects($this->never())
- ->method('getAvatar');
- $this->connection->expects($this->any())
- ->method('resolveRule')
- ->with('avatar')
- ->willReturn(['jpegphoto', 'thumbnailphoto']);
- $this->user->updateAvatar();
- }
- public function extStorageHomeDataProvider() {
- return [
- [ 'myFolder', null ],
- [ '', null, false ],
- [ 'myFolder', 'myFolder' ],
- ];
- }
- /**
- * @dataProvider extStorageHomeDataProvider
- */
- public function testUpdateExtStorageHome(string $expected, ?string $valueFromLDAP = null, bool $isSet = true): void {
- if ($valueFromLDAP === null) {
- $this->connection->expects($this->once())
- ->method('__get')
- ->willReturnMap([
- ['ldapExtStorageHomeAttribute', 'homeDirectory'],
- ]);
- $return = [];
- if ($isSet) {
- $return[] = $expected;
- }
- $this->access->expects($this->once())
- ->method('readAttribute')
- ->with($this->dn, 'homeDirectory')
- ->willReturn($return);
- }
- if ($expected !== '') {
- $this->config->expects($this->once())
- ->method('setUserValue')
- ->with($this->uid, 'user_ldap', 'extStorageHome', $expected);
- } else {
- $this->config->expects($this->once())
- ->method('deleteUserValue')
- ->with($this->uid, 'user_ldap', 'extStorageHome');
- }
- $actual = $this->user->updateExtStorageHome($valueFromLDAP);
- $this->assertSame($expected, $actual);
- }
- public function testMarkLogin(): void {
- $this->config->expects($this->once())
- ->method('setUserValue')
- ->with($this->equalTo($this->uid),
- $this->equalTo('user_ldap'),
- $this->equalTo(User::USER_PREFKEY_FIRSTLOGIN),
- $this->equalTo(1))
- ->willReturn(true);
- $this->user->markLogin();
- }
- public function testGetAvatarImageProvided(): void {
- $this->access->expects($this->once())
- ->method('readAttribute')
- ->with($this->equalTo($this->dn),
- $this->equalTo('jpegphoto'))
- ->willReturn(['this is a photo']);
- $this->connection->expects($this->any())
- ->method('resolveRule')
- ->with('avatar')
- ->willReturn(['jpegphoto', 'thumbnailphoto']);
- $photo = $this->user->getAvatarImage();
- $this->assertSame('this is a photo', $photo);
- //make sure readAttribute is not called again but the already fetched
- //photo is returned
- $this->user->getAvatarImage();
- }
- public function testGetAvatarImageDisabled(): void {
- $this->access->expects($this->never())
- ->method('readAttribute')
- ->with($this->equalTo($this->dn), $this->anything());
- $this->connection->expects($this->any())
- ->method('resolveRule')
- ->with('avatar')
- ->willReturn([]);
- $this->assertFalse($this->user->getAvatarImage());
- }
- public function imageDataProvider() {
- return [
- [ false, false ],
- [ 'corruptData', false ],
- [ 'validData', true ],
- ];
- }
- public function testProcessAttributes(): void {
- $requiredMethods = [
- 'updateQuota',
- 'updateEmail',
- 'composeAndStoreDisplayName',
- 'storeLDAPUserName',
- 'getHomePath',
- 'updateAvatar',
- 'updateExtStorageHome',
- ];
- /** @var User|\PHPUnit\Framework\MockObject\MockObject $userMock */
- $userMock = $this->getMockBuilder(User::class)
- ->setConstructorArgs([
- $this->uid,
- $this->dn,
- $this->access,
- $this->config,
- $this->filesystemhelper,
- $this->image,
- $this->logger,
- $this->avatarManager,
- $this->userManager,
- $this->notificationManager
- ])
- ->setMethods($requiredMethods)
- ->getMock();
- $this->connection->setConfiguration([
- 'homeFolderNamingRule' => 'homeDirectory'
- ]);
- $this->connection->expects($this->any())
- ->method('__get')
- ->willReturnCallback(function ($name) {
- if ($name === 'homeFolderNamingRule') {
- return 'attr:homeDirectory';
- }
- return $name;
- });
- $this->connection->expects($this->any())
- ->method('resolveRule')
- ->with('avatar')
- ->willReturn(['jpegphoto', 'thumbnailphoto']);
- $record = [
- strtolower($this->connection->ldapQuotaAttribute) => ['4096'],
- strtolower($this->connection->ldapEmailAttribute) => ['alice@wonderland.org'],
- strtolower($this->connection->ldapUserDisplayName) => ['Aaaaalice'],
- strtolower($this->connection->ldapExtStorageHomeAttribute) => ['homeDirectory'],
- 'uid' => [$this->uid],
- 'homedirectory' => ['Alice\'s Folder'],
- 'memberof' => ['cn=groupOne', 'cn=groupTwo'],
- 'jpegphoto' => ['here be an image']
- ];
- foreach ($requiredMethods as $method) {
- $userMock->expects($this->once())
- ->method($method);
- }
- \OC_Hook::clear();//disconnect irrelevant hooks
- $userMock->processAttributes($record);
- /** @noinspection PhpUnhandledExceptionInspection */
- \OC_Hook::emit('OC_User', 'post_login', ['uid' => $this->uid]);
- }
- public function emptyHomeFolderAttributeValueProvider() {
- return [
- 'empty' => [''],
- 'prefixOnly' => ['attr:'],
- ];
- }
- /**
- * @dataProvider emptyHomeFolderAttributeValueProvider
- */
- public function testGetHomePathNotConfigured($attributeValue): void {
- $this->connection->expects($this->any())
- ->method('__get')
- ->with($this->equalTo('homeFolderNamingRule'))
- ->willReturn($attributeValue);
- $this->access->expects($this->never())
- ->method('readAttribute');
- $this->config->expects($this->never())
- ->method('getAppValue');
- /** @noinspection PhpUnhandledExceptionInspection */
- $this->assertFalse($this->user->getHomePath());
- }
- public function testGetHomePathConfiguredNotAvailableAllowed(): void {
- $this->connection->expects($this->any())
- ->method('__get')
- ->with($this->equalTo('homeFolderNamingRule'))
- ->willReturn('attr:foobar');
- $this->access->expects($this->once())
- ->method('readAttribute')
- ->willReturn(false);
- $this->access->expects($this->once())
- ->method('username2dn')
- ->willReturn($this->dn);
- // asks for "enforce_home_folder_naming_rule"
- $this->config->expects($this->once())
- ->method('getAppValue')
- ->willReturn(false);
- /** @noinspection PhpUnhandledExceptionInspection */
- $this->assertFalse($this->user->getHomePath());
- }
- public function testGetHomePathConfiguredNotAvailableNotAllowed(): void {
- $this->expectException(\Exception::class);
- $this->connection->expects($this->any())
- ->method('__get')
- ->with($this->equalTo('homeFolderNamingRule'))
- ->willReturn('attr:foobar');
- $this->access->expects($this->once())
- ->method('readAttribute')
- ->willReturn(false);
- $this->access->expects($this->once())
- ->method('username2dn')
- ->willReturn($this->dn);
- // asks for "enforce_home_folder_naming_rule"
- $this->config->expects($this->once())
- ->method('getAppValue')
- ->willReturn(true);
- $this->user->getHomePath();
- }
- public function displayNameProvider() {
- return [
- ['Roland Deschain', '', 'Roland Deschain', false],
- ['Roland Deschain', '', 'Roland Deschain', true],
- ['Roland Deschain', null, 'Roland Deschain', false],
- ['Roland Deschain', 'gunslinger@darktower.com', 'Roland Deschain (gunslinger@darktower.com)', false],
- ['Roland Deschain', 'gunslinger@darktower.com', 'Roland Deschain (gunslinger@darktower.com)', true],
- ];
- }
- /**
- * @dataProvider displayNameProvider
- */
- public function testComposeAndStoreDisplayName($part1, $part2, $expected, $expectTriggerChange): void {
- $this->config->expects($this->once())
- ->method('setUserValue');
- $oldName = $expectTriggerChange ? 'xxGunslingerxx' : null;
- $this->config->expects($this->once())
- ->method('getUserValue')
- ->with($this->user->getUsername(), 'user_ldap', 'displayName', null)
- ->willReturn($oldName);
- $ncUserObj = $this->createMock(\OC\User\User::class);
- if ($expectTriggerChange) {
- $ncUserObj->expects($this->once())
- ->method('triggerChange')
- ->with('displayName', $expected);
- } else {
- $ncUserObj->expects($this->never())
- ->method('triggerChange');
- }
- $this->userManager->expects($this->once())
- ->method('get')
- ->willReturn($ncUserObj);
- $displayName = $this->user->composeAndStoreDisplayName($part1, $part2);
- $this->assertSame($expected, $displayName);
- }
- public function testComposeAndStoreDisplayNameNoOverwrite(): void {
- $displayName = 'Randall Flagg';
- $this->config->expects($this->never())
- ->method('setUserValue');
- $this->config->expects($this->once())
- ->method('getUserValue')
- ->willReturn($displayName);
- $this->userManager->expects($this->never())
- ->method('get'); // Implicit: no triggerChange can be called
- $composedDisplayName = $this->user->composeAndStoreDisplayName($displayName);
- $this->assertSame($composedDisplayName, $displayName);
- }
- public function testHandlePasswordExpiryWarningDefaultPolicy(): void {
- $this->connection->expects($this->any())
- ->method('__get')
- ->willReturnCallback(function ($name) {
- if ($name === 'ldapDefaultPPolicyDN') {
- return 'cn=default,ou=policies,dc=foo,dc=bar';
- }
- if ($name === 'turnOnPasswordChange') {
- return '1';
- }
- return $name;
- });
- $this->access->expects($this->any())
- ->method('search')
- ->willReturnCallback(function ($filter, $base) {
- if ($base === $this->dn) {
- return [
- [
- 'pwdchangedtime' => [(new \DateTime())->sub(new \DateInterval('P28D'))->format('Ymdhis') . 'Z'],
- 'pwdgraceusetime' => [],
- ],
- ];
- }
- if ($base === 'cn=default,ou=policies,dc=foo,dc=bar') {
- return [
- [
- 'pwdmaxage' => ['2592000'],
- 'pwdexpirewarning' => ['2591999'],
- ],
- ];
- }
- return [];
- });
- $notification = $this->getMockBuilder(INotification::class)
- ->disableOriginalConstructor()
- ->getMock();
- $notification->expects($this->any())
- ->method('setApp')
- ->willReturn($notification);
- $notification->expects($this->any())
- ->method('setUser')
- ->willReturn($notification);
- $notification->expects($this->any())
- ->method('setObject')
- ->willReturn($notification);
- $notification->expects($this->any())
- ->method('setDateTime')
- ->willReturn($notification);
- $this->notificationManager->expects($this->exactly(2))
- ->method('createNotification')
- ->willReturn($notification);
- $this->notificationManager->expects($this->exactly(1))
- ->method('notify');
- \OC_Hook::clear();//disconnect irrelevant hooks
- \OCP\Util::connectHook('OC_User', 'post_login', $this->user, 'handlePasswordExpiry');
- /** @noinspection PhpUnhandledExceptionInspection */
- \OC_Hook::emit('OC_User', 'post_login', ['uid' => $this->uid]);
- }
- public function testHandlePasswordExpiryWarningCustomPolicy(): void {
- $this->connection->expects($this->any())
- ->method('__get')
- ->willReturnCallback(function ($name) {
- if ($name === 'ldapDefaultPPolicyDN') {
- return 'cn=default,ou=policies,dc=foo,dc=bar';
- }
- if ($name === 'turnOnPasswordChange') {
- return '1';
- }
- return $name;
- });
- $this->access->expects($this->any())
- ->method('search')
- ->willReturnCallback(function ($filter, $base) {
- if ($base === $this->dn) {
- return [
- [
- 'pwdpolicysubentry' => ['cn=custom,ou=policies,dc=foo,dc=bar'],
- 'pwdchangedtime' => [(new \DateTime())->sub(new \DateInterval('P28D'))->format('Ymdhis') . 'Z'],
- 'pwdgraceusetime' => [],
- ]
- ];
- }
- if ($base === 'cn=custom,ou=policies,dc=foo,dc=bar') {
- return [
- [
- 'pwdmaxage' => ['2592000'],
- 'pwdexpirewarning' => ['2591999'],
- ]
- ];
- }
- return [];
- });
- $notification = $this->getMockBuilder(INotification::class)
- ->disableOriginalConstructor()
- ->getMock();
- $notification->expects($this->any())
- ->method('setApp')
- ->willReturn($notification);
- $notification->expects($this->any())
- ->method('setUser')
- ->willReturn($notification);
- $notification->expects($this->any())
- ->method('setObject')
- ->willReturn($notification);
- $notification->expects($this->any())
- ->method('setDateTime')
- ->willReturn($notification);
- $this->notificationManager->expects($this->exactly(2))
- ->method('createNotification')
- ->willReturn($notification);
- $this->notificationManager->expects($this->exactly(1))
- ->method('notify');
- \OC_Hook::clear();//disconnect irrelevant hooks
- \OCP\Util::connectHook('OC_User', 'post_login', $this->user, 'handlePasswordExpiry');
- /** @noinspection PhpUnhandledExceptionInspection */
- \OC_Hook::emit('OC_User', 'post_login', ['uid' => $this->uid]);
- }
- }
|