diff --git a/apps/files_sharing/lib/Activity/Providers/Downloads.php b/apps/files_sharing/lib/Activity/Providers/Downloads.php index ac9522ef93b91..ee726a4e5da1a 100644 --- a/apps/files_sharing/lib/Activity/Providers/Downloads.php +++ b/apps/files_sharing/lib/Activity/Providers/Downloads.php @@ -55,12 +55,14 @@ public function parseLongVersion(IEvent $event, ?IEvent $previousEvent = null) { if ($event->getSubject() === self::SUBJECT_PUBLIC_SHARED_FILE_DOWNLOADED || $event->getSubject() === self::SUBJECT_PUBLIC_SHARED_FOLDER_DOWNLOADED) { - if (!isset($parsedParameters['remote-address-hash']['type'])) { - $subject = $this->l->t('{file} downloaded via public link'); - $this->setSubjects($event, $subject, $parsedParameters); + if (isset($parsedParameters['actor'])) { + $subject = $this->l->t('{file} downloaded via public link by {actor}'); } else { $subject = $this->l->t('{file} downloaded via public link'); - $this->setSubjects($event, $subject, $parsedParameters); + } + + $this->setSubjects($event, $subject, $parsedParameters); + if (isset($parsedParameters['remote-address-hash']['type'])) { $event = $this->eventMerger->mergeEvents('file', $event, $previousEvent); } } elseif ($event->getSubject() === self::SUBJECT_SHARED_FILE_BY_EMAIL_DOWNLOADED || @@ -92,20 +94,25 @@ protected function getParsedParameters(IEvent $event) { switch ($subject) { case self::SUBJECT_PUBLIC_SHARED_FILE_DOWNLOADED: case self::SUBJECT_PUBLIC_SHARED_FOLDER_DOWNLOADED: + $parsedParameters = [ + 'file' => $this->getFile($parameters[0], $event), + ]; + if (isset($parameters[1])) { - return [ - 'file' => $this->getFile($parameters[0], $event), - 'remote-address-hash' => [ - 'type' => 'highlight', - 'id' => $parameters[1], - 'name' => $parameters[1], - 'link' => '', - ], + $parsedParameters['remote-address-hash'] = [ + 'type' => 'highlight', + 'id' => $parameters[1], + 'name' => $parameters[1], + 'link' => '', ]; } - return [ - 'file' => $this->getFile($parameters[0], $event), - ]; + + if (isset($parameters[2])) { + $parsedParameters['actor'] = $this->getUser($parameters[2]); + } + + return $parsedParameters; + case self::SUBJECT_SHARED_FILE_BY_EMAIL_DOWNLOADED: case self::SUBJECT_SHARED_FOLDER_BY_EMAIL_DOWNLOADED: return [ diff --git a/apps/files_sharing/lib/Controller/ShareController.php b/apps/files_sharing/lib/Controller/ShareController.php index e2b607f8eb2f4..67adb7d7bb14f 100644 --- a/apps/files_sharing/lib/Controller/ShareController.php +++ b/apps/files_sharing/lib/Controller/ShareController.php @@ -31,7 +31,9 @@ use OCP\IRequest; use OCP\ISession; use OCP\IURLGenerator; +use OCP\IUser; use OCP\IUserManager; +use OCP\IUserSession; use OCP\Security\Events\GenerateSecurePasswordEvent; use OCP\Security\ISecureRandom; use OCP\Security\PasswordContext; @@ -47,6 +49,7 @@ #[OpenAPI(scope: OpenAPI::SCOPE_IGNORE)] class ShareController extends AuthPublicShareController { protected ?Share\IShare $share = null; + private ?IUser $currentUser = null; public const SHARE_ACCESS = 'access'; public const SHARE_AUTH = 'auth'; @@ -70,11 +73,17 @@ public function __construct( protected ISecureRandom $secureRandom, protected Defaults $defaults, private IPublicShareTemplateFactory $publicShareTemplateFactory, + IUserSession $userSession, ) { parent::__construct($appName, $request, $session, $urlGenerator); + + $this->currentUser = $userSession->getUser(); } /** + * @PublicPage + * @NoCSRFRequired + * * Show the authentication page * The form has to submit to the authenticate method route */ @@ -444,11 +453,11 @@ protected function singleFileDownloaded(Share\IShare $share, \OCP\Files\Node $no } else { if ($node instanceof \OCP\Files\File) { $subject = Downloads::SUBJECT_PUBLIC_SHARED_FILE_DOWNLOADED; - $parameters[] = $remoteAddressHash; } else { $subject = Downloads::SUBJECT_PUBLIC_SHARED_FOLDER_DOWNLOADED; - $parameters[] = $remoteAddressHash; } + $parameters[] = $remoteAddressHash; + $parameters[] = $this->currentUser?->getUID(); } $this->publishActivity($subject, $parameters, $share->getSharedBy(), $fileId, $userPath); diff --git a/apps/files_sharing/tests/Controller/ShareControllerTest.php b/apps/files_sharing/tests/Controller/ShareControllerTest.php index 45c0d54c9186f..486151e2f9211 100644 --- a/apps/files_sharing/tests/Controller/ShareControllerTest.php +++ b/apps/files_sharing/tests/Controller/ShareControllerTest.php @@ -38,6 +38,7 @@ use OCP\IURLGenerator; use OCP\IUser; use OCP\IUserManager; +use OCP\IUserSession; use OCP\Security\ISecureRandom; use OCP\Share\Exceptions\ShareNotFound; use OCP\Share\IPublicShareTemplateFactory; @@ -71,6 +72,7 @@ class ShareControllerTest extends \Test\TestCase { private IEventDispatcher&MockObject $eventDispatcher; private FederatedShareProvider&MockObject $federatedShareProvider; private IPublicShareTemplateFactory&MockObject $publicShareTemplateFactory; + private IUserSession&MockObject $userSession; protected function setUp(): void { parent::setUp(); @@ -114,6 +116,7 @@ protected function setUp(): void { $this->appConfig, ) ); + $this->userSession = $this->createMock(IUserSession::class); $this->shareController = new \OCA\Files_Sharing\Controller\ShareController( $this->appName, @@ -133,9 +136,9 @@ protected function setUp(): void { $this->secureRandom, $this->defaults, $this->publicShareTemplateFactory, + $this->userSession, ); - // Store current user $this->oldUser = \OC_User::getUser(); @@ -144,7 +147,7 @@ protected function setUp(): void { \OC::$server->getUserManager()->createUser($this->user, $this->user); \OC_Util::tearDownFS(); - $this->loginAsUser($this->user); + self::loginAsUser($this->user); } protected function tearDown(): void {