<?php
@include_once 'configuration.server.php';
class server
{
    /*
     * Get Size of File
     */
    public function getSize($dir)
    {
        $size = 0;
        foreach (glob(rtrim($dir, '/').'/*', GLOB_NOSORT) as $each)
            $size += filesize($each);
        return $size;
    }


    /*
     * Remove Access To unwanted and not secured Path
     * just load this method to router
     */
    public function BackRestrict($url)
    {
        $stack = explode('/',$url);
        $flag = 0;
        foreach ($stack as $key)
        {
            switch($key)
            {
                case '.' : ++$flag; break;
                case '..' : ++$flag; break;
                case '...' : ++$flag; break;
            }
        }

        if($flag != 0)
            exit('Access Denied');
    }

	public function fileChecker()
	{
		if(isset($_POST['filechecker']))
		{
			$file = config['server']['secure_folder'].urldecode($_POST['filechecker']);
			if(file_exists($file))
			{
				echo json_encode([
				'status' => true,
				'size' => filesize($file),
				]);
			}
			else
			{
				echo json_encode([
				'status' => false,
				]);
			}
			exit;
		}
	}

	public function sub_checker()
    {
        if(isset($_POST['sub_checker']))
        {
            $file = 'sub/'.urldecode($_POST['sub_checker']);
            if(file_exists($file))
            {
                echo json_encode([
                'status' => true,
                'size' => filesize($file),
                ]);
            }
            else
            {
                echo json_encode([
                'status' => false,
                ]);
            }
            exit;
        }
    }


    /*
     * Donwload With SUB account
     */
    public function Download_Account()
    {
        if(isset($_GET['dl']) && isset($_GET['file']) && isset($_GET['expire']) && isset($_GET['now']) && isset($_GET['uid']) && isset($_GET['salt']))
        {
            if(config['access']['download'] === false)
            {
                http_response_code(403);
                exit('Download Denied');
            }

            if(time() > $_GET['expire'])
            {
                http_response_code(403);
                exit('expired');
            }

            $hash_check = md5(config['server']['token'].($_GET['uid']).($_GET['now']).($_GET['expire']).($_GET['salt']).urlencode($_GET['file']));
            if($_GET['dl'] == $hash_check)
            {
                switch (config['server']['download_module'])
                {
                    case 4 :
						http_response_code(200);
                        $this->php_Download($_GET['file']);
                        break;
                    case -2 :
						http_response_code(200);
                        $this->xsendfile_Download($_GET['file']);
                        break;
					case -1 :
						http_response_code(200);
                        $this->DirectDownload($_GET['file']);
                        break;
                    case 1 :
						http_response_code(200);
                        $this->xaccelRedirect_Download($_GET['file']);
                        break;
                    case 2 :
						http_response_code(200);
                        $this->xliteSpeed_Download($_GET['file']);
                        break;
                    default :
                        http_response_code(406);
                        exit('Select another Method');
                }
            }
            else
            {
                http_response_code(401);
                exit('auth Error');
            }
        }
    }



