php_setup.inc 10.57 KiB
<?php
/*
  This code is part of FusionDirectory (http://www.fusiondirectory.org/)
  Copyright (C) 2003-2010  Cajus Pollmeier
  Copyright (C) 2011-2016  FusionDirectory
  This program is free software; you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
  the Free Software Foundation; either version 2 of the License, or
  (at your option) any later version.
  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.
  You should have received a copy of the GNU General Public License
  along with this program; if not, write to the Free Software
  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
/*!
 * \file php_setup.inc
 * Source code for php_setup
require_once("variables.inc");
function html_trace ($errstr = "")
  static $hideArgs = [
    'ldap_init'           => [3],
    'userinfo/loginUser'  => [1],
    'change_password'     => [1],
    'cred_decrypt'        => [0,1],
    'LDAP/__construct'    => [1],
  if (!function_exists('debug_backtrace')) {
    return ['', ''];
  $trace = array_slice(debug_backtrace(), 1);
  $loc = '';
  if (isset($trace[0]['file'])) {
    $loc = ' - '._('File').': '.$trace[0]['file'];
    if (isset($trace[0]['line'])) {
      $loc .= ' ('._('Line').' '.$trace[0]['line'].')';
  $return_html    = '<table width="100%" style="background-color:#402005;color:white;border:2px solid red;border-spacing:0;border-collapse:collapse;">'.
                    '<tr><td colspan="3">'.
                    '<h1 style="color:white">'._('PHP error').' "'.$errstr.'"'.$loc.'</h1>'.
                    '</td></tr>';
  $return_mailto  = rawurlencode('=== Trace ===');
  /* Generate trace history */
  for ($index = 1, $c = count($trace); $index < $c; $index++) {
    $ct   = $trace[$index];
    $loc  = '';
    $func = '';
    if (isset($ct['class'])) {
      $loc .= _("class")." ".$ct['class'];
      $func .= $ct['class'];
      if (isset($ct['function'])) {
        $loc  .= ' / ';
        $func .= '/';
    if (isset($ct['function'])) {
      $loc .= _("function")." ".$ct['function'];
7172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
$func .= $ct['function']; } if (isset($ct['type'])) { switch ($ct['type']) { case "::": $type = _("static"); break; case "->": $type = _("method"); break; default: $type = 'unknown'; break; } } else { $type = "-"; } $args = ""; if (isset($ct['args'])) { if (isset($hideArgs[$func])) { $hideArgsIndexes = $hideArgs[$func]; } else { $hideArgsIndexes = []; } $f = function ($index, $arg) use (&$f, $hideArgsIndexes) { static $i = 0; if (($i == 0) && in_array($index, $hideArgsIndexes)) { return '***'; } if ($i > 4) { return '…'; } if (is_object($arg)) { return "CLASS:&nbsp;".get_class($arg); } elseif (is_array($arg)) { /* Avoid converting array to string errors */ $i++; $ret = "array(".implode(',', array_map($f, array_keys($arg), $arg)).")"; $i--; return $ret; } else { if (strlen("$arg") > 512) { $arg = substr("$arg", 0, 512)."…"; } return '"'.htmlentities("$arg", ENT_COMPAT, 'UTF-8').'"'; } }; $args = implode(',', array_map($f, array_keys($ct['args']), $ct['args'])); } if (empty($args)) { $args = "-"; } if (isset($ct['file'])) { $file = $ct['file']; } else { $file = ""; } if (isset($ct['line'])) { $line = $ct['line']; } else { $line = ""; } $color = ($index & 1) ? '#404040' : '606060'; $return_html .= "<tr style='background-color:$color'><td style='padding-left:20px' width=\"30%\">"._("Trace")."[$index]: $loc</td>"; $return_html .= "<td>"._("File").": $file ("._('Line')." $line)</td><td width=\"10%\">"._("Type").": $type</td></tr>"; $return_html .= "<tr style='background-color:$color'><td colspan=3 style='padding-left:20px;'>"._("Arguments").": $args</td></tr>"; /* Add trace part to mailto body */
141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
$return_mailto .= rawurlencode( "\nTrace[".$index."]:".$loc. "\nFile : ".$file. "\nLine : ".$line. "\nType : ".$type. "\n ".$args. "\n"); } $return_html .= "</table>"; $return_mailto .= rawurlencode("=== /Trace ==="); return [$return_html, $return_mailto]; } /*! * \brief Raise an error * * \param string $errno * * \param string $errstr The error string * * \param string $errfile The error filename * * \param string $errline The error line */ function gosaRaiseError ($errno, $errstr, $errfile, $errline) { global $error_collector,$config, $error_collector_mailto; // To avoid recursion - restore original error handler. restore_error_handler(); /* Return if error reporting is set to zero */ if (error_reporting() == 0) { set_error_handler('gosaRaiseError', E_WARNING | E_NOTICE | E_USER_ERROR | E_USER_WARNING | E_USER_NOTICE | E_STRICT); return FALSE; } /* Workaround for buggy imap_open error outputs */ if (preg_match('/imap_open/', $errstr)) { set_error_handler('gosaRaiseError', E_WARNING | E_NOTICE | E_USER_ERROR | E_USER_WARNING | E_USER_NOTICE | E_STRICT); return; } /* Hide ldap size limit messages */ if (preg_match('/ldap_error/', $errstr) && preg_match('/sizelimit/', $errstr)) { set_error_handler('gosaRaiseError', E_WARNING | E_NOTICE | E_USER_ERROR | E_USER_WARNING | E_USER_NOTICE | E_STRICT); return; } /* Send all errors to logging class, except "Ldap : No such object" messages*/ if (class_exists('logging') && !preg_match('/No such object/', $errstr)) { logging::log('error', 'php', $errfile, [], 'Type:'.$errno.', Message:'.$errstr.', File:'.$errfile.', Line: '.$errline); } /* Error messages are hidden in FusionDirectory, so we only send them to the logging class and abort here */ if (isset($config->data) && $config->get_cfg_value('displayerrors') != 'TRUE') { set_error_handler('gosaRaiseError', E_WARNING | E_NOTICE | E_USER_ERROR | E_USER_WARNING | E_USER_NOTICE | E_STRICT); return; } /* Create header as needed */ if ($error_collector == "") { /* Mailto body header */ $version = FD_VERSION; $error_collector_mailto .= rawurlencode( "Oups. Seems like you've catched some kind of bug inside FusionDirectory/PHP. You may want to help ".