PHP Classes

File: src/MimeStubIndex.php

Recommend this page to a friend!
  Classes of Till Wehowski   MIME Stub   src/MimeStubIndex.php   Download  
File: src/MimeStubIndex.php
Role: Class source
Content type: text/plain
Description: Class source
Class: MIME Stub
Generate PHP script that can self-execute the code
Author: By
Last change:
Date: 1 year ago
Size: 62,612 bytes
 

Contents

Class file image Download
<?php /*<!DOCTYPE html> <html class="no-js"> <head> <style> .ng-cloak, [ng-cloak], ng-cloak {display: none !important;} </style> </head> <body class="ng-cloak"> <script> window.addEventListener('load', function(){ var markup = document.documentElement.innerHTML; // alert(markup); // var htmlNodes=document.querySelectorAll('html'); document.write(` <h1 class="error" style="color:red;">PHP is not available at ${location.host} ... ${location.pathname}</h1> `); // alert('ho '+typeof htmlNodes); }); </script> </body> </html> <!-- * This script can be used to generate "self-executing" .php Files. * https://github.com/frdl/mime-stub * Dowload an example implementation at https://webfan.de/install/php/ ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** * Copyright (c) 2020, Till Wehowski * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of frdl/webfan nor the * names of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY frdl/webfan ''AS IS'' AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL frdl/webfan BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ** includes edited version of: * https://github.com/Riverline/multipart-parser * * Class Part * @package Riverline\MultiPartParser * * Copyright (c) 2015-2016 Romain Cambien * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software * is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR * OTHER DEALINGS IN THE SOFTWARE. * * - edited by webfan.de */ namespace frdlweb{ if($_SERVER['REMOTE_ADDR'] !== '127.0.0.1'){ // die(basename(__FILE__).__LINE__); } if (!\interface_exists(StubHelperInterface::class, false)) { interface StubHelperInterface { public function runStubs(); public function addPhpStub($code, $file = null); public function addWebfile($path, $contents, $contentType = 'application/x-httpd-php', $n = 'php'); public function addClassfile($class, $contents); public function get_file($part, $file, $name); public function Autoload($class); public function __toString(); public function __invoke(); public function __call($name, $arguments); public function getFileAttachment($file = null, $offset = null); } } if (!\interface_exists(StubItemInterface::class, false)) { interface StubItemInterface { public function getMimeType(); public function getName() ; public function getFileName(); public function isFile(); public function getParts(); public function getPartsByName( $name); public function addFile( $type = 'application/x-httpd-php', $disposition = 'php', $code, $file, $name); public function isMultiPart(); public function getBody($reEncode = false, &$encoding = null); public function __toString(); } } if (!\interface_exists(StubRunnerInterface::class, false)) { interface StubRunnerInterface { public function loginRootUser($username = null, $password = null) : bool; public function isRootUser() : bool; public function getStubVM() : StubHelperInterface; public function getStub() : StubItemInterface; public function __invoke() :?StubHelperInterface; public function getInvoker(); public function getShield(); public function autoloading() : void; } } }//namespace frdlweb namespace webfan\hps\Compile{ use frdl; use frdlweb\StubItemInterface as StubItemInterface; use frdlweb\StubHelperInterface as StubHelperInterface; use frdlweb\StubRunnerInterface as StubRunnerInterface; if(!defined('___BLOCK_WEBFAN_MIME_VM_RUNNING_STUB___')){ define('___BLOCK_WEBFAN_MIME_VM_RUNNING_STUB___', true); } class MimeVM implements StubHelperInterface { public $e_level = E_USER_ERROR; // protected $Request = false; // protected $Response = false; protected $raw = false; protected $MIME = false; protected $__FILE__ = false; protected $buf; //stream protected $IO = false; protected $file = false; protected $host = false; protected $mode = false; protected $offset = false; // protected $Context = false; // protected $Env = false; protected $initial_offset = 0; protected $php = array(); protected $_lint = true; protected $mimes_engine = array( 'application/vnd.frdl.script.php' => '_run_php_1', 'application/php' => '_run_php_1', 'text/php' => '_run_php_1', 'php' => '_run_php_1', 'multipart/mixed' => '_run_multipart', 'multipart/serial' => '_run_multipart', 'multipart/related' => '_run_multipart', 'application/x-httpd-php' => '_run_php_1', ); protected function _run_multipart($_Part){ foreach( $_Part->getParts() as $pos => $part){ if(isset($this->mimes_engine[$part->getMimeType()])){ call_user_func_array(array($this, $this->mimes_engine[$part->getMimeType()]), array($part)); } } } public function getPhpFileTypes(){ $a = []; foreach($this->mimes_engine as $type => $handler){ if('_run_php_1'===$handler){ $a[]=$type; } } return $a; } public function getBootStubs(){ return $this->get_file($this->document, '$__FILE__/stub.zip', 'archive stub.zip'); } public function runStubs($stubs = null){ $BootStubs = (!is_null($stubs)) ? $stubs : $this->getBootStubs(); foreach( $BootStubs->getParts() as $rootPos => $rootPart){ if($rootPart->isMultiPart()) { foreach( $rootPart->getParts() as $pos => $part){ if(isset($this->mimes_engine[$part->getMimeType()])){ call_user_func_array(array($this, $this->mimes_engine[$part->getMimeType()]), array($part)); } } }else{ if(isset($this->mimes_engine[$rootPart->getMimeType()])){ call_user_func_array(array($this, $this->mimes_engine[$rootPart->getMimeType()]), array($rootPart)); } } // break; }// each } public function addPhpStub($code, $file = null){ $archive = $this->get_file($this->document, '$__FILE__/stub.zip', 'archive stub.zip'); if(null === $file){ $file = '$STUB/index-'.count($archive->getParts()).'.php'; } $archive->addFile('application/x-httpd-php', 'php', $code, $file/* = '$__FILE__/filename.ext' */, 'stub stub.php'); return $this; } public function addWebfile($path, $contents, $contentType = 'application/x-httpd-php', $n = 'php'){ $this->get_file($this->document, '$__FILE__/attach.zip', 'archive attach.zip') ->addFile($contentType, $n, $contents, '$HOME/$WEB'.$path, 'stub '.$path); return $this; } public function addClassfile($class, $contents){ $this->get_file($this->document, '$__FILE__/attach.zip', 'archive attach.zip') ->addFile('application/x-httpd-php', 'php', utf8_encode($contents), '$DIR_PSR4/'.str_replace('\\', '/', $class).'.php', 'class '.$class); return $this; } public function get_file($part, $file, $name){ if(null === $part || !is_object($part) ){ return false; } if($file === $part->getFileName() || $name === $part->getName()){ return $part; } $r = function($part, $file, $name, $r) { if(null === $part || !is_object($part) ){ return false; } if($file === $part->getFileName() || $name === $part->getName()){ return $part; } if($part->isMultiPart()) { foreach( $part->getParts() as $pos => $_part){ if(null === $_part || !is_object($_part) ){ continue; } if(!$_part->isMultiPart() && $file === $_part->getFileName() || $name === $_part->getName()){ return $_part; }elseif($_part->isMultiPart()){ $_f = $r($_part, $file, $name, $r); if(false !== $_f){ return $_f; } } } } return false; }; return $r($part, $file, $name, $r); } public function Autoload($class){ $fnames = array( '$LIB/'.str_replace('\\', '/', $class).'.php', str_replace('\\', '/', $class).'.php', '$DIR_PSR4/'.str_replace('\\', '/', $class).'.php', '$DIR_LIB/'.str_replace('\\', '/', $class).'.php', ); $name = 'class '.$class; foreach($fnames as $fn){ $_p = $this->get_file($this->document, $fn, $name); if(false !== $_p){ $this->_run_php_1($_p, $class); //return $_p; return true; } } return false; } public function lint(?bool $lint = null) : bool { if(is_bool($lint)){ $this->_lint=$lint; } return $this->_lint; } public function _run_php_1(MimeStub5 $part, $class = null, ?bool $lint = null){ // set_time_limit(min(900, ini_get('max_execution_time') + 300)); if(!isset($_ENV['FRDL_HPS_CACHE_DIR'])){ $_ENV['FRDL_HPS_CACHE_DIR'] = getenv('FRDL_HPS_CACHE_DIR'); } $cacheDir = (!empty($_ENV['FRDL_HPS_CACHE_DIR'])) ? rtrim($_ENV['FRDL_HPS_CACHE_DIR'], \DIRECTORY_SEPARATOR.'/\\').\DIRECTORY_SEPARATOR.'temp-includes' : rtrim( \sys_get_temp_dir(), \DIRECTORY_SEPARATOR.'/\\').\DIRECTORY_SEPARATOR.'temp-includes'; $cacheDirLint = (!empty($_ENV['FRDL_HPS_CACHE_DIR'])) ? rtrim($_ENV['FRDL_HPS_CACHE_DIR'], \DIRECTORY_SEPARATOR.'/\\').\DIRECTORY_SEPARATOR.'temp-lint' : rtrim( \sys_get_temp_dir(), \DIRECTORY_SEPARATOR.'/\\').\DIRECTORY_SEPARATOR.'temp-lint'; if(!is_dir($cacheDirLint)){ mkdir($cacheDirLint, 0755, true); } if(!is_bool($lint)){ $lint=$this->lint(); } $code = $part->getBody(); $code = trim($code); if('<?php' === substr($code, 0, strlen('<?php')) ){ $code = substr($code, strlen('<?php'), strlen($code)); } $code = rtrim($code, '<?php> '); $codeWithStartTags = "<?php "."\n".$code."\n".'?>'; // $codeWithStartTags ='<?php'."\n".$code; $res = false; $name = $class; if(!is_string($name)){ $name = $part->getName(); } if(!is_string($name)){ $name = $part->getFileName(); } $fehler = true === $lint && class_exists(\frdl\Lint\Php::class, $class !== \frdl\Lint\Php::class) && class_exists(\webfan\hps\patch\PhpBinFinder::class, $class !== \webfan\hps\patch\PhpBinFinder::class) && class_exists(\Symfony\Component\Process\ExecutableFinder::class, $class !== \Symfony\Component\Process\ExecutableFinder::class) && class_exists(\Symfony\Component\Process\PhpExecutableFinder::class, $class !== \Symfony\Component\Process\PhpExecutableFinder::class) ? (new \frdl\Lint\Php($cacheDirLint) ) ->lintString($codeWithStartTags) : true; if(true !==$fehler ){ //$res = @eval($code); $e='Error in '.__METHOD__.' ['.__LINE__.']'.print_r($fehler,true).'<br />$class: '.$name.'<pre>'.htmlentities($codeWithStartTags).'</pre>'.$part->getFileName().' '.$part->getName(); // trigger_error($e.$fehler.$code); throw new \Exception($e.$fehler.$code); } try{ $res = eval($code); }catch(\Exception $e2){ // $res = eval($code); $e='Error in '.__METHOD__.' ['.__LINE__.']'.print_r($fehler,true).'<br />$class: '.$name.'<pre>'.htmlentities($codeWithStartTags).'</pre>'.$part->getFileName().''.$part->getName(); throw new \Exception($e2->getMessage().'<br />'.$e.$code.print_r($res,true)); } return $res; } public function __construct($file = null, $offset = 0){ $this->buf = &$this; if(null===$file)$file=__FILE__; $this->__FILE__ = $file; if(__FILE__===$this->__FILE__){ $this->offset = $this->getAttachmentOffset(); }else{ $this->offset = $offset; } $this->initial_offset = $this->offset; //$this->php = array( // '<?' => array( // // ), // '#!' => array( // // ), // '#' => array( // // ), //); // MimeStubApp::God()->addStreamWrapper( 'frdl', 'mime', $this, true ) ; } final public function __destruct(){ // try{ if(is_resource($this->IO))fclose($this->IO); // }catch(\Exception $e){ // trigger_error($e->getMessage(). ' in '.__METHOD__, $this->e_level); // } } public function __set($name, $value) { if('location'===$name){ $code =$this->__toString(); $code =str_replace(base64_decode('X19oYWx0X2NvbXBpbGVyKE1pbWU='), base64_decode("X19oYWx0X2NvbXBpbGVyKCk7TWltZQ=="), $code); $code =str_replace(base64_decode('X19oYWx0X2NvbXBpbGVyKClNbWltZQ=='), base64_decode("X19oYWx0X2NvbXBpbGVyKCk7TWltZQ=="), $code); $code =str_replace(base64_decode('X19oYWx0X2NvbXBpbGVyKClNaW1l'), base64_decode("X19oYWx0X2NvbXBpbGVyKCk7TWltZQ=="), $code); file_put_contents($value, $code); return null; } $trace = debug_backtrace(); trigger_error( 'Undefined property via __set(): ' . $name . ' in ' . $trace[0]['file'] . ' on line ' . $trace[0]['line'], E_USER_NOTICE); return null; } public function getAttachmentOffset(){ return __COMPILER_HALT_OFFSET__; } public function __toString() { // $document = $this->document; $code = $this->exports; if(__FILE__ === $this->__FILE__) { $php = substr($code, 0, $this->getAttachmentOffset()); }else{ $php = substr($code, 0, $this->initial_offset); } // $php = str_replace('define(\'___BLOCK_WEBFAN_MIME_VM_RUNNING_STUB___\', true);', 'define(\'___BLOCK_WEBFAN_MIME_VM_RUNNING_STUB___\', false);', $php); $php = str_replace('define(\'\\___BLOCK_WEBFAN_MIME_VM_RUNNING_STUB___\', true);', '', $php); $php = str_replace('define(\'___BLOCK_WEBFAN_MIME_VM_RUNNING_STUB___\', true);', '', $php); $mime = $this->document; $newNamespace = "App\compiled\Instance\MimeStub5\MimeStubEntity".mt_rand(1000000,999999999); /* $php = preg_replace("/(".preg_quote('namespace App\compiled\Instance\MimeStub\MimeStubEntity218187677;').")/", 'namespace '.\webfan\hps\Module::MODULE_NAMESPACE_FROM.';', $php); // $__FILE__ = 'web+fan://mime.stub.frdl/'.$newNamespace; $Compiler = new \webfan\hps\Compile\ModulePhpFile(0, 0, $php ); // $Compiler->setConstant('__FILE__', '__FILE__', '__FILE__'); // $Compiler->setConstant('__DIR__','__DIR__', '__DIR__'); $Compiler->setReplaceNamespace(\webfan\hps\Module::MODULE_NAMESPACE_FROM,$newNamespace); $Compiler->code($php); $php = $Compiler->compile(); */ $php = preg_replace("/(".preg_quote('namespace '.__NAMESPACE__.'{').")/", 'namespace '.$newNamespace.'{', $php); $php = $php.$mime; return $php; } public function __get($name) { switch($name){ case 'exports': return $this->getFileAttachment($this->__FILE__, 0); break; case 'location': return $this->__FILE__; break; case 'document': if(false===$this->raw){ $this->raw=$this->getFileAttachment($this->__FILE__, $this->initial_offset); } if(false===$this->MIME){ $this->MIME=MimeStub5::create($this->raw); } return $this->MIME; break; // case 'request': // return $this->Request; // break; /* case 'context': return $this->Context; break; case 'response': return $this->Response; break; */ default: return null; break; } $trace = debug_backtrace(); trigger_error( 'Undefined property via __get(): ' . $name . ' in ' . $trace[0]['file'] . ' on line ' . $trace[0]['line'], E_USER_NOTICE); return null; } public function __invoke() { $args = func_get_args(); if(false===$this->raw){ $this->raw=$this->getFileAttachment($this->__FILE__, $this->initial_offset); } if(false===$this->MIME){ $this->MIME=MimeStub5::create($this->raw); } $res = &$this; if(0<count($args)){ $i=-1; foreach($args as $arg){ $i++; if(is_string($arg)){ $cmd = $arg; if('run'===$arg){ $res = call_user_func_array(array($this, '_run'), $args); }else{ $u = parse_url($cmd); $c = explode('.',$u['host']); $c = array_reverse($c); $tld = array_shift($c); $f = false; if('frdl'===$u['scheme']){ if('mime'===$tld){ if(!isset($args[$i+1])){ $res = $this->getFileAttachment($cmd, 0); $f = true; }else if(isset($args[$i+1])){ //@todo write } } } if(false===$f){ $parent = (isset($this->MIME->parent) && null !== $this->MIME->parent) ? $this->MIME->parent : null; $this->MIME=MimeStub5::create($cmd, $parent); } } } } }elseif(0===count($args)){ $res = &$this->buf; } return $res; } protected function _run(){ $this->runStubs(); return $this; } public function __call($name, $arguments) { return call_user_func_array(array($this->document, $name), $arguments); } public function getFileAttachment($file = null, $offset = null){ if(null === $file)$file = &$this->file; if(null === $offset)$offset = $this->offset; $IO = fopen($file, 'r'); fseek($IO, $offset); try{ $buf = stream_get_contents($IO); if(is_resource($IO))fclose($IO); }catch(\Exception $e){ $buf = ''; if(is_resource($IO))fclose($IO); trigger_error($e->getMessage(), $this->e_level); } return $buf; } } /** * https://github.com/Riverline/multipart-parser * * Class Part * @package Riverline\MultiPartParser * * Copyright (c) 2015-2016 Romain Cambien * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software * is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR * OTHER DEALINGS IN THE SOFTWARE. * * - edited by webfan.de */ class MimeStub5 implements StubItemInterface { const NS = __NAMESPACE__; const DS = DIRECTORY_SEPARATOR; const FILE = __FILE__; const DIR = __DIR__; const numbers = '0123456789'; const letters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'; const specials = '!$%^&*()_+|~-=`{}[]:;<>?,./'; protected static $__i = -1; //protected $_parent; protected $_id = null; protected $_p = -1; /** * @var array */ protected $headers; /** * @var string */ protected $body; protected $_parent = null; /** * @var Part[] */ protected $parts = array(); /** * @var bool */ protected $multipart = false; protected $modified = false; protected $contentType = false; protected $encoding = false; protected $charset = false; protected $boundary = false; protected function _defaultsRandchars ($opts = array()) { $opts = array_merge(array( 'length' => 8, 'numeric' => true, 'letters' => true, 'special' => false ), $opts); return array( 'length' => (is_int($opts['length'])) ? $opts['length'] : 8, 'numeric' => (is_bool($opts['numeric'])) ? $opts['numeric'] : true, 'letters' => (is_bool($opts['letters'])) ? $opts['letters'] : true, 'special' => (is_bool($opts['special'])) ? $opts['special'] : false ); } protected function _buildRandomChars ($opts = array()) { $chars = ''; if ($opts['numeric']) { $chars .= self::numbers; } if ($opts['letters']) { $chars .= self::letters; } if ($opts['special']) { $chars .= self::specials; } return $chars; } public function generateBundary($opts = array()) { $opts = $this->_defaultsRandchars($opts); $i = 0; $rn = ''; $rnd = ''; $len = $opts['length']; $randomChars = $this->_buildRandomChars($opts); for ($i = 1; $i <= $len; $i++) { $rn = mt_rand(0, strlen($randomChars) -1); $n = substr($randomChars, $rn, 1); $rnd .= $n; } return $rnd; } public function __set($name, $value) { $trace = debug_backtrace(); trigger_error( 'Undefined property via __set(): ' . $name . ' in ' . $trace[0]['file'] . ' on line ' . $trace[0]['line'], E_USER_NOTICE); return null; } public function __get($name) { // echo "Getting '$name'\n"; // if (array_key_exists($name, $this->data)) { // return $this->data[$name]; // } switch($name){ case 'disposition' : return $this->getHeader('Content-Disposition'); break; case 'parent': return $this->_parent; break; case 'id': return $this->_id; break; case 'nextChild': $this->_p=++$this->_p; if($this->_p >= count($this->parts)/* -1*/)return false; return (is_array($this->parts)) ? $this->parts[$this->_p] : null; break; case 'next': return $this->nextChild; break; case 'rewind': $this->_p=-1; return $this; case 'root': if(null === $this->parent || (get_class($this->parent) !== get_class($this)))return $this; return $this->parent->root; break; case 'isRoot': return ($this->root->id === $this->id) ? true : false; break; case 'lastChild': return (is_array($this->parts)) ? $this->parts[count($this->parts)-1] : null; break; case 'firstChild': return (is_array($this->parts) && isset($this->parts[0])) ? $this->parts[0] : null; break; default: return null; break; } $trace = debug_backtrace(); trigger_error( 'Undefined property via __get(): ' . $name . ' in ' . $trace[0]['file'] . ' on line ' . $trace[0]['line'], E_USER_NOTICE); return null; } protected function _hashBody(){ if($this->isMultiPart()){ // $this->setHeader('Content-MD5', md5($this)); // $this->setHeader('Content-SHA1', sha1($this)); } else{ $this->setHeader('Content-MD5', md5($this->body)); $this->setHeader('Content-SHA1', sha1($this->body)); $this->setHeader('Content-Length', strlen($this->body)); } } protected function _hashBodyRemove(){ $this->removeHeader('Content-MD5'); $this->removeHeader('Content-SHA1'); $this->removeHeader('Content-Length'); } public function __call($name, $arguments) { if('setBody'===$name){ $this->clear(); if(!isset($arguments[0]))$arguments[0]=''; $this->prepend($arguments[0]); return $this; }elseif('prepend'===$name){ if(!isset($arguments[0]))$arguments[0]=''; if($this->isMultiPart()){ $this->parts[] = new self($arguments[0], $this); return $this; }else{ $this->body = $arguments[0] . $this->body; $this->_hashBody(); return $this; } }elseif('append'===$name){ if(!isset($arguments[0]))$arguments[0]=''; if($this->isMultiPart()){ $this->parts[] = new self($arguments[0], $this); return $this; }else{ $this->body .= $arguments[0]; $this->_hashBody(); return $this; } }elseif('clear' === $name){ if($this->isMultiPart()){ $this->parts = array(); }else{ $this->body = ''; $this->_hashBodyRemove(); } return $this; }else{ //https://tools.ietf.org/id/draft-snell-http-batch-00.html foreach(array('from', 'to', 'cc', 'bcc', 'sender', 'subject', 'reply-to'/* ->{'reply-to'} */, 'in-reply-to', 'message-id') as $_header){ if($_header===$name){ if(0===count($arguments)){ return $this->getHeader($_header, null); }elseif(null===$arguments[0]){ $this->removeHeader($_header); }elseif(isset($arguments[0]) && is_string($arguments[0])){ $this->setHeader($_header, $arguments[0]); } return $this; } } } //else // Note: value of $name is case sensitive. $trace = debug_backtrace(); trigger_error( 'Undefined property via __call(): ' . $name . ' in ' . $trace[0]['file'] . ' on line ' . $trace[0]['line'], E_USER_NOTICE); return null; } /** As of PHP 5.3.0 */ public static function __callStatic($name, $arguments) { if('run'===$name){ return call_user_func_array('run', $arguments); } if('vm'===$name){ if(0===count($arguments)){ return new MimeVM(); }elseif(1===count($arguments)){ return new MimeVM($arguments[0]); }elseif(2===count($arguments)){ return new MimeVM($arguments[0], $arguments[1]); } // return call_user_func_array(array(webfan\MimeVM, '__construct'), $arguments); return new MimeVM(); } if('create'===$name){ if(!isset($arguments[0]))$arguments[0]=''; if(!isset($arguments[1]))$arguments[1]=null; return new self($arguments[0], $arguments[1]); } // Note: value of $name is case sensitive. $trace = debug_backtrace(); trigger_error( 'Undefined property via __callStatic(): ' . $name . ' in ' . $trace[0]['file'] . ' on line ' . $trace[0]['line'], E_USER_NOTICE); return null; } public function getContentType() { $this->contentType=$this->getMimeType(); return $this->contentType; } public function headerName($headName) { $headName = str_replace('-', ' ', $headName); $headName = ucwords($headName); return preg_replace("/\s+/", "\s", str_replace(' ', '-', $headName)); } /** * @param string $input A base64 encoded string * * @return string A decoded string */ public static function urlsafeB64Decode($input) { $remainder = strlen($input) % 4; if ($remainder) { $padlen = 4 - $remainder; $input .= str_repeat('=', $padlen); } return base64_decode(strtr($input, '-_', '+/')); } /** * @param string $input Anything really * * @return string The base64 encode of what you passed in */ public static function urlsafeB64Encode($input) { return str_replace('=', '', strtr(base64_encode($input), '+/', '-_')); } public static function strip_body($s,$s1,$s2=false,$offset=0, $_trim = true) { /* * http://php.net/manual/en/function.strpos.php#75146 */ // if( $s2 === false ) { $s2 = $s1; } if( $s2 === false ) { $s2 = $s1.'--'; } $result = array(); $result_2 = array(); $L1 = strlen($s1); $L2 = strlen($s2); if( $L1==0 || $L2==0 ) { return false; } do { $pos1 = strpos($s,$s1,$offset); if( $pos1 !== false ) { $pos1 += $L1; $pos2 = strpos($s,$s2,$pos1); if( $pos2 !== false ) { $key_len = $pos2 - $pos1; $this_key = substr($s,$pos1,$key_len); if(true===$_trim){ $this_key = trim($this_key); } if( !array_key_exists($this_key,$result) ) { $result[$this_key] = array(); } $result[$this_key][] = $pos1; $result_2[] = array( 'pos' => $pos1, 'content' => $this_key ); $offset = $pos2 + $L2; } else { $pos1 = false; } } } while($pos1 !== false ); return array( 'pindex' => $result_2, 'cindex' => $result ); } /** * MultiPart constructor. * @param string $content * @throws \InvalidArgumentException */ protected function __construct($content, &$parent = null) { $this->_id = ++self::$__i; $this->_parent = $parent; // Split headers and body $splits = preg_split('/(\r?\n){2}/', $content, 2); if (count($splits) < 2) { throw new \InvalidArgumentException("Content is not valid, can't split headers and content"); } list ($headers, $body) = $splits; // Regroup multiline headers $currentHeader = ''; $headerLines = array(); foreach (preg_split('/\r?\n/', $headers) as $line) { if (empty($line)) { continue; } if (preg_match('/^\h+(.+)/', $line, $matches)) { // Multi line header $currentHeader .= ' '.$matches[1]; } else { if (!empty($currentHeader)) { $headerLines[] = $currentHeader; } $currentHeader = trim($line); } } if (!empty($currentHeader)) { $headerLines[] = $currentHeader; } // Parse headers $this->headers = array(); foreach ($headerLines as $line) { $lineSplit = explode(':', $line, 2); if (2 === count($lineSplit)) { list($key, $value) = $lineSplit; // Decode value $value = mb_decode_mimeheader(trim($value)); } else { // Bogus header $key = $lineSplit[0]; $value = ''; } // Case-insensitive key $key = strtolower($key); if (!isset($this->headers[$key])) { $this->headers[$key] = $value; } else { if (!is_array($this->headers[$key])) { $this->headers[$key] = (array)$this->headers[$key]; } $this->headers[$key][] = $value; } } // Is MultiPart ? $contentType = $this->getHeader('Content-Type'); $this->contentType=$contentType; if ('multipart' === strstr(self::getHeaderValue($contentType), '/', true)) { // MultiPart ! $this->multipart = true; $boundary = self::getHeaderOption($contentType, 'boundary'); $this->boundary=$boundary; if (null === $boundary) { throw new \InvalidArgumentException("Can't find boundary in content type"); } $separator = '--'.preg_quote($boundary, '/'); if (0 === preg_match('/'.$separator.'\r?\n(.+?)\r?\n'.$separator.'--/s', $body, $matches) || \preg_last_error() !== \PREG_NO_ERROR ) { $bodyParts = self::strip_body($body,$separator."",$separator."--",0); if(1 !== count($bodyParts['pindex'])){ throw new \InvalidArgumentException("Can't find multi-part content"); } $bodyStr = $bodyParts['pindex'][0]['content']; unset($bodyParts); }else{ $bodyStr = $matches[1]; } $parts = preg_split('/\r?\n'.$separator.'\r?\n/', $bodyStr); unset($bodyStr); foreach ($parts as $part) { //$this->parts[] = new self($part, $this); $this->append($part); } } else { // Decode $encoding = $this->getEcoding(); switch ($encoding) { case 'base64': $body = $this->urlsafeB64Decode($body); break; case 'quoted-printable': $body = quoted_printable_decode($body); break; } // Convert to UTF-8 ( Not if binary or 7bit ( aka Ascii ) ) if (!in_array($encoding, array('binary', '7bit'))) { // Charset $charset = self::getHeaderOption($contentType, 'charset'); if (null === $charset) { // Try to detect $charset = mb_detect_encoding($body) ?: 'utf-8'; } $this->charset=$charset; // Only convert if not UTF-8 if ('utf-8' !== strtolower($charset)) { $body = \mb_convert_encoding($body, 'utf-8', $charset); } } $this->body = $body; } } public function __toString() { $boundary = $this->getBoundary($this->isMultiPart()); $s=''; foreach($this->headers as $hname => $hvalue){ $s.= $this->headerName($hname).': '. $this->getHeader($hname) /*$hvalue*/."\r\n"; } $s.= "\r\n" ; if ($this->isMultiPart()) $s.= "--" ; $s.= $boundary ; if ($this->isMultiPart()) $s.= "\r\n" ; if ($this->isMultiPart()) { foreach ($this->parts as $part) { $s.= (get_class($this) === get_class($part)) ? $part : $part->__toString() . "\r\n" ; } $s.= "\r\n"."--" . $boundary . '--'; }else{ $s.= $this->getBody(true, $encoding); } if (null!==$this->parent && $this->parent->isMultiPart() && $this->parent->lastChild->id !== $this->id){ $s.= "\r\n" . "--" .$this->parent->getBoundary() . "\r\n"; } return $s; } public function getEcoding() { $this->encoding=strtolower($this->getHeader('Content-Transfer-Encoding')); return $this->encoding; } public function getCharset() { // return $this->charset; $charset = self::getHeaderOption($this->getMimeType(), 'charset'); if(!is_string($charset)) { // Try to detect $charset = mb_detect_encoding($this->body) ?: 'utf-8'; } $this->charset=$charset; return $this->charset; } public function setBoundary($boundary = null, $opts = array()) { $this->mod(); if(null===$boundary){ $size = 8; if(4 < count($this->parts))$size = 32; if(6 < count($this->parts))$size = 40; if(8 < count($this->parts))$size = 64; if(10 <= count($this->parts))$size = 70; $opt = array( 'length' => $size ); $options = array_merge($opt, $opts); $boundary = $this->generateBundary($options); } $this->boundary =$boundary; $this->setHeaderOption('Content-Type', $this->boundary, 'boundary'); } public function getBoundary($generate = true) { $this->boundary = self::getHeaderOption($this->getHeader('Content-Type'), 'boundary'); if(true === $generate && $this->isMultiPart() && (!is_string($this->boundary) || 0===strlen(trim($this->boundary))) ){ $this->setBoundary(); } return $this->boundary; } /** * @param string $key * @param mixed $default * @return mixed */ public function mod() { $this->modified = true; return $this; } public function setHeader($key, $value) { $this->mod(); $key = strtolower($key); $this->headers[$key]=$value; // echo print_r($this->headers, true); return $this; } public function removeHeader($key) { $this->mod(); unset($this->headers[$key]); return $this; } public function setHeaderOption($headerName, $value = null, $opt = null) { $this->mod(); $old_header_value = $this->getHeader($headerName); if(null===$opt && null !==$value){ $this->headers[$headerName]=$value; }else if(null !==$opt && null !==$value){ list($headerValue,$options) = self::parseHeaderContent($old_header_value); $options[$opt]=$value; $new_header_value = $headerValue; // $new_header_value=''; foreach($options as $o => $v){ $new_header_value .= ';'.$o.'='.$v.''; } $this->setHeader($headerName, $new_header_value); } return $this; } /** * @return bool */ public function isMultiPart() { return $this->multipart; } /** * @return string * @throws \LogicException if is multipart */ public function getBody($reEncode = false, &$encoding = null) { if ($this->isMultiPart()) { throw new \LogicException("MultiPart content, there aren't body"); } else { $body = $this->body; if(true===$reEncode){ $encoding = $this->getEcoding(); switch ($encoding) { case 'base64': $body = $this->urlsafeB64Encode($body); break; case 'quoted-printable': $body = quoted_printable_encode($body); break; } // Convert to UTF-8 ( Not if binary or 7bit ( aka Ascii ) ) if (!in_array($encoding, array('binary', '7bit'))) { // back de-/encode if ( 'utf-8' !== strtolower(self::getHeaderOption($this->getMimeType(), 'charset')) && 'utf-8' === mb_detect_encoding($body)) { $body = mb_convert_encoding($body, self::getHeaderOption($this->getMimeType(), 'charset'), 'utf-8'); }elseif ( 'utf-8' === strtolower(self::getHeaderOption($this->getMimeType(), 'charset')) && 'utf-8' !== mb_detect_encoding($body)) { $body = mb_convert_encoding($body, 'utf-8', mb_detect_encoding($body)); } } } return $body; } } /** * @return array */ public function getHeaders() { return $this->headers; } /** * @param string $key * @param mixed $default * @return mixed */ public function getHeader($key, $default = null) { // Case-insensitive key $key = strtolower($key); if (isset($this->headers[$key])) { return $this->headers[$key]; } else { return $default; } } /** * @param string $content * @return array */ static protected function parseHeaderContent($content) { $parts = explode(';', $content); $headerValue = array_shift($parts); $options = array(); // Parse options foreach ($parts as $part) { if (!empty($part)) { $partSplit = explode('=', $part, 2); if (2 === count($partSplit)) { list ($key, $value) = $partSplit; $options[trim($key)] = trim($value, ' "'); } else { // Bogus option $options[$partSplit[0]] = ''; } } } return array($headerValue, $options); } /** * @param string $header * @return string */ static public function getHeaderValue($header) { list($value) = self::parseHeaderContent($header); return $value; } /** * @param string $header * @return string */ static public function getHeaderOptions($header) { list(,$options) = self::parseHeaderContent($header); return $options; } /** * @param string $header * @param string $key * @param mixed $default * @return mixed */ static public function getHeaderOption($header, $key, $default = null) { $options = self::getHeaderOptions($header); if (isset($options[$key])) { return $options[$key]; } else { return $default; } } /** * @return string */ public function getMimeType() { // Find Content-Disposition $contentType = $this->getHeader('Content-Type'); return self::getHeaderValue($contentType) ?: 'application/octet-stream'; } /** * @return string|null */ public function getName() { // Find Content-Disposition $contentDisposition = $this->getHeader('Content-Disposition'); return self::getHeaderOption($contentDisposition, 'name'); } /** * @return string|null */ public function getFileName() { // Find Content-Disposition $contentDisposition = $this->getHeader('Content-Disposition'); return self::getHeaderOption($contentDisposition, 'filename'); } /** * @return bool */ public function isFile() { return !is_null($this->getFileName()); } /** * @return Part[] * @throws \LogicException if is not multipart */ public function getParts() { if ($this->isMultiPart()) { return $this->parts; } else { throw new \LogicException("Not MultiPart content, there aren't any parts"); } } /** * @param string $name * @return Part[] * @throws \LogicException if is not multipart */ public function getPartsByName($name) { $parts = array(); foreach ($this->getParts() as $part) { if ($part->getName() === $name) { $parts[] = $part; } } return $parts; } public function addFile($type = 'application/x-httpd-php', $disposition = 'php', $code, $file/* = '$__FILE__/filename.ext' */, $name/* = 'stub stub.php'*/){ // if(null===$parent){ // $parent = &$this; // } /* $code = trim($code); $N = new self($this->newFile($type, $disposition, $file, $name), $parent); $N->setBody($code); if(\webfan\hps\Format\Validate::isbase64($code) ){ $N->setHeader('Content-Transfer-Encoding', 'BASE64'); } $N->setBoundary($N->getBoundary($N->isMultiPart())); // $parent->append($N); */ // $parent->append( $this->newFile($type, $disposition, $file, $name, $code) ); $class = get_class($this); $N = new $class($this->newFile($type, $disposition, $file, $name, $code), $parent); // $N->setBody($code); // $N->setBoundary($N->getBoundary($N->isMultiPart())); $this->append($N); return $this; } public function newFile($type = 'application/x-httpd-php', $disposition = 'php', $file = '$HOME/index.php', $name = 'stub stub.php', $code = ''){ if(null === $boundary){ $boundary = $this->getBoundary($this->isMultiPart()); } while($code === $boundary){ $boundary = $this->generateBoundary([ 'length' => max(min(8, strlen($code)), 32), 'numeric' => true, 'letters' => true, 'special' => false ]); $this->setBoundary($boundary); } $codeWrap =''; if(is_string($type)){ $codeWrap.= <<<HEADER Content-Disposition: "$disposition" ; filename="$file" ; name="$name" Content-Type: $type HEADER; }else{ $codeWrap.= "Content-Disposition: ".$disposition." ; filename=\"".$file."\" ; name=\"".$name."\""; } if('application/x-httpd-php' === $type || 'application/vnd.frdl.script.php' === $type){ $code = trim($code); if('<?php' === substr($code, 0, strlen('<?php')) ){ $code = substr($code, strlen('<?php'), strlen($code)); } $code = rtrim($code, '<?php> '); $code = '<?php '.$code.' ?>'; } $codeWrap.= "\r\n"."\r\n". trim($code); //$codeWrap.=\PHP_EOL. $code. \PHP_EOL. \PHP_EOL.'--'.$boundary.'--'; //$codeWrap.= \PHP_EOL; //$codeWrap.= \PHP_EOL; Content-Type: $type ; charset=utf-8 ;boundary="$boundary" Content-Type: $type ; charset=utf-8 ;boundary="$boundary" return $codeWrap; } } $maxExecutionTime = intval(ini_get('max_execution_time')); set_time_limit(max($maxExecutionTime, 180)); ini_set('display_errors','on'); error_reporting(\E_ERROR | \E_WARNING | \E_PARSE); class MimeStubIndex extends MimeStub5 { } //\class_alias('\\'.__NAMESPACE__.'\\MimeStub5', '\\'.__NAMESPACE__.'\\MimeStubIndex'); \class_alias('\\'.__NAMESPACE__.'\\MimeStubIndex', '\\'.__NAMESPACE__.'\\MimeStub'); if ( !function_exists('sys_get_temp_dir')) { function sys_get_temp_dir() { if (!empty($_ENV['TMP'])) { return realpath($_ENV['TMP']); } if (!empty($_ENV['TMPDIR'])) { return realpath( $_ENV['TMPDIR']); } if (!empty($_ENV['TEMP'])) { return realpath( $_ENV['TEMP']); } $tempfile=tempnam(__FILE__,''); if (file_exists($tempfile)) { unlink($tempfile); return realpath(dirname($tempfile)); } return null; } } call_user_func(function() { $drush_server_home = (function() { $getRootDir; $getRootDir = (function($path = null) use(&$getRootDir){ if(null===$path){ $path = $_SERVER['DOCUMENT_ROOT']; } if(''!==dirname($path) && '/'!==dirname($path) //&& @chmod(dirname($path), 0755) && true===@is_writable(dirname($path)) ){ return $getRootDir(dirname($path)); }else{ return $path; } }); // Cannot use $_SERVER superglobal since that's empty during UnitUnishTestCase // getenv('HOME') isn't set on Windows and generates a Notice. $home = getenv('HOME'); if (!empty($home)) { // home should never end with a trailing slash. $home = rtrim($home, '/'); }elseif (isset($_SERVER['HOME']) && !empty($_SERVER['HOME'])) { // home on windows $home = $_SERVER['HOME']; // If HOMEPATH is a root directory the path can end with a slash. Make sure // that doesn't happen. $home = rtrim($home, '\\/'); }elseif (!empty($_SERVER['HOMEDRIVE']) && !empty($_SERVER['HOMEPATH'])) { // home on windows $home = $_SERVER['HOMEDRIVE'] . $_SERVER['HOMEPATH']; // If HOMEPATH is a root directory the path can end with a slash. Make sure // that doesn't happen. $home = rtrim($home, '\\/'); }elseif (isset($_ENV['HOME']) && !empty($_ENV['HOME'])) { // home on windows $home = $_ENV['HOME']; // If HOMEPATH is a root directory the path can end with a slash. Make sure // that doesn't happen. $home = rtrim($home, '\\/'); } return empty($home) ? $getRootDir($_SERVER['DOCUMENT_ROOT']) : $home; }); $_ENV['FRDL_HPS_PSR4_CACHE_LIMIT'] = (isset($_ENV['FRDL_HPS_PSR4_CACHE_LIMIT'])) ? intval($_ENV['FRDL_HPS_PSR4_CACHE_LIMIT']) : time() - filemtime(__FILE__); putenv('FRDL_HPS_PSR4_CACHE_LIMIT='.$_ENV['FRDL_HPS_PSR4_CACHE_LIMIT']); //$_ENV['HOME'] = $drush_server_home(); //putenv('HOME='.$_ENV['HOME']); $_ENV['FRDL_HOME'] = $drush_server_home(); putenv('FRDL_HOME='.$_ENV['FRDL_HOME']); //putenv('HOME='.$_ENV['FRDL_HOME']); $_homeg = str_replace(\DIRECTORY_SEPARATOR, '/', getenv('FRDL_HOME')); $_cwd = getcwd(); chdir(getenv('FRDL_HOME')); $workspaces = false; $_dir = getenv('FRDL_HOME') . \DIRECTORY_SEPARATOR . '.frdl'; //if(!is_dir($_dir)){ $g = (file_exists("frdl.workspaces.php")) ? [realpath("frdl.workspaces.php")] : glob("frdl.workspaces.php"); if(0===count($g)){ $g = array_merge(glob(str_replace(\DIRECTORY_SEPARATOR, '/', getcwd())."/frdl.workspaces.php"), glob($_homeg."/frdl.workspaces.php"), glob($_homeg."/*/frdl.workspaces.php"), glob($_homeg."/*/*/frdl.workspaces.php")); } if(0<count($g)){ // $_dir = dirname($g[0]); $workspaces = require $g[0]; if(isset($workspaces['Frdlweb'])){ $_dir = $workspaces['Frdlweb']['DIR']; }else{ foreach($workspaces as $name => $w){ if(isset($w['DIR']) && is_dir($w['DIR'])){ $_dir = $w['DIR']; break; } } } } //} $_ENV['FRDL_WORKSPACE']= rtrim($_dir, '\\/'); putenv('FRDL_WORKSPACE='.$_ENV['FRDL_WORKSPACE']); $_f = $_ENV['FRDL_WORKSPACE']. \DIRECTORY_SEPARATOR.'frdl.workspaces.php'; if(is_array($workspaces) && (!file_exists("frdl.workspaces.php") || time()-$_ENV['FRDL_HPS_PSR4_CACHE_LIMIT'] > filemtime("frdl.workspaces.php")) && @is_dir($_ENV['FRDL_WORKSPACE']) && @is_file($_f) ){ // $exports = var_export($workspaces, true); $code = <<<PHPCODE <?php return require '$_f'; PHPCODE; file_put_contents("frdl.workspaces.php", $code); } if(!@is_dir($_ENV['FRDL_WORKSPACE'])){ @mkdir($_ENV['FRDL_WORKSPACE'], 0755, true); } //$_ENV['FRDL_HPS_CACHE_DIR'] = $_dir . \DIRECTORY_SEPARATOR .\get_current_user() . \DIRECTORY_SEPARATOR. 'cache'. \DIRECTORY_SEPARATOR; $_ENV['FRDL_HPS_CACHE_DIR'] = \sys_get_temp_dir() . \DIRECTORY_SEPARATOR .\get_current_user() . \DIRECTORY_SEPARATOR. 'cache'. \DIRECTORY_SEPARATOR; putenv('FRDL_HPS_CACHE_DIR='.$_ENV['FRDL_HPS_CACHE_DIR']); //putenv('TMP='.$_ENV['FRDL_HPS_CACHE_DIR']); //ini_set('sys_temp_dir', realpath($_ENV['FRDL_HPS_CACHE_DIR'])); if(!@is_dir($_ENV['FRDL_HPS_CACHE_DIR'])){ @mkdir($_ENV['FRDL_HPS_CACHE_DIR'], 0755, true); } $_ENV['FRDL_HPS_PSR4_CACHE_DIR'] = rtrim($_ENV['FRDL_HPS_CACHE_DIR'], \DIRECTORY_SEPARATOR).\DIRECTORY_SEPARATOR.'psr4'.\DIRECTORY_SEPARATOR; putenv('FRDL_HPS_PSR4_CACHE_DIR='.$_ENV['FRDL_HPS_PSR4_CACHE_DIR']); if(!@is_dir($_ENV['FRDL_HPS_PSR4_CACHE_DIR'])){ @mkdir($_ENV['FRDL_HPS_PSR4_CACHE_DIR'], 0755, true); } chdir($_cwd); }); /** * * $run Function * */ $run = function($file = null, $doRun = false){ $args = func_get_args(); $MimeVM = new MimeVM($args[0]); if($doRun){ set_time_limit(min(900, ini_get('max_execution_time') + 300)); // if (!headers_sent()){ // header_remove(); // } $MimeVM('run'); } return $MimeVM; }; $_NotIsTemplateContext = ( !defined('___BLOCK_WEBFAN_MIME_VM_RUNNING_STUB___') || false === ___BLOCK_WEBFAN_MIME_VM_RUNNING_STUB___ ) && ( !defined('\___BLOCK_WEBFAN_MIME_VM_RUNNING_STUB___') || false === \___BLOCK_WEBFAN_MIME_VM_RUNNING_STUB___ ) ? true : false; $included_files = \get_included_files(); if(( (!in_array(__FILE__, $included_files) || __FILE__===$included_files[0]) && ( (explode('?', $_SERVER['REQUEST_URI'])[0] === $_SERVER['PHP_SELF'] && basename( $_SERVER['PHP_SELF']) === basename(__FILE__)) || (basename( $_SERVER['PHP_SELF']) === 'index.php') ) ) || ('cli'===substr(strtolower(\PHP_SAPI), 0, 3)) ) { if(!$_NotIsTemplateContext){ /* die('Warning: Suspecious context! Solution: Just download this the right way from https://frdl.webfan.de/install/ or comment out line '.__LINE__.' of '.basename(__FILE__)); */ } $MimeVM = $run(__FILE__, true); }else{ $MimeVM = $run(__FILE__, false); } class StubRunner implements StubRunnerInterface { protected $MimeVM = null; public function __construct(?StubHelperInterface $MimeVM){ $THAT = &$this; $this->MimeVM=$MimeVM; } public function loginRootUser($username = null, $password = null) : bool{ return \Webfan\App\Shield::getInstance($this->getStub(), \frdl\i::c(), false)->isAdmin(null,true, $username, $password); } public function isRootUser() : bool{ return \Webfan\App\Shield::getInstance($this->getStub(), \frdl\i::c(), false)->isAdmin(null,false); } public function getStubVM() : StubHelperInterface{ return $this->MimeVM; } public function getStub() : StubItemInterface{ return $this->MimeVM->document; } public function __invoke() :?StubHelperInterface{ // $vm = $this->MimeVM; // return $vm('run'); //$MimeVM = new MimeVM(__FILE__); // $MimeVM('run'); // return $MimeVM; $this->MimeVM->runStubs(); return $this->MimeVM; } public function getInvoker(){ return [$this, '__invoke']; } public function autoloading() : void{ // $file_1 = $this->getStubVM()->get_file($this->getStub(), '$STUB/bootstrap.php', 'stub bootstrap.php'); //print_r($file_1); $this->getStubVM()->_run_php_1( $this->getStubVM()->get_file($this->getStub(), '$STUB/bootstrap.php', 'stub bootstrap.php')); $this->getStubVM()->_run_php_1( $this->getStubVM()->get_file($this->getStub(), '$HOME/detect.php', 'stub detect.php')); // $AppShield = \Webfan\App\Shield::getInstance($this->getStubVM(), \frdl\i::c()); } public function getShield(){ return \Webfan\App\Shield::getInstance($this->getStub(), \frdl\i::c(), false); } } $StubRunner = new StubRunner($MimeVM); return $StubRunner; }//namespace __halt_compiler();Mime-Version: 1.0 Content-Type: multipart/mixed;boundary=hoHoBundary12344dh To: example@example.com From: script@example.com --hoHoBundary12344dh Content-Type: multipart/alternate;boundary=EVGuDPPT --EVGuDPPT Content-Type: text/html;charset=utf-8 <h1>InstallShield</h1> <p>Your Installer you downloaded at <a href="https://frdl.webfan.de/install/">frdl@Webfan</a> is attatched in this message.</p> <p>You may have to run it in your APC-Environment.</p> --EVGuDPPT Content-Type: text/plain;charset=utf-8 -InstallShield- Your Installer you downloaded at https://frdl.webfan.de/install/ is attatched in this message. You may have to run it in your APC-Environment. --EVGuDPPT Content-Type: multipart/related;boundary=4444EVGuDPPT Content-Disposition: php ;filename="$__FILE__/stub.zip";name="archive stub.zip" --4444EVGuDPPT Content-Type: application/x-httpd-php;charset=utf-8 Content-Disposition: php ;filename="$STUB/bootstrap.php";name="stub bootstrap.php" set_time_limit(min(120, intval(ini_get('max_execution_time')) + 120)); spl_autoload_register(array($this,'Autoload'), true, true); try{ $f = $this->get_file($this->document, '$HOME/apc_config.php', 'stub apc_config.php'); if($f)$config = $this->_run_php_1($f); if(!is_array($config) ){ $config=[]; } }catch(\Exception $e){ $config=[]; } $configChanged = false; if(!isset($config['$HOME']) ){ $config['$HOME'] = getenv('FRDL_HOME'); $configChanged = true; } if(!isset($config['workspace']) ){ $config['workspace'] = 'frdl.webfan.de'; $configChanged = true; } $workspace = $config['workspace']; $version = 'latest'; try{ $f = $this->get_file($this->document, '$HOME/version_config.php', 'stub version_config.php'); if($f)$version = $this->_run_php_1($f); if(is_array($version) && isset($version['version']) ){ $version=$version['version']; } }catch(\Exception $e){ $version = 'latest'; } $loader = false; try{ $loader = \call_user_func(function( $s, $cacheDir, $l, $ccl, $cl){ $af = (is_string($cacheDir) && is_dir($cacheDir)) ? rtrim($cacheDir, '\\/ ') . \DIRECTORY_SEPARATOR.str_replace('\\', \DIRECTORY_SEPARATOR, \frdl\implementation\psr4\RemoteAutoloader::class).'.php' : \sys_get_temp_dir().\DIRECTORY_SEPARATOR . \get_current_user() .\DIRECTORY_SEPARATOR .'.frdl'.\DIRECTORY_SEPARATOR .'_'.\DIRECTORY_SEPARATOR .'shared'.\DIRECTORY_SEPARATOR .'lib'.\DIRECTORY_SEPARATOR .'php'.\DIRECTORY_SEPARATOR .'src'.\DIRECTORY_SEPARATOR .'psr4'.\DIRECTORY_SEPARATOR .str_replace('\\', \DIRECTORY_SEPARATOR, \frdl\implementation\psr4\RemoteAutoloader::class).'.php'; if(!is_dir(dirname($af))){ mkdir( dirname($af) , 0777 , true); } if(!file_exists($af) || filemtime($af) < time() - $ccl){ file_put_contents($af, file_get_contents($l)); } !\class_exists(\frdl\implementation\psr4\RemoteAutoloader::class) && require $af; $loader = \frdl\implementation\psr4\RemoteAutoloader::getInstance($s, true, '20210108DIREf', false, true, true/*[]*/, $cacheDir/*null*/, $cl); return $loader; }, '03.webfan.de', 4, 'https://03.webfan.de/install/?salt='.sha1(mt_rand(1000,9999)).'&source=\frdl\implementation\psr4\RemoteAutoloader', 24 * 60 * 60,//, 24 * 60 * 60// ); }catch(\Exception $e){ $loader = false; }//catch if(!is_object($loader) || true !== $loader instanceof \frdl\implementation\psr4\RemoteAutoloader){ if(!class_exists(\frdl\implementation\psr4\RemoteAutoloader::class)){ $this->addClassfile(\frdl\implementation\psr4\RemoteAutoloader::class, file_get_contents('https://frdl.webfan.de/install/?salt='.\sha1(mt_rand(1,999)).'&source=frdl\implementation\psr4\RemoteAutoloader')); } call_user_func(function($version,$workspace){ if(!class_exists(\frdl\implementation\psr4\RemoteAutoloader::class))return; $loader = \frdl\implementation\psr4\RemoteAutoloader::getInstance($workspace, true, $version, true); }, $version, $workspace); } --4444EVGuDPPT Content-Type: application/x-httpd-php;charset=utf-8 Content-Disposition: php ;filename="$HOME/apc_config.php";name="stub apc_config.php" return [ 'testkey' => 'testval', ]; --4444EVGuDPPT Content-Type: application/x-httpd-php;charset=utf-8 Content-Disposition: php ;filename="$HOME/detect.php";name="stub detect.php" $maxExecutionTime = intval(ini_get('max_execution_time')); set_time_limit(max($maxExecutionTime, 180)); ini_set('display_errors','on'); error_reporting(\E_ERROR | \E_WARNING | \E_PARSE); --4444EVGuDPPT Content-Type: application/x-httpd-php;charset=utf-8 Content-Disposition: php ;filename="$HOME/index.php";name="stub index.php" if(isset($_REQUEST['web'])){ $_SERVER['REQUEST_URI'] = ltrim(strip_tags($_REQUEST['web']), '/ '); } $p = explode('?', $_SERVER['REQUEST_URI']); $path = $p[0]; $webfile= $this->get_file($this->document, '$HOME/$WEB'.$path, 'stub '.$path) ; if(false !==$webfile){ $p2 = explode('.', $path); $p2 = array_reverse($p2); $p3 = explode(';', $webfile->getHeader('Content-Type')); if('php' === strtolower($p2[0]) || 'application/x-httpd-php'===$p3[0] ){ call_user_func_array([$this, '_run_php_1'], [$webfile]); }else{ ob_end_clean(); header('Content-Type: '.$webfile->getMimeType()); echo $webfile->getBody(); } die(); }else{ \Webfan\App\Shield::getInstance($this, \frdl\i::c(), false)->index('/'); } --4444EVGuDPPT-- --EVGuDPPT-- --hoHoBundary12344dh Content-Type: multipart/related;boundary=3333EVGuDPPT Content-Disposition: php ;filename="$__FILE__/attach.zip";name="archive attach.zip" --3333EVGuDPPT Content-Type: application/vnd.frdl.script.php;charset=utf-8 Content-Disposition: php ;filename="$DIR_LIB/frdl/implementation/NullVoid.php";name="class frdl\implementation\NullVoid" <?php namespace frdl\implementation; class NullVoid { } --2222EVGuDPPT-- --3333EVGuDPPT Content-Disposition: "php" ; filename="$HOME/version_config.php" ; name="stub version_config.php" Content-Type: application/x-httpd-php <?php return array ( 'time' => 0, 'version' => '0.0.0', ); ?> --3333EVGuDPPT-- Content-Disposition: "php" ; filename="$HOME/$WEBinstall/index_fallback_end.html" ; name="stub install/index_fallback_end.html" Content-Type: text/html stub install/index.html --> </body> </html> --3333EVGuDPPT-- --hoHoBundary12344dh--