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

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

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