'120x90', 'm' => '200x160', 'l' => '300x240', 'xl' => '400x320', 'xxl' => '500x400', ); // create thumshot 1280x1024 $GLOBALS['config']['activeFullSize'] = false; // create thumbshot of complete page $GLOBALS['config']['activeComplete'] = false; // create favicon $GLOBALS['config']['favicon'] = false; // Remove image older than 12 hours $GLOBALS['config']['expireCache'] = 12; // Disable exec command and use cron task $GLOBALS['config']['disableExec'] = false; // Enable log for success, suspect, error $GLOBALS['config']['log'] = true; if (file_exists('cache/config/options.php')) { require 'cache/config/options.php'; } if (!empty($_POST)) { $ui = $_POST; $ui['request'] = 'form'; $ui['iw'] = 1; unset($_POST); } if (!empty($_GET)) { $ui = $_GET; $ui['request'] = 'api'; unset($_GET); } if (empty($ui['request'])) { $ui['request'] = ''; } if (empty($ui['p'])) { $ui['p'] = 'index'; } if (empty($ui['fr'])) { $ui['fr'] = ''; } if (empty($ui['t'])) { $ui['t'] = 't'; } if (isset($ui['logout']) && (int) $ui['logout'] === 1) { session_destroy(); header("Location:?"); exit(); } if (!file_exists('cache/config/genConf.php')) { $serverKey = install(); $ui['p'] = 'install'; } require 'cache/config/genConf.php'; if ($GLOBALS['config']['pwd'] === 'install' && $ui['p'] !== 'install') { reloadInstall(); header("Location:?"); } if (($GLOBALS['config']['onlyLocalServer'] === true && $_SERVER['REMOTE_ADDR'] !== '127.0.0.1') || checkIfBan() === true) { header("HTTP/1.0 404 Not Found"); echo "

404 Not Found

"; echo "The page that you have requested could not be found."; exit(); } if ($GLOBALS['config']['NoWebPage'] === true && empty($_GET)) { header("HTTP/1.0 404 Not Found"); echo "

404 Not Found

