Annotation of embedaddon/php/ext/phar/tests/phar_createdefaultstub.phpt, revision 1.1

1.1     ! misho       1: --TEST--
        !             2: Phar: Phar::createDefaultStub() with and without arg
        !             3: --SKIPIF--
        !             4: <?php if (!extension_loaded("phar")) die("skip"); ?>
        !             5: --FILE--
        !             6: <?php
        !             7: try {
        !             8: var_dump(Phar::createDefaultStub());
        !             9: echo "============================================================================\n";
        !            10: echo "============================================================================\n";
        !            11: var_dump(Phar::createDefaultStub('my/custom/thingy.php'));
        !            12: echo "============================================================================\n";
        !            13: echo "============================================================================\n";
        !            14: var_dump(strlen(Phar::createDefaultStub(str_repeat('a', 400))));
        !            15: echo "============================================================================\n";
        !            16: echo "============================================================================\n";
        !            17: var_dump(Phar::createDefaultStub(str_repeat('a', 401)));
        !            18: } catch(Exception $e) {
        !            19: echo $e->getMessage() . "\n";
        !            20: }
        !            21: echo "============================================================================\n";
        !            22: echo "============================================================================\n";
        !            23: echo "============================================================================\n";
        !            24: echo "============================================================================\n";
        !            25: try {
        !            26: var_dump(Phar::createDefaultStub('my/custom/thingy.php', 'the/web.php'));
        !            27: echo "============================================================================\n";
        !            28: echo "============================================================================\n";
        !            29: var_dump(strlen(Phar::createDefaultStub('index.php', str_repeat('a', 400))));
        !            30: var_dump(Phar::createDefaultStub('hio', str_repeat('a', 401)));
        !            31: } catch (Exception $e) {
        !            32: echo $e->getMessage() . "\n";
        !            33: }
        !            34: ?>
        !            35: ===DONE===
        !            36: --EXPECT--
        !            37: string(6683) "<?php
        !            38: 
        !            39: $web = 'index.php';
        !            40: 
        !            41: if (in_array('phar', stream_get_wrappers()) && class_exists('Phar', 0)) {
        !            42: Phar::interceptFileFuncs();
        !            43: set_include_path('phar://' . __FILE__ . PATH_SEPARATOR . get_include_path());
        !            44: Phar::webPhar(null, $web);
        !            45: include 'phar://' . __FILE__ . '/' . Extract_Phar::START;
        !            46: return;
        !            47: }
        !            48: 
        !            49: if (@(isset($_SERVER['REQUEST_URI']) && isset($_SERVER['REQUEST_METHOD']) && ($_SERVER['REQUEST_METHOD'] == 'GET' || $_SERVER['REQUEST_METHOD'] == 'POST'))) {
        !            50: Extract_Phar::go(true);
        !            51: $mimes = array(
        !            52: 'phps' => 2,
        !            53: 'c' => 'text/plain',
        !            54: 'cc' => 'text/plain',
        !            55: 'cpp' => 'text/plain',
        !            56: 'c++' => 'text/plain',
        !            57: 'dtd' => 'text/plain',
        !            58: 'h' => 'text/plain',
        !            59: 'log' => 'text/plain',
        !            60: 'rng' => 'text/plain',
        !            61: 'txt' => 'text/plain',
        !            62: 'xsd' => 'text/plain',
        !            63: 'php' => 1,
        !            64: 'inc' => 1,
        !            65: 'avi' => 'video/avi',
        !            66: 'bmp' => 'image/bmp',
        !            67: 'css' => 'text/css',
        !            68: 'gif' => 'image/gif',
        !            69: 'htm' => 'text/html',
        !            70: 'html' => 'text/html',
        !            71: 'htmls' => 'text/html',
        !            72: 'ico' => 'image/x-ico',
        !            73: 'jpe' => 'image/jpeg',
        !            74: 'jpg' => 'image/jpeg',
        !            75: 'jpeg' => 'image/jpeg',
        !            76: 'js' => 'application/x-javascript',
        !            77: 'midi' => 'audio/midi',
        !            78: 'mid' => 'audio/midi',
        !            79: 'mod' => 'audio/mod',
        !            80: 'mov' => 'movie/quicktime',
        !            81: 'mp3' => 'audio/mp3',
        !            82: 'mpg' => 'video/mpeg',
        !            83: 'mpeg' => 'video/mpeg',
        !            84: 'pdf' => 'application/pdf',
        !            85: 'png' => 'image/png',
        !            86: 'swf' => 'application/shockwave-flash',
        !            87: 'tif' => 'image/tiff',
        !            88: 'tiff' => 'image/tiff',
        !            89: 'wav' => 'audio/wav',
        !            90: 'xbm' => 'image/xbm',
        !            91: 'xml' => 'text/xml',
        !            92: );
        !            93: 
        !            94: header("Cache-Control: no-cache, must-revalidate");
        !            95: header("Pragma: no-cache");
        !            96: 
        !            97: $basename = basename(__FILE__);
        !            98: if (!strpos($_SERVER['REQUEST_URI'], $basename)) {
        !            99: chdir(Extract_Phar::$temp);
        !           100: include $web;
        !           101: return;
        !           102: }
        !           103: $pt = substr($_SERVER['REQUEST_URI'], strpos($_SERVER['REQUEST_URI'], $basename) + strlen($basename));
        !           104: if (!$pt || $pt == '/') {
        !           105: $pt = $web;
        !           106: header('HTTP/1.1 301 Moved Permanently');
        !           107: header('Location: ' . $_SERVER['REQUEST_URI'] . '/' . $pt);
        !           108: exit;
        !           109: }
        !           110: $a = realpath(Extract_Phar::$temp . DIRECTORY_SEPARATOR . $pt);
        !           111: if (!$a || strlen(dirname($a)) < strlen(Extract_Phar::$temp)) {
        !           112: header('HTTP/1.0 404 Not Found');
        !           113: echo "<html>\n <head>\n  <title>File Not Found<title>\n </head>\n <body>\n  <h1>404 - File ", $pt, " Not Found</h1>\n </body>\n</html>";
        !           114: exit;
        !           115: }
        !           116: $b = pathinfo($a);
        !           117: if (!isset($b['extension'])) {
        !           118: header('Content-Type: text/plain');
        !           119: header('Content-Length: ' . filesize($a));
        !           120: readfile($a);
        !           121: exit;
        !           122: }
        !           123: if (isset($mimes[$b['extension']])) {
        !           124: if ($mimes[$b['extension']] === 1) {
        !           125: include $a;
        !           126: exit;
        !           127: }
        !           128: if ($mimes[$b['extension']] === 2) {
        !           129: highlight_file($a);
        !           130: exit;
        !           131: }
        !           132: header('Content-Type: ' .$mimes[$b['extension']]);
        !           133: header('Content-Length: ' . filesize($a));
        !           134: readfile($a);
        !           135: exit;
        !           136: }
        !           137: }
        !           138: 
        !           139: class Extract_Phar
        !           140: {
        !           141: static $temp;
        !           142: static $origdir;
        !           143: const GZ = 0x1000;
        !           144: const BZ2 = 0x2000;
        !           145: const MASK = 0x3000;
        !           146: const START = 'index.php';
        !           147: const LEN = 6685;
        !           148: 
        !           149: static function go($return = false)
        !           150: {
        !           151: $fp = fopen(__FILE__, 'rb');
        !           152: fseek($fp, self::LEN);
        !           153: $L = unpack('V', $a = (binary)fread($fp, 4));
        !           154: $m = (binary)'';
        !           155: 
        !           156: do {
        !           157: $read = 8192;
        !           158: if ($L[1] - strlen($m) < 8192) {
        !           159: $read = $L[1] - strlen($m);
        !           160: }
        !           161: $last = (binary)fread($fp, $read);
        !           162: $m .= $last;
        !           163: } while (strlen($last) && strlen($m) < $L[1]);
        !           164: 
        !           165: if (strlen($m) < $L[1]) {
        !           166: die('ERROR: manifest length read was "' .
        !           167: strlen($m) .'" should be "' .
        !           168: $L[1] . '"');
        !           169: }
        !           170: 
        !           171: $info = self::_unpack($m);
        !           172: $f = $info['c'];
        !           173: 
        !           174: if ($f & self::GZ) {
        !           175: if (!function_exists('gzinflate')) {
        !           176: die('Error: zlib extension is not enabled -' .
        !           177: ' gzinflate() function needed for zlib-compressed .phars');
        !           178: }
        !           179: }
        !           180: 
        !           181: if ($f & self::BZ2) {
        !           182: if (!function_exists('bzdecompress')) {
        !           183: die('Error: bzip2 extension is not enabled -' .
        !           184: ' bzdecompress() function needed for bz2-compressed .phars');
        !           185: }
        !           186: }
        !           187: 
        !           188: $temp = self::tmpdir();
        !           189: 
        !           190: if (!$temp || !is_writable($temp)) {
        !           191: $sessionpath = session_save_path();
        !           192: if (strpos ($sessionpath, ";") !== false)
        !           193: $sessionpath = substr ($sessionpath, strpos ($sessionpath, ";")+1);
        !           194: if (!file_exists($sessionpath) || !is_dir($sessionpath)) {
        !           195: die('Could not locate temporary directory to extract phar');
        !           196: }
        !           197: $temp = $sessionpath;
        !           198: }
        !           199: 
        !           200: $temp .= '/pharextract/'.basename(__FILE__, '.phar');
        !           201: self::$temp = $temp;
        !           202: self::$origdir = getcwd();
        !           203: @mkdir($temp, 0777, true);
        !           204: $temp = realpath($temp);
        !           205: 
        !           206: if (!file_exists($temp . DIRECTORY_SEPARATOR . md5_file(__FILE__))) {
        !           207: self::_removeTmpFiles($temp, getcwd());
        !           208: @mkdir($temp, 0777, true);
        !           209: @file_put_contents($temp . '/' . md5_file(__FILE__), '');
        !           210: 
        !           211: foreach ($info['m'] as $path => $file) {
        !           212: $a = !file_exists(dirname($temp . '/' . $path));
        !           213: @mkdir(dirname($temp . '/' . $path), 0777, true);
        !           214: clearstatcache();
        !           215: 
        !           216: if ($path[strlen($path) - 1] == '/') {
        !           217: @mkdir($temp . '/' . $path, 0777);
        !           218: } else {
        !           219: file_put_contents($temp . '/' . $path, self::extractFile($path, $file, $fp));
        !           220: @chmod($temp . '/' . $path, 0666);
        !           221: }
        !           222: }
        !           223: }
        !           224: 
        !           225: chdir($temp);
        !           226: 
        !           227: if (!$return) {
        !           228: include self::START;
        !           229: }
        !           230: }
        !           231: 
        !           232: static function tmpdir()
        !           233: {
        !           234: if (strpos(PHP_OS, 'WIN') !== false) {
        !           235: if ($var = getenv('TMP') ? getenv('TMP') : getenv('TEMP')) {
        !           236: return $var;
        !           237: }
        !           238: if (is_dir('/temp') || mkdir('/temp')) {
        !           239: return realpath('/temp');
        !           240: }
        !           241: return false;
        !           242: }
        !           243: if ($var = getenv('TMPDIR')) {
        !           244: return $var;
        !           245: }
        !           246: return realpath('/tmp');
        !           247: }
        !           248: 
        !           249: static function _unpack($m)
        !           250: {
        !           251: $info = unpack('V', substr($m, 0, 4));
        !           252:  $l = unpack('V', substr($m, 10, 4));
        !           253: $m = substr($m, 14 + $l[1]);
        !           254: $s = unpack('V', substr($m, 0, 4));
        !           255: $o = 0;
        !           256: $start = 4 + $s[1];
        !           257: $ret['c'] = 0;
        !           258: 
        !           259: for ($i = 0; $i < $info[1]; $i++) {
        !           260:  $len = unpack('V', substr($m, $start, 4));
        !           261: $start += 4;
        !           262:  $savepath = substr($m, $start, $len[1]);
        !           263: $start += $len[1];
        !           264:    $ret['m'][$savepath] = array_values(unpack('Va/Vb/Vc/Vd/Ve/Vf', substr($m, $start, 24)));
        !           265: $ret['m'][$savepath][3] = sprintf('%u', $ret['m'][$savepath][3]
        !           266: & 0xffffffff);
        !           267: $ret['m'][$savepath][7] = $o;
        !           268: $o += $ret['m'][$savepath][2];
        !           269: $start += 24 + $ret['m'][$savepath][5];
        !           270: $ret['c'] |= $ret['m'][$savepath][4] & self::MASK;
        !           271: }
        !           272: return $ret;
        !           273: }
        !           274: 
        !           275: static function extractFile($path, $entry, $fp)
        !           276: {
        !           277: $data = '';
        !           278: $c = $entry[2];
        !           279: 
        !           280: while ($c) {
        !           281: if ($c < 8192) {
        !           282: $data .= @fread($fp, $c);
        !           283: $c = 0;
        !           284: } else {
        !           285: $c -= 8192;
        !           286: $data .= @fread($fp, 8192);
        !           287: }
        !           288: }
        !           289: 
        !           290: if ($entry[4] & self::GZ) {
        !           291: $data = gzinflate($data);
        !           292: } elseif ($entry[4] & self::BZ2) {
        !           293: $data = bzdecompress($data);
        !           294: }
        !           295: 
        !           296: if (strlen($data) != $entry[0]) {
        !           297: die("Invalid internal .phar file (size error " . strlen($data) . " != " .
        !           298: $stat[7] . ")");
        !           299: }
        !           300: 
        !           301: if ($entry[3] != sprintf("%u", crc32((binary)$data) & 0xffffffff)) {
        !           302: die("Invalid internal .phar file (checksum error)");
        !           303: }
        !           304: 
        !           305: return $data;
        !           306: }
        !           307: 
        !           308: static function _removeTmpFiles($temp, $origdir)
        !           309: {
        !           310: chdir($temp);
        !           311: 
        !           312: foreach (glob('*') as $f) {
        !           313: if (file_exists($f)) {
        !           314: is_dir($f) ? @rmdir($f) : @unlink($f);
        !           315: if (file_exists($f) && is_dir($f)) {
        !           316: self::_removeTmpFiles($f, getcwd());
        !           317: }
        !           318: }
        !           319: }
        !           320: 
        !           321: @rmdir($temp);
        !           322: clearstatcache();
        !           323: chdir($origdir);
        !           324: }
        !           325: }
        !           326: 
        !           327: Extract_Phar::go();
        !           328: __HALT_COMPILER(); ?>"
        !           329: ============================================================================
        !           330: ============================================================================
        !           331: string(6694) "<?php
        !           332: 
        !           333: $web = 'index.php';
        !           334: 
        !           335: if (in_array('phar', stream_get_wrappers()) && class_exists('Phar', 0)) {
        !           336: Phar::interceptFileFuncs();
        !           337: set_include_path('phar://' . __FILE__ . PATH_SEPARATOR . get_include_path());
        !           338: Phar::webPhar(null, $web);
        !           339: include 'phar://' . __FILE__ . '/' . Extract_Phar::START;
        !           340: return;
        !           341: }
        !           342: 
        !           343: if (@(isset($_SERVER['REQUEST_URI']) && isset($_SERVER['REQUEST_METHOD']) && ($_SERVER['REQUEST_METHOD'] == 'GET' || $_SERVER['REQUEST_METHOD'] == 'POST'))) {
        !           344: Extract_Phar::go(true);
        !           345: $mimes = array(
        !           346: 'phps' => 2,
        !           347: 'c' => 'text/plain',
        !           348: 'cc' => 'text/plain',
        !           349: 'cpp' => 'text/plain',
        !           350: 'c++' => 'text/plain',
        !           351: 'dtd' => 'text/plain',
        !           352: 'h' => 'text/plain',
        !           353: 'log' => 'text/plain',
        !           354: 'rng' => 'text/plain',
        !           355: 'txt' => 'text/plain',
        !           356: 'xsd' => 'text/plain',
        !           357: 'php' => 1,
        !           358: 'inc' => 1,
        !           359: 'avi' => 'video/avi',
        !           360: 'bmp' => 'image/bmp',
        !           361: 'css' => 'text/css',
        !           362: 'gif' => 'image/gif',
        !           363: 'htm' => 'text/html',
        !           364: 'html' => 'text/html',
        !           365: 'htmls' => 'text/html',
        !           366: 'ico' => 'image/x-ico',
        !           367: 'jpe' => 'image/jpeg',
        !           368: 'jpg' => 'image/jpeg',
        !           369: 'jpeg' => 'image/jpeg',
        !           370: 'js' => 'application/x-javascript',
        !           371: 'midi' => 'audio/midi',
        !           372: 'mid' => 'audio/midi',
        !           373: 'mod' => 'audio/mod',
        !           374: 'mov' => 'movie/quicktime',
        !           375: 'mp3' => 'audio/mp3',
        !           376: 'mpg' => 'video/mpeg',
        !           377: 'mpeg' => 'video/mpeg',
        !           378: 'pdf' => 'application/pdf',
        !           379: 'png' => 'image/png',
        !           380: 'swf' => 'application/shockwave-flash',
        !           381: 'tif' => 'image/tiff',
        !           382: 'tiff' => 'image/tiff',
        !           383: 'wav' => 'audio/wav',
        !           384: 'xbm' => 'image/xbm',
        !           385: 'xml' => 'text/xml',
        !           386: );
        !           387: 
        !           388: header("Cache-Control: no-cache, must-revalidate");
        !           389: header("Pragma: no-cache");
        !           390: 
        !           391: $basename = basename(__FILE__);
        !           392: if (!strpos($_SERVER['REQUEST_URI'], $basename)) {
        !           393: chdir(Extract_Phar::$temp);
        !           394: include $web;
        !           395: return;
        !           396: }
        !           397: $pt = substr($_SERVER['REQUEST_URI'], strpos($_SERVER['REQUEST_URI'], $basename) + strlen($basename));
        !           398: if (!$pt || $pt == '/') {
        !           399: $pt = $web;
        !           400: header('HTTP/1.1 301 Moved Permanently');
        !           401: header('Location: ' . $_SERVER['REQUEST_URI'] . '/' . $pt);
        !           402: exit;
        !           403: }
        !           404: $a = realpath(Extract_Phar::$temp . DIRECTORY_SEPARATOR . $pt);
        !           405: if (!$a || strlen(dirname($a)) < strlen(Extract_Phar::$temp)) {
        !           406: header('HTTP/1.0 404 Not Found');
        !           407: echo "<html>\n <head>\n  <title>File Not Found<title>\n </head>\n <body>\n  <h1>404 - File ", $pt, " Not Found</h1>\n </body>\n</html>";
        !           408: exit;
        !           409: }
        !           410: $b = pathinfo($a);
        !           411: if (!isset($b['extension'])) {
        !           412: header('Content-Type: text/plain');
        !           413: header('Content-Length: ' . filesize($a));
        !           414: readfile($a);
        !           415: exit;
        !           416: }
        !           417: if (isset($mimes[$b['extension']])) {
        !           418: if ($mimes[$b['extension']] === 1) {
        !           419: include $a;
        !           420: exit;
        !           421: }
        !           422: if ($mimes[$b['extension']] === 2) {
        !           423: highlight_file($a);
        !           424: exit;
        !           425: }
        !           426: header('Content-Type: ' .$mimes[$b['extension']]);
        !           427: header('Content-Length: ' . filesize($a));
        !           428: readfile($a);
        !           429: exit;
        !           430: }
        !           431: }
        !           432: 
        !           433: class Extract_Phar
        !           434: {
        !           435: static $temp;
        !           436: static $origdir;
        !           437: const GZ = 0x1000;
        !           438: const BZ2 = 0x2000;
        !           439: const MASK = 0x3000;
        !           440: const START = 'my/custom/thingy.php';
        !           441: const LEN = 6696;
        !           442: 
        !           443: static function go($return = false)
        !           444: {
        !           445: $fp = fopen(__FILE__, 'rb');
        !           446: fseek($fp, self::LEN);
        !           447: $L = unpack('V', $a = (binary)fread($fp, 4));
        !           448: $m = (binary)'';
        !           449: 
        !           450: do {
        !           451: $read = 8192;
        !           452: if ($L[1] - strlen($m) < 8192) {
        !           453: $read = $L[1] - strlen($m);
        !           454: }
        !           455: $last = (binary)fread($fp, $read);
        !           456: $m .= $last;
        !           457: } while (strlen($last) && strlen($m) < $L[1]);
        !           458: 
        !           459: if (strlen($m) < $L[1]) {
        !           460: die('ERROR: manifest length read was "' .
        !           461: strlen($m) .'" should be "' .
        !           462: $L[1] . '"');
        !           463: }
        !           464: 
        !           465: $info = self::_unpack($m);
        !           466: $f = $info['c'];
        !           467: 
        !           468: if ($f & self::GZ) {
        !           469: if (!function_exists('gzinflate')) {
        !           470: die('Error: zlib extension is not enabled -' .
        !           471: ' gzinflate() function needed for zlib-compressed .phars');
        !           472: }
        !           473: }
        !           474: 
        !           475: if ($f & self::BZ2) {
        !           476: if (!function_exists('bzdecompress')) {
        !           477: die('Error: bzip2 extension is not enabled -' .
        !           478: ' bzdecompress() function needed for bz2-compressed .phars');
        !           479: }
        !           480: }
        !           481: 
        !           482: $temp = self::tmpdir();
        !           483: 
        !           484: if (!$temp || !is_writable($temp)) {
        !           485: $sessionpath = session_save_path();
        !           486: if (strpos ($sessionpath, ";") !== false)
        !           487: $sessionpath = substr ($sessionpath, strpos ($sessionpath, ";")+1);
        !           488: if (!file_exists($sessionpath) || !is_dir($sessionpath)) {
        !           489: die('Could not locate temporary directory to extract phar');
        !           490: }
        !           491: $temp = $sessionpath;
        !           492: }
        !           493: 
        !           494: $temp .= '/pharextract/'.basename(__FILE__, '.phar');
        !           495: self::$temp = $temp;
        !           496: self::$origdir = getcwd();
        !           497: @mkdir($temp, 0777, true);
        !           498: $temp = realpath($temp);
        !           499: 
        !           500: if (!file_exists($temp . DIRECTORY_SEPARATOR . md5_file(__FILE__))) {
        !           501: self::_removeTmpFiles($temp, getcwd());
        !           502: @mkdir($temp, 0777, true);
        !           503: @file_put_contents($temp . '/' . md5_file(__FILE__), '');
        !           504: 
        !           505: foreach ($info['m'] as $path => $file) {
        !           506: $a = !file_exists(dirname($temp . '/' . $path));
        !           507: @mkdir(dirname($temp . '/' . $path), 0777, true);
        !           508: clearstatcache();
        !           509: 
        !           510: if ($path[strlen($path) - 1] == '/') {
        !           511: @mkdir($temp . '/' . $path, 0777);
        !           512: } else {
        !           513: file_put_contents($temp . '/' . $path, self::extractFile($path, $file, $fp));
        !           514: @chmod($temp . '/' . $path, 0666);
        !           515: }
        !           516: }
        !           517: }
        !           518: 
        !           519: chdir($temp);
        !           520: 
        !           521: if (!$return) {
        !           522: include self::START;
        !           523: }
        !           524: }
        !           525: 
        !           526: static function tmpdir()
        !           527: {
        !           528: if (strpos(PHP_OS, 'WIN') !== false) {
        !           529: if ($var = getenv('TMP') ? getenv('TMP') : getenv('TEMP')) {
        !           530: return $var;
        !           531: }
        !           532: if (is_dir('/temp') || mkdir('/temp')) {
        !           533: return realpath('/temp');
        !           534: }
        !           535: return false;
        !           536: }
        !           537: if ($var = getenv('TMPDIR')) {
        !           538: return $var;
        !           539: }
        !           540: return realpath('/tmp');
        !           541: }
        !           542: 
        !           543: static function _unpack($m)
        !           544: {
        !           545: $info = unpack('V', substr($m, 0, 4));
        !           546:  $l = unpack('V', substr($m, 10, 4));
        !           547: $m = substr($m, 14 + $l[1]);
        !           548: $s = unpack('V', substr($m, 0, 4));
        !           549: $o = 0;
        !           550: $start = 4 + $s[1];
        !           551: $ret['c'] = 0;
        !           552: 
        !           553: for ($i = 0; $i < $info[1]; $i++) {
        !           554:  $len = unpack('V', substr($m, $start, 4));
        !           555: $start += 4;
        !           556:  $savepath = substr($m, $start, $len[1]);
        !           557: $start += $len[1];
        !           558:    $ret['m'][$savepath] = array_values(unpack('Va/Vb/Vc/Vd/Ve/Vf', substr($m, $start, 24)));
        !           559: $ret['m'][$savepath][3] = sprintf('%u', $ret['m'][$savepath][3]
        !           560: & 0xffffffff);
        !           561: $ret['m'][$savepath][7] = $o;
        !           562: $o += $ret['m'][$savepath][2];
        !           563: $start += 24 + $ret['m'][$savepath][5];
        !           564: $ret['c'] |= $ret['m'][$savepath][4] & self::MASK;
        !           565: }
        !           566: return $ret;
        !           567: }
        !           568: 
        !           569: static function extractFile($path, $entry, $fp)
        !           570: {
        !           571: $data = '';
        !           572: $c = $entry[2];
        !           573: 
        !           574: while ($c) {
        !           575: if ($c < 8192) {
        !           576: $data .= @fread($fp, $c);
        !           577: $c = 0;
        !           578: } else {
        !           579: $c -= 8192;
        !           580: $data .= @fread($fp, 8192);
        !           581: }
        !           582: }
        !           583: 
        !           584: if ($entry[4] & self::GZ) {
        !           585: $data = gzinflate($data);
        !           586: } elseif ($entry[4] & self::BZ2) {
        !           587: $data = bzdecompress($data);
        !           588: }
        !           589: 
        !           590: if (strlen($data) != $entry[0]) {
        !           591: die("Invalid internal .phar file (size error " . strlen($data) . " != " .
        !           592: $stat[7] . ")");
        !           593: }
        !           594: 
        !           595: if ($entry[3] != sprintf("%u", crc32((binary)$data) & 0xffffffff)) {
        !           596: die("Invalid internal .phar file (checksum error)");
        !           597: }
        !           598: 
        !           599: return $data;
        !           600: }
        !           601: 
        !           602: static function _removeTmpFiles($temp, $origdir)
        !           603: {
        !           604: chdir($temp);
        !           605: 
        !           606: foreach (glob('*') as $f) {
        !           607: if (file_exists($f)) {
        !           608: is_dir($f) ? @rmdir($f) : @unlink($f);
        !           609: if (file_exists($f) && is_dir($f)) {
        !           610: self::_removeTmpFiles($f, getcwd());
        !           611: }
        !           612: }
        !           613: }
        !           614: 
        !           615: @rmdir($temp);
        !           616: clearstatcache();
        !           617: chdir($origdir);
        !           618: }
        !           619: }
        !           620: 
        !           621: Extract_Phar::go();
        !           622: __HALT_COMPILER(); ?>"
        !           623: ============================================================================
        !           624: ============================================================================
        !           625: int(7074)
        !           626: ============================================================================
        !           627: ============================================================================
        !           628: Illegal filename passed in for stub creation, was 401 characters long, and only 400 or less is allowed
        !           629: ============================================================================
        !           630: ============================================================================
        !           631: ============================================================================
        !           632: ============================================================================
        !           633: string(6696) "<?php
        !           634: 
        !           635: $web = 'the/web.php';
        !           636: 
        !           637: if (in_array('phar', stream_get_wrappers()) && class_exists('Phar', 0)) {
        !           638: Phar::interceptFileFuncs();
        !           639: set_include_path('phar://' . __FILE__ . PATH_SEPARATOR . get_include_path());
        !           640: Phar::webPhar(null, $web);
        !           641: include 'phar://' . __FILE__ . '/' . Extract_Phar::START;
        !           642: return;
        !           643: }
        !           644: 
        !           645: if (@(isset($_SERVER['REQUEST_URI']) && isset($_SERVER['REQUEST_METHOD']) && ($_SERVER['REQUEST_METHOD'] == 'GET' || $_SERVER['REQUEST_METHOD'] == 'POST'))) {
        !           646: Extract_Phar::go(true);
        !           647: $mimes = array(
        !           648: 'phps' => 2,
        !           649: 'c' => 'text/plain',
        !           650: 'cc' => 'text/plain',
        !           651: 'cpp' => 'text/plain',
        !           652: 'c++' => 'text/plain',
        !           653: 'dtd' => 'text/plain',
        !           654: 'h' => 'text/plain',
        !           655: 'log' => 'text/plain',
        !           656: 'rng' => 'text/plain',
        !           657: 'txt' => 'text/plain',
        !           658: 'xsd' => 'text/plain',
        !           659: 'php' => 1,
        !           660: 'inc' => 1,
        !           661: 'avi' => 'video/avi',
        !           662: 'bmp' => 'image/bmp',
        !           663: 'css' => 'text/css',
        !           664: 'gif' => 'image/gif',
        !           665: 'htm' => 'text/html',
        !           666: 'html' => 'text/html',
        !           667: 'htmls' => 'text/html',
        !           668: 'ico' => 'image/x-ico',
        !           669: 'jpe' => 'image/jpeg',
        !           670: 'jpg' => 'image/jpeg',
        !           671: 'jpeg' => 'image/jpeg',
        !           672: 'js' => 'application/x-javascript',
        !           673: 'midi' => 'audio/midi',
        !           674: 'mid' => 'audio/midi',
        !           675: 'mod' => 'audio/mod',
        !           676: 'mov' => 'movie/quicktime',
        !           677: 'mp3' => 'audio/mp3',
        !           678: 'mpg' => 'video/mpeg',
        !           679: 'mpeg' => 'video/mpeg',
        !           680: 'pdf' => 'application/pdf',
        !           681: 'png' => 'image/png',
        !           682: 'swf' => 'application/shockwave-flash',
        !           683: 'tif' => 'image/tiff',
        !           684: 'tiff' => 'image/tiff',
        !           685: 'wav' => 'audio/wav',
        !           686: 'xbm' => 'image/xbm',
        !           687: 'xml' => 'text/xml',
        !           688: );
        !           689: 
        !           690: header("Cache-Control: no-cache, must-revalidate");
        !           691: header("Pragma: no-cache");
        !           692: 
        !           693: $basename = basename(__FILE__);
        !           694: if (!strpos($_SERVER['REQUEST_URI'], $basename)) {
        !           695: chdir(Extract_Phar::$temp);
        !           696: include $web;
        !           697: return;
        !           698: }
        !           699: $pt = substr($_SERVER['REQUEST_URI'], strpos($_SERVER['REQUEST_URI'], $basename) + strlen($basename));
        !           700: if (!$pt || $pt == '/') {
        !           701: $pt = $web;
        !           702: header('HTTP/1.1 301 Moved Permanently');
        !           703: header('Location: ' . $_SERVER['REQUEST_URI'] . '/' . $pt);
        !           704: exit;
        !           705: }
        !           706: $a = realpath(Extract_Phar::$temp . DIRECTORY_SEPARATOR . $pt);
        !           707: if (!$a || strlen(dirname($a)) < strlen(Extract_Phar::$temp)) {
        !           708: header('HTTP/1.0 404 Not Found');
        !           709: echo "<html>\n <head>\n  <title>File Not Found<title>\n </head>\n <body>\n  <h1>404 - File ", $pt, " Not Found</h1>\n </body>\n</html>";
        !           710: exit;
        !           711: }
        !           712: $b = pathinfo($a);
        !           713: if (!isset($b['extension'])) {
        !           714: header('Content-Type: text/plain');
        !           715: header('Content-Length: ' . filesize($a));
        !           716: readfile($a);
        !           717: exit;
        !           718: }
        !           719: if (isset($mimes[$b['extension']])) {
        !           720: if ($mimes[$b['extension']] === 1) {
        !           721: include $a;
        !           722: exit;
        !           723: }
        !           724: if ($mimes[$b['extension']] === 2) {
        !           725: highlight_file($a);
        !           726: exit;
        !           727: }
        !           728: header('Content-Type: ' .$mimes[$b['extension']]);
        !           729: header('Content-Length: ' . filesize($a));
        !           730: readfile($a);
        !           731: exit;
        !           732: }
        !           733: }
        !           734: 
        !           735: class Extract_Phar
        !           736: {
        !           737: static $temp;
        !           738: static $origdir;
        !           739: const GZ = 0x1000;
        !           740: const BZ2 = 0x2000;
        !           741: const MASK = 0x3000;
        !           742: const START = 'my/custom/thingy.php';
        !           743: const LEN = 6698;
        !           744: 
        !           745: static function go($return = false)
        !           746: {
        !           747: $fp = fopen(__FILE__, 'rb');
        !           748: fseek($fp, self::LEN);
        !           749: $L = unpack('V', $a = (binary)fread($fp, 4));
        !           750: $m = (binary)'';
        !           751: 
        !           752: do {
        !           753: $read = 8192;
        !           754: if ($L[1] - strlen($m) < 8192) {
        !           755: $read = $L[1] - strlen($m);
        !           756: }
        !           757: $last = (binary)fread($fp, $read);
        !           758: $m .= $last;
        !           759: } while (strlen($last) && strlen($m) < $L[1]);
        !           760: 
        !           761: if (strlen($m) < $L[1]) {
        !           762: die('ERROR: manifest length read was "' .
        !           763: strlen($m) .'" should be "' .
        !           764: $L[1] . '"');
        !           765: }
        !           766: 
        !           767: $info = self::_unpack($m);
        !           768: $f = $info['c'];
        !           769: 
        !           770: if ($f & self::GZ) {
        !           771: if (!function_exists('gzinflate')) {
        !           772: die('Error: zlib extension is not enabled -' .
        !           773: ' gzinflate() function needed for zlib-compressed .phars');
        !           774: }
        !           775: }
        !           776: 
        !           777: if ($f & self::BZ2) {
        !           778: if (!function_exists('bzdecompress')) {
        !           779: die('Error: bzip2 extension is not enabled -' .
        !           780: ' bzdecompress() function needed for bz2-compressed .phars');
        !           781: }
        !           782: }
        !           783: 
        !           784: $temp = self::tmpdir();
        !           785: 
        !           786: if (!$temp || !is_writable($temp)) {
        !           787: $sessionpath = session_save_path();
        !           788: if (strpos ($sessionpath, ";") !== false)
        !           789: $sessionpath = substr ($sessionpath, strpos ($sessionpath, ";")+1);
        !           790: if (!file_exists($sessionpath) || !is_dir($sessionpath)) {
        !           791: die('Could not locate temporary directory to extract phar');
        !           792: }
        !           793: $temp = $sessionpath;
        !           794: }
        !           795: 
        !           796: $temp .= '/pharextract/'.basename(__FILE__, '.phar');
        !           797: self::$temp = $temp;
        !           798: self::$origdir = getcwd();
        !           799: @mkdir($temp, 0777, true);
        !           800: $temp = realpath($temp);
        !           801: 
        !           802: if (!file_exists($temp . DIRECTORY_SEPARATOR . md5_file(__FILE__))) {
        !           803: self::_removeTmpFiles($temp, getcwd());
        !           804: @mkdir($temp, 0777, true);
        !           805: @file_put_contents($temp . '/' . md5_file(__FILE__), '');
        !           806: 
        !           807: foreach ($info['m'] as $path => $file) {
        !           808: $a = !file_exists(dirname($temp . '/' . $path));
        !           809: @mkdir(dirname($temp . '/' . $path), 0777, true);
        !           810: clearstatcache();
        !           811: 
        !           812: if ($path[strlen($path) - 1] == '/') {
        !           813: @mkdir($temp . '/' . $path, 0777);
        !           814: } else {
        !           815: file_put_contents($temp . '/' . $path, self::extractFile($path, $file, $fp));
        !           816: @chmod($temp . '/' . $path, 0666);
        !           817: }
        !           818: }
        !           819: }
        !           820: 
        !           821: chdir($temp);
        !           822: 
        !           823: if (!$return) {
        !           824: include self::START;
        !           825: }
        !           826: }
        !           827: 
        !           828: static function tmpdir()
        !           829: {
        !           830: if (strpos(PHP_OS, 'WIN') !== false) {
        !           831: if ($var = getenv('TMP') ? getenv('TMP') : getenv('TEMP')) {
        !           832: return $var;
        !           833: }
        !           834: if (is_dir('/temp') || mkdir('/temp')) {
        !           835: return realpath('/temp');
        !           836: }
        !           837: return false;
        !           838: }
        !           839: if ($var = getenv('TMPDIR')) {
        !           840: return $var;
        !           841: }
        !           842: return realpath('/tmp');
        !           843: }
        !           844: 
        !           845: static function _unpack($m)
        !           846: {
        !           847: $info = unpack('V', substr($m, 0, 4));
        !           848:  $l = unpack('V', substr($m, 10, 4));
        !           849: $m = substr($m, 14 + $l[1]);
        !           850: $s = unpack('V', substr($m, 0, 4));
        !           851: $o = 0;
        !           852: $start = 4 + $s[1];
        !           853: $ret['c'] = 0;
        !           854: 
        !           855: for ($i = 0; $i < $info[1]; $i++) {
        !           856:  $len = unpack('V', substr($m, $start, 4));
        !           857: $start += 4;
        !           858:  $savepath = substr($m, $start, $len[1]);
        !           859: $start += $len[1];
        !           860:    $ret['m'][$savepath] = array_values(unpack('Va/Vb/Vc/Vd/Ve/Vf', substr($m, $start, 24)));
        !           861: $ret['m'][$savepath][3] = sprintf('%u', $ret['m'][$savepath][3]
        !           862: & 0xffffffff);
        !           863: $ret['m'][$savepath][7] = $o;
        !           864: $o += $ret['m'][$savepath][2];
        !           865: $start += 24 + $ret['m'][$savepath][5];
        !           866: $ret['c'] |= $ret['m'][$savepath][4] & self::MASK;
        !           867: }
        !           868: return $ret;
        !           869: }
        !           870: 
        !           871: static function extractFile($path, $entry, $fp)
        !           872: {
        !           873: $data = '';
        !           874: $c = $entry[2];
        !           875: 
        !           876: while ($c) {
        !           877: if ($c < 8192) {
        !           878: $data .= @fread($fp, $c);
        !           879: $c = 0;
        !           880: } else {
        !           881: $c -= 8192;
        !           882: $data .= @fread($fp, 8192);
        !           883: }
        !           884: }
        !           885: 
        !           886: if ($entry[4] & self::GZ) {
        !           887: $data = gzinflate($data);
        !           888: } elseif ($entry[4] & self::BZ2) {
        !           889: $data = bzdecompress($data);
        !           890: }
        !           891: 
        !           892: if (strlen($data) != $entry[0]) {
        !           893: die("Invalid internal .phar file (size error " . strlen($data) . " != " .
        !           894: $stat[7] . ")");
        !           895: }
        !           896: 
        !           897: if ($entry[3] != sprintf("%u", crc32((binary)$data) & 0xffffffff)) {
        !           898: die("Invalid internal .phar file (checksum error)");
        !           899: }
        !           900: 
        !           901: return $data;
        !           902: }
        !           903: 
        !           904: static function _removeTmpFiles($temp, $origdir)
        !           905: {
        !           906: chdir($temp);
        !           907: 
        !           908: foreach (glob('*') as $f) {
        !           909: if (file_exists($f)) {
        !           910: is_dir($f) ? @rmdir($f) : @unlink($f);
        !           911: if (file_exists($f) && is_dir($f)) {
        !           912: self::_removeTmpFiles($f, getcwd());
        !           913: }
        !           914: }
        !           915: }
        !           916: 
        !           917: @rmdir($temp);
        !           918: clearstatcache();
        !           919: chdir($origdir);
        !           920: }
        !           921: }
        !           922: 
        !           923: Extract_Phar::go();
        !           924: __HALT_COMPILER(); ?>"
        !           925: ============================================================================
        !           926: ============================================================================
        !           927: int(7074)
        !           928: Illegal web filename passed in for stub creation, was 401 characters long, and only 400 or less is allowed
        !           929: ===DONE===

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>