    /*
     * Access To Directory
     * Local Access
     */
    public function Local_Directory($dirs)
    {
        $this->BackRestrict($dirs);
        $server = config['server']['server_id'];
        $added_folder = config['server']['secure_folder'];
        $sv = config['server']['downloader_file_url'];
        $script_url = config['server']['website'];


        if (file_exists($added_folder.$dirs))
        {
            $out = [];
            $frame = array_map('trim',array_filter(explode('/',$dirs)));
            $frame = array_values($frame);
            $count_frame = count($frame);
            $out['final_path'] = ['BASE'];
            $backIndex = ($count_frame - 1) < 0 ? null : $count_frame-1;
            if($backIndex !== null)
            {
                if($backIndex === 0)
                {
                    $out['back']= $sv.'?directory';
                    $out['current_path'] = $frame[0];
                    $out['final_path'][] = $frame[0];
                }
                else
                {
                    $out['back']= $sv.'?directory=';
                    for($fd=0;$fd <= ($backIndex-1); $fd++)
                    {
                        $out['back'] .= $frame[$fd].'/';
                        array_push($out['final_path'],$frame[$fd]);
                    }
                    $out['back'] = rtrim($out['back'],'/');
                    $out['current_path'] = $frame[$fd];
                    $out['final_path'][] = $frame[$fd];
                }
            }
            else
            {
                $out['back'] = null;
                $out['current_path'] = 'BASE';
            }
            $slashcheck = substr($added_folder.$dirs,-1);
            if($slashcheck!='/')
                $plus_str = $dirs.'/';
            else
                $plus_str = $dirs;
            $files1 = scandir($added_folder.$plus_str,0);
            $i=0;


            $out['files'] = [];
            $out['folders'] = [];
            $out['status'] = 1;
            foreach($files1 as $key)
            {
                if ($key != "." && $key != "..")
                {
                    ++$i;
                    $myurl = $plus_str.$key;

                    if(!is_file($added_folder.$myurl))
                    {
                        set_time_limit(0);
                        $arr = ['link'=>$sv.'?directory='.urlencode($myurl),'name'=>urlencode($key),'path'=>config['directory']['show_path'] === true ? urlencode($myurl) : null];
                        array_push($out['folders'],$arr);
                    }
                    else
                    {
                        set_time_limit(0);
                        if($key == '.htaccess')
                            continue;
                        else
                        {
                            $ext = pathinfo($key, PATHINFO_EXTENSION);
                            if($ext == 'php')
                                continue;
                        }
                        $size=round(filesize($added_folder.$myurl)/1048576,1);
                        $arr = ['link'=>$script_url.'/'.$server.'/'.urlencode($myurl),'name'=>urlencode($key),'size'=>$size,'path'=>config['directory']['show_path'] === true ? urlencode($myurl) : null];
                        array_push($out['files'],$arr);
                    }
                }
            }
            return json_encode($out);
        }
        else
        {
            $arr['status']=404;
            $arr['msg']='notfound';
            return json_encode($arr);
        }
    }


    public function remote_Directory($dirs)
    {
        $this->BackRestrict($dirs);
        $server = config['server']['server_id'];
        $added_folder = config['server']['secure_folder'];
        $sv = config['server']['downloader_file_url'];
        $script_url = config['server']['website'];

        if (file_exists($added_folder.$dirs))
        {
            $out = [];
            $frame = array_map('trim',array_filter(explode('/',$dirs)));
            $frame = array_values($frame);
            $count_frame = count($frame);
            $out['final_path'] = ['BASE'];
            $backIndex = ($count_frame - 1) < 0 ? null : $count_frame-1;
            if($backIndex !== null)
            {
                if($backIndex === 0)
                {
                    $out['current_path'] = $frame[0];
                    array_push($out['final_path'],$frame[0]);
                }
                else
                {
                    for($fd=0;$fd <= ($backIndex-1); $fd++)
                        array_push($out['final_path'],$frame[$fd]);
                    $out['current_path'] = $frame[$fd];
                    array_push($out['final_path'],$frame[$fd]);
                }
            }
            else
            {
                $out['current_path'] = 'BASE';
            }
            $slashcheck = substr($added_folder.$dirs,-1);
            if($slashcheck!='/')
                $plus_str = $dirs.'/';
            else
                $plus_str = $dirs;

            $files1 = scandir($added_folder.$plus_str);

            $i=0;

            $out['files'] = [];
            $out['folders'] = [];
            $out['status'] = 1;
            foreach($files1 as $key)
            {
                if ($key != "." && $key != "..")
                {
                    ++$i;
                    $myurl = $plus_str.$key;
                    set_time_limit(0);
                    if(!is_file($added_folder.$myurl))
                    {
                        $arr = ['name'=>urlencode($key),'path'=>urlencode($myurl)];
                        $out['folders'][] = $arr;
                    }
                    else
                    {
                        if($key == '.htaccess')
                            continue;
                        else
                        {
                            $ext = pathinfo($key, PATHINFO_EXTENSION);
                            if($ext == 'php')
                                continue;
                        }
                        $size=round(filesize($added_folder.$myurl)/1048576,1);
                        $arr = ['name'=>urlencode($key),'size'=>$size,'path'=>urlencode($myurl)];
                        $out['files'][] = $arr;
                    }
                }
            }
            return json_encode($out);
        }
        else
        {
            $arr['status']=404;
            $arr['msg']='notfound';
            return json_encode($arr);
        }
    }

