PHP Classes

File: src/webfan/MimeStubAPC.php

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

Contents

Class file image Download
<?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--