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>