Skip to content

Commit bb80616

Browse files
committed
Internal: Get the stream of resource file using ResourceFileHelper::resolveResourceFileByAccessUrl
This ensures the verification of the document.access_url_specific_files setting
1 parent 6538535 commit bb80616

File tree

7 files changed

+51
-48
lines changed

7 files changed

+51
-48
lines changed

src/CoreBundle/Controller/Api/DownloadSelectedDocumentsAction.php

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
namespace Chamilo\CoreBundle\Controller\Api;
88

99
use Chamilo\CoreBundle\Entity\ResourceNode;
10+
use Chamilo\CoreBundle\Helpers\ResourceFileHelper;
1011
use Chamilo\CoreBundle\Repository\ResourceNodeRepository;
1112
use Chamilo\CoreBundle\Traits\ControllerTrait;
1213
use Chamilo\CourseBundle\Repository\CDocumentRepository;
@@ -29,6 +30,7 @@ public function __construct(
2930
private readonly KernelInterface $kernel,
3031
private readonly ResourceNodeRepository $resourceNodeRepository,
3132
private readonly CDocumentRepository $documentRepo,
33+
private readonly ResourceFileHelper $resourceFileHelper,
3234
) {}
3335

3436
/**
@@ -107,15 +109,17 @@ private function addNodeToZip(ZipStream $zip, ResourceNode $node, string $curren
107109
foreach ($node->getChildren() as $childNode) {
108110
$this->addNodeToZip($zip, $childNode, $relativePath);
109111
}
110-
} elseif ($node->hasResourceFile()) {
111-
foreach ($node->getResourceFiles() as $resourceFile) {
112-
$fileName = $currentPath.$resourceFile->getOriginalName();
113-
$stream = $this->documentRepo->getResourceNodeFileStream($node);
114112

115-
$zip->addFileFromStream($fileName, $stream);
116-
}
117-
} else {
118-
error_log('Node has no children or files: '.$node->getTitle());
113+
return;
114+
}
115+
116+
$resourceFile = $this->resourceFileHelper->resolveResourceFileByAccessUrl($node);
117+
118+
if ($resourceFile) {
119+
$fileName = $currentPath.$resourceFile->getOriginalName();
120+
$stream = $this->resourceNodeRepository->getResourceNodeFileStream($node, $resourceFile);
121+
122+
$zip->addFileFromStream($fileName, $stream);
119123
}
120124
}
121125
}

src/CoreBundle/Controller/DropboxController.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
namespace Chamilo\CoreBundle\Controller;
66

7+
use Chamilo\CoreBundle\Helpers\ResourceFileHelper;
78
use Chamilo\CoreBundle\Repository\ResourceNodeRepository;
89
use Chamilo\CourseBundle\Entity\CDropboxCategory;
910
use Chamilo\CourseBundle\Entity\CDropboxFeedback;
@@ -420,7 +421,7 @@ public function deleteCategory(int $id, Request $r): JsonResponse
420421
}
421422

422423
#[Route('/files/{id<\d+>}/download', name: 'dropbox_file_download', methods: ['GET'])]
423-
public function download(int $id, Request $r): Response
424+
public function download(int $id, Request $r, ResourceFileHelper $resourceFileHelper): Response
424425
{
425426
[$cid] = $this->context($r);
426427

@@ -431,7 +432,7 @@ public function download(int $id, Request $r): Response
431432

432433
// Resolve the resource file attached to this dropbox entry
433434
$resourceNode = $file->getResourceNode();
434-
$resourceFile = $resourceNode?->getFirstResourceFile();
435+
$resourceFile = $resourceFileHelper->resolveResourceFileByAccessUrl($resourceNode);
435436

436437
if (!$resourceFile) {
437438
throw $this->createNotFoundException('Resource file not found');

src/CoreBundle/Controller/ResourceController.php

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ public function view(
186186
);
187187
}
188188

189-
return $this->processFile($request, $resourceNode, 'show', $filter, $allUserInfo, $resourceFile);
189+
return $this->processFile($request, $resourceNode, $resourceFile, 'show', $filter, $allUserInfo);
190190
}
191191

192192
/**
@@ -236,6 +236,7 @@ public function download(
236236
Request $request,
237237
TrackEDownloadsRepository $trackEDownloadsRepository,
238238
ResourceFileHelper $resourceFileHelper,
239+
ResourceNodeRepository $resourceNodeRepository,
239240
): Response {
240241
$id = $request->get('id');
241242
$resourceNode = $this->getResourceNodeRepository()->findOneBy(['uuid' => $id]);
@@ -265,7 +266,7 @@ public function download(
265266
}
266267

267268
// Redirect to download single file.
268-
return $this->processFile($request, $resourceNode, 'download', '', null, $resourceFile);
269+
return $this->processFile($request, $resourceNode, $resourceFile, 'download', '', null);
269270
}
270271

271272
$zipName = $resourceNode->getSlug().'.zip';
@@ -298,7 +299,7 @@ public function download(
298299
}
299300

300301
$response = new StreamedResponse(
301-
function () use ($zipName, $children, $repo): void {
302+
function () use ($zipName, $children, $resourceFileHelper, $resourceNodeRepository): void {
302303
// Define suitable options for ZipStream Archive.
303304
$options = new Archive();
304305
$options->setContentType('application/octet-stream');
@@ -307,11 +308,10 @@ function () use ($zipName, $children, $repo): void {
307308

308309
/** @var ResourceNode $node */
309310
foreach ($children as $node) {
310-
$resourceFiles = $node->getResourceFiles();
311-
$resourceFile = $resourceFiles->filter(fn ($file) => null === $file->getAccessUrl())->first();
311+
$resourceFile = $resourceFileHelper->resolveResourceFileByAccessUrl($node);
312312

313313
if ($resourceFile) {
314-
$stream = $repo->getResourceNodeFileStream($node);
314+
$stream = $resourceNodeRepository->getResourceNodeFileStream($node, $resourceFile);
315315
$fileName = $resourceFile->getOriginalName();
316316
$zip->addFileFromStream($fileName, $stream);
317317
}
@@ -537,20 +537,14 @@ public function deleteVariant(int $id, EntityManagerInterface $em): JsonResponse
537537
return $this->json(['success' => true]);
538538
}
539539

