<?php
/*
 * findex - file lister and browser in php
 * Copyright (C) 2010-2014  ed <irc.rizon.net>
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License v2
 * (version 2) as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, refer to the following URL:
 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
 */


/* == INSTALLATION ==
 * copy php/css/js/jpg files (and the hidden .ico folder)
 * into whatever directory, then run the following as root:
 *
 * mkdir .th
 * chmod 755 .th
 * chown www-data.www-data .th
 */

// for x in ../g/index.*; do ln -s "$x" "$(echo "$x" | sed 's-.*/--')"; done



// putting index.php in these locations will disable javscript (media player)
$noscript = array( '/home/kilim/www/droid' );

// set this to a password if you want to hide the root directory,
// the password works like http://example.com/filebrowser/?.password
// and the corresponding directory muust also exist because i suck
$password '';



if (isset(
$_GET['dat']) && $_GET['dat']=='sauce') die(highlight_file('index.php'));

function 
denied(){ die('<h1>403 forbiddena</h1>'); }
function 
buglol(){ die('<h1>fuckdamn shitcunts</h1>'); }
function 
sploit($m){ die('<h1>you tryin ter sploit me brah</h1><h2>'.$m.'</h2>'); }
function 
copyerr(){ die('<h2>website owner: you forgot to create or chown the .th directory, see install instructions'); }

header('Content-Type: text/html; charset=UTF-8');
header('Cache-Control: no-cache, must-revalidate');
header('Expires: Sat, 09 Jan 2009 09:09:09 GMT');
date_default_timezone_set('UTC');
?><!DOCTYPE html><html lang="en"><head>
<meta charset="utf-8" />
<meta property="og:image" content="https://kili.im/music/.index2.jpg">
<meta name="description" content="HTML-based Media Player (created by ed). No volume controls ever get over it">
<title>Music Library</title>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=0.5">
<link rel="stylesheet" type="text/css" media="screen" href="index.4.css">
</head><body><div id="deblug">
<?php

// because php syntax is pig disgusting
function startsWith($a,$b) {return (strncmp($a,$b,strlen($b))===0);}
function 
endsWith($a,$b) {return (strlen($a)>=strlen($b)&&strcmp(substr($a,strlen($b)),$b)===0);}

$dirpath $_SERVER['REQUEST_URI'];
//echo $dirpath;
$dirpath explode('?',$dirpath);
// extract dirpath, die if illegal format
    
