|
15 | 15 | use PhpList\WebFrontend\Service\LanguageService; |
16 | 16 | use PhpList\WebFrontend\Service\PublicSubscribeFormBuilder; |
17 | 17 | use PhpList\WebFrontend\Service\PublicSubscribeFormValidator; |
| 18 | +use RuntimeException; |
18 | 19 | use Symfony\Component\DependencyInjection\Attribute\Autowire; |
19 | 20 | use Symfony\Component\HttpFoundation\Request; |
20 | 21 | use Symfony\Component\HttpFoundation\Response; |
@@ -65,19 +66,26 @@ public function unsubscribe(Request $request, int $pageId): Response |
65 | 66 | ]); |
66 | 67 | } |
67 | 68 |
|
68 | | - #[Route('/subscribe/styles/{fileName}', name: 'subscribe_styles')] |
69 | | - public function getStylesheets(string $fileName): Response |
70 | | - { |
71 | | - $applicationRoot = (new ApplicationStructure())->getApplicationRoot(); |
72 | | - return $this->file($applicationRoot . '/public/build/' . $fileName); |
73 | | - } |
74 | | - |
75 | | - #[Route('/subscribe/images/{fileName}', name: 'subscribe_images')] |
76 | | - #[Route('/unsubscribe/images/{fileName}', name: 'unsubscribe_images')] |
| 69 | + #[Route('/subscribe/images/{fileName}', name: 'sub_images', requirements: ['fileName' => '[A-Za-z0-9._-]+'])] |
| 70 | + #[Route('/subscribe/styles/{fileName}', name: 'sub_styles', requirements: ['fileName' => '[A-Za-z0-9._-]+'])] |
| 71 | + #[Route('/unsubscribe/images/{fileName}', name: 'unsub_images', requirements: ['fileName' => '[A-Za-z0-9._-]+'])] |
77 | 72 | public function getImages(string $fileName): Response |
78 | 73 | { |
79 | 74 | $applicationRoot = (new ApplicationStructure())->getApplicationRoot(); |
80 | | - return $this->file($applicationRoot . '/public/' . $fileName); |
| 75 | + |
| 76 | + $baseDir = realpath($applicationRoot . '/public/build'); |
| 77 | + |
| 78 | + if ($baseDir === false) { |
| 79 | + throw new RuntimeException('Build directory not found.'); |
| 80 | + } |
| 81 | + |
| 82 | + $path = realpath($baseDir . DIRECTORY_SEPARATOR . $fileName); |
| 83 | + |
| 84 | + if ($path === false || !str_starts_with($path, $baseDir . DIRECTORY_SEPARATOR)) { |
| 85 | + throw $this->createNotFoundException(); |
| 86 | + } |
| 87 | + |
| 88 | + return $this->file($path); |
81 | 89 | } |
82 | 90 |
|
83 | 91 | #[Route('/subscribe/{pageId}', name: 'subscribe', requirements: ['pageId' => '\d+'], methods: ['GET', 'POST'])] |
|
0 commit comments