Spaces:
No application file
No application file
| namespace Mautic\AssetBundle\Controller; | |
| use Mautic\CoreBundle\Controller\FormController as CommonFormController; | |
| use Mautic\CoreBundle\Helper\CoreParametersHelper; | |
| use Symfony\Component\HttpFoundation\RedirectResponse; | |
| use Symfony\Component\HttpFoundation\Request; | |
| use Symfony\Component\HttpFoundation\Response; | |
| class PublicController extends CommonFormController | |
| { | |
| /** | |
| * @param string $slug | |
| * | |
| * @return Response | |
| */ | |
| public function downloadAction(Request $request, CoreParametersHelper $parametersHelper, $slug) | |
| { | |
| // find the asset | |
| /** @var \Mautic\AssetBundle\Model\AssetModel $model */ | |
| $model = $this->getModel('asset'); | |
| /** @var \Mautic\AssetBundle\Entity\Asset $entity */ | |
| $entity = $model->getEntityBySlugs($slug); | |
| if (!empty($entity)) { | |
| $published = $entity->isPublished(); | |
| // make sure the asset is published or deny access if not | |
| if ((!$published) && (!$this->security->hasEntityAccess('asset:assets:viewown', 'asset:assets:viewother', $entity->getCreatedBy()))) { | |
| $model->trackDownload($entity, $request, 401); | |
| return $this->accessDenied(); | |
| } | |
| // make sure URLs match up | |
| $url = $model->generateUrl($entity, false); | |
| $requestUri = $request->getRequestUri(); | |
| // remove query | |
| $query = $request->getQueryString(); | |
| if (!empty($query)) { | |
| $requestUri = str_replace("?{$query}", '', $url); | |
| } | |
| // redirect if they don't match | |
| if ($requestUri != $url) { | |
| $model->trackDownload($entity, $request, 301); | |
| return $this->redirect($url, 301); | |
| } | |
| if ($entity->isRemote()) { | |
| $model->trackDownload($entity, $request, 200); | |
| // Redirect to remote URL | |
| $response = new RedirectResponse($entity->getRemotePath()); | |
| } else { | |
| try { | |
| // set the uploadDir | |
| $entity->setUploadDir($parametersHelper->get('upload_dir')); | |
| $contents = $entity->getFileContents(); | |
| $model->trackDownload($entity, $request, 200); | |
| } catch (\Exception) { | |
| $model->trackDownload($entity, $request, 404); | |
| return $this->notFound(); | |
| } | |
| $response = new Response(); | |
| if ($entity->getDisallow()) { | |
| $response->headers->set('X-Robots-Tag', 'noindex, nofollow, noarchive'); | |
| } | |
| $response->headers->set('Content-Type', $entity->getFileMimeType()); | |
| // Display the file directly in the browser just for selected extensions | |
| $stream = $request->get('stream', in_array($entity->getExtension(), $this->coreParametersHelper->get('streamed_extensions'))); | |
| if (!$stream) { | |
| $response->headers->set('Content-Disposition', 'attachment;filename="'.$entity->getOriginalFileName()); | |
| } | |
| $response->setContent($contents); | |
| } | |
| return $response; | |
| } | |
| $model->trackDownload($entity, $request, 404); | |
| return $this->notFound(); | |
| } | |
| } | |