From 1888b1bf6c31106cfe87a82bc692bfd8efcf0224 Mon Sep 17 00:00:00 2001 From: pdontthink Date: Tue, 27 Nov 2007 09:12:05 +0000 Subject: [PATCH] Adding debug mode to core. Please run the configuration utility once after retrieving this update. Note that this update includes a change that makes it possible to use SquirrelMail constants in the configuration file(s). git-svn-id: https://svn.code.sf.net/p/squirrelmail/code/trunk/squirrelmail@12787 7612ce4b-ef26-0410-bec9-ea0150e637f0 --- ChangeLog | 1 + config/conf.pl | 182 +++++++++++++++++++++++++++++++++++++++++- functions/global.php | 14 ++++ include/constants.php | 15 ++++ include/init.php | 21 ++++- 5 files changed, 230 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index 6252ac15..139a7f3a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -233,6 +233,7 @@ Version 1.5.2 - SVN a body location part (e.g. Sun Java System Messaging Server). Thanks John Callahan (#1808382). - Invalid initialization of To: header (#1772893). + - Added SquirrelMail debug mode. Version 1.5.1 (branched on 2006-02-12) -------------------------------------- diff --git a/config/conf.pl b/config/conf.pl index ef284d35..191480e3 100755 --- a/config/conf.pl +++ b/config/conf.pl @@ -424,6 +424,12 @@ $use_icons = 'false' if ( !$use_icons ); $use_iframe = 'false' if ( !$use_iframe ); $lossy_encoding = 'false' if ( !$lossy_encoding ); $allow_remote_configtest = 'false' if ( !$allow_remote_configtest ); + +$sm_debug_mode = 'SM_DEBUG_MODE_MODERATE' if ( !$sm_debug_mode ); +#FIXME: When this is STABLE software, remove the line above and uncomment the one below: +#$sm_debug_mode = 'SM_DEBUG_MODE_OFF' if ( !$sm_debug_mode ); +$sm_debug_mode = convert_debug_binary_integer_to_constants($sm_debug_mode); + $addrbook_global_table = 'global_abook' if ( !$addrbook_global_table ); $addrbook_global_writeable = 'false' if ( !$addrbook_global_writeable ); $addrbook_global_listing = 'false' if ( !$addrbook_global_listing ); @@ -809,6 +815,7 @@ while ( ( $command ne "q" ) && ( $command ne "Q" ) && ( $command ne ":q" ) ) { print "\n"; print $WHT. "Configuration tweaks\n" . $NRM; print "6. Allow remote configtest : $WHT$allow_remote_configtest$NRM\n"; + print "7. Debug mode : $WHT$sm_debug_mode$NRM\n"; print "\n"; print "R Return to Main Menu\n"; } @@ -981,6 +988,7 @@ while ( ( $command ne "q" ) && ( $command ne "Q" ) && ( $command ne ":q" ) ) { elsif ( $command == 4 ) { $use_php_recode = commandB4(); } elsif ( $command == 5 ) { $use_php_iconv = commandB5(); } elsif ( $command == 6 ) { $allow_remote_configtest = commandB6(); } + elsif ( $command == 7 ) { $sm_debug_mode = commandB8(); } } } } @@ -2609,7 +2617,7 @@ sub command318 { print "See SquirrelMail documentation about format of config/timezones.php file.\n"; print "\n"; - print "Used time zone configuration (0,1,2,3)? [$WHT$time_zone_type$NRM]: $WHT"; + print "Desired time zone configuration (0,1,2,3)? [$WHT$time_zone_type$NRM]: $WHT"; $new_time_zone_type = ; if ( $new_time_zone_type =~ /^[0123]\n/i ) { $time_zone_type = $new_time_zone_type; @@ -4336,6 +4344,86 @@ sub commandB7 { return $new_icon_theme_def; } +# SquirrelMail debug mode (since 1.5.2) +sub commandB8 { + print "When debugging or developing SquirrelMail, you may want to increase\n"; + print "the verbosity of certain kinds of errors, notices, and/or diagnostics.\n"; + print "You may enable one or more of the debugging modes here. Please make\n"; + print "sure that you have turned off debugging if you are using SquirrelMail\n"; + print "in a production environment.\n\n"; + + $input = ""; + while ( $input ne "d\n" ) { + $sm_debug_mode = convert_debug_constants_to_binary_integer($sm_debug_mode); + + # per include/constants.php, here are the debug mode values: + # + # 0 SM_DEBUG_MODE_OFF + # 1 SM_DEBUG_MODE_SIMPLE + # 512 SM_DEBUG_MODE_MODERATE + # 524288 SM_DEBUG_MODE_ADVANCED + # 536870912 SM_DEBUG_MODE_STRICT + # + print "\n# Enabled? Description\n"; + print "---------------------------------------------------------------------\n"; + print "0 " . ($sm_debug_mode == 0 ? "y" : " ") + . " No debugging (recommended in production environments)\n"; + print "1 " . ($sm_debug_mode & 1 ? "y" : " ") + . " Simple debugging (PHP E_ERROR)\n"; + print "2 " . ($sm_debug_mode & 512 ? "y" : " ") + . " Moderate debugging (PHP E_ALL)\n"; + print "3 " . ($sm_debug_mode & 524288 ? "y" : " ") + . " Advanced debugging (PHP E_ALL plus log errors\n"; + print " intentionally suppressed)\n"; + print "4 " . ($sm_debug_mode & 536870912 ? "y" : " ") + . " Strict debugging (PHP E_STRICT)\n"; + print "\n"; + + print "SquirrelMail debug mode (0,1,2,3,4) or d when done? : $WHT"; + $input = ; + if ( $input eq "d\n" ) { + # nothing + } elsif ($input !~ /^[0-9]+\n$/) { + print "\nInvalid configuration value.\n"; + print "\nPress enter to continue..."; + $tmp = ; + } elsif ( $input == "0\n" ) { + $sm_debug_mode = 0; + } elsif ( $input == "1\n" ) { + if ($sm_debug_mode & 1) { + $sm_debug_mode ^= 1; + } else { + $sm_debug_mode |= 1; + } + } elsif ( $input == "2\n" ) { + if ($sm_debug_mode & 512) { + $sm_debug_mode ^= 512; + } else { + $sm_debug_mode |= 512; + } + } elsif ( $input == "3\n" ) { + if ($sm_debug_mode & 524288) { + $sm_debug_mode ^= 524288; + } else { + $sm_debug_mode |= 524288; + } + } elsif ( $input == "4\n" ) { + if ($sm_debug_mode & 536870912) { + $sm_debug_mode ^= 536870912; + } else { + $sm_debug_mode |= 536870912; + } + } else { + print "\nInvalid configuration value.\n"; + print "\nPress enter to continue..."; + $tmp = ; + } + print "\n"; + } + $sm_debug_mode = convert_debug_binary_integer_to_constants($sm_debug_mode); + return $sm_debug_mode; +} + sub save_data { $tab = " "; if ( open( CF, ">config.php" ) ) { @@ -4731,6 +4819,10 @@ sub save_data { print CF "\n"; # boolean print CF "\$allow_remote_configtest = $allow_remote_configtest;\n"; + # (binary) integer or constant - convert integer + # values to constants before output + $sm_debug_mode = convert_debug_binary_integer_to_constants($sm_debug_mode); + print CF "\$sm_debug_mode = $sm_debug_mode;\n"; print CF "\n"; close CF; @@ -5471,3 +5563,91 @@ PLUGIN: for ( $ct = 0 ; $ct <= $#plugins ; $ct++ ) { } } + +# converts (binary) integer values that correspond +# to the SquirrelMail debug mode constants (see +# include/constants.php) into those constant strings +# (bitwise or'd if more than one is enabled) +# +# if the value passed in is not an integer, it is +# returned unmolested +# +sub convert_debug_binary_integer_to_constants() { + + my ($debug_mode) = @_; + if ($debug_mode =~ /^[^0-9]/) { + return $debug_mode; + } + $debug_mode = int($debug_mode); + $new_debug_mode = ''; + + # per include/constants.php, here are their values: + # + # 0 SM_DEBUG_MODE_OFF + # 1 SM_DEBUG_MODE_SIMPLE + # 512 SM_DEBUG_MODE_MODERATE + # 524288 SM_DEBUG_MODE_ADVANCED + # 536870912 SM_DEBUG_MODE_STRICT + # + if ($debug_mode & 1) { + $new_debug_mode .= ' | SM_DEBUG_MODE_SIMPLE'; + } + if ($debug_mode & 512) { + $new_debug_mode .= ' | SM_DEBUG_MODE_MODERATE'; + } + if ($debug_mode & 524288) { + $new_debug_mode .= ' | SM_DEBUG_MODE_ADVANCED'; + } + if ($debug_mode & 536870912) { + $new_debug_mode .= ' | SM_DEBUG_MODE_STRICT'; + } + + $new_debug_mode =~ s/^ \| //; + if (!$new_debug_mode) { + $new_debug_mode = 'SM_DEBUG_MODE_OFF'; + } + + return $new_debug_mode; +} + +# converts SquirrelMail debug mode constants (see +# include/constants.php) into their corresponding +# (binary) integer values +# +# if the value passed in is an integer already, it +# is returned unmolested +# +sub convert_debug_constants_to_binary_integer() { + + my ($debug_mode) = @_; + if ($debug_mode =~ /^[0-9]/) { + return $debug_mode; + } + $new_debug_mode = 0; + + # per include/constants.php, here are their values: + # + # 0 SM_DEBUG_MODE_OFF + # 1 SM_DEBUG_MODE_SIMPLE + # 512 SM_DEBUG_MODE_MODERATE + # 524288 SM_DEBUG_MODE_ADVANCED + # 536870912 SM_DEBUG_MODE_STRICT + # + if ($debug_mode =~ /\bSM_DEBUG_MODE_OFF\b/) { + $new_debug_mode = 0; + } + if ($debug_mode =~ /\bSM_DEBUG_MODE_SIMPLE\b/) { + $new_debug_mode |= 1; + } + if ($debug_mode =~ /\bSM_DEBUG_MODE_MODERATE\b/) { + $new_debug_mode |= 512; + } + if ($debug_mode =~ /\bSM_DEBUG_MODE_ADVANCED\b/) { + $new_debug_mode |= 524288; + } + if ($debug_mode =~ /\bSM_DEBUG_MODE_STRICT\b/) { + $new_debug_mode |= 536870912; + } + + return $new_debug_mode; +} diff --git a/functions/global.php b/functions/global.php index 1f560e89..c09716d6 100644 --- a/functions/global.php +++ b/functions/global.php @@ -85,6 +85,8 @@ function sqstripslashes(&$array) { /** * Squelch error output to screen (only) for the given function. + * If the SquirrelMail debug mode SM_DEBUG_MODE_ADVANCED is not + * enabled, error output will not go to the log, either. * * This provides an alternative to the @ error-suppression * operator where errors will not be shown in the interface @@ -110,9 +112,21 @@ function sqstripslashes(&$array) { * */ function sq_call_function_suppress_errors($function, $args=NULL) { + global $sm_debug_mode; + $display_errors = ini_get('display_errors'); ini_set('display_errors', '0'); + + // if advanced debug mode isn't enabled, don't log the error, either + // + if (!($sm_debug_mode & SM_DEBUG_MODE_ADVANCED)) + $error_reporting = error_reporting(0); + $ret = call_user_func_array($function, $args); + + if (!($sm_debug_mode & SM_DEBUG_MODE_ADVANCED)) + error_reporting($error_reporting); + ini_set('display_errors', $display_errors); return $ret; } diff --git a/include/constants.php b/include/constants.php index 5faea986..79fcabaa 100644 --- a/include/constants.php +++ b/include/constants.php @@ -25,6 +25,21 @@ define('SM_VERSION', '1.5.2 [SVN]'); /* Set values for constants used by SquirrelMail preferences. */ /**************************************************************/ +/** + * Define constants for SquirrelMail debug modes. + * Note that these are binary so that modes can be + * mixed and matched, and they are also ordered from + * minor to severe. When adding new modes, please + * order them in a sensical way (MODERATE is the 10th + * bit; ADVANCED is the 20th bit). + * @since 1.5.2 + */ +define('SM_DEBUG_MODE_OFF', 0); // complete error suppression +define('SM_DEBUG_MODE_SIMPLE', 1); // PHP E_ERROR +define('SM_DEBUG_MODE_MODERATE', 512); // PHP E_ALL +define('SM_DEBUG_MODE_ADVANCED', 524288); // PHP E_ALL plus log errors intentionally suppressed +define('SM_DEBUG_MODE_STRICT', 536870912); // PHP E_STRICT + /** * Define basic, general purpose preference constants. * @since 1.2.0 diff --git a/include/init.php b/include/init.php index e7f0f1d9..669933d8 100644 --- a/include/init.php +++ b/include/init.php @@ -14,8 +14,10 @@ /** * This is a development version so in order to track programmer mistakes we * set the error reporting to E_ALL +FIXME: disabling this for now, because we now have $sm_debug_mode, but the problem with that is that we don't know what it will be until we have loaded the config file, a good 175 lines below after several important files have been included, etc. For now, we'll trust that developers have turned on E_ALL in php.ini anyway, but this can be uncommented if not. */ -error_reporting(E_ALL); +//error_reporting(E_ALL); + /** @@ -148,6 +150,7 @@ $color[14] = '#ff0000'; /* (red) Color for quoted text -- >> 2 or more $color[15] = '#002266'; /* (dark blue) Unselectable folders */ $color[16] = '#ff9933'; /* (orange) Highlight color */ +require(SM_PATH . 'include/constants.php'); require(SM_PATH . 'functions/global.php'); require(SM_PATH . 'functions/strings.php'); require(SM_PATH . 'functions/arrays.php'); @@ -169,8 +172,22 @@ if (file_exists(SM_PATH . 'config/config_local.php')) { require(SM_PATH . 'config/config_local.php'); } + +/** + * Set PHP error reporting level based on the SquirrelMail debug mode + */ +$error_level = 0; +if ($sm_debug_mode & SM_DEBUG_MODE_SIMPLE) + $error_level |= E_ERROR; +if ($sm_debug_mode & SM_DEBUG_MODE_MODERATE + || $sm_debug_mode & SM_DEBUG_MODE_ADVANCED) + $error_level |= E_ALL; +if ($sm_debug_mode & SM_DEBUG_MODE_STRICT) + $error_level |= E_STRICT; +error_reporting($error_level); + + require(SM_PATH . 'functions/plugin.php'); -require(SM_PATH . 'include/constants.php'); require(SM_PATH . 'include/languages.php'); require(SM_PATH . 'class/template/Template.class.php'); require(SM_PATH . 'class/error.class.php'); -- 2.25.1