123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941 |
- <?php
- /**
- * SPDX-FileCopyrightText: 2016 Nextcloud GmbH and Nextcloud contributors
- * SPDX-License-Identifier: AGPL-3.0-or-later
- */
- namespace OCA\ShareByMail\Tests;
- use DateTime;
- use OC\Mail\Message;
- use OCA\ShareByMail\Settings\SettingsManager;
- use OCA\ShareByMail\ShareByMailProvider;
- use OCP\Activity\IManager as IActivityManager;
- use OCP\Defaults;
- use OCP\EventDispatcher\IEventDispatcher;
- use OCP\Files\File;
- use OCP\Files\IRootFolder;
- use OCP\Files\Node;
- use OCP\IConfig;
- use OCP\IDBConnection;
- use OCP\IL10N;
- use OCP\IURLGenerator;
- use OCP\IUser;
- use OCP\IUserManager;
- use OCP\Mail\IEMailTemplate;
- use OCP\Mail\IMailer;
- use OCP\Mail\IMessage;
- use OCP\Security\Events\GenerateSecurePasswordEvent;
- use OCP\Security\IHasher;
- use OCP\Security\ISecureRandom;
- use OCP\Security\PasswordContext;
- use OCP\Share\IAttributes;
- use OCP\Share\IManager;
- use OCP\Share\IShare;
- use PHPUnit\Framework\MockObject\MockObject;
- use Psr\Log\LoggerInterface;
- use Test\TestCase;
- /**
- * Class ShareByMailProviderTest
- *
- * @package OCA\ShareByMail\Tests
- * @group DB
- */
- class ShareByMailProviderTest extends TestCase {
-
- private IDBConnection $connection;
- private IL10N&MockObject $l;
- private IShare&MockObject $share;
- private IConfig&MockObject $config;
- private IMailer&MockObject $mailer;
- private IHasher&MockObject $hasher;
- private Defaults&MockObject $defaults;
- private IManager&MockObject $shareManager;
- private LoggerInterface&MockObject $logger;
- private IRootFolder&MockObject $rootFolder;
- private IUserManager&MockObject $userManager;
- private ISecureRandom&MockObject $secureRandom;
- private IURLGenerator&MockObject $urlGenerator;
- private SettingsManager&MockObject $settingsManager;
- private IActivityManager&MockObject $activityManager;
- private IEventDispatcher&MockObject $eventDispatcher;
- protected function setUp(): void {
- parent::setUp();
- $this->connection = \OCP\Server::get(IDBConnection::class);
- $this->l = $this->getMockBuilder(IL10N::class)->getMock();
- $this->l->method('t')
- ->willReturnCallback(function ($text, $parameters = []) {
- return vsprintf($text, $parameters);
- });
- $this->config = $this->getMockBuilder(IConfig::class)->getMock();
- $this->logger = $this->getMockBuilder(LoggerInterface::class)->getMock();
- $this->rootFolder = $this->getMockBuilder('OCP\Files\IRootFolder')->getMock();
- $this->userManager = $this->getMockBuilder(IUserManager::class)->getMock();
- $this->secureRandom = $this->getMockBuilder('\OCP\Security\ISecureRandom')->getMock();
- $this->mailer = $this->getMockBuilder('\OCP\Mail\IMailer')->getMock();
- $this->urlGenerator = $this->getMockBuilder(IURLGenerator::class)->getMock();
- $this->share = $this->getMockBuilder(IShare::class)->getMock();
- $this->activityManager = $this->getMockBuilder('OCP\Activity\IManager')->getMock();
- $this->settingsManager = $this->getMockBuilder(SettingsManager::class)->disableOriginalConstructor()->getMock();
- $this->defaults = $this->createMock(Defaults::class);
- $this->hasher = $this->getMockBuilder(IHasher::class)->getMock();
- $this->eventDispatcher = $this->getMockBuilder(IEventDispatcher::class)->getMock();
- $this->shareManager = $this->getMockBuilder(IManager::class)->getMock();
- $this->userManager->expects($this->any())->method('userExists')->willReturn(true);
- $this->config->expects($this->any())->method('getAppValue')->with('core', 'enforce_strict_email_check')->willReturn('yes');
- }
- /**
- * get instance of Mocked ShareByMailProvider
- *
- * @param array $mockedMethods internal methods which should be mocked
- * @return \PHPUnit\Framework\MockObject\MockObject | ShareByMailProvider
- */
- private function getInstance(array $mockedMethods = []) {
- if (!empty($mockedMethods)) {
- return $this->getMockBuilder('OCA\ShareByMail\ShareByMailProvider')
- ->setConstructorArgs([
- $this->config,
- $this->connection,
- $this->secureRandom,
- $this->userManager,
- $this->rootFolder,
- $this->l,
- $this->logger,
- $this->mailer,
- $this->urlGenerator,
- $this->activityManager,
- $this->settingsManager,
- $this->defaults,
- $this->hasher,
- $this->eventDispatcher,
- $this->shareManager
- ])
- ->setMethods($mockedMethods)
- ->getMock();
- }
- return new ShareByMailProvider(
- $this->config,
- $this->connection,
- $this->secureRandom,
- $this->userManager,
- $this->rootFolder,
- $this->l,
- $this->logger,
- $this->mailer,
- $this->urlGenerator,
- $this->activityManager,
- $this->settingsManager,
- $this->defaults,
- $this->hasher,
- $this->eventDispatcher,
- $this->shareManager
- );
- }
- protected function tearDown(): void {
- $this->connection
- ->getQueryBuilder()
- ->delete('share')
- ->executeStatement();
- parent::tearDown();
- }
- public function testCreate(): void {
- $expectedShare = $this->createMock(IShare::class);
- $share = $this->getMockBuilder(IShare::class)->getMock();
- $share->expects($this->any())->method('getSharedWith')->willReturn('user1');
- $node = $this->getMockBuilder(File::class)->getMock();
- $node->expects($this->any())->method('getName')->willReturn('filename');
- $instance = $this->getInstance(['getSharedWith', 'createMailShare', 'getRawShare', 'createShareObject', 'createShareActivity', 'sendEmail', 'sendPassword']);
- $instance->expects($this->once())->method('getSharedWith')->willReturn([]);
- $instance->expects($this->once())->method('createMailShare')->with($share)->willReturn(42);
- $instance->expects($this->once())->method('createShareActivity')->with($share);
- $instance->expects($this->once())->method('getRawShare')->with(42)->willReturn(['rawShare']);
- $instance->expects($this->once())->method('createShareObject')->with(['rawShare'])->willReturn($expectedShare);
- $share->expects($this->any())->method('getNode')->willReturn($node);
- // As share api link password is not enforced, the password will not be generated.
- $this->shareManager->expects($this->once())->method('shareApiLinkEnforcePassword')->willReturn(false);
- $this->settingsManager->expects($this->never())->method('sendPasswordByMail');
- // Mail notification is triggered by the share manager.
- $instance->expects($this->never())->method('sendEmail');
- $instance->expects($this->never())->method('sendPassword');
- $this->assertSame($expectedShare, $instance->create($share));
- }
- public function testCreateSendPasswordByMailWithoutEnforcedPasswordProtection(): void {
- $expectedShare = $this->createMock(IShare::class);
- $node = $this->getMockBuilder(File::class)->getMock();
- $node->expects($this->any())->method('getName')->willReturn('filename');
- $share = $this->getMockBuilder(IShare::class)->getMock();
- $share->expects($this->any())->method('getSharedWith')->willReturn('receiver@examplelölöl.com');
- $share->expects($this->any())->method('getSendPasswordByTalk')->willReturn(false);
- $share->expects($this->any())->method('getSharedBy')->willReturn('owner');
- $share->expects($this->any())->method('getNode')->willReturn($node);
- $share->expects($this->any())->method('getId')->willReturn(42);
- $share->expects($this->any())->method('getNote')->willReturn('');
- $share->expects($this->any())->method('getToken')->willReturn('token');
- // Assume the mail address is valid.
- $this->mailer->expects($this->any())->method('validateMailAddress')->willReturn(true);
- $instance = $this->getInstance(['getSharedWith', 'createMailShare', 'getRawShare', 'createShareObject', 'createShareActivity', 'autoGeneratePassword', 'createPasswordSendActivity', 'sendEmail', 'sendPassword', 'sendPasswordToOwner']);
- $instance->expects($this->once())->method('getSharedWith')->willReturn([]);
- $instance->expects($this->once())->method('createMailShare')->with($share)->willReturn(42);
- $instance->expects($this->once())->method('createShareActivity')->with($share);
- $instance->expects($this->once())->method('getRawShare')->with(42)->willReturn(['rawShare']);
- $instance->expects($this->once())->method('createShareObject')->with(['rawShare'])->willReturn($expectedShare);
- $share->expects($this->any())->method('getNode')->willReturn($node);
- // The autogenerated password should not be mailed.
- $this->shareManager->expects($this->any())->method('shareApiLinkEnforcePassword')->willReturn(false);
- $this->settingsManager->expects($this->any())->method('sendPasswordByMail')->willReturn(true);
- $instance->expects($this->never())->method('autoGeneratePassword');
- // No password is set and no password sent via talk is requested
- $instance->expects($this->once())->method('sendEmail')->with($share, ['receiver@examplelölöl.com']);
- $instance->expects($this->never())->method('sendPassword');
- $instance->expects($this->never())->method('sendPasswordToOwner');
- // The manager sends the mail notification.
- // For the sake of testing simplicity, we will handle it ourselves.
- $this->assertSame($expectedShare, $instance->create($share));
- $instance->sendMailNotification($share);
- }
- public function testCreateSendPasswordByMailWithPasswordAndWithoutEnforcedPasswordProtectionWithPermanentPassword(): void {
- $expectedShare = $this->createMock(IShare::class);
- $node = $this->getMockBuilder(File::class)->getMock();
- $node->expects($this->any())->method('getName')->willReturn('filename');
- $share = $this->getMockBuilder(IShare::class)->getMock();
- $share->expects($this->any())->method('getSharedWith')->willReturn('receiver@example.com');
- $share->expects($this->any())->method('getSendPasswordByTalk')->willReturn(false);
- $share->expects($this->any())->method('getSharedBy')->willReturn('owner');
- $share->expects($this->any())->method('getNode')->willReturn($node);
- $share->expects($this->any())->method('getId')->willReturn(42);
- $share->expects($this->any())->method('getNote')->willReturn('');
- $share->expects($this->any())->method('getToken')->willReturn('token');
- // Assume the mail address is valid.
- $this->mailer->expects($this->any())->method('validateMailAddress')->willReturn(true);
- $instance = $this->getInstance(['getSharedWith', 'createMailShare', 'getRawShare', 'createShareObject', 'createShareActivity', 'autoGeneratePassword', 'createPasswordSendActivity', 'sendEmail', 'sendPassword', 'sendPasswordToOwner']);
- $instance->expects($this->once())->method('getSharedWith')->willReturn([]);
- $instance->expects($this->once())->method('createMailShare')->with($share)->willReturn(42);
- $instance->expects($this->once())->method('createShareActivity')->with($share);
- $instance->expects($this->once())->method('getRawShare')->with(42)->willReturn(['rawShare', 'password' => 'password']);
- $instance->expects($this->once())->method('createShareObject')->with(['rawShare', 'password' => 'password'])->willReturn($expectedShare);
- $share->expects($this->any())->method('getNode')->willReturn($node);
- $share->expects($this->any())->method('getPassword')->willReturn('password');
- $this->hasher->expects($this->once())->method('hash')->with('password')->willReturn('passwordHashed');
- $share->expects($this->once())->method('setPassword')->with('passwordHashed');
- // The given password (but not the autogenerated password) should not be
- // mailed to the receiver of the share because permanent passwords are not enforced.
- $this->shareManager->expects($this->any())->method('shareApiLinkEnforcePassword')->willReturn(false);
- $this->config->expects($this->once())->method('getSystemValue')->with('sharing.enable_mail_link_password_expiration')->willReturn(false);
- $instance->expects($this->never())->method('autoGeneratePassword');
- // A password is set but no password sent via talk has been requested
- $instance->expects($this->once())->method('sendEmail')->with($share, ['receiver@example.com']);
- $instance->expects($this->once())->method('sendPassword')->with($share, 'password');
- $instance->expects($this->never())->method('sendPasswordToOwner');
- $this->assertSame($expectedShare, $instance->create($share));
- $instance->sendMailNotification($share);
- }
- public function testCreateSendPasswordByMailWithPasswordAndWithoutEnforcedPasswordProtectionWithoutPermanentPassword(): void {
- $expectedShare = $this->createMock(IShare::class);
- $node = $this->getMockBuilder(File::class)->getMock();
- $node->expects($this->any())->method('getName')->willReturn('filename');
- $share = $this->getMockBuilder(IShare::class)->getMock();
- $share->expects($this->any())->method('getSharedWith')->willReturn('receiver@example.com');
- $share->expects($this->any())->method('getSendPasswordByTalk')->willReturn(false);
- $share->expects($this->any())->method('getSharedBy')->willReturn('owner');
- $share->expects($this->any())->method('getNode')->willReturn($node);
- $share->expects($this->any())->method('getId')->willReturn(42);
- $share->expects($this->any())->method('getNote')->willReturn('');
- $share->expects($this->any())->method('getToken')->willReturn('token');
- // Assume the mail address is valid.
- $this->mailer->expects($this->any())->method('validateMailAddress')->willReturn(true);
- $instance = $this->getInstance([
- 'getSharedWith', 'createMailShare', 'getRawShare', 'createShareObject',
- 'createShareActivity', 'autoGeneratePassword', 'createPasswordSendActivity',
- 'sendEmail', 'sendPassword', 'sendPasswordToOwner',
- ]);
- $instance->expects($this->once())->method('getSharedWith')->willReturn([]);
- $instance->expects($this->once())->method('createMailShare')->with($share)->willReturn(42);
- $instance->expects($this->once())->method('createShareActivity')->with($share);
- $instance->expects($this->once())->method('getRawShare')->with(42)->willReturn(['rawShare', 'password' => 'password']);
- $instance->expects($this->once())->method('createShareObject')->with(['rawShare', 'password' => 'password'])->willReturn($expectedShare);
- $share->expects($this->any())->method('getNode')->willReturn($node);
- $share->expects($this->any())->method('getPassword')->willReturn('password');
- $this->hasher->expects($this->once())->method('hash')->with('password')->willReturn('passwordHashed');
- $share->expects($this->once())->method('setPassword')->with('passwordHashed');
- // No password is generated, so no emails need to be sent
- // aside from the main email notification.
- $this->shareManager->expects($this->any())->method('shareApiLinkEnforcePassword')->willReturn(false);
- $instance->expects($this->never())->method('autoGeneratePassword');
- $this->config->expects($this->once())->method('getSystemValue')
- ->with('sharing.enable_mail_link_password_expiration')
- ->willReturn(true);
- // No password has been set and no password sent via talk has been requested,
- // but password has been enforced for the whole instance and will be generated.
- $instance->expects($this->once())->method('sendEmail')->with($share, ['receiver@example.com']);
- $instance->expects($this->never())->method('sendPassword');
- $instance->expects($this->never())->method('sendPasswordToOwner');
- $this->assertSame($expectedShare, $instance->create($share));
- $instance->sendMailNotification($share);
- }
- public function testCreateSendPasswordByMailWithEnforcedPasswordProtectionWithPermanentPassword(): void {
- $expectedShare = $this->createMock(IShare::class);
- $node = $this->getMockBuilder(File::class)->getMock();
- $node->expects($this->any())->method('getName')->willReturn('filename');
- $share = $this->getMockBuilder(IShare::class)->getMock();
- $share->expects($this->any())->method('getSharedWith')->willReturn('receiver@example.com');
- $share->expects($this->any())->method('getSendPasswordByTalk')->willReturn(false);
- $share->expects($this->any())->method('getSharedBy')->willReturn('owner');
- $share->expects($this->any())->method('getNode')->willReturn($node);
- $share->expects($this->any())->method('getId')->willReturn(42);
- $share->expects($this->any())->method('getNote')->willReturn('');
- $share->expects($this->any())->method('getToken')->willReturn('token');
- $this->urlGenerator->expects($this->once())->method('linkToRouteAbsolute')
- ->with('files_sharing.sharecontroller.showShare', ['token' => 'token'])
- ->willReturn('https://example.com/file.txt');
- $this->secureRandom->expects($this->once())
- ->method('generate')
- ->with(8, ISecureRandom::CHAR_HUMAN_READABLE)
- ->willReturn('autogeneratedPassword');
- $this->eventDispatcher->expects($this->once())
- ->method('dispatchTyped')
- ->with(new GenerateSecurePasswordEvent(PasswordContext::SHARING));
- // Assume the mail address is valid.
- $this->mailer->expects($this->any())->method('validateMailAddress')->willReturn(true);
- $instance = $this->getInstance(['getSharedWith', 'createMailShare', 'getRawShare', 'createShareObject', 'createShareActivity', 'createPasswordSendActivity', 'sendPasswordToOwner']);
- $instance->expects($this->once())->method('getSharedWith')->willReturn([]);
- $instance->expects($this->once())->method('createMailShare')->with($share)->willReturn(42);
- $instance->expects($this->once())->method('createShareActivity')->with($share);
- $instance->expects($this->once())->method('getRawShare')->with(42)->willReturn(['rawShare', 'password' => 'autogeneratedPassword']);
- $instance->expects($this->once())->method('createShareObject')->with(['rawShare', 'password' => 'autogeneratedPassword'])->willReturn($expectedShare);
- // Initially not set, but will be set by the autoGeneratePassword method.
- $share->expects($this->exactly(3))->method('getPassword')->willReturnOnConsecutiveCalls(null, 'autogeneratedPassword', 'autogeneratedPassword');
- $this->hasher->expects($this->once())->method('hash')->with('autogeneratedPassword')->willReturn('autogeneratedPasswordHashed');
- $share->expects($this->once())->method('setPassword')->with('autogeneratedPasswordHashed');
- // The autogenerated password should be mailed to the receiver of the share because permanent passwords are enforced.
- $this->shareManager->expects($this->any())->method('shareApiLinkEnforcePassword')->willReturn(true);
- $this->config->expects($this->any())->method('getSystemValue')->with('sharing.enable_mail_link_password_expiration')->willReturn(false);
- $this->settingsManager->expects($this->any())->method('sendPasswordByMail')->willReturn(true);
- $message = $this->createMock(IMessage::class);
- $message->expects($this->exactly(2))->method('setTo')->with(['receiver@example.com']);
- $this->mailer->expects($this->exactly(2))->method('createMessage')->willReturn($message);
- $this->mailer->expects($this->exactly(2))->method('createEMailTemplate')
- ->withConsecutive([
- 'sharebymail.RecipientNotification', [
- 'filename' => 'filename',
- 'link' => 'https://example.com/file.txt',
- 'initiator' => 'owner',
- 'expiration' => null,
- 'shareWith' => 'receiver@example.com',
- 'note' => ''
- ]
- ],
- [
- 'sharebymail.RecipientPasswordNotification', [
- 'filename' => 'filename',
- 'password' => 'autogeneratedPassword',
- 'initiator' => 'owner',
- 'initiatorEmail' => null,
- 'shareWith' => 'receiver@example.com',
- ]
- ]);
- // Main email notification is sent as well as the password
- // to the recipient because shareApiLinkEnforcePassword is enabled.
- $this->mailer->expects($this->exactly(2))->method('send');
- $instance->expects($this->never())->method('sendPasswordToOwner');
- $this->assertSame($expectedShare, $instance->create($share));
- $instance->sendMailNotification($share);
- }
- public function testCreateSendPasswordByMailWithPasswordAndWithEnforcedPasswordProtectionWithPermanentPassword(): void {
- $expectedShare = $this->createMock(IShare::class);
- $node = $this->getMockBuilder(File::class)->getMock();
- $node->expects($this->any())->method('getName')->willReturn('filename');
- $share = $this->getMockBuilder(IShare::class)->getMock();
- $share->expects($this->any())->method('getSharedWith')->willReturn('receiver@example.com');
- $share->expects($this->any())->method('getSendPasswordByTalk')->willReturn(false);
- $share->expects($this->any())->method('getSharedBy')->willReturn('owner');
- $share->expects($this->any())->method('getNode')->willReturn($node);
- $share->expects($this->any())->method('getId')->willReturn(42);
- $share->expects($this->any())->method('getNote')->willReturn('');
- $share->expects($this->any())->method('getToken')->willReturn('token');
- $this->urlGenerator->expects($this->once())->method('linkToRouteAbsolute')
- ->with('files_sharing.sharecontroller.showShare', ['token' => 'token'])
- ->willReturn('https://example.com/file.txt');
- // Assume the mail address is valid.
- $this->mailer->expects($this->any())->method('validateMailAddress')->willReturn(true);
- $instance = $this->getInstance(['getSharedWith', 'createMailShare', 'getRawShare', 'createShareObject', 'createShareActivity', 'autoGeneratePassword', 'createPasswordSendActivity', 'sendPasswordToOwner']);
- $instance->expects($this->once())->method('getSharedWith')->willReturn([]);
- $instance->expects($this->once())->method('createMailShare')->with($share)->willReturn(42);
- $instance->expects($this->once())->method('createShareActivity')->with($share);
- $instance->expects($this->once())->method('getRawShare')->with(42)->willReturn(['rawShare', 'password' => 'password']);
- $instance->expects($this->once())->method('createShareObject')->with(['rawShare', 'password' => 'password'])->willReturn($expectedShare);
- $share->expects($this->exactly(3))->method('getPassword')->willReturn('password');
- $this->hasher->expects($this->once())->method('hash')->with('password')->willReturn('passwordHashed');
- $share->expects($this->once())->method('setPassword')->with('passwordHashed');
- // The given password (but not the autogenerated password) should be
- // mailed to the receiver of the share.
- $this->shareManager->expects($this->any())->method('shareApiLinkEnforcePassword')->willReturn(true);
- $this->config->expects($this->any())->method('getSystemValue')->with('sharing.enable_mail_link_password_expiration')->willReturn(false);
- $this->settingsManager->expects($this->any())->method('sendPasswordByMail')->willReturn(true);
- $instance->expects($this->never())->method('autoGeneratePassword');
- $message = $this->createMock(IMessage::class);
- $message->expects($this->exactly(2))->method('setTo')->with(['receiver@example.com']);
- $this->mailer->expects($this->exactly(2))->method('createMessage')->willReturn($message);
- $this->mailer->expects($this->exactly(2))->method('createEMailTemplate')
- ->withConsecutive([
- 'sharebymail.RecipientNotification', [
- 'filename' => 'filename',
- 'link' => 'https://example.com/file.txt',
- 'initiator' => 'owner',
- 'expiration' => null,
- 'shareWith' => 'receiver@example.com',
- 'note' => ''
- ]
- ],
- [
- 'sharebymail.RecipientPasswordNotification', [
- 'filename' => 'filename',
- 'password' => 'password',
- 'initiator' => 'owner',
- 'initiatorEmail' => null,
- 'shareWith' => 'receiver@example.com',
- ]
- ]);
- // Main email notification is sent as well as the password
- // to the recipient because the password is set.
- $this->mailer->expects($this->exactly(2))->method('send');
- $instance->expects($this->never())->method('sendPasswordToOwner');
- $this->assertSame($expectedShare, $instance->create($share));
- $instance->sendMailNotification($share);
- }
- public function testCreateSendPasswordByTalkWithEnforcedPasswordProtectionWithPermanentPassword(): void {
- $expectedShare = $this->createMock(IShare::class);
- // The owner of the share.
- $owner = $this->getMockBuilder(IUser::class)->getMock();
- $this->userManager->expects($this->any())->method('get')->with('owner')->willReturn($owner);
- $owner->expects($this->any())->method('getEMailAddress')->willReturn('owner@example.com');
- $owner->expects($this->any())->method('getDisplayName')->willReturn('owner');
- $node = $this->getMockBuilder(File::class)->getMock();
- $node->expects($this->any())->method('getName')->willReturn('filename');
- $share = $this->getMockBuilder(IShare::class)->getMock();
- $share->expects($this->any())->method('getSharedWith')->willReturn('receiver@example.com');
- $share->expects($this->any())->method('getSendPasswordByTalk')->willReturn(true);
- $share->expects($this->any())->method('getSharedBy')->willReturn('owner');
- $share->expects($this->any())->method('getNode')->willReturn($node);
- $share->expects($this->any())->method('getId')->willReturn(42);
- $share->expects($this->any())->method('getNote')->willReturn('');
- $share->expects($this->any())->method('getToken')->willReturn('token');
- $this->urlGenerator->expects($this->once())->method('linkToRouteAbsolute')
- ->with('files_sharing.sharecontroller.showShare', ['token' => 'token'])
- ->willReturn('https://example.com/file.txt');
- // Assume the mail address is valid.
- $this->mailer->expects($this->any())->method('validateMailAddress')->willReturn(true);
- $instance = $this->getInstance(['getSharedWith', 'createMailShare', 'getRawShare', 'createShareObject', 'createShareActivity', 'autoGeneratePassword', 'createPasswordSendActivity']);
- $instance->expects($this->once())->method('getSharedWith')->willReturn([]);
- $instance->expects($this->once())->method('createMailShare')->with($share)->willReturn(42);
- $instance->expects($this->once())->method('createShareActivity')->with($share);
- $instance->expects($this->once())->method('getRawShare')->with(42)->willReturn(['rawShare', 'password' => 'autogeneratedPassword']);
- $instance->expects($this->once())->method('createShareObject')->with(['rawShare', 'password' => 'autogeneratedPassword'])->willReturn($expectedShare);
- $share->expects($this->exactly(4))->method('getPassword')->willReturnOnConsecutiveCalls(null, 'autogeneratedPassword', 'autogeneratedPassword', 'autogeneratedPassword');
- $this->hasher->expects($this->once())->method('hash')->with('autogeneratedPassword')->willReturn('autogeneratedPasswordHashed');
- $share->expects($this->once())->method('setPassword')->with('autogeneratedPasswordHashed');
- // The autogenerated password should be mailed to the owner of the share.
- $this->shareManager->expects($this->any())->method('shareApiLinkEnforcePassword')->willReturn(true);
- $this->config->expects($this->any())->method('getSystemValue')->with('sharing.enable_mail_link_password_expiration')->willReturn(false);
- $this->settingsManager->expects($this->any())->method('sendPasswordByMail')->willReturn(true);
- $instance->expects($this->once())->method('autoGeneratePassword')->with($share)->willReturn('autogeneratedPassword');
- $message = $this->createMock(IMessage::class);
- $message->expects($this->exactly(2))->method('setTo')->withConsecutive([['receiver@example.com']], [['owner@example.com' => 'owner']]);
- $this->mailer->expects($this->exactly(2))->method('createMessage')->willReturn($message);
- $this->mailer->expects($this->exactly(2))->method('createEMailTemplate')
- ->withConsecutive([
- 'sharebymail.RecipientNotification', [
- 'filename' => 'filename',
- 'link' => 'https://example.com/file.txt',
- 'initiator' => 'owner',
- 'expiration' => null,
- 'shareWith' => 'receiver@example.com',
- 'note' => ''
- ]
- ],
- [
- 'sharebymail.OwnerPasswordNotification', [
- 'filename' => 'filename',
- 'password' => 'autogeneratedPassword',
- 'initiator' => 'owner',
- 'initiatorEmail' => 'owner@example.com',
- 'shareWith' => 'receiver@example.com',
- ]
- ]);
- // Main email notification is sent as well as the password to owner
- // because the password is set and SendPasswordByTalk is enabled.
- $this->mailer->expects($this->exactly(2))->method('send');
- $this->assertSame($expectedShare, $instance->create($share));
- $instance->sendMailNotification($share);
- }
- // If attributes is set to multiple emails, use them as BCC
- public function sendNotificationToMultipleEmails() {
- $expectedShare = $this->createMock(IShare::class);
- $node = $this->getMockBuilder(File::class)->getMock();
- $node->expects($this->any())->method('getName')->willReturn('filename');
- $share = $this->getMockBuilder(IShare::class)->getMock();
- $share->expects($this->any())->method('getSharedWith')->willReturn('');
- $share->expects($this->any())->method('getSendPasswordByTalk')->willReturn(false);
- $share->expects($this->any())->method('getSharedBy')->willReturn('owner');
- $share->expects($this->any())->method('getNode')->willReturn($node);
- $share->expects($this->any())->method('getId')->willReturn(42);
- $share->expects($this->any())->method('getNote')->willReturn('');
- $share->expects($this->any())->method('getToken')->willReturn('token');
- $attributes = $this->getMockBuilder(IAttributes::class)->getMock();
- $share->expects($this->any())->method('getAttributes')->willReturn($attributes);
- $attributes->expects($this->any())->method('getAttribute')->with('shareWith', 'emails')->willReturn([
- 'receiver1@example.com',
- 'receiver2@example.com',
- 'receiver3@example.com',
- ]);
- // Assume the mail address is valid.
- $this->mailer->expects($this->any())->method('validateMailAddress')->willReturn(true);
- $instance = $this->getInstance(['getSharedWith', 'createMailShare', 'getRawShare', 'createShareObject', 'createShareActivity', 'autoGeneratePassword', 'createPasswordSendActivity', 'sendEmail', 'sendPassword', 'sendPasswordToOwner']);
- $instance->expects($this->once())->method('getSharedWith')->willReturn([]);
- $instance->expects($this->once())->method('createMailShare')->with($share)->willReturn(42);
- $instance->expects($this->once())->method('createShareActivity')->with($share);
- $instance->expects($this->once())->method('getRawShare')->with(42)->willReturn(['rawShare', 'password' => 'password']);
- $instance->expects($this->once())->method('createShareObject')->with(['rawShare', 'password' => 'password'])->willReturn($expectedShare);
- $share->expects($this->any())->method('getNode')->willReturn($node);
- $share->expects($this->any())->method('getPassword')->willReturn('password');
- $this->hasher->expects($this->once())->method('hash')->with('password')->willReturn('passwordHashed');
- $share->expects($this->once())->method('setPassword')->with('passwordHashed');
- // The given password (but not the autogenerated password) should not be
- // mailed to the receiver of the share because permanent passwords are not enforced.
- $this->shareManager->expects($this->any())->method('shareApiLinkEnforcePassword')->willReturn(false);
- $this->config->expects($this->once())->method('getSystemValue')->with('sharing.enable_mail_link_password_expiration')->willReturn(false);
- $instance->expects($this->never())->method('autoGeneratePassword');
- // A password is set but no password sent via talk has been requested
- $instance->expects($this->once())->method('sendEmail')
- ->with($share, ['receiver1@example.com', 'receiver2@example.com', 'receiver3@example.com']);
- $instance->expects($this->once())->method('sendPassword')->with($share, 'password');
- $instance->expects($this->never())->method('sendPasswordToOwner');
-
-
- $message = $this->createMock(IMessage::class);
- $message->expects($this->never())->method('setTo');
- $message->expects($this->exactly(2))->method('setBcc')->with(['receiver1@example.com', 'receiver2@example.com', 'receiver3@example.com']);
- $this->mailer->expects($this->exactly(2))->method('createMessage')->willReturn($message);
- // Main email notification is sent as well as the password
- // to recipients because the password is set.
- $this->mailer->expects($this->exactly(2))->method('send');
- $this->assertSame($expectedShare, $instance->create($share));
- $instance->sendMailNotification($share);
- }
- public function testCreateFailed(): void {
- $this->expectException(\Exception::class);
- $this->share->expects($this->once())->method('getSharedWith')->willReturn('user1');
- $node = $this->getMockBuilder('OCP\Files\Node')->getMock();
- $node->expects($this->any())->method('getName')->willReturn('fileName');
- $this->share->expects($this->any())->method('getNode')->willReturn($node);
- $instance = $this->getInstance(['getSharedWith', 'createMailShare', 'getRawShare', 'createShareObject']);
- $instance->expects($this->once())->method('getSharedWith')->willReturn(['found']);
- $instance->expects($this->never())->method('createMailShare');
- $instance->expects($this->never())->method('getRawShare');
- $instance->expects($this->never())->method('createShareObject');
- $this->assertSame('shareObject',
- $instance->create($this->share)
- );
- }
- public function testCreateMailShare(): void {
- $this->share->expects($this->any())->method('getToken')->willReturn('token');
- $this->share->expects($this->once())->method('setToken')->with('token');
- $this->share->expects($this->any())->method('getSharedBy')->willReturn('validby@valid.com');
- $this->share->expects($this->any())->method('getSharedWith')->willReturn('validwith@valid.com');
- $this->share->expects($this->any())->method('getNote')->willReturn('Check this!');
- $this->share->expects($this->any())->method('getMailSend')->willReturn(true);
- $node = $this->getMockBuilder('OCP\Files\Node')->getMock();
- $node->expects($this->any())->method('getName')->willReturn('fileName');
- $this->share->expects($this->any())->method('getNode')->willReturn($node);
- $instance = $this->getInstance(['generateToken', 'addShareToDB', 'sendMailNotification']);
- $instance->expects($this->once())->method('generateToken')->willReturn('token');
- $instance->expects($this->once())->method('addShareToDB')->willReturn(42);
- // The manager handle the mail sending
- $instance->expects($this->never())->method('sendMailNotification');
- $this->assertSame(42,
- $this->invokePrivate($instance, 'createMailShare', [$this->share])
- );
- }
- public function testGenerateToken(): void {
- $instance = $this->getInstance();
- $this->secureRandom->expects($this->once())->method('generate')->willReturn('token');
- $this->assertSame('token',
- $this->invokePrivate($instance, 'generateToken')
- );
- }
- public function testAddShareToDB(): void {
- $itemSource = 11;
- $itemType = 'file';
- $shareWith = 'user@server.com';
- $sharedBy = 'user1';
- $uidOwner = 'user2';
- $permissions = 1;
- $token = 'token';
- $password = 'password';
- $sendPasswordByTalk = true;
- $hideDownload = true;
- $label = 'label';
- $expiration = new \DateTime();
- $passwordExpirationTime = new \DateTime();
- $instance = $this->getInstance();
- $id = $this->invokePrivate(
- $instance,
- 'addShareToDB',
- [
- $itemSource,
- $itemType,
- $shareWith,
- $sharedBy,
- $uidOwner,
- $permissions,
- $token,
- $password,
- $passwordExpirationTime,
- $sendPasswordByTalk,
- $hideDownload,
- $label,
- $expiration
- ]
- );
- $qb = $this->connection->getQueryBuilder();
- $qb->select('*')
- ->from('share')
- ->where($qb->expr()->eq('id', $qb->createNamedParameter($id)));
- $qResult = $qb->execute();
- $result = $qResult->fetchAll();
- $qResult->closeCursor();
- $this->assertSame(1, count($result));
- $this->assertSame($itemSource, (int)$result[0]['item_source']);
- $this->assertSame($itemType, $result[0]['item_type']);
- $this->assertSame($shareWith, $result[0]['share_with']);
- $this->assertSame($sharedBy, $result[0]['uid_initiator']);
- $this->assertSame($uidOwner, $result[0]['uid_owner']);
- $this->assertSame($permissions, (int)$result[0]['permissions']);
- $this->assertSame($token, $result[0]['token']);
- $this->assertSame($password, $result[0]['password']);
- $this->assertSame($passwordExpirationTime->getTimestamp(), \DateTime::createFromFormat('Y-m-d H:i:s', $result[0]['password_expiration_time'])->getTimestamp());
- $this->assertSame($sendPasswordByTalk, (bool)$result[0]['password_by_talk']);
- $this->assertSame($hideDownload, (bool)$result[0]['hide_download']);
- $this->assertSame($label, $result[0]['label']);
- $this->assertSame($expiration->getTimestamp(), \DateTime::createFromFormat('Y-m-d H:i:s', $result[0]['expiration'])->getTimestamp());
- }
- public function testUpdate(): void {
- $itemSource = 11;
- $itemType = 'file';
- $shareWith = 'user@server.com';
- $sharedBy = 'user1';
- $uidOwner = 'user2';
- $permissions = 1;
- $token = 'token';
- $note = 'personal note';
- $instance = $this->getInstance();
- $id = $this->createDummyShare($itemType, $itemSource, $shareWith, $sharedBy, $uidOwner, $permissions, $token, $note);
- $this->share->expects($this->once())->method('getPermissions')->willReturn($permissions + 1);
- $this->share->expects($this->once())->method('getShareOwner')->willReturn($uidOwner);
- $this->share->expects($this->once())->method('getSharedBy')->willReturn($sharedBy);
- $this->share->expects($this->any())->method('getNote')->willReturn($note);
- $this->share->expects($this->atLeastOnce())->method('getId')->willReturn($id);
- $this->assertSame($this->share,
- $instance->update($this->share)
- );
- $qb = $this->connection->getQueryBuilder();
- $qb->select('*')
- ->from('share')
- ->where($qb->expr()->eq('id', $qb->createNamedParameter($id)));
- $qResult = $qb->execute();
- $result = $qResult->fetchAll();
- $qResult->closeCursor();
- $this->assertSame(1, count($result));
- $this->assertSame($itemSource, (int)$result[0]['item_source']);
- $this->assertSame($itemType, $result[0]['item_type']);
- $this->assertSame($shareWith, $result[0]['share_with']);
- $this->assertSame($sharedBy, $result[0]['uid_initiator']);
- $this->assertSame($uidOwner, $result[0]['uid_owner']);
- $this->assertSame($permissions + 1, (int)$result[0]['permissions']);
- $this->assertSame($token, $result[0]['token']);
- $this->assertSame($note, $result[0]['note']);
- }
- public function dataUpdateSendPassword() {
- return [
- ['password', 'hashed', 'hashed new', false, false, true],
- ['', 'hashed', 'hashed new', false, false, false],
- [null, 'hashed', 'hashed new', false, false, false],
- ['password', 'hashed', 'hashed', false, false, false],
- ['password', 'hashed', 'hashed new', false, true, false],
- ['password', 'hashed', 'hashed new', true, false, true],
- ['password', 'hashed', 'hashed', true, false, true],
- ];
- }
- /**
- * @dataProvider dataUpdateSendPassword
- *
- * @param string|null plainTextPassword
- * @param string originalPassword
- * @param string newPassword
- * @param string originalSendPasswordByTalk
- * @param string newSendPasswordByTalk
- * @param bool sendMail
- */
- public function testUpdateSendPassword($plainTextPassword, string $originalPassword, string $newPassword, $originalSendPasswordByTalk, $newSendPasswordByTalk, bool $sendMail): void {
- $node = $this->createMock(File::class);
- $node->expects($this->any())->method('getName')->willReturn('filename');
- $this->settingsManager->method('sendPasswordByMail')->willReturn(true);
- $originalShare = $this->getMockBuilder(IShare::class)->getMock();
- $originalShare->expects($this->any())->method('getSharedWith')->willReturn('receiver@example.com');
- $originalShare->expects($this->any())->method('getNode')->willReturn($node);
- $originalShare->expects($this->any())->method('getId')->willReturn(42);
- $originalShare->expects($this->any())->method('getPassword')->willReturn($originalPassword);
- $originalShare->expects($this->any())->method('getSendPasswordByTalk')->willReturn($originalSendPasswordByTalk);
- $share = $this->getMockBuilder(IShare::class)->getMock();
- $share->expects($this->any())->method('getSharedWith')->willReturn('receiver@example.com');
- $share->expects($this->any())->method('getNode')->willReturn($node);
- $share->expects($this->any())->method('getId')->willReturn(42);
- $share->expects($this->any())->method('getPassword')->willReturn($newPassword);
- $share->expects($this->any())->method('getSendPasswordByTalk')->willReturn($newSendPasswordByTalk);
- if ($sendMail) {
- $this->mailer->expects($this->once())->method('createEMailTemplate')->with('sharebymail.RecipientPasswordNotification', [
- 'filename' => 'filename',
- 'password' => $plainTextPassword,
- 'initiator' => null,
- 'initiatorEmail' => null,
- 'shareWith' => 'receiver@example.com',
- ]);
- $this->mailer->expects($this->once())->method('send');
- } else {
- $this->mailer->expects($this->never())->method('send');
- }
- $instance = $this->getInstance(['getShareById', 'createPasswordSendActivity']);
- $instance->expects($this->once())->method('getShareById')->willReturn($originalShare);
- $this->assertSame($share,
- $instance->update($share, $plainTextPassword)
- );
- }
- public function testDelete(): void {
- $instance = $this->getInstance(['removeShareFromTable', 'createShareActivity']);
- $this->share->expects($this->once())->method('getId')->willReturn(42);
- $instance->expects($this->once())->method('removeShareFromTable')->with(42);
- $instance->expects($this->once())->method('createShareActivity')->with($this->share, 'unshare');
- $instance->delete($this->share);
- }
- public function testGetShareById(): void {
- $instance = $this->getInstance(['createShareObject']);
- $itemSource = 11;
- $itemType = 'file';
- $shareWith = 'user@server.com';
- $sharedBy = 'user1';
- $uidOwner = 'user2';
- $permissions = 1;
- $token = 'token';
- $this->createDummyShare($itemType, $itemSource, $shareWith, 'user1wrong', 'user2wrong', $permissions, $token);
- $id2 = $this->createDummyShare($itemType, $itemSource, $shareWith, $sharedBy, $uidOwner, $permissions, $token);
- $instance->expects($this->once())->method('createShareObject')
- ->willReturnCallback(
- function ($data) use ($uidOwner, $sharedBy, $id2) {
- $this->assertSame($uidOwner, $data['uid_owner']);
- $this->assertSame($sharedBy, $data['uid_initiator']);
- $this->assertSame($id2, (int)$data['id']);
- return $this->share;
- }
- );
- $result = $instance->getShareById($id2);
- $this->assertInstanceOf('OCP\Share\IShare', $result);
- }
- public function testGetShareByIdFailed(): void {
- $this->expectException(\OCP\Share\Exceptions\ShareNotFound::class);
- $instance = $this->getInstance(['createShareObject']);
- $itemSource = 11;
- $itemType = 'file';
- $shareWith = 'user@server.com';
- $sharedBy = 'user1';
- $uidOwner = 'user2';
- $permissions = 1;
- $token = 'token';
- $id = $this->createDummyShare($itemType, $itemSource, $shareWith, $sharedBy, $uidOwner, $permissions, $token);
- $instance->getShareById($id + 1);
- }
- public function testGetShareByPath(): void {
- $itemSource = 11;
- $itemType = 'file';
- $shareWith = 'user@server.com';
- $sharedBy = 'user1';
- $uidOwner = 'user2';
- $permissions = 1;
- $token = 'token';
- $node = $this->createMock(Node::class);
- $node->expects($this->once())->method('getId')->willReturn($itemSource);
- $instance = $this->getInstance(['createShareObject']);
- $this->createDummyShare($itemType, 111, $shareWith, $sharedBy, $uidOwner, $permissions, $token);
- $id = $this->createDummyShare($itemType, $itemSource, $shareWith, $sharedBy, $uidOwner, $permissions, $token);
- $instance->expects($this->once())->method('createShareObject')
- ->willReturnCallback(
- function ($data) use ($uidOwner, $sharedBy, $id) {
- $this->assertSame($uidOwner, $data['uid_owner']);
- $this->assertSame($sharedBy, $data['uid_initiator']);
- $this->assertSame($id, (int)$data['id']);
- return $this->share;
- }
- );
- $result = $instance->getSharesByPath($node);
- $this->assertTrue(is_array($result));
- $this->assertSame(1, count($result));
- $this->assertInstanceOf('OCP\Share\IShare', $result[0]);
- }
- public function testGetShareByToken(): void {
- $itemSource = 11;
- $itemType = 'file';
- $shareWith = 'user@server.com';
- $sharedBy = 'user1';
- $uidOwner = 'user2';
- $permissions = 1;
- $token = 'token';
- $instance = $this->getInstance(['createShareObject']);
- $idMail = $this->createDummyShare($itemType, $itemSource, $shareWith, $sharedBy, $uidOwner, $permissions, $token);
- $idPublic = $this->createDummyShare($itemType, $itemSource, $shareWith, $sharedBy, $uidOwner, $permissions, $token, '', IShare::TYPE_LINK);
- $this->assertTrue($idMail !== $idPublic);
- $instance->expects($this->once())->method('createShareObject')
- ->willReturnCallback(
- function ($data) use ($idMail) {
- $this->assertSame($idMail, (int)$data['id']);
- return $this->share;
- }
- );
- $result = $instance->getShareByToken('token');
- $this->assertInstanceOf('OCP\Share\IShare', $result);
- }
- public function testGetShareByTokenFailed(): void {
- $this->expectException(\OCP\Share\Exceptions\ShareNotFound::class);
- $itemSource = 11;
- $itemType = 'file';
- $shareWith = 'user@server.com';
- $sharedBy = 'user1';
- $uidOwner = 'user2';
- $permissions = 1;
- $token = 'token';
- $instance = $this->getInstance(['createShareObject']);
- $idMail = $this->createDummyShare($itemType, $itemSource, $shareWith, $sharedBy, $uidOwner, $permissions, $token);
- $idPublic = $this->createDummyShare($itemType, $itemSource, $shareWith, $sharedBy, $uidOwner, $permissions, 'token2', '', IShare::TYPE_LINK);
- $this->assertTrue($idMail !== $idPublic);
- $this->assertInstanceOf('OCP\Share\IShare',
- $instance->getShareByToken('token2')
- );
- }
- public function testRemoveShareFromTable(): void {
- $itemSource = 11;
- $itemType = 'file';
- $shareWith = 'user@server.com';
- $sharedBy = 'user1';
- $uidOwner = 'user2';
- $permissions = 1;
- $token = 'token';
- $instance = $this->getInstance();
- $id = $this->createDummyShare($itemType, $itemSource, $shareWith, $sharedBy, $uidOwner, $permissions, $token);
- $query = $this->connection->getQueryBuilder();
- $query->select('*')->from('share')
- ->where($query->expr()->eq('id', $query->createNamedParameter($id)));
- $result = $query->execute();
- $before = $result->fetchAll();
- $result->closeCursor();
- $this->assertTrue(is_array($before));
- $this->assertSame(1, count($before));
- $this->invokePrivate($instance, 'removeShareFromTable', [$id]);
- $query = $this->connection->getQueryBuilder();
- $query->select('*')->from('share')
- ->where($query->expr()->eq('id', $query->createNamedParameter($id)));
- $result = $query->execute();
- $after = $result->fetchAll();
- $result->closeCursor();
- $this->assertTrue(is_array($after));
- $this->assertEmpty($after);
- }
- public function testUserDeleted(): void {
- $itemSource = 11;
- $itemType = 'file';
- $shareWith = 'user@server.com';
- $sharedBy = 'user1';
- $uidOwner = 'user2';
- $permissions = 1;
- $token = 'token';
- $this->createDummyShare($itemType, $itemSource, $shareWith, $sharedBy, $uidOwner, $permissions, $token);
- $id = $this->createDummyShare($itemType, $itemSource, $shareWith, $sharedBy, 'user2Wrong', $permissions, $token);
- $query = $this->connection->getQueryBuilder();
- $query->select('*')->from('share');
- $result = $query->execute();
- $before = $result->fetchAll();
- $result->closeCursor();
- $this->assertTrue(is_array($before));
- $this->assertSame(2, count($before));
- $instance = $this->getInstance();
- $instance->userDeleted($uidOwner, IShare::TYPE_EMAIL);
- $query = $this->connection->getQueryBuilder();
- $query->select('*')->from('share');
- $result = $query->execute();
- $after = $result->fetchAll();
- $result->closeCursor();
- $this->assertTrue(is_array($after));
- $this->assertSame(1, count($after));
- $this->assertSame($id, (int)$after[0]['id']);
- }
- public function testGetRawShare(): void {
- $itemSource = 11;
- $itemType = 'file';
- $shareWith = 'user@server.com';
- $sharedBy = 'user1';
- $uidOwner = 'user2';
- $permissions = 1;
- $token = 'token';
- $instance = $this->getInstance();
- $id = $this->createDummyShare($itemType, $itemSource, $shareWith, $sharedBy, $uidOwner, $permissions, $token);
- $result = $this->invokePrivate($instance, 'getRawShare', [$id]);
- $this->assertTrue(is_array($result));
- $this->assertSame($itemSource, (int)$result['item_source']);
- $this->assertSame($itemType, $result['item_type']);
- $this->assertSame($shareWith, $result['share_with']);
- $this->assertSame($sharedBy, $result['uid_initiator']);
- $this->assertSame($uidOwner, $result['uid_owner']);
- $this->assertSame($permissions, (int)$result['permissions']);
- $this->assertSame($token, $result['token']);
- }
- public function testGetRawShareFailed(): void {
- $this->expectException(\OCP\Share\Exceptions\ShareNotFound::class);
- $itemSource = 11;
- $itemType = 'file';
- $shareWith = 'user@server.com';
- $sharedBy = 'user1';
- $uidOwner = 'user2';
- $permissions = 1;
- $token = 'token';
- $instance = $this->getInstance();
- $id = $this->createDummyShare($itemType, $itemSource, $shareWith, $sharedBy, $uidOwner, $permissions, $token);
- $this->invokePrivate($instance, 'getRawShare', [$id + 1]);
- }
- private function createDummyShare($itemType, $itemSource, $shareWith, $sharedBy, $uidOwner, $permissions, $token, $note = '', $shareType = IShare::TYPE_EMAIL) {
- $qb = $this->connection->getQueryBuilder();
- $qb->insert('share')
- ->setValue('share_type', $qb->createNamedParameter($shareType))
- ->setValue('item_type', $qb->createNamedParameter($itemType))
- ->setValue('item_source', $qb->createNamedParameter($itemSource))
- ->setValue('file_source', $qb->createNamedParameter($itemSource))
- ->setValue('share_with', $qb->createNamedParameter($shareWith))
- ->setValue('uid_owner', $qb->createNamedParameter($uidOwner))
- ->setValue('uid_initiator', $qb->createNamedParameter($sharedBy))
- ->setValue('permissions', $qb->createNamedParameter($permissions))
- ->setValue('token', $qb->createNamedParameter($token))
- ->setValue('note', $qb->createNamedParameter($note))
- ->setValue('stime', $qb->createNamedParameter(time()));
- /*
- * Added to fix https://github.com/owncloud/core/issues/22215
- * Can be removed once we get rid of ajax/share.php
- */
- $qb->setValue('file_target', $qb->createNamedParameter(''));
- $qb->execute();
- $id = $qb->getLastInsertId();
- return (int)$id;
- }
- public function testGetSharesInFolder(): void {
- $userManager = \OC::$server->getUserManager();
- $rootFolder = \OC::$server->getRootFolder();
- $this->shareManager->expects($this->any())
- ->method('newShare')
- ->willReturn(new \OC\Share20\Share($rootFolder, $userManager));
- $provider = $this->getInstance(['sendMailNotification', 'createShareActivity']);
- $this->mailer->expects($this->any())->method('validateMailAddress')->willReturn(true);
- $u1 = $userManager->createUser('testFed', md5(time()));
- $u2 = $userManager->createUser('testFed2', md5(time()));
- $folder1 = $rootFolder->getUserFolder($u1->getUID())->newFolder('foo');
- $file1 = $folder1->newFile('bar1');
- $file2 = $folder1->newFile('bar2');
- $share1 = $this->shareManager->newShare();
- $share1->setSharedWith('user@server.com')
- ->setSharedBy($u1->getUID())
- ->setShareOwner($u1->getUID())
- ->setPermissions(\OCP\Constants::PERMISSION_READ)
- ->setNode($file1);
- $provider->create($share1);
- $share2 = $this->shareManager->newShare();
- $share2->setSharedWith('user@server.com')
- ->setSharedBy($u2->getUID())
- ->setShareOwner($u1->getUID())
- ->setPermissions(\OCP\Constants::PERMISSION_READ)
- ->setNode($file2);
- $provider->create($share2);
- $result = $provider->getSharesInFolder($u1->getUID(), $folder1, false);
- $this->assertCount(1, $result);
- $this->assertCount(1, $result[$file1->getId()]);
- $result = $provider->getSharesInFolder($u1->getUID(), $folder1, true);
- $this->assertCount(2, $result);
- $this->assertCount(1, $result[$file1->getId()]);
- $this->assertCount(1, $result[$file2->getId()]);
- $u1->delete();
- $u2->delete();
- }
- public function testGetAccessList(): void {
- $userManager = \OC::$server->getUserManager();
- $rootFolder = \OC::$server->getRootFolder();
- $this->shareManager->expects($this->any())
- ->method('newShare')
- ->willReturn(new \OC\Share20\Share($rootFolder, $userManager));
- $provider = $this->getInstance(['sendMailNotification', 'createShareActivity']);
- $this->mailer->expects($this->any())->method('validateMailAddress')->willReturn(true);
- $u1 = $userManager->createUser('testFed', md5(time()));
- $u2 = $userManager->createUser('testFed2', md5(time()));
- $folder = $rootFolder->getUserFolder($u1->getUID())->newFolder('foo');
- $accessList = $provider->getAccessList([$folder], true);
- $this->assertArrayHasKey('public', $accessList);
- $this->assertFalse($accessList['public']);
- $accessList = $provider->getAccessList([$folder], false);
- $this->assertArrayHasKey('public', $accessList);
- $this->assertFalse($accessList['public']);
- $share1 = $this->shareManager->newShare();
- $share1->setSharedWith('user@server.com')
- ->setSharedBy($u1->getUID())
- ->setShareOwner($u1->getUID())
- ->setPermissions(\OCP\Constants::PERMISSION_READ)
- ->setNode($folder);
- $share1 = $provider->create($share1);
- $share2 = $this->shareManager->newShare();
- $share2->setSharedWith('user2@server.com')
- ->setSharedBy($u2->getUID())
- ->setShareOwner($u1->getUID())
- ->setPermissions(\OCP\Constants::PERMISSION_READ)
- ->setNode($folder);
- $share2 = $provider->create($share2);
- $accessList = $provider->getAccessList([$folder], true);
- $this->assertArrayHasKey('public', $accessList);
- $this->assertTrue($accessList['public']);
- $accessList = $provider->getAccessList([$folder], false);
- $this->assertArrayHasKey('public', $accessList);
- $this->assertTrue($accessList['public']);
- $provider->delete($share2);
- $accessList = $provider->getAccessList([$folder], true);
- $this->assertArrayHasKey('public', $accessList);
- $this->assertTrue($accessList['public']);
- $accessList = $provider->getAccessList([$folder], false);
- $this->assertArrayHasKey('public', $accessList);
- $this->assertTrue($accessList['public']);
- $provider->delete($share1);
- $accessList = $provider->getAccessList([$folder], true);
- $this->assertArrayHasKey('public', $accessList);
- $this->assertFalse($accessList['public']);
- $accessList = $provider->getAccessList([$folder], false);
- $this->assertArrayHasKey('public', $accessList);
- $this->assertFalse($accessList['public']);
- $u1->delete();
- $u2->delete();
- }
- public function testSendMailNotificationWithSameUserAndUserEmail(): void {
- $provider = $this->getInstance();
- $user = $this->createMock(IUser::class);
- $this->settingsManager->expects($this->any())->method('replyToInitiator')->willReturn(true);
- $this->userManager
- ->expects($this->once())
- ->method('get')
- ->with('OwnerUser')
- ->willReturn($user);
- $user
- ->expects($this->once())
- ->method('getDisplayName')
- ->willReturn('Mrs. Owner User');
- $message = $this->createMock(Message::class);
- $this->mailer
- ->expects($this->once())
- ->method('createMessage')
- ->willReturn($message);
- $template = $this->createMock(IEMailTemplate::class);
- $this->mailer
- ->expects($this->once())
- ->method('createEMailTemplate')
- ->willReturn($template);
- $template
- ->expects($this->once())
- ->method('addHeader');
- $template
- ->expects($this->once())
- ->method('addHeading')
- ->with('Mrs. Owner User shared file.txt with you');
- $template
- ->expects($this->once())
- ->method('addBodyText')
- ->with(
- 'Mrs. Owner User shared file.txt with you. Click the button below to open it.',
- 'Mrs. Owner User shared file.txt with you.'
- );
- $template
- ->expects($this->once())
- ->method('addBodyButton')
- ->with(
- 'Open file.txt',
- 'https://example.com/file.txt'
- );
- $message
- ->expects($this->once())
- ->method('setTo')
- ->with(['john@doe.com']);
- $this->defaults
- ->expects($this->once())
- ->method('getName')
- ->willReturn('UnitTestCloud');
- $message
- ->expects($this->once())
- ->method('setFrom')
- ->with([
- \OCP\Util::getDefaultEmailAddress('UnitTestCloud') => 'Mrs. Owner User via UnitTestCloud'
- ]);
- $user
- ->expects($this->once())
- ->method('getEMailAddress')
- ->willReturn('owner@example.com');
- $message
- ->expects($this->once())
- ->method('setReplyTo')
- ->with(['owner@example.com' => 'Mrs. Owner User']);
- $this->defaults
- ->expects($this->exactly(2))
- ->method('getSlogan')
- ->willReturn('Testing like 1990');
- $template
- ->expects($this->once())
- ->method('addFooter')
- ->with('UnitTestCloud - Testing like 1990');
- $template
- ->expects($this->once())
- ->method('setSubject')
- ->with('Mrs. Owner User shared file.txt with you');
- $message
- ->expects($this->once())
- ->method('useTemplate')
- ->with($template);
- $this->mailer->expects($this->once())
- ->method('validateMailAddress')
- ->willReturn(true);
- $this->mailer
- ->expects($this->once())
- ->method('send')
- ->with($message);
- $this->urlGenerator->expects($this->once())->method('linkToRouteAbsolute')
- ->with('files_sharing.sharecontroller.showShare', ['token' => 'token'])
- ->willReturn('https://example.com/file.txt');
- $node = $this->getMockBuilder(File::class)->getMock();
- $node->expects($this->any())->method('getName')->willReturn('file.txt');
- $share = $this->getMockBuilder(IShare::class)->getMock();
- $share->expects($this->any())->method('getSharedBy')->willReturn('OwnerUser');
- $share->expects($this->any())->method('getSharedWith')->willReturn('john@doe.com');
- $share->expects($this->any())->method('getNode')->willReturn($node);
- $share->expects($this->any())->method('getId')->willReturn(42);
- $share->expects($this->any())->method('getNote')->willReturn('');
- $share->expects($this->any())->method('getToken')->willReturn('token');
-
- self::invokePrivate(
- $provider,
- 'sendMailNotification',
- [$share]
- );
- }
- public function testSendMailNotificationWithSameUserAndUserEmailAndNote(): void {
- $provider = $this->getInstance();
- $user = $this->createMock(IUser::class);
- $this->settingsManager->expects($this->any())->method('replyToInitiator')->willReturn(true);
- $this->userManager
- ->expects($this->once())
- ->method('get')
- ->with('OwnerUser')
- ->willReturn($user);
- $user
- ->expects($this->once())
- ->method('getDisplayName')
- ->willReturn('Mrs. Owner User');
- $message = $this->createMock(Message::class);
- $this->mailer
- ->expects($this->once())
- ->method('createMessage')
- ->willReturn($message);
- $template = $this->createMock(IEMailTemplate::class);
- $this->mailer
- ->expects($this->once())
- ->method('createEMailTemplate')
- ->willReturn($template);
- $template
- ->expects($this->once())
- ->method('addHeader');
- $template
- ->expects($this->once())
- ->method('addHeading')
- ->with('Mrs. Owner User shared file.txt with you');
- $template
- ->expects($this->once())
- ->method('addBodyText')
- ->with('Mrs. Owner User shared file.txt with you. Click the button below to open it.', 'Mrs. Owner User shared file.txt with you.');
- $this->urlGenerator->expects($this->once())->method('imagePath')
- ->with('core', 'caldav/description.png')
- ->willReturn('core/img/caldav/description.png');
- $this->urlGenerator->expects($this->once())->method('getAbsoluteURL')
- ->with('core/img/caldav/description.png')
- ->willReturn('https://example.com/core/img/caldav/description.png');
- $template
- ->expects($this->once())
- ->method('addBodyListItem')
- ->with(
- 'This is a note to the recipient',
- 'Note:',
- 'https://example.com/core/img/caldav/description.png',
- 'This is a note to the recipient'
- );
- $template
- ->expects($this->once())
- ->method('addBodyButton')
- ->with(
- 'Open file.txt',
- 'https://example.com/file.txt'
- );
- $message
- ->expects($this->once())
- ->method('setTo')
- ->with(['john@doe.com']);
- $this->defaults
- ->expects($this->once())
- ->method('getName')
- ->willReturn('UnitTestCloud');
- $message
- ->expects($this->once())
- ->method('setFrom')
- ->with([
- \OCP\Util::getDefaultEmailAddress('UnitTestCloud') => 'Mrs. Owner User via UnitTestCloud'
- ]);
- $user
- ->expects($this->once())
- ->method('getEMailAddress')
- ->willReturn('owner@example.com');
- $message
- ->expects($this->once())
- ->method('setReplyTo')
- ->with(['owner@example.com' => 'Mrs. Owner User']);
- $this->defaults
- ->expects($this->exactly(2))
- ->method('getSlogan')
- ->willReturn('Testing like 1990');
- $template
- ->expects($this->once())
- ->method('addFooter')
- ->with('UnitTestCloud - Testing like 1990');
- $template
- ->expects($this->once())
- ->method('setSubject')
- ->with('Mrs. Owner User shared file.txt with you');
- $message
- ->expects($this->once())
- ->method('useTemplate')
- ->with($template);
- $this->mailer->expects($this->once())
- ->method('validateMailAddress')
- ->willReturn(true);
- $this->mailer
- ->expects($this->once())
- ->method('send')
- ->with($message);
- $this->urlGenerator->expects($this->once())->method('linkToRouteAbsolute')
- ->with('files_sharing.sharecontroller.showShare', ['token' => 'token'])
- ->willReturn('https://example.com/file.txt');
- $node = $this->getMockBuilder(File::class)->getMock();
- $node->expects($this->any())->method('getName')->willReturn('file.txt');
- $share = $this->getMockBuilder(IShare::class)->getMock();
- $share->expects($this->any())->method('getSharedBy')->willReturn('OwnerUser');
- $share->expects($this->any())->method('getSharedWith')->willReturn('john@doe.com');
- $share->expects($this->any())->method('getNode')->willReturn($node);
- $share->expects($this->any())->method('getId')->willReturn(42);
- $share->expects($this->any())->method('getNote')->willReturn('This is a note to the recipient');
- $share->expects($this->any())->method('getToken')->willReturn('token');
-
- self::invokePrivate(
- $provider,
- 'sendMailNotification',
- [$share]
- );
- }
- public function testSendMailNotificationWithSameUserAndUserEmailAndExpiration(): void {
- $provider = $this->getInstance();
- $user = $this->createMock(IUser::class);
- $this->settingsManager->expects($this->any())->method('replyToInitiator')->willReturn(true);
- $this->userManager
- ->expects($this->once())
- ->method('get')
- ->with('OwnerUser')
- ->willReturn($user);
- $user
- ->expects($this->once())
- ->method('getDisplayName')
- ->willReturn('Mrs. Owner User');
- $message = $this->createMock(Message::class);
- $this->mailer
- ->expects($this->once())
- ->method('createMessage')
- ->willReturn($message);
- $template = $this->createMock(IEMailTemplate::class);
- $this->mailer
- ->expects($this->once())
- ->method('createEMailTemplate')
- ->willReturn($template);
- $template
- ->expects($this->once())
- ->method('addHeader');
- $template
- ->expects($this->once())
- ->method('addHeading')
- ->with('Mrs. Owner User shared file.txt with you');
- $template
- ->expects($this->once())
- ->method('addBodyText')
- ->with('Mrs. Owner User shared file.txt with you. Click the button below to open it.', 'Mrs. Owner User shared file.txt with you.');
- $expiration = new DateTime('2001-01-01');
- $this->l->expects($this->once())
- ->method('l')
- ->with('date', $expiration, ['width' => 'medium'])
- ->willReturn('2001-01-01');
- $this->urlGenerator->expects($this->once())->method('imagePath')
- ->with('core', 'caldav/time.png')
- ->willReturn('core/img/caldav/time.png');
- $this->urlGenerator->expects($this->once())->method('getAbsoluteURL')
- ->with('core/img/caldav/time.png')
- ->willReturn('https://example.com/core/img/caldav/time.png');
- $template
- ->expects($this->once())
- ->method('addBodyListItem')
- ->with(
- 'This share is valid until 2001-01-01 at midnight',
- 'Expiration:',
- 'https://example.com/core/img/caldav/time.png',
- );
- $template
- ->expects($this->once())
- ->method('addBodyButton')
- ->with(
- 'Open file.txt',
- 'https://example.com/file.txt'
- );
- $message
- ->expects($this->once())
- ->method('setTo')
- ->with(['john@doe.com']);
- $this->defaults
- ->expects($this->once())
- ->method('getName')
- ->willReturn('UnitTestCloud');
- $message
- ->expects($this->once())
- ->method('setFrom')
- ->with([
- \OCP\Util::getDefaultEmailAddress('UnitTestCloud') => 'Mrs. Owner User via UnitTestCloud'
- ]);
- $user
- ->expects($this->once())
- ->method('getEMailAddress')
- ->willReturn('owner@example.com');
- $message
- ->expects($this->once())
- ->method('setReplyTo')
- ->with(['owner@example.com' => 'Mrs. Owner User']);
- $this->defaults
- ->expects($this->exactly(2))
- ->method('getSlogan')
- ->willReturn('Testing like 1990');
- $template
- ->expects($this->once())
- ->method('addFooter')
- ->with('UnitTestCloud - Testing like 1990');
- $template
- ->expects($this->once())
- ->method('setSubject')
- ->with('Mrs. Owner User shared file.txt with you');
- $message
- ->expects($this->once())
- ->method('useTemplate')
- ->with($template);
- $this->mailer->expects($this->once())
- ->method('validateMailAddress')
- ->willReturn(true);
- $this->mailer
- ->expects($this->once())
- ->method('send')
- ->with($message);
- $this->urlGenerator->expects($this->once())->method('linkToRouteAbsolute')
- ->with('files_sharing.sharecontroller.showShare', ['token' => 'token'])
- ->willReturn('https://example.com/file.txt');
- $node = $this->getMockBuilder(File::class)->getMock();
- $node->expects($this->any())->method('getName')->willReturn('file.txt');
- $share = $this->getMockBuilder(IShare::class)->getMock();
- $share->expects($this->any())->method('getSharedBy')->willReturn('OwnerUser');
- $share->expects($this->any())->method('getSharedWith')->willReturn('john@doe.com');
- $share->expects($this->any())->method('getNode')->willReturn($node);
- $share->expects($this->any())->method('getId')->willReturn(42);
- $share->expects($this->any())->method('getNote')->willReturn('');
- $share->expects($this->any())->method('getExpirationDate')->willReturn($expiration);
- $share->expects($this->any())->method('getToken')->willReturn('token');
-
- self::invokePrivate(
- $provider,
- 'sendMailNotification',
- [$share]
- );
- }
- public function testSendMailNotificationWithDifferentUserAndNoUserEmail(): void {
- $provider = $this->getInstance();
- $initiatorUser = $this->createMock(IUser::class);
- $this->settingsManager->expects($this->any())->method('replyToInitiator')->willReturn(true);
- $this->userManager
- ->expects($this->once())
- ->method('get')
- ->with('InitiatorUser')
- ->willReturn($initiatorUser);
- $initiatorUser
- ->expects($this->once())
- ->method('getDisplayName')
- ->willReturn('Mr. Initiator User');
- $message = $this->createMock(Message::class);
- $this->mailer
- ->expects($this->once())
- ->method('createMessage')
- ->willReturn($message);
- $template = $this->createMock(IEMailTemplate::class);
- $this->mailer
- ->expects($this->once())
- ->method('createEMailTemplate')
- ->willReturn($template);
- $template
- ->expects($this->once())
- ->method('addHeader');
- $template
- ->expects($this->once())
- ->method('addHeading')
- ->with('Mr. Initiator User shared file.txt with you');
- $template
- ->expects($this->once())
- ->method('addBodyText')
- ->with(
- 'Mr. Initiator User shared file.txt with you. Click the button below to open it.',
- 'Mr. Initiator User shared file.txt with you.'
- );
- $template
- ->expects($this->once())
- ->method('addBodyButton')
- ->with(
- 'Open file.txt',
- 'https://example.com/file.txt'
- );
- $message
- ->expects($this->once())
- ->method('setTo')
- ->with(['john@doe.com']);
- $this->defaults
- ->expects($this->once())
- ->method('getName')
- ->willReturn('UnitTestCloud');
- $message
- ->expects($this->once())
- ->method('setFrom')
- ->with([
- \OCP\Util::getDefaultEmailAddress('UnitTestCloud') => 'Mr. Initiator User via UnitTestCloud'
- ]);
- $message
- ->expects($this->never())
- ->method('setReplyTo');
- $template
- ->expects($this->once())
- ->method('addFooter')
- ->with('');
- $template
- ->expects($this->once())
- ->method('setSubject')
- ->with('Mr. Initiator User shared file.txt with you');
- $message
- ->expects($this->once())
- ->method('useTemplate')
- ->with($template);
- $this->mailer->expects($this->once())
- ->method('validateMailAddress')
- ->willReturn(true);
- $this->mailer
- ->expects($this->once())
- ->method('send')
- ->with($message);
- $this->urlGenerator->expects($this->once())->method('linkToRouteAbsolute')
- ->with('files_sharing.sharecontroller.showShare', ['token' => 'token'])
- ->willReturn('https://example.com/file.txt');
- $node = $this->getMockBuilder(File::class)->getMock();
- $node->expects($this->any())->method('getName')->willReturn('file.txt');
- $share = $this->getMockBuilder(IShare::class)->getMock();
- $share->expects($this->any())->method('getSharedBy')->willReturn('InitiatorUser');
- $share->expects($this->any())->method('getSharedWith')->willReturn('john@doe.com');
- $share->expects($this->any())->method('getNode')->willReturn($node);
- $share->expects($this->any())->method('getId')->willReturn(42);
- $share->expects($this->any())->method('getNote')->willReturn('');
- $share->expects($this->any())->method('getToken')->willReturn('token');
- self::invokePrivate(
- $provider,
- 'sendMailNotification',
- [$share]
- );
- }
- public function testSendMailNotificationWithSameUserAndUserEmailAndReplyToDesactivate(): void {
- $provider = $this->getInstance();
- $user = $this->createMock(IUser::class);
- $this->settingsManager->expects($this->any())->method('replyToInitiator')->willReturn(false);
- $this->userManager
- ->expects($this->once())
- ->method('get')
- ->with('OwnerUser')
- ->willReturn($user);
- $user
- ->expects($this->once())
- ->method('getDisplayName')
- ->willReturn('Mrs. Owner User');
- $message = $this->createMock(Message::class);
- $this->mailer
- ->expects($this->once())
- ->method('createMessage')
- ->willReturn($message);
- $template = $this->createMock(IEMailTemplate::class);
- $this->mailer
- ->expects($this->once())
- ->method('createEMailTemplate')
- ->willReturn($template);
- $template
- ->expects($this->once())
- ->method('addHeader');
- $template
- ->expects($this->once())
- ->method('addHeading')
- ->with('Mrs. Owner User shared file.txt with you');
- $template
- ->expects($this->once())
- ->method('addBodyText')
- ->with(
- 'Mrs. Owner User shared file.txt with you. Click the button below to open it.',
- 'Mrs. Owner User shared file.txt with you.'
- );
- $template
- ->expects($this->once())
- ->method('addBodyButton')
- ->with(
- 'Open file.txt',
- 'https://example.com/file.txt'
- );
- $message
- ->expects($this->once())
- ->method('setTo')
- ->with(['john@doe.com']);
- $this->defaults
- ->expects($this->once())
- ->method('getName')
- ->willReturn('UnitTestCloud');
- $message
- ->expects($this->once())
- ->method('setFrom')
- ->with([
- \OCP\Util::getDefaultEmailAddress('UnitTestCloud') => 'UnitTestCloud'
- ]);
- // Since replyToInitiator is false, we never get the initiator email address
- $user
- ->expects($this->never())
- ->method('getEMailAddress');
- $message
- ->expects($this->never())
- ->method('setReplyTo');
- $template
- ->expects($this->once())
- ->method('addFooter')
- ->with('');
- $template
- ->expects($this->once())
- ->method('setSubject')
- ->with('Mrs. Owner User shared file.txt with you');
- $message
- ->expects($this->once())
- ->method('useTemplate')
- ->with($template);
- $this->mailer->expects($this->once())
- ->method('validateMailAddress')
- ->willReturn(true);
- $this->mailer
- ->expects($this->once())
- ->method('send')
- ->with($message);
- $this->urlGenerator->expects($this->once())->method('linkToRouteAbsolute')
- ->with('files_sharing.sharecontroller.showShare', ['token' => 'token'])
- ->willReturn('https://example.com/file.txt');
- $node = $this->getMockBuilder(File::class)->getMock();
- $node->expects($this->any())->method('getName')->willReturn('file.txt');
- $share = $this->getMockBuilder(IShare::class)->getMock();
- $share->expects($this->any())->method('getSharedBy')->willReturn('OwnerUser');
- $share->expects($this->any())->method('getSharedWith')->willReturn('john@doe.com');
- $share->expects($this->any())->method('getNode')->willReturn($node);
- $share->expects($this->any())->method('getId')->willReturn(42);
- $share->expects($this->any())->method('getNote')->willReturn('');
- $share->expects($this->any())->method('getToken')->willReturn('token');
- self::invokePrivate(
- $provider,
- 'sendMailNotification',
- [$share]
- );
- }
- public function testSendMailNotificationWithDifferentUserAndNoUserEmailAndReplyToDesactivate(): void {
- $provider = $this->getInstance();
- $initiatorUser = $this->createMock(IUser::class);
- $this->settingsManager->expects($this->any())->method('replyToInitiator')->willReturn(false);
- $this->userManager
- ->expects($this->once())
- ->method('get')
- ->with('InitiatorUser')
- ->willReturn($initiatorUser);
- $initiatorUser
- ->expects($this->once())
- ->method('getDisplayName')
- ->willReturn('Mr. Initiator User');
- $message = $this->createMock(Message::class);
- $this->mailer
- ->expects($this->once())
- ->method('createMessage')
- ->willReturn($message);
- $template = $this->createMock(IEMailTemplate::class);
- $this->mailer
- ->expects($this->once())
- ->method('createEMailTemplate')
- ->willReturn($template);
- $template
- ->expects($this->once())
- ->method('addHeader');
- $template
- ->expects($this->once())
- ->method('addHeading')
- ->with('Mr. Initiator User shared file.txt with you');
- $template
- ->expects($this->once())
- ->method('addBodyText')
- ->with(
- 'Mr. Initiator User shared file.txt with you. Click the button below to open it.',
- 'Mr. Initiator User shared file.txt with you.'
- );
- $template
- ->expects($this->once())
- ->method('addBodyButton')
- ->with(
- 'Open file.txt',
- 'https://example.com/file.txt'
- );
- $message
- ->expects($this->once())
- ->method('setTo')
- ->with(['john@doe.com']);
- $this->defaults
- ->expects($this->once())
- ->method('getName')
- ->willReturn('UnitTestCloud');
- $message
- ->expects($this->once())
- ->method('setFrom')
- ->with([
- \OCP\Util::getDefaultEmailAddress('UnitTestCloud') => 'UnitTestCloud'
- ]);
- $message
- ->expects($this->never())
- ->method('setReplyTo');
- $template
- ->expects($this->once())
- ->method('addFooter')
- ->with('');
- $template
- ->expects($this->once())
- ->method('setSubject')
- ->with('Mr. Initiator User shared file.txt with you');
- $message
- ->expects($this->once())
- ->method('useTemplate')
- ->with($template);
- $this->mailer->expects($this->once())
- ->method('validateMailAddress')
- ->willReturn(true);
- $this->mailer
- ->expects($this->once())
- ->method('send')
- ->with($message);
- $this->urlGenerator->expects($this->once())->method('linkToRouteAbsolute')
- ->with('files_sharing.sharecontroller.showShare', ['token' => 'token'])
- ->willReturn('https://example.com/file.txt');
- $node = $this->getMockBuilder(File::class)->getMock();
- $node->expects($this->any())->method('getName')->willReturn('file.txt');
- $share = $this->getMockBuilder(IShare::class)->getMock();
- $share->expects($this->any())->method('getSharedBy')->willReturn('InitiatorUser');
- $share->expects($this->any())->method('getSharedWith')->willReturn('john@doe.com');
- $share->expects($this->any())->method('getNode')->willReturn($node);
- $share->expects($this->any())->method('getId')->willReturn(42);
- $share->expects($this->any())->method('getNote')->willReturn('');
- $share->expects($this->any())->method('getToken')->willReturn('token');
- self::invokePrivate(
- $provider,
- 'sendMailNotification',
- [$share]
- );
- }
- }
|