From d59a4921188753dbe4c0161081755a28112c3ef6 Mon Sep 17 00:00:00 2001 From: Nathan Gass Date: Thu, 22 Mar 2012 18:18:42 +0000 Subject: Branch itools/devel-utf8 created --- devel-utf8/it_auto_prepend.php | 245 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 245 insertions(+) create mode 100644 devel-utf8/it_auto_prepend.php (limited to 'devel-utf8/it_auto_prepend.php') diff --git a/devel-utf8/it_auto_prepend.php b/devel-utf8/it_auto_prepend.php new file mode 100644 index 0000000..36946ee --- /dev/null +++ b/devel-utf8/it_auto_prepend.php @@ -0,0 +1,245 @@ +. +*/ + +$GLOBALS['ULTRATIME'] = gettimeofday(); +unset($GLOBALS['IT_SYNTAXCONVERTER_DIR']); # Security measure for register_globals on + +#$debug_itclassloader = true; +if ($it_convertedmainfile = it_initialize()) +{ + require($it_convertedmainfile); + exit; +} + +function it_initialize() +{ + $result = false; + static $it_initrecursion; + + if (!$it_initrecursion++) + { + register_shutdown_function('it_shutdown'); + $error_reporting = error_reporting(); + error_reporting($error_reporting & ~E_NOTICE); # ITools is not (unpatched) E_NOTICE safe + $it_path = dirname(__FILE__); + + if ($webmode = $_SERVER['REMOTE_ADDR']) # Web? + { + $GLOBALS['ULTRAHOME'] = dirname($_SERVER['DOCUMENT_ROOT']); + umask(0002); # Work around bugs.php.net/bug.php?id=28401 + $_SERVER['HTTP_HOST'] = strtolower($_SERVER['HTTP_HOST']); + } + else # Shell + $GLOBALS['ULTRAHOME'] = dirname(dirname(preg_match('|^/|', $argv[0]) ? $argv[0] : getcwd() . '/' . $argv[0])); + + $include_path = ini_get('include_path'); + + @set_error_handler("it_errorhandler", E_USER_ERROR | E_RECOVERABLE_ERROR | E_WARNING | E_USER_WARNING | E_NOTICE | E_USER_NOTICE); + error_reporting($error_reporting); # Restore user setting once we installed error handler + + if (function_exists('spl_autoload_register') && spl_autoload_register('it_classloader')) + { + ini_set('include_path', $it_path . PATH_SEPARATOR . $include_path); + require_once("$it_path/auto_prepend.php"); + + if (file_exists("$it_path/auto_prepend_local.php")) + require_once("$it_path/auto_prepend_local.php"); + } + else + { + ini_set('include_path', "$it_path/.." . PATH_SEPARATOR . $include_path); + require("itools.lib"); # PHP 4 fallback + } + + # IT_HOME is recommended variable name for applications + $GLOBALS['IT_HOME'] = $GLOBALS['ULTRAHOME'] = it_untaint($GLOBALS['ULTRAHOME'], TC_ALL); + + $needsconvert = $GLOBALS['IT_SYNTAXCONVERTER_DIR'] !== false && !@eval("return is_array(42=>69,);"); # Check if PHP is patched to support our syntax, see http://cschneid.com/php/ + + if ($needsconvert && !$GLOBALS['IT_SYNTAXCONVERTER_DIR']) + { + $GLOBALS['IT_SYNTAXCONVERTER_DIR'] = $GLOBALS['ULTRAHOME'] . "/tmp"; + + if (!is_writeable($GLOBALS['IT_SYNTAXCONVERTER_DIR']) || !function_exists("posix_geteuid") || posix_geteuid() != fileowner($GLOBALS['IT_SYNTAXCONVERTER_DIR'])) + die(($webmode ? "
" : "") . "Seems to be running in shared environment, manually set\n\$GLOBALS['IT_SYNTAXCONVERTER_DIR'] in $it_path/auto_prepend_local.php\nto either:\n  a) FALSE (syntax conversion disabled) or\n  b) the path to a writeable directory (NOTE: THIS IS UNSAFE!) or\n  c) install the PHP patch from http://cschneid.com/php/\n" . ($webmode ? "
" : "")); + } + + ini_set('include_path', ($GLOBALS['IT_SYNTAXCONVERTER_DIR'] ? $GLOBALS['IT_SYNTAXCONVERTER_DIR'] . "/it_syntaxconverter" . PATH_SEPARATOR : '') . $it_path . PATH_SEPARATOR . $include_path); + $user_includes = explode(PATH_SEPARATOR, $include_path); + + # XXX Note: Comment this out if you want system wide include path converted and auto_prepend.php considered + $user_includes = array_diff($user_includes, array_diff(explode(PATH_SEPARATOR, get_cfg_var('include_path')), array("."))); + + foreach (array_reverse($user_includes) as $include) + { + if ($include == ".") + $include = dirname($_SERVER['SCRIPT_FILENAME']); + + if ($needsconvert) + it_convert($include); + + if (@file_exists($autoprepend = "$include/auto_prepend.php")) + { + if ($needsconvert && ($include != $it_path)) + $autoprepend = it_convert($autoprepend); + + require_once($autoprepend); + + if (file_exists("$include/auto_prepend_local.php")) + require_once("$include/auto_prepend_local.php"); + } + } + + if (!isset($GLOBALS['it_html'])) + new it_html; + + if ($needsconvert) + { + # Convert syntax (we will return name of converted script to global context to start it there) + $result = it_convert(it_untaint($_SERVER['SCRIPT_FILENAME'], TC_SELF)); + } + } + + return $result; +} + +function it_convert($source) +{ + $sourcerelpath = it::replace(array('^(/|\w:)' => ""), $source); # Remove leading / or C: + + if (@is_dir($source)) + { + if (!@is_link($source) && !file_exists("$source/.no_it_syntaxconvert")) + { + ini_set('include_path', $GLOBALS['IT_SYNTAXCONVERTER_DIR'] . "/it_syntaxconverter/$sourcerelpath" . PATH_SEPARATOR . ini_get('include_path')); + foreach (glob("$source/*") as $file) + it_convert($file); + } + } + else if (@is_readable($source)) + { + $converted = $GLOBALS['IT_SYNTAXCONVERTER_DIR'] . "/it_syntaxconverter/$sourcerelpath"; + $stat = @lstat($converted); + $mtimeconverted = $stat[9]; + + if ($mtimeconverted < filemtime($source)) + { + if ($changed = filesize($source) < 200000) # Do not attempt to convert anything above 200k to avoid large memory consumption + { + $converter = new it_syntaxconverter(file_get_contents($source)); + $parts = explode("/", dirname($converted)); + + for ($i = 1; $i <= count($parts); $i++) + @mkdir(join("/", array_slice($parts, 0, $i)), 0700); + + if ($changed = $converter->changes) + { + @unlink($converted); + if ($output = fopen($converted, "w")) + { + fputs($output, $converter->output); + fclose($output); + } + } + } + + if (!$changed) # Link to original file if no changes made + { + @unlink($converted); + $symlink = function_exists("symlink") ? "symlink" : "copy"; # symlink() does not exist on Windows + $symlink(realpath($source), $converted); + } + + clearstatcache(); + } + } + + return $converted; +} + +function it_classloader($classname) +{ + if (!preg_match('/:/', $classname) && ($file = @fopen("$classname.class", "r", true))) # Check if file is local (does not contain ':', i.e. no protocol like http:) for file in include path, do not use @include to get failures on inheritance + { + include("$classname.class"); + fclose($file); + } + else + it_dbi::createclass($classname); + + EDC('ultraclassloader', $classname, it_debug::backtrace()); +} + +function it_errorhandler($errno, $errstr, $errfile, $errline, $errcontext) +{ + $error_reporting = error_reporting(0); # Disable error reporting while handling error + + if ($result = $error_reporting & $errno) # Is this error enabled? + { + static $it_errnames = array(); + + if (!$it_errnames) + { + foreach (get_defined_constants() as $name => $no) + { + if (preg_match('/^E_/', $name)) + $it_errnames[$no] = "$name: "; + } + } + + $error = array( + 'title' => $it_errnames[$errno] . $errstr, + 'locals' => $errcontext, + 'file' => $errfile, + 'line' => $errline, + 'backtraceskip' => 1, + ); + + switch ($errno) + { + case E_USER_ERROR: case E_RECOVERABLE_ERROR: + it::fatal($error); + break; + + case E_NOTICE: + if ((dirname($errfile) == dirname(__FILE__)) && preg_match('/undefined|non-object/i', $errstr)) + { + $result = true; # Silence E_NOTICE about undefined stuff in ITools files + break; + } + # FALLTHROUGH + + default: + it::error($error); + break; + } + } + + error_reporting($error_reporting); + + return $result; # True means do not execute standard PHP error handler +} + +function it_shutdown() +{ + if (isset($GLOBALS['debug_timerlog']) && !empty($GLOBALS['ULTRATIMERLOG'])) + it::log('timerlog', $_SERVER['REQUEST_URI'] . "\t" . substr($GLOBALS['ULTRATIMERLOG'], 1)); +} -- cgit v1.2.3