123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221 |
- <?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 OCP\Util;
- 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
- 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
- Util::connectHook('OC_User', 'post_login', $this->user, 'handlePasswordExpiry');
- /** @noinspection PhpUnhandledExceptionInspection */
- \OC_Hook::emit('OC_User', 'post_login', ['uid' => $this->uid]);
- }
- }
|