php_setup.inc 9.86 KB
Newer Older
1
2
3
4
5
<?php

/*
  This code is part of FusionDirectory (http://www.fusiondirectory.org/)
  Copyright (C) 2003-2010  Cajus Pollmeier
6
  Copyright (C) 2011-2015  FusionDirectory
7
8
9
10
11
12
13
14
15
16
17
18
19

  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
20
  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
21
22
*/

23
24
25
/*!
 * \file php_setup.inc
 * Source code for php_setup
26
 */
27
require_once ("variables.inc");
28

29
30
31
32
33
function html_trace($errstr = "")
{
  if (!function_exists('debug_backtrace')) {
    return array ("", "");
  }
34
  $trace = array_slice(debug_backtrace(), 1);
35

36
  $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\"</h1></td></tr>";
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
  $return_mailto  = rawurlencode("=== Trace ===");
  /* Generate trace history */
  for ($index = 0, $c = count($trace); $index < $c; $index++) {
    $ct   = $trace[$index];
    $loc  = "";
    if (isset($ct['class'])) {
      $loc .= _("class")." ".$ct['class'];
      if (isset($ct['function'])) {
        $loc .= " / ";
      }
    }
    if (isset($ct['function'])) {
      $loc .= _("function")." ".$ct['function'];
    }
    if (isset($ct['type'])) {
      switch ($ct['type']) {
        case "::":
          $type = _("static");
          break;

        case "->":
          $type = _("method");
          break;
      }
    } else {
      $type = "-";
    }
    $args = "";
    if (isset($ct['args'])) {
      $f = function ($arg) use(&$f) {
        static $i = 0;
        if ($i > 4) {
          return "…";
        }
        if (is_object($arg)) {
          return "CLASS:&nbsp;".get_class($arg);
        } elseif (is_array($arg)) { /* Avoid convertig array to string errors */
          $i++;
          $ret = "array(".implode(',', array_map($f, $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, $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 */
    $return_mailto .= rawurlencode(
                                 "\nTrace[".$index."]:".$loc.
                                 "\nFile : ".$file.
                                 "\nLine : ".$line.
                                 "\nType : ".$type.
                                 "\n  ".$args.
                                 "\n");
  }

  $return_html    .= "</table>";
  $return_mailto  .= rawurlencode("=== /Trace ===");

  return array($return_html, $return_mailto);
}

121
122
123
124
125
126
127
128
129
130
/*!
 * \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
131
 */
132
133
134
135
136
137
138
139
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 */
140
141
  if (error_reporting() == 0) {
    set_error_handler('gosaRaiseError', E_WARNING | E_NOTICE | E_USER_ERROR | E_USER_WARNING | E_USER_NOTICE | E_STRICT);
142
143
144
145
    return;
  }

  /* Workaround for buggy imap_open error outputs */
146
147
  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);
148
149
150
151
    return;
  }

  /* Hide ldap size limit messages */
152
153
154
  if (preg_match('/ldap_error/', $errstr)) {
    if (preg_match('/sizelimit/', $errstr)) {
      set_error_handler('gosaRaiseError', E_WARNING | E_NOTICE | E_USER_ERROR | E_USER_WARNING | E_USER_NOTICE | E_STRICT);
155
156
157
158
      return;
    }
  }

159
  /* Error messages are hidden in FusionDirectory, so we only send them to the logging class and abort here */
160
  if (isset($config->data) && $config->get_cfg_value("displayerrors") != "TRUE") {
161
162

    /* Write to syslog */
163
164
    if (class_exists("log") && !preg_match("/No such object/", $errstr)) {
      new log("view", "error", "", array(), "PHP error: $errstr ($errfile, line $errline)");
165
166
    }

167
    set_error_handler('gosaRaiseError', E_WARNING | E_NOTICE | E_USER_ERROR | E_USER_WARNING | E_USER_NOTICE | E_STRICT);
168
169
    return;
  }
170

171
  /* Send all errors to logging class, except "Ldap : No such object" messages*/
172
  if (class_exists("log") && !preg_match("/No such object/", $errstr)) {
173
    new log("debug", "all", $errfile, array(), "Type:".$errno.", Message:".$errstr.", File:".$errfile.", Line: ".$errline);
174
175
176
  }

  /* Create header as needed */
177
  if ($error_collector == "") {
178
179

    /* Mailto body header */
Benoit Mortier's avatar
Benoit Mortier committed
180
181
    $version = FD_VERSION;

182
    $error_collector_mailto .= rawurlencode(
Benoit Mortier's avatar
Benoit Mortier committed
183
184
185
186
187
188
189
190
191
192
                              "Oups. Seems like you've catched some kind of bug inside FusionDirectory/PHP. You may want to help ".
                              "us to improve the software stability. If so, please provide some more information below.".
                              "\n\n".
                              "*** FusionDirectory bug report ***".
                              "\nFusionDirectory Version: $version".
                              "\n\n".
                              "Please describe what you did to produce this error as detailed as possible. Can you ".
                              "reproduce this bug using the demo on http://demo.FusionDirectory.org ?".
                              "\n\n".
                              "*** PHP error information ***\n\n");
193

194
195
196
197
198
    $error_collector = '
      <div class="error">
        <table width="100%">
          <tr>
            <td>
199
              <img src="geticon.php?context=status&amp;icon=dialog-warning&amp;size=16" alt="" class="center"/>&nbsp;
200
201
202
203
204
205
              <strong style="font-size:14px">'.
                _("Generating this page caused the PHP interpreter to raise some errors!").'
              </strong>
            </td>
            <td align=right>
              <a href="mailto:bugs@fusiondirectory.org?subject=FusionDirectory%20bugreport&amp;body=%BUGBODY%">
206
                <img src="geticon.php?context=applications&amp;icon=internet-mail&amp;size=16" title="'._("Send bug report to the FusionDirectory Team").
207
208
209
210
211
212
213
214
215
216
217
218
219
                '" class="center" alt="'.("Mail icon").'">&nbsp;'._("Send bugreport").'
              </a>
            </td>
            <td align="right">
              <button onClick="$(\'errorbox\').toggle();">'.
                _("Toggle information").'
              </button>
            </td>
          </tr>
        </table>
      </div>
      <div id="errorbox" style="position:absolute; z-index:150; display: none;">';
  }
220

221
  /* Create error header */
Benoit Mortier's avatar
Benoit Mortier committed
222
223
224
  $error_collector_mailto .= rawurlencode("=== Error === \n");
  $error_collector_mailto .= rawurlencode("PHP error: $errstr ($errfile, line $errline)\n");
  $error_collector_mailto .= rawurlencode("=== /Error === \n\n");
225

226
  list($html_trace, $mailto_trace) = html_trace($errstr);
227
228
  $error_collector        .= $html_trace;
  $error_collector_mailto .= $mailto_trace;
229
230

  /* Flush in case of fatal errors */
231
232
  set_error_handler('gosaRaiseError', E_WARNING | E_NOTICE | E_USER_ERROR | E_USER_WARNING | E_USER_NOTICE | E_STRICT);
  if (preg_match('/^fatal/i', $errstr)) {
233
234
235
236
237
238
    echo $error_collector."</div>";
    flush();
    exit;
  }
}

239
240
/*!
 * \brief Dummy error handler
241
 */
242
243
244
245
246
function dummy_error_handler()
{
}

/* Bail out for incompatible/old PHP versions */
247
if (!version_compare(phpversion(), "5.2.0", ">=")) {
248
  echo "PHP version needs to be 5.2.0 or above to run FusionDirectory. Aborted.";
249
250
251
252
253
254
255
  exit();
}

/* Set timezone */
date_default_timezone_set("GMT");

/* Get base dir for reference */
256
257
$BASE_DIR = dirname(dirname(__FILE__));
$ROOT_DIR = $BASE_DIR."/html";
258
259
260
error_reporting (E_ALL | E_STRICT);

/* Register error handler */
261
262
$error_collector        = "";
$error_collector_mailto = "";
263

264
set_error_handler('gosaRaiseError', E_WARNING | E_NOTICE | E_USER_ERROR | E_USER_WARNING | E_USER_NOTICE | E_STRICT);
265

266
267
268
269
270
$variables_order = "ES";
ini_set("track_vars", 1);
ini_set("display_errors", 1);
ini_set("report_memleaks", 1);
ini_set("include_path", ".:$BASE_DIR/include:".PHP_DIR.":".PEAR_DIR);
271
272

/* Do smarty setup */
273
require(SMARTY);
274

275
$smarty = new Smarty;
276

277
$smarty->template_dir = $BASE_DIR.'/ihtml/';
278
$smarty->caching      = FALSE;
279
$smarty->assign('css_files', array());
280
$smarty->assign('js_files', array());
281

282
$smarty->php_handling = Smarty::PHP_REMOVE;
283
284
285
286
287
288
289
290
291
292

/* Check for SSL connection */
$ssl = "";
if (!(isset($_SERVER['HTTPS']) && stristr($_SERVER['HTTPS'], "on"))) {
  if (empty($_SERVER['REQUEST_URI'])) {
    $ssl = "https://".$_SERVER['HTTP_HOST'].$_SERVER['PATH_INFO'];
  } else {
    $ssl = "https://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
  }
}
293
?>