if (count($dirpath) == 1$dirpath '';
elseif (
count($dirpath) == 2$dirpath $dirpath[1];
else {
    
print_r($dirpath);
    
sploit('1)'.$dirpath);
}

//$dirpath = urldecode($dirpath);
$orgdirpath $dirpath;
$dirpath dec($dirpath);
//$dirpath = rawurldecode($dirpath);
$pwd realpath(dirname(__FILE__));
$dirpath realpath($dirpath);
if (!
startsWith($dirpath$pwd)) sploit('2)'.$orgdirpath);
$dirpath substr($dirpathstrlen($pwd)+1);
$dirpath_nonabs './'.$dirpath.'/';
if (!
is_dir($dirpath_nonabs)) sploit('3)'.$orgdirpath);
if (
startsWith($dirpath_nonabs'./.th/')) sploit('4)'.$orgdirpath);

if (
$password != '')
{
    if (
$dirpath == '') die('naw dude');
    if (
$dirpath == '.'.$password)
    {
        
$dirpath '';
        
$dirpath_nonabs './/';
    }
}

// validate that we have GD installed
if (!function_exists('ImageCreate') ||
    !
function_exists('ImageCreateFromJPEG') ||
    !
function_exists('ImageCreateFromPNG') ||
    !
function_exists('ImageCreateFromGIF')) {
    die(
'WHAT THE FUCK ARE YOU DOING');
}

$listraw = array();
$ptr = @dir($dirpath_nonabs) or buglol();
while ((
$item $ptr->read()) !== false) {
    if (
startsWith($item'.')) continue;
    
$listraw[] = $item;
}
$ptr->close();
if (
true)
{
    
sort($listraw);
}
else
{
    
usort($listraw, function($a,$b)
    {
        return 
filemtime($a) < filemtime($b);
    });
}
echo(
'</div>');

echo(
'<div id="top"><a href="#" id="mediaswitch">media player</a><a href="?dat=sauce">source code</a></div>');

$nope false;
$dirs = array();
$fils = array();
for (
$a=0$a<count($listraw); $a++) {
    
$fn $listraw[$a];
    
$itempath $dirpath_nonabs.$fn;
    
$add = array(
        
'path' => $itempath,
        
'name' => $fn,
        
'last' => date(
            
'Y-m-d, H:i:s',
            
filemtime($itempath))
    );
    if (
is_dir($itempath)) {
        
$add['size'] = 0;
        
$add['type'] = 'Directory';
        
$dirs[] = $add;
    } elseif (
$fn == 'index.html') {
        
$nope true;
    } else if (
        
$fn == 'bg.jpg' ||
        
$fn == 'bg.png' ||
        
$fn == 'bg.gif') {
        echo(
"<style>#mbox1,#blocker,html{background-image:url('${orgdirpath}/${fn}');}</style>\n");
    } elseif (
is_readable($itempath) && !startsWith($fn'index.')) {
        
$add['type'] = mime_content_type($itempath);
        
$add['size'] = number_format(
            
filesize($itempath));// / 1024,
            //3, ",", "'") . "kB";
        
$fils[] = $add;
        
# echo '<!-- added ' .$add['size']. " -->\n";
    
}
}
$list array_merge($dirs,$fils);

$pathsc '';
$paths explode('/'$dirpath);
echo(
'<div id="plist"><a href="?">/</a>'."\r\n");
for (
$a=0$a<count($paths); $a++) {
    
$pathsc .= $paths[$a];
    echo(
'<b></b>');
    echo(
'<a href="?'.enc($pathsc).'">'.$paths[$a].'</a>'."\r\n");
    
$pathsc .= '/';
}

$covers = [
    
'cd.jpg',
    
'cd.png',
    
'cd.gif',
    
'cover.jpg',
    
'cover.png',
    
'cover.gif',
    
'folder.jpg',
    
'folder.png',
    
'folder.gif'
];

$maxmem ini_get('memory_limit');
$unit strtolower(substr($maxmem, -11));
$maxmem = (int) $maxmem pow(1024array_search($unit, array(=> 'k','m','g')));

        function 
mkth($itempath$patha)
        {
            global 
$maxmem;
            
$th '.th/'.$itempath.'.jpg';
            if (!
file_exists($th)) {
                
//try {
                #echo 'mkdir ./.th/'.$patha.' for '.$itempath.'<br/ >';
                
@mkdir('./.th/'.$patha0755true);

                
$im null;
                
$is GetImageSize($itempath);
                
$ram $is[0] * $is[1] * 4;
                
$ram $ram memory_get_usage();
                if (
$ram 1.2 $maxmem)
                {
                    echo 
'\n<!-- want ' $ram ' ram but max is ' $maxmem ' -->\n';
                }
                else if (
$is[0] < 8000 && $is[1] < 8000)
                {
                    try
                    {
                        if (
$is[2]==1$im = @ImageCreateFromGIF($itempath);
                        if (
$is[2]==2$im = @ImageCreateFromJPEG($itempath);
                        if (
$is[2]==3$im = @ImageCreateFromPNG($itempath);
                    }
                    catch (
Exception $e)
                    {
                        echo 
'<!-- fuckup -->';
                    }
                }
                if (!
$im) {
                    
$ico '.ico/bad.png';
                } else {
                    
$ico $th;
                    
$x 256$y 256;
                    if (
$x>=$is[0] && $y>=$is[1]) {
                        
$im null;
                        
#die("copy1 $itempath to $th");
                        
@copy($itempath$th) or copyerr();
                    } else {
                        
$dx $is[0] / $x;
                        
$dy $is[1] / $y;
                        
$dd min($dx$dy);
                        
$sx $x $dd;
                        
$sy $y $dd;
                        
$ox = ($sx $is[0]) /-2;
                        
$oy = ($sy $is[1]) /-2;
                        if (
function_exists('ImageCreateTrueColor'))
                            
$od ImageCreateTrueColor($x$y);
                        else 
$od ImageCreate($x$y);
                        @
ImageCopyResampled(
                            
$od$im00$ox$oy,
                            
$x$y$sx$sy);
                        
$im null;
                        
$tf tempnam('/tmp','ith');
                        @
ImageJPEG($od$tf70);
                        @
ImageDestroy($id);
                        @
ImageDestroy($od);
                        
#die("copy2 $itempath to $th");
                        
@copy($tf$th) or copyerr();
                        @
unlink($tf);
                        @
chmod($th0644);
                    }
                }
                
//} catch (Exception $e) { }
            
} else $ico $th;
            return 
$ico;
        }

$mp3s 0;
$patha $dirpath;
if(
$patha != ''$patha .= '/';
echo(
'</div><div id="flist">'."\r\n");
if (
$nopedenied();
for (
$a=0$a<count($list); $a++) {
    
$i $list[$a];
    
$fn $i['name'];
    
//echo("<p>$fn</p>");
    
$ext $fn;
    
$itempath $patha.$fn;
    
$qm '';
    
$extratags '';
    if (
$i['type'] == 'Directory') {
        
$ext 'folder';
        
$qm '?';
    } else {
        
$fn substr($fn0strrpos($fn'.'));
        
$ext substr($extstrlen($fn) + 1);
    }
    
$lxt strtolower($ext);
    
$ico '.ico/'$ext'.png';
    if (
$qm == '?') {
        
// folder icons from cover.jpg
        
$burl $itempath '/';
        foreach (
$covers as $test) {
            if (
file_exists($burl $test)) {
                
$ico mkth($burl $test$itempath);
                
#die($ico);
                
break;
                
$ico $burl $test;
                if (
startsWith($test,'cd.'))
                {
                    
$extratags ' class="cd"';
                }
                break;
            }
        }
        if (
file_exists($burl 'index.html')) $ico '.ico/403.png';
    } else if(
        
$lxt == 'mp3' ||
        
$lxt == 'ogg' ||
        
$lxt == 'm4a') {
        
$mp3s++;
    } else if(
        
$lxt == 'jpg' ||
        
$lxt == 'png' ||
        
$lxt == 'gif') {
        if ((
$fn == 'cd' || $fn == 'cover' || $fn == 'folder') && ($ext == 'png' || $ext == 'gif' || $ext == 'jpg')) {
            
#$ico = $itempath;
            
if ($fn == 'cd') {
                
$extratags ' class="cd"';
            }
        }
        
$ico mkth($itempath$patha);
    }
    if (!
file_exists($ico))
    {
        
$ico '.ico/unknown.png';
    }
    echo(
'<a href="'.$qm.enc($itempath).'"'.$extratags.' title="'.
        
$i['type'] .'<br />'.
        
$i['last'] .'<br />'.
        
$i['size'] .'">'.
        
'<img src="'.enc($ico).'" />'.
        
'<span>'$i['name'] .'</span></a>'."\r\n");
}
echo(
"<b class=\"clr\"></b></div>\n");
//die("[eof]\r\n");

//function enc($a) { return str_replace(' ', '%20', $a); }
//function dec($a) { return str_replace('%20', ' ', $a); }
function dec($a) { return rawurldecode($a); }
function 
enc($a) { return str_replace('%2F''/'rawurlencode($a)); }

if (!
in_array($pwd$noscript)) {
    if (
$mp3s count($list) * 0.6) {
        echo(
"<script>var mp3now = true;</script>\n");
    } else {
        echo(
"<script>var mp3now = false;</script>\n");
    }
?>
<!-- script>document.domain = 'ocv.me';</script -->
<script src="index.jq.js"></script>
<script src="index.5.js"></script>
<?php ?>
</body></html>
1