"; echo "The page that you have requested could not be found."; exit(); } function testExistImg($file, $type) { /* type : - c complete - r full - thumbnail - fav favicon */ switch ($type) { case 'c': if (file_exists($file . '_complete.png')) { return true; } break; case 'r': if (file_exists($file . '_full.png')) { return true; } break; case 'fav': if (file_exists($file . '_favicon.png')) { return true; } break; case 't': if (file_exists($file . '_thumb.png')) { return true; } break; default: return false; break; } return false; } /** * Run the bash script for generate thumbnail * * @author Knah Tsaeb * @date 2013-02-12 * @param $url (string) url for thumbshot * @param $hashUrl (hash) hash($url) * @param $width (string) size of thumbnail 190x90 * @param $onlyThumb (bool) * @param $waitForResult (bool) * @return */ function launchScript($url, $hashUrl, $width, $size, $waitForResult = false) { $oriHash = $hashUrl; $hashUrl = escapeshellarg($hashUrl); $url = escapeshellarg($url); $width = escapeshellarg($width); if ($GLOBALS['config']['activeFullSize'] && $GLOBALS['config']['activeComplete']) { $renderType = 'trc'; } elseif ($GLOBALS['config']['activeFullSize']) { $renderType = 'tr'; } elseif ($GLOBALS['config']['activeComplete']) { $renderType = 'tc'; } else { $renderType = 't'; } if ($GLOBALS['config']['disableExec'] === false) { if (!file_exists('cache/tmp/' . $oriHash . '.lock')) { touch('cache/tmp/' . $oriHash . '.lock'); chdir('bin/'); if ($waitForResult === false) { exec('bash thumb_server.sh ' . $url . ' ' . $hashUrl . ' ' . $width . ' ' . $size . ' ' . $renderType . ' > /dev/null &', $result); } else { exec('bash thumb_server.sh ' . $url . ' ' . $hashUrl . ' ' . $width . ' ' . $size . ' ' . $renderType . ' 1', $result); } chdir('../'); } else { return 0; } } else { makeQueueFile($url, $hashUrl, $width, $size, $renderType); $result = 0; } return $result; } function makeQueueFile($url, $hashUrl, $width, $size, $renderType) { $url = str_replace('\'', '', $url); $hashUrl = str_replace('\'', '', $hashUrl); $width = str_replace('\'', '', $width); if (!file_exists('cache/cronTask/' . $hashUrl . '.hash')) { $data = $url . ' ' . $hashUrl . ' ' . $width . ' ' . $size . ' ' . $renderType . "\n"; file_put_contents('cache/cronTask/' . $hashUrl . '.hash', $data); } } function testValidUrl($url) { $url = trim($url); if (filter_var($url, FILTER_VALIDATE_URL)) { $url = parse_url($url); if (!in_array($url['scheme'], array( 'http', 'https', ))) { return array('msg' => 'Url must be start by http or https.'); } return true; } else { return array('msg' => 'Not a valid url.'); } } function genToken() { $token = sha1(uniqid(rand(), true) . '_' . mt_rand()); $_SESSION['token'] = $token; $_SESSION['tokenTime'] = time(); return $token; } function verifToken($token) { if ($token !== $_SESSION['token'] || $_SESSION['tokenTime'] <= time() - 24000) { ban(); die('So Long, and Thanks for All the Fish.'); } } function checkIfBan() { require 'cache/logs/banUser.php'; $userIp = $_SERVER['REMOTE_ADDR']; if (isset($banList[$userIp]) && $banList[$userIp]['nbBan'] >= $GLOBALS['config']['maxErrorBeforeBan'] && $banList[$userIp]['lastBan'] + $GLOBALS['config']['banTime'] > time()) { return true; } elseif (isset($banList[$userIp]) && $banList[$userIp]['lastBan'] + $GLOBALS['config']['banTime'] < time()) { unban(); return false; } else { return false; } } function ban() { require 'cache/logs/banUser.php'; $userIp = $_SERVER['REMOTE_ADDR']; if (isset($banList[$userIp])) { $banList[$userIp]['lastBan'] = time(); $banList[$userIp]['nbBan']++; } else { $banList[$userIp]['lastBan'] = time(); $banList[$userIp]['nbBan'] = 1; } file_put_contents('cache/logs/banUser.php', ""); } function unBan() { require 'cache/logs/banUser.php'; $userIp = $_SERVER['REMOTE_ADDR']; unset($banList[$userIp]); file_put_contents('cache/logs/banUser.php', ""); } function createDir() { if (!is_writable('cache')) { die('Make dir "cache" writable'); } if (!is_dir('cache/config') && !mkdir('cache/config', 0705)) { die('Error on create dir "cache/config".'); } if (!is_dir('cache/img') && !mkdir('cache/img', 0705)) { die('Error on create dir "cache/img".'); } if (!is_dir('cache/logs') && !mkdir('cache/logs', 0705)) { die('Error on create dir "cache/logs".'); } if (!is_dir('cache/logs/suspect') && !mkdir('cache/logs/suspect', 0705)) { die('Error on create dir "cache/logs/suspect".'); } if (!is_dir('cache/logs/retry') && !mkdir('cache/logs/retry', 0705)) { die('Error on create dir "cache/logs/retry".'); } if (!is_dir('cache/logs/other') && !mkdir('cache/logs/other', 0705)) { die('Error on create dir "cache/logs/other".'); } if (!is_dir('cache/tmp') && !mkdir('cache/tmp', 0705)) { die('Error on create dir "cache/tmp".'); } if (!is_dir('cache/cronTask') && !mkdir('cache/cronTask', 0705)) { die('Error on create dir "cache/cronTask".'); } } function install() { createDir(); $salt = sha1(uniqid(rand(), true) . '_' . mt_rand()); $serverKey = substr(sha1(uniqid(rand(), true) . '_' . mt_rand() . $salt), 0, 12); $encryptServerKey = sha1($serverKey . $salt); if (!is_file('cache/config/genConf.php')) { file_put_contents('cache/config/genConf.php', " "); } if (!is_file('cache/config/serverOptions.php')) { touch('cache/config/serverOptions.php'); } if (!is_file('cache/index.html')) { touch('cache/index.html'); } if (!is_file('cache/config/options.php')) { file_put_contents('cache/config/options.php', ""); } if (!is_file('cache/logs/banUser.php')) { file_put_contents('cache/logs/banUser.php', ""); } $GLOBALS['config']['serverKey'] = $encryptServerKey; $GLOBALS['config']['salt'] = $salt; $GLOBALS['config']['pwd'] = 'install'; $GLOBALS['config']['apikey'] = $serverKey; return $serverKey; } function checkInstall() { if (!is_file('.htaccess')) { file_put_contents('.htaccess', "AddDefaultCharset UTF-8\nOptions -Indexes\nDirectoryIndex index.php index.html\nFileETag none\nSetOutputFilter DEFLATE\n"); } if (!is_file('cache/logs/.htaccess')) { file_put_contents('cache/logs/.htaccess', "Allow from none\nDeny from all\n"); } if (!is_file('cache/config/.htaccess')) { file_put_contents('cache/config/.htaccess', "Allow from none\nDeny from all\n"); } if (!is_file('cache/cronTask/.htaccess')) { file_put_contents('cache/config/.htaccess', "Allow from none\nDeny from all\n"); } if (!is_file('bin/.htaccess')) { file_put_contents('bin/.htaccess', "Allow from none\nDeny from all\n"); } } function removeOlderThan($dir = 'cache/img/shortLive') { if (is_dir($dir)) { $objects = scandir($dir); foreach ($objects as $object) { if ($object !== '.' && $object !== '..' && $object) { if (filetype($dir . '/' . $object) === 'dir') { removeOlderThan($dir . '/' . $object); } else { if (fileatime($dir . '/' . $object) < time() - 3600 * $GLOBALS['config']['expireCache']) { unlink($dir . '/' . $object); } } } } reset($objects); } } function pathForFile($size, $hashUrl) { $startPath = substr($hashUrl, 0, 2) . '/' . substr($hashUrl, 2, 2) . '/'; if (empty($size)) { $size = tryDetectSize($startPath . $hashUrl); } $file = 'cache/img/' . $size . '/' . $startPath . $hashUrl; return $file; } function tryDetectSize($file) { if (is_file('cache/img/s/' . $file . '_thumb.png')) { return 's'; } if (is_file('cache/img/m/' . $file . '_thumb.png')) { return 'm'; } if (is_file('cache/img/l/' . $file . '_thumb.png')) { return 'l'; } if (is_file('cache/img/xl/' . $file . '_thumb.png')) { return 'xl'; } if (is_file('cache/img/xxl/' . $file . '_thumb.png')) { return 'xxl'; } } function validHash($hash) { if (empty($hash)) { die('You talking to me'); } if (!preg_match('/^[0-9a-f]{40}$/i', $hash)) { die('I don\'t understand biiip bip bip biiiip bip bip bip biiiiiiip biip ...'); } return $hash; } function checkAdmin($pwd) { $pwd = sha1($GLOBALS['config']['salt'] . $pwd . $GLOBALS['config']['serverKey']); if (validHash($pwd) !== $GLOBALS['config']['pwd']) { ban(); die('1, 2, 3, 4, 5 ? That\'s amazing ! I\'ve got the same combination on my luggage !'); } $_SESSION['login'] = true; return true; } function savePass($passOne, $passTwo, $token) { verifToken($token); if ($passOne !== $passTwo || empty($passOne) || empty($passTwo)) { reloadInstall(); } else { $GLOBALS['config']['pwd'] = sha1($GLOBALS['config']['salt'] . $passOne . $GLOBALS['config']['serverKey']); $confServerKey = $GLOBALS['config']['serverKey']; $confSalt = $GLOBALS['config']['salt']; $confPwd = $GLOBALS['config']['pwd']; $apikey = $GLOBALS['config']['apikey']; $confFile = ' '; file_put_contents('cache/config/genConf.php', $confFile); } header("Location:?"); } function reloadInstall() { array_map('unlink', glob("cache/config/*")); } /** * Améliore la sortie print * * @author Tatane http://www.tatane.info/index.php/print_rn * @author http://www.blog.cactuscrew.com/77-print_rn.html * @param $data (array) tableau ou variable à examiner * @param $name (string) nom a afficher * @return false affiche les clef valeur du tableau $data * @example n_print($array, 'Tableau de valeur'); */ function n_print($data, $name = '') { $aBackTrace = debug_backtrace(); echo '

', $name, '

'; echo '
'; echo ' ', basename($aBackTrace[0]['file']), ' ligne => ', $aBackTrace[0]['line'], ' '; echo '
', htmlentities(print_r($data, 1)), '
'; echo '

'; } function printThumbShot($file, $renderType) { ob_end_clean(); header("Content-type: image/png"); header('Expires: ', gmdate('D, d M Y H:i:s', time()) . ' GMT'); switch ($renderType) { case 'c': echo file_get_contents($file . '_complete.png'); break; case 'r': echo file_get_contents($file . '.png'); break; case 'fav': echo file_get_contents($file . '_favicon.png'); break; default: echo file_get_contents($file . '_thumb.png'); break; } exit(); } function getPage($page) { $page = htmlspecialchars($page); switch ($page) { case 'login': return 'inc/login.php'; break; case 'install': return 'inc/install.php'; break; case 'admin': return 'inc/admin.php'; break; default: return 'inc/index.php'; break; } } function testIfImg($url) { $ext = strtolower(pathinfo(strtok($url, '?'), PATHINFO_EXTENSION)); if ($ext === 'jpg' || $ext === 'jpeg' || $ext === 'png' || $ext === 'gif' || $ext === 'ico') { return $ext; } else { return false; } } function makeImgThumb($url, $ext, $hashUrl, $width, $path, $renderType = null) { if (!function_exists('imagecreatefromjpeg')) { return false; } $image = file_get_contents($url); $fullSize = file_put_contents('cache/tmp/' . $hashUrl . '.' . $ext, $image); if ($ext === 'jpg' || $ext === 'jpeg') { $tmpImg = imagecreatefromjpeg('cache/tmp/' . $hashUrl . '.' . $ext); } if ($ext === 'png') { $tmpImg = imagecreatefrompng('cache/tmp/' . $hashUrl . '.' . $ext); } if ($ext === 'gif') { $tmpImg = imagecreatefromgif('cache/tmp/' . $hashUrl . '.' . $ext); } if (!$tmpImg) { unlink('cache/tmp/' . $hashUrl . '.' . $ext); return false; } $w = imagesx($tmpImg); $h = imagesy($tmpImg); $ystart = 0; $yheight = $h; if ($h > $w) {$ystart = ($h / 2) - ($w / 2); $yheight = $w / 2; } $nh = min(floor(($h * $width) / $w), $width); $im2 = imagecreatetruecolor($width, $nh); imagecopyresampled($im2, $tmpImg, 0, 0, 0, $ystart, $width, $nh, $w, $yheight); $tempname = 'cache/tmp/' . $hashUrl . '_TEMP.png'; imagepng($im2, $tempname, 9); if (!is_dir($path)) { mkdir($path, 0775, true); } imagedestroy($tmpImg); imagedestroy($im2); unlink('cache/tmp/' . $hashUrl . '.' . $ext); rename($tempname, $path . $hashUrl . '_thumb.png'); if (file_exists($path . $hashUrl . '_thumb.png')) { return true; } else { return false; } } function checkHmac($receiveHmac, $url) { if ($receiveHmac === makeHmac($url, $GLOBALS['config']['apikey'])) { return true; } else { return false; } } function makeHmac($url) { return hash_hmac('sha1', $url, $GLOBALS['config']['apikey']); } function makeHashPath($hashUrl) { return substr($hashUrl, 0, 2) . '/' . substr($hashUrl, 2, 2); } function makeFavicon($hash, $url, $filePath) { require_once 'vendor/autoload.php'; $resResize = ''; $data = array(); $data['hashPath'] = $hashPath = $filePath; $data['file'] = $file = $filePath . $hash . '_favicon.png'; $info = Embed::create($url, [ 'follow_canonical' => true, 'external_images' => true, ]); $faviconUrl = $info->providerIcon; $data['ext'] = testIfImg($faviconUrl); $data['favicon'] = $faviconUrl; $image = file_get_contents($faviconUrl); $fullSize = file_put_contents('cache/tmp/' . $hash . '.' . $data['ext'], $image); $tmpFile = 'cache/tmp/' . $hash . '.' . $data['ext']; if ($data['ext'] === 'ico') { $getBestSize = exec('identify ' . escapeshellarg($tmpFile), $originalFav); if (is_array($originalFav)) { end($originalFav); $key = key($originalFav); if (!is_dir($hashPath)) { mkdir($hashPath, 0700, true); } exec('convert -background transparent ' . escapeshellarg($tmpFile . '[' . $key . ']') . ' -resize x32 ' . $file, $resResize); unlink('cache/tmp/' . $hash . '.' . $data['ext']); } } else { if (!is_dir($hashPath)) { mkdir($hashPath, 0700, true); } exec('convert -background transparent ' . escapeshellarg($tmpFile) . ' -resize x32 ' . $file, $resResize); unlink('cache/tmp/' . $hash . '.' . $data['ext']); } if (file_exists($file)) { return $file; } else { file_put_contents($file, file_get_contents('bin/error_fav.png')); return $file; } } function makeHashUrl($url) { return sha1($GLOBALS['config']['salt'] . $url); } /* $image = file_get_contents('http://www.url.com/image.jpg'); file_put_contents('/images/image.jpg', $image); //save the image on your server * * */ checkInstall(); removeOlderThan(); if (empty($defUrl)) { $defUrl = $GLOBALS['config']['defaultUrl']; } if (isset($ui['s']) && array_key_exists($ui['s'], $GLOBALS['config']['thumbSize'])) { $width = $GLOBALS['config']['thumbSize'][$ui['s']]; } else { $width = $GLOBALS['config']['defaultThumbSize']; } // Generate or return img if (!empty($ui['request']) && $ui['p'] !== 'install' && $ui['p'] !== 'login' && $ui['p'] !== 'admin') { if (empty($ui['url'])) { die('You see in this world there\'s two kinds of people, my friend. Those with loaded guns, and those who dig. You dig.'); } if ($ui['request'] === 'form') { //$file = 'cache/img/shortLive/' . $startPath . $hashUrl; $ui['s'] = 'shortLive'; } $ui['sendUrl'] = $ui['url']; $ui['url'] = trim(rawurldecode($ui['url'])); $ui['url'] = rtrim($ui['url'], '/'); $hashUrl = sha1($GLOBALS['config']['salt'] . $ui['url']); $startPath = substr($hashUrl, 0, 2) . '/' . substr($hashUrl, 2, 2) . '/'; $filePath = 'cache/img/' . $ui['s'] . '/' . $startPath; $file = 'cache/img/' . $ui['s'] . '/' . $startPath . $hashUrl; $testUrl = testValidUrl($ui['url']); $defUrl = $ui['url']; // file exist we return img if (testExistImg($file, $ui['t']) === true && (int) $ui['fr'] !== 1) { if ($ui['request'] === 'api') { if (checkHmac($ui['hm'], $ui['sendUrl'])) { printThumbShot($file, $ui['t']); } else { ban(); die('I take a chips and give it to Godzilla. I give high kick in Chuck Norris face and I go to ... Humm .... Ehh .... Arg ....... KAMOULOX ! Well done Jean Pierre.'); } } if ($ui['request'] === 'form') { $success = array( 'normal' => $file . '.png', 'thumb' => $file . '_thumb.png', 'complete' => $file . '_complete.png', 'favicon' => $file . '_favicon.png', ); } } else { if ($ui['request'] === 'api') { if (empty($ui['hm']) || empty($ui['hm'])) { die('Are you Ken ?'); } if (!checkHmac($ui['hm'], $ui['sendUrl'])) { ban(); die('I take a chips and give it to Godzilla. I give high kick in Chuck Norris face and I go to ... Humm .... Ehh .... Arg ....... KAMOULOX ! Well done Jean Pierre.'); } } else { verifToken($ui['token']); } // url isn't correct put it in suspect log if ($testUrl !== true) { if (!file_exists('cache/logs/' . $hashUrl . 'log')) { file_put_contents('cache/logs/suspect/' . $hashUrl . '.log', $_SERVER['REMOTE_ADDR'] . ' --- ' . $ui['url'] . ' --- ' . $hashUrl . ' --- ' . $width . ' --- ' . $ui['s'] . ' --- ' . $renderType . ' --- true' . "\n"); } if ($ui['request'] === 'api') { printThumbShot('bin/error', $ui['t']); } else { $success = array( 'normal' => 'bin/error.png', 'thumb' => 'bin/error_thumb.png', 'complete' => 'bin/error.png', 'favicon' => 'bin/error_fav.png', ); } } else { $ext = testIfImg($ui['url']); if ($ext !== false) { $genWidth = explode("x", $width); if ($ui['request'] === 'api') { $makeImg = makeImgThumb($ui['url'], $ext, $hashUrl, $genWidth[0], 'cache/img/' . $ui['s'] . '/' . $startPath, $ui['t']); } else { $makeImg = makeImgThumb($ui['url'], $ext, $hashUrl, $genWidth[0], 'cache/img/shortLive/' . $startPath, $ui['t']); } if ($makeImg === true) { // $GLOBALS['config']['disableExec'] = true; if ($ui['request'] === 'api') { printThumbShot($file, $ui['t']); } else { $success = array( 'normal' => $file . '.png', 'thumb' => $file . '_thumb.png', 'complete' => $file . '_complete.png', 'favicon' => $file . '_favicon.png', ); } } } if ((isset($ui['iw']) && (int) $ui['iw'] === 1 && $ui['request'] === 'api')) { $res = launchScript($defUrl, $hashUrl, $width, $ui['s'], true); } elseif (isset($ui['iw']) && (int) $ui['iw'] === 1 && $ui['request'] === 'form') { // img not exist or force refresh make it and return it $res = launchScript($defUrl, $hashUrl, $width, 'shortLive', true); makeFavicon($hashUrl, $ui['url'], $filePath); } else { if ($ui['t'] === 'fav') { $res = makeFavicon($hashUrl, $ui['url'], $filePath); } else { $res = launchScript($defUrl, $hashUrl, $width, $ui['s'], false); } } if ($ui['request'] === 'api') { $file = 'bin/loadingGen'; printThumbShot($file, $ui['t']); die(); } else { if ($GLOBALS['config']['disableExec'] === true) { $file = 'bin/loadingGen'; } $success = array( 'normal' => $file . '.png', 'thumb' => $file . '_thumb.png', 'complete' => $file . '_complete.png', 'favicon' => $file . '_favicon.png', ); } } } } ?> SoShot