1--TEST-- 2Phar: Phar::createDefaultStub() with and without arg 3--SKIPIF-- 4<?php if (!extension_loaded("phar")) die("skip"); ?> 5--FILE-- 6<?php 7try { 8var_dump(Phar::createDefaultStub()); 9echo "============================================================================\n"; 10echo "============================================================================\n"; 11var_dump(Phar::createDefaultStub('my/custom/thingy.php')); 12echo "============================================================================\n"; 13echo "============================================================================\n"; 14var_dump(strlen(Phar::createDefaultStub(str_repeat('a', 400)))); 15echo "============================================================================\n"; 16echo "============================================================================\n"; 17var_dump(Phar::createDefaultStub(str_repeat('a', 401))); 18} catch(Exception $e) { 19echo $e->getMessage() . "\n"; 20} 21echo "============================================================================\n"; 22echo "============================================================================\n"; 23echo "============================================================================\n"; 24echo "============================================================================\n"; 25try { 26var_dump(Phar::createDefaultStub('my/custom/thingy.php', 'the/web.php')); 27echo "============================================================================\n"; 28echo "============================================================================\n"; 29var_dump(strlen(Phar::createDefaultStub('index.php', str_repeat('a', 400)))); 30var_dump(Phar::createDefaultStub('hio', str_repeat('a', 401))); 31} catch (Exception $e) { 32echo $e->getMessage() . "\n"; 33} 34?> 35===DONE=== 36--EXPECT-- 37string(6683) "<?php 38 39$web = 'index.php'; 40 41if (in_array('phar', stream_get_wrappers()) && class_exists('Phar', 0)) { 42Phar::interceptFileFuncs(); 43set_include_path('phar://' . __FILE__ . PATH_SEPARATOR . get_include_path()); 44Phar::webPhar(null, $web); 45include 'phar://' . __FILE__ . '/' . Extract_Phar::START; 46return; 47} 48 49if (@(isset($_SERVER['REQUEST_URI']) && isset($_SERVER['REQUEST_METHOD']) && ($_SERVER['REQUEST_METHOD'] == 'GET' || $_SERVER['REQUEST_METHOD'] == 'POST'))) { 50Extract_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 94header("Cache-Control: no-cache, must-revalidate"); 95header("Pragma: no-cache"); 96 97$basename = basename(__FILE__); 98if (!strpos($_SERVER['REQUEST_URI'], $basename)) { 99chdir(Extract_Phar::$temp); 100include $web; 101return; 102} 103$pt = substr($_SERVER['REQUEST_URI'], strpos($_SERVER['REQUEST_URI'], $basename) + strlen($basename)); 104if (!$pt || $pt == '/') { 105$pt = $web; 106header('HTTP/1.1 301 Moved Permanently'); 107header('Location: ' . $_SERVER['REQUEST_URI'] . '/' . $pt); 108exit; 109} 110$a = realpath(Extract_Phar::$temp . DIRECTORY_SEPARATOR . $pt); 111if (!$a || strlen(dirname($a)) < strlen(Extract_Phar::$temp)) { 112header('HTTP/1.0 404 Not Found'); 113echo "<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>"; 114exit; 115} 116$b = pathinfo($a); 117if (!isset($b['extension'])) { 118header('Content-Type: text/plain'); 119header('Content-Length: ' . filesize($a)); 120readfile($a); 121exit; 122} 123if (isset($mimes[$b['extension']])) { 124if ($mimes[$b['extension']] === 1) { 125include $a; 126exit; 127} 128if ($mimes[$b['extension']] === 2) { 129highlight_file($a); 130exit; 131} 132header('Content-Type: ' .$mimes[$b['extension']]); 133header('Content-Length: ' . filesize($a)); 134readfile($a); 135exit; 136} 137} 138 139class Extract_Phar 140{ 141static $temp; 142static $origdir; 143const GZ = 0x1000; 144const BZ2 = 0x2000; 145const MASK = 0x3000; 146const START = 'index.php'; 147const LEN = 6685; 148 149static function go($return = false) 150{ 151$fp = fopen(__FILE__, 'rb'); 152fseek($fp, self::LEN); 153$L = unpack('V', $a = (binary)fread($fp, 4)); 154$m = (binary)''; 155 156do { 157$read = 8192; 158if ($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 165if (strlen($m) < $L[1]) { 166die('ERROR: manifest length read was "' . 167strlen($m) .'" should be "' . 168$L[1] . '"'); 169} 170 171$info = self::_unpack($m); 172$f = $info['c']; 173 174if ($f & self::GZ) { 175if (!function_exists('gzinflate')) { 176die('Error: zlib extension is not enabled -' . 177' gzinflate() function needed for zlib-compressed .phars'); 178} 179} 180 181if ($f & self::BZ2) { 182if (!function_exists('bzdecompress')) { 183die('Error: bzip2 extension is not enabled -' . 184' bzdecompress() function needed for bz2-compressed .phars'); 185} 186} 187 188$temp = self::tmpdir(); 189 190if (!$temp || !is_writable($temp)) { 191$sessionpath = session_save_path(); 192if (strpos ($sessionpath, ";") !== false) 193$sessionpath = substr ($sessionpath, strpos ($sessionpath, ";")+1); 194if (!file_exists($sessionpath) || !is_dir($sessionpath)) { 195die('Could not locate temporary directory to extract phar'); 196} 197$temp = $sessionpath; 198} 199 200$temp .= '/pharextract/'.basename(__FILE__, '.phar'); 201self::$temp = $temp; 202self::$origdir = getcwd(); 203@mkdir($temp, 0777, true); 204$temp = realpath($temp); 205 206if (!file_exists($temp . DIRECTORY_SEPARATOR . md5_file(__FILE__))) { 207self::_removeTmpFiles($temp, getcwd()); 208@mkdir($temp, 0777, true); 209@file_put_contents($temp . '/' . md5_file(__FILE__), ''); 210 211foreach ($info['m'] as $path => $file) { 212$a = !file_exists(dirname($temp . '/' . $path)); 213@mkdir(dirname($temp . '/' . $path), 0777, true); 214clearstatcache(); 215 216if ($path[strlen($path) - 1] == '/') { 217@mkdir($temp . '/' . $path, 0777); 218} else { 219file_put_contents($temp . '/' . $path, self::extractFile($path, $file, $fp)); 220@chmod($temp . '/' . $path, 0666); 221} 222} 223} 224 225chdir($temp); 226 227if (!$return) { 228include self::START; 229} 230} 231 232static function tmpdir() 233{ 234if (strpos(PHP_OS, 'WIN') !== false) { 235if ($var = getenv('TMP') ? getenv('TMP') : getenv('TEMP')) { 236return $var; 237} 238if (is_dir('/temp') || mkdir('/temp')) { 239return realpath('/temp'); 240} 241return false; 242} 243if ($var = getenv('TMPDIR')) { 244return $var; 245} 246return realpath('/tmp'); 247} 248 249static 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 259for ($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} 272return $ret; 273} 274 275static function extractFile($path, $entry, $fp) 276{ 277$data = ''; 278$c = $entry[2]; 279 280while ($c) { 281if ($c < 8192) { 282$data .= @fread($fp, $c); 283$c = 0; 284} else { 285$c -= 8192; 286$data .= @fread($fp, 8192); 287} 288} 289 290if ($entry[4] & self::GZ) { 291$data = gzinflate($data); 292} elseif ($entry[4] & self::BZ2) { 293$data = bzdecompress($data); 294} 295 296if (strlen($data) != $entry[0]) { 297die("Invalid internal .phar file (size error " . strlen($data) . " != " . 298$stat[7] . ")"); 299} 300 301if ($entry[3] != sprintf("%u", crc32((binary)$data) & 0xffffffff)) { 302die("Invalid internal .phar file (checksum error)"); 303} 304 305return $data; 306} 307 308static function _removeTmpFiles($temp, $origdir) 309{ 310chdir($temp); 311 312foreach (glob('*') as $f) { 313if (file_exists($f)) { 314is_dir($f) ? @rmdir($f) : @unlink($f); 315if (file_exists($f) && is_dir($f)) { 316self::_removeTmpFiles($f, getcwd()); 317} 318} 319} 320 321@rmdir($temp); 322clearstatcache(); 323chdir($origdir); 324} 325} 326 327Extract_Phar::go(); 328__HALT_COMPILER(); ?>" 329============================================================================ 330============================================================================ 331string(6694) "<?php 332 333$web = 'index.php'; 334 335if (in_array('phar', stream_get_wrappers()) && class_exists('Phar', 0)) { 336Phar::interceptFileFuncs(); 337set_include_path('phar://' . __FILE__ . PATH_SEPARATOR . get_include_path()); 338Phar::webPhar(null, $web); 339include 'phar://' . __FILE__ . '/' . Extract_Phar::START; 340return; 341} 342 343if (@(isset($_SERVER['REQUEST_URI']) && isset($_SERVER['REQUEST_METHOD']) && ($_SERVER['REQUEST_METHOD'] == 'GET' || $_SERVER['REQUEST_METHOD'] == 'POST'))) { 344Extract_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 388header("Cache-Control: no-cache, must-revalidate"); 389header("Pragma: no-cache"); 390 391$basename = basename(__FILE__); 392if (!strpos($_SERVER['REQUEST_URI'], $basename)) { 393chdir(Extract_Phar::$temp); 394include $web; 395return; 396} 397$pt = substr($_SERVER['REQUEST_URI'], strpos($_SERVER['REQUEST_URI'], $basename) + strlen($basename)); 398if (!$pt || $pt == '/') { 399$pt = $web; 400header('HTTP/1.1 301 Moved Permanently'); 401header('Location: ' . $_SERVER['REQUEST_URI'] . '/' . $pt); 402exit; 403} 404$a = realpath(Extract_Phar::$temp . DIRECTORY_SEPARATOR . $pt); 405if (!$a || strlen(dirname($a)) < strlen(Extract_Phar::$temp)) { 406header('HTTP/1.0 404 Not Found'); 407echo "<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>"; 408exit; 409} 410$b = pathinfo($a); 411if (!isset($b['extension'])) { 412header('Content-Type: text/plain'); 413header('Content-Length: ' . filesize($a)); 414readfile($a); 415exit; 416} 417if (isset($mimes[$b['extension']])) { 418if ($mimes[$b['extension']] === 1) { 419include $a; 420exit; 421} 422if ($mimes[$b['extension']] === 2) { 423highlight_file($a); 424exit; 425} 426header('Content-Type: ' .$mimes[$b['extension']]); 427header('Content-Length: ' . filesize($a)); 428readfile($a); 429exit; 430} 431} 432 433class Extract_Phar 434{ 435static $temp; 436static $origdir; 437const GZ = 0x1000; 438const BZ2 = 0x2000; 439const MASK = 0x3000; 440const START = 'my/custom/thingy.php'; 441const LEN = 6696; 442 443static function go($return = false) 444{ 445$fp = fopen(__FILE__, 'rb'); 446fseek($fp, self::LEN); 447$L = unpack('V', $a = (binary)fread($fp, 4)); 448$m = (binary)''; 449 450do { 451$read = 8192; 452if ($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 459if (strlen($m) < $L[1]) { 460die('ERROR: manifest length read was "' . 461strlen($m) .'" should be "' . 462$L[1] . '"'); 463} 464 465$info = self::_unpack($m); 466$f = $info['c']; 467 468if ($f & self::GZ) { 469if (!function_exists('gzinflate')) { 470die('Error: zlib extension is not enabled -' . 471' gzinflate() function needed for zlib-compressed .phars'); 472} 473} 474 475if ($f & self::BZ2) { 476if (!function_exists('bzdecompress')) { 477die('Error: bzip2 extension is not enabled -' . 478' bzdecompress() function needed for bz2-compressed .phars'); 479} 480} 481 482$temp = self::tmpdir(); 483 484if (!$temp || !is_writable($temp)) { 485$sessionpath = session_save_path(); 486if (strpos ($sessionpath, ";") !== false) 487$sessionpath = substr ($sessionpath, strpos ($sessionpath, ";")+1); 488if (!file_exists($sessionpath) || !is_dir($sessionpath)) { 489die('Could not locate temporary directory to extract phar'); 490} 491$temp = $sessionpath; 492} 493 494$temp .= '/pharextract/'.basename(__FILE__, '.phar'); 495self::$temp = $temp; 496self::$origdir = getcwd(); 497@mkdir($temp, 0777, true); 498$temp = realpath($temp); 499 500if (!file_exists($temp . DIRECTORY_SEPARATOR . md5_file(__FILE__))) { 501self::_removeTmpFiles($temp, getcwd()); 502@mkdir($temp, 0777, true); 503@file_put_contents($temp . '/' . md5_file(__FILE__), ''); 504 505foreach ($info['m'] as $path => $file) { 506$a = !file_exists(dirname($temp . '/' . $path)); 507@mkdir(dirname($temp . '/' . $path), 0777, true); 508clearstatcache(); 509 510if ($path[strlen($path) - 1] == '/') { 511@mkdir($temp . '/' . $path, 0777); 512} else { 513file_put_contents($temp . '/' . $path, self::extractFile($path, $file, $fp)); 514@chmod($temp . '/' . $path, 0666); 515} 516} 517} 518 519chdir($temp); 520 521if (!$return) { 522include self::START; 523} 524} 525 526static function tmpdir() 527{ 528if (strpos(PHP_OS, 'WIN') !== false) { 529if ($var = getenv('TMP') ? getenv('TMP') : getenv('TEMP')) { 530return $var; 531} 532if (is_dir('/temp') || mkdir('/temp')) { 533return realpath('/temp'); 534} 535return false; 536} 537if ($var = getenv('TMPDIR')) { 538return $var; 539} 540return realpath('/tmp'); 541} 542 543static 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 553for ($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} 566return $ret; 567} 568 569static function extractFile($path, $entry, $fp) 570{ 571$data = ''; 572$c = $entry[2]; 573 574while ($c) { 575if ($c < 8192) { 576$data .= @fread($fp, $c); 577$c = 0; 578} else { 579$c -= 8192; 580$data .= @fread($fp, 8192); 581} 582} 583 584if ($entry[4] & self::GZ) { 585$data = gzinflate($data); 586} elseif ($entry[4] & self::BZ2) { 587$data = bzdecompress($data); 588} 589 590if (strlen($data) != $entry[0]) { 591die("Invalid internal .phar file (size error " . strlen($data) . " != " . 592$stat[7] . ")"); 593} 594 595if ($entry[3] != sprintf("%u", crc32((binary)$data) & 0xffffffff)) { 596die("Invalid internal .phar file (checksum error)"); 597} 598 599return $data; 600} 601 602static function _removeTmpFiles($temp, $origdir) 603{ 604chdir($temp); 605 606foreach (glob('*') as $f) { 607if (file_exists($f)) { 608is_dir($f) ? @rmdir($f) : @unlink($f); 609if (file_exists($f) && is_dir($f)) { 610self::_removeTmpFiles($f, getcwd()); 611} 612} 613} 614 615@rmdir($temp); 616clearstatcache(); 617chdir($origdir); 618} 619} 620 621Extract_Phar::go(); 622__HALT_COMPILER(); ?>" 623============================================================================ 624============================================================================ 625int(7074) 626============================================================================ 627============================================================================ 628Illegal filename passed in for stub creation, was 401 characters long, and only 400 or less is allowed 629============================================================================ 630============================================================================ 631============================================================================ 632============================================================================ 633string(6696) "<?php 634 635$web = 'the/web.php'; 636 637if (in_array('phar', stream_get_wrappers()) && class_exists('Phar', 0)) { 638Phar::interceptFileFuncs(); 639set_include_path('phar://' . __FILE__ . PATH_SEPARATOR . get_include_path()); 640Phar::webPhar(null, $web); 641include 'phar://' . __FILE__ . '/' . Extract_Phar::START; 642return; 643} 644 645if (@(isset($_SERVER['REQUEST_URI']) && isset($_SERVER['REQUEST_METHOD']) && ($_SERVER['REQUEST_METHOD'] == 'GET' || $_SERVER['REQUEST_METHOD'] == 'POST'))) { 646Extract_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 690header("Cache-Control: no-cache, must-revalidate"); 691header("Pragma: no-cache"); 692 693$basename = basename(__FILE__); 694if (!strpos($_SERVER['REQUEST_URI'], $basename)) { 695chdir(Extract_Phar::$temp); 696include $web; 697return; 698} 699$pt = substr($_SERVER['REQUEST_URI'], strpos($_SERVER['REQUEST_URI'], $basename) + strlen($basename)); 700if (!$pt || $pt == '/') { 701$pt = $web; 702header('HTTP/1.1 301 Moved Permanently'); 703header('Location: ' . $_SERVER['REQUEST_URI'] . '/' . $pt); 704exit; 705} 706$a = realpath(Extract_Phar::$temp . DIRECTORY_SEPARATOR . $pt); 707if (!$a || strlen(dirname($a)) < strlen(Extract_Phar::$temp)) { 708header('HTTP/1.0 404 Not Found'); 709echo "<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>"; 710exit; 711} 712$b = pathinfo($a); 713if (!isset($b['extension'])) { 714header('Content-Type: text/plain'); 715header('Content-Length: ' . filesize($a)); 716readfile($a); 717exit; 718} 719if (isset($mimes[$b['extension']])) { 720if ($mimes[$b['extension']] === 1) { 721include $a; 722exit; 723} 724if ($mimes[$b['extension']] === 2) { 725highlight_file($a); 726exit; 727} 728header('Content-Type: ' .$mimes[$b['extension']]); 729header('Content-Length: ' . filesize($a)); 730readfile($a); 731exit; 732} 733} 734 735class Extract_Phar 736{ 737static $temp; 738static $origdir; 739const GZ = 0x1000; 740const BZ2 = 0x2000; 741const MASK = 0x3000; 742const START = 'my/custom/thingy.php'; 743const LEN = 6698; 744 745static function go($return = false) 746{ 747$fp = fopen(__FILE__, 'rb'); 748fseek($fp, self::LEN); 749$L = unpack('V', $a = (binary)fread($fp, 4)); 750$m = (binary)''; 751 752do { 753$read = 8192; 754if ($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 761if (strlen($m) < $L[1]) { 762die('ERROR: manifest length read was "' . 763strlen($m) .'" should be "' . 764$L[1] . '"'); 765} 766 767$info = self::_unpack($m); 768$f = $info['c']; 769 770if ($f & self::GZ) { 771if (!function_exists('gzinflate')) { 772die('Error: zlib extension is not enabled -' . 773' gzinflate() function needed for zlib-compressed .phars'); 774} 775} 776 777if ($f & self::BZ2) { 778if (!function_exists('bzdecompress')) { 779die('Error: bzip2 extension is not enabled -' . 780' bzdecompress() function needed for bz2-compressed .phars'); 781} 782} 783 784$temp = self::tmpdir(); 785 786if (!$temp || !is_writable($temp)) { 787$sessionpath = session_save_path(); 788if (strpos ($sessionpath, ";") !== false) 789$sessionpath = substr ($sessionpath, strpos ($sessionpath, ";")+1); 790if (!file_exists($sessionpath) || !is_dir($sessionpath)) { 791die('Could not locate temporary directory to extract phar'); 792} 793$temp = $sessionpath; 794} 795 796$temp .= '/pharextract/'.basename(__FILE__, '.phar'); 797self::$temp = $temp; 798self::$origdir = getcwd(); 799@mkdir($temp, 0777, true); 800$temp = realpath($temp); 801 802if (!file_exists($temp . DIRECTORY_SEPARATOR . md5_file(__FILE__))) { 803self::_removeTmpFiles($temp, getcwd()); 804@mkdir($temp, 0777, true); 805@file_put_contents($temp . '/' . md5_file(__FILE__), ''); 806 807foreach ($info['m'] as $path => $file) { 808$a = !file_exists(dirname($temp . '/' . $path)); 809@mkdir(dirname($temp . '/' . $path), 0777, true); 810clearstatcache(); 811 812if ($path[strlen($path) - 1] == '/') { 813@mkdir($temp . '/' . $path, 0777); 814} else { 815file_put_contents($temp . '/' . $path, self::extractFile($path, $file, $fp)); 816@chmod($temp . '/' . $path, 0666); 817} 818} 819} 820 821chdir($temp); 822 823if (!$return) { 824include self::START; 825} 826} 827 828static function tmpdir() 829{ 830if (strpos(PHP_OS, 'WIN') !== false) { 831if ($var = getenv('TMP') ? getenv('TMP') : getenv('TEMP')) { 832return $var; 833} 834if (is_dir('/temp') || mkdir('/temp')) { 835return realpath('/temp'); 836} 837return false; 838} 839if ($var = getenv('TMPDIR')) { 840return $var; 841} 842return realpath('/tmp'); 843} 844 845static 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 855for ($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} 868return $ret; 869} 870 871static function extractFile($path, $entry, $fp) 872{ 873$data = ''; 874$c = $entry[2]; 875 876while ($c) { 877if ($c < 8192) { 878$data .= @fread($fp, $c); 879$c = 0; 880} else { 881$c -= 8192; 882$data .= @fread($fp, 8192); 883} 884} 885 886if ($entry[4] & self::GZ) { 887$data = gzinflate($data); 888} elseif ($entry[4] & self::BZ2) { 889$data = bzdecompress($data); 890} 891 892if (strlen($data) != $entry[0]) { 893die("Invalid internal .phar file (size error " . strlen($data) . " != " . 894$stat[7] . ")"); 895} 896 897if ($entry[3] != sprintf("%u", crc32((binary)$data) & 0xffffffff)) { 898die("Invalid internal .phar file (checksum error)"); 899} 900 901return $data; 902} 903 904static function _removeTmpFiles($temp, $origdir) 905{ 906chdir($temp); 907 908foreach (glob('*') as $f) { 909if (file_exists($f)) { 910is_dir($f) ? @rmdir($f) : @unlink($f); 911if (file_exists($f) && is_dir($f)) { 912self::_removeTmpFiles($f, getcwd()); 913} 914} 915} 916 917@rmdir($temp); 918clearstatcache(); 919chdir($origdir); 920} 921} 922 923Extract_Phar::go(); 924__HALT_COMPILER(); ?>" 925============================================================================ 926============================================================================ 927int(7074) 928Illegal web filename passed in for stub creation, was 401 characters long, and only 400 or less is allowed 929===DONE=== 930