Seditio Source
Root |
./othercms/croogo-4.0.7/vendor/croogo/croogo/FileManager/src/Controller/Admin/FileManagerController.php
<?php

namespace Croogo\FileManager\Controller\Admin;

use
Cake\Core\Configure;
use
Cake\Event\Event;
use
Cake\Filesystem\File;
use
Cake\Filesystem\Folder;
use
Cake\Routing\Router;
use
Croogo\FileManager\Utility\FileManager;

/**
 * FileManager Controller
 *
 * @category FileManager.Controller
 * @package  Croogo.FileManager.Controller
 * @version  1.0
 * @author   Fahad Ibnay Heylaal <contact@fahad19.com>
 * @license  http://www.opensource.org/licenses/mit-license.php The MIT License
 * @link     http://www.croogo.org
 */
class FileManagerController extends AppController
{
   
/**
     * @return void
     */
   
public function initialize()
    {
       
parent::initialize();
       
$this->FileManager = new FileManager();
       
$this->viewBuilder()
            ->
setHelpers([
               
'Croogo/Core.Image',
               
'Croogo/FileManager.FileManager',
            ]);
    }

   
/**
     * Helper to generate a browse url for $path
     *
     * @param string $path Path
     * @return string
     */
   
protected function _browsePathUrl($path)
    {
        return
Router::url([
           
'controller' => 'FileManager',
           
'action' => 'browse',
           
'?' => [
               
'path' => $path,
            ],
        ],
true);
    }

   
/**
     * Admin index
     *
     * @return Cake\Http\Response|void
     * @access public
     */
   
public function index()
    {
        return
$this->redirect(['action' => 'browse']);
    }

   
/**
     * Admin browse
     *
     * @return void
     * @access public
     */
   
public function browse()
    {
       
$this->folder = new Folder;

       
$path = $this->getRequest()->getQuery('path') ?: WWW_ROOT;

       
$path = realpath($path) . DS;
       
$regex = '/^' . preg_quote(realpath(ROOT), '/') . '/';
        if (
preg_match($regex, $path) == false) {
           
$this->Flash->error(__d('croogo', 'Path %s is restricted', $path));
           
$path = APP;
        }

       
$blacklist = ['.git', '.svn', '.CVS'];
       
$regex = '/(' . preg_quote(implode('|', $blacklist), '.') . ')/';
        if (
in_array(basename($path), $blacklist) || preg_match($regex, $path)) {
           
$this->Flash->error(__d('croogo', sprintf('Path %s is restricted', $path)));
           
$path = dirname($path);
        }

       
$this->folder->path = $path;

       
$content = $this->folder->read();
       
$this->set(compact('content'));
       
$this->set('path', $path);
    }

   
/**
     * Admin edit file
     *
     * @return Cake\Http\Response|void
     * @access public
     */
   
public function editFile()
    {
        if (!empty(
$this->getRequest()->getQuery('path'))) {
           
$path = $this->getRequest()->getQuery('path');
           
$absolutefilepath = $path;
        } else {
            return
$this->redirect(['controller' => 'FileManager', 'action' => 'browse']);
        }
        if (!
$this->FileManager->isEditable($path)) {
           
$this->Flash->error(__d('croogo', 'Path %s is restricted', $path));

            return
$this->redirect(['controller' => 'FileManager', 'action' => 'browse']);
        }

       
$pathE = explode(DS, $path);
       
$n = count($pathE) - 1;
        unset(
$pathE[$n]);
       
$path = implode(DS, $pathE);
       
$this->file = new File($absolutefilepath, true);

        if (!empty(
$this->getRequest()->getData())) {
            if (
$this->file->write($this->getRequest()->getData('content'))) {
               
$this->Flash->success(__d('croogo', 'File saved successfully'));
            }
        }

       
$content = $this->file->read();

       
$this->set(compact('content', 'path', 'absolutefilepath'));
    }

   
/**
     * Admin upload
     *
     * @return Cake\Http\Response|void
     * @access public
     */
   
public function upload()
    {
       
$this->set('title_for_layout', __d('croogo', 'Upload'));

       
$path = $this->getRequest()->getQuery('path') ?: APP;
       
$this->set(compact('path'));

        if (isset(
$path) && !$this->FileManager->isDeletable($path)) {
           
$this->Flash->error(__d('croogo', 'Path %s is restricted', $path));

            return
$this->redirect($this->referer());
        }

       
$postFile = $this->getRequest()->getData('file');
        if (isset(
$postFile['tmp_name']) &&
           
is_uploaded_file($postFile['tmp_name'])
        ) {
           
$destination = $path . $postFile['name'];
           
move_uploaded_file($postFile['tmp_name'], $destination);
           
$this->Flash->success(__d('croogo', 'File uploaded successfully.'));
           
$redirectUrl = $this->_browsePathUrl($path);

            return
$this->redirect($redirectUrl);
        }
    }

   
/**
     * Admin Delete File
     *
     * @return Cake\Http\Response|void
     * @access public
     */
   
public function deleteFile()
    {
        if (!empty(
$this->getRequest()->data['path'])) {
           
$path = $this->getRequest()->data['path'];
        } else {
            return
$this->redirect(['controller' => 'FileManager', 'action' => 'browse']);
        }

        if (!
$this->FileManager->isDeletable($path)) {
           
$this->Flash->error(__d('croogo', 'Path %s is restricted', $path));

            return
$this->redirect(['controller' => 'FileManager', 'action' => 'browse']);
        }

        if (
file_exists($path) && unlink($path)) {
           
$this->Flash->success(__d('croogo', 'File deleted'));
        } else {
           
$this->Flash->error(__d('croogo', 'An error occured'));
        }

        if (isset(
$_SERVER['HTTP_REFERER'])) {
            return
$this->redirect($_SERVER['HTTP_REFERER']);
        } else {
            return
$this->redirect(['controller' => 'FileManager', 'action' => 'index']);
        }

        exit();
    }

   
/**
     * Admin Delete Directory
     *
     * @return Cake\Http\Response|void
     * @access public
     */
   
public function deleteDirectory()
    {
        if (!empty(
$this->getRequest()->data['path'])) {
           
$path = $this->getRequest()->data['path'];
        } else {
            return
$this->redirect(['controller' => 'FileManager', 'action' => 'browse']);
        }

        if (isset(
$path) && !$this->FileManager->isDeletable($path)) {
           
$this->Flash->error(__d('croogo', 'Path %s is restricted', $path));

            return
$this->redirect(['controller' => 'FileManager', 'action' => 'browse']);
        }

       
$folder = new Folder();
        if (
is_dir($path) && $folder->delete($path)) {
           
$this->Flash->success(__d('croogo', 'Directory deleted'));
        } else {
           
$this->Flash->error(__d('croogo', 'An error occured'));
        }

        if (isset(
$_SERVER['HTTP_REFERER'])) {
            return
$this->redirect($_SERVER['HTTP_REFERER']);
        } else {
            return
$this->redirect(['controller' => 'FileManager', 'action' => 'index']);
        }

        exit;
    }

   
/**
     * Rename a file or directory
     *
     * @return Cake\Http\Response|void
     * @access public
     */
   
public function rename()
    {
       
$path = $this->getRequest()->query('path');
       
$pathFragments = array_filter(explode(DIRECTORY_SEPARATOR, $path));

        if (!
$this->FileManager->isEditable($path)) {
           
$this->Flash->error(__d('croogo', 'Path "%s" cannot be renamed', $path));

            return
$this->redirect(['controller' => 'FileManager', 'action' => 'browse']);
        }

        if (
$this->getRequest()->is('post') || $this->getRequest()->is('put')) {
            if (!
is_null($this->getRequest()->data('name')) &&
                !empty(
$this->getRequest()->data['name'])
            ) {
               
$newName = trim($this->getRequest()->data['name']);
               
$oldName = array_pop($pathFragments);
               
$newPath = DIRECTORY_SEPARATOR .
                   
implode(DIRECTORY_SEPARATOR, $pathFragments) .
                   
DIRECTORY_SEPARATOR .
                   
$newName;

               
$fileExists = file_exists($newPath);
                if (
$oldName !== $newName) {
                    if (
$fileExists) {
                       
$message = __d('croogo', '%s already exists', $newName);
                       
$alertType = 'error';
                    } else {
                        if (
$this->FileManager->rename($path, $newPath)) {
                           
$message = __d('croogo', '"%s" has been renamed to "%s"', $oldName, $newName);
                           
$alertType = 'success';
                        } else {
                           
$message = __d('croogo', 'Could not rename "%s" to "%s"', $oldName, $newName);
                           
$alertType = 'error';
                        }
                    }
                } else {
                   
$message = __d('croogo', 'Name has not changed');
                   
$alertType = 'warning';
                }
               
$this->Flash->{$alertType}($message);
            }

           
$redirectUrl = ['controller' => 'FileManager', 'action' => 'browse'];

            return
$this->redirect($redirectUrl);
        }
       
$this->getRequest()->data('name', array_pop($pathFragments));
       
$this->set('path', $path);
    }

   
/**
     * Admin Create Directory
     *
     * @return Cake\Http\Response|void
     * @access public
     */
   
public function createDirectory()
    {
        if (isset(
$this->getRequest()->query['path'])) {
           
$path = $this->getRequest()->query['path'];
        } else {
            return
$this->redirect(['controller' => 'FileManager', 'action' => 'browse']);
        }

        if (isset(
$path) && !$this->FileManager->isDeletable($path)) {
           
$this->Flash->error(__d('croogo', 'Path %s is restricted', $path));

            return
$this->redirect($this->referer());
        }

        if (!empty(
$this->getRequest()->data)) {
           
$this->folder = new Folder;
            if (
$this->folder->create($path . $this->getRequest()->data['name'])) {
               
$this->Flash->success(__d('croogo', 'Directory created successfully.'));
               
$redirectUrl = $this->_browsePathUrl($path);

                return
$this->redirect($redirectUrl);
            } else {
               
$this->Flash->error(__d('croogo', 'An error occured'));
            }
        }

       
$this->set(compact('path'));
    }

   
/**
     * Admin Create File
     *
     * @return Cake\Http\Response|void
     * @access public
     */
   
public function createFile()
    {
        if (isset(
$this->getRequest()->query['path'])) {
           
$path = $this->getRequest()->query['path'];
        } else {
            return
$this->redirect(['controller' => 'FileManager', 'action' => 'browse']);
        }

        if (isset(
$path) && !$this->FileManager->isEditable($path)) {
           
$this->Flash->error(__d('croogo', 'Path %s is restricted', $path));

            return
$this->redirect($this->referer());
        }

        if (!empty(
$this->getRequest()->data)) {
            if (
file_put_contents($path . $this->getRequest()->data['name'], $this->getRequest()->data['content'])) {
               
$this->Flash->success(__d('croogo', 'File created successfully.'));
               
$redirectUrl = $this->_browsePathUrl($path);

                return
$this->redirect($redirectUrl);
            } else {
               
$this->Flash->error(__d('croogo', 'An error occured'));
            }
        }

       
$this->set(compact('path'));
    }

   
/**
     * Admin chmod
     *
     * @return void
     * @access public
     */
   
public function chmod()
    {
    }
}