1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
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
121
122
123
124
125
126
127
128
129
|
<?php
/*
+-----------------------------------------------------------------------+
| program/include/bugs.inc |
| |
| This file is part of the RoudCube Webmail client |
| Copyright (C) 2005-2007, RoudCube Dev - Switzerland |
| Licensed under the GNU GPL |
| |
| PURPOSE: |
| Provide error handling and logging functions |
| |
+-----------------------------------------------------------------------+
| Author: Thomas Bruederli <roundcube@gmail.com> |
+-----------------------------------------------------------------------+
$Id$
*/
/**
* Error handling and logging functions
*
* @package Core
*/
/**
* Throw system error and show error page
*
* @param array Named parameters
* - code: Error code (required)
* - type: Error type [php|db|imap|javascript] (required)
* - message: Error message
* - file: File where error occured
* - line: Line where error occured
* @param boolean True to log the error
* @param boolean Terminate script execution
*/
function raise_error($arg=array(), $log=false, $terminate=false)
{
global $__page_content, $CONFIG, $OUTPUT, $ERROR_CODE, $ERROR_MESSAGE;
// report bug (if not incompatible browser)
if ($log && $arg['type'] && $arg['message'])
log_bug($arg);
// display error page and terminate script
if ($terminate)
{
$ERROR_CODE = $arg['code'];
$ERROR_MESSAGE = $arg['message'];
include("program/steps/error.inc");
exit;
}
}
/**
* Report error according to configured debug_level
*
* @param array Named parameters
* @see raise_error()
*/
function log_bug($arg_arr)
{
global $CONFIG;
$program = strtoupper($arg_arr['type']);
if (empty($CONFIG['log_date_format']))
$CONFIG['log_date_format'] = 'd-M-Y H:i:s O';
// write error to local log file
if ($CONFIG['debug_level'] & 1)
{
$post_query = ($_SERVER['REQUEST_METHOD'] == 'POST' ? '?_task='.urlencode($_POST['_task']).'&_action='.urlencode($_POST['_action']) : '');
$log_entry = sprintf("[%s] %s Error: %s%s (%s %s)\n",
date($CONFIG['log_date_format']),
$program,
$arg_arr['message'],
$arg_arr['file'] ? sprintf(' in %s on line %d', $arg_arr['file'], $arg_arr['line']) : '',
$_SERVER['REQUEST_METHOD'],
$_SERVER['REQUEST_URI'] . $post_query);
if (empty($CONFIG['log_dir']))
$CONFIG['log_dir'] = INSTALL_PATH.'logs';
// try to open specific log file for writing
if ($CONFIG['log_driver'] == 'syslog')
{
syslog(LOG_ERR, $log_entry);
}
else if ($fp = @fopen($CONFIG['log_dir'].'/errors', 'a'))
{
// log_driver == 'file' is the default, assumed here.
fwrite($fp, $log_entry);
fclose($fp);
}
else
{
// send error to PHPs error handler
trigger_error($arg_arr['message']);
}
}
// resport the bug to the global bug reporting system
if ($CONFIG['debug_level'] & 2)
{
// TODO: Send error via HTTP
}
// show error if debug_mode is on
if ($CONFIG['debug_level'] & 4)
{
print "<b>$program Error";
if (!empty($arg_arr['file']) && !empty($arg_arr['line']))
print " in $arg_arr[file] ($arg_arr[line])";
print ":</b> ";
print nl2br($arg_arr['message']);
print '<br />';
flush();
}
}
?>
|