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

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

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