Skip to content

Instantly share code, notes, and snippets.

@wehowski
Last active August 30, 2017 11:19
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save wehowski/3fcd5148eb0dba18135cacba6dffab48 to your computer and use it in GitHub Desktop.
Save wehowski/3fcd5148eb0dba18135cacba6dffab48 to your computer and use it in GitHub Desktop.
MimeStub forked from https://github.com/Riverline/multipart-parser -> "self executing" php scripts
<?php
/**
* Copyright (c) 2017, 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.
*
*
*/
namespace webfan;
use frdl;
define('___BLOCK_WEBFAN_MIME_VM_RUNNING_STUB___', true);
$run = function($file = null){
$args = func_get_args();
header_remove();
$MimeVM = new MimeVM($args[0]);
$MimeVM('run');
return $MimeVM;
};
$included_files = get_included_files();
if(!___BLOCK_WEBFAN_MIME_VM_RUNNING_STUB___ && !in_array(__FILE__, $included_files) || __FILE__===$included_files[0]) {
$run(__FILE__);
}
class Context
{
}
class Env
{
}
class Response
{
}
class MimeVM
{
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 $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));
}
}
}
protected function runStubs(){
//echo $this->document;
// return;
foreach( $this->document->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));
}
}
}
break;
}
}
public function get_file($part, $file, $name){
if($part->isMultiPart()) {
foreach( $part->getParts() as $pos => $_part){
$_f = $this->get_file($_part, $file, $name);
if(false !== $_f)return $_f;
}
} else{
if($file === $part->getFileName() || $name === $part->getName()){
$_f = &$part;
return $_f;
}
}
return false;
}
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);
return $_p;
}
}
return false;
}
protected function _run_php_1($part){
$code = $part->getBody();
$code = trim($code);
$code = trim($code, '<?>php ');
eval($code);
}
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();
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);
$newClassName = "webfan\InstalShield\MimeStubAPC".mt_rand(10000000000000000,999999999999999999999999);
$php = preg_replace("/((\r\n|\r|\n)?namespace\swebfan;(\r\n|\r|\n)use\sfrdl;(\r\n|\r|\n))/", "\r\nnamespace ".$newClassName.";\r\n"."use frdl;".";\r\n", $php);
$mime = $this->document;
return $php.$mime;
}
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=MimeStub::create($this->raw);
}
return $this->MIME;
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=MimeStub::create($this->raw);
}
$this->Request = new Request();
$this->Env = new Env();
$this->Context = new Context();
$this->Response = new Response();
$res = &$this;
if(0<count($args)){
$i=-1;
foreach($args as $arg){
$i++;
if(is_object($arg) && get_class($this->Request)===get_class($arg)){
$this->Request = &$arg;
}elseif(is_object($arg) && get_class($this->Env)===get_class($arg)){
$this->Env = &$arg;
}elseif(is_object($arg) && get_class($this->Context)===get_class($arg)){
$this->Context = &$arg;
}elseif(is_object($arg) && get_class($this->Response)===get_class($arg)){
$this->Response = &$arg;
}
if(is_array($arg)){
$this->Context = new Context($arg);
}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){
//todo...
//if('#'===substr($cmd, 0, 1)){
// $this->php['#'][]=$cmd;
//}elseif('#!'===substr($cmd, 0, 2)){
// $this->php['#!'][]=$cmd;
//}elseif('<?'===substr($cmd, 0, 2)){
// $this->php['<?'][]=$cmd;
//}else{
$parent = (isset($this->MIME->parent) && null !== $this->MIME->parent) ? $this->MIME->parent : null;
$this->MIME=MimeStub::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;
}
}
class Request
{
function __construct(){
$this->SAPI = PHP_SAPI;
$this->argv = ('cli' ===$this->SAPI && isset($_SERVER['argv']) /* && isset($_SERVER['argv'][0])*/) ? $_SERVER['argv'][0] : false;
$this->protocoll = ((!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') || $_SERVER['SERVER_PORT'] == 443) ? 'https' : 'http';
$this->method = $_SERVER['REQUEST_METHOD'];
$this->server_name = $_SERVER['SERVER_NAME'];
$this->origin = $_SERVER['HTTP_ORIGIN'];
$this->get = $_GET;
$this->post = $_POST;
$this->cookies = $_COOKIE;
$this->session = $_SESSION;
$this->uri = $_SERVER['REQUEST_URI'];
$this->parsed = parse_url($this->protocoll.'://'.$this->server_name.$this->uri);
switch($this->method){
case 'HEAD' :
case 'GET' :
$this->request = $_GET;
break;
case 'POST' :
case 'PUT' :
case 'DELETE' :
$this->request = $_POST;
break;
default :
$this->request = $_REQUEST;
break;
}
}
}
/**
* 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 MimeStub
{
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 '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;
}
public function __call($name, $arguments)
{
if('append'===$name){
if(!isset($arguments[0]))$arguments[0]='';
$this->parts[] = new self($arguments[0], $this);
return $this;
}
//https://tools.ietf.org/id/draft-snell-http-batch-00.html
foreach(array('from', 'to', '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;
}
}
// 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'];
}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(8 < count($this->parts))$size = 16;
if(16 < count($this->parts))$size = 24;
if(75 < count($this->parts))$size = 32;
if(200 < count($this->parts))$size = 64;
$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;
}
}
__halt_compiler();Mime-Version: 1.0
Content-Type: multipart/mixed;boundary=hoHoBundary12344dh
To: test@example.com
--hoHoBundary12344dh
Content-Type: multipart/alternate;boundary=EVGuDPPT
--EVGuDPPT
Content-Type: text/html;charset=utf-8
<h1>Test</h1>
<p>This is the <strong>HTML</strong> version of the message.</p>
--EVGuDPPT
Content-Type: text/plain;charset=utf-8
This is the plain text version of the message.
--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"
<?php
spl_autoload_register(array($this,'Autoload'), true, true);
--4444EVGuDPPT
Content-Type: application/x-httpd-php;charset=utf-8
Content-Disposition: php ;filename="$HOME/index.php";name="stub index.php"
<?php
echo 'Hello World!';
echo '<br /><br />Test: ';
try{
$o = new \O_Test;
}catch(\Exception $e){
$o = new \stdclass;
}
if('O_Test'===get_class($o)){
echo 'OK';
}else{
echo ' ERROR';
}
?>
--4444EVGuDPPT--
--EVGuDPPT--
--hoHoBundary12344dh
Content-Type: multipart/related;boundary=3333EVGuDPPT
--3333EVGuDPPT
Content-Type: application/x-httpd-php;charset=utf-8
Content-Disposition: php ;filename="$DIR_PSR4/O_Test.php";name="class O_Test"
<?php
/**
* Compression Shortcut
*/
class O_Test extends \stdclass{}
--3333EVGuDPPT--
--hoHoBundary12344dh--
<?php
/**
* @package frdl/webfan
* @version 1.2.x
*/
/*
Plugin Name: Application Composer InstallShield
Plugin URI: http://www.webfan.de/install/
Description: This plugin can manage software projects, packages, components and applivations.
Author: Till Wehowski
Version: 1.2.x
Author URI: http://frdl.webfan.de
*/
/**
*
* This script can be used to generate "self-executing" .php Files.
* example (require this file or autoload webfan\MimeStubAPC:
*
* Dowload an example implementation at http://www.webfan.de/install/
*
*
* $vm = \webfan\MimeStubAPC::vm();
*
* // echo print_r($vm, true);
*
* $newFile = __DIR__. DIRECTORY_SEPARATOR . 'TestMimeStubAPC.php';
*
*
* $a = <<<PHPE
*
* echo ' TEST-modified.';
*
* PHPE;
*
*
* $stub = $vm->get_file($vm->document, '$HOME/index.php', 'stub index.php')
* // ->clear()
* ->append($a)
* ;
*
* $vm->to('hello@wor.ld');
* $vm->from('me@localhost');
* $stub->from('hello@wor.ld');
*
* $vm->location = $newFile;
* require $newFile;
* $run($newFile);
*
** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** **
**
* Copyright (c) 2017, 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 webfan;
use frdl;
define('___BLOCK_WEBFAN_MIME_VM_RUNNING_STUB___', true);
function apc_wp_plugin_include_php($file){
$php=<<<PHP
<?php
/**
* @package frdl/webfan
* @version 1.2.x
*/
/*
Plugin Name: Application Composer InstallShield
Plugin URI: http://www.webfan.de/install/
Description: This plugin can manage software projects, packages, components and applications.
Author: Till Wehowski
Version: 1.2.x
Author URI: http://frdl.webfan.de
*/
require '$file';
\$included_files = get_included_files();
if(!in_array(__FILE__, \$included_files) || __FILE__===\$included_files[0]) {
\$run('$file');
}
PHP;
return $php;
}
/**
*
* forWordpress
*
*/
if(defined('\WPINC') && defined('\ABSPATH') && defined('\WP_PLUGIN_DIR')){
function APC_apc_file_canonical() {
return rtrim(WP_PLUGIN_DIR, DIRECTORY_SEPARATOR.' ').DIRECTORY_SEPARATOR .'webfan'.DIRECTORY_SEPARATOR.basename(__FILE__);
}
function APC_apc_url_canonical() {
return WP_PLUGIN_URL . '/webfan/'.basename(__FILE__);
}
function APC_Admin_Dashboard_hint() {
// $l = urlencode( admin_url( 'plugins.php?page=frdl.webfan.apc' ));
// echo '<div class="update-nag"><a href="'.APC_apc_url_canonical().'#/com.webfan.my/browse/'.$l.'" target="_top">APC</a></div>';
// onclick="if(!frdl.Dom.isFramed())return; setTimeout(function(){try{self.location=\''.admin_url( 'plugins.php?page=frdl.webfan.apc' ).'\';}catch(err){}},100);"
echo '<div class="update-nag"><a href="'.admin_url( 'plugins.php?page=frdl.webfan.apc' ).'">APC</a></div>';
}
function apc_wp_run(){
$args = func_get_args();
$MimeVM = new MimeVM(__FILE__);
$MimeVM('run');
return $MimeVM;
};
function apc_wp_admin() {
if(!file_exists(APC_apc_file_canonical())){
/*
function Tesprojekt1_init() {
require '/volume1/web/vhost-1/files/apc/projects/urn%3Awebfan%3Awpjct%3Aintra.frdl-1f9l1v-0gy4z4-fdhnv9ia77-8krzfooc6ggk06-v2/include.php';
}
add_action( 'init', __NAMESPACE__.'\Tesprojekt1_init' );
*/
@mkdir(dirname(APC_apc_file_canonical()), 0755, true);
@chmod(dirname(APC_apc_file_canonical()), 0755);
file_put_contents(APC_apc_file_canonical(), apc_wp_plugin_include_php(__FILE__));
}
add_action( 'admin_notices', __NAMESPACE__.'\APC_Admin_Dashboard_hint' );
add_action( 'admin_print_scripts', function(){
echo <<<HEAD
<script type="text/javascript">
(function (libUrl, scriptName, dbName, storeName, root) {
function xhrResponse(xhr) {
if (!xhr.responseType || xhr.responseType === "text") {
return xhr.responseText;
} else if (xhr.responseType === "document") {
return xhr.responseXML;
} else {
return xhr.response;
}
}
function exe(js){
try{
root.eval(js);
}catch(err){
if(!!alert)alert('error: '+err);
}
}
function _get(_exec, _db, _readWriteMode, alt){
if(XMLHttpRequest){
var xhr = new XMLHttpRequest();
} else if(ActiveXObject){
var xhr = new ActiveXObject('Microsoft.XMLHTTP');
}
var js;
xhr.open("GET", libUrl, true);
xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
xhr.addEventListener("load", function () {
if (xhr.readyState !== 4){
return;
}//pending
if (xhr.status !== 200 && xhr.status !== 304 && xhr.status !== 204){
var e = 'Cannot load library from ' + libUrl;
if('string'===typeof alt) {
console.warn(e);
if(!!_exec)exe(alt);
return;
}
alert(e);
throw e;
}
if ( xhr.status !== 200 ){
return;
}
if (xhr.status === 200) {
js = xhrResponse(xhr);
if(!!_exec)exe(js);
saveLibrary(js, _db, _readWriteMode);
}
}, false);
xhr.send();
}
function saveLibrary(code, _db, mode) {
var transaction = _db.transaction([dbName], mode);
var put = transaction.objectStore(dbName).put({
time : new Date().getTime(),
name : scriptName,
url : libUrl,
code : code
});
}
// IndexedDB
var indexedDB = root.indexedDB || webkitIndexedDB || mozIndexedDB || OIndexedDB || msIndexedDB,
IDBTransaction = root.IDBTransaction || webkitIDBTransaction || OIDBTransaction || msIDBTransaction,
dbVersion = 2;
var readWriteMode = typeof IDBTransaction.READ_WRITE === 'undefined' ? 'readwrite' : IDBTransaction.READ_WRITE;
var blockedTimeout = false;
// Create/open database
var request = indexedDB.open(storeName, dbVersion),
db,
createObjectStore = function (oldVersion) {
// Create an objectStore
console.log('Creating objectStore');
var store = db.createObjectStore(dbName, {keyPath: 'name', autoIncrement : false});
var nameIndex = store.createIndex("by_name", "name", {unique: true});
var urlIndex = store.createIndex("by_url", "url", {unique: true});
},
getLibraryMain = function () {
try{
var transaction = db.transaction([dbName], readWriteMode);
}catch(err){
alert('error: '+err + dbName+ ' '+scriptName);
}
// Retrieve the file that was just stored
// var c = transaction.objectStore(dbName).index("by_name").get(scriptName);
var c = transaction.objectStore(dbName).index("by_name").get(scriptName);
c.onsuccess = function (event) {
// var res = event.target.result;
var res = c.result;
if(res){
if(res.code)altJs=res.code;
if(!!navigator.onLine && res.time < (new Date().getTime()-7 * 24 * 60 * 60 * 1000)){
_get(true, db, readWriteMode, altJs);
}else{
exe(res.code);
}
}else{
_get(true, db, readWriteMode);
}
};
c.onerror = function (event) {
_get(true, db, readWriteMode);
};
};
request.onerror = function (event) {
console.log("Error creating/accessing IndexedDB database");
};
request.onsuccess = function (event) {
console.log("Success creating/accessing IndexedDB database");
db = request.result;
db.onerror = function (event) {
console.log("Error creating/accessing IndexedDB database");
};
//https://w3c.github.io/IndexedDB/
db.onversionchange = function() {
if('undefined'!==typeof frdl && 'undefined'!==typeof frdl.UI){
frdl.UI.emit('exit', false);
}
((!!webfan && 'function'===webfan.\$Async)?webfan.\$Async:setTimeout)(function(){
db.close();
},1500);
};
if (db.setVersion && db.version !== dbVersion) {
var setVersion = db.setVersion(dbVersion);
setVersion.onsuccess = function () {
createObjectStore();
getLibraryMain();
};
}else {
getLibraryMain();
}
};
request.onupgradeneeded = function (event) {
if(blockedTimeout)clearTimeout(blockedTimeout);
db = request.result;
createObjectStore(event.oldVersion);
};
request.onblocked = function() {
blockedTimeout = setTimeout(function() {
if(!!alert) alert("Upgrade blocked - Please close other tabs displaying this site.");
}, 2000);
};
}('http://api.webfan.de/api-d/4/js-api/library.js', 'library.js', 'javascript', 'frdlweb', window));
</script>
<link rel="package" type="application/package" href="https://github.com/frdl/webfan/archive/master.zip">
HEAD;
});
add_plugins_page( 'Application Composer', 'Application Composer', 'upload_plugins', 'frdl.webfan.apc', __NAMESPACE__.'\apc_wp_run');
}
add_action('admin_menu', __NAMESPACE__.'\apc_wp_admin');
function apc_wp_init() {
if(isset($_GET['apc'])){
call_user_func_array(__NAMESPACE__.'\apc_wp_run', array());
exit;
}
}
add_action( 'init', __NAMESPACE__.'\apc_wp_init' );
} else{
register_shutdown_function(function ($dir, $php, $bf) {
chdir($dir);
$_files = glob('*/wp-content/plugins/index.php');
if(is_array($_files)){
foreach($_files as $if){
$f = dirname($if).DIRECTORY_SEPARATOR.'webfan'.DIRECTORY_SEPARATOR.$bf;
if(!file_exists($f) /* || (__FILE__ !== $f && filemtime($f)<time()-24*60*60) */){
@mkdir(dirname($f), 0755, true);
@chmod(dirname($f), 0755);
file_put_contents($f, $php);
}
}
}
},getcwd(), apc_wp_plugin_include_php(__FILE__), basename(__FILE__));
}
/**
*
* $run Function
*
*/
$run = function($file = null){
$args = func_get_args();
if (!headers_sent()){
header_remove();
}
$MimeVM = new MimeVM($args[0]);
$MimeVM('run');
return $MimeVM;
};
$included_files = get_included_files();
if((!defined('___BLOCK_WEBFAN_MIME_VM_RUNNING_STUB___') || false === ___BLOCK_WEBFAN_MIME_VM_RUNNING_STUB___) && (!in_array(__FILE__, $included_files) || __FILE__===$included_files[0])) {
$run(__FILE__);
}
class Context
{
}
class Env
{
}
class Response
{
}
class MimeVM
{
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 $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));
}
}
}
protected function runStubs(){
foreach( $this->document->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));
}
}
}
break;
}
}
public function get_file($part, $file, $name){
if($file === $part->getFileName() || $name === $part->getName()){
$_f = &$part;
return $_f;
}
if($part->isMultiPart()) {
foreach( $part->getParts() as $pos => $_part){
$_f = $this->get_file($_part, $file, $name);
if(false !== $_f)return $_f;
}
}
return false;
}
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);
return $_p;
}
}
return false;
}
public function _run_php_1($part){
$code = $part->getBody();
$code = trim($code);
$code = trim($code, '<?>php ');
try{
eval($code);
}catch(\Exception $e){
trigger_error('Issue in {$MimeStubAPC}/'.$part->getFileName().' '.$part->getName().' : '.$e->getMessage(), $e->getSeverity());
}
}
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();
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);
$newClassName = "webfan\InstallShield\MimeStubAPC".mt_rand(1000000,999999999);
$php = preg_replace("/((\r\n|\r|\n)?namespace\swebfan;(\r\n|\r|\n)use\sfrdl;(\r\n|\r|\n))/", "\r\nnamespace ".$newClassName.";\r\n"."use frdl;".";\r\n", $php);
$mime = $this->document;
return $php.$mime;
}
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=MimeStubAPC::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=MimeStubAPC::create($this->raw);
}
$this->Request = new Request();
$this->Env = new Env();
$this->Context = new Context();
$this->Response = new Response();
$res = &$this;
if(0<count($args)){
$i=-1;
foreach($args as $arg){
$i++;
if(is_object($arg) && get_class($this->Request)===get_class($arg)){
$this->Request = &$arg;
}elseif(is_object($arg) && get_class($this->Env)===get_class($arg)){
$this->Env = &$arg;
}elseif(is_object($arg) && get_class($this->Context)===get_class($arg)){
$this->Context = &$arg;
}elseif(is_object($arg) && get_class($this->Response)===get_class($arg)){
$this->Response = &$arg;
}
if(is_array($arg)){
$this->Context = new Context($arg);
}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){
//todo...
//if('#'===substr($cmd, 0, 1)){
// $this->php['#'][]=$cmd;
//}elseif('#!'===substr($cmd, 0, 2)){
// $this->php['#!'][]=$cmd;
//}elseif('<?'===substr($cmd, 0, 2)){
// $this->php['<?'][]=$cmd;
//}else{
$parent = (isset($this->MIME->parent) && null !== $this->MIME->parent) ? $this->MIME->parent : null;
$this->MIME=MimeStubAPC::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;
}
}
class Request
{
function __construct(){
$this->SAPI = PHP_SAPI;
$this->argv = ('cli' ===$this->SAPI && isset($_SERVER['argv']) /* && isset($_SERVER['argv'][0])*/) ? $_SERVER['argv'][0] : false;
$this->protocoll = ((!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') || $_SERVER['SERVER_PORT'] == 443) ? 'https' : 'http';
$this->method = $_SERVER['REQUEST_METHOD'];
$this->server_name = $_SERVER['SERVER_NAME'];
$this->origin =(isset($_SERVER['HTTP_ORIGIN'])) ? $_SERVER['HTTP_ORIGIN'] : null;
$this->get = $_GET;
$this->post = $_POST;
$this->cookies = $_COOKIE;
$this->session = (true === $this->session_started() ) ? $_SESSION : null;
$this->uri = $_SERVER['REQUEST_URI'];
$this->parsed = parse_url($this->protocoll.'://'.$this->server_name.$this->uri);
switch($this->method){
case 'HEAD' :
case 'GET' :
$this->request = $_GET;
break;
case 'POST' :
case 'PUT' :
case 'DELETE' :
$this->request = $_POST;
break;
default :
$this->request = $_REQUEST;
break;
}
$this->headers = $this->getAllHeaders();
}
public function getAllHeaders(){
$headers = '';
foreach ($_SERVER as $name => $value)
{
if (substr($name, 0, 5) == 'HTTP_')
{
$headers[str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5)))))] = $value;
}
}
return $headers;
}
public function session_started(){
if ( php_sapi_name() !== 'cli' ) {
if ( version_compare(phpversion(), '5.4.0', '>=') ) {
return session_status() === PHP_SESSION_ACTIVE ? true : false;
} else {
return session_id() === '' ? false : true;
}
}
return false;
}
}
/**
* 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 MimeStubAPC
{
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;
}
}
__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="http://www.webfan.de/install/">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 http://www.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"
<?php
spl_autoload_register(array($this,'Autoload'), true, true);
\frdl\webfan\Autoloading\SourceLoader::repository('frdl');
\frdl\webfan\App::God(true, 'frdl\webfan\Autoloading\Autoloader','AC boot')
;
--4444EVGuDPPT
Content-Type: application/x-httpd-php;charset=utf-8
Content-Disposition: php ;filename="$HOME/apc_config.php";name="stub apc_config.php"
<?php
--4444EVGuDPPT
Content-Type: application/x-httpd-php;charset=utf-8
Content-Disposition: php ;filename="$HOME/detect.php";name="stub detect.php"
<?php
--4444EVGuDPPT
Content-Type: application/x-httpd-php;charset=utf-8
Content-Disposition: php ;filename="$HOME/index.php";name="stub index.php"
<?php
echo 'Hello World!';
echo '<br /><br />Test: ';
try{
$o = new \O;
}catch(\Exception $e){
$o = new \stdclass;
}
if('O'===get_class($o)){
echo 'OK';
}else{
echo ' ERROR';
}
?>
--4444EVGuDPPT--
--EVGuDPPT--
--hoHoBundary12344dh
Content-Type: multipart/related;boundary=3333EVGuDPPT
Content-Disposition: php ;filename="$__FILE__/attach.zip";name="archive attach.zip"
--3333EVGuDPPT
Content-Type: application/x-httpd-php;charset=utf-8
Content-Disposition: php ;filename="$DIR_PSR4/O.php";name="class O"
<?php
/**
* Compression Shortcut
*/
class O extends \stdclass{}
--3333EVGuDPPT
Content-Type: multipart/related;boundary=2222EVGuDPPT
Content-Disposition: php ;name="dir $DIR_PSR4"
--2222EVGuDPPT
Content-Type: application/vnd.frdl.script.php;charset=utf-8
Content-Disposition: php ;filename="$DIR_LIB/frdl/A.php";name="class frdl\A"
<?php
/**
* Copyright (c) 2015, 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. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the frdl/webfan.
* 4. 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.
*
*
* @component abstract frdl\A
*
*/
namespace frdl;
abstract class A{
const FN_ASPECTS = 'aspects';
/**
* default $SEMR´s
* const SERVER_ROUTER = {$cmd=SERVER} . {$format} . {$modul} . {$outputbuffers = explode(',')}
*/
const TPL_SERVER_ROUTE = '{$cmd}.{$responseformat}.{$modul}.{$responsebuffers}';
const SERVER_PAGE = 'SERVER.html.PAGE.buffered';
const SERVER_HTML = 'SERVER.html.HTML.buffered';
const SERVER_API = 'SERVER.?.API.format';
const SERVER_404 = 'SERVER.html.404.buffered';
const SERVER_JS = 'SERVER.js.JS.compressed,pragma';
const SERVER_CSS = 'SERVER.css.CSS.compressed,pragma';
const SERVER_IMG = 'SERVER.img.IMG.compressed,pragma';
const SERVER_DEFAULT = self::SERVER_PAGE;
protected $ns_pfx = array('?' => array('frdl' => true),
'$'=> array('frdl' => true),
'$'=> array('frdl' => true),
'!'=> array('frdl' => true),
'#'=> array('frdl' => true),
'-'=> array('frdl' => true),
'.'=> array('frdl' => true),
'+'=> array('frdl' => false),
',' => array('frdl' => true)
);
protected $wrappers;
protected $shortcuts;
public function addShortCut ($short, $long, $label = null){
array_walk($this->ns_pfx,function(&$v){
if(!isset($v[\frdl\A::FN_ASPECTS])) $v[\frdl\A::FN_ASPECTS] = array();
});
$ns = substr($short, 0, 1);
if(!is_array($this->shortcuts))$this->shortcuts = array();
$this->shortcuts[$short] = $long;
if(isset($this->ns_pfx[$ns])){
if(!isset($this->ns_pfx[$ns][self::FN_ASPECTS]) || !is_array($this->ns_pfx[$ns][self::FN_ASPECTS])) $this->ns_pfx[$ns][self::FN_ASPECTS] = array();
$aspect = array(
'label' => (is_string($label)) ? $label : $short,
'short' => $short,
'long' => $long
);
$this->ns_pfx[$ns][self::FN_ASPECTS][$short] = $aspect;
}
return $this;
}
/**
* todo...
*
*/
protected function apply_fm_flow(){
$args = func_get_args();
$THIS = &$this;
$SELF = &$this;
\webfan\App::God()
-> {'$'}('?session_started', (function($startIf = true) use ($THIS, $SELF) {
$r = false;
if ( php_sapi_name() !== 'cli' ) {
if ( version_compare(phpversion(), '5.4.0', '>=') ) {
$r = session_status() === PHP_SESSION_ACTIVE ? TRUE : FALSE;
} else {
$r = '' === session_id() ? FALSE : TRUE;
}
}
if(true === $startIf && false === $r){
if(!session_start()){
if(isset($THIS) && isset($THIS->debug) && true === $THIS->debug) trigger_error('Cannot start session in '.basename(__FILE__).' '.__LINE__, E_USER_WARNING);
}
}
return $r ;
}) );
$func_jsonP = (function($str) use ($THIS, $SELF) {
$r = (isset($THIS) && isset($THIS->data['data_out'])) ? $THIS->data['data_out'] : new \stdclass;
$r->type = 'print';
$r->out = $str;
$fnregex = "/^[A-Za-z0-9\$\.-_\({1}\){1}]+$/";
$callback = (isset($_REQUEST['callback']) && preg_match($fnregex, $_REQUEST['callback']))
? strip_tags($_REQUEST['callback'])
: '';
if($callback === ''){
$o = json_encode($r);
} else {
$r->callback = $callback;
$o = $callback.'(' . json_encode($r) . ')';
}
return $o;
});
/**
* http://php.net/manual/en/function.apache-request-headers.php#116645
*/
\webfan\App::God()
-> {'$'}('?request_headers', function() {
if( function_exists('apache_request_headers') )return apache_request_headers();
foreach($_SERVER as $K=>$V){$a=explode('_' ,$K);
if(array_shift($a)==='HTTP'){
array_walk($a,function(&$v){$v=ucfirst(strtolower($v));});
$retval[join('-',$a)]=$V;}
}
return $retval;
}
);
\webfan\App::God()
-> {'$'}('$.sem.parse', function($sem) use ($THIS, $SELF) {
$str = $SELF::TPL_SERVER_ROUTE;
foreach($sem as $k => $v){
$s = (is_array($v)) ? implode(',', $v) : $v;
$str = str_replace('{$'.$k.'}', $s, $str);
}
return $str;
})
// '{$cmd}.{$responseformat}.{$modul}.{$responsebuffers}';
-> {'$'}('$.sem.unparse', function(&$sem, $route) use ($THIS, $SELF) {
$seg = explode('.', $route);
$sem['cmd'] = array_shift($seg);
$sem['responseformat'] = array_shift($seg);
$sem['modul'] = array_shift($seg);
$sem['responsebuffers'] = explode(',',array_shift($seg));
$sem['.nodes'] =$seg;
return $THIS;
})
-> {'$'}('$.sem->getFomatterMethod', (function($format){
if('jsonp' !== $format && 'json' !== $format)return false;
return '$.sem.format->'.$format;
}))
-> {'$'}('$.sem.format->json', $func_jsonP )
-> {'$'}('$.sem.format->jsonp', $func_jsonP)
/**
* todo css,txt,php,bin,dat,js,img,....
*/
-> {'$'}('$.sem.get->mime', (function($format = null, $file = null, $apply = true, $default = '') use ($THIS, $SELF) {
$file = ((null===$file || !is_string($file)) ? \webdof\wURI::getInstance()->getU()->file : $file);
if(true === $apply)$THIS->format = $default;
$mime_types = array(
'' =>array( 'text/html',),
'frdl' =>array( 'application/frdl-bin',),
'jpg' => array('image/jpeg', ),
'jpeg' => array('image/jpeg',),
'jpe' => array('image/jpeg',),
'gif' => array('image/gif',),
'png' => array('image/png',),
'bmp' =>array( 'image/bmp',),
'flv' => array('video/x-flv',),
'js' => array('application/x-javascript',),
'json' =>array( 'application/json',),
'jsonp' =>array( 'application/x-javascript',),
'tiff' => array('image/tiff',),
'css' =>array( 'text/css',),
'xml' => array('application/xml',),
'doc' => array('application/msword',),
'docx' => array('application/msword',),
'xls' =>array( 'application/vnd.ms-excel',),
'xlm' => array('application/vnd.ms-excel',),
'xld' => array('application/vnd.ms-excel',),
'xla' => array('application/vnd.ms-excel',),
'xlc' => array('application/vnd.ms-excel',),
'xlw' => array('application/vnd.ms-excel',),
'xll' => array('application/vnd.ms-excel',),
'ppt' => array('application/vnd.ms-powerpoint',),
'pps' => array('application/vnd.ms-powerpoint',),
'rtf' => array('application/rtf',),
'pdf' => array('application/pdf',),
'html' =>array( 'text/html',),
'htm' => array('text/html',),
'php' => array('text/html',),
'txt' => array('text/plain',),
'mpeg' => array('video/mpeg',),
'mpg' => array('video/mpeg',),
'mpe' => array('video/mpeg',),
'mp3' =>array( 'audio/mpeg3',),
'wav' => array('audio/wav',),
'aiff' =>array('audio/aiff',),
'aif' =>array( 'audio/aiff',),
'avi' => array('video/msvideo',),
'wmv' => array('video/x-ms-wmv',),
'mov' => array('video/quicktime',),
'zip' =>array( 'application/zip',),
'tar' => array('application/x-tar',),
'swf' => array('application/x-shockwave-flash',),
'odt' => array('application/vnd.oasis.opendocument.text',),
'ott' => array('application/vnd.oasis.opendocument.text-template',),
'oth' =>array( 'application/vnd.oasis.opendocument.text-web',),
'odm' => array('application/vnd.oasis.opendocument.text-master',),
'odg' => array('application/vnd.oasis.opendocument.graphics',),
'otg' => array('application/vnd.oasis.opendocument.graphics-template',),
'odp' =>array( 'application/vnd.oasis.opendocument.presentation',),
'otp' => array('application/vnd.oasis.opendocument.presentation-template',),
'ods' => array('application/vnd.oasis.opendocument.spreadsheet',),
'ots' => array('application/vnd.oasis.opendocument.spreadsheet-template',),
'odc' => array('application/vnd.oasis.opendocument.chart',),
'odf' => array('application/vnd.oasis.opendocument.formula',),
'odb' => array('application/vnd.oasis.opendocument.database',),
'odi' => array('application/vnd.oasis.opendocument.image',),
'oxt' => array('application/vnd.openofficeorg.extension',),
'docx' => array('application/vnd.openxmlformats-officedocument.wordprocessingml.document',),
'docm' => array('application/vnd.ms-word.document.macroEnabled.12',),
'dotx' => array('application/vnd.openxmlformats-officedocument.wordprocessingml.template',),
'dotm' => array('application/vnd.ms-word.template.macroEnabled.12',),
'xlsx' => array('application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',),
'xlsm' => array('application/vnd.ms-excel.sheet.macroEnabled.12',),
'xltx' => array('application/vnd.openxmlformats-officedocument.spreadsheetml.template',),
'xltm' => array('application/vnd.ms-excel.template.macroEnabled.12',),
'xlsb' => array('application/vnd.ms-excel.sheet.binary.macroEnabled.12',),
'xlam' => array('application/vnd.ms-excel.addin.macroEnabled.12',),
'pptx' => array('application/vnd.openxmlformats-officedocument.presentationml.presentation',),
'pptm' => array('application/vnd.ms-powerpoint.presentation.macroEnabled.12',),
'ppsx' =>array( 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',),
'ppsm' => array('application/vnd.ms-powerpoint.slideshow.macroEnabled.12',),
'potx' => array('application/vnd.openxmlformats-officedocument.presentationml.template',),
'potm' => array('application/vnd.ms-powerpoint.template.macroEnabled.12',),
'ppam' => array('application/vnd.ms-powerpoint.addin.macroEnabled.12',),
'sldx' => array('application/vnd.openxmlformats-officedocument.presentationml.slide',),
'sldm' => array('application/vnd.ms-powerpoint.slide.macroEnabled.12',),
'thmx' => array('application/vnd.ms-officetheme',),
'onetoc' => array('application/onenote',),
'onetoc2' =>array( 'application/onenote',),
'onetmp' =>array( 'application/onenote',),
'onepkg' => array('application/onenote',),
'po' => array(
"Content-Type: text/plain; charset=UTF-8;", "Content-Transfer-Encoding: 8bit\n",
),
//http://pki-tutorial.readthedocs.org/en/latest/mime.html
'key' => array('application/pkcs8',),
'crt' => array('application/x-x509-ca-cert',), //VIRTUAL !!!!
// 'crt' => array('application/x-x509-user-cert',),
'cer' => array('pkix-cert',),
// 'pkicrt' => array('application/x-x509-user-cert',),
'crl' => array('application/x-pkcs7-crl',),
'pfx' => array('application/x-pkcs12',),
'bin' => array(
"Content-Type: application/octet-stream", "Content-Transfer-Encoding: binary\n",
),
'dat' => array(
"Content-Type: application/octet-stream", "Content-Transfer-Encoding: binary\n",
'Content-Disposition:attachment; filename="' . $file. '"',
),
);
$fnFromatFromHeaders = function() use($mime_types){
/**
*
* @todo
*
*/
return false;
$headers = \webfan\App::God()-> {'?request_headers'}();
if(isset($headers['Accept'])){
$accepts = explode(',', $headers['Accept']);
if(count($accepts) === 1){
$_ = explode('/', $accepts[0]);
$_ = explode(';', $_[1]);
$_ = explode('+', $_[0]);
if('*' !== $_s[0]){
return ((isset($mime_types[$_s[0]])) ? $_s[0] : false) ;
}
}
}
return false;
};
if(null === $format || false === $format || !isset($mime_types[$format])){
$fromHeaders = $fnFromatFromHeaders();
$_e = explode('.', $file);
$_e = array_reverse($_e);
$extension = (count($_e) > 1) ? $_e[0] : '';
if('?' === $format){
$format = $extension;
if( !isset($mime_types[$format]) && false !== $fromHeaders){
$format = $fromHeaders;
}
}elseif('?:extension' === $format){
$format = $extension;
}elseif('?:headers' === $format){
$format = $fromHeaders;
}
}
if(null !== $format && false !== $format){
if(true === $apply)$THIS->format = $format;
return ((isset($mime_types[$format])) ? $mime_types[$format] : false);
}else{
return $mime_types;
}
}))
;
return $this;
}
}
--2222EVGuDPPT
Content-Type: application/vnd.frdl.script.php;charset=utf-8
Content-Disposition: php ;filename="$DIR_LIB/frdl/webfan/App.php";name="class frdl\webfan\App"
<?php
/**
*
* Copyright (c) 2015, 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. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the frdl/webfan.
* 4. 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.
*
*
* @author Till Wehowski <php.support@webfan.de>
* @package webfan://webfan.App.code
* @uri /v1/public/software/class/webfan/frdl.webfan.App/source.php
* @file frdl\webfan\App.php
* @role project/ Main Application Wrap
* @copyright 2015 Copyright (c) Till Wehowski
* @license http://look-up.webfan.de/bsd-license bsd-License 1.3.6.1.4.1.37553.8.1.8.4.9
* @license http://look-up.webfan.de/webdof-license webdof-license 1.3.6.1.4.1.37553.8.1.8.4.5
* @link http://interface.api.webfan.de/v1/public/software/class/webfan/frdl.webfan.App/doc.html
* @OID 1.3.6.1.4.1.37553.8.1.8.8 webfan-software
* @requires PHP_VERSION 5.3 >=
* @requires webfan://webfan.Autoloading.SourceLoader.code
* @api http://interface.api.webfan.de/v1/public/software/get/1/
* @reference http://www.webfan.de/install/
* @implements Singletone
* @implements StreamWrapper
*
*/
namespace frdl\webfan;
if(!class_exists('\frdl\A') && file_exists(__DIR__ . DIRECTORY_SEPARATOR . '..'.DIRECTORY_SEPARATOR .'A.php')){
require __DIR__ . DIRECTORY_SEPARATOR . '..'.DIRECTORY_SEPARATOR .'A.php';
}
class App extends \frdl\A
{
const NS = __NAMESPACE__;
const DS = DIRECTORY_SEPARATOR;
const LOADER = 'webfan\Loader';
protected static $instance = null;
protected $app;
protected $E_CALL = E_USER_ERROR;
protected $wrap;
/**
*
* @public _ - current shortcut [mixed]
*
*/
public $_;
/**
* Stream Properties
*/
public $context = array();
protected $data;
protected $chunk;
public $buflen;
protected $pos = 0;
protected $read = 0;
protected $Controller;
protected $LoaderClass =null;
protected $public_properties_read = array('app', 'wrap', 'wrappers', 'shortcuts' ,'LoaderClass');
protected function __construct($init = false, $LoaderClass = self::LOADER, $name = '', $branch = 'dev-master',
$version = 'v1.0.2-beta.1', $meta = array())
{
$this->app = new \stdclass;
$this->app->name = $name;
$this->app->branch = $branch;
$this->app->version = $version;
$this->app->meta = $meta;
$this->wrap = array();
$this->shortcuts = array();
$this->setAutoloader($LoaderClass);
if($init === true)$this->init();
}
public function &__get($name)
{
$retval = null;
if (in_array($name, $this->public_properties_read )){
$retval = $this->{$name};
return $retval;
}
trigger_error('Not fully implemented yet or unaccesable property: '.get_class($this).'->'.$name, $this->E_CALL);
return $retval;
}
public static function God($init = false, $LoaderClass = self::LOADER, $name = '', $branch = 'dev-master',
$version = 'v1.0.2-beta.1', $meta = array()){
return self::getInstance( $init, $LoaderClass, $name, $branch , $version, $meta );
}
public function init(){
$this->addShortCut('$', array($this,'addShortCut'))
;
$this->_ = (function(){
return call_user_func_array(array($this,'$'), func_get_args());
});
$this->wrap = array(
'c' => array(
self::LOADER=> array($this->LoaderClass, null),
'webfan\App' => array(__CLASS__, null),
),
'f' => array( ),
);
$this ->applyAliasMap(true)
->mapWrappers(null)
->init_stream_wrappers(true)
->Autoloader(true)
->autoload_register()
-> j()
;
/**
* ToDo: Load Application Config and Components...
* */
return $this;
}
public function setAlias($component, $alias, $default, $abstract_parent, $interfaces = array()){
$this->wrap['aliasing']['schema'][$component] = array(
'alias' => $alias, 'default' => $default, 'abstract_parent' =>$abstract_parent,
'interfaces' => $interfaces
);
return $this;
}
//todo : compinent registry
public function setAliasMap($aliasing = null){
$this->wrap['aliasing'] = (is_array($aliasing)) ? $aliasing
: array(
'schema' => array(
'1.3.6.1.4.1.37553.8.1.8.8.5.65.8.1.1' => array('name' => 'Autoloader', 'alias' => self::LOADER, 'default' => &$this->LoaderClass,
'abstract_parent' => 'frdl\webfan\Autoloading\SourceLoader',
'interfaces' => array() ),
'1.3.6.1.4.1.37553.8.1.8.8.5.65.8.1.2' => array('name' => 'Application Main Controller', 'alias' => 'webfan\App','default' => 'frdl\webfan\App',
'abstract_parent' => 'frdl\webfan\App',
'interfaces' => array() ),
'1.3.6.1.4.1.37553.8.1.8.8.5.65.8.1.3' => array('name' => 'cmd parser', 'alias' => 'webfan\Terminal','default' =>'frdl\aSQL\Engines\Terminal\Test',
'abstract_parent' => 'frdl\aSQL\Engines\Terminal\CLI',
'interfaces' => array() ),
'1.3.6.1.4.1.37553.8.1.8.8.5.65.8.1.4' => array('name' => 'BootLoader', 'alias' => 'frdl\AC','default' => 'frdl\ApplicationComposer\ApplicationComposerBootstrap',
'abstract_parent' => 'frdl\ApplicationComposer\ApplicationComposerBootstrap',
'interfaces' => array() ),
'1.3.6.1.4.1.37553.8.1.8.8.5.65.8.1.5' => array('name' => 'API REST CLient', 'alias' => 'frdl\Client\RESTapi', 'default' => 'webdof\Webfan\APIClient',
'abstract' => null,
'interfaces' => array() ),
),
);
return $this;
}
public function mapWrappers($wrappers = null){
$this->wrappers = (is_array($wrappers)) ? $wrappers
: array(
'webfan' => array(
'tld' => array(
'code' => 'webfan\Loader',
),
),
'frdl' => array(
),
'homepagespeicher' => array(
),
'frdlweb' => array(
),
'outshop' => array(
),
'startforum' => array(
),
'wehowski' => array(
),
'till' => array(
),
);
return $this;
}
public function setAutoloader($LoaderClass = self::LOADER, &$success = false){
$this->LoaderClass = $LoaderClass;
return $this;
}
public function init_stream_wrappers($overwrite = true){
foreach($this->wrappers as $protocoll => $wrapper){
$this->_stream_wrapper_register($protocoll, $overwrite);
}
return $this;
}
public function mapAliasing($apply = false){
foreach($this->wrap['aliasing']['schema'] as $OID => $map){
$this->wrap['c'][$map['alias']] = array($map['default'],null, $OID);
if(true===$apply){
$this->addClass($map['default'], $map['alias'],TRUE, $success );
}
}
return $this;
}
public function Autoloader($expose = false){
$component = '1.3.6.1.4.1.37553.8.1.8.8.5.65.8.1.1';
if(null===$this->LoaderClass){
foreach($this->wrap['c'] as $alias => $info){
if($component !== $info[2] || true !== $info[1] )continue;
$this->LoaderClass = $info[0];
break;
}
}
$Loader = (class_exists('\\'.$this->LoaderClass) ) ? call_user_func('\\'.$this->LoaderClass.'::top')
: call_user_func('\\'.$this->wrap['aliasing']['schema'][$component]['default'].'::top') ;
return (true === $expose) ? $Loader : $this;
}
public function applyAliasMap($retry = false){
foreach($this->wrap['c'] as $v => $o){
if(null === $o[1] || (true === $retry && false === $o[1]))$this->addClass($o[0], $v,true, $success);
}
return $this;
}
public function __toString(){
return (string)$this->app->name;
}
public static function getInstance($init = false, $LoaderClass = self::LOADER, $name = '', $branch = 'dev-master',
$version = 'v1.0.2-beta.1', $meta = array())
{
if (NULL === self::$instance) {
self::$instance = new self($init, $LoaderClass, $name, $branch, $version , $meta);
}
return self::$instance;
}
protected function _fnCallback($name){
// A
if(isset($this->shortcuts[$name])){
if(is_callable($this->shortcuts[$name]))return $this->shortcuts[$name];
}
//B
$name = str_replace('\\','.',$name);
if(strpos($name,'.')!==false || strpos($name,'->')!==false || strpos($name,'::')!==false){
if(strpos($name,'->')===false && strpos($name,'::')===false){
$n = explode('.', $name);
$method = array_pop($n);
$name = implode('\\', $n);
return array($name, $method);
}elseif( strpos($name,'->')!==false){
$n = explode('->', $name, 2);
$static = false;
}elseif(strpos($name,'::')!==false){
$n = explode('::', $name, 2);
$static = true;
}
$method = array_pop($n);
$n = explode('.', $n[0]);
$name = implode('\\', $n);
return ($static === false) ? array($name, $method) : $name.'::'.$method;
}
}
public function __call($name, $arguments)
{
if(isset($this->wrap['f'][$name])){
try{
return call_user_func_array($this->wrap['f'][$name],$arguments);
}catch(Exeption $e){
trigger_error($e->getMesage().' '.__METHOD__.' '.__LINE__, $this->E_CALL);
}
}
try{
$c = $this->_fnCallback($name);
if(is_callable($c))call_user_func_array($c,$arguments);
return $this;
}catch(Exeption $e){
trigger_error($e->getMesage().' '.__METHOD__.' '.__LINE__, $this->E_CALL);
return $this;
}
trigger_error($name.' not defined in '.__METHOD__.' '.__LINE__, $this->E_CALL);
return $this;
}
public static function __callStatic($name, $arguments)
{
if(isset(self::God(false)->wrap['f'][$name])){
try{
return call_user_func_array(self::God(false)->wrap['f'][$name],$arguments);
}catch(Exeption $e){
trigger_error($e->getMesage().' '.__METHOD__.' '.__LINE__, self::God(false)->E_CALL);
}
}
try{
$c = self::God()->_fnCallback($name);
if(is_callable($c))call_user_func_array($c,$arguments);
return self::God();
}catch(Exeption $e){
trigger_error($e->getMesage().' '.__METHOD__.' '.__LINE__, self::God(false)->E_CALL);
return self::God();
}
trigger_error($name.' not defined in '.__METHOD__.' '.__LINE__, $this->E_CALL);
return self::God();
}
public function addStreamWrapper( $protocoll, $tld, $class, $overwrite = true ) {
if(!isset($this->wrappers[$protocoll]))$this->wrappers[$protocoll] = array();
if(!isset($this->wrappers[$protocoll]['tld']))$this->wrappers[$protocoll]['tld'] = array();
$this->wrappers[$protocoll]['tld'][$tld] = $class;
$this->_stream_wrapper_register($protocoll, $overwrite);
return $this;
}
public function addClass($Instance, $Virtual, $autoload = TRUE, &$success = null ) {
$success = ($Instance !== $Virtual) ? class_alias( $Instance, $Virtual, $autoload) : true;
$this->wrap['c'][$Virtual]= array( (is_object($Instance)) ? get_class($Instance) : $Instance, $success);
return $this;
}
public function addFunc($name, \Closure $func){
$this->wrap['f'][$name] = $func;
return $this;
}
protected function _stream_wrapper_register($protocoll, $overwrite = true, &$success = null){
if (in_array($protocoll, stream_get_wrappers())) {
if(true !== $overwrite){
$success = false;
return $this;
}
stream_wrapper_unregister($protocoll);
}
$success = stream_wrapper_register($protocoll, get_class($this));
return $this;
}
/**
* Streaming Methods
*/
public function stream_open($url, $mode, $options = STREAM_REPORT_ERRORS, &$opened_path = null){
$u = parse_url($url);
$c = explode('.',$u['host']);
$c = array_reverse($c);
$this->Controller = null;
$cN = (isset(self::God()->wrappers[$u['scheme']]['tld'][$c[0]]))
?self::God()->wrappers[$u['scheme']]['tld'][$c[0]]
:false;
if(false!==$cN){
try{
$this->Controller = new $cN;
}catch(Exception $e){
trigger_error($e->getMessage(), E_USER_NOTICE);
return false;
}
}else{
trigger_error('Stream handler for '.$url.' not found.', E_USER_NOTICE);
return false;
}
return call_user_func(array($this->Controller, __FUNCTION__),$url, $mode, $options );
}
public function dir_closedir(){return call_user_func(array($this->Controller, __FUNCTION__) );}
public function dir_opendir($path , $options){return call_user_func(array($this->Controller, __FUNCTION__), $path , $options );}
public function dir_readdir(){return call_user_func(array($this->Controller, __FUNCTION__) );}
public function dir_rewinddir(){return call_user_func(array($this->Controller, __FUNCTION__) );}
public function mkdir($path , $mode , $options){return call_user_func(array($this->Controller, __FUNCTION__), $path , $mode , $options );}
public function rename($path_from , $path_to){return call_user_func(array($this->Controller, __FUNCTION__), $path_from , $path_to );}
public function rmdir($path , $options){return call_user_func(array($this->Controller, __FUNCTION__), $path , $options );}
public function stream_cast($cast_as){return call_user_func(array($this->Controller, __FUNCTION__), $cast_as );}
public function stream_close(){return call_user_func(array($this->Controller, __FUNCTION__) );}
function stream_eof(){return call_user_func(array($this->Controller, __FUNCTION__) );}
public function stream_flush(){return call_user_func(array($this->Controller, __FUNCTION__) );}
public function stream_lock($operation){return call_user_func(array($this->Controller, __FUNCTION__), $operation );}
public function stream_set_option($option , $arg1 , $arg2){return call_user_func(array($this->Controller, __FUNCTION__), $option , $arg1 , $arg2 );}
public function stream_stat(){return call_user_func(array($this->Controller, __FUNCTION__) );}
public function unlink($path){return call_user_func(array($this->Controller, __FUNCTION__), $path );}
public function url_stat($path , $flags){return call_user_func(array($this->Controller, __FUNCTION__), $path , $flags );}
function stream_read($count){return call_user_func(array($this->Controller, __FUNCTION__), $count );}
function stream_write($data){return call_user_func(array($this->Controller, __FUNCTION__), $data) ;}
function stream_tell(){return call_user_func(array($this->Controller, __FUNCTION__) );}
function stream_seek($offset, $whence){return call_user_func(array($this->Controller, __FUNCTION__), $offset, $whence );}
function stream_metadata($path, $option, $var){return call_user_func(array($this->Controller, __FUNCTION__), $path, $option, $var);}
}
--2222EVGuDPPT
Content-Type: application/vnd.frdl.script.php;charset=utf-8
Content-Disposition: php ;filename="$DIR_LIB/frdl/common/Stream.php";name="class frdl\common\Stream"
<?php
/**
* Copyright (c) 2015, 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.
*
* shared by yannick http://php.net/manual/de/class.streamwrapper.php#92277
*
*/
namespace frdl\common;
interface Stream
{
function stream_open($url, $mode, $options = STREAM_REPORT_ERRORS, &$opened_path = null);
public function dir_closedir();
public function dir_opendir($path , $options);
public function dir_readdir();
public function dir_rewinddir();
public function mkdir($path , $mode , $options);
public function rename($path_from , $path_to);
public function rmdir($path , $options);
public function stream_cast($cast_as);
public function stream_close();
public function stream_eof();
public function stream_flush();
public function stream_lock($operation);
public function stream_set_option($option , $arg1 , $arg2);
public function stream_stat();
public function unlink($path);
public function url_stat($path , $flags);
public function stream_read($count);
public function stream_write($data);
public function stream_tell();
public function stream_seek($offset, $whence);
public function stream_metadata($path, $option, $var);
}
--2222EVGuDPPT
Content-Type: application/vnd.frdl.script.php;charset=utf-8
Content-Disposition: php ;filename="$DIR_LIB/frdl/webfan/Autoloading/Loader.php";name="class frdl\webfan\Autoloading\Loader"
<?php
/**
*
* Copyright (c) 2015, 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. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the frdl/webfan.
* 4. 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.
*
*
*
*
*
*
*
*/
namespace frdl\webfan\Autoloading;
abstract class Loader
{
abstract function autoload_register ();
abstract function addLoader ( $Autoloader , $throw = true , $prepend = true );
abstract function unregister ( $Autoloader );
abstract function addPsr0 ( $prefix , $base_dir , $prepend = true );
abstract function addNamespace ( $prefix , $base_dir , $prepend = true );
abstract function addPsr4 ( $prefix , $base_dir , $prepend = true ) ;
abstract function Psr4 ( $class ) ;
abstract function loadClass ( $class );
abstract function Psr0 ( $class ) ;
abstract function routeLoadersPsr0 ( $prefix , $relative_class ) ;
abstract function setAutloadDirectory ( $dir ) ;
abstract function routeLoaders ( $prefix , $relative_class );
abstract protected function inc ( $file );
abstract function classMapping ( $class ) ;
abstract function class_mapping_add ( $class , $file , & $success = null );
abstract function class_mapping_remove ( $class ) ;
abstract function autoloadClassFromServer ( $className ) ;
}
--2222EVGuDPPT
Content-Type: application/vnd.frdl.script.php;charset=utf-8
Content-Disposition: php ;filename="$DIR_LIB/frdl/webfan/Autoloading/SourceLoader.php";name="class frdl\webfan\Autoloading\SourceLoader"
<?php
/**
*
* Copyright (c) 2015, 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. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the frdl/webfan.
* 4. 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.
*
*
* @author Till Wehowski <php.support@webfan.de>
* @package frdl\webfan\Autoloading\SourceLoader
* @uri /v1/public/software/class/webfan/frdl.webfan.Autoloading.SourceLoader/source.php
* @file frdl\webfan\Autoloading\SourceLoader.php
* @role Autoloader
* @copyright 2015 Copyright (c) Till Wehowski
* @license http://look-up.webfan.de/bsd-license bsd-License 1.3.6.1.4.1.37553.8.1.8.4.9
* @license http://look-up.webfan.de/webdof-license webdof-license 1.3.6.1.4.1.37553.8.1.8.4.5
* @link http://interface.api.webfan.de/v1/public/software/class/webfan/frdl.webfan.Autoloading.SourceLoader/doc.html
* @OID 1.3.6.1.4.1.37553.8.1.8.8 webfan-software
* @requires PHP_VERSION 5.3 >=
* @requires webfan://frdl.webfan.App.code
* @api http://interface.api.webfan.de/v1/public/software/class/webfan/
* @reference http://www.webfan.de/install/
* @implements StreamWrapper
*
*/
namespace frdl\webfan\Autoloading;
use frdl\common;
class SourceLoader extends Loader
{
const NS = __NAMESPACE__;
const DS = DIRECTORY_SEPARATOR;
const SESSKEY = __CLASS__;
/**
* PKI
*/
const DISABLED = 0;
const OPENSSL = 1;
const PHPSECLIB = 2;
const E_NORSA = 'No RSA library selected or supported';
const E_NOTIMPLEMENTED = 'Sorry thisd is not implemented yet';
const B_SIGNATURE = "-----BEGIN SIGNATURE-----\r\n";
const E_SIGNATURE = "-----END SIGNATURE-----";
const B_CERTIFICATE = "-----BEGIN CERTIFICATE-----\r\n";
const E_CERTIFICATE = "-----END CERTIFICATE-----";
const B_PUBLIC_KEY = "-----BEGIN PUBLIC KEY-----\r\n";
const E_PUBLIC_KEY = "-----END PUBLIC KEY-----";
const B_RSA_PRIVATE_KEY = "-----BEGIN RSA PRIVATE KEY-----\r\n";
const E_RSA_PRIVATE_KEY = "-----END RSA PRIVATE KEY-----";
const B_KEY = "-----BEGIN KEY-----\r\n";
const E_KEY = "-----END KEY-----";
const B_LICENSEKEY = "-----BEGIN LICENSEKEY-----\r\n";
const E_LICENSEKEY = "-----END LICENSEKEY-----";
public $sid;
protected $lib;
/**
* Stream Properties
*/
protected $Client;
public $context = array();
protected $data;
protected $chunk;
public $buflen;
protected $pos = 0;
protected $read = 0;
public static $id_repositroy;
public static $id_interface;
public static $api_user;
public static $api_pass;
protected $eof = false;
protected $mode;
protected $dir_autoload;
protected static $config_source = array(
'install' => false,
'dir_lib' => false,
'session' => false,
'zip_stream' => false,
'append_eval_to_file' => false,
);
protected $autoloaders = array();
protected $autoloadersPsr0 = array();
protected $classmap = array();
protected $isAutoloadersRegistered = false;
protected $interface;
/**
* "Run Time Cache" / Buffer
*/
protected static $rtc;
protected static $instances = array();
protected $buf = array(
'config' => array(),
'opt' => array(),
'sources' => array(),
);
function __construct($pass = null)
{
$this->sid = count(self::$instances);
self::$instances[$this->sid] = &$this;
$this->interface = null;
$this->dir_autoload = '';
self::repository(((!isset($_SESSION[self::SESSKEY]['id_repository']))?'frdl':$_SESSION[self::SESSKEY]['id_repository']));
self::$id_interface = 'public';
self::$api_user = '';
self::$api_pass = '';
$this->Defaults(true);
$this->set_pass($pass);
}
public function j(){
return \webfan\App::God();
}
public static function top(){
if(0 === count(self::$instances))return new self;
return self::getStream(0);
}
public static function getStream($sid){
return (isset(self::$instances[$sid])) ? self::$instances[$sid] : null;
}
public static function repository($id = null){
if($id !== null)$_SESSION[self::SESSKEY]['id_repository'] = $id;
self::$id_repositroy = &$_SESSION[self::SESSKEY]['id_repository'];
return self::$id_repositroy;
}
public function set_interface(Array &$interface = null){
$this->interface = (is_array($interface)) ? $interface : null;
return $this;
}
public function config_source($key = null, $value = null){
if(!is_string($key))return self::$config_source;
if(!isset(self::$config_source[$key]))return false;
self::$config_source[$key]=$value;
if(null===$value)unset(self::$config_source[$key]);
$this->config['source'] = &self::$config_source;
$this->top()->config['source'] = &self::$config_source;
return true;
}
public function Defaults($set = false){
$config = array(
'host' => null,
'IP' => null,
'uid' => 0,
'encrypted' => true,
'e_method' => 2,
'c_method' => 1,
'source' => $this->config_source(),
'ERROR' => E_USER_WARNING,
'ini' => array(
'display_errors_details' => false,
'pev' => array(
'CUSTOM' => null,
'REQUEST' => true,
'HOST' => $_SERVER['SERVER_NAME'],
// 'IPs' => $App->getServerIp(),
'PATH' => null,
),
),
);
if($set === true){
$this->set_config($config);
}
return array(
'config' => $config,
);
}
protected function set_pass($pass = null){
$this->pass = (is_string($pass)) ? $pass : mt_rand(10000,9999999).sha1($_SERVER['SERVER_NAME']).'faldsghdfshfdshjfdhjr5nq7q78bg2nda jgf jtrfun56m8rtjgfjtfjtzurtnmrt tr765 $bbg r57skgmhmh';
}
public function mkp(){
$this->set_pass(null);
return $this;
}
public function set_config(&$config){
$this->config = (is_array($config)) ? $config : $this->buf['config'];
if(isset($this->config['source']) && is_array($this->config['source']))self::$config_source = &$this->config['source'];
return $this;
}
public function installSource($class,&$code, &$error ='', &$config_source = null){
if($config_source === null)$config_source = &self::$config_source;
// if($config_source === null)$config_source = $this->config['source'];
if($config_source['install'] !== true)return null;
if(!isset($code['php']))return false;
if(isset($code['installed']) && $code['installed'] === true)return true;
if($class !== '\frdl\webfan\Serialize\Binary\bin' && class_exists('\frdl\webfan\Serialize\Binary\bin')){
$bs = new \frdl\webfan\Serialize\Binary\bin();
$code['doc'] = $bs->unserialize($this->unpack_license($code['d']));
}
$error = '';
$r = false;
if(isset($config_source['dir_lib']) && is_string($config_source['dir_lib']) && is_dir($config_source['dir_lib'])){
$dir = rtrim($config_source['dir_lib'], self::DS . ' '). self::DS ;
$filename = $dir.str_replace('\\', self::DS, $class).'.php';
$filename = str_replace('/', DIRECTORY_SEPARATOR,$filename);
$dir = dirname($filename).self::DS;
if(!is_dir($dir)){
if(!mkdir($dir, 0755, true)){
$error = 'Cannot create directory '.$dir.' and cannot save class '.$class.' in '.__METHOD__.' '.__LINE__;
trigger_error($error,E_USER_WARNING);
}
}
if($error === ''){
$file_header = "/**\n* File generated by frdl Application Composer : class : ".__CLASS__."\n**/\n";
$php = '<?php '."\n".$file_header."\n/*\$filemtime = ".time().";\n\$class_documentation = ".var_export((isset($code['doc']))?$code['doc']:array(), true).";*/\n".$code['php']."\n";
$fp = fopen($filename, 'wb+');
fwrite($fp,$php);
fclose($fp);
if(file_exists($filename)){
$code['installed'] = true;
$r = true;
}else{
$error = 'Cannot create file '.$filename.' and cannot save class '.$class.' in '.__METHOD__.' '.__LINE__;
trigger_error($error,E_USER_WARNING);
}
}
}
return $r;
}
public function patch_autoload_function($class){
if(function_exists('__autoload'))return __autoload($class);
}
public function autoload_register(){
if(false !== $this->isAutoloadersRegistered){
trigger_error('Autoloadermapping is already registered.',E_USER_NOTICE);
return $this;
}
$this->addLoader(array($this,'Psr4'), true, true);
$this->addLoader(array($this,'Psr0'), true, false);
$this->addLoader(array($this,'classMapping'), true, false);
$this->addLoader(array($this,'patch_autoload_function'), true, false);
$this->addLoader(array($this,'autoloadClassFromServer'), true, false);
$this->isAutoloadersRegistered = true;
return $this;
}
public function addLoader($Autoloader, $throw = true, $prepend = false){
spl_autoload_register($Autoloader, $throw, $prepend);
return $this;
}
public function unregister( $Autoloader)
{
spl_autoload_unregister($Autoloader);
return $this;
}
/**
* Psr-0
*/
public function addPsr0($prefix, $base_dir, $prepend = false)
{
$prefix = trim($prefix, '\\') . '\\';
$base_dir = rtrim($base_dir, self::DS) . self::DS;
if(isset($this->autoloadersPsr0[$prefix]) === false) {
$this->autoloadersPsr0[$prefix] = array();
}
if($prepend) {
array_unshift($this->autoloadersPsr0[$prefix], $base_dir);
} else {
array_push($this->autoloadersPsr0[$prefix], $base_dir);
}
return $this;
}
/**
* Psr-4
*/
public function addNamespace($prefix, $base_dir, $prepend = false)
{
return $this->addPsr4($prefix, $base_dir, $prepend);
}
public function addPsr4($prefix, $base_dir, $prepend = false)
{
$prefix = trim($prefix, '\\') . '\\';
$base_dir = rtrim($base_dir, self::DS) . self::DS;
if(isset($this->autoloaders[$prefix]) === false) {
$this->autoloaders[$prefix] = array();
}
if($prepend) {
array_unshift($this->autoloaders[$prefix], $base_dir);
} else {
array_push($this->autoloaders[$prefix], $base_dir);
}
return $this;
}
public function Psr4($class)
{
$prefix = $class;
while (false !== $pos = strrpos($prefix, '\\')) {
$prefix = substr($class, 0, $pos + 1);
$relative_class = substr($class, $pos + 1);
$file = $this->routeLoaders($prefix, $relative_class);
if ($file) {
return $file;
}
$prefix = rtrim($prefix, '\\');
}
return false;
}
public function loadClass($class)
{
return $this->Psr4($class);
}
public function Psr0($class)
{
$prefix = $class;
while (false !== $pos = strrpos($prefix, '\\')) {
$prefix = substr($class, 0, $pos + 1);
$relative_class = substr($class, $pos + 1);
$file = $this->routeLoadersPsr0($prefix, $relative_class);
if ($file) {
return $file;
}
$prefix = rtrim($prefix, '\\');
}
return false;
}
public function routeLoadersPsr0($prefix, $relative_class)
{
if (!isset($this->autoloadersPsr0[$prefix])) {
return false;
}
foreach ($this->autoloadersPsr0[$prefix] as $base_dir) {
if (null === $prefix || $prefix.'\\' === substr($relative_class, 0, strlen($prefix.'\\'))) {
$fileName = '';
$namespace = '';
if (false !== ($lastNsPos = strripos($relative_class, '\\'))) {
$namespace = substr($relative_class, 0, $lastNsPos);
$relative_class = substr($relative_class, $lastNsPos + 1);
$fileName = str_replace('\\', self::DS, $namespace) . self::DS;
}
$fileName .= str_replace('_', self::DS, $relative_class) /* . '.php' */;
$file = ($base_dir !== null ? $base_dir . self::DS : '') . $fileName;
if ($this->inc($file)) {
return $file;
}
}
}
return false;
}
public function setAutloadDirectory($dir){
if(!is_dir($dir))return false;
$this->dir_autoload = $dir;
if(substr($this->dir_autoload,-1,1) !== self::DS)$this->dir_autoload.=self::DS;
return true;
}
public function routeLoaders($prefix, $relative_class)
{
if (!isset($this->autoloaders[$prefix])) {
return false;
}
foreach ($this->autoloaders[$prefix] as $base_dir) {
$file = $base_dir
. str_replace('\\', self::DS, $relative_class)
/* . '.php' */
;
if ($this->inc($file)) {
return $file;
}
}
return false;
}
protected function inc($file)
{
if(substr($file,-4,4) === '.php'){
$file = $file;
}else{
$file.= '.php';
}
$file2= substr($file,0,-4).'.inc';
if(file_exists($file)) {
require $file;
return true;
}elseif(file_exists($file2)) {
require $file2;
return true;
}
return false;
}
public function classMapping($class){
if(isset($this->classmap[$class])){
if ($this->inc($this->classmap[$class])) {
return $this->classmap[$class];
}
}
return false;
}
public function class_mapping_add($class, $file, &$success = null){
if(file_exists($file)){
$this->classmap[$class] = $file;
$success = true;
}else{
$success = false;
}
return $this;
}
public function class_mapping_remove($class){
if(isset($this->classmap[$class]))unset($this->classmap[$class]);
return $this;
}
protected function source_check($str){
$start = 'array';
$badwords = array('$',';', '?', '_', 'function ', 'class ');
foreach($badwords as $num => $s){
if(strpos($str, $s)!== false)return false;
}
if(substr($str,0,strlen($start)) !== $start)return false;
if(!preg_match('/[a-f0-9]{40}/', $str))return false;
return true;
}
public function autoloadClassFromServer($className){
$classNameOrig = $className;
if(class_exists($className))return;
if (!in_array('webfan', stream_get_wrappers())){
trigger_error('Streamwrapper webfan is not registered. Call to webfan\App::init() required.', E_USER_ERROR);
return;
}
$className = str_replace('\\', '.', $className);
$className = ltrim($className, ' .');
$RessourceFileName = 'webfan://'.$className.'.code';
$fp = fopen($RessourceFileName, 'r');
$source = '';
if($fp){
clearstatcache();
clearstatcache(true,$RessourceFileName);
$stat = fstat($fp);
$bufsize = ($stat['size'] <= 8192) ? $stat['size'] : 8192;
while(!feof($fp) ){
$source .= fread($fp, $bufsize);
}
fclose($fp);
}else{
return false;
}
if($source ===false || $source ==='' ){
trigger_error('Cannot get source from the webfan code server ('.$RessourceFileName.')! '.__METHOD__.' '.__LINE__, E_USER_WARNING);
return false;
}
$scheck = $this->source_check($source);
if($scheck !== true){
trigger_error('The source loaded from the code server looks malicious ('.$scheck.' '.$RessourceFileName.')! '.__METHOD__.' '.__LINE__, E_USER_WARNING);
return false;
}
if(eval('$data = '.$source.';')===false){
trigger_error('Cannot process the request to the source server by APIDClient ('.$RessourceFileName.')! '.__METHOD__.' '.__LINE__, E_USER_WARNING);
return false;
}
$_defaults = $this->Defaults();
$config = self::$config_source;//$_defaults["config"];
$opt = (isset($data['opt'])) ? $data['opt'] : $this->getOpt();
$code = $data['source'];
$sources = array();
$sources[$classNameOrig] = $code;
if(is_array($this->interface)){
$opt['pass'] = $this->interface['API_SECRET'];
$opt['rot1'] = $this->interface['rot1'];
$opt['rot2'] = $this->interface['rot2'];
}
if($this->loadSources($sources,$opt, $config )===false){
trigger_error('Cannot process the request to the source server by APIDClient ('.$className.')! '.__METHOD__.' '.__LINE__, E_USER_WARNING);
return false;
}
return $RessourceFileName;
}
public function make_pass_3(&$opt){
if(isset($opt['pwdstate']) && $opt['pwdstate'] === 'decrypted')return true;
if(isset($opt['pwdstate']) && $opt['pwdstate'] === 'error')return false;
if(!isset(self::$rtc['CERTS']))self::$rtc['CERTS'] = array();
$hash = sha1($opt['CERT']);
$u = parse_url($opt['CERT']);
$url = $opt['CERT'];
if(!isset(self::$rtc['CERTS'][$hash]) && ($u === false || !isset(self::$rtc['CERTS'][$url])))
{
if($u !== false && count($u) >1 && !preg_match("/CERTIFICATE/", $opt['CERT']) ){
if(isset($u['scheme']) && isset($u['host'])){
$h = explode('.',$u['host']);
$h = array_reverse($h);
if($h[0] === 'de' && ($h[1] === 'webfan' || $h[1] === 'frdl' )){
if(class_exists('\webdof\Http\Client')){
$Http = new \webdof\Http\Client();
$post = array();
$send_cookies = array();
$r = $Http->request($opt['CERT'], 'GET', $post, $send_cookies, E_USER_WARNING);
}else{
$c = file_get_contents($opt['CERT']);
$r = array();
$r['status'] = (preg_match("/CERTIFICATE/",$c)) ? 200 : 400;
$r['body'] = $c;
}
if(intval($r['status'])===200){
$CERT = trim($r['body']);
}else{
$opt['pwdstate'] = '404';
return false;
}
}
}else{
$CERT = trim(file_get_contents($opt['CERT']));
}
$key = $url;
if(!isset(self::$rtc['CERTS'][$key]))self::$rtc['CERTS'][$key] = array();
self::$rtc['CERTS'][$key]['crt'] = $CERT;
}elseif(preg_match("/CERTIFICATE/", $opt['CERT'])){
$key = $hash;
if(!isset(self::$rtc['CERTS'][$key]))self::$rtc['CERTS'][$key] = array();
$CERT = utf8_encode($opt['CERT']);
$CERT=$this->loadPK($CERT);
if($CERT===false){
trigger_error('Cannot procces certificate info in '.__METHOD__.' line '.__LINE__, E_USER_WARNING);
return false;
}
$CERT=$this->save($CERT, self::B_CERTIFICATE, self::E_CERTIFICATE);
self::$rtc['CERTS'][$key]['crt'] =$CERT;
}else{
trigger_error('Cannot procces certificate info in '.__METHOD__.' line '.__LINE__, E_USER_WARNING);
return false;
}
}elseif(isset(self::$rtc['CERTS'][$hash])){
$key = $hash;
}elseif(isset(self::$rtc['CERTS'][$url])){
$key = $url;
}else{
trigger_error('Cannot procces certificate info in '.__METHOD__.' line '.__LINE__, E_USER_WARNING);
return false;
}
$this->setLib(1);
if(!isset(self::$rtc['CERTS'][$key]['PublicKey'])){
$PublicKey = $this->getPublKeyByCRT(self::$rtc['CERTS'][$key]['crt']);
self::$rtc['CERTS'][$key]['PublicKey'] = $PublicKey;
}
$success = $this->decrypt($opt['pass'],self::$rtc['CERTS'][$key]['PublicKey'],$new_pass) ;
if($success === true){
$opt['pass'] = $new_pass;
$opt['pwdstate'] = 'decrypted';
}else{
$opt['pwdstate'] = 'error';
// unset(self::$rtc['CERTS'][$key]);
}
return $success;
}
protected function load(&$code, Array &$config = null, &$opt = array('pass' => null, 'rot1' => 5, 'rot2' => 3), $class = null){
$p = $this->_unwrap_code(((is_string($code)) ? $code : $code['c']));
if(isset($opt['e']) && is_bool($opt['e']))$config['encrypted'] = $opt['e'];
if(isset($opt['m']))$config['e_method'] = $opt['m'];
if($config['encrypted'] === true && intval($config['e_method']) === 1){
trigger_error('The options encryption method is deprecated in '.__METHOD__.' '.__LINE__,$config['ERROR']);
return false;
}
if($config['encrypted'] === true && intval($config['e_method']) === 2){
$p = trim($this->crypt($p, 'decrypt', $opt['pass'], $opt['rot1'], $opt['rot2']));
}
if($config['encrypted'] === true && intval($config['e_method']) === 3){
if($this->make_pass_3($opt) == false){
trigger_error('Cannot decrypt password properly [1] from '.self::$id_repositroy.' for '.$class.' in '.__METHOD__.' '.__LINE__,$config['ERROR']);
return false;
}
$p = trim($this->crypt($p, 'decrypt', $opt['pass'], $opt['rot1'], $opt['rot2']));
}
if(isset($code['s']) && $code['s'] !== sha1($p)){
$errordetail = ($config['ini']['display_errors_details'] === true)
? '<pre>'.sha1($p).'</pre><pre>'.$code['s'].'</pre><pre>'.$opt['pass'].' '.$opt['rot1'].' '.$opt['rot2'].'</pre>'
: '';
trigger_error('Cannot decrypt source properly [2] from '.self::$id_repositroy.' for '.$class.' in '.__METHOD__.' '.__LINE__.$errordetail,$config['ERROR']);
return false;
}
$p = $this->unwrap_namespace($p);
$code['php'] = $p;
try{
$parsed = eval($p);
}catch(Exception $e){
$parsed = false;
}
if($parsed === false){
$errordetail = ($config['ini']['display_errors_details'] === true)
? '<pre>'.htmlentities($p).'</pre>'
: '';
trigger_error('Parse Error in '.__METHOD__.' '.__LINE__.$errordetail,$config['ERROR']);
return false;
} else {
unset($code['c']);
}
$error = '';
$config_source = (isset($config['source'])) ? $config['source'] : self::$config_source;
$installed = $this->installSource($class,$code, $error, $config_source);
// usleep(75);
return true;
}
public function loadSource(&$code, Array &$config = null, &$opt = array('pass' => null, 'rot1' => 5, 'rot2' => 3), $class = null){
return $this->load($code, $config, $opt, $class );
}
public function loadSources(&$sources, &$opt = array('pass' => null, 'rot1' => 5, 'rot2' => 3), Array &$config = null){
$this->set_config($config);
$this->mkp($config);
foreach($sources as $class => $code){
if(class_exists($class))continue;
if($this->load($code, $config, $opt, $class) === false){
return false;
}
}
return true;
}
public function crypt($data, $command = 'encrypt', $Key = NULL, $offset = 5, $chiffreBlockSize = 3)
{
if($command === 'encrypt'){
$data = sha1(trim($data)).$data;
$k = sha1($Key).$Key;
$str = $data;
$data = '';
for($i=1; $i<=strlen($str); $i++)
{
$char = substr($str, $i-1, 1);
$keychar = substr($k, ($i % strlen($k))-1, 1);
$char = chr(ord($char)+ord($keychar));
$data .= $char;
}
}
if(!is_numeric($offset)||$offset<0)$offset=0;if(!isset($data)||$data==""||!isset($Key)||$Key==""){return FALSE;}$pos="0";for($i=0;$i<=(strlen($data)-1);$i++){$shift=($offset+$i)*$chiffreBlockSize;while($shift>=256){$shift-=256;}$char=substr($data,$i,1);$char=ord($char)+$shift;if($pos>=strlen($Key)){$pos="0";}$key=substr($Key,$pos,1);$key=ord($key)+$shift;if($command=="decrypt"){$key=256-$key;}$dataBlock=$char+$key;if($dataBlock>=256){$dataBlock=$dataBlock-256;}$dataBlock=chr(($dataBlock-$shift));if(!isset($crypted)){$crypted=$dataBlock;}else{$crypted.=$dataBlock;}$pos++;}
if($command === 'decrypt'){
$decrypt = '';
$k = sha1($Key).$Key;
for($i=1; $i<=strlen($crypted); $i++)
{
$char = substr($crypted, $i-1, 1);
$keychar = substr($k, ($i % strlen($k))-1, 1);
$char = chr(ord($char)-ord($keychar));
$decrypt .= $char;
}
$crypted = substr($decrypt,strlen(sha1("1")),strlen($decrypt));
$hash_check = substr($decrypt,0,strlen(sha1("1")));
if(trim($hash_check) !== sha1($crypted) || sha1($crypted)==='da39a3ee5e6b4b0d3255bfef95601890afd80709'){
$crypted = false;
trigger_error('Broken data consistence in '.__METHOD__, E_USER_NOTICE);
}
}
return $crypted;
}
public function unwrap_namespace($s){
$s = preg_replace("/^(namespace ([A-Za-z0-9\_".preg_quote('\\')."]+);){1}/", '${1}'."\n", $s);
return preg_replace("/(\nuse ([A-Za-z0-9\_".preg_quote('\\')."]+);)/", '${1}'."\n", $s);
}
public function _unwrap_code($c){return trim(gzuncompress(gzuncompress(base64_decode(str_replace("\r\n\t","", $c))))," \r\n");}
public function unpack_license($l){return gzuncompress(gzuncompress(base64_decode(str_replace("\r\n", "", $l))));}
function __destruct() {foreach(array_keys(get_object_vars($this)) as $value){unset($this->$value);}}
/**
* PKI
*/
public function setLib($lib)
{
$this->lib = $lib;
return $this;
}
public function save($data, $begin = "-----BEGIN SIGNATURE-----\r\n", $end = '-----END SIGNATURE-----')
{
return $begin . chunk_split(base64_encode($data)) . $end;
}
public function loadPK($str)
{
$data = preg_replace('#^(?:[^-].+[\r\n]+)+|-.+-|[\r\n]#', '', $str);
return preg_match('#^[a-zA-Z\d/+]*={0,2}$#', $data) ? utf8_decode (base64_decode($data) ) : false;
}
public function error($error, $mod = E_USER_ERROR, $info = TRUE)
{
trigger_error($error.(($info === TRUE) ? ' in '.__METHOD__.' line '.__LINE__ : ''), $mod);
return FALSE;
}
public function verify($data, $sigBin, $publickey, $algo = 'sha256WithRSAEncryption')
{
switch($this->lib)
{
case self::OPENSSL :
return $this->verify_openssl($data, $sigBin, $publickey, $algo);
break;
case self::PHPSECLIB :
return $this->verify_phpseclib($data, $sigBin, $publickey, $algo);
break;
case self::DISABLED :
default :
return $this->error(self::E_NORSA, E_USER_ERROR);
break;
}
}
public function getPublKeyByCRT($cert)
{
switch($this->lib)
{
case self::OPENSSL :
return $this->getPublKeyByCRT_openssl($cert);
break;
case self::PHPSECLIB :
return $this->error(self::E_NOTIMPLEMENTED, E_USER_ERROR);
break;
case self::DISABLED :
default :
return $this->error(self::E_NORSA, E_USER_ERROR);
break;
}
}
public function encrypt($data,$PrivateKey,&$out)
{
switch($this->lib)
{
case self::OPENSSL :
return $this->encrypt_openssl($data,$PrivateKey,$out);
break;
case self::PHPSECLIB :
return $this->error(self::E_NOTIMPLEMENTED, E_USER_ERROR);
break;
case self::DISABLED :
default :
return $this->error(self::E_NORSA, E_USER_ERROR);
break;
}
}
public function decrypt($decrypted,$PublicKey,&$out)
{
switch($this->lib)
{
case self::OPENSSL :
return $this->decrypt_openssl($decrypted,$PublicKey,$out);
break;
case self::PHPSECLIB :
return $this->error(self::E_NOTIMPLEMENTED, E_USER_ERROR);
break;
case self::DISABLED :
default :
return $this->error(self::E_NORSA, E_USER_ERROR);
break;
}
}
protected function encrypt_openssl($data,$PrivateKey,&$out) {
$PrivKeyRes = openssl_pkey_get_private($PrivateKey);
return openssl_private_encrypt($data,$out,$PrivKeyRes);
}
protected function decrypt_openssl($decrypted,$PublicKey,&$out) {
$pub_key = openssl_get_publickey($PublicKey);
$keyData = openssl_pkey_get_details($pub_key);
$pub = $keyData['key'];
$successDecrypted = openssl_public_decrypt(base64_decode($decrypted),$out,$PublicKey, OPENSSL_PKCS1_PADDING);
return $successDecrypted;
}
protected function getPublKeyByCRT_openssl($cert)
{
$res = openssl_pkey_get_public($cert);
$keyDetails = openssl_pkey_get_details($res);
return $keyDetails['key'];
}
protected function verify_phpseclib($data, $sigBin, $publickey, $algo = 'sha256WithRSAEncryption')
{
$isHash = preg_match("/^([a-z]+[0-9]).+/", $algo, $hashinfo);
$hash = ($isHash) ? $hashinfo[1] : 'sha256';
$rsa = new Crypt_RSA();
$rsa->setHash($hash);
$rsa->setSignatureMode(CRYPT_RSA_SIGNATURE_PKCS1);
$rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1);
$rsa->loadKey($publickey);
return (($rsa->verify($data, $sigBin) === TRUE) ? TRUE : FALSE);
}
protected function verify_openssl($data, $sigBin, $publickey, $algo = 'sha256WithRSAEncryption')
{
return ((openssl_verify($data, $sigBin, $publickey, $algo) == 1) ? TRUE : FALSE);
}
/**
* Streaming Methods
*/
public function init(){$args = func_get_args(); /** todo ... */ return $this;}
public function DEFRAG(){trigger_error('Not implemented yet: '.get_class($this).' '.__METHOD__, E_USER_ERROR);}
public function stream_open($url, $mode, $options = STREAM_REPORT_ERRORS, &$opened_path = null){
$u = parse_url($url);
$c = explode('.',$u['host']);
$c = array_reverse($c);
$this->mode = $mode;
if($c[0]==='code')$tld = array_shift($c);
/**
* ToDo: APICLient
* $this->Client = new \frdl\Client\RESTapi();
*
* URL Pattern / e.g. this Class:
* http://interface.api.webfan.de/v1/public/software/class/webfan/frdl.webfan.Autoloading.SourceLoader/source.php
*
*/
if(class_exists('\webdof\wHTTP') && class_exists('\webdof\Http\Client') && class_exists('\webdof\Webfan\APIClient')){
$this->Client = new \webdof\Webfan\APIClient();
$this->Client->prepare( 'http',
'interface.api.webfan.de',
'GET',
self::$id_interface, // i1234
'software',
array(), //post
array(), //cookie
self::$api_user,
self::$api_pass,
'class',
'php', //format ->hier: "php"
'source',
array(self::$id_repositroy,implode(".",array_reverse($c))),
array(), //get
1,
E_USER_WARNING);
$this->eof = false;
$this->pos = 0;
try{
$r = $this->Client->request();
if(intval($r['status']) !== 200)return false;
$this->data = $r['body'];
}catch(Exception $e){
trigger_error('Cannot process the request to '.$url, E_USER_WARNING);
return false;
}
}else{
$url = 'http://interface.api.webfan.de/v1/'.self::$id_interface.'/software/class/'.self::$id_repositroy.'/'.implode(".",array_reverse($c)).'/source.php';
$data = file_get_contents($url);
if(false === $data){
return false;
}else{
$this->data = $data;
}
}
return true;
}
public function dir_closedir(){trigger_error('Not implemented yet: '.get_class($this).' '.__METHOD__, E_USER_ERROR);}
public function dir_opendir($path , $options){trigger_error('Not implemented yet: '.get_class($this).' '.__METHOD__, E_USER_ERROR);}
public function dir_readdir(){trigger_error('Not implemented yet: '.get_class($this).' '.__METHOD__, E_USER_ERROR);}
public function dir_rewinddir(){trigger_error('Not implemented yet: '.get_class($this).' '.__METHOD__, E_USER_ERROR);}
public function mkdir($path , $mode , $options){trigger_error('Not implemented yet: '.get_class($this).' '.__METHOD__, E_USER_ERROR);}
public function rename($path_from , $path_to){trigger_error('Not implemented yet: '.get_class($this).' '.__METHOD__, E_USER_ERROR);}
public function rmdir($path , $options){trigger_error('Not implemented yet: '.get_class($this).' '.__METHOD__, E_USER_ERROR);}
public function stream_cast($cast_as){trigger_error('Not implemented yet: '.get_class($this).' '.__METHOD__, E_USER_ERROR);}
public function stream_close(){
$this->Client = null;
}
public function stream_eof(){
$this->eof = ($this->pos >= strlen($this->data));
return $this->eof;
}
public function stream_flush(){
//echo $this->data;
$this->pos = strlen($this->data);
return $this->data;
}
public function stream_lock($operation){trigger_error('Not implemented yet: '.get_class($this).' '.__METHOD__, E_USER_ERROR);}
public function stream_set_option($option , $arg1 , $arg2){trigger_error('Not implemented yet: '.get_class($this).' '.__METHOD__, E_USER_ERROR);}
public function stream_stat(){
return array(
'mode' => $this->mode,
'size' => strlen($this->data) * 8,
);
}
public function unlink($path){trigger_error('Not implemented yet: '.get_class($this).' '.__METHOD__, E_USER_ERROR);}
public function url_stat($path , $flags){trigger_error('Not implemented yet: '.get_class($this).' '.__METHOD__, E_USER_ERROR);}
public function stream_read($count){
if($this->stream_eof())return '';
$maxReadLength = strlen($this->data) - $this->pos;
$readLength = min($count, $maxReadLength);
$p=&$this->pos;
$ret = substr($this->data, $p, $readLength);
$p += $readLength;
return (!empty($ret)) ? $ret : '';
}
public function stream_write($data){trigger_error('Not implemented yet: '.get_class($this).' '.__METHOD__, E_USER_ERROR);}
public function stream_tell(){return $this->pos;}
public function stream_seek($offset, $whence){
$l=strlen($this->data);
$p=&$this->pos;
switch ($whence) {
case SEEK_SET: $newPos = $offset; break;
case SEEK_CUR: $newPos = $p + $offset; break;
case SEEK_END: $newPos = $l + $offset; break;
default: return false;
}
$ret = ($newPos >=0 && $newPos <=$l);
if ($ret) $p=$newPos;
return $ret;
}
public function stream_metadata($path, $option, $var){trigger_error('Not implemented yet: '.get_class($this).' '.__METHOD__, E_USER_ERROR);}
}
--2222EVGuDPPT
Content-Type: application/vnd.frdl.script.php;charset=utf-8
Content-Disposition: php ;filename="$DIR_LIB/frdl/webfan/Autoloading/Autoloader.php";name="class frdl\webfan\Autoloading\Autoloader"
<?php
/**
*
* Copyright (c) 2015, 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. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the frdl/webfan.
* 4. 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.
*
*
*
*
*
*
*
*/
namespace frdl\webfan\Autoloading;
use frdl\common;
use frdl\common\Lazy;
final class Autoloader extends SourceLoader implements \frdl\common\Stream
{
}
--2222EVGuDPPT--
--3333EVGuDPPT--
--hoHoBundary12344dh--
<?php
$vm = \webfan\MimeStubAPC::vm();
// echo print_r($vm, true);
$newFile = __DIR__. DIRECTORY_SEPARATOR . 'TestMimeStubAPC.php';
$a = <<<PHPE
echo '<br />TEST-modified.';
PHPE;
$vm->get_file($vm->document, '$HOME/index.php', 'stub index.php')
->append($a)
;
$vm->location = $newFile;
require $newFile;
$run($newFile);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment