1
0
mirror of https://github.com/e107inc/e107.git synced 2025-08-08 07:36:32 +02:00

Closes #5469 Added option to set the user when logging.

This commit is contained in:
camer0n
2025-04-11 18:42:34 -07:00
parent 5a040b64e2
commit 2f3b4a435b
2 changed files with 366 additions and 299 deletions

View File

@@ -15,15 +15,16 @@
* @example Log Array Diff: e107::getAdminLog()->addArray($array1, $array2)->save('PREF_01'); * @example Log Array Diff: e107::getAdminLog()->addArray($array1, $array2)->save('PREF_01');
* @example Log Array Diff and Add to Message Handler: e107::getAdminLog()->addArray($array1, $array2, E_MESSAGE_ERROR )->save('PREF_01'); * @example Log Array Diff and Add to Message Handler: e107::getAdminLog()->addArray($array1, $array2, E_MESSAGE_ERROR )->save('PREF_01');
* *
*/ */
if (!defined('e107_INIT')) if(!defined('e107_INIT'))
{ {
exit; exit;
} }
define('LOG_MESSAGE_NODISPLAY', 'nodisplay'); define('LOG_MESSAGE_NODISPLAY', 'nodisplay');
/** /**
* Admin logging class. * Admin logging class.
* *
@@ -40,15 +41,16 @@ class e_admin_log
* *
* @var array * @var array
*/ */
protected $_options = array('log_level'=>2, 'backtrace'=>false, ); protected $_options = array('log_level' => 2, 'backtrace' => false,);
protected $rldb = NULL; // Database used by logging routine
protected $rldb = null; // Database used by logging routine
protected $_userData = null;
protected $logFile = null; protected $logFile = null;
/** /**
* Log messages * Log messages
*
* @var array * @var array
*/ */
protected $_messages; protected $_messages;
@@ -68,13 +70,14 @@ class e_admin_log
* Constructor. Sets up constants and overwrites default options where set. * Constructor. Sets up constants and overwrites default options where set.
* *
* @param array $options * @param array $options
* @return null * @return void
*/ */
public function __construct($options = array()) public function __construct($options = array())
{ {
if(!empty($options)) if(!empty($options))
{ {
foreach ($options as $key=>$val) foreach($options as $key => $val)
{ {
$this->_options[$key] = $val; $this->_options[$key] = $val;
} }
@@ -118,7 +121,7 @@ class e_admin_log
// Init E_MESSAGE_* constants if not already done // Init E_MESSAGE_* constants if not already done
// e107::getMessage(); - just include, message handler is creating session in construct // e107::getMessage(); - just include, message handler is creating session in construct
// it breaks stuff (see class2 - language detection and comments) // it breaks stuff (see class2 - language detection and comments)
require_once(e_HANDLER.'message_handler.php'); require_once(e_HANDLER . 'message_handler.php');
$this->_messages = array(); $this->_messages = array();
$this->_allMessages = array(); $this->_allMessages = array();
@@ -129,35 +132,56 @@ class e_admin_log
} }
/**
* Set the user ID and name for the next log entry
* @param int $user_id
* @param string $user_name
* @return e_admin_log
*/
public function setUser($user_id, $user_name='')
{
$this->_userData = array(
'user_id' => (int) $user_id,
'user_name' => !empty($user_name) ? e107::getParser()->toDB($user_name, true, false, 'no_html') : ''
);
return $this;
}
/** /**
* @deprecated * @deprecated
* BC Alias of add(); * BC Alias of add();
*/ */
public function log_event($event_title, $event_detail, $event_type = E_LOG_INFORMATIVE , $event_code = '') public function log_event($event_title, $event_detail, $event_type = E_LOG_INFORMATIVE, $event_code = '')
{ {
trigger_error('<b>'.__METHOD__.' is deprecated.</b> Use add() instead.', E_USER_DEPRECATED);
trigger_error('<b>' . __METHOD__ . ' is deprecated.</b> Use add() instead.', E_USER_DEPRECATED);
return $this->add($event_title, $event_detail, $event_type, $event_code); return $this->add($event_title, $event_detail, $event_type, $event_code);
} }
/** /**
* Save all logs in the queue to the database and render any unhidden messages with the message handler. * Save all logs in the queue to the database and render any unhidden messages with the message handler.
* @see alias flushMessages() method below. *
* @param string $logTitle - title for log entry eg. 'PREF_01' * @param string $logTitle - title for log entry eg. 'PREF_01'
* @param int $logImportance [optional] default E_LOG_INFORMATIVE, E_LOG_NOTICE, E_LOG_WARNING, E_LOG_FATAL - passed directly to admin log * @param int $logImportance [optional] default E_LOG_INFORMATIVE, E_LOG_NOTICE, E_LOG_WARNING, E_LOG_FATAL - passed directly to admin log
* @param string $logEventCode [optional] - passed directly to admin log * @param string $logEventCode [optional] - passed directly to admin log
* @param string $mstack [optional] message stack passed to message handler * @param string $mstack [optional] message stack passed to message handler
* @param int LOG_TO_ADMIN|LOG_TO_ROLLING|LOG_TO_AUDIT * @param int LOG_TO_ADMIN|LOG_TO_ROLLING|LOG_TO_AUDIT
* @return \e_admin_log * @return \e_admin_log
* @see alias flushMessages() method below.
*/ */
public function save($logTitle, $logImportance = E_LOG_INFORMATIVE, $logEventCode = '', $mstack = false, $target = LOG_TO_ADMIN) public function save($logTitle, $logImportance = E_LOG_INFORMATIVE, $logEventCode = '', $mstack = false, $target = LOG_TO_ADMIN)
{ {
return $this->flushMessages($logTitle, $logImportance, $logEventCode, $mstack, $target); return $this->flushMessages($logTitle, $logImportance, $logEventCode, $mstack, $target);
} }
/** /**
* Add and Save an event into the admin, rolling or user log. * Add and Save an event into the admin, rolling or user log.
*
* @param string $event_title * @param string $event_title
* @param string|array $event_detail * @param string|array $event_detail
* @param integer $event_type [optional] Log level eg. E_LOG_INFORMATIVE, E_LOG_NOTICE, E_LOG_WARNING, E_LOG_FATAL * @param integer $event_type [optional] Log level eg. E_LOG_INFORMATIVE, E_LOG_NOTICE, E_LOG_WARNING, E_LOG_FATAL
@@ -176,14 +200,15 @@ class e_admin_log
* Typically the 'STRING' part of the name defines the area originating the log event, and the 'nn' is a numeric code * Typically the 'STRING' part of the name defines the area originating the log event, and the 'nn' is a numeric code
* This is stored as 'LAN_AL_STRING_NN', and must be defined in a language file which is loaded during log display. * This is stored as 'LAN_AL_STRING_NN', and must be defined in a language file which is loaded during log display.
*/ */
public function add($event_title, $event_detail, $event_type = E_LOG_INFORMATIVE , $event_code = '', $target = LOG_TO_ADMIN, $userData=null ) public function add($event_title, $event_detail, $event_type = E_LOG_INFORMATIVE, $event_code = '', $target = LOG_TO_ADMIN, $userData = null)
{ {
if (empty($event_code))
if(empty($event_code))
{ {
if (strlen($event_title) <= 12) if(strlen($event_title) <= 12)
{ // Assume the title is actually a reference to the event { // Assume the title is actually a reference to the event
$event_code = $event_title; $event_code = $event_title;
$event_title = 'LAN_AL_'.$event_title; $event_title = 'LAN_AL_' . $event_title;
} }
else else
{ {
@@ -191,34 +216,37 @@ class e_admin_log
} }
} }
if (!is_array($event_detail)) if(!is_array($event_detail))
{ {
// auto-format long details - // auto-format long details -
$event_detail = str_replace("\n", '[!br!]', $event_detail); $event_detail = str_replace("\n", '[!br!]', $event_detail);
} }
if ($this->_options['backtrace'] == true) if($this->_options['backtrace'] == true)
{ {
$event_detail .= "\n\n".debug_backtrace(false); $event_detail .= "\n\n" . debug_backtrace(false);
} }
$this->addEvent($event_type, -1, $event_code, $event_title, $event_detail, FALSE, $target, $userData); $this->addEvent($event_type, -1, $event_code, $event_title, $event_detail, false, $target, $userData);
return $this; return $this;
} }
/** /**
* Enable/Disable the Rolling Log. * Enable/Disable the Rolling Log.
*
* @param $bool * @param $bool
*/ */
public function rollingLog($bool) public function rollingLog($bool)
{ {
$this->_roll_log_active = (bool) $bool; $this->_roll_log_active = (bool) $bool;
} }
/** /**
* Alias for deprecated e_log_event * Alias for deprecated e_log_event
*
* @param int $importance - importance of event - 0..4 or so * @param int $importance - importance of event - 0..4 or so
* @param mixed $source_call - either: string identifying calling file/routine * @param mixed $source_call - either: string identifying calling file/routine
* or: a number 0..9 identifying info to log from debug_backtrace() * or: a number 0..9 identifying info to log from debug_backtrace()
@@ -235,20 +263,21 @@ class e_admin_log
* *
* @return null * @return null
*/ */
public function addEvent($importance, $source_call, $eventcode = 'GEN', $event_title = 'Untitled', $explain = '', $finished = FALSE, $target_logs = LOG_TO_AUDIT, $userData=null ) public function addEvent($importance, $source_call, $eventcode = 'GEN', $event_title = 'Untitled', $explain = '', $finished = false, $target_logs = LOG_TO_AUDIT, $userData = null)
{ {
$e107 = e107::getInstance(); $e107 = e107::getInstance();
$tp = e107::getParser(); $tp = e107::getParser();
list($time_usec, $time_sec) = explode(' ', microtime(FALSE)); // Log event time immediately to minimise uncertainty list($time_usec, $time_sec) = explode(' ', microtime(false)); // Log event time immediately to minimise uncertainty
$time_usec = $time_usec * 1000000; $time_usec = $time_usec * 1000000;
if ($this->rldb === null) // Better use our own db - don't know what else is going on if($this->rldb === null) // Better use our own db - don't know what else is going on
{ {
$this->rldb = e107::getDb('adminlog'); $this->rldb = e107::getDb('adminlog');
} }
if (is_bool($target_logs)) if(is_bool($target_logs))
{ // Handle the legacy stuff for now - some old code used a boolean to select admin or rolling logs { // Handle the legacy stuff for now - some old code used a boolean to select admin or rolling logs
$target_logs = $target_logs ? LOG_TO_ADMIN : LOG_TO_ROLLING; $target_logs = $target_logs ? LOG_TO_ADMIN : LOG_TO_ROLLING;
} }
@@ -259,7 +288,7 @@ class e_admin_log
$userid = deftrue('USER') ? USERID : 0; $userid = deftrue('USER') ? USERID : 0;
$userstring = deftrue('USER') ? USERNAME : 'LAN_ANONYMOUS'; $userstring = deftrue('USER') ? USERNAME : 'LAN_ANONYMOUS';
$userIP = e107::getIPHandler()->getIP(FALSE); $userIP = e107::getIPHandler()->getIP(false);
if(!empty($userData['user_id'])) if(!empty($userData['user_id']))
{ {
@@ -279,7 +308,7 @@ class e_admin_log
$importance = $tp->toDB($importance, true, false, 'no_html'); $importance = $tp->toDB($importance, true, false, 'no_html');
$eventcode = $tp->toDB($eventcode, true, false, 'no_html'); $eventcode = $tp->toDB($eventcode, true, false, 'no_html');
if (is_array($explain)) if(is_array($explain))
{ {
/* /*
$line = ''; $line = '';
@@ -292,7 +321,7 @@ class e_admin_log
$explain = $line; $explain = $line;
unset($line); unset($line);
*/ */
$explain = str_replace("\n",'[!br!]',print_r($explain,true)); $explain = str_replace("\n", '[!br!]', print_r($explain, true));
} }
@@ -303,7 +332,7 @@ class e_admin_log
//--------------------------------------- //---------------------------------------
// Admin Log // Admin Log
//--------------------------------------- //---------------------------------------
if ($target_logs & LOG_TO_ADMIN) // Admin log - assume all fields valid if($target_logs & LOG_TO_ADMIN) // Admin log - assume all fields valid
{ {
// $qry = " null, ".intval($time_sec).','.intval($time_usec).", '{$importance}', '{$eventcode}', {$userid}, '{$userIP}', '{$event_title}', '{$explain}' "; // $qry = " null, ".intval($time_sec).','.intval($time_usec).", '{$importance}', '{$eventcode}', {$userid}, '{$userIP}', '{$event_title}', '{$explain}' ";
@@ -330,16 +359,16 @@ class e_admin_log
//--------------------------------------- //---------------------------------------
// Rolling Log // Rolling Log
//--------------------------------------- //---------------------------------------
if (($target_logs & LOG_TO_ROLLING) && $this->_roll_log_active) if(($target_logs & LOG_TO_ROLLING) && $this->_roll_log_active)
{ // Rolling log { // Rolling log
// Process source_call info // Process source_call info
//--------------------------------------- //---------------------------------------
if (is_numeric($source_call) && ($source_call >= 0)) if(is_numeric($source_call) && ($source_call >= 0))
{ {
$back_count = 1; $back_count = 1;
$i = 0; $i = 0;
if (($source_call == '')) if(($source_call == ''))
{ {
$back_count = $source_call + 1; $back_count = $source_call + 1;
$source_call = debug_backtrace(); $source_call = debug_backtrace();
@@ -347,28 +376,28 @@ class e_admin_log
} }
} }
if (is_array($source_call)) if(is_array($source_call))
{ // Print the debug_backtrace() array { // Print the debug_backtrace() array
while ($i < $back_count) while($i < $back_count)
{ {
$source_call[$i]['file'] = $e107->fix_windows_paths($source_call[$i]['file']); // Needed for Windoze hosts. $source_call[$i]['file'] = $e107->fix_windows_paths($source_call[$i]['file']); // Needed for Windoze hosts.
$source_call[$i]['file'] = str_replace($e107->file_path, '', $source_call[$i]['file']); // We really just want a e107 root-relative path. Strip out the root bit $source_call[$i]['file'] = str_replace($e107->file_path, '', $source_call[$i]['file']); // We really just want a e107 root-relative path. Strip out the root bit
$tmp = $source_call[$i]['file']. '|' .$source_call[$i]['class'].$source_call[$i]['type'].$source_call[$i]['function']. '@' .$source_call[$i]['line']; $tmp = $source_call[$i]['file'] . '|' . $source_call[$i]['class'] . $source_call[$i]['type'] . $source_call[$i]['function'] . '@' . $source_call[$i]['line'];
foreach ($source_call[$i]['args'] as $k=>$v) foreach($source_call[$i]['args'] as $k => $v)
{ // Add in the arguments { // Add in the arguments
$explain .= '[!br!]' .$k. '=' .$v; $explain .= '[!br!]' . $k . '=' . $v;
} }
$i++; $i++;
if ($i < $back_count) if($i < $back_count)
{ {
$explain .= "[!br!]-------------------"; $explain .= "[!br!]-------------------";
} }
if (!isset($tmp1)) if(!isset($tmp1))
{ {
$tmp1 = $tmp; $tmp1 = $tmp;
} // Pick off the immediate caller as the source } // Pick off the immediate caller as the source
} }
if (isset($tmp1)) if(isset($tmp1))
{ {
$source_call = $tmp1; $source_call = $tmp1;
} }
@@ -402,18 +431,16 @@ class e_admin_log
); );
$this->rldb->insert('dblog', '0, ' . intval($time_sec) . ', ' . intval($time_usec) . ", '{$importance}', '{$eventcode}', {$userid}, '{$userstring}', '{$userIP}', '{$source_call}', '{$event_title}', '{$explain}' ");
$this->rldb->insert('dblog', '0, ' .intval($time_sec).', '.intval($time_usec).", '{$importance}', '{$eventcode}', {$userid}, '{$userstring}', '{$userIP}', '{$source_call}', '{$event_title}', '{$explain}' ");
// Now delete any old stuff // Now delete any old stuff
if(!empty($this->_roll_log_days)) if(!empty($this->_roll_log_days))
{ {
$this->rldb->delete('dblog', "dblog_datestamp < '".intval(time() - ($this->_roll_log_days * 86400))."' "); $this->rldb->delete('dblog', "dblog_datestamp < '" . intval(time() - ($this->_roll_log_days * 86400)) . "' ");
} }
} }
if ($finished) if($finished)
{ {
exit; exit;
} // Optional abort for all logs } // Optional abort for all logs
@@ -425,9 +452,10 @@ class e_admin_log
/** /**
* @deprecated - use add() method instead or addEvent() as a direct replacement. * @deprecated - use add() method instead or addEvent() as a direct replacement.
*/ */
public function e_log_event($importance, $source_call, $eventcode = 'GEN', $event_title = 'Untitled', $explain = '', $finished = FALSE, $target_logs = LOG_TO_AUDIT, $userData=null ) public function e_log_event($importance, $source_call, $eventcode = 'GEN', $event_title = 'Untitled', $explain = '', $finished = false, $target_logs = LOG_TO_AUDIT, $userData = null)
{ {
trigger_error('<b>'.__METHOD__.' is deprecated.</b> Use add()->save() or addEvent() instead.', E_USER_DEPRECATED);
trigger_error('<b>' . __METHOD__ . ' is deprecated.</b> Use add()->save() or addEvent() instead.', E_USER_DEPRECATED);
return $this->addEvent($importance, $source_call, $eventcode, $event_title, $explain, $finished, $target_logs, $userData); return $this->addEvent($importance, $source_call, $eventcode, $event_title, $explain, $finished, $target_logs, $userData);
} }
@@ -439,6 +467,7 @@ class e_admin_log
*/ */
public function setCurrentPlugin($plugdir) public function setCurrentPlugin($plugdir)
{ {
$this->_current_plugin = $plugdir; $this->_current_plugin = $plugdir;
return $this; return $this;
@@ -448,6 +477,7 @@ class e_admin_log
* USER AUDIT ENTRY * USER AUDIT ENTRY
*-------------------------------------- *--------------------------------------
* Log user-related events * Log user-related events
*
* @param string $event_type * @param string $event_type
* @param array|string $event_data is an array of data fields whose keys and values are logged (usually user data, but doesn't have to be - can add messages here) * @param array|string $event_data is an array of data fields whose keys and values are logged (usually user data, but doesn't have to be - can add messages here)
* @param int $id user-id * @param int $id user-id
@@ -458,6 +488,7 @@ class e_admin_log
*/ */
function user_audit($event_type, $event_data, $id = null, $u_name = '') function user_audit($event_type, $event_data, $id = null, $u_name = '')
{ {
list($time_usec, $time_sec) = explode(' ', microtime()); // Log event time immediately to minimise uncertainty list($time_usec, $time_sec) = explode(' ', microtime()); // Log event time immediately to minimise uncertainty
$time_usec = $time_usec * 1000000; $time_usec = $time_usec * 1000000;
@@ -466,24 +497,25 @@ class e_admin_log
{ {
$title = 'User Audit Event-Type Failure: '; $title = 'User Audit Event-Type Failure: ';
$title .= (string) $event_type; $title .= (string) $event_type;
$debug = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS,4); $debug = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 4);
$debug[0] = e_REQUEST_URI; $debug[0] = e_REQUEST_URI;
$this->addEvent(4, $debug[1]['file']. '|' .$debug[1]['function']. '@' .$debug[1]['line'], 'USERAUDIT', $title, $debug, FALSE); $this->addEvent(4, $debug[1]['file'] . '|' . $debug[1]['function'] . '@' . $debug[1]['line'], 'USERAUDIT', $title, $debug, false);
return false; return false;
} }
// See whether we should log this // See whether we should log this
$user_logging_opts = e107::getConfig()->get('user_audit_opts'); $user_logging_opts = e107::getConfig()->get('user_audit_opts');
if (!isset($user_logging_opts[$event_type])) // Finished if not set to log this event type if(!isset($user_logging_opts[$event_type])) // Finished if not set to log this event type
{ {
return false; return false;
} }
if(empty($event_data)) if(empty($event_data))
{ {
$backt = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS,4); $backt = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 4);
$event_data = $backt; $event_data = $backt;
} }
@@ -513,9 +545,9 @@ class e_admin_log
$userIP = e107::getIPHandler()->getIP(false); $userIP = e107::getIPHandler()->getIP(false);
$eventcode = 'USER_'.$event_type; $eventcode = 'USER_' . $event_type;
$title = 'LAN_AUDIT_LOG_0'.$event_type; // This creates a string which will be displayed as a constant $title = 'LAN_AUDIT_LOG_0' . $event_type; // This creates a string which will be displayed as a constant
$insertQry = array( $insertQry = array(
'dblog_id' => 0, 'dblog_id' => 0,
@@ -526,7 +558,7 @@ class e_admin_log
'dblog_user_name' => $userstring, 'dblog_user_name' => $userstring,
'dblog_ip' => $userIP, 'dblog_ip' => $userIP,
'dblog_title' => $title, 'dblog_title' => $title,
'dblog_remarks' => print_r($event_data,true), 'dblog_remarks' => print_r($event_data, true),
); );
if($this->rldb->insert('audit_log', $insertQry)) if($this->rldb->insert('audit_log', $insertQry))
@@ -548,7 +580,6 @@ class e_admin_log
*/ */
/** /**
* Removes all events older than $days, or truncates the table if $days == false * Removes all events older than $days, or truncates the table if $days == false
* *
@@ -557,8 +588,9 @@ class e_admin_log
*/ */
public function purge_log_events($days) public function purge_log_events($days)
{ {
global $sql; global $sql;
if ($days == false) if($days == false)
{ // $days is false, so truncate the log table { // $days is false, so truncate the log table
$sql->gen('TRUNCATE TABLE #dblog '); $sql->gen('TRUNCATE TABLE #dblog ');
} }
@@ -585,31 +617,32 @@ class e_admin_log
*/ */
function logArrayDiffs($new, $old, $event, $logNow = true) function logArrayDiffs($new, $old, $event, $logNow = true)
{ {
// $changes = array(); // $changes = array();
$changes = array_diff_recursive($new,$old); $changes = array_diff_recursive($new, $old);
if (count($changes)) if(count($changes))
{ {
if($logNow) if($logNow)
{ {
$this->add($event, print_r($changes,true), E_LOG_INFORMATIVE, ''); $this->add($event, print_r($changes, true), E_LOG_INFORMATIVE, '');
} }
else else
{ {
$this->logMessage($changes, LOG_MESSAGE_NODISPLAY, E_MESSAGE_INFO); $this->logMessage($changes, LOG_MESSAGE_NODISPLAY, E_MESSAGE_INFO);
} }
return TRUE; return true;
} }
return FALSE; return false;
} }
/** /**
* Logs an entry with all the data from an array, one field per line. * Logs an entry with all the data from an array, one field per line.
* @deprecated Use e107::getLog()->addArray($arrayData)->save($event); *
* @param string $event - LAN define or string used as title in log * @param string $event - LAN define or string used as title in log
* @param array $target - data to be logged * @param array $target - data to be logged
* @param string $extra - if non-empty, it goes on the first line. * @param string $extra - if non-empty, it goes on the first line.
@@ -617,10 +650,12 @@ class e_admin_log
* If the $niceName array exists and has a definition, the 'nice Name' is displayed instead of the key name * If the $niceName array exists and has a definition, the 'nice Name' is displayed instead of the key name
* *
* @return null * @return null
* @deprecated Use e107::getLog()->addArray($arrayData)->save($event);
*/ */
public function logArrayAll($event, $target, $extra = '', $niceNames = NULL) public function logArrayAll($event, $target, $extra = '', $niceNames = null)
{ {
trigger_error('<b>'.__METHOD__.' is deprecated.</b> Use e107::getLog()->addArray($arrayData)->save($event) instead.', E_USER_DEPRECATED); // no LAN
trigger_error('<b>' . __METHOD__ . ' is deprecated.</b> Use e107::getLog()->addArray($arrayData)->save($event) instead.', E_USER_DEPRECATED); // no LAN
if($extra == '' && $niceNames == null) if($extra == '' && $niceNames == null)
{ {
return $this->add($event, $target, E_LOG_INFORMATIVE, ''); // supports arrays return $this->add($event, $target, E_LOG_INFORMATIVE, ''); // supports arrays
@@ -629,21 +664,21 @@ class e_admin_log
$logString = ''; $logString = '';
if ($extra) if($extra)
{ {
$logString = $extra.'[!br!]'; $logString = $extra . '[!br!]';
} }
$spacer = ''; $spacer = '';
$checkNice = ($niceNames != NULL) && is_array($niceNames); $checkNice = ($niceNames != null) && is_array($niceNames);
foreach ($target as $k=>$v) foreach($target as $k => $v)
{ {
if ($checkNice && isset($niceNames[$k]['niceName'])) if($checkNice && isset($niceNames[$k]['niceName']))
{ {
$logString .= $spacer.$niceNames[$k]['niceName'].'=>'.$v; $logString .= $spacer . $niceNames[$k]['niceName'] . '=>' . $v;
} }
else else
{ {
$logString .= $spacer.$k.'=>'.$v; $logString .= $spacer . $k . '=>' . $v;
} }
$spacer = '[!br!]'; $spacer = '[!br!]';
} }
@@ -668,17 +703,18 @@ class e_admin_log
* *
* @return e_admin_log * @return e_admin_log
*/ */
public function logMessage($text, $type = '', $logLevel = TRUE, $session = FALSE) public function logMessage($text, $type = '', $logLevel = true, $session = false)
{ {
if(is_array($text)) if(is_array($text))
{ {
$text = print_r($text,true); $text = print_r($text, true);
} }
elseif(empty($text)) elseif(empty($text))
{ {
$bt = debug_backtrace(true); $bt = debug_backtrace(true);
e107::getMessage()->addDebug('Log Message was empty: ' .print_a($bt[1],true)); e107::getMessage()->addDebug('Log Message was empty: ' . print_a($bt[1], true));
return $this; // changing to text will break chained methods. return $this; // changing to text will break chained methods.
} }
@@ -686,12 +722,12 @@ class e_admin_log
{ {
$type = E_MESSAGE_INFO; $type = E_MESSAGE_INFO;
} }
if($logLevel === TRUE) if($logLevel === true)
{ {
$logLevel = $type; $logLevel = $type;
} }
$logArray = array('message' => $text, 'dislevel' => $type, 'loglevel' => $logLevel, 'session' => $session, 'time'=>time()); $logArray = array('message' => $text, 'dislevel' => $type, 'loglevel' => $logLevel, 'session' => $session, 'time' => time());
$this->_messages[] = $logArray; $this->_messages[] = $logArray;
$this->_allMessages[] = $logArray; $this->_allMessages[] = $logArray;
@@ -700,17 +736,17 @@ class e_admin_log
} }
/** /**
* @deprecated * @deprecated
* BC Alias for addSuccess(); * BC Alias for addSuccess();
*/ */
public function logSuccess($text, $message = true, $session = false) public function logSuccess($text, $message = true, $session = false)
{ {
trigger_error('<b>'.__METHOD__.' is deprecated.</b> Use e107::getLog()->addSuccess($arrayData)->save($event) instead.', E_USER_DEPRECATED); // no LAN
return $this->addSuccess($text,$message,$session);
}
trigger_error('<b>' . __METHOD__ . ' is deprecated.</b> Use e107::getLog()->addSuccess($arrayData)->save($event) instead.', E_USER_DEPRECATED); // no LAN
return $this->addSuccess($text, $message, $session);
}
/** /**
@@ -719,8 +755,10 @@ class e_admin_log
*/ */
public function logError($text, $message = true, $session = false) public function logError($text, $message = true, $session = false)
{ {
trigger_error('<b>'.__METHOD__.' is deprecated.</b> Use e107::getLog()->addError($arrayData)->save($event) instead.', E_USER_DEPRECATED); // no LAN
return $this->addError($text,$message,$session); trigger_error('<b>' . __METHOD__ . ' is deprecated.</b> Use e107::getLog()->addError($arrayData)->save($event) instead.', E_USER_DEPRECATED); // no LAN
return $this->addError($text, $message, $session);
} }
@@ -734,6 +772,7 @@ class e_admin_log
*/ */
public function addSuccess($text, $message = true, $session = false) public function addSuccess($text, $message = true, $session = false)
{ {
return $this->logMessage($text, ($message ? E_MESSAGE_SUCCESS : LOG_MESSAGE_NODISPLAY), E_MESSAGE_SUCCESS, $session); return $this->logMessage($text, ($message ? E_MESSAGE_SUCCESS : LOG_MESSAGE_NODISPLAY), E_MESSAGE_SUCCESS, $session);
} }
@@ -748,6 +787,7 @@ class e_admin_log
*/ */
public function addError($text, $message = true, $session = false) public function addError($text, $message = true, $session = false)
{ {
return $this->logMessage($text, ($message ? E_MESSAGE_ERROR : LOG_MESSAGE_NODISPLAY), E_MESSAGE_ERROR, $session); return $this->logMessage($text, ($message ? E_MESSAGE_ERROR : LOG_MESSAGE_NODISPLAY), E_MESSAGE_ERROR, $session);
} }
@@ -762,6 +802,7 @@ class e_admin_log
*/ */
public function addDebug($text, $message = true, $session = false) public function addDebug($text, $message = true, $session = false)
{ {
return $this->logMessage($text, ($message ? E_MESSAGE_DEBUG : LOG_MESSAGE_NODISPLAY), E_MESSAGE_DEBUG, $session); return $this->logMessage($text, ($message ? E_MESSAGE_DEBUG : LOG_MESSAGE_NODISPLAY), E_MESSAGE_DEBUG, $session);
} }
@@ -776,23 +817,26 @@ class e_admin_log
*/ */
public function addWarning($text, $message = true, $session = false) public function addWarning($text, $message = true, $session = false)
{ {
return $this->logMessage($text, ($message ? E_MESSAGE_WARNING : LOG_MESSAGE_NODISPLAY), E_MESSAGE_WARNING, $session); return $this->logMessage($text, ($message ? E_MESSAGE_WARNING : LOG_MESSAGE_NODISPLAY), E_MESSAGE_WARNING, $session);
} }
/** /**
* Add an array to the log queue * Add an array to the log queue
*
* @param $array * @param $array
* @param null $oldArray (optional) - when included, only the changes between the arrays is saved. * @param null $oldArray (optional) - when included, only the changes between the arrays is saved.
* @param string $type (optional) default: LOG_MESSAGE_NODISPLAY. or E_MESSAGE_WARNING, E_MESSAGE_DEBUG, E_MESSAGE_SUCCESS * @param string $type (optional) default: LOG_MESSAGE_NODISPLAY. or E_MESSAGE_WARNING, E_MESSAGE_DEBUG, E_MESSAGE_SUCCESS
* @param bool $session * @param bool $session
* @return e_admin_log * @return e_admin_log
*/ */
public function addArray($array, $oldArray= null, $type = LOG_MESSAGE_NODISPLAY , $session = false) public function addArray($array, $oldArray = null, $type = LOG_MESSAGE_NODISPLAY, $session = false)
{ {
if(is_array($oldArray)) if(is_array($oldArray))
{ {
$text = array_diff_recursive($array,$oldArray); // Located in core_functions.php $text = array_diff_recursive($array, $oldArray); // Located in core_functions.php
if(count($text) < 1) if(count($text) < 1)
{ {
$text = 'No differences found'; $text = 'No differences found';
@@ -809,13 +853,14 @@ class e_admin_log
/** /**
* Return the last row added to the log table. * Return the last row added to the log table.
*
* @param int $type * @param int $type
* @return array|string * @return array|string
*/ */
public function getLastLog($type=LOG_TO_ADMIN) public function getLastLog($type = LOG_TO_ADMIN)
{ {
switch ($type) switch($type)
{ {
case LOG_TO_AUDIT: case LOG_TO_AUDIT:
$table = 'audit_log'; $table = 'audit_log';
@@ -830,7 +875,8 @@ class e_admin_log
$table = 'admin_log'; $table = 'admin_log';
} }
$query = 'SELECT * FROM #'.$table.' ORDER BY dblog_id DESC LIMIT 1'; $query = 'SELECT * FROM #' . $table . ' ORDER BY dblog_id DESC LIMIT 1';
return e107::getDb()->retrieve($query); return e107::getDb()->retrieve($query);
} }
@@ -843,30 +889,35 @@ class e_admin_log
* @param int $logImportance - passed directly to admin log * @param int $logImportance - passed directly to admin log
* @param string $logEventCode - passed directly to admin log * @param string $logEventCode - passed directly to admin log
* @param string $mstack [optional] message stack passed to message handler * @param string $mstack [optional] message stack passed to message handler
* @param int $target - LOG_TO_ADMIN|LOG_TO_ROLLING|LOG_TO_AUDIT
* @return e_admin_log * @return e_admin_log
*/ */
public function flushMessages($logTitle, $logImportance = E_LOG_INFORMATIVE, $logEventCode = '', $mstack = false, $target =LOG_TO_ADMIN) public function flushMessages($logTitle, $logImportance = E_LOG_INFORMATIVE, $logEventCode = '', $mstack = false, $target = LOG_TO_ADMIN)
{ {
$mes = e107::getMessage(); $mes = e107::getMessage();
$resultTypes = array(E_MESSAGE_SUCCESS => 'Success', E_MESSAGE_ERROR => 'Fail'); // Add LANS here. Could add other codes $resultTypes = array(E_MESSAGE_SUCCESS => 'Success', E_MESSAGE_ERROR => 'Fail'); // Add LANS here. Could add other codes
$separator = ''; $separator = '';
$logString = ''; $logString = '';
foreach ($this->_messages as $m) foreach($this->_messages as $m)
{ {
if ($m['loglevel'] !== FALSE) if($m['loglevel'] !== false)
{ {
$logString .= $separator; $logString .= $separator;
if ($m['loglevel'] == LOG_MESSAGE_NODISPLAY) { $logString .= ' '; } // Indent supplementary messages if($m['loglevel'] == LOG_MESSAGE_NODISPLAY)
{
$logString .= ' ';
} // Indent supplementary messages
// Not sure about next line - might want to log the <br /> as text, rather than it forcing a newline // Not sure about next line - might want to log the <br /> as text, rather than it forcing a newline
$logString .= strip_tags(str_replace(array('<br>', '<br/>', '<br />'), '[!br!]', $m['message'])); $logString .= strip_tags(str_replace(array('<br>', '<br/>', '<br />'), '[!br!]', $m['message']));
if (isset($resultTypes[$m['loglevel']])) if(isset($resultTypes[$m['loglevel']]))
{ {
$logString .= ' - '.$resultTypes[$m['loglevel']]; $logString .= ' - ' . $resultTypes[$m['loglevel']];
} }
$separator = '[!br!]'; $separator = '[!br!]';
} }
if ($m['dislevel'] != LOG_MESSAGE_NODISPLAY) if($m['dislevel'] != LOG_MESSAGE_NODISPLAY)
{ {
if($mstack) if($mstack)
{ {
@@ -879,21 +930,20 @@ class e_admin_log
} }
} }
} }
$this->add($logTitle, $logString, $logImportance, $logEventCode, $target); $this->add($logTitle, $logString, $logImportance, $logEventCode, $target, $this->_userData);
$this->_messages = array(); // Clear the memory for reuse $this->_messages = array(); // Clear the memory for reuse
$this->_userData = null; // Clear the user data to prevent reuse
return $this; return $this;
} }
/** /**
* Clear all messages in 'memory'. * Clear all messages in 'memory'.
*/ */
public function clear() public function clear()
{ {
$this->_messages = array(); $this->_messages = array();
return $this; return $this;
@@ -903,8 +953,9 @@ class e_admin_log
/** /**
* Save Message stack to File. * Save Message stack to File.
*/ */
private function saveToFile($logTitle='', $append=false, $opts = array()) private function saveToFile($logTitle = '', $append = false, $opts = array())
{ {
if($this->logFile == null) if($this->logFile == null)
{ {
return null; return null;
@@ -912,7 +963,7 @@ class e_admin_log
if(count($this->_allMessages)) if(count($this->_allMessages))
{ {
$head = ' e107 CMS Log file : ' .$logTitle. ' ' .date('Y-m-d_H-i-s')."\n"; $head = ' e107 CMS Log file : ' . $logTitle . ' ' . date('Y-m-d_H-i-s') . "\n";
$head .= "-------------------------------------------------------------------------------------------\n\n"; $head .= "-------------------------------------------------------------------------------------------\n\n";
} }
else else
@@ -924,11 +975,10 @@ class e_admin_log
foreach($this->_allMessages as $m) foreach($this->_allMessages as $m)
{ {
$text .= date('Y-m-d H:i:s', $m['time'])." \t".str_pad($m['loglevel'],10, ' ',STR_PAD_RIGHT)."\t".strip_tags($m['message'])."\n"; $text .= date('Y-m-d H:i:s', $m['time']) . " \t" . str_pad($m['loglevel'], 10, ' ', STR_PAD_RIGHT) . "\t" . strip_tags($m['message']) . "\n";
} }
$date = ($append == true) ? date('Y-m-d') : date('Y-m-d_H-i-s').'_'.crc32($text); $date = ($append == true) ? date('Y-m-d') : date('Y-m-d_H-i-s') . '_' . crc32($text);
$dir = e_LOG; $dir = e_LOG;
@@ -940,22 +990,22 @@ class e_admin_log
if(!empty($this->_current_plugin)) // If it's a plugin, create a subfolder. if(!empty($this->_current_plugin)) // If it's a plugin, create a subfolder.
{ {
$dir = e_LOG.$this->_current_plugin. '/'; $dir = e_LOG . $this->_current_plugin . '/';
if(!is_dir($dir)) if(!is_dir($dir))
{ {
if (!mkdir($dir, 0755) && !is_dir($dir)) if(!mkdir($dir, 0755) && !is_dir($dir))
{ {
$this->add('Directory creation Failed', sprintf('Directory "%s" was not created', $dir)); $this->add('Directory creation Failed', sprintf('Directory "%s" was not created', $dir));
} }
} }
} }
$fileName = $dir.$date. '_' .$this->logFile. '.log'; $fileName = $dir . $date . '_' . $this->logFile . '.log';
if(!empty($opts['filename'])) if(!empty($opts['filename']))
{ {
$fileName = $dir.basename($opts['filename']); $fileName = $dir . basename($opts['filename']);
} }
if($append == true) if($append == true)
@@ -972,16 +1022,17 @@ class e_admin_log
$text = $head . $text; $text = $head . $text;
} }
if (file_put_contents($fileName, $text, $app)) if(file_put_contents($fileName, $text, $app))
{ {
$this->_allMessages = array(); $this->_allMessages = array();
$this->_current_plugin = null; $this->_current_plugin = null;
return $this->logFile; return $this->logFile;
} }
if(E107_DEBUG_LEVEL > 0 && getperms('0')) if(E107_DEBUG_LEVEL > 0 && getperms('0'))
{ {
e107::getMessage()->addDebug("Couldn't Save to Log File: ".$fileName); e107::getMessage()->addDebug("Couldn't Save to Log File: " . $fileName);
} }
$this->_current_plugin = null; $this->_current_plugin = null;
@@ -990,22 +1041,22 @@ class e_admin_log
} }
/** /**
* Set and save accumulated log to a file. * Set and save accumulated log to a file.
* Use addDebug(), addError() or addSuccess() prior to executing. * Use addDebug(), addError() or addSuccess() prior to executing.
*
* @param string name without the extension. (ie. date prefix and .log suffix will be added automatically) * @param string name without the extension. (ie. date prefix and .log suffix will be added automatically)
* @param string Title for use inside the Log file * @param string Title for use inside the Log file
* @param boolean true = append to file, false = new file each save. * @param boolean true = append to file, false = new file each save.
*/ */
public function toFile($name, $logTitle='',$append=false, $opts=array()) public function toFile($name, $logTitle = '', $append = false, $opts = array())
{ {
$this->logFile = $name; $this->logFile = $name;
$file = $this->saveToFile($logTitle,$append,$opts); $file = $this->saveToFile($logTitle, $append, $opts);
$this->logFile = null; $this->logFile = null;
return $file; return $file;
} }

View File

@@ -25,7 +25,7 @@
} }
catch(Exception $e) catch(Exception $e)
{ {
$this->assertTrue(false, "Couldn't load e_admin_log object"); $this::fail("Couldn't load e_admin_log object");
} }
$this->log->__construct(); $this->log->__construct();
@@ -63,9 +63,25 @@
$result = $this->log->getLastLog(); $result = $this->log->getLastLog();
$this->assertNotEmpty($result['dblog_eventcode']); $this::assertNotEmpty($result['dblog_eventcode']);
$this->assertSame('ADD_ARRAY', $result['dblog_eventcode']); $this::assertSame('ADD_ARRAY', $result['dblog_eventcode']);
$this->assertSame("Array[!br!]([!br!] [one] =&gt; two[!br!] [three] =&gt; four[!br!])[!br!]",$result['dblog_remarks']); $this::assertSame("Array[!br!]([!br!] [one] =&gt; two[!br!] [three] =&gt; four[!br!])[!br!]",$result['dblog_remarks']);
}
public function testSetUser()
{
$arr = array('one'=>'two', 'three'=>'four');
$this->log->addArray($arr)->setUser(5, 'testuser')->save('ADD_W_USER');
$result = $this->log->getLastLog();
$this::assertNotEmpty($result['dblog_eventcode']);
$this::assertSame('ADD_W_USER', $result['dblog_eventcode']);
$this::assertEquals(5, $result['dblog_user_id']);
} }
/* /*
@@ -101,10 +117,10 @@
$result = $this->log->getLastLog(); $result = $this->log->getLastLog();
$this->assertNotEmpty($result['dblog_eventcode']); $this::assertNotEmpty($result['dblog_eventcode']);
$this->assertSame('TEST', $result['dblog_eventcode']); $this::assertSame('TEST', $result['dblog_eventcode']);
$this->assertSame("Array[!br!]([!br!] [one] =&gt; test[!br!] [two] =&gt; testing[!br!])[!br!]", $result['dblog_remarks']); $this::assertSame("Array[!br!]([!br!] [one] =&gt; test[!br!] [two] =&gt; testing[!br!])[!br!]", $result['dblog_remarks']);
} }
/* /*
@@ -129,20 +145,20 @@
$this->log->add('testAdd Title', "testAdd Message", E_LOG_INFORMATIVE, 'TEST_ADD'); $this->log->add('testAdd Title', "testAdd Message", E_LOG_INFORMATIVE, 'TEST_ADD');
$result = $this->log->getLastLog(); $result = $this->log->getLastLog();
$this->assertNotEmpty($result['dblog_eventcode']); $this::assertNotEmpty($result['dblog_eventcode']);
$this->assertSame('TEST_ADD', $result['dblog_eventcode']); $this::assertSame('TEST_ADD', $result['dblog_eventcode']);
$this->assertSame("testAdd Message", $result['dblog_remarks']); $this::assertSame("testAdd Message", $result['dblog_remarks']);
$this->assertSame('testAdd Title', $result['dblog_title']); $this::assertSame('testAdd Title', $result['dblog_title']);
// add to rolling log (dblog) // add to rolling log (dblog)
$this->log->rollingLog(true); $this->log->rollingLog(true);
$this->log->add('Rolling Title', "Rolling Message", E_LOG_INFORMATIVE, 'TEST_ROLL', LOG_TO_ROLLING); $this->log->add('Rolling Title', "Rolling Message", E_LOG_INFORMATIVE, 'TEST_ROLL', LOG_TO_ROLLING);
$result = $this->log->getLastLog(LOG_TO_ROLLING); $result = $this->log->getLastLog(LOG_TO_ROLLING);
$this->assertNotEmpty($result['dblog_eventcode']); $this::assertNotEmpty($result['dblog_eventcode']);
$this->assertSame('TEST_ROLL', $result['dblog_eventcode']); $this::assertSame('TEST_ROLL', $result['dblog_eventcode']);
$this->assertSame("Rolling Message", $result['dblog_remarks']); $this::assertSame("Rolling Message", $result['dblog_remarks']);
$this->log->rollingLog(false); $this->log->rollingLog(false);