Seditio Source
Root |
./othercms/elxis_5.3_atlas_rev2452/components/com_emedia/controllers/connector.php
<?php
/**
* @version        $Id: connector.php 1788 2016-02-16 17:50:05Z sannosi $
* @package        Elxis
* @subpackage    Component eMedia
* @copyright    Copyright (c) 2006-2019 Elxis CMS (http://www.elxis.org). All rights reserved.
* @license        Elxis Public License ( http://www.elxis.org/elxis-public-license.html )
* @author        Elxis Team ( http://www.elxis.org )
* @description     Elxis CMS is free software. Read the license for copyright notices and details
*/

defined('_ELXIS_') or die ('Direct access to this location is not allowed');


class
connectorMediaControl extends emediaController {

   
/*********************/
    /* MAGIC CONSTRUCTOR */
    /*********************/
   
public function __construct($view=null) {
       
parent::__construct($view);
    }


   
/*****************************/
    /* INITIATE JS-PHP CONNECTOR */
    /*****************************/
   
public function connect() {
        if (isset(
$_GET['mode'])) {
           
$mode = trim(filter_input(INPUT_GET, 'mode', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH));
        } else if (isset(
$_POST['mode'])) {
           
$mode = trim(filter_input(INPUT_POST, 'mode', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH));
        } else {
           
$mode = '';
        }

        if (
$mode == '') {
           
$msg = eFactory::getLang()->get('INVALID_REQUEST');
           
$this->view->errorResponse($msg);
        }

        switch (
$mode) {
            case
'getinfo': $this->getinfo(); break;
            case
'getfolder': $this->getfolder(); break;
            case
'rename': $this->rename(); break;
            case
'move': $this->move(); break;
            case
'delete': $this->delete(); break;
            case
'addfolder': $this->addfolder(); break;
            case
'download': $this->download(); break;
            case
'preview': $this->preview(); break;
            case
'add': $this->uploadFile(); break;
            case
'replace': $this->replaceFile(); break;
           
//case 'compress': $this->compressFolder(); break;//replaced by mode "download" => dir
           
case 'resize': $this->resizeImage(); break; //developed by i.sannos
           
case 'editfile': //not used
           
case 'savefile': //not used
           
default:
               
$msg = eFactory::getLang()->get('INVALID_REQUEST');
               
$this->view->errorResponse($msg);
            break;
        }
    }


   
/*************************************/
    /* GET INFORMATION FOR A FILE/FOLDER */
    /*************************************/
   
private function getinfo() {
       
$path = $this->getPath();

        if (
$path === false) {
           
$msg = eFactory::getLang()->get('PATH_NOT_EXIST');
           
$this->view->errorResponse($msg);
        }

        if (!
file_exists(ELXIS_PATH.'/'.$this->relpath.$path)) {
           
$msg = eFactory::getLang()->get('FILE_NOT_FOUND');
           
$this->view->errorResponse($msg);
        }

       
$item = $this->get_file_info($path, false);
       
$response = array(
           
'Path'=> $path,
           
'Filename' => $item['Filename'],
           
'File_Type'=> $item['File_Type'],
           
'Protected'=> $item['Protected'],
           
'Preview' => $item['Preview'],
           
'Properties' => $item['Properties'],
           
'Error' => '',
           
'Code' => 0
       
);

       
$this->view->jsonResponse($response);
    }


   
/**********************************/
    /* GET RELATIVE PATH FROM REQUEST */
    /**********************************/
   
private function getPath() {
       
$path = rawurldecode(filter_input(INPUT_GET, 'path', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH));
       
$path = preg_replace('~/+~', '/', $path); //remove multiple slashes
       
$path = ltrim($path, '/');
       
$path = str_replace('..', '', $path);
        if (!
file_exists(ELXIS_PATH.'/'.$this->relpath.$path)) { return false; }
        return
$path;
    }


   
/******************************/
    /* GET INFORMATION FOR A FILE */
    /******************************/
   
private function get_file_info($path, $folder_view=false) {
       
$elxis = eFactory::getElxis();
       
$eDate = eFactory::getDate();
       
$eLang = eFactory::getLang();

       
$item = array();
       
$item['Properties'] = array(
           
'Date_Created' => null,
           
'Date_Modified' => null,
           
'filemtime' => 0,
           
'filectime' => 0,
           
'Height' => 0,
           
'Width' => 0,
           
'Size' => 0
       
);
       
$item['Capabilities'] = array('select', 'delete', 'rename');
       
$item['Protected'] = 0;

       
$tmp = explode('/', $path);
       
$item['Filename'] = $tmp[(count($tmp)-1)];

       
$tmp = explode('.', $item['Filename']);
       
$item['File_Type'] = $tmp[(count($tmp)-1)];
       
$item['Properties']['filemtime'] = filemtime(ELXIS_PATH.'/'.$this->relpath.$path);
       
$item['Properties']['filectime'] = filectime(ELXIS_PATH.'/'.$this->relpath.$path);

        if (
is_dir(ELXIS_PATH.'/'.$this->relpath.$path)) {
           
$item['Preview'] = $elxis->secureBase().'/components/com_emedia/images/fileicons/_Open.png';
           
$item['Capabilities'][] = 'download';
        } else if (
in_array(strtolower($item['File_Type']), array('jpeg', 'jpg', 'jpe', 'gif', 'png'))) {
           
$item['Capabilities'][] = 'resize';
           
$item['Capabilities'][] = 'download';
           
$item['Capabilities'][] = 'move';
           
$item['Properties']['Size'] = filesize(ELXIS_PATH.'/'.$this->relpath.$path);

            if ((
$folder_view == true) && ($item['Properties']['Size'] > 30000)) {
               
$item['Preview'] = $elxis->makeAURL('emedia:connect/', 'inner.php').'?mode=preview&path='.rawurlencode($path).'&thumbnail=true';
            } else {
               
$item['Preview'] = $elxis->secureBase().'/'.$this->relpath.$path;
            }
             
$info = getimagesize(ELXIS_PATH.'/'.$this->relpath.$path);
             
$item['Properties']['Width'] = (int)$info[0];
             
$item['Properties']['Height'] = (int)$info[1];
        } else if(
file_exists(ELXIS_PATH.'/components/com_emedia/images/fileicons/'.strtolower($item['File_Type']).'.png')) {
           
$item['Capabilities'][] = 'download';
           
$item['Capabilities'][] = 'move';
           
$item['Preview'] = $elxis->secureBase().'/components/com_emedia/images/fileicons/'.strtolower($item['File_Type']).'.png';
           
$item['Properties']['Size'] = filesize(ELXIS_PATH.'/'.$this->relpath.$path);
        } else {
           
$item['Preview'] = $elxis->secureBase().'/components/com_emedia/images/fileicons/default.png';
           
$item['Capabilities'][] = 'download';
           
$item['Capabilities'][] = 'move';
           
$item['Properties']['Size'] = filesize(ELXIS_PATH.'/'.$this->relpath.$path);
        }

       
$item['Properties']['Date_Created'] = $eDate->formatTS($item['Properties']['filectime'], $eLang->get('DATE_FORMAT_4'));
       
$item['Properties']['Date_Modified'] = $eDate->formatTS($item['Properties']['filemtime'], $eLang->get('DATE_FORMAT_4'));

        return
$item;
    }


   
/************************/
    /* LOAD FOLDER CONTENTS */
    /************************/
   
public function getfolder() {
       
$eFiles = eFactory::getFiles();
       
$elxis = eFactory::getElxis();
       
$eDate = eFactory::getDate();
       
$eLang = eFactory::getLang();

       
$response = array();
       
$path = $this->getPath();

        if (
$path === false) {
           
$msg = eFactory::getLang()->get('PATH_NOT_EXIST');
           
$this->view->errorResponse($msg);
        }

       
$current_path = ELXIS_PATH.'/'.$this->relpath.$path;

       
$loadfiles = true;
        if (isset(
$_GET['tree']) && ($_GET['tree'] == 1)) {
            if (
$this->tree_show_files == 0) { $loadfiles = false; }
        }
       
$filesDir = ($loadfiles) ? $eFiles->listFiles($this->relpath.$path) : array();
       
$foldersDir = $eFiles->listFolders($this->relpath.$path);
       
$previewPath = $elxis->secureBase().'/components/com_emedia/images/fileicons/_Open.png';

        if (
$foldersDir) {
           
sort($foldersDir);
            foreach(
$foldersDir as $folder) {
               
$relpath = $path.$folder.'/';
               
$cts = filectime(ELXIS_PATH.'/'.$this->relpath.$relpath);
               
$mts = filemtime(ELXIS_PATH.'/'.$this->relpath.$relpath);

               
$response[$relpath] = array(
                   
'Path' => $relpath,
                   
'Filename' => $folder,
                   
'File_Type' => 'dir',
                   
'Protected' => 0,
                   
'Preview' => $previewPath,
                   
'Properties' => array(
                       
'Date_Created' => $eDate->formatTS($cts, $eLang->get('DATE_FORMAT_4')),
                       
'Date_Modified' => $eDate->formatTS($mts, $eLang->get('DATE_FORMAT_4')),
                       
'filemtime' => $mts,
                       
'Height' => 0,
                       
'Width' => 0,
                       
'Size' => 0
                   
),
                   
'Capabilities' => array('select', 'delete', 'rename', 'compress'),
                   
'Error' => '',
                   
'Code' => 0
               
);
            }
        }

        if (
$filesDir) {
           
sort($filesDir);
            foreach(
$filesDir as $file) {
               
$relpath = $path.$file;
               
$item = $this->get_file_info($relpath, true);
               
$response[$relpath] = array(
                   
'Path' => $relpath,
                   
'Filename' => $item['Filename'],
                   
'File_Type' => $item['File_Type'],
                   
'Protected' => $item['Protected'],
                   
'Preview' => $item['Preview'],
                   
'Properties' => $item['Properties'],
                   
'Capabilities' => $item['Capabilities'],
                   
'Error' => '',
                   
'Code' => 0
               
);
            }
        }

       
$this->view->jsonResponse($response);
    }


   
/************************/
    /* RENAME FILE / FOLDER */
    /************************/
   
private function rename() {
       
$elxis = eFactory::getElxis();
       
$eFiles = eFactory::getFiles();

        if (
$elxis->acl()->check('com_emedia', 'files', 'edit') < 1) {
           
$msg = eFactory::getLang()->get('NOTALLOWACTION');
           
$this->view->errorResponse($msg);
        }

       
$old = rawurldecode(filter_input(INPUT_GET, 'old', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH));
       
$new = rawurldecode(filter_input(INPUT_GET, 'new', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH));
       
$old = str_replace('..', '', $old);
       
$old = str_replace('//', '/', $old);
       
$new = str_replace('..', '', $new);
       
$new = preg_replace('/[^a-zA-Z0-9\_\-\.]/', '', $new);

        if ((
$old == '') || ($old == '/')) {
           
$msg = eFactory::getLang()->get('NO_FILE_SELECTED');
           
$this->view->errorResponse($msg);
        }

        if (!
file_exists(ELXIS_PATH.'/'.$this->relpath.$old)) {
           
$msg = eFactory::getLang()->get('FILE_NOT_FOUND');
           
$this->view->errorResponse($msg);
        }

       
$suffix = '';
       
$is_folder = false;
        if (
substr($old, -1, 1) == '/') { //folder
           
$old = substr($old, 0, (strlen($old)-1));
           
$suffix = '/';
           
$is_folder = true;
        } else {
           
$exts = $this->allowedExtensions();
           
$ext = strtolower($eFiles->getExtension($old));
            if ((
$ext == '') || !in_array($ext, $exts)) {
               
$msg = eFactory::getLang()->get('FORBIDDEN_FILE_TYPE');
               
$this->view->errorResponse($msg);
            }
            unset(
$exts);
        }

       
$tmp = explode('/', $old);
       
$filename = $tmp[(count($tmp)-1)];
       
$path = str_replace('/'.$filename, '', $old);

        if (
$is_folder) {
            if ((
$new == '') || ($new != $_GET['new'])) {
               
$msg = eFactory::getLang()->get('INVALID_FOLDER_NAME');
               
$this->view->errorResponse($msg);
            }

            if (
is_dir(ELXIS_PATH.'/'.$this->relpath.$path.'/'.$new.'/')) {
               
$msg = eFactory::getLang()->get('FOLDER_NAME_EXISTS');
               
$this->view->errorResponse($msg);
            }            
        } else {
            if ((
$new == '') || ($new != $_GET['new'])) {
               
$msg = eFactory::getLang()->get('INVALID_FILE_NAME');
               
$this->view->errorResponse($msg);
            }

            if (
file_exists(ELXIS_PATH.'/'.$this->relpath.$path.'/'.$new)) {
               
$msg = eFactory::getLang()->get('FILE_NAME_EXISTS');
               
$this->view->errorResponse($msg);
            }

           
$exts = $this->allowedExtensions();
           
$ext = strtolower($eFiles->getExtension($new));
            if ((
$ext == '') || !in_array($ext, $exts)) {
               
$msg = eFactory::getLang()->get('INVALID_FILE_NAME');
               
$this->view->errorResponse($msg);
            }
            unset(
$exts);
        }

        if (
$is_folder) {
           
$ok = $eFiles->moveFolder($this->relpath.$old.'/', $this->relpath.$path.'/'.$new.'/');
        } else {
           
$ok = $eFiles->move($this->relpath.$old, $this->relpath.$path.'/'.$new);
        }

        if (!
$ok) {
           
$msg = eFactory::getLang()->get('RENAME_FAILED');
           
$this->view->errorResponse($msg);
        }

       
$response = array('Error' => '', 'Code' => 0, 'Old_Path' => $old, 'Old_Name' => $filename, 'New_Path' => urlencode($path.'/'.$new.$suffix), 'New_Name' => $new);
       
$this->view->jsonResponse($response);
    }


   
/********************/
    /* MOVE FILE/FOLDER */
    /********************/
   
private function move() {
       
$elxis = eFactory::getElxis();
       
$eFiles = eFactory::getFiles();

        if (
$elxis->acl()->check('com_emedia', 'files', 'edit') < 1) {
           
$msg = eFactory::getLang()->get('NOTALLOWACTION');
           
$this->view->errorResponse($msg);
        }

       
$old = rawurldecode(filter_input(INPUT_GET, 'old', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH));
       
$new = rawurldecode(filter_input(INPUT_GET, 'new', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH));
       
$old = str_replace('..', '', $old);
       
$old = str_replace('//', '/', $old);
       
$old = str_replace('\\', '/', $old);
       
$new = str_replace('..', '', $new);
       
$new = str_replace('\\', '/', $new);
       
$new = preg_replace('/[^a-zA-Z0-9\_\-\.\/]/', '', $new);
       
$new = trim($new, '/');
       
$new .= '/';

        if ((
$old == '') || ($old == '/')) {
           
$msg = eFactory::getLang()->get('NO_FILE_SELECTED');
           
$this->view->errorResponse($msg);
        }
        if ((
$old == 'images/') || ($old == 'videos/') || ($old == 'audio/')) {
           
$msg = eFactory::getLang()->get('NOTALLOWACTION');
           
$this->view->errorResponse($msg);
        }

        if (!
file_exists(ELXIS_PATH.'/'.$this->relpath.$old)) {
           
$msg = eFactory::getLang()->get('FILE_NOT_FOUND');
           
$this->view->errorResponse($msg);
        }

        if ((
strpos($old, '.') === false) || is_dir(ELXIS_PATH.'/'.$this->relpath.$old)) {
           
$this->view->errorResponse('You can only move regular files, not folders!');
           
$this->view->errorResponse($msg);
        }

        if ((
$new == '') || ($new != $_GET['new'])) {
           
$msg = eFactory::getLang()->get('INVALID_FOLDER_NAME');
           
$this->view->errorResponse($msg);
        }

        if (!
file_exists(ELXIS_PATH.'/'.$this->relpath.$new) || !is_dir(ELXIS_PATH.'/'.$this->relpath.$new)) {
           
$msg = eFactory::getLang()->get('PATH_NOT_EXIST').' '.$this->relpath.$new;
           
$this->view->errorResponse($msg);
        }

       
$fname = basename($old);
        if (
file_exists(ELXIS_PATH.'/'.$this->relpath.$new.$fname)) {
           
$msg = 'There is already a file named '.$fname.' in folder '.$new;
           
$this->view->errorResponse($msg);
        }
       
       
$ok = $eFiles->move($this->relpath.$old, $this->relpath.$new.$fname);
        if (!
$ok) {
           
$msg = eFactory::getLang()->get('ACTION_FAILED');
           
$this->view->errorResponse($msg);
        }

       
$response = array('Error' => '', 'Code' => 0, 'Old_Path' => $old, 'Old_Name' => $fname, 'New_Path' => $new, 'New_Name' => $fname);
       
$this->view->jsonResponse($response);
    }



   
/************************/
    /* DELETE FILE / FOLDER */
    /************************/
   
private function delete() {
       
$elxis = eFactory::getElxis();
       
$eFiles = eFactory::getFiles();

        if (
$elxis->acl()->check('com_emedia', 'files', 'edit') < 1) {
           
$msg = eFactory::getLang()->get('NOTALLOWACTION');
           
$this->view->errorResponse($msg);
        }

       
$path = $this->getPath();

        if ((
$path === false) || ($path == '') || ($path == '/')) {
           
$msg = eFactory::getLang()->get('FILE_NOT_FOUND');
           
$this->view->errorResponse($msg);
        }

        if ((
strpos($path, '..') !== false) || ($path == 'audio/') || ($path == 'images/') || ($path == 'videos/')) {
           
$msg = eFactory::getLang()->get('NOTALLOWACTION');
           
$this->view->errorResponse($msg);
        }

        if (
is_dir(ELXIS_PATH.'/'.$this->relpath.$path)) {
           
$ok = $eFiles->deleteFolder($this->relpath.$path);
        } else {
           
$exts = $this->allowedExtensions();
           
$ext = strtolower($eFiles->getExtension($path));
            if ((
$ext == '') || !in_array($ext, $exts)) {
               
$msg = eFactory::getLang()->get('FORBIDDEN_FILE_TYPE');
               
$this->view->errorResponse($msg);
            }
           
$ok = $eFiles->deleteFile($this->relpath.$path);
        }

        if (!
$ok) {
           
$msg = eFactory::getLang()->get('DELETE_FAILED');
           
$this->view->errorResponse($msg);
        }

       
$response = array('Error' => '', 'Code' => 0, 'Path' => $path);
       
$this->view->jsonResponse($response);
    }


   
/***********************/
    /* CREATE A NEW FOLDER */
    /***********************/
   
private function addfolder() {
       
$elxis = eFactory::getElxis();
       
$eFiles = eFactory::getFiles();

        if (
$elxis->acl()->check('com_emedia', 'files', 'edit') < 1) {
           
$msg = eFactory::getLang()->get('NOTALLOWACTION');
           
$this->view->errorResponse($msg);
        }

       
$path = $this->getPath();
        if (
$path === false) {
           
$msg = eFactory::getLang()->get('PATH_NOT_EXIST');
           
$this->view->errorResponse($msg);
        }

        if (
$path == '') {
           
//do nothing
       
} else if ($path == '/') {
           
$path = '';
        } else if (!
preg_match('#\/$#', $path)) {
           
$path .= '/';
        }

       
$name = rawurldecode(filter_input(INPUT_GET, 'name', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH));
       
$name = str_replace('..', '', $name);
       
$name = preg_replace('/[_]+/', '_', $name); //remove double underscore
       
$name = trim($name, '/');
       
$name = preg_replace('/[^a-zA-Z0-9\_\-]/', '', $name);
        if ((
$name == '') || ($name != $_GET['name']) || (strlen($name) < 3)) {
           
$msg = eFactory::getLang()->get('INVALID_FOLDER_NAME');
           
$this->view->errorResponse($msg);
        }

        if (
is_dir(ELXIS_PATH.'/'.$this->relpath.$path.$name.'/')) {
           
$msg = eFactory::getLang()->get('FOLDER_NAME_EXISTS');
           
$this->view->errorResponse($msg);
        }

       
$ok = $eFiles->createFolder($this->relpath.$path.$name.'/');
        if (!
$ok) {
           
$msg = sprintf(eFactory::getLang()->get('CNOT_CREATE_FOLDER'), $name);
           
$this->view->errorResponse($msg);
        }

       
$response = array('Parent' => $path, 'Name' => $name, 'Error' => '', 'Code' => 0);
       
$this->view->jsonResponse($response);
    }


   
/*****************/
    /* DOWNLOAD FILE */
    /*****************/
   
private function download() {
       
$eFiles = eFactory::getFiles();

       
$path = $this->getPath();
        if (
$path === false) {
           
$msg = eFactory::getLang()->get('FILE_NOT_FOUND');
           
$this->view->errorResponse($msg);
        }

        if ((
strpos($path, '..') !== false) || ($path == '') || ($path == '/')) {
           
$msg = eFactory::getLang()->get('NOTALLOWACTION');
           
$this->view->errorResponse($msg);
        }

        if (!
file_exists(ELXIS_PATH.'/'.$this->relpath.$path)) {
           
$msg = eFactory::getLang()->get('FILE_NOT_FOUND');
           
$this->view->errorResponse($msg);
        }

        if (
is_dir(ELXIS_PATH.'/'.$this->relpath.$path)) {
           
$tmp_path = $eFiles->elxisPath('tmp/', true);
           
$name = basename($this->relpath.$path);
            if (
file_exists($tmp_path.$name.'.zip')) { $name = $name.'_'.time(); }

           
$zip = eFactory::getElxis()->obj('zip');
           
$ok = $zip->zip($tmp_path.$name.'.zip', ELXIS_PATH.'/'.$this->relpath.$path);
            if (!
$ok) {
               
$this->view->errorResponse($zip->getError());
            }

           
$fname = $name.'.zip';
           
$abs_path = $tmp_path.$fname;
           
$del_tmp_after = 'tmp/'.$fname;
        } else {
           
$fname = basename($path);
           
$abs_path = ELXIS_PATH.'/'.$this->relpath.$path;
           
$del_tmp_after = '';
        }

       
$this->pageHeaders('application/force-download');
       
header('Content-Disposition: inline; filename="'.$fname.'"');
       
header("Content-Transfer-Encoding: Binary");
       
header("Content-length: ".filesize($abs_path));
       
header('Content-Type: application/octet-stream');
       
header('Content-Disposition: attachment; filename="'.$fname.'"');
       
readfile($abs_path);

        if (
$del_tmp_after != '') {
           
$eFiles->deleteFile($del_tmp_after, true);
        }
        exit;
    }


   
/*****************/
    /* PREVIEW IMAGE */
    /*****************/
   
private function preview() {
       
$path = $this->getPath();
       
$final = $this->relpath.$path;
        if ((
$path == '') || ($path === false)) {
           
$final = 'components/com_emedia/images/image_not_found.png';
        } else {
            if (!
file_exists(ELXIS_PATH.'/'.$this->relpath.$path) || !is_file(ELXIS_PATH.'/'.$this->relpath.$path)) {
               
$final = 'components/com_emedia/images/image_not_found.png';
            } else {
               
$ext = strtolower(pathinfo(ELXIS_PATH.'/'.$this->relpath.$path, PATHINFO_EXTENSION));
                if ((
$ext == '') || !in_array($ext, array('png', 'gif', 'jpeg', 'jpg'))) {
                   
$final = 'components/com_emedia/images/preview_not_available.png';
                }
            }
        }

       
$thumb = eFactory::getElxis()->obj('thumb');
       
$thumb->show($final, 100, 100, true);
    }


   
/*********************/
    /* UPLOAD A NEW FILE */
    /*********************/
   
private function uploadFile() {
       
$elxis = eFactory::getElxis();
       
$eFiles = eFactory::getFiles();

        if (
$elxis->acl()->check('com_emedia', 'files', 'upload') < 1) {
           
$msg = eFactory::getLang()->get('NOTALLOWACTION');
           
$this->view->errorResponse($msg, true);
        }

        if (!isset(
$_FILES['newfile']) || !is_uploaded_file($_FILES['newfile']['tmp_name'])) {
           
$msg = eFactory::getLang()->get('NO_FILE_UPLOADED');
           
$this->view->errorResponse($msg, true);    
        }

        if (
$_FILES['newfile']['size'] > $this->max_upload_size) {
           
$max = round(($this->max_upload_size / 1048576), 1);
           
$msg = sprintf(eFactory::getLang()->get('MAX_ALLOWED_FSIZE'), $max.' mb');
           
$this->view->errorResponse($msg, true);
        }

       
$exts = $this->allowedExtensions();
       
$ext = strtolower($eFiles->getExtension($_FILES['newfile']['name']));
        if ((
$ext == '') || !in_array($ext, $exts)) {
           
$msg = eFactory::getLang()->get('FORBIDDEN_FILE_TYPE');
           
$this->view->errorResponse($msg, true);
        }
        unset(
$exts);

       
$currentpath = filter_input(INPUT_POST, 'currentpath', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH);
       
$currentpath = ltrim($currentpath, '/');
       
$currentpath = str_replace('..', '', $currentpath);
        if (
$currentpath == '') {
           
//do nothing
       
} else if ($currentpath == '/') {
           
$currentpath = '';
        } else if (!
preg_match('#\/$#', $currentpath)) {
           
$currentpath .= '/';
        }

        if (!
is_dir(ELXIS_PATH.'/'.$this->relpath.$currentpath)) {
           
$msg = eFactory::getLang()->get('PATH_NOT_EXIST');
           
$this->view->errorResponse($msg, true);
        }

       
$filename = preg_replace('/[^a-zA-Z0-9\_\-\.\(\)]/', '', $_FILES['newfile']['name']);

       
$info = $eFiles->getNameExtension($filename);
        if (
$info['extension'] == '') {
           
$msg = eFactory::getLang()->get('INVALID_FILE_NAME');
           
$this->view->errorResponse($msg, true);
        }

        if (
$info['name'] == '') { $filename = 'file'.rand(1000, 9999).'.'.$info['extension']; }

        if (
file_exists(ELXIS_PATH.'/'.$this->relpath.$currentpath.$filename)) {
           
$msg = eFactory::getLang()->get('FILE_NAME_EXISTS').' ('.$filename.')';
           
$this->view->errorResponse($msg, true);
        }

       
$ok = $eFiles->upload($_FILES['newfile']['tmp_name'], $this->relpath.$currentpath.$filename);
        if (!
$ok) {
           
$msg = eFactory::getLang()->get('FILE_UPLOAD_FAILED');
           
$this->view->errorResponse($msg, true);
        }

       
$response = array('Path' => $currentpath, 'Name' => $filename, 'Error' => '', 'Code' => 0);
       
$this->view->jsonResponse($response, true);
    }


   
/******************/
    /* REPLACE A FILE */
    /******************/
   
private function replaceFile() {
       
$elxis = eFactory::getElxis();
       
$eFiles = eFactory::getFiles();

        if (
$elxis->acl()->check('com_emedia', 'files', 'upload') < 1) {
           
$msg = eFactory::getLang()->get('NOTALLOWACTION');
           
$this->view->errorResponse($msg, true);
        }

        if (!isset(
$_FILES['fileR']) || !is_uploaded_file($_FILES['fileR']['tmp_name'])) {
           
$msg = eFactory::getLang()->get('NO_FILE_UPLOADED');
           
$this->view->errorResponse($msg, true);    
        }

        if (
$_FILES['fileR']['size'] > $this->max_upload_size) {
           
$max = round(($this->max_upload_size / 1048576), 1);
           
$msg = sprintf(eFactory::getLang()->get('MAX_ALLOWED_FSIZE'), $max.' mb');
           
$this->view->errorResponse($msg, true);
        }

       
$exts = $this->allowedExtensions();
       
$ext = strtolower($eFiles->getExtension($_FILES['fileR']['name']));
        if ((
$ext == '') || !in_array($ext, $exts)) {
           
$msg = eFactory::getLang()->get('FORBIDDEN_FILE_TYPE');
           
$this->view->errorResponse($msg, true);
        }
        unset(
$exts);

       
$newfilepath = filter_input(INPUT_POST, 'newfilepath', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH);
       
$newfilepath = trim($newfilepath, '/');
       
$newfilepath = str_replace('..', '', $newfilepath);
        if ((
$newfilepath == '') || ($newfilepath != $_POST['newfilepath'])) {
           
$this->view->errorResponse('Error replacing file', true);
        }
       
$ext2 = strtolower($eFiles->getExtension($newfilepath));
        if (
$ext != $ext2) {
           
$this->view->errorResponse('Replacing file extension must be the same as the original file ('.$ext2.')!', true);
        }

       
$ok = $eFiles->upload($_FILES['fileR']['tmp_name'], $this->relpath.$newfilepath);
        if (!
$ok) {
           
$msg = eFactory::getLang()->get('FILE_UPLOAD_FAILED');
           
$this->view->errorResponse($msg, true);
        }
        if (!
$ok) {
           
$msg = eFactory::getLang()->get('FILE_UPLOAD_FAILED');
           
$this->view->errorResponse($msg, true);
        }

       
$response = array('Path' => dirname($newfilepath), 'Name' => basename($newfilepath), 'Error' => '', 'Code' => 0);
       
$this->view->jsonResponse($response, true);
    }


   
/*******************/
    /* RESIZE AN IMAGE */
    /*******************/
   
private function resizeImage() {//deprecated - not used any more (i.sannos 15.02.2016)
       
$elxis = eFactory::getElxis();
       
$eFiles = eFactory::getFiles();

        if (
$elxis->acl()->check('com_emedia', 'files', 'edit') < 1) {
           
$msg = eFactory::getLang()->get('NOTALLOWACTION');
           
$this->view->errorResponse($msg);
        }

       
$path = $this->getPath();
        if ((
$path == false) || !file_exists(ELXIS_PATH.'/'.$this->relpath.$path)) {
           
$msg = eFactory::getLang()->get('FILE_NOT_FOUND');
           
$this->view->errorResponse($msg);
        }


       
$ext = strtolower($eFiles->getExtension($path));
        if ((
$ext == '') || !in_array($ext, array('png', 'jpeg', 'jpg', 'gif'))) {
           
$msg = eFactory::getLang()->get('ONLY_RESIZE_IMAGES');
           
$this->view->errorResponse($msg);
        }

       
$rwidth = isset($_GET['rwidth']) ? (int)$_GET['rwidth'] : 0;
       
$rheight = isset($_GET['rheight']) ? (int)$_GET['rheight'] : 0;
        if (
$rwidth < 0) { $rwidth = 0; }
        if (
$rheight < 0) { $rheight = 0; }

        if ((
$rwidth == 0) && ($rheight == 0)) {
           
$msg = eFactory::getLang()->get('WIDTH_INVALID');
           
$this->view->errorResponse($msg);
        }

        if ((
$rwidth < 10) && ($rheight < 10)) {
           
$msg = eFactory::getLang()->get('WIDTH_TOO_SMALL');
           
$this->view->errorResponse($msg);
        }

       
$imginfo = getimagesize(ELXIS_PATH.'/'.$this->relpath.$path);
        if (!
$imginfo) {
           
$this->view->errorResponse('Could not determine original image size!');
        }
        if (!
in_array($imginfo[2], array(1, 2, 3))) {
           
$msg = eFactory::getLang()->get('ONLY_RESIZE_IMAGES');
           
$this->view->errorResponse($msg);
        }

        if ((
$rwidth == $imginfo[0]) && ($rheight == $imginfo[1])) {
           
$msg = eFactory::getLang()->get('IMAGE_ALREADY_DIMS');
           
$this->view->errorResponse($msg);
        }

        if (
$rwidth == 0) {
           
$new_height = $rheight;
           
$new_width = intval(($imginfo[0] * $rheight) / $imginfo[1]);
        } else if (
$rheight == 0) {
           
$new_width = $rwidth;
           
$new_height = intval(($imginfo[1] * $rwidth) / $imginfo[0]);
        } else {
           
$new_width = $rwidth;
           
$new_height = $rheight;
        }

       
$ok = $eFiles->resizeImage($this->relpath.$path, $new_width, $new_height, false, false);

        if (!
$ok) {
           
$msg = eFactory::getLang()->get('RESIZE_FAILED');
           
$this->view->errorResponse($msg);
        }

        if (
strpos($path, '/') !== false) { $dirname = dirname($path); } else { $dirname = ''; }
       
$response = array('Error' => '', 'Code' => 0, 'New_Width' => $new_width, 'New_Height' => $new_height, 'Dirname' => $dirname);
       
$this->view->jsonResponse($response);
    }


   
/*************************/
    /* ZIP COMPRESS A FOLDER */
    /*************************/
   
private function compressFolder() {//i. sannos 15.02.2016: replaced by mode "download" => dir
       
$elxis = eFactory::getElxis();

        if (
$elxis->acl()->check('com_emedia', 'files', 'edit') < 1) {
           
$msg = eFactory::getLang()->get('NOTALLOWACTION');
           
$this->view->errorResponse($msg);
        }

       
$path = $this->getPath();
        if ((
$path === false) || ($path == '') || ($path == '/')) {
           
$msg = eFactory::getLang()->get('SELECT_FOLDER_COMPRESS');
           
$this->view->errorResponse($msg);
        }

        if (!
is_dir(ELXIS_PATH.'/'.$this->relpath.$path)) {
           
$this->view->errorResponse('Yopu can compress only folders!');
        }

       
$parts = preg_split('#\/#', $path, -1, PREG_SPLIT_NO_EMPTY);
        if (!
$parts || (count($parts) == 0)) {
           
$msg = eFactory::getLang()->get('SELECT_FOLDER_COMPRESS');
           
$this->view->errorResponse($msg);
        }

       
$n = count($parts);
       
$lastseg = $n - 1;
       
$last = $parts[$lastseg];

       
$upload_dir = '';
        if (
$n > 1) {
            for (
$i=0; $i < $n; $i++) {
                if (
$i == $lastseg) { break; }
               
$upload_dir .= $parts[$i].'/';
            }
        }

       
$archive_name = $last.'.zip';
        if (
file_exists(ELXIS_PATH.'/'.$this->relpath.$upload_dir.$archive_name)) {
           
$archive_name = $last.'_'.rand(1000, 9999).'.zip';
        }

       
$archive = ELXIS_PATH.'/'.$this->relpath.$upload_dir.$archive_name;
       
$source = ELXIS_PATH.'/'.$this->relpath.$path;

       
$zip = $elxis->obj('zip');
       
$ok = $zip->zip($archive, $source);
        if (!
$ok) {
           
$msg = $zip->getError();
            if (
$msg == '') { $msg = 'Compressing folder '.$last.' failed!'; }
        }
        unset(
$zip);

       
$response = array('error' => '', 'code' => 0, 'path' => $upload_dir, 'archive' => $archive_name);
       
$this->view->jsonResponse($response);
    }

}

?>