    /*
     * Create Download with PHP buffering
     */
    public function php_Download($file)
    {
		$file = config['server']['secure_folder'].$file;
        $data_file 	= urldecode($file);
        $data_size 	= filesize($data_file);

        $mime 		= 'application/otect-stream';
        $filename 	= basename($data_file);
        if (isset($_SERVER['HTTP_RANGE']) || isset($HTTP_SERVER_VARS['HTTP_RANGE']))
        {
            $ranges_str = (isset($_SERVER['HTTP_RANGE']))?$_SERVER['HTTP_RANGE']:$HTTP_SERVER_VARS['HTTP_RANGE'];
            $ranges_arr = explode('-', substr($ranges_str, strlen('bytes=')));

            if ((intval($ranges_arr[0]) >= intval($ranges_arr[1]) && $ranges_arr[1] != "" && $ranges_arr[0] != "" ) || ($ranges_arr[1] == "" && $ranges_arr[0] == ""))
            {
                $ranges_arr[0] = 0;
                $ranges_arr[1] = $data_size - 1;
            }
        }
        else
        {
            $ranges_arr[0] = 0;
            $ranges_arr[1] = $data_size - 1;
        }

        $file = fopen($data_file, 'rb');
        $start = $stop = 0;

        if ($ranges_arr[0] === "")
        {
            $stop = $data_size - 1;
            $start = $data_size - intval($ranges_arr[1]);
        }
        elseif ($ranges_arr[1] === "")
        {
            $start = intval($ranges_arr[0]);
            $stop = $data_size - 1;
        }
        else
        {
            $stop = intval($ranges_arr[1]);
            $start = intval($ranges_arr[0]);
        }

        fseek($file, $start, SEEK_SET);
        $start = ftell($file);
        fseek($file, $stop, SEEK_SET);
        $stop = ftell($file);
        $data_len = $stop - $start;

        if (isset($_SERVER['HTTP_RANGE']) || isset($HTTP_SERVER_VARS['HTTP_RANGE']))
        {
            header('HTTP/1.0 206 Partial Content');
            header('Status: 206 Partial Content');
        }
        header('Accept-Ranges: bytes');
        header('Content-type: ' . $mime);
        header('Content-Disposition: attachment; filename="' . $filename . '"');
        header("Content-Range: bytes $start-$stop/" . $data_size );
        header("Content-Length: " . ($data_len + 1));
        fseek($file, $start, SEEK_SET);
        $bufsize = 2048000;
        ignore_user_abort(true);
        @set_time_limit(0);
        while (!(connection_aborted() || connection_status() == 1) && $data_len > 0)
        {
            echo fread($file, $bufsize);
            $data_len -= $bufsize;
            flush();
        }
        fclose($file);
    }


    /*
     * Create Download with PHP XsendFile
     * access on Apache
     */
    public function xsendfile_Download($file)
    {
        $patch = config['server']['secure_folder'].urldecode($file);
        $dinfo 	= parse_url($patch, PHP_URL_PATH);
        $dname 	= basename($dinfo);
        header("X-Sendfile: /".$patch);
        header("Content-Type: application/octet-stream");
        header("Content-Disposition: attachment; filename=".$dname."");
    }


    public function DirectDownload($file)
    {
        header('Location: '.str_replace('server.php','',config['server']['downloader_file_url']).config['server']['secure_folder'].urldecode($file));
    }


    /*
     * Create Download with PHP XsendFile
     * access on nginx
     */
    public function xaccelRedirect_Download($file)
    {
        $patch = config['server']['secure_folder'].urldecode($file);
        $dinfo 	= parse_url($patch, PHP_URL_PATH);
        $dname 	= basename($dinfo);
        header("X-Accel-Redirect: /$patch");
        header("Content-Type: application/octet-stream");
        header("Content-Disposition: attachment; filename=".$dname."");
    }


    /*
     * Create Download with PHP XsendFile
     * access on LiteSpeed
     */
    public function xliteSpeed_Download($file)
    {
        $patch = config['server']['secure_folder'].urldecode($file);
        $dinfo 	= parse_url($patch, PHP_URL_PATH);
        $dname 	= basename($dinfo);
        header("X-LiteSpeed-Location: /$patch");
        header("Content-Type: application/octet-stream");
        header("Content-Disposition: attachment; filename=".$dname."");
    }



}
