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 17b9c2a2196e1..10e3ddfd35b02 100644 --- a/apps/files_sharing/lib/Controller/ShareController.php +++ b/apps/files_sharing/lib/Controller/ShareController.php @@ -32,8 +32,10 @@ use OCP\IRequest; use OCP\ISession; use OCP\IURLGenerator; +use OCP\IUser; use OCP\IUserManager; use OCP\Security\Events\GenerateSecurePasswordEvent; +use OCP\IUserSession; use OCP\Security\ISecureRandom; use OCP\Security\PasswordContext; use OCP\Share; @@ -48,6 +50,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'; @@ -71,11 +74,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 */ @@ -511,11 +520,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 72a7614779184..a2c6f382ee46b 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; @@ -85,6 +86,8 @@ class ShareControllerTest extends \Test\TestCase { private $defaults; /** @var IPublicShareTemplateFactory|MockObject */ private $publicShareTemplateFactory; + /** @var IUserSession|MockObject */ + private $userSession; protected function setUp(): void { parent::setUp(); @@ -126,6 +129,8 @@ protected function setUp(): void { ) ); + $this->userSession = $this->createMock(IUserSession::class); + $this->shareController = new \OCA\Files_Sharing\Controller\ShareController( $this->appName, $this->createMock(IRequest::class), @@ -144,6 +149,7 @@ protected function setUp(): void { $this->secureRandom, $this->defaults, $this->publicShareTemplateFactory, + $this->userSession, );