540-
private function processFile(Request $request, ResourceNode $resourceNode, string $mode = 'show', string $filter = '', ?array $allUserInfo = null, ?ResourceFile $resourceFile = null): mixed
540+
private function processFile(Request $request, ResourceNode $resourceNode, ResourceFile $resourceFile, string $mode = 'show', string $filter = '', ?array $allUserInfo = null): mixed
541541
{
542542
$this->denyAccessUnlessGranted(
543543
ResourceNodeVoter::VIEW,
544544
$resourceNode,
545545
$this->trans('Unauthorised view access to resource')
546546
);
547547

548-
$resourceFile ??= $resourceNode->getResourceFiles()->first();
549-
550-
if (!$resourceFile) {
551-
throw $this->createNotFoundException($this->trans('File not found for resource'));
552-
}
553-
554548
$fileName = $resourceFile->getOriginalName();
555549
$fileSize = $resourceFile->getSize();
556550
$mimeType = $resourceFile->getMimeType() ?: '';

src/CoreBundle/Helpers/ResourceFileHelper.php

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,11 @@ public function __construct(
1919

2020
public function resolveResourceFileByAccessUrl(ResourceNode $resourceNode): ?ResourceFile
2121
{
22-
$accessUrlSpecificFiles = 'true' === $this->settingsManager->getSetting('document.access_url_specific_files')
22+
if (!$resourceNode->hasResourceFile()) {
23+
return null;
24+
}
25+
26+
$accessUrlSpecificFiles = 'true' === $this->settingsManager->getSetting('document.access_url_specific_files', true)
2327
&& $this->accessUrlHelper->isMultiple();
2428

2529
$resourceFile = null;

src/CoreBundle/Repository/ResourceNodeRepository.php

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
use Chamilo\CoreBundle\Entity\ResourceType;
1313
use Chamilo\CoreBundle\Entity\Session;
1414
use Chamilo\CoreBundle\Helpers\AccessUrlHelper;
15+
use Chamilo\CoreBundle\Helpers\ResourceFileHelper;
1516
use Chamilo\CoreBundle\Settings\SettingsManager;
1617
use Doctrine\ORM\EntityManagerInterface;
1718
use Gedmo\Tree\Entity\Repository\MaterializedPathRepository;
@@ -77,27 +78,27 @@ public function getResourceNodeFileContent(ResourceNode $resourceNode, ?Resource
7778

7879
return '';
7980
} catch (Throwable $throwable) {
80-
throw new FileNotFoundException($resourceNode->getTitle());
81+
throw new FileNotFoundException(null, 0, $throwable, $resourceNode->getTitle());
8182
}
8283
}
8384

8485
/**
85-
* @return false|resource
86+
* Get the file stream of a resource node's file.
87+
*
88+
* The value for $resourceFile must be set calling ResourceFileHelper::resolveResourceFileByAccessUrl()
89+
*
90+
* @see ResourceFileHelper::resolveResourceFileByAccessUrl()
91+
*
92+
* @return resource|null
8693
*/
87-
public function getResourceNodeFileStream(ResourceNode $resourceNode, ?ResourceFile $resourceFile = null)
94+
public function getResourceNodeFileStream(ResourceNode $resourceNode, ResourceFile $resourceFile)
8895
{
8996
try {
90-
$resourceFile ??= $resourceNode->getResourceFiles()->first();
91-
92-
if ($resourceFile) {
93-
$fileName = $this->getFilename($resourceFile);
94-
95-
return $this->getFileSystem()->readStream($fileName);
96-
}
97+
$fileName = $this->getFilename($resourceFile);
9798

98-
return false;
99+
return $this->getFileSystem()->readStream($fileName);
99100
} catch (Throwable $exception) {
100-
throw new FileNotFoundException($resourceNode->getTitle());
101+
throw new FileNotFoundException(null, 0, $exception, $resourceNode->getTitle());
101102
}
102103
}
103104

@@ -138,7 +139,7 @@ public function getResourceFileUrl(?ResourceNode $resourceNode, array $extraPara
138139

139140
return '';
140141
} catch (Throwable $exception) {
141-
throw new FileNotFoundException($resourceNode->getTitle());
142+
throw new FileNotFoundException(null, 0, $exception, $resourceNode->getTitle());
142143
}
143144
}
144145

src/CoreBundle/Repository/ResourceRepository.php

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -583,14 +583,6 @@ public function getResourceNodeFileContent(ResourceNode $resourceNode): string
583583
return $this->resourceNodeRepository->getResourceNodeFileContent($resourceNode);
584584
}
585585

