_('Generic Error'), 'body'=>sprintf('%s: %s [%s]', __METHOD__,_('Called to load a class that cant be found'),$className), 'type'=>'error')); } /** * Strips all slashes from the specified array in place (pass by ref). * @param Array The array to strip slashes from, typically one of * $_GET, $_POST, or $_COOKIE. */ function array_stripslashes(&$array) { if (DEBUG_ENABLED) debug_log('Entered with (%s)',1,__FILE__,__LINE__,__METHOD__,$array); if (is_array($array)) while (list($key) = each($array)) if (is_array($array[$key]) && $key != $array) array_stripslashes($array[$key]); else $array[$key] = stripslashes($array[$key]); } /** * Compatibility Functions * These functions exist, so that a standard function can be used in new applications, and they * map to already defined functions in older applications. */ /** * If gettext is not available in PHP, then this will provide compatibility for it. */ if (! function_exists('_')) { function _($msg) { return $msg; } } /** * Generic Utility Functions */ /** * Custom error handling function. * When a PHP error occurs, PHP will call this function rather than printing * the typical PHP error string. This provides the application the ability to * format an error message so that it looks better. * Optionally, it can present a link so that a user can search/submit bugs. * This function is not to be called directly. It is exclusively for the use of * PHP internally. If this function is called by PHP from within a context * where error handling has been disabled (ie, from within a function called * with "@" prepended), then this function does nothing. * * @param int The PHP error number that occurred (ie, E_ERROR, E_WARNING, E_PARSE, etc). * @param string The PHP error string provided (ie, "Warning index "foo" is undefined) * @param string The file in which the PHP error ocurred. * @param int The line number on which the PHP error ocurred * @see set_error_handler */ function app_error_handler($errno,$errstr,$file,$lineno) { if (defined('DEBUG_ENABLED') && DEBUG_ENABLED) debug_log('Entered with (%s,%s,%s,%s)',1,__FILE__,__LINE__,__METHOD__, $errno,$errstr,$file,$lineno); /** * error_reporting will be 0 if the error context occurred * within a function call with '@' preprended (ie, @ldap_bind() ); * So, don't report errors if the caller has specifically * disabled them with '@' */ if (ini_get('error_reporting') == 0 || error_reporting() == 0) return; $file = basename($file); $caller = basename($_SERVER['PHP_SELF']); $errtype = ''; switch ($errno) { case E_STRICT: $errtype = 'E_STRICT'; break; case E_ERROR: $errtype = 'E_ERROR'; break; case E_WARNING: $errtype = 'E_WARNING'; break; case E_PARSE: $errtype = 'E_PARSE'; break; case E_NOTICE: $errtype = 'E_NOTICE'; break; case E_CORE_ERROR: $errtype = 'E_CORE_ERROR'; break; case E_CORE_WARNING: $errtype = 'E_CORE_WARNING'; break; case E_COMPILE_ERROR: $errtype = 'E_COMPILE_ERROR'; break; case E_COMPILE_WARNING: $errtype = 'E_COMPILE_WARNING'; break; case E_USER_ERROR: $errtype = 'E_USER_ERROR'; break; case E_USER_WARNING: $errtype = 'E_USER_WARNING'; break; case E_USER_NOTICE: $errtype = 'E_USER_NOTICE'; break; case E_ALL: $errtype = 'E_ALL'; break; default: $errtype = sprintf('%s: %s',_('Unrecognized error number'),$errno); } # Take out extra spaces in error strings. $errstr = preg_replace('/\s+/',' ',$errstr); if ($errno == E_NOTICE) { $body = ''; $body .= sprintf('',_('Error'),$errstr,$errtype); $body .= sprintf('', _('File'),$file,_('line'),$lineno,_('caller'),$caller); $body .= sprintf('', app_version(),phpversion(),php_sapi_name()); $body .= sprintf('',isset($_SERVER['SERVER_SOFTWARE']) ? $_SERVER['SERVER_SOFTWARE'] : 'SCRIPT'); if (function_exists('get_href')) $body .= sprintf('', get_href('search_bug',"&summary_keyword=".rawurlencode($errstr)), _('Please check and see if this bug has been reported')); $body .= '
%s:%s (%s)
%s:%s %s %s, %s %s
Versions:APP: %s, PHP: %s, SAPI: %s
Web server:%s
%s.
'; system_message(array( 'title'=>_('You found a non-fatal application bug!'), 'body'=>$body, 'type'=>'error')); return; } # If this is a more serious error, call the error call. error(sprintf('%s: %s',$errtype,$errstr),'error',null,true,true); } /** * Returns the application name. */ function app_name() { if (isset($_SESSION[APPCONFIG])) return $_SESSION[APPCONFIG]->getValue('app','name',false); else return 'Application name NOT set'; } /** * Returns the application version currently running. The version * is read from the file named VERSION. * * @return string The current version as read from the VERSION file. */ function app_version() { static $CACHE = null; if ($CACHE) return $CACHE; $version_file = realpath(LIBDIR.'../VERSION'); if (! file_exists($version_file)) $CACHE = 'UNKNOWN'; else { $f = fopen($version_file,'r'); $version = trim(fread($f, filesize($version_file))); fclose($f); # We use cvs_prefix, because CVS will translate this on checkout otherwise. $cvs_prefix = '\$Name:'; $CACHE = preg_replace('/^'.$cvs_prefix.' RELEASE-([0-9_]+)\s*\$$/','$1',$version); $CACHE = preg_replace('/_/','.',$CACHE); # Check if we are a CVS copy. if (preg_match('/^'.$cvs_prefix.'?\s*\$$/',$CACHE)) $CACHE = 'CVS'; # Check if we are special CVS branch elseif (preg_match('/^'.$cvs_prefix.'?\s*([a-zA-Z]+)?\s*\$$/',$CACHE,$match)) $CACHE = $match[1]; # If return is still the same as version, then the tag is not one we expect. elseif ($CACHE == $version) $CACHE = 'UNKNOWN'; } if (defined('DEBUG_ENABLED') && DEBUG_ENABLED) debug_log('Entered with (), Returning (%s)',1,__FILE__,__LINE__,__METHOD__,$CACHE); return $CACHE; } /** * This function will convert the browser two character language into the * default 5 character language, where the country portion should NOT be * assumed to be upper case characters of the first two characters. */ function auto_lang($lang) { switch ($lang) { case 'ja': return 'ja_JP'; case 'cs': return 'cs_CZ'; default: return sprintf('%s_%s',$lang,strtoupper($lang)); } } /** * Makes sure that the config file is properly setup. */ function check_config($config_file) { # Read in config_default.php require_once LIBDIR.'config_default.php'; # Make sure their PHP version is current enough if (strcmp(phpversion(),REQUIRED_PHP_VERSION) < 0) system_message(array( 'title'=>_('Incorrect version of PHP'), 'body'=>sprintf('This application requires PHP version %s or greater.
(You are using %s)', REQUIRED_PHP_VERSION,phpversion()), 'type'=>'error')); $config = new Config; if (file_exists(LIBDIR.'config_custom.php') && is_readable(LIBDIR.'config_custom.php')) include LIBDIR.'config_custom.php'; ob_start(); require $config_file; $str = ''; if (ob_get_level()) { $str = ob_get_contents(); ob_end_clean(); } if ($str) { $str = strip_tags($str); $matches = array(); preg_match('/(.*):\s+(.*):.*\s+on line (\d+)/',$str,$matches); if (isset($matches[1]) && isset($matches[2]) && isset($matches[3])) { $error_type = $matches[1]; $error = $matches[2]; $line_num = $matches[3]; $file = file($config_file); $body = '

Config file ERROR

'; $body .= sprintf('

%s (%s) on line %s

',$error_type,$error,$line_num); $body .= '
'; $body .= sprintf('Looks like your config file has an ERROR on line %s.
',$line_num); $body .= 'Here is a snippet around that line
'; $body .= '
'."\n"; $body .= '
'; for ($i = $line_num-9; $i<$line_num+5; $i++) { if ($i+1 == $line_num) $body .= '
'; if ($i < 0) continue; $body .= sprintf('%s: %s
',$i+1,$file[$i]); if ($i+1 == $line_num) $body .= '
'; } $body .= '
'; $body .= '
'; $body .= 'Hint: Sometimes these errors are caused by lines preceding the line reported.'; $body .= '
'; $block = new block(); $block->SetBody($body); $www['page'] = new page(); $www['page']->block_add('body',$block); $www['page']->display(); die(); } } # Process our friendly attributes. if (isset($friendly_attrs)) $config->getFriendlyAttrs($friendly_attrs); # Check for server definitions. if (! isset($servers) || count($servers->GetServerList()) == 0) error(_('Your config.php is missing Server Definitions. Please see the sample file config/config.php.example.'),'error','index.php',true); $config->setServers($servers); # Check the memory limit parameter. if (ini_get('memory_limit') < $config->getValue('session','memorylimit')) system_message(array( 'title'=>_('Memory Limit low.'), 'body'=> sprintf('Your php memory limit is low - currently %s, you should increase it to atleast %s. This is normally controlled in /etc/php.ini.',ini_get('memory_limit'),$config->getValue('session','memorylimit')), 'type'=>'error')); return $config; } /** * Commands available in the control_panel of the page * * @return array */ function cmd_control_pane($type) { switch ($type) { case 'main' : return array( 'home'=>array( 'title'=>_('Home'), 'link'=>sprintf('href="index.php" title="%s"',_('Home')), 'image'=>sprintf('%s',IMGDIR,_('Home'))), 'purge'=>array( 'title'=>_('Purge caches'), 'link'=>sprintf('href="cmd.php?cmd=purge_cache" onclick="return displayAJ(\'BODY\',\'cmd=purge_cache\',\'%s\');" title="%s"', _('Clearing cache'),_('Purge caches')), 'image'=>sprintf('%s',IMGDIR,_('Purge caches'))), 'appearance:hide_debug_info'=>array( 'title'=>_('Show Cache'), 'link'=>sprintf('href="cmd.php?cmd=show_cache" onclick="return displayAJ(\'BODY\',\'cmd=show_cache\',\'%s\');" title="%s"', _('Loading'),_('Show Cache'),_('Show Cache')), 'image'=>sprintf('%s',IMGDIR,_('Show Cache'))), ); break; case 'top' : return array(); break; } } /** * This function dumps the $variable for debugging purposes * * @param string|array Variable to dump * @param boolean Whether to stop execution or not. */ function debug_dump($variable,$die=false,$onlydebugaddr=false) { if ($onlydebugaddr && isset($_SESSION[APPCONFIG]) && $_SESSION[APPCONFIG]->getValue('debug','addr') && $_SERVER['HTTP_X_FORWARDED_FOR'] != $_SESSION[APPCONFIG]->getValue('debug','addr') && $_SERVER['REMOTE_ADDR'] != $_SESSION[APPCONFIG]->getValue('debug','addr')) return; $backtrace = debug_backtrace(); $caller['class'] = isset($backtrace[0]['class']) ? $backtrace[0]['class'] : 'N/A'; $caller['function'] = isset($backtrace[0]['function']) ? $backtrace[0]['function'] : 'N/A'; $caller['file'] = isset($backtrace[0]['file']) ? $backtrace[0]['file'] : 'N/A'; $caller['line'] = isset($backtrace[0]['line']) ? $backtrace[0]['line'] : 'N/A'; $caller['debug'] = $variable; print '
';
	print_r($caller);
	print '
'; if ($die) die(); } /** * This function generates a backtrace * * @param boolean Whether to stop execution or not. */ function debug_dump_backtrace($msg='Calling BackTrace',$die=false) { error($msg,'note',null,$die,true); } /** * Send a debug as a sys message */ function debug_sysmsg($msg) { system_message(array('title'=>_('Debug'),'body'=>$msg,'type'=>'debug')); } /** * Debug Logging to Syslog * * The global debug level is turned on in your configuration file by setting: * * $config->custom->debug['level'] = 255; * * together with atleast one output direction (currently file and syslog are supported). * * $config->custom->debug['file'] = '/tmp/app_debug.log'; * $config->custom->debug['syslog'] = true; * * * The debug level is turned into binary, then if the message levels bit is on * the message will be sent to the debug log. (Thus setting your debug level to 255, * all bits on, will results in all messages being printed.) * * The message level bits are defined here. * 0( 1) = Entry/Return results from function calls. * 1( 2) = Configuration Processing * 2( 4) = Template Processing * 3( 8) = Schema Processing * 4( 16) = Server Communication * 5( 32) = Menu Processing * 7( 64) = Other non generic messages * 8(128) = Page Processing * @param string Message to send to syslog * @param int Log bit number for this message. * @see syslog.php */ function debug_log($msg,$level=0) { global $debug_file; # Temporary, to catch when these are not set in the function arguments. $file = __FILE__; $line = __LINE__; $method = __METHOD__; # In case we are called before we are fully initialised or if debugging is not set. if (! isset($_SESSION[APPCONFIG]) || ! ($_SESSION[APPCONFIG]->getValue('debug','file') || $_SESSION[APPCONFIG]->getValue('debug','syslog'))) return false; $debug_level = $_SESSION[APPCONFIG]->getValue('debug','level'); if (! $debug_level || (! ($level & $debug_level))) return; $debugaddr = false; if ($_SESSION[APPCONFIG]->getValue('debug','addr')) { if (isset($_SERVER['HTTP_X_FORWARDED_FOR']) && $_SERVER['HTTP_X_FORWARDED_FOR'] == $_SESSION[APPCONFIG]->getValue('debug','addr')) $debugaddr = true; elseif ($_SERVER['REMOTE_ADDR'] == $_SESSION[APPCONFIG]->getValue('debug','addr')) $debugaddr = true; } else $debugaddr = true; if (! $debugaddr) return; # If we are limiting debug to a browser, then check that $caller = basename( $_SERVER['PHP_SELF'] ); if (func_num_args() > 2) { $args = func_get_args(); array_shift($args); array_shift($args); # This is temporary, until we change all the debug_log statements. if (is_string($args[0]) && preg_match('/.php$/',$args[0])) { $file = array_shift($args); $line = array_shift($args); $method = array_shift($args); } $fargs = array(); foreach ($args as $key) { if (is_array($key) || is_object($key)) array_push($fargs,serialize($key)); else array_push($fargs,$key); } $msg = vsprintf($msg, array_values($fargs)); } if (function_exists('stopwatch')) $timer = stopwatch(); else $timer = null; $debug_message = sprintf('[%2.3f] %3s-%s(%04s): %s: %s',$timer,$level,basename($file),$line,$method,substr($msg,0,200)); if ($debug_file || $_SESSION[APPCONFIG]->getValue('debug','file')) { if (! $debug_file) $debug_file = fopen($_SESSION[APPCONFIG]->getValue('debug','file'), $_SESSION[APPCONFIG]->getValue('debug','append') ? 'a' : 'w'); fwrite($debug_file,$debug_message."\n"); } if ($_SESSION[APPCONFIG]->getValue('debug','syslog')) syslog_notice($debug_message); return syslog_notice( sprintf('%s(%s): %s',$caller,$level,$msg) ); } /** * Display an error message in the system message panel of the page. */ function error($msg,$type='note',$redirect=null,$fatal=false,$backtrace=false) { global $www; static $counter; # Just a check to see that we are called right. if (! isset($www['page']) && ! $fatal) die("Function error called incorrectly [$msg]"); # If the error is fatal, we'll need to stop here. if (! isset($www['page'])) $www['page'] = new page(); if ($fatal) $www['page']->setsysmsg(array('title'=>_('Error'),'body'=>$msg,'type'=>$type)); else system_message(array('title'=>_('Error'),'body'=>$msg,'type'=>$type),$redirect); # Spin loop detection if ($counter++ > 20) { debug_dump('Spin loop detection.'); debug_dump(array('msg'=>$msg,'session'=>$_SESSION['sysmsg'],'www'=>$www),1); } # Do we have a backtrace to display? if ($backtrace) { $backtraceblock = new block(); $backtraceblock->SetTitle('PHP Debug Backtrace'); $body = ''; $body .= "\n"; foreach (debug_backtrace() as $error => $line) { $_SESSION['backtrace'][$error]['file'] = isset($line['file']) ? $line['file'] : 'unknown'; $_SESSION['backtrace'][$error]['line'] = isset($line['line']) ? $line['line'] : 'unknown'; $body .= sprintf('', _('File'),isset($line['file']) ? $line['file'] : $last['file'],isset($line['line']) ? $line['line'] : ''); $_SESSION['backtrace'][$error]['function'] = $line['function']; $body .= sprintf(''; $body .= "\n"; if (isset($line['file'])) $last['file'] = $line['file']; } $body .= '
%s%s (%s)
 %s%s', _('Function'),$line['function']); if (isset($line['args'])) { $display = strlen(serialize($line['args'])) < 50 ? serialize($line['args']) : substr(serialize($line['args']),0,50).'...'; $_SESSION['backtrace'][$error]['args'] = $line['args']; if (file_exists(LIBDIR.'../tools/unserialize.php')) $body .= sprintf(' (%s)', '../tools/unserialize.php',$error,$display); else $body .= sprintf(' (%s)',$display); } $body .= '
'; $body .= "\n"; $backtraceblock->SetBody($body); $www['page']->block_add('body',$backtraceblock); } if ($fatal) { $www['page']->display(array('menu'=>false)); die(); } } /** * Return the result of a form variable, with optional default * * @return The form GET/REQUEST/SESSION/POST variable value or its default */ function get_request($attr,$type='POST',$die=false,$default=null) { switch($type) { case 'GET': $value = isset($_GET[$attr]) ? (is_array($_GET[$attr]) ? $_GET[$attr] : rawurldecode($_GET[$attr])) : $default; break; case 'REQUEST': $value = isset($_REQUEST[$attr]) ? (is_array($_REQUEST[$attr]) ? $_REQUEST[$attr] : rawurldecode($_REQUEST[$attr])) : $default; break; case 'SESSION': $value = isset($_SESSION[$attr]) ? (is_array($_SESSION[$attr]) ? $_SESSION[$attr] : rawurldecode($_SESSION[$attr])) : $default; break; case 'POST': default: $value = isset($_POST[$attr]) ? (is_array($_POST[$attr]) ? $_POST[$attr] : rawurldecode($_POST[$attr])) : $default; break; } if ($die && is_null($value)) system_message(array( 'title'=>_('Generic Error'), 'body'=>sprintf('%s: Called "%s" without "%s" using "%s"', basename($_SERVER['PHP_SELF']),get_request('cmd','REQUEST'),$attr,$type), 'type'=>'error'), 'index.php'); return $value; } /** * Record a system message. * This function can be used as an alternative to generate a system message, if page hasnt yet been defined. */ function system_message($msg,$redirect=null) { if (! is_array($msg)) return null; if (! isset($msg['title']) && ! isset($msg['body'])) return null; if (! isset($msg['type'])) $msg['type'] = 'info'; if (! isset($_SESSION['sysmsg']) || ! is_array($_SESSION['sysmsg'])) $_SESSION['sysmsg'] = array(); # Try and detect if we are in a redirect loop if (get_request('redirect','GET') && $msg['type'] != 'debug') { foreach ($_SESSION['sysmsg'] as $detail) { if ($msg == $detail && ! isset($detail['special'])) { debug_dump($_SESSION['sysmsg']); debug_dump_backtrace('Redirect Loop Detected',true); } } } array_push($_SESSION['sysmsg'],$msg); if ($redirect) { if (preg_match('/\?/',$redirect)) $redirect .= '&'; else $redirect .= '?'; $redirect .= 'redirect=true'; # Check if we were an ajax request, and only render the ajax message if (get_request('meth','REQUEST') == 'ajax') $redirect .= '&meth=ajax'; header("Location: $redirect"); die(); } } /** * Other Functions */ /** * Encryption using blowfish algorithm * * @param string Original data * @param string The secret * @return string The encrypted result * @author lem9 (taken from the phpMyAdmin source) */ function blowfish_encrypt($data,$secret=null) { if (DEBUG_ENABLED) debug_log('Entered with (%s,%s)',1,__FILE__,__LINE__,__METHOD__, $data,$secret); # If our secret is null or blank, get the default. if ($secret === null || ! trim($secret)) $secret = $_SESSION[APPCONFIG]->getValue('session','blowfish'); # If the secret isnt set, then just return the data. if (! trim($secret)) return $data; if (file_exists(LIBDIR.'blowfish.php')) require_once LIBDIR.'blowfish.php'; else return $data; $pma_cipher = new Horde_Cipher_blowfish; $encrypt = ''; for ($i=0; $iencryptBlock($block, $secret); } return base64_encode($encrypt); } /** * Decryption using blowfish algorithm * * @param string Encrypted data * @param string The secret * @return string Original data * @author lem9 (taken from the phpMyAdmin source) */ function blowfish_decrypt($encdata,$secret=null) { if (DEBUG_ENABLED) debug_log('Entered with (%s,%s)',1,__FILE__,__LINE__,__METHOD__, $encdata,$secret); # This cache gives major speed up for stupid callers :) static $CACHE = array(); if (isset($CACHE[$encdata])) return $CACHE[$encdata]; # If our secret is null or blank, get the default. if ($secret === null || ! trim($secret)) $secret = $_SESSION[APPCONFIG]->getValue('session','blowfish'); # If the secret isnt set, then just return the data. if (! trim($secret)) return $encdata; if (file_exists(LIBDIR.'blowfish.php')) require_once LIBDIR.'blowfish.php'; else return $data; $pma_cipher = new Horde_Cipher_blowfish; $decrypt = ''; $data = base64_decode($encdata); for ($i=0; $idecryptBlock(substr($data, $i, 8), $secret); $return = trim($decrypt); $CACHE[$encdata] = $return; return $return; } /** * String padding * * @param string Input string * @param integer Length of the result * @param string The filling string * @param integer Padding mode * @return string The padded string */ function full_str_pad($input,$pad_length,$pad_string='',$pad_type=0) { if (DEBUG_ENABLED) debug_log('Entered with (%s,%s,%s,%s)',1,__FILE__,__LINE__,__METHOD__, $input,$pad_length,$pad_string,$pad_type); $str = ''; $length = $pad_length - strlen($input); if ($length > 0) { // str_repeat doesn't like negatives if ($pad_type == STR_PAD_RIGHT) { // STR_PAD_RIGHT == 1 $str = $input.str_repeat($pad_string, $length); } elseif ($pad_type == STR_PAD_BOTH) { // STR_PAD_BOTH == 2 $str = str_repeat($pad_string, floor($length/2)); $str .= $input; $str .= str_repeat($pad_string, ceil($length/2)); } else { // defaults to STR_PAD_LEFT == 0 $str = str_repeat($pad_string, $length).$input; } } else { // if $length is negative or zero we don't need to do anything $str = $input; } return $str; } /** * Returns the cached array of application server resources. * * Note that internally, this function utilizes a two-layer cache, * one in memory using a static variable for multiple calls within * the same page load, and one in a session for multiple calls within * the same user session (spanning multiple page loads). * * @return Returns the cached attributed requested, * or null if there is nothing cached.. */ function get_cached_item($index,$item,$subitem='null') { # Set default return $return = null; # Check config to make sure session-based caching is enabled. if ($_SESSION[APPCONFIG]->getValue('cache',$item)) { global $CACHE; if (isset($CACHE[$index][$item][$subitem])) { if (DEBUG_ENABLED) debug_log('Returning MEMORY cached [%s] (%s)',1,__FILE__,__LINE__,__METHOD__, $item,$subitem); $return = $CACHE[$index][$item][$subitem]; } elseif (isset($_SESSION['cache'][$index][$item][$subitem])) { if (DEBUG_ENABLED) debug_log('Returning SESSION cached [%s] (%s)',1,__FILE__,__LINE__,__METHOD__, $item,$subitem); $return = $_SESSION['cache'][$index][$item][$subitem]; $CACHE[$index][$item][$subitem] = $return; } } if (DEBUG_ENABLED) debug_log('Entered with (%s,%s,%s), Returning (%s)',1,__FILE__,__LINE__,__METHOD__, $index,$item,$subitem,$return); return $return; } /** * Caches the specified $item for the specified $index. * * Returns true on success of false on failure. */ function set_cached_item($index,$item,$subitem='null',$data) { if (DEBUG_ENABLED) debug_log('Entered with (%s,%s,%s,%s)',1,__FILE__,__LINE__,__METHOD__, $index,$item,$subitem,$data); # Check config to make sure session-based caching is enabled. if ($_SESSION[APPCONFIG]->getValue('cache',$item)) { global $CACHE; $CACHE[$index][$item][$subitem] = $data; $_SESSION['cache'][$index][$item][$subitem] = $data; return true; } else return false; } /** * Deletes the cache for a specified $item for the specified $index */ function del_cached_item($index,$item,$subitem='null') { global $CACHE; if (DEBUG_ENABLED) debug_log('Entered with (%s,%s,%s)',1,__FILE__,__LINE__,__METHOD__, $index,$item,$subitem); # Check config to make sure session-based caching is enabled. if (isset($_SESSION['cache'][$index][$item][$subitem])) unset($_SESSION['cache'][$index][$item][$subitem]); if (isset($CACHE[$index][$item][$subitem])) unset($CACHE[$index][$item][$subitem]); } /** * Utility wrapper for setting cookies, which takes into consideration * application configuration values. On success, true is returned. On * failure, false is returned. * * @param string The name of the cookie to set. * @param string The value of the cookie to set. * @param int (optional) The duration in seconds of this cookie. If unspecified, $cookie_time is used from config.php * @param string (optional) The directory value of this cookie (see php.net/setcookie) * @return boolean */ function set_cookie($name,$val,$expire=null,$dir=null) { # Set default return $return = false; if ($expire == null) { $cookie_time = $_SESSION[APPCONFIG]->getValue('session','cookie_time'); $expire = $cookie_time == 0 ? null : time() + $cookie_time; } if ($dir == null) $dir = dirname($_SERVER['PHP_SELF']); if (@setcookie($name,$val,$expire,$dir)) { $_COOKIE[$name] = $val; $return = true; } if (DEBUG_ENABLED) debug_log('Entered with (%s,%s,%s,%s), Returning (%s)',1,__FILE__,__LINE__,__METHOD__, $name,$val,$expire,$dir,$return); return $return; } /** * Get a customized file for a server * We don't need any caching, because it's done by PHP * * @param int The ID of the server * @param string The requested filename * * @return string The customized filename, if exists, or the standard one */ function get_custom_file($index,$filename,$path) { # Set default return $return = $path.$filename; $server = $_SESSION[APPCONFIG]->getServer($index); $custom = $server->getValue('custom','pages_prefix'); if (! is_null($custom) && is_file(realpath($path.$custom.$filename))) $return = $path.$custom.$filename; if (DEBUG_ENABLED) debug_log('Entered with (%s,%s,%s), Returning (%s)',1,__FILE__,__LINE__,__METHOD__, $index,$filename,$path,$return); return $return; } /** * Sort a multi dimensional array. * * @param array Multi demension array passed by reference * @param string Comma delimited string of sort keys. * @param boolean Whether to reverse sort. * @return array Sorted multi demension array. */ function masort(&$data,$sortby,$rev=0) { if (DEBUG_ENABLED) debug_log('Entered with (%s,%s,%s)',1,__FILE__,__LINE__,__METHOD__, $data,$sortby,$rev); # if the array to sort is null or empty if (! $data) return; static $CACHE = array(); if (empty($CACHE[$sortby])) { $code = "\$c=0;\n"; foreach (split(',',$sortby) as $key) { $code .= "if (is_object(\$a) || is_object(\$b)) {\n"; $code .= " if (\$a->$key != \$b->$key)\n"; if ($rev) $code .= " return (\$a->$key < \$b->$key ? 1 : -1);\n"; else $code .= " return (\$a->$key > \$b->$key ? 1 : -1);\n"; $code .= "} else {\n"; $code .= "if ((! isset(\$a['$key'])) && (! isset(\$b['$key']))) return 0;\n"; $code .= "if ((! isset(\$a['$key'])) && isset(\$b['$key'])) return -1;\n"; $code .= "if (isset(\$a['$key']) && (! isset(\$b['$key']))) return 1;\n"; $code .= "if (is_numeric(\$a['$key']) && is_numeric(\$b['$key'])) {\n"; $code .= " if (\$a['$key'] != \$b['$key'])\n"; if ($rev) $code .= " return (\$a['$key'] < \$b['$key'] ? 1 : -1);\n"; else $code .= " return (\$a['$key'] > \$b['$key'] ? 1 : -1);\n"; $code .= "} else {\n"; if ($rev) $code .= " if ( (\$c = strcasecmp(\$b['$key'],\$a['$key'])) != 0 ) return \$c;\n"; else $code .= " if ( (\$c = strcasecmp(\$a['$key'],\$b['$key'])) != 0 ) return \$c;\n"; $code .= "}}\n"; } $code .= 'return $c;'; $CACHE[$sortby] = create_function('$a, $b',$code); } uasort($data,$CACHE[$sortby]); } /** * Is compression enabled for output */ function isCompress() { return (isset($_SESSION[APPCONFIG]) && $_SESSION[APPCONFIG]->getValue('appearance','compress') && ! ini_get('zlib.output_compression') && eregi('gzip',$_SERVER['HTTP_ACCEPT_ENCODING'])); } ?>