Your IP : 216.73.216.85


Current Path : /home/smartconb/www/armencom33/components/com_eventgallery/src/Controller/
Upload File :
Current File : /home/smartconb/www/armencom33/components/com_eventgallery/src/Controller/DownloadController.php

<?php
/**
 * @package     Sven.Bluege
 * @subpackage  com_eventgallery
 *
 * @copyright   Copyright (C) 2005 - 2019 Sven Bluege All rights reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
namespace Svenbluege\Component\Eventgallery\Site\Controller;
use Joomla\CMS\Factory;
use Joomla\CMS\Filesystem\File;
use Joomla\CMS\Http\HttpFactory;
use Joomla\CMS\Log\Log;
use Joomla\CMS\Router\Route;
use Svenbluege\Component\Eventgallery\Site\Library\Common\Downloadlog;
use Svenbluege\Component\Eventgallery\Site\Library\Common\ImageProcessor;
use Svenbluege\Component\Eventgallery\Site\Library\Common\LogWorkaround;
use Svenbluege\Component\Eventgallery\Site\Library\Common\S3Client;
use Svenbluege\Component\Eventgallery\Site\Library\Factory\FileFactory;
use Svenbluege\Component\Eventgallery\Site\Library\Factory\OrderFactory;
use Svenbluege\Component\Eventgallery\Site\Library\File\S3File;
use Svenbluege\Component\Eventgallery\Site\Library\Folder\FlickrFolder;
use Svenbluege\Component\Eventgallery\Site\Library\Folder\GooglePhotosFolder;
use Svenbluege\Component\Eventgallery\Site\Library\Folder\GooglePhotosSharedPageFolder;
use Svenbluege\Component\Eventgallery\Site\Library\Folder\LocalFolder;
use Svenbluege\Component\Eventgallery\Site\Library\Folder\S3Folder;
use Svenbluege\Component\Eventgallery\Site\Library\ImageLineitem;
use Svenbluege\Component\Eventgallery\Site\Library\Lineitem;
use Svenbluege\Component\Eventgallery\Site\Library\Order;
use Svenbluege\Component\Eventgallery\Site\Library\OrderStatus;
use ZipArchive;

defined('_JEXEC') or die;



class DownloadController extends ResizeimageController
{

    const COM_EVENTGALLERY_LOGFILENAME = 'com_eventgallery_orderdownload.log.php';

    public function __construct($config = array())
    {
        parent::__construct($config);

        (new LogWorkaround())->registerLogger('com_eventgallery_formatted_text_logger', \Svenbluege\Component\Eventgallery\Site\Library\Common\FormattedTextLogger::class, true);
        Log::addLogger(
            array(
                'text_file' => self::COM_EVENTGALLERY_LOGFILENAME,
                'logger' => 'com_eventgallery_formatted_text_logger'
            ),
            Log::ALL,
            'com_eventgallery_orderdownload'
        );
    }

    public function loadEventgalleryConfig() {
        /**
         * @var JApplicationSite $app
         * @var \Joomla\Registry\Registry $registry
         */
        $app = Factory::getApplication();
        $params = $app->getParams();
        return \Svenbluege\Component\Eventgallery\Site\Library\Configuration\Main::getInstance($params);
    }

    /**
     * @param \Svenbluege\Component\Eventgallery\Site\Library\File\File $file
     * @param string $type
     * @return void
     */
    private function trackDownload($file, $userid, $reference, $type) {
        $eventgalleryConfig = $this->loadEventgalleryConfig();

        if (!$eventgalleryConfig->getGeneral()->isDownloadLogEnabled()) {
            return;
        }

        $row = Factory::getApplication()->bootComponent('com_eventgallery')->getMVCFactory()->createTable('Downloadlog', 'Administrator');

        /**
         * @var \Joomla\Application\Web\WebClient $client
         */
        $client = \Joomla\CMS\Factory::getApplication()->client;
        $isbot = $client->robot?1:0;
        $browser = $client->userAgent;

        $row->bind([
            "folder" => $file->getFolderName(),
            "file" => $file->getFileName(),
            "type" => $type,
            "reference" => $reference,
            "userid" => $userid,
            "isbot" => $isbot,
            "browser" => $browser
        ]);

        $result = $row->store();
    }

    public function redirectToUrl($url) {
        /**
         * @var Joomla\CMS\Application\SiteApplication $app
         */
        $app = Factory::getApplication();
        $app->redirect($url);
        $app->close();
    }

    public function display($cachable = false, $urlparams = array())
    {
        /**
         * @var JApplicationSite $app
         * @var \Joomla\Registry\Registry $registry
         */
        $app = Factory::getApplication();
        $eventgalleryConfig = $this->loadEventgalleryConfig();

        $str_folder = $app->input->getString('folder', null);
        $str_file = $app->input->getString('file', null);
        $is_sharing_download = $app->input->getBool('is_for_sharing', false);

        /**
         * @var FileFactory $fileFactory
         */
        $fileFactory = FileFactory::getInstance();

        $file = $fileFactory->getFile($str_folder, $str_file);

        $allowDownloadOfOriginalImage = $file->getFolder()->doAllowDownloadOfOriginalImage($eventgalleryConfig);
        $allowDownloadAtAll = $file->getFolder()->doAllowDownloadAtAll($eventgalleryConfig);
        $redirectUrl = $eventgalleryConfig->getSocial()->getRedirectURL();

        if (!is_object($file) || !$file->isPublished()) {
            throw new \Exception(\Joomla\CMS\Language\Text::_('COM_EVENTGALLERY_SINGLEIMAGE_NO_PUBLISHED_MESSAGE'), 404);
        }

        $folder = $file->getFolder();

        // Check of the user has the permission to grab the image
        if (!$folder->isPublished() || !$folder->isVisible() || !$folder->isAccessible()) {
            throw new \Exception(\Joomla\CMS\Language\Text::_('COM_EVENTGALLERY_EVENT_NO_PUBLISHED_MESSAGE'), 404);
        }

        // if this is a sharing URL and we don't allow the download until here,
        // we allow the download but disable the shared download.
        if ($is_sharing_download && !$allowDownloadAtAll) {
            $allowDownloadOfOriginalImage = false;
            $allowDownloadAtAll = true;
        }

        if (!$allowDownloadAtAll) {
            if (empty($redirectUrl)) {
                throw new \Exception(\Joomla\CMS\Language\Text::_('COM_EVENTGALLERY_EVENT_NO_DOWNLOAD_ALLOWED'), 403);
            }
            $this->redirectToUrl($redirectUrl);
        }

        // allow the download if at least one sharing type is enabled both global and for the event
        if (
                ($eventgalleryConfig->getSocial()->doUseFacebook() && $folder->getAttribs()->get('use_social_sharing_facebook', 1)==1)
            ||  ($eventgalleryConfig->getSocial()->doUseTwitter() && $folder->getAttribs()->get('use_social_sharing_twitter', 1)==1)
            ||  ($eventgalleryConfig->getSocial()->doUsePinterest() && $folder->getAttribs()->get('use_social_sharing_pinterest', 1)==1)
            ||  ($eventgalleryConfig->getSocial()->doUseEmail() && $folder->getAttribs()->get('use_social_sharing_email', 1)==1)
            ||  ($eventgalleryConfig->getSocial()->doUseDownload() && $folder->getAttribs()->get('use_social_sharing_download', 1)==1)

            ) {
        	// nothing to do there since the sharing options are fine.
        } else {
            $allowDownloadOfOriginalImage = false;
        }

        $user = \Joomla\CMS\Factory::getUser();
        if ($allowDownloadOfOriginalImage) {
            $this->trackDownload($file, $user->guest ? null : $user->id, "", Downloadlog::TYPE_DOWNLOAD_ORIGINAL);
        } else {
            $this->trackDownload($file, $user->guest ? null : $user->id, "", Downloadlog::TYPE_DOWNLOAD_FULL);
        }

        if ($file->getFolder()->getFolderType()->getId() == S3Folder::ID) {
            $this->downloadS3Image($allowDownloadOfOriginalImage, $is_sharing_download, $file);
        } else if (
            $file->getFolder()->getFolderType()->getId() == GooglePhotosFolder::ID
        OR $file->getFolder()->getFolderType()->getId() == GooglePhotosSharedPageFolder::ID) {
            /**
             * @var GooglePhotosFolder $file
             */
            $this->downloadGooglePhotosOriginalImage($file);

        } else {
            $this->downloadLocalImage($allowDownloadOfOriginalImage, $is_sharing_download, $file);
        }

    }

    /**
     * @param $doProvideOriginalImage
     * @param $is_sharing_download
     * @param \Svenbluege\Component\Eventgallery\Site\Library\File\File $file
     */
    private function downloadLocalImage($doProvideOriginalImage, $is_sharing_download, $file) {

        $basename = COM_EVENTGALLERY_IMAGE_FOLDER_PATH . $file->getFolderName() . '/';

        if ( $doProvideOriginalImage ) {

            // try the path to a possible original file
            $filename = $basename. COM_EVENTGALLERY_IMAGE_ORIGINAL_SUBFOLDER .'/'.$file->getFileName();

            if (!file_exists($filename)) {
                $filename = $basename . $file->getFileName();
            }

            $mime = ($mime = getimagesize($filename)) ? $mime['mime'] : $mime;
            $size = filesize($filename);
            $fp   = fopen($filename, "rb");
            if (!($mime && $size && $fp)) {
                // Error.
                return;
            }


            header("Content-type: " . $mime);
            header("Content-Length: " . $size);
            if (!$is_sharing_download) {
                header("Content-Disposition: attachment; filename=" . $file->getFileName());
            }
            header('Content-Transfer-Encoding: binary');
            header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
            fpassthru($fp);
            fclose($fp);
            return $this->endExecution();
        } else {
            if (!$is_sharing_download) {
                header("Content-Disposition: attachment; filename=" . $file->getFileName());
            }
            header('Content-Transfer-Encoding: binary');
            header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
            $this->renderThumbnail($file->getFolderName(), $file->getFileName(), COM_EVENTGALLERY_IMAGE_ORIGINAL_MAX_WIDTH);
            return $this->endExecution();
        }
    }

    /**
     * @param $doProvideOriginalImage
     * @param $is_sharing_download
     * @param S3File $file
     */
    private function downloadS3Image($doProvideOriginalImage, $is_sharing_download, $file) {

        $s3client = S3Client::getInstance();

        $joomlaConfig   = Factory::getConfig();
        $tempFileName =  tempnam($joomlaConfig->get('tmp_path'), 'eg');

        if ( $doProvideOriginalImage ) {
            $s3client->getObjectToFile(
                $s3client->getBucketForOriginalImages(),
                $file->getFolderName() . "/" . $file->getFileName(),
                $tempFileName
            );
        } else {
            $s3client->getObjectToFile(
                $s3client->getBucketForThumbnails(),
                $file->calculateS3Key(COM_EVENTGALLERY_IMAGE_ORIGINAL_MAX_WIDTH),
                $tempFileName
            );
        }

        $mime = ($mime = getimagesize($tempFileName)) ? $mime['mime'] : $mime;
        $size = filesize($tempFileName);
        $fp   = fopen($tempFileName, "rb");
        if (!($mime && $size && $fp)) {
            // Error.
            return $this->endExecution();
        }


        header("Content-type: " . $mime);
        header("Content-Length: " . $size);
        if (!$is_sharing_download) {
            header("Content-Disposition: attachment; filename=" . $file->getFileName());
        }
        header('Content-Transfer-Encoding: binary');
        header('Cache-Control: must-revalidate, post-check=0, pre-check=0');

        fpassthru($fp);
        fclose($fp);

        unlink($tempFileName);
        return $this->endExecution();
    }

    /**
     * @param $file GooglePhotosFolder
     */
    private function downloadGooglePhotosOriginalImage($file) {
        $joomlaConfig   = Factory::getConfig();
        $tempFileName =  tempnam($joomlaConfig->get('tmp_path'), 'eg');

        $download_file = file_get_contents($file->getGoogleImageUrl($file->getWidth()));

        $handle = fopen($tempFileName, "w");
        fwrite($handle, $download_file);
        fclose($handle);

        $mimeType = mime_content_type($tempFileName);
        $fileExtensnion = "";
        if ($mimeType == 'image/jpeg') {
            $fileExtensnion .= '.jpg';
        }

        $size = filesize($tempFileName);
        $fp   = fopen($tempFileName, "rb");
        if (!($mimeType && $size && $fp)) {
            // Error.
            return $this->endExecution();
        }

        header("Content-type: " . $mimeType);
        header("Content-Length: " . $size);

        header("Content-Disposition: attachment; filename=" . $file->getFileName().$fileExtensnion);

        header('Content-Transfer-Encoding: binary');
        header('Cache-Control: must-revalidate, post-check=0, pre-check=0');

        fpassthru($fp);
        fclose($fp);

        unlink($tempFileName);
        return $this->endExecution();
    }

    /**
     * allow to download small thumbnails in case a user did a order
     *
     * @throws Exception
     */
    public function mailthumb() {
        $app = Factory::getApplication();

        $str_orderid = $this->input->getString('orderid', null);
        $str_lineitemid = $this->input->getString('lineitemid', null);
        $str_token = $this->input->getString('token', null);


        /**
         * @var OrderFactory $orderFactory
         */
        $orderFactory = OrderFactory::getInstance();
        $order = $orderFactory->getOrderById($str_orderid);
        if ($order == null) {
            throw new \Exception("Invalid Request.");
        }

        if ($order->getToken() != $str_token) {
            throw new \Exception("Invalid Request.");
        }

        $lineitem = $order->getLineItem($str_lineitemid);
        if ($lineitem == null) {
            throw new \Exception("Invalid Request.");
        }

        if (strcmp($str_token, $order->getToken())!=0) {
            throw new \Exception("Invalid Request.");
        }

        $file = $lineitem->getFile();

        if ($file->getFolder()->getFolderType()->getId() == LocalFolder::ID) {
            $this->renderThumbnail($file->getFolderName(), $file->getFileName(), COM_EVENTGALLERY_IMAGE_THUMBNAIL_IN_CART_WIDTH);
            return $this->endExecution();
        } else if ($file->getFolder()->getFolderType()->getId() == GooglePhotosFolder::ID
            || $file->getFolder()->getFolderType()->getId() == GooglePhotosSharedPageFolder::ID) {
            /**
             * @var GooglePhotosFolder $file
             */
            $app->redirect($file->getGoogleImageUrl(104));
        }else {
            $app->redirect($file->getThumbUrl(104, 104));
        }

    }

    /**
     * This method is used to enable the download of files.
     *
     * @throws Exception
     */
    public function order() {

        $app = Factory::getApplication();

        $str_orderid = $this->input->getString('orderid', null);
        $str_lineitemid = $this->input->getString('lineitemid', null);
        $str_token = $this->input->getString('token', null);


        /**
         * @var OrderFactory $orderFactory
         */
        $orderFactory = OrderFactory::getInstance();
        $order = $orderFactory->getOrderById($str_orderid);
        if ($order == null) {
            throw new \Exception("Invalid Request.");
        }

        if ($order->getToken() != $str_token) {
            throw new \Exception("Invalid Request.");
        }

        $lineitem = $order->getLineItem($str_lineitemid);
        if ($lineitem == null) {
            throw new \Exception("Invalid Request.");
        }

        if (strcmp($str_token, $order->getToken())!=0) {
            throw new \Exception("Invalid Request.");
        }

        if ($order->getPaymentStatus()->getId() != OrderStatus::TYPE_PAYMENT_PAID) {
            throw new \Exception("Invalid Request.");
        }

        $file = $lineitem->getFile();

        $this->trackDownload($file, $order->getUserId(), $order->getId(), Downloadlog::TYPE_PURCHASE_FILE);

        if ($file->getFolder()->getFolderType()->getId() == LocalFolder::ID) {
            $this->handleLocalOrderDownload($file, $order, $lineitem);
        } elseif ($file->getFolder()->getFolderType()->getId() == S3Folder::ID) {
            $this->handleS3OrderDownload($file, $order, $lineitem);
        } elseif ($file->getFolder()->getFolderType()->getId() == GooglePhotosFolder::ID || $file->getFolder()->getFolderType()->getId() == GooglePhotosSharedPageFolder::ID) {
            $this->handleGooglePhotosOrderDownload($file, $order, $lineitem);
        } elseif ($file->getFolder()->getFolderType()->getId() == FlickrFolder::ID) {
            $this->handleViaProxy($file->getOriginalImageUrl(true), $file, $order, $lineitem);
        } else {
            $app->redirect($file->getOriginalImageUrl());
        }

    }

    /**
     * Allows to download the order as a zip file. It simply calls the order links for each image and adds the result to the zip file
     * Why? Because the order link will handle the resizing and we don't need to do it twice.
     *
     * @throws Exception
     */
    public function zip() {
        $str_orderid = $this->input->getString('orderid', null);
        $str_token = $this->input->getString('token', null);

        /**
         * @var OrderFactory $orderFactory
         */
        $orderFactory = OrderFactory::getInstance();
        $order = $orderFactory->getOrderById($str_orderid);
        if ($order == null) {
            throw new \Exception("Invalid Request.");
        }

        if ($order->getToken() != $str_token) {
            throw new \Exception("Invalid Request.");
        }

        if ($order->getPaymentStatus()->getId() != OrderStatus::TYPE_PAYMENT_PAID) {
            throw new \Exception("Invalid Request.");
        }

        $zip = new ZipArchive();
        $joomlaConfig   = Factory::getConfig();

        $tmpZipFilename = tempnam($joomlaConfig->get('tmp_path'), 'eg');


        if ($zip->open($tmpZipFilename, ZipArchive::OVERWRITE)!==TRUE) {
            exit("cannot open <$tmpZipFilename>\n");
        }

        foreach($order->getLineItems() as $lineitem) {


            /**
             * @var ImageLineitem $lineitem
             */

            if ($lineitem->getImageType()->isDigital()) {
                $file = $lineitem->getFile();

                $context = stream_context_create(
                    array(
                        'http' => array(
                            'follow_location' => true
                        )
                    )
                );

                $url = str_replace("/administrator", "",  Route::_("index.php?option=com_eventgallery&view=download&task=order&orderid=" . $order->getId() . "&lineitemid=" . $lineitem->getId() . "&token=" . $order->getToken(), false, -1));
                $download_file = false;
                $http_response_header = null;

                try{
                    $http = HttpFactory::getHttp();
                    $http->setOption('follow_location', true);
                    $response = $http->get($url);
                    $download_file = $response->body;
                    $http_response_header = $response->headers;

                } catch (\Exception $e) {
                    Log::add('error while getting image from url ' . $url . ' Error message: ' . $e->getMessage(), Log::INFO, 'com_eventgallery_orderdownload');
                }

                if ($download_file !== false) {

                    $fileuri = $file->getFolderName() . '/' . $order->getDocumentNumber(). '-' . $lineitem->getImageType()->getId() . '-' . $file->getFileName();

                    if (in_array($file->getFolder()->getFolderType()->getId(), [FlickrFolder::ID, GooglePhotosFolder::ID, GooglePhotosSharedPageFolder::ID])) {
                        $tmpfname = tempnam($joomlaConfig->get('tmp_path'), 'eg_dl');
                        $handle = fopen($tmpfname, "w");
                        fwrite($handle, $download_file);
                        fclose($handle);

                        $mimeType = mime_content_type($tmpfname);
                        if ($mimeType == 'image/jpeg') {
                            $fileuri .= '.jpg';
                        }

                        unlink($tmpfname);
                    }

                    $zip->addFromString($fileuri, $download_file);
                }
                unset($download_file);

            }

        }

        $zip->close();


        $size = filesize($tmpZipFilename);
        $fp   = fopen($tmpZipFilename, "rb");
        if (!($size && $fp)) {
            echo "Can't read zip file.";
            return $this->endExecution();
        }

        header("Pragma: public");
        header("Expires: 0");
        header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
        header("Cache-Control: public");
        header("Content-Description: File Transfer");
        header("Content-type: application/octet-stream");
        header("Content-Disposition: attachment; filename=" . $order->getDocumentNumber(). '.zip');
        header("Content-Transfer-Encoding: binary");
        header("Content-Length: ".$size);

        fpassthru($fp);
        fclose($fp);
        unlink($tmpZipFilename);
        return $this->endExecution();
    }


    /**
     * @param \Svenbluege\Component\Eventgallery\Site\Library\File\File $file
     * @param Order $order
     * @param ImageLineitem $lineitem
     */
    private function handleS3OrderDownload($file, $order, $lineitem) {
        $s3client = S3Client::getInstance();
        $tempFileName = JPATH_CACHE . '/' . $file->getFileName();
        $image_thumb_file = null;
        $s3client->getObjectToFile(
            $s3client->getBucketForOriginalImages(),
            $file->getFolderName() . "/" . $file->getFileName(),
            $tempFileName);

        $imageSize = intval($lineitem->getImageType()->getSize());
        $watermark = $lineitem->getImageType()->getWatermark();

        if ($imageSize>0 || $watermark!=null) {
            $imageProcessor = new ImageProcessor();
            $imageProcessor->loadImage($tempFileName);

            $joomlaConfig   = Factory::getConfig();
            $image_thumb_file = tempnam($joomlaConfig->get('tmp_path'), 'eg') . '.' . pathinfo($file->getFileName(), PATHINFO_EXTENSION);

            $imageProcessor->setTargetImageSize($imageSize>0?$imageSize:$file->getWidth(), -1, false);
            $imageProcessor->processImage(
                false,
                $watermark!=null,
                $watermark,
                false,
                false,
                null
            );
            $imageProcessor->saveThumbnail($image_thumb_file, 90);
            $imageProcessor->copyICCProfile($tempFileName, $image_thumb_file);
            $filename = $image_thumb_file;
        } else {
            $filename = $tempFileName;
        }

        $downloadFileName = File::makeSafe($order->getDocumentNumber(). '-' . $lineitem->getId() . '-' . $lineitem->getImageType()->getDisplayName(). '-' . $file->getFileName());

        header("Content-Disposition: attachment; filename=" . $downloadFileName);
        header('Content-Transfer-Encoding: binary');
        header('Cache-Control: must-revalidate, post-check=0, pre-check=0');

        $mime = ($mime = getimagesize($filename)) ? $mime['mime'] : $mime;
        $size = filesize($filename);
        $fp   = fopen($filename, "rb");
        if (!($mime && $size && $fp)) {
            // Error.
            return $this->endExecution();
        }

        header("Content-type: " . $mime);
        header("Content-Length: " . $size);
        fpassthru($fp);
        fclose($fp);

        if ($image_thumb_file != null) {
            unlink($image_thumb_file);
        }

        unlink($tempFileName);
        return $this->endExecution();
    }

    /**
     * @param \Svenbluege\Component\Eventgallery\Site\Library\File\File $file
     * @param Order $order
     * @param ImageLineitem $lineitem
     * @throws Exception
     */
    private function handleLocalOrderDownload($file, $order, $lineitem) {

        $imageSize = intval($lineitem->getImageType()->getSize());

        $downloadFileName = File::makeSafe($order->getDocumentNumber(). '-' . $lineitem->getId() . '-' . $lineitem->getImageType()->getDisplayName(). '-' . $file->getFileName());

        header("Content-Disposition: attachment; filename=" . $downloadFileName);
        header('Content-Transfer-Encoding: binary');
        header('Cache-Control: must-revalidate, post-check=0, pre-check=0');

        $watermark = $lineitem->getImageType()->getWatermark();
        if ($imageSize>0 || $watermark != null) {
            $this->renderThumbnail($file->getFolderName(), $file->getFileName(), $imageSize>0?$imageSize:$file->getWidth() , false, false, $watermark!=null, $watermark, false);
            return $this->endExecution();
        }

        $fileContent = $file->getOriginalFile();

        $finfo = new \finfo(FILEINFO_MIME_TYPE);
        $mimeType = $finfo->buffer($fileContent);

        header("Content-type: " . $mimeType);
        header("Content-Length: " .strlen($fileContent));
        echo $fileContent;

        return $this->endExecution();
    }

    /**
     * @param GooglePhotosFolder $file
     * @param Order $order
     * @param ImageLineitem $lineitem
     * @throws Exception
     */
    private function handleGooglePhotosOrderDownload($file, $order, $lineitem) {

        $url = $file->getGoogleImageUrl($file->getWidth());
        $this->handleViaProxy($url, $file, $order, $lineitem);
    }

    /**
     * @param $file \Svenbluege\Component\Eventgallery\Site\Library\File\File
     * @param $order Order
     * @param $lineitem Lineitem
     * @return void
     */
    public function handleViaProxy($url, $file, $order, $lineitem) {

        try{
            $http = HttpFactory::getHttp();
            $http->setOption('follow_location', false);
            $response = $http->get($url);
            $download_file = $response->body;
            $http_response_header = $response->headers;

        } catch (\Exception $e) {
            Log::add('handleViaProxy: error while getting image from url ' . $url . ' Error message: ' . $e->getMessage(), Log::INFO, 'com_eventgallery_orderdownload');
        }

        $joomlaConfig   = Factory::getConfig();

        $fileExtension = '';
        if ($http_response_header['content-type'] == 'image/jpeg') {
            $fileExtension.='.jpg';
        } else {
            $tempFileNameForMimeType = tempnam($joomlaConfig->get('tmp_path'), 'eg_dl');
            $handle = fopen($tempFileNameForMimeType, "w");
            fwrite($handle, $download_file);
            fclose($handle);

            $mimeType = mime_content_type($tempFileNameForMimeType);
            if ($mimeType == 'image/jpeg') {
                $fileExtension = '.jpg';
            }

            unlink($tempFileNameForMimeType);
        }
        $tempFileName = tempnam($joomlaConfig->get('tmp_path'), 'eg_dl').$fileExtension;
        $handle = fopen($tempFileName, "w");
        fwrite($handle, $download_file);
        fclose($handle);

        $imageSize = intval($lineitem->getImageType()->getSize());
        $watermark = $lineitem->getImageType()->getWatermark();

        if ($imageSize>0 || $watermark!=null) {
            $imageProcessor = new ImageProcessor();
            $imageProcessor->loadImage($tempFileName);

            $image_thumb_file = tempnam($joomlaConfig->get('tmp_path'), 'eg') . $fileExtension;

            $imageProcessor->setTargetImageSize($imageSize>0?$imageSize:$file->getWidth(), -1, false);
            $imageProcessor->processImage(
                false,
                $watermark!=null,
                $watermark,
                false,
                false,
                null
            );
            $imageProcessor->saveThumbnail($image_thumb_file, 90);
            $imageProcessor->copyICCProfile($tempFileName, $image_thumb_file);
            $filename = $image_thumb_file;
        } else {
            $filename = $tempFileName;
        }

        $downloadFileName = File::makeSafe($order->getDocumentNumber(). '-' . $lineitem->getId() . '-' . $lineitem->getImageType()->getDisplayName(). '-' . $file->getFileName() . $fileExtension);
        header("Content-Disposition: attachment; filename=" . $downloadFileName);
        header('Content-Transfer-Encoding: binary');
        header('Cache-Control: must-revalidate, post-check=0, pre-check=0');

        $mime = ($mime = getimagesize($filename)) ? $mime['mime'] : $mime;
        $size = filesize($filename);
        $fp   = fopen($filename, "rb");
        if (!($mime && $size && $fp)) {
            // Error.
            return $this->endExecution();
        }

        header("Content-type: " . $mime);
        header("Content-Length: " . $size);
        fpassthru($fp);
        fclose($fp);

        if ($image_thumb_file != null) {
            unlink($image_thumb_file);
        }

        unlink($tempFileName);
        return $this->endExecution();
    }

}