586-
/**
587-
* @return false|resource
588-
*/
589-
public function getResourceNodeFileStream(ResourceNode $resourceNode)
590-
{
591-
return $this->resourceNodeRepository->getResourceNodeFileStream($resourceNode);
592-
}
593-
594586
public function getResourceFileDownloadUrl(AbstractResource $resource, array $extraParams = [], ?int $referenceType = null): string
595587
{
596588
$extraParams['mode'] = 'download';

src/CoreBundle/State/MessageProcessor.php

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
use Chamilo\CoreBundle\Entity\MessageAttachment;
1414
use Chamilo\CoreBundle\Entity\MessageRelUser;
1515
use Chamilo\CoreBundle\Entity\User;
16+
use Chamilo\CoreBundle\Helpers\ResourceFileHelper;
1617
use Chamilo\CoreBundle\Repository\ResourceNodeRepository;
1718
use Doctrine\ORM\EntityManagerInterface;
1819
use LogicException;
@@ -30,6 +31,7 @@ public function __construct(
3031
private EntityManagerInterface $entityManager,
3132
private ResourceNodeRepository $resourceNodeRepository,
3233
private Security $security,
34+
private ResourceFileHelper $resourceFileHelper,
3335
) {}
3436

3537
public function process($data, Operation $operation, array $uriVariables = [], array $context = []): ?Message
@@ -98,9 +100,14 @@ private function saveNotificationForInboxMessage(Message $message): void
98100

99101
/** @var MessageAttachment $messageAttachment */
100102
foreach ($message->getAttachments() as $messageAttachment) {
101-
$stream = $this->resourceNodeRepository->getResourceNodeFileStream(
102-
$messageAttachment->resourceNode
103-
);
103+
$resourceNode = $messageAttachment->getResourceNode();
104+
$resourceFile = $this->resourceFileHelper->resolveResourceFileByAccessUrl($resourceNode);
105+
106+
if (!$resourceFile) {
107+
continue;
108+
}
109+
110+
$stream = $this->resourceNodeRepository->getResourceNodeFileStream($resourceNode, $resourceFile);
104111

105112
$attachmentList[] = [
106113
'stream' => $stream,

0 commit comments

Comments
 (0)