diff --git a/class2.php b/class2.php index 89cf5560f..42e05587b 100644 --- a/class2.php +++ b/class2.php @@ -11,8 +11,8 @@ | GNU General Public License (http://gnu.org). | | $Source: /cvs_backup/e107_0.8/class2.php,v $ -| $Revision: 1.33 $ -| $Date: 2007-12-15 09:55:37 $ +| $Revision: 1.34 $ +| $Date: 2007-12-15 15:06:40 $ | $Author: e107steved $ +----------------------------------------------------------------------------+ */ @@ -706,7 +706,16 @@ if (isset($_POST['userlogin']) || isset($_POST['userlogin_x'])) { $usr = new userlogin($_POST['username'], $_POST['userpass'], $_POST['autologin']); } -if (e_QUERY == 'logout') { +if (e_QUERY == 'logout') +{ + if (USER) + { + if (check_class(varset($pref['user_audit_class'],''))) + { // Need to note in user audit trail + $admin_log->user_audit(USER_AUDIT_LOGOUT,''); + } + } + $ip = $e107->getip(); $udata=(USER === TRUE) ? USERID.".".USERNAME : "0"; $sql->db_Update("online", "online_user_id = '0', online_pagecount=online_pagecount+1 WHERE online_user_id = '{$udata}' LIMIT 1"); diff --git a/e107_admin/ad_links.php b/e107_admin/ad_links.php index b1205b8be..a31431100 100644 --- a/e107_admin/ad_links.php +++ b/e107_admin/ad_links.php @@ -11,9 +11,9 @@ | GNU General Public License (http://gnu.org). | | $Source: /cvs_backup/e107_0.8/e107_admin/ad_links.php,v $ -| $Revision: 1.2 $ -| $Date: 2006-12-07 15:41:49 $ -| $Author: sweetas $ +| $Revision: 1.3 $ +| $Date: 2007-12-15 15:06:40 $ +| $Author: e107steved $ +----------------------------------------------------------------------------+ */ @@ -386,6 +386,7 @@ $e_icon_array = array( 'poll' => E_32_POLLS, 'prefs' => E_32_PREFS, 'search' => E_32_SEARCH, + 'syslogs' => E_32_ADMINLOG, 'theme_manage' => E_32_THEMEMANAGER, 'maintain' => E_32_MAINTAIN, 'upload' => E_32_UPLOADS, @@ -426,6 +427,11 @@ attribute 2 = title attribute 3 = description attribute 4 = perms attribute 5 = category + 1 - settings + 2 - users + 3 - content + 4 - tools + 5 - plugins attribute 6 = 16 x 16 image attribute 7 = 32 x 32 image */ @@ -452,14 +458,15 @@ $array_functions = array( 18 => array(e_ADMIN."phpinfo.php", ADLAN_68, ADLAN_69, "0", 4, E_16_PHP, E_32_PHP), 19 => array(e_ADMIN."prefs.php", ADLAN_4, ADLAN_5, "1", 1, E_16_PREFS, E_32_PREFS), 20 => array(e_ADMIN."search.php", ADLAN_142, ADLAN_143, "X", 1, E_16_SEARCH, E_32_SEARCH), - 21 => array(e_ADMIN."theme.php", ADLAN_140, ADLAN_141, "1", 4, E_16_THEMEMANAGER, E_32_THEMEMANAGER), - 22 => array(e_ADMIN."upload.php", ADLAN_72, ADLAN_73, "V", 3, E_16_UPLOADS, E_32_UPLOADS), - 23 => array(e_ADMIN."users.php", ADLAN_36, ADLAN_37, "4", 2, E_16_USER, E_32_USER), - 24 => array(e_ADMIN."userclass2.php", ADLAN_38, ADLAN_39, "4", 2, E_16_USERCLASS, E_32_USERCLASS), - 25 => array(e_ADMIN."language.php", ADLAN_132, ADLAN_133, "0", 1, E_16_LANGUAGE, E_32_LANGUAGE), - 26 => array(e_ADMIN."mailout.php", ADLAN_136, ADLAN_137, "W", 2, E_16_MAIL, E_32_MAIL), - 27 => array(e_ADMIN."users_extended.php", ADLAN_78, ADLAN_79, "4", 2, E_16_USER_EXTENDED, E_32_USER_EXTENDED), - 28 => array(e_ADMIN."fileinspector.php", ADLAN_147, ADLAN_148, "Y", 4, E_16_INSPECT, E_32_INSPECT), - 29 => array(e_ADMIN."notify.php", ADLAN_149, ADLAN_150, "O", 4, E_16_NOTIFY, E_32_NOTIFY) + 21 => array(e_ADMIN."admin_log.php", ADLAN_155, ADLAN_156, "S", 4, E_16_ADMINLOG, E_32_ADMINLOG), + 22 => array(e_ADMIN."theme.php", ADLAN_140, ADLAN_141, "1", 4, E_16_THEMEMANAGER, E_32_THEMEMANAGER), + 23 => array(e_ADMIN."upload.php", ADLAN_72, ADLAN_73, "V", 3, E_16_UPLOADS, E_32_UPLOADS), + 24 => array(e_ADMIN."users.php", ADLAN_36, ADLAN_37, "4", 2, E_16_USER, E_32_USER), + 25 => array(e_ADMIN."userclass2.php", ADLAN_38, ADLAN_39, "4", 2, E_16_USERCLASS, E_32_USERCLASS), + 26 => array(e_ADMIN."language.php", ADLAN_132, ADLAN_133, "0", 1, E_16_LANGUAGE, E_32_LANGUAGE), + 27 => array(e_ADMIN."mailout.php", ADLAN_136, ADLAN_137, "W", 2, E_16_MAIL, E_32_MAIL), + 28 => array(e_ADMIN."users_extended.php", ADLAN_78, ADLAN_79, "4", 2, E_16_USER_EXTENDED, E_32_USER_EXTENDED), + 29 => array(e_ADMIN."fileinspector.php", ADLAN_147, ADLAN_148, "Y", 4, E_16_INSPECT, E_32_INSPECT), + 30 => array(e_ADMIN."notify.php", ADLAN_149, ADLAN_150, "O", 4, E_16_NOTIFY, E_32_NOTIFY) ); ?> diff --git a/e107_admin/admin_log.php b/e107_admin/admin_log.php index d196cf0b2..162fd2460 100644 --- a/e107_admin/admin_log.php +++ b/e107_admin/admin_log.php @@ -11,105 +11,706 @@ | GNU General Public License (http://gnu.org). | | $Source: /cvs_backup/e107_0.8/e107_admin/admin_log.php,v $ -| $Revision: 1.2 $ -| $Date: 2006-12-07 15:41:49 $ -| $Author: sweetas $ +| $Revision: 1.3 $ +| $Date: 2007-12-15 15:06:40 $ +| $Author: e107steved $ +| +| Preferences: +| 'sys_log_perpage' - number of events per page +| +| 'user_audit_opts' - which user-related events to log +| 'user_audit_class' - user class whose actions can be logged +| +| 'roll_log_days' (default 7) - number of days for which entries retained in rolling log +| 'roll_log_active' - set to '1' to enable +| +| +Todo: +1. Change userclass dropdown once inherited userclasses in place +----------------------------------------------------------------------------+ */ require_once("../class2.php"); -if (!getperms('0')) +if (!getperms("S")) { - header('location:'.e_BASE.'index.php'); - exit; + header("location:".e_BASE."index.php"); } -require_once("auth.php"); -$text = ""; -$amount = 30; -$from = ($_GET['fm']) ? intval($_GET['fm']) : 0; -if(e_QUERY == 'purge') +// Main language file should automatically be loaded + +unset($qs); + +require_once(e_ADMIN."auth.php"); + + +if (isset($_POST['setoptions'])) { - $sql->db_Delete('dblog'); + $pref['roll_log_active'] = intval($_POST['roll_log_active']); + $pref['roll_log_days'] = intval($_POST['roll_log_days']); + save_prefs(); + $message = RL_LAN_006 ; // "Options updated."; } -$total = $sql -> db_Select("dblog", "*", "ORDER BY `dblog_datestamp` DESC", "no_where"); -$query = "SELECT l.*, u.user_name FROM #dblog AS l LEFT JOIN #user AS u ON l.dblog_user_id = u.user_id ORDER BY l.dblog_datestamp DESC LIMIT $from,$amount"; -$sql -> db_Select_gen($query); -if(!is_object($gen)) { - $gen = new convert; -} - $parms = $total.",".$amount.",".$from.",".e_SELF.'?fm=[FROM]'; - $text .= "

".$tp->parseTemplate("{NEXTPREV={$parms}}")."

"; -$text .= "
\n"; - -$text .= " - - - - - - - - \n"; - -while ($row = $sql -> db_Fetch()) { - $datestamp = $gen->convert_date($row['dblog_datestamp'], 'short'); - $image = get_log_img($row['dblog_type']); - $text .= " \n"; - $text .= " \n"; - $text .= " \n"; - $text .= " \n"; - $text .= " \n"; - $text .= " \n"; - $text .= ($row['user_name']) ? " \n" : " \n"; - $text .= " \n"; +if (isset($_POST['setcommonoptions'])) +{ + $pref['sys_log_perpage'] = intval($_POST['sys_log_perpage']); + save_prefs(); + $message = RL_LAN_006 ; // "Options updated."; } -$text .= "
 ".LAN_ADMINLOG_1."".LAN_ADMINLOG_2."".LAN_ADMINLOG_3."".LAN_ADMINLOG_4."".LAN_ADMINLOG_5."
{$image}{$datestamp}".$tp->toHtml($row['dblog_title'],FALSE,"defs")."".$tp->toHtml($row['dblog_remarks'],FALSE,"defs")."{$row['dblog_ip']}{$row['user_name']}{$row['dblog_user_id']}
\n"; - $text .= "

".$tp->parseTemplate("{NEXTPREV={$parms}}")."
"; -$ns->tablerender(LAN_ADMINLOG_0, $text); -require_once("footer.php"); +if (e_QUERY) +{ // Must explode after calling auth.php + $qs = explode(".", e_QUERY); +} -function get_log_img($log_type) { - global $imode; - switch ($log_type) { - case E_LOG_INFORMATIVE: - return "".LAN_ADMINLOG_6.""; - break; - case E_LOG_NOTICE: - return "".LAN_ADMINLOG_8.""; - break; - case E_LOG_WARNING: - return "".LAN_ADMINLOG_10.""; - break; - case E_LOG_FATAL: - return "".LAN_ADMINLOG_12.""; - break; - case E_LOG_PLUGIN; - return "".LAN_ADMINLOG_6.""; - break; +$action = varset($qs[0],'adminlog'); + +include_lan(e_LANGUAGEDIR.e_LANGUAGE.'/admin/lan_log_messages.php'); + +// ****************** MAINTENANCE ****************** +if (isset($_POST['deleteoldadmin']) && isset($_POST['rolllog_clearadmin'])) +{ + $back_count = $_POST['rolllog_clearadmin']; + if (($back_count >= 1) && ($back_count <= 90)) + { + $temp_date = getdate(); + $old_date = intval(mktime(0,0,0,$temp_date['mon'],$temp_date['mday']-$back_count,$temp_date['year'])); + $old_string = strftime("%d %B %Y",$old_date); +// $message = "Back delete ".$back_count." days. Oldest date = ".$old_string; + $action = "confdel"; + $qs[1] = $old_date; + $qs[2] = $back_count; + } + else + $message = RL_LAN_050; +} + +if (!isset($admin_log)) $message .= " Admin Log not valid"; + + +// Actually delete back events +if ($action == "backdel") +{ +if (isset($_POST['confirmdeleteold'])) + { + $old_date = intval($qs[1]); + $old_string = strftime("%d %B %Y",$old_date); + $qry = "dblog_datestamp < ".$old_date; +// $message = "Back delete, oldest date = {$old_string} Query = {$qry}"; + if ($del_count = $sql -> db_Delete("dblog",$qry)) + { + // Add in a log event + $admin_log->log_event ("db_Delete - earlier than {$old_string} (past {$qs[2]} days)", $qry, 4); + $message = RL_LAN_052.$old_string.RL_LAN_057.$del_count.RL_LAN_053; } - return $log_type; + else + { + $message = RL_LAN_054." : ".$sql->mySQLresult; + } + } + + if (isset($_POST['confirmcancelold'])) + { + $message = RL_LAN_056; + } + $action = "config"; + unset($qs[1]); + unset($qs[2]); } -function headerjs() { -?> - - + +if (varsettrue($message)) +{ + $ns->tablerender("", "
$message
"); +} + +// Prompt to delete back events +if($action == "confdel") +{ + $old_string = strftime("%d %B %Y",$qs[1]); + $text = "
+
+ + + + + + +

".RL_LAN_047.$old_string."

"; + + $ns->tablerender("
".RL_LAN_051."
", $text); +} + +// Arrays of options for the various logs +$log_db_table = array('adminlog' => 'dblog', 'auditlog' => 'audit_log', 'rolllog' => 'rl_history'); +$back_day_count = array('adminlog' => 30, 'auditlog' => 30, 'rolllog' => max(intval($pref['roll_log_days']),1)); +$page_title = array('adminlog' => RL_LAN_030, 'auditlog' => RL_LAN_062, 'rolllog' => RL_LAN_002); +$col_count = array('adminlog' => 8, 'auditlog' => 8, 'rolllog' => 9); + + + +// Set all the defaults for the data filter +$start_enabled = FALSE; +$end_enabled = FALSE; +$start_time = 0; +$end_time = 0; +$user_filter = ''; +$event_filter = ''; +$pri_filter_cond = "xx"; +$pri_filter_val = ""; +$sort_field = "dblog_id"; +$sort_order = "DESC"; + + +// Maintain the log view filter across pages +$rl_cookiename = $pref['cookie_name']."_rl_admin"; +if (isset($_POST['updatefilters'])) +{ // Need to put the filter values into the cookie + $start_time = $_POST['starttimedate'] + $_POST['starttimehours']*3600 + $_POST['starttimemins']*60; + $start_enabled = isset($_POST['start_enabled']); + $end_time = $_POST['endtimedate'] + $_POST['endtimehours']*3600 + $_POST['endtimemins']*60; + $end_enabled = isset($_POST['end_enabled']); + $user_filter = $_POST['roll_user_filter']; + $event_filter = $_POST['roll_event_filter']; + $pri_filter_cond = $_POST['roll_pri_cond']; + $pri_filter_val = $_POST['roll_pri_val']; + $caller_filter = $_POST['roll_caller_filter']; + $ipaddress_filter = $_POST['roll_ipaddress_filter']; + $cookie_string = implode("|",array($start_time,$start_enabled,$end_time,$end_enabled,$user_filter,$event_filter,$pri_filter_cond,$pri_filter_val,$caller_filter,$ipaddress_filter)); +// echo $cookie_string."
"; +// Create session cookie to store values + cookie($rl_cookiename,$cookie_string,0); // Use session cookie +} +else +{ +// Now try and get the filters from the cookie + if (isset($_COOKIE[$rl_cookiename])) + list($start_time,$start_enabled,$end_time,$end_enabled,$user_filter,$event_filter,$pri_filter_cond,$pri_filter_val, $caller_filter,$ipaddress_filter) = explode("|",$_COOKIE[$rl_cookiename]); +} + + + +function time_box($boxname, $this_time, $day_count, $inc_tomorrow = FALSE) +{ // Generates boxes for date and time for today and the preceding days + // Appends 'date', 'hours', 'mins' to the specified boxname + + $all_time = getdate(); // Date/time now + $sel_time = getdate($this_time); // Currently selected date/time + $sel_day = mktime(0,0,0,$sel_time['mon'],$sel_time['mday'],$sel_time['year']); + $today = mktime(0,0,0,$all_time['mon'],$all_time['mday'] + ($inc_tomorrow ? 1 : 0),$all_time['year']); + +// Start with day + $ret = "\n"; + +// Hours + $ret .= " \n"; + +// Minutes + $ret .= " \n"; + + return $ret; +} + + +if(!defined("USER_WIDTH")) { define("USER_WIDTH","width:97%"); } + +//==================================================================== +// CONFIGURATION OPTIONS MENU +//==================================================================== + +if($action == "config") +{ + +// Common to all logs + $text = "
+
+ + + + + + + + +
".RL_LAN_044."
+ +
"; + $ns->tablerender("
".RL_LAN_064."
", $text); + + + +// Admin log options +//================== + $text = " +
+ + + + + + +
".RL_LAN_045." + + ".RL_LAN_046." +

"; + + $ns->tablerender("
".RL_LAN_048."
", $text); + + +// User Audit log options (for info) +//======================= +// define('USER_AUDIT_SIGNUP',11); // User signed up +// define('USER_AUDIT_EMAILACK',12); // User responded to registration email +// define('USER_AUDIT_LOGIN',13); // User logged in +// define('USER_AUDIT_LOGOUT',14); // User logged out +// define('USER_AUDIT_NEW_DN',15); // User changed display name +// define('USER_AUDIT_NEW_PW',16); // User changed password +// define('USER_AUDIT_NEW_EML',17); // User changed email +// define('USER_AUDIT_NEW_SET',19); // User changed other settings (intentional gap in numbering) + +$audit_checkboxes = array( + USER_AUDIT_SIGNUP => RL_LAN_071, + USER_AUDIT_EMAILACK => RL_LAN_072, + USER_AUDIT_LOGIN => RL_LAN_073, +// USER_AUDIT_LOGOUT => RL_LAN_074, // Logout is lumped in with login + USER_AUDIT_NEW_DN => RL_LAN_075, + USER_AUDIT_NEW_PW => RL_LAN_076, + USER_AUDIT_PW_RES => RL_LAN_078, + USER_AUDIT_NEW_EML => RL_LAN_077, + USER_AUDIT_NEW_SET => RL_LAN_079 +); + +//Uncomment once inherited user classes +// if (!isset($e_userclass) && !is_object($e_userclass)) +// { + require_once(e_HANDLER."userclass_class.php"); +// $e_userclass = new user_class; +// } + + $user_signup_opts = array_flip(explode(',',varset($pref['user_audit_opts'],''))); + $text = "
+
+ + + + + + + + + + + + +
".RL_LAN_026.""; + +// Uncomment once inherited userclasses +// $text .= "\n"; + $text .= r_userclass('user_audit_class', varset($pref['user_audit_class'],''),'off','nobody,admin,user,classes'); + $text .= "
".RL_LAN_031.""; + $spacer = ''; + foreach ($audit_checkboxes as $k => $t) + { + $text .= $spacer." + ".$t; + $spacer = '
'; + } + $text .= " +
+
"; + $ns->tablerender("
".RL_LAN_007."
", $text); + + +// Rolling log options +//==================== + $text = "
+
+ + + + + + + + + + + + + +
".RL_LAN_008."
".RL_LAN_009." +
"; + $ns->tablerender("
".RL_LAN_011."
", $text); + +} + + + + +//==================================================================== +// LOG VIEW MENU +//==================================================================== + +if (($action == "rolllog") || ($action == "adminlog") || ($action == "auditlog")) +{ +$from = intval(varset($qs[1], 0)); // First entry to display +$amount = max(varset($pref['sys_log_perpage'], 20),5); // Number of entries per page + +// Array decides which filters are active for each log. There are 4 columns total. All but 'datetimes' occupy 2. Must specify multiple of 4 columns - add 'blank' if necessary +$active_filters = array('adminlog' => array('datetimes'=>0,'ipfilter'=>0,'userfilter'=>0,'eventfilter'=>0,'priority'=>0), + 'auditlog' => array('datetimes'=>0,'ipfilter'=>0,'userfilter'=>0,'eventfilter'=>0,'blank'=>2), + 'rolllog' => array('datetimes'=>0,'ipfilter'=>0,'userfilter'=>0,'eventfilter'=>0,'priority'=>0,'callerfilter'=>0,'blank'=>2)); + +// Arrays determine column widths, headings, displayed fields for each log +$col_widths = array('adminlog' => array(18,4,14,7,15,8,14,20), // Date - Pri - IP - UID - User - Code - Event - Info + 'auditlog' => array(18,14,7,15,8,14,24), + 'rolllog' => array(15,4,12,6,12,7,13,13,18)); // Date - Pri - IP - UID - User - Code - Caller - Event - Info +$col_titles = array('adminlog' => array(RL_LAN_019,RL_LAN_032,RL_LAN_020,RL_LAN_021,RL_LAN_022,RL_LAN_023,RL_LAN_025,RL_LAN_033), + 'auditlog' => array(RL_LAN_019,RL_LAN_020,RL_LAN_021,RL_LAN_022,RL_LAN_023,RL_LAN_025,RL_LAN_033), + 'rolllog' => array(RL_LAN_019,RL_LAN_032,RL_LAN_020,RL_LAN_021,RL_LAN_022,RL_LAN_023,RL_LAN_024,RL_LAN_025,RL_LAN_033)); +$col_fields = array('adminlog' => array('cf_datestring','dblog_type','dblog_ip','dblog_user_id','dblog_user_name','dblog_eventcode','dblog_title','dblog_remarks'), + 'auditlog' => array('cf_datestring','dblog_ip','dblog_user_id','dblog_user_name','dblog_eventcode','dblog_title','dblog_remarks'), + 'rolllog' => array('cf_datestring','dblog_type','dblog_ip','dblog_user_id','dblog_user_name','dblog_eventcode','dblog_caller','dblog_title','dblog_remarks')); + + + +// Check things + if ($start_time >= $end_time) + { // Make end time beginning of tomorrow + $tempdate = getdate(); + $end_time = mktime(0,0,0,$tempdate['mon'],$tempdate['mday']+1,$tempdate['year']); // Seems odd, but mktime will work this out OK + // (or so the manual says) + } + + + +// Now work out the query - only use those filters which are displayed + $qry = ''; + $and_array = array(); + foreach ($active_filters[$action] as $fname=>$fpars) + { + switch ($fname) + { + case 'datetimes' : + if ($start_enabled && ($start_time > 0)) $and_array[] = "`dblog_datestamp` >= ".intval($start_time); + if ($end_enabled && ($end_time > 0)) $and_array[] = "`dblog_datestamp` <= ".intval($end_time); + break; + case 'ipfilter' : + if ($ipaddress_filter != "") + { + if (substr($ipaddress_filter,-1) == '*') + { // Wildcard to handle - mySQL uses % + $and_array[] = "`dblog_ip` LIKE '".substr($ipaddress_filter,0,-1)."%' "; + } + else + { + $and_array[] = "`dblog_ip`= '".$ipaddress_filter."' "; + } + } + break; + case 'userfilter' : + if ($user_filter != '') $and_array[] = "`dblog_user_id` = ".intval($user_filter); + break; + case 'eventfilter' : + if ($event_filter != '') + { + if (substr($event_filter,-1) == '*') + { // Wildcard to handle - mySQL uses % + $and_array[] = " `dblog_eventcode` LIKE '".substr($event_filter,0,-1)."%' "; + } + else + { + $and_array[] = "`dblog_eventcode`= '".$event_filter."' "; + } + } + break; + case 'callerfilter' : + if ($caller_filter != '') + { + if (substr($caller_filter,-1) == '*') + { // Wildcard to handle - mySQL uses % + $and_array[] = "`dblog_caller` LIKE '".substr($caller_filter,0,-1)."%' "; + } + else + { + $and_array[] = "`dblog_caller`= '".$caller_filter."' "; + } + } + break; + case 'priority' : + if (($pri_filter_val != "") && ($pri_filter_cond != "") && ($pri_filter_cond != "xx")) + { + switch ($pri_filter_cond) + { + case "lt" : + $and_array[] = "`dblog_type` <= '{$pri_filter_val}' "; + break; + case "eq" : + $and_array[] = "`dblog_type` = '{$pri_filter_val}' "; + break; + case "gt" : + $and_array[] = "`dblog_type` >= '{$pri_filter_val}' "; + break; + } + } + break; + } + } + + + if (count($and_array)) $qry = " WHERE ".implode(' AND ',$and_array); + $num_entry = $sql->db_Count($log_db_table[$action], "(*)", $qry); + + if ($from > $num_entry) $from = 0; // We may be on a later page + + $qry = "SELECT dbl.*,u.user_name FROM #".$log_db_table[$action]." AS dbl LEFT JOIN #user AS u ON dbl.dblog_user_id=u.user_id".$qry." ORDER BY {$sort_field} ".$sort_order." LIMIT {$from}, {$amount} "; +// echo $qry.'
'; + + +// Start by putting up the filter boxes + $text = "
+
+ + + + + + + + "; + $filter_cols = 0; + foreach ($active_filters[$action] as $fname=>$fpars) + { + if ($filter_cols == 0) $text .= ''; + switch ($fname) + { + case 'datetimes' : + $text .= " + + "; + $filter_cols = 4; + break; + case 'priority' : + $text .= " + "; + $filter_cols += 2; + break; + case 'ipfilter' : + $text .= " + "; + $filter_cols += 2; + break; + case 'userfilter' : + $text .= " + "; + $filter_cols += 2; + break; + case 'eventfilter' : + $text .= " + "; + $filter_cols += 2; + break; + case 'callerfilter' : + $text .= " + "; + $filter_cols += 2; + break; + case 'blank' : // Any number of blank cells + $text .= Str_repeat("",$fpars); + $filter_cols += $fpars; + break; + } + if ($filter_cols >= 4) { $text .= ''; $filter_cols = 0; } + } + +// $text .= ""; + $text .= " + +
".RL_LAN_012."
 ".RL_LAN_013."".time_box("starttime",$start_time,$back_day_count[$action],FALSE)." ".RL_LAN_014."".time_box("endtime",$end_time,$back_day_count[$action],TRUE). + "".RL_LAN_058." +   + ".RL_LAN_060."
".RL_LAN_061."
".RL_LAN_015."
".RL_LAN_016."
".RL_LAN_029."
".RL_LAN_061."
".RL_LAN_059."
".RL_LAN_061."
 
Query = {$qry}
{$_COOKIE[$rl_cookiename]}
+
+

"; + + +// Next bit is the actual log display - the arrays define column widths, titles, fields etc for each log + + $column_count = count($col_widths[$action]); + $text .= "
+
+ + "; + foreach($col_widths[$action] as $i) + { + $text .= "\n"; + } + $text .= "\n"; + + if (!$sql->db_Select_gen($qry)) + { + $text .= ""; + $num_entry = 0; + } + else + {// Start with header + $text .= ''; + foreach ($col_titles[$action] as $ct) + { + $text .= " "; + } + $text .= "\n"; + +// Now put up the events + while ($row = $sql->db_Fetch()) + { + $text .= ''; + foreach ($col_fields[$action] as $cf) + { + switch ($cf) + { + case 'cf_datestring' : + $val = date("d-m-y H:i:s",$row['dblog_datestamp']); + break; + case 'cf_eventcode' : + $val = 'ADMIN'.$row['dblog_eventcode']; + break; + case 'dblog_title' : // Look up constants to give multi-language viewing + $val = trim($row['dblog_title']); +// $val = $tp->toHTML($row['dblog_title'],FALSE,'RAWTEXT,defs'); + if (defined($val)) $val = constant($val); + break; + case 'dblog_username' : + $val = $row['dblog_userid'] ? $row['dblog_username'] : 'Anonymous'; + break; + case 'dblog_caller' : + $val = $row['dblog_caller']; + if ((strpos($val,'|') !== FALSE) && (strpos($val,'@') !== FALSE)) + { + list($file,$rest) = explode('|',$val); + list($routine,$rest) = explode('@',$rest); + $val = $file.'
Routine: '.$routine.'
Line: '.$rest; + } + break; + default : + $val = $row[$cf]; + } + $text .= ""; + } + $text .= "\n"; + } + } + $text .= " + +
".RL_LAN_017."
{$ct}
{$val}
+
+
"; + +// Next-Previous. ========================== + + if ($num_entry > $amount) + { + $parms = "{$num_entry},{$amount},{$from},".e_SELF."?".$action.".[FROM]"; + $text .= "
".$tp->parseTemplate("{NEXTPREV={$parms}}"); + } + + $text .= "   Total {$num_entry} entries matching search condition"; + $ns->tablerender("
{$page_title[$action]}
", $text); +} + + +function admin_log_adminmenu() +{ + if (e_QUERY) { + $tmp = explode(".", e_QUERY); + $action = $tmp[0]; + } + if ($action == "") { + $action = "adminlog"; + } + $var['adminlog']['text'] = RL_LAN_030; + $var['adminlog']['link'] = "admin_log.php?adminlog"; + + $var['auditlog']['text'] = RL_LAN_062; + $var['auditlog']['link'] = "admin_log.php?auditlog"; + + $var['rolllog']['text'] = RL_LAN_002; + $var['rolllog']['link'] = "admin_log.php?rolllog"; + + $var['config']['text'] = RL_LAN_027; + $var['config']['link'] ="admin_log.php?config"; + + show_admin_menu(RL_LAN_005, $action, $var); +} + + +require_once(e_ADMIN."footer.php"); + +?> \ No newline at end of file diff --git a/e107_admin/administrator.php b/e107_admin/administrator.php index aa85070a0..824ce93c1 100644 --- a/e107_admin/administrator.php +++ b/e107_admin/administrator.php @@ -11,9 +11,9 @@ | GNU General Public License (http://gnu.org). | | $Source: /cvs_backup/e107_0.8/e107_admin/administrator.php,v $ -| $Revision: 1.2 $ -| $Date: 2006-12-07 15:41:49 $ -| $Author: sweetas $ +| $Revision: 1.3 $ +| $Date: 2007-12-15 15:06:40 $ +| $Author: e107steved $ +----------------------------------------------------------------------------+ */ require_once('../class2.php'); @@ -200,7 +200,7 @@ function edit_administrator($row){ $text .= checkb("E", $a_perms).ADMSLAN_30."
"; // Configure news feed headlines $text .= checkb("F", $a_perms).ADMSLAN_31."
"; // Configure emoticons $text .= checkb("G", $a_perms).ADMSLAN_32."
"; // Configure front page content - $text .= checkb("S", $a_perms).ADMSLAN_33."
"; // Configure log/stats + $text .= checkb("S", $a_perms).ADMSLAN_33."
"; // Configure system logs (previously log/stats - now plugin) $text .= checkb("T", $a_perms).ADMSLAN_34."
"; // Configure meta tags $text .= checkb("V", $a_perms).ADMSLAN_35."
"; // Configure public file uploads $text .= checkb("X", $a_perms).ADMSLAN_66."
"; // Configure Search diff --git a/e107_handlers/admin_log_class.php b/e107_handlers/admin_log_class.php index 3b2399892..90b0a81b7 100644 --- a/e107_handlers/admin_log_class.php +++ b/e107_handlers/admin_log_class.php @@ -12,8 +12,8 @@ | GNU General Public License (http://gnu.org). | | $Source: /cvs_backup/e107_0.8/e107_handlers/admin_log_class.php,v $ -| $Revision: 1.4 $ -| $Date: 2007-12-09 16:42:23 $ +| $Revision: 1.5 $ +| $Date: 2007-12-15 15:06:40 $ | $Author: e107steved $ To do: @@ -59,13 +59,25 @@ class e_admin_log { define("E_LOG_INFORMATIVE", 0); // Minimal Log Level, including really minor stuff define("E_LOG_NOTICE", 1); // More important than informative, but less important than notice define("E_LOG_WARNING", 2); // Not anything serious, but important information - define("E_LOG_FATAL", 3); // An event so bad your site ceased execution. + define("E_LOG_FATAL", 3); // An event so bad your site ceased execution. define("E_LOG_PLUGIN", 4); // Plugin information // Logging actions define("LOG_TO_ADMIN", 1); define("LOG_TO_AUDIT", 2); define("LOG_TO_ROLLING", 4); + + // User audit logging (intentionally start at 10 - stick to 2 digits) + define('USER_AUDIT_ADMIN',10); // User data changed by admin + define('USER_AUDIT_SIGNUP',11); // User signed up + define('USER_AUDIT_EMAILACK',12); // User responded to registration email + define('USER_AUDIT_LOGIN',13); // User logged in + define('USER_AUDIT_LOGOUT',14); // User logged out + define('USER_AUDIT_NEW_DN',15); // User changed display name + define('USER_AUDIT_NEW_PW',16); // User changed password + define('USER_AUDIT_NEW_EML',17); // User changed email + define('USER_AUDIT_PW_RES',18); // Password reset + define('USER_AUDIT_NEW_SET',19); // User changed other settings (intentional gap in numbering) } /** @@ -136,9 +148,8 @@ class e_admin_log { $importance = $tp->toDB($importance,true,false,'no_html'); $eventcode = $tp->toDB($eventcode,true,false,'no_html'); - $explain = $tp->toDB($explain,true,false,'no_html'); + $explain = mysql_real_escape_string($tp->toDB($explain,true,false,'no_html')); $event_title = $tp->toDB($event_title,true,false,'no_html'); - $source_call = $tp->toDB($source_call,true,false,'no_html'); //--------------------------------------- @@ -146,7 +157,8 @@ class e_admin_log { //--------------------------------------- if ($target_logs & LOG_TO_ADMIN) { // Admin log - assume all fields valid - $this->rldb->db_Insert("dblog", " 0, ".intval($time_usec).','.intval($time_sec).", '{$importance}', '{$eventcode}', {$userid}, '{$userIP}', '{$event_title}', '{$explain}' "); + $qry = " 0, ".intval($time_sec).','.intval($time_usec).", '{$importance}', '{$eventcode}', {$userid}, '{$userIP}', '{$event_title}', '{$explain}' "; + $this->rldb->db_Insert("dblog",$qry); } @@ -177,10 +189,10 @@ class e_admin_log { } - if (is_array($source_call)) - { // Print the debug_backtrace() array - while ($i < $back_count) - { + if (is_array($source_call)) + { // Print the debug_backtrace() array + while ($i < $back_count) + { $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 $tmp = $source_call[$i]['file']."|".$source_call[$i]['class'].$source_call[$i]['type'].$source_call[$i]['function']."@".$source_call[$i]['line']; @@ -191,14 +203,15 @@ class e_admin_log { $i++; if ($i < $back_count) $explain .= "
-------------------"; if (!isset($tmp1)) $tmp1 = $tmp; // Pick off the immediate caller as the source - } - if (isset($tmp1)) $source_call = $tmp1; else $source_call = 'Root level'; - } - else - { - $source_call = $e107->fix_windows_paths($source_call); // Needed for Windoze hosts. - $source_call = str_replace($e107->file_path,"",$source_call); // We really just want a e107 root-relative path. Strip out the root bit } + if (isset($tmp1)) $source_call = $tmp1; else $source_call = 'Root level'; + } + else + { + $source_call = $e107->fix_windows_paths($source_call); // Needed for Windoze hosts. + $source_call = str_replace($e107->file_path,"",$source_call); // We really just want a e107 root-relative path. Strip out the root bit + $source_call = $tp->toDB($source_call,true,false,'no_html'); + } // else $source_call is a string // Save new rolling log record @@ -212,6 +225,40 @@ class e_admin_log { } +//-------------------------------------- +// USER AUDIT ENTRY +//-------------------------------------- +// $event_code is a defined constant (see above) which specifies the event +// $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) +// $id and $u_name are left blank except for admin edits and user login, where they specify the id and login name of the 'target' user + function user_audit($event_type, $event_data, $id = '', $u_name = '') + { + global $e107, $tp; + list($time_usec, $time_sec) = explode(" ", microtime()); // Log event time immediately to minimise uncertainty + + // See whether we should log this + $user_logging_opts = array_flip(explode(',',varset($pref['user_audit_opts'],''))); + if (!isset($user_logging_opts[$event_type])) return; // Finished if not set to log this event type + + + if ($this->rldb == NULL) $this->rldb = new db; // Better use our own db - don't know what else is going on + + if ($id) $userid = $id; else $userid = (USER === TRUE) ? USERID : 0; + if ($u_name) $userstring = $u_name; else $userstring = ( USER === true ? USERNAME : "LAN_ANONYMOUS"); + $userIP = $e107->getip(); + $eventcode = 'USER_'.$event_type; + + $title = 'LAN_AUDIT_LOG_0'.$event_type; // This creates a string which will be displayed as a constant + $spacer = ''; + $detail = ''; + foreach ($event_data as $k => $v) + { + $detail .= $spacer.$k.'=>'.$v; + $spacer = '
'; + } + $this->rldb->db_Insert("audit_log","0, ".intval($time_sec).', '.intval($time_usec).", '{$eventcode}', {$userid}, '{$userstring}', '{$userIP}', '{$title}', '{$detail}' "); + } + function get_log_events($count = 15, $offset) { diff --git a/e107_handlers/login.php b/e107_handlers/login.php index f9eb2fe70..8bd534214 100644 --- a/e107_handlers/login.php +++ b/e107_handlers/login.php @@ -12,8 +12,8 @@ | GNU General Public License (http://gnu.org). | | $Source: /cvs_backup/e107_0.8/e107_handlers/login.php,v $ -| $Revision: 1.8 $ -| $Date: 2007-12-09 16:42:23 $ +| $Revision: 1.9 $ +| $Date: 2007-12-15 15:06:40 $ | $Author: e107steved $ +----------------------------------------------------------------------------+ */ @@ -105,48 +105,79 @@ class userlogin { else { // User is OK as far as core is concerned // $admin_log->e_log_event(4,__FILE__."|".__FUNCTION__."@".__LINE__,"DBG","User login",'User passed basics',FALSE,LOG_TO_ROLLING); - $ret = $e_event->trigger("preuserlogin", $username); - if ($ret!='') + $ret = $e_event->trigger("preuserlogin", $username); + if ($ret!='') + { + define("LOGINMESSAGE", $ret."

"); + return FALSE; + } + else + { // Trigger events happy as well + $lode = $sql -> db_Fetch(); // Get user info + $user_id = $lode['user_id']; + $user_name = $lode['user_name']; + $user_xup = $lode['user_xup']; + + /* restrict more than one person logging in using same us/pw */ + if($pref['disallowMultiLogin']) { - define("LOGINMESSAGE", $ret."

"); + if($sql -> db_Select("online", "online_ip", "online_user_id='".$user_id.".".$user_name."'")) + { + define("LOGINMESSAGE", LAN_304."

"); + $sql -> db_Insert("generic", "0, 'failed_login', '".time()."', 0, '$fip', '$user_id', '".LAN_LOGIN_16." ::: ".LAN_LOGIN_1.": ".$tp -> toDB($username).", ".LAN_LOGIN_17.": ".md5($ouserpass)."' "); + $this -> checkibr($fip); return FALSE; - } - else - { // Trigger events happy as well - $lode = $sql -> db_Fetch(); // Get user info - $user_id = $lode['user_id']; - $user_name = $lode['user_name']; - $user_xup = $lode['user_xup']; + } + } - /* restrict more than one person logging in using same us/pw */ - if($pref['disallowMultiLogin']) + $cookieval = $user_id.".".md5($userpass); + if($user_xup) + { + $this->update_xup($user_id, $user_xup); + } + + if ($pref['user_tracking'] == "session") + { + $_SESSION[$pref['cookie_name']] = $cookieval; + } + else + { + if ($autologin == 1) { - if($sql -> db_Select("online", "online_ip", "online_user_id='".$user_id.".".$user_name."'")) - { - define("LOGINMESSAGE", LAN_304."

"); - $sql -> db_Insert("generic", "0, 'failed_login', '".time()."', 0, '$fip', '$user_id', '".LAN_LOGIN_16." ::: ".LAN_LOGIN_1.": ".$tp -> toDB($username).", ".LAN_LOGIN_17.": ".md5($ouserpass)."' "); - $this -> checkibr($fip); - return FALSE; - } + cookie($pref['cookie_name'], $cookieval, (time() + 3600 * 24 * 30)); + } + else + { + cookie($pref['cookie_name'], $cookieval); } + } + + // User login definitely accepted here - $cookieval = $user_id.".".md5($userpass); - if($user_xup) { - $this->update_xup($user_id, $user_xup); - } - if ($pref['user_tracking'] == "session") { - $_SESSION[$pref['cookie_name']] = $cookieval; - } else { - if ($autologin == 1) { - cookie($pref['cookie_name'], $cookieval, (time() + 3600 * 24 * 30)); - } else { - cookie($pref['cookie_name'], $cookieval); - } + // Calculate class membership - needed for a couple of things + $class_list = explode(',',$lode['user_class']); + if ($lode['user_admin'] && strlen($lode['user_perms'])) + { + $class_list[] = e_UC_ADMIN; + if (strpos($lode['user_perms'],'0') === 0) + { + $class_list[] = e_UC_MAINADMIN; } - $edata_li = array("user_id" => $user_id, "user_name" => $username); - $e_event->trigger("login", $edata_li); - $redir = (e_QUERY ? e_SELF."?".e_QUERY : e_SELF); + } + $class_list[] = e_UC_MEMBER; + $class_list[] = e_UC_PUBLIC; + + $user_logging_opts = array_flip(explode(',',varset($pref['user_audit_opts'],''))); + if (isset($user_logging_opts[USER_AUDIT_LOGIN]) && in_array(varset($pref['user_audit_class'],''),$class_list)) + { // Need to note in user audit trail + $admin_log->user_audit(USER_AUDIT_LOGIN,'', $user_id,$user_name); + } + + $edata_li = array("user_id" => $user_id, "user_name" => $username); + $e_event->trigger("login", $edata_li); + $redir = (e_QUERY ? e_SELF."?".e_QUERY : e_SELF); + if (isset($pref['frontpage_force']) && is_array($pref['frontpage_force'])) @@ -155,17 +186,6 @@ class userlogin { $lode['user_perms'] = trim($lode['user_perms']); // $log_info = "New user: ".$lode['user_name']." Class: ".$lode['user_class']." Admin: ".$lode['user_admin']." Perms: ".$lode['user_perms']; // $admin_log->e_log_event(4,__FILE__."|".__FUNCTION__."@".__LINE__,"DBG","Login Start",$log_info,FALSE,FALSE); - $class_list = explode(',',$lode['user_class']); - if ($lode['user_admin'] && strlen($lode['user_perms'])) - { - $class_list[] = e_UC_ADMIN; - if (('0'==$lode['user_perms']) || ('0.' == $lode['user_perms'])) - { - $class_list[] = e_UC_MAINADMIN; - } - } - $class_list[] = e_UC_MEMBER; - $class_list[] = e_UC_PUBLIC; // $admin_log->e_log_event(4,__FILE__."|".__FUNCTION__."@".__LINE__,"DBG","New User class",implode(',',$class_list),FALSE,FALSE); foreach ($pref['frontpage_force'] as $fk=>$fp) { diff --git a/e107_languages/English/admin/lan_admin.php b/e107_languages/English/admin/lan_admin.php index 197289bce..df336035e 100644 --- a/e107_languages/English/admin/lan_admin.php +++ b/e107_languages/English/admin/lan_admin.php @@ -4,8 +4,8 @@ | e107 website system - Language File. | | $Source: /cvs_backup/e107_0.8/e107_languages/English/admin/lan_admin.php,v $ -| $Revision: 1.5 $ -| $Date: 2007-07-03 19:22:08 $ +| $Revision: 1.6 $ +| $Date: 2007-12-15 15:06:40 $ | $Author: e107steved $ +----------------------------------------------------------------------------+ */ @@ -175,6 +175,9 @@ define("ADLAN_152", "Enter Code"); define("ADLAN_153", "Administration Area"); define('ADLAN_154', "Error contacting Sourceforge to check for new version"); +define('ADLAN_155', 'System Logs'); +define('ADLAN_156', 'Admin log, user audit, rolling log'); + define('ADLAN_CL_1', 'Settings'); define('ADLAN_CL_2', 'Users'); define('ADLAN_CL_3', 'Content'); @@ -255,7 +258,6 @@ define("LAN_INACTIVE","Inactive"); define("LAN_BAN","Ban"); define("LAN_RATING", "Rating"); -define("LAN_UPLOAD", "Upload"); define("LAN_UPLOAD_IMAGES","Upload Images"); define("LAN_UPLOAD_FILES","Upload Files"); define("LAN_UPLOAD_ADDFILE","Add Another File"); diff --git a/e107_languages/English/admin/lan_admin_log.php b/e107_languages/English/admin/lan_admin_log.php index 0ed7cb9c9..11717c221 100644 --- a/e107_languages/English/admin/lan_admin_log.php +++ b/e107_languages/English/admin/lan_admin_log.php @@ -1,27 +1,71 @@ \ No newline at end of file diff --git a/e107_languages/English/admin/lan_administrator.php b/e107_languages/English/admin/lan_administrator.php index fbf57b169..470b8e0d1 100644 --- a/e107_languages/English/admin/lan_administrator.php +++ b/e107_languages/English/admin/lan_administrator.php @@ -4,9 +4,9 @@ | e107 website system - Language File. | | $Source: /cvs_backup/e107_0.8/e107_languages/English/admin/lan_administrator.php,v $ -| $Revision: 1.1.1.1 $ -| $Date: 2006-12-02 04:34:40 $ -| $Author: mcfly_e107 $ +| $Revision: 1.2 $ +| $Date: 2007-12-15 15:06:40 $ +| $Author: e107steved $ +----------------------------------------------------------------------------+ */ define("ADMSLAN_0", "New user/admin entry created for"); @@ -37,7 +37,7 @@ define("ADMSLAN_29", "Manage banners"); define("ADMSLAN_30", "Configure news feed headlines"); define("ADMSLAN_31", "Configure emoticons"); define("ADMSLAN_32", "Configure front page content"); -define("ADMSLAN_33", "Configure log/stats"); +define("ADMSLAN_33", "Configure system logging"); define("ADMSLAN_34", "Configure meta tags"); define("ADMSLAN_35", "Configure public file uploads"); define("ADMSLAN_36", "Configure Image Settings"); diff --git a/e107_languages/English/lan_fpw.php b/e107_languages/English/lan_fpw.php index a0d058882..0aa13afad 100644 --- a/e107_languages/English/lan_fpw.php +++ b/e107_languages/English/lan_fpw.php @@ -4,9 +4,9 @@ | e107 website system - Language File. | | $Source: /cvs_backup/e107_0.8/e107_languages/English/lan_fpw.php,v $ -| $Revision: 1.2 $ -| $Date: 2007-12-13 01:01:35 $ -| $Author: e107coders $ +| $Revision: 1.3 $ +| $Date: 2007-12-15 15:06:40 $ +| $Author: e107steved $ +----------------------------------------------------------------------------+ */ define("PAGE_NAME", "Password Reset"); @@ -18,7 +18,7 @@ define("LAN_06", "Attempted password reset"); define("LAN_07", "Someone with IP address "); define("LAN_08", "attempted to reset the main admin password."); define("LAN_09", "Password reset from "); -define("LAN_112", "Email address used when signing up"); +define("LAN_112", 'Email address registered on this site'); define("LAN_156", "Submit"); define("LAN_213", "That username/email address was not found in database."); define("LAN_214", "Unable to reset password"); @@ -44,5 +44,11 @@ define("LAN_FPW14", "has been submitted by someone with the IP of"); define("LAN_FPW15", "This does not mean your password has yet been reset. You must navigate to the link shown below to complete the reset process."); define("LAN_FPW16", "If you did not request to have your password reset and you do NOT want it reset, you may simply ignore this email"); define("LAN_FPW17", "The link below will be valid for 48 hours."); +define('LAN_FPW18','Password reset requested'); +define('LAN_FPW19','Email send failed'); +define('LAN_FPW20','Email send succeeded'); +define('LAN_FPW21','User clicked on password reset link'); +define('LAN_FPW22',''); + ?> \ No newline at end of file diff --git a/e107_languages/English/lan_signup.php b/e107_languages/English/lan_signup.php index c1d55490f..1d431bb97 100644 --- a/e107_languages/English/lan_signup.php +++ b/e107_languages/English/lan_signup.php @@ -4,8 +4,8 @@ | e107 website system - Language File. | | $Source: /cvs_backup/e107_0.8/e107_languages/English/lan_signup.php,v $ -| $Revision: 1.9 $ -| $Date: 2007-11-11 21:52:37 $ +| $Revision: 1.10 $ +| $Date: 2007-12-15 15:06:40 $ | $Author: e107steved $ +----------------------------------------------------------------------------+ */ @@ -44,6 +44,18 @@ define("LAN_405", "This stage of registration is complete. You will receive a co define("LAN_406", "Thank you!"); define("LAN_407", "Please keep this email for your own information. Your password has been encrypted and cannot be retrieved if you misplace or forget it. You can however request a new password if this happens.\n\nThanks for your registration.\n\nFrom"); define("LAN_408", "A user with that email address already exists. Please use the 'forgot password' screen to retrieve your password."); + +define("LAN_409", "Invalid characters in username"); +define("LAN_410", "Enter code visible in the image"); +define("LAN_411", "That display name already exists in the database, please choose a different display name"); + + +define("LAN_EMAIL_01", "Dear"); +define("LAN_EMAIL_04", "Please keep this email for your own information."); +define("LAN_EMAIL_05", "Your password has been encrypted and cannot be retrieved if you misplace or forget it. You can however request a new password if this happens."); +define("LAN_EMAIL_06", "Thanks for your registration."); + + define("LAN_SIGNUP_1", "Min."); define("LAN_SIGNUP_2", "chars."); define("LAN_SIGNUP_3", "Code verification failed."); @@ -55,12 +67,6 @@ define("LAN_SIGNUP_8", "Thank you!"); define("LAN_SIGNUP_9", "Unable to proceed."); define("LAN_SIGNUP_10", "Yes"); define("LAN_SIGNUP_11", "."); - -define("LAN_409", "Invalid characters in username"); -define("LAN_410", "Enter code visible in the image"); -define("LAN_411", "That display name already exists in the database, please choose a different display name"); - - define("LAN_SIGNUP_12", "please keep your username and password written down in a safe place as if lost they cannot be retrieved."); define("LAN_SIGNUP_13", "You can now log in from the Login box, or from here."); define("LAN_SIGNUP_14", "here"); @@ -80,27 +86,15 @@ define("LAN_SIGNUP_27", "Show"); define("LAN_SIGNUP_28", "choice of Content/Mail-lists"); define("LAN_SIGNUP_29", "A verification email will be sent to the email address you enter here so it must be valid."); define("LAN_SIGNUP_30", "If you do not wish to display your email address on this site, please tick the 'hide email address' box."); - define("LAN_SIGNUP_31", "URL to your XUP file"); define("LAN_SIGNUP_32", "What's an XUP file?"); define("LAN_SIGNUP_33", "Type path or choose avatar"); define("LAN_SIGNUP_34", "Please note: Any image uploaded to this server that is deemed inappropriate by the administrators will be deleted immediately."); define("LAN_SIGNUP_35", "Click here to register using an XUP file"); define("LAN_SIGNUP_36", "An error has occurred creating your user information, please contact the site admin"); - -define("LAN_LOGINNAME", "Username"); -define("LAN_PASSWORD", "Password"); -define("LAN_USERNAME", "Display Name"); -define("LAN_EMAIL_01", "Dear"); -define("LAN_EMAIL_04", "Please keep this email for your own information."); -define("LAN_EMAIL_05", "Your password has been encrypted and cannot be retrieved if you misplace or forget it. You can however request a new password if this happens."); -define("LAN_EMAIL_06", "Thanks for your registration."); - define("LAN_SIGNUP_37", "This stage of registration is complete. The site admin will need to approve your membership. Once this has been done you will receive a confirmation email alerting you that your membership has been approved."); define("LAN_SIGNUP_38", "You entered two different email addresses. Please enter a valid email address in the two fields provided"); define("LAN_SIGNUP_39", "Re-type Email Address:"); - -// 0.7.6 define("LAN_SIGNUP_40", "Activation not necessary"); define("LAN_SIGNUP_41", "Your account is already activated."); define("LAN_SIGNUP_42", "There was a problem, the registration mail was not sent, please contact the website administrator."); @@ -120,6 +114,21 @@ define("LAN_SIGNUP_56", "That display name is too short. Please choose another") define("LAN_SIGNUP_57", "That login name is too long. Please choose another"); define("LAN_SIGNUP_58", "Signup Preview"); define("LAN_SIGNUP_59","**** If the link doesn't work, please check that part of it has not overflowed onto the next line. ****"); +define('LAN_SIGNUP_60','Signup email resend requested'); +define('LAN_SIGNUP_61','Send succeeded'); +define('LAN_SIGNUP_62','Send failed'); +define('LAN_SIGNUP_63','Password reset email resent requested'); +define('LAN_SIGNUP_64',''); +define('LAN_SIGNUP_65',''); +define('LAN_SIGNUP_66',''); +define('LAN_SIGNUP_67',''); +define('LAN_SIGNUP_68',''); +define('LAN_SIGNUP_69',''); +define('LAN_SIGNUP_70',''); + +define("LAN_LOGINNAME", "Username"); +define("LAN_PASSWORD", "Password"); +define("LAN_USERNAME", "Display Name"); ?> diff --git a/e107_languages/English/lan_usersettings.php b/e107_languages/English/lan_usersettings.php index 052215bf7..3bcad1173 100644 --- a/e107_languages/English/lan_usersettings.php +++ b/e107_languages/English/lan_usersettings.php @@ -4,8 +4,8 @@ | e107 website system - Language File. | | $Source: /cvs_backup/e107_0.8/e107_languages/English/lan_usersettings.php,v $ -| $Revision: 1.9 $ -| $Date: 2007-08-16 19:19:43 $ +| $Revision: 1.10 $ +| $Date: 2007-12-15 15:06:40 $ | $Author: e107steved $ +----------------------------------------------------------------------------+ */ @@ -82,10 +82,6 @@ define("LAN_SIGNUP_5", " characters long."); define("LAN_SIGNUP_6", "Your "); define("LAN_SIGNUP_7", " is required"); -define("LAN_USET_1", "Your avatar is too wide"); -define("LAN_USET_2", "Maximum allowable width is"); -define("LAN_USET_3", "Your avatar is too high"); -define("LAN_USET_4", "Maximum allowable height is"); // v.616 define("LAN_CUSTOMTITLE", "Custom Title"); @@ -99,6 +95,10 @@ define("MAX_AVHEIGHT", " x "); define("RESIZE_NOT_SUPPORTED", "Resize method not supported by this server. Please resize image or choose another. File has been deleted."); // v0.7 +define("LAN_USET_1", "Your avatar is too wide"); +define("LAN_USET_2", "Maximum allowable width is"); +define("LAN_USET_3", "Your avatar is too high"); +define("LAN_USET_4", "Maximum allowable height is"); define("LAN_USET_5", "Subscribed to"); define("LAN_USET_6", "Subscribe to our mailing-list(s) and/or sections of this site."); define("LAN_USET_7", "Miscellaneous"); @@ -112,5 +112,8 @@ define("LAN_USET_14", "Login name too long. Please choose another"); define("LAN_USET_15", "Display name too long. Please choose another"); define("LAN_USET_16", "Tick box to delete existing photo without uploading another"); define("LAN_USET_17", "Display name already used. Please choose another"); +define('LAN_USET_18', 'User data changed by admin: --ID--, login name: --LOGNAME--'); +define('LAN_USET_19', ''); +define('LAN_USET_20', ''); ?> \ No newline at end of file diff --git a/fpw.php b/fpw.php index 57c3488f6..dc66f13fa 100644 --- a/fpw.php +++ b/fpw.php @@ -11,9 +11,9 @@ | GNU General Public License (http://gnu.org). | | $Source: /cvs_backup/e107_0.8/fpw.php,v $ -| $Revision: 1.3 $ -| $Date: 2007-12-13 01:01:35 $ -| $Author: e107coders $ +| $Revision: 1.4 $ +| $Date: 2007-12-15 15:06:40 $ +| $Author: e107steved $ +----------------------------------------------------------------------------+ */ require_once("class2.php"); @@ -58,14 +58,18 @@ function fpw_error($txt) { exit; } -//the seperator character used +//the separator character used $fpw_sep = "#"; -if (e_QUERY) { + + +if (e_QUERY) +{ // User has clicked on link to reset password define("FPW_ACTIVE","TRUE"); $tmp = explode($fpw_sep, e_QUERY); $tmpinfo = preg_replace("#[\W_]#", "", $tp -> toDB($tmp[0], true)); - if ($sql->db_Select("tmp", "*", "tmp_info LIKE '%{$fpw_sep}{$tmpinfo}' ")) { + if ($sql->db_Select("tmp", "*", "tmp_info LIKE '%{$fpw_sep}{$tmpinfo}' ")) + { $row = $sql->db_Fetch(); extract($row); $sql->db_Delete("tmp", "tmp_info LIKE '%{$fpw_sep}{$tmpinfo}' "); @@ -76,8 +80,15 @@ if (e_QUERY) { } $mdnewpw = md5($newpw); + // Details for admin log + $do_log['password_action'] = LAN_FPW21; + $do_log['user_name'] = $tp -> toDB($username, true); + $do_log['activation_code'] = $tmpinfo; + $do_log['user_password'] = $mdnewpw; + $admin_log->user_audit(USER_AUDIT_PW_RES,$do_log,0,$do_log['user_name']); + list($username, $md5) = explode($fpw_sep, $tmp_info); - $sql->db_Update("user", "user_password='$mdnewpw', user_viewed='' WHERE user_name='".$tp -> toDB($username, true)."' "); + $sql->db_Update("user", "user_password='{$mdnewpw}', user_viewed='' WHERE user_name='".$tp -> toDB($username, true)."' "); cookie($pref['cookie_name'], "", (time()-2592000)); $_SESSION[$pref['cookie_name']] = ""; @@ -94,11 +105,16 @@ if (e_QUERY) { } } -if (isset($_POST['pwsubmit'])) { + +// Request to reset password +//-------------------------- +if (isset($_POST['pwsubmit'])) +{ require_once(e_HANDLER."mail.php"); $email = $_POST['email']; - if ($pref['fpwcode'] && extension_loaded("gd")) { + if ($pref['fpwcode'] && extension_loaded("gd")) + { if (!$sec_img->verify_code($_POST['rand_num'], $_POST['code_verify'])) { fpw_error(LAN_FPW3); } @@ -110,19 +126,22 @@ if (isset($_POST['pwsubmit'])) { // Allow admins to remove 'username' from fpw_template.php if they wish. $query .= (isset($_POST['username'])) ? " AND user_loginname='{$clean_username}'" : ""; - if ($sql->db_Select("user", "*", $query)) { + if ($sql->db_Select("user", "*", $query)) + { $row = $sql->db_Fetch(); - extract($row); + extract($row); - if ($user_admin == 1 && $user_perms == "0") { + if ($user_admin == 1 && $user_perms == "0") + { // Main admin expected to be competent enough to never forget password! (And its a security check - so warn them) sendemail($pref['siteadminemail'], LAN_06, LAN_07."".$e107->getip()." ".LAN_08); echo "\n"; die(); } - if ($sql->db_Select("tmp", "*", "tmp_ip = 'pwreset' AND tmp_info LIKE '{$user_name}{$fpw_sep}%'")) { - fpw_error(LAN_FPW4); - exit; + if ($sql->db_Select("tmp", "*", "tmp_ip = 'pwreset' AND tmp_info LIKE '{$user_name}{$fpw_sep}%'")) + { + fpw_error(LAN_FPW4); + exit; } mt_srand ((double)microtime() * 1000000); @@ -139,17 +158,30 @@ if (isset($_POST['pwsubmit'])) { //Set timestamp two days ahead so it doesn't get auto-deleted $sql->db_Insert("tmp", "'pwreset',{$deltime},'{$user_name}{$fpw_sep}{$rcode}'"); + $do_log['password_action'] = LAN_FPW18; + $do_log['user_id'] = $row['user_id']; + $do_log['user_name'] = $row['user_name']; + $do_log['user_loginname'] = $row['user_loginname']; + $do_log['activation_code'] = $rcode; - if (sendemail($_POST['email'], "".LAN_09."".SITENAME, $message)) { - $text = "
".LAN_FPW6."
"; - } else { - $text = "
".LAN_02."
"; + if (sendemail($_POST['email'], "".LAN_09."".SITENAME, $message)) + { + $text = "
".LAN_FPW6."
"; + $do_log['password_result'] = LAN_FPW20; + } + else + { + $text = "
".LAN_02."
"; + $do_log['password_result'] = LAN_FPW19; } + $admin_log->user_audit(USER_AUDIT_PW_RES,$do_log,$row['user_id'],$row['user_name']); $ns->tablerender(LAN_03, $text); require_once(FOOTERF); exit; - } else { + } + else + { $text = LAN_213; $ns->tablerender(LAN_214, "
".$text."
"); } diff --git a/signup.php b/signup.php index 37ee4a9a8..032e8c614 100644 --- a/signup.php +++ b/signup.php @@ -11,8 +11,8 @@ | GNU General Public License (http://gnu.org). | | $Source: /cvs_backup/e107_0.8/signup.php,v $ -| $Revision: 1.12 $ -| $Date: 2007-12-09 16:42:22 $ +| $Revision: 1.13 $ +| $Date: 2007-12-15 15:06:40 $ | $Author: e107steved $ +----------------------------------------------------------------------------+ */ @@ -40,6 +40,7 @@ include_once(e_FILE."shortcode/batch/signup_shortcodes.php"); $signup_imagecode = ($pref['signcode'] && extension_loaded("gd")); + //------------------------------- // Resend Activation Email //------------------------------- @@ -100,24 +101,22 @@ if(e_QUERY == "resend" && !USER && ($pref['user_reg_veri'] == 1)) $mailheader_e107id = $nid; require_once(e_HANDLER."mail.php"); -/* - echo "Sending to: ".$row['user_email']; - require_once(FOOTERF); - exit; -*/ + $do_log['signup_action'] = LAN_SIGNUP_63; if(!sendemail($row['user_email'], $eml['subject'], $eml['message'], $row['user_name'], "", "", $eml['attachments'], $eml['cc'], $eml['bcc'], $returnpath, $returnreceipt,$eml['inline-images'])) { - $ns -> tablerender(LAN_ERROR,LAN_SIGNUP_42); - require_once(FOOTERF); - exit; + $ns -> tablerender(LAN_ERROR,LAN_SIGNUP_42); + $do_log['signup_result'] = LAN_SIGNUP_62; } else { $ns -> tablerender(LAN_SIGNUP_43,LAN_SIGNUP_44." ".$row['user_email']." - ".LAN_SIGNUP_45."

"); - require_once(FOOTERF); - exit; + $do_log['signup_result'] = LAN_SIGNUP_61; } + // Now log this (log will ignore if its disabled) + $admin_log->user_audit(USER_AUDIT_PW_RES,$do_log,$row['user_id'],$row['user_name']); + require_once(FOOTERF); + exit; } require_once(e_HANDLER."message_handler.php"); @@ -284,7 +283,7 @@ if (e_QUERY) if ($qs[0] == "activate" && (count($qs) == 3 || count($qs) == 4) && $qs[2]) { // return the message in the correct language. - if($qs[3] && strlen($qs[3]) == 2 ) + if(isset($qs[3]) && strlen($qs[3]) == 2 ) { require_once(e_HANDLER."language_class.php"); $lng = new language; @@ -321,6 +320,10 @@ if (e_QUERY) } } $sql->db_Update("user", "user_ban='0', user_sess=''{$init_classes} WHERE user_sess='".$tp -> toDB($qs[2], true)."' "); + + // Log to user audit log if enabled + $admin_log->user_audit(USER_AUDIT_EMAILACK,$row); + $e_event->trigger("userveri", $row); require_once(HEADERF); $text = LAN_401." ".LAN_SIGNUP_22." ".LAN_SIGNUP_23."
".LAN_SIGNUP_24." ".SITENAME; @@ -688,6 +691,17 @@ global $db_debug; $u_key = md5(uniqid(rand(), 1)); // ************* Possible class insert $nid = $sql->db_Insert("user", "0, '{$username}', '{$loginname}', '', '".md5($_POST['password1'])."', '{$u_key}', '".$tp -> toDB($_POST['email'])."', '".$tp -> toDB($_POST['signature'])."', '".$tp -> toDB($_POST['image'])."', '".$tp -> toDB($_POST['timezone'])."', '".$tp -> toDB($_POST['hideemail'])."', '".$time."', '0', '".$time."', '0', '0', '0', '0', '".$ip."', '2', '0', '', '', '0', '0', '".$tp -> toDB($_POST['realname'])."', '', '', '', '0', '".$tp -> toDB($_POST['xupexist'])."' "); + + // Log to user audit log if enabled + $admin_log->user_audit(USER_AUDIT_SIGNUP,array( + 'user_id' => $nid, + 'user_name' => $username, + 'user_loginname' => $loginname, + 'user_email' => $tp -> toDB($_POST['email']), + 'user_realname' => $tp -> toDB($_POST['realname']), + 'signup_key' => $u_key + )); + if(!$nid) { require_once(HEADERF); diff --git a/usersettings.php b/usersettings.php index 1de988c83..8459da8c9 100644 --- a/usersettings.php +++ b/usersettings.php @@ -11,12 +11,39 @@ | GNU General Public License (http://gnu.org). | | $Source: /cvs_backup/e107_0.8/usersettings.php,v $ -| $Revision: 1.17 $ -| $Date: 2007-12-09 22:38:27 $ +| $Revision: 1.18 $ +| $Date: 2007-12-15 15:06:40 $ | $Author: e107steved $ + +Mods to give a uniform interface. + + +To do: +1. Check that photo can be updated/deleted OK +3. Make sure all $_POST values go through $tp->toDB - currently display name, login name don't - that's the way it was +4. Make sure displayname and loginname kept in sync where not permitted to be different +5. Check whether customtitle needs a special look to obey an option - currently updated in two places; check which is required +6. XUP update - there's a bit of code which calls userlogin::update_xup() which looks relevant - BUT: + a) It allows update of user_login field + b) Possible error on {EMAILHIDE} - should it be {$EMAILHIDE} ? + c) That code will update the user record regardless of whether there are values in the XUP file - so could become null +7. When restoring $_POST values after an error (just before display) they should all have been vetted - should be done, but double check +8. Check the use of 'class' around line 190 - if left, the message doesn't make total sense. Not sure the feature makes sense anyway. +9. No means of retaining name of photo file through an error? +10. Can get editable classes from the userclass object in 0.8 +11. Check its acceptable to, on the whole, not update a field which is empty but for which $_POST[] value exists +12. Run through list of fields in DB; make sure all can be updated where needed +14. Add admin log entry for when admin changing data +15. Check class memberships - possible that main admin made a member of all (may be an inherited userclass issue) + +Notes: +$pref['forum_user_customtitle'] - used and saved in central record; set in forum interface +Uses $udata initially, later curVal to hold current user data +----------------------------------------------------------------------------+ */ +//echo "Starting usersettings
"; + require_once("class2.php"); require_once(e_HANDLER."ren_help.php"); require_once(e_HANDLER."user_extended_class.php"); @@ -24,8 +51,11 @@ $ue = new e107_user_extended; //define("US_DEBUG",TRUE); define("US_DEBUG",FALSE); +//echo "Loaded includes
"; +/* +These links look redundant if (isset($_POST['sub_news'])) { header("location:".e_BASE."submitnews.php"); @@ -51,26 +81,30 @@ if (isset($_POST['sub_review'])) { header("location:".e_BASE."subcontent.php?review"); exit; } +*/ -if (!USER) { - header("location:".e_BASE."index.php"); - exit; + +if (!USER) +{ // Must be logged in to change settings + header("location:".e_BASE."index.php"); + exit; } -if (!ADMIN && e_QUERY && e_QUERY != "update") { - header("location:".e_BASE."usersettings.php"); - exit; +if (!ADMIN && e_QUERY && e_QUERY != "update") +{ + header("location:".e_BASE."usersettings.php"); + exit; } require_once(e_HANDLER."ren_help.php"); if(is_readable(THEME."usersettings_template.php")) { - include_once(THEME."usersettings_template.php"); + include_once(THEME."usersettings_template.php"); } else { - include_once(e_THEME."templates/usersettings_template.php"); + include_once(e_THEME."templates/usersettings_template.php"); } include_once(e_FILE."shortcode/batch/usersettings_shortcodes.php"); @@ -80,27 +114,29 @@ $_uid = is_numeric(e_QUERY) ? intval(e_QUERY) : ""; $sesschange = ''; // Notice removal $photo_to_delete = ''; $avatar_to_delete = ''; +$changed_user_data = array(); require_once(HEADERF); -// Save user settings (whether or not changed) -//--------------------------------------------- +// Save user settings (changes only) +//----------------------------------- $error = ""; if (isset($_POST['updatesettings'])) { if(!varsettrue($pref['auth_method']) || $pref['auth_method'] == '>e107') { - $pref['auth_method'] = 'e107'; + $pref['auth_method'] = 'e107'; } if($pref['auth_method'] != 'e107') { - $_POST['password1'] = ''; - $_POST['password2'] = ''; + $_POST['password1'] = ''; + $_POST['password2'] = ''; } + if ($_uid && ADMIN) { // Admin logged in and editing another user's settings - so editing a different ID $inp = $_uid; @@ -112,31 +148,59 @@ if (isset($_POST['updatesettings'])) } + $udata = get_user_data($inp); // Get all the existing user data, including any extended fields + $peer = ($inp == USERID ? false : true); + + + + // Check external avatar - $_POST['image'] = str_replace(array('\'', '"', '(', ')'), '', $_POST['image']); // these are invalid anyway, so why allow them? (XSS Fix) - if ($_POST['image'] && $size = getimagesize($_POST['image'])) { + if ($_POST['image']) + { + $_POST['image'] = str_replace(array('\'', '"', '(', ')'), '', $_POST['image']); // these are invalid anyway, so why allow them? (XSS Fix) + if ($size = getimagesize($_POST['image'])) + { $avwidth = $size[0]; $avheight = $size[1]; $avmsg = ""; - $pref['im_width'] = ($pref['im_width']) ? $pref['im_width'] : 120; - $pref['im_height'] = ($pref['im_height']) ? $pref['im_height'] : 100; - if ($avwidth > $pref['im_width']) { - $avmsg .= LAN_USET_1." ($avwidth)
".LAN_USET_2.": {$pref['im_width']}

"; + $pref['im_width'] = varsettrue($pref['im_width'], 120); + $pref['im_height'] = varsettrue($pref['im_height'], 100); + if ($avwidth > $pref['im_width']) + { + $avmsg .= LAN_USET_1." ({$avwidth})
".LAN_USET_2.": {$pref['im_width']}

"; } - if ($avheight > $pref['im_height']) { - $avmsg .= LAN_USET_3." ($avheight)
".LAN_USET_4.": {$pref['im_height']}"; + if ($avheight > $pref['im_height']) + { + $avmsg .= LAN_USET_3." ({$avheight})
".LAN_USET_4.": {$pref['im_height']}"; } - if ($avmsg) { - $_POST['image'] = ""; - $error = $avmsg; + if ($avmsg) + { + $_POST['image'] = ""; + $error = $avmsg; } - + else + { + if ($_POST['image'] != $udata['user_image']) + { + $changed_user_data['user_image'] = $_POST['image']; + } + } + } + else + { // Invalid image file - we could just put up a message + } } + + + + // The 'class' option doesn't really make sense to me, but left it for now +// $signup_option_title = array(LAN_308, LAN_120, LAN_121, LAN_122); +// $signup_option_names = array("realname", "signature", "image", "timezone"); + $signup_option_title = array(LAN_308, LAN_120, LAN_121, LAN_122, LAN_USET_6); $signup_option_names = array("realname", "signature", "image", "timezone", "class"); - foreach($signup_option_names as $key => $value) { // Check required signup fields if ($pref['signup_option_'.$value] == 2 && !$_POST[$value] && !$_uid) @@ -146,74 +210,56 @@ if (isset($_POST['updatesettings'])) } -// Login Name checks - if (isset($_POST['loginname'])) + +// Login Name checks - only admin can change login name + if (isset($_POST['loginname']) && ADMIN && getperms("4")) { // Only check if its been edited - $temp_name = trim(preg_replace('/ |\#|\=|\$/', "", strip_tags($_POST['loginname']))); - if ($temp_name != $_POST['loginname']) + $loginname = trim(preg_replace('/ |\#|\=|\$/', "", strip_tags($_POST['loginname']))); + if ($loginname != $_POST['loginname']) { $error .= LAN_USET_13."\\n"; } // Check if login name exceeds maximum allowed length - if (strlen($temp_name) > varset($pref['loginname_maxlength'],30)) + if (strlen($loginname) > varset($pref['loginname_maxlength'],30)) { $error .= LAN_USET_14."\\n"; + } + if ($udata['user_loginname'] != $loginname) + { + $changed_user_data['user_loginname'] = $loginname; + } + else + { + unset($loginname); + } } - $_POST['loginname'] = $temp_name; - } + if (isset($loginname)) $_POST['loginname'] = $loginname; else unset($_POST['loginname']); // Make sure no change of the $_POST value staying set inappropriately -// Password checks - $pwreset = ""; - if ($_POST['password1'] != $_POST['password2']) { - $error .= LAN_105."\\n"; + + // Display name checks + // If display name == login name, it has to meet the criteria for both login name and display name + echo "Check_class: {$pref['displayname_class']}; {$udata['user_class']}; {$peer}
"; + if (check_class($pref['displayname_class'], $udata['user_class'], $peer)) + { // Display name can be different to login name - check display name if its been entered + if (isset($_POST['username'])) + { + $username = trim(strip_tags($_POST['username'])); + $_POST['username'] = $username; + echo "Found new display name: {$username}
"; + } } else - { - if(trim($_POST['password1']) != "") - { - $pwreset = "user_password = '".md5(trim($_POST['password1']))."', "; - } - } - - if(isset($pref['signup_disallow_text'])) - { - $tmp = explode(",", $pref['signup_disallow_text']); - foreach($tmp as $disallow){ - if(strstr($_POST['username'], $disallow)){ - $error .= LAN_USET_11."\\n"; - } - } - } - - if (strlen(trim($_POST['password1'])) < $pref['signup_pass_len'] && trim($_POST['password1']) != "") { - $error .= LAN_SIGNUP_4.$pref['signup_pass_len'].LAN_SIGNUP_5."\\n"; - $password1 = ""; - $password2 = ""; + { // Display name and login name must be the same - check only if the login name has been changed + if (varsettrue($loginname)) $username = $loginname; } - if (isset($pref['disable_emailcheck']) && $pref['disable_emailcheck']==1) - { - } else { - if (!check_email($_POST['email'])) - { - $error .= LAN_106."\\n"; - } - } - // Check for duplicate of email address - if ($sql->db_Select("user", "user_name, user_email", "user_email='".$tp -> toDB($_POST['email'])."' AND user_id !='".intval($inp)."' ")) - { - $error .= LAN_408."\\n"; - } - - -// Display name checks - if (isset($_POST['username'])) + if (varsettrue($username)) { + echo "Checking user name
"; // Impose a minimum length on display name - $username = trim(strip_tags($_POST['username'])); if (strlen($username) < 2) { $error .= LAN_USET_12."\\n"; @@ -223,95 +269,141 @@ if (isset($_POST['updatesettings'])) $error .= LAN_USET_15."\\n"; } + if(isset($pref['signup_disallow_text'])) + { + $tmp = explode(",", $pref['signup_disallow_text']); + foreach($tmp as $disallow) + { + if(stristr($username, trim($disallow))) + { + $error .= LAN_USET_11."\\n"; + } + } + } + // Display Name exists. if ($sql->db_Count("user", "(*)", "WHERE `user_name`='".$username."' AND `user_id` != '".intval($inp)."' ")) { $error .= LAN_USET_17; } + if ($username != $udata['user_name']) $changed_user_data['user_name'] = $username; + unset($username); } + +// Password checks + if ($_POST['password1'] != $_POST['password2']) + { + $error .= LAN_105."\\n"; + } + else + { + if(trim($_POST['password1']) != "") + { + if (strlen(trim($_POST['password1'])) < $pref['signup_pass_len']) + { + $error .= LAN_SIGNUP_4.$pref['signup_pass_len'].LAN_SIGNUP_5."\\n"; + } + $changed_user_data['user_password'] = md5(trim($_POST['password1'])); + } + } + + +// Email address checks + if (!varsettrue($pref['disable_emailcheck'])) + { + if (!check_email($_POST['email'])) + { + $error .= LAN_106."\\n"; + } + } + + // Check for duplicate of email address + if ($sql->db_Select("user", "user_name, user_email", "user_email='".$tp -> toDB($_POST['email'])."' AND user_id !='".intval($inp)."' ")) + { + $error .= LAN_408."\\n"; + } + + + // Uploaded avatar and/or photo - $user_sess = ""; if ($file_userfile['error'] != 4) { - require_once(e_HANDLER."upload_handler.php"); - require_once(e_HANDLER."resize_handler.php"); + require_once(e_HANDLER."upload_handler.php"); + require_once(e_HANDLER."resize_handler.php"); - if ($uploaded = file_upload(e_FILE."public/avatars/", "avatar")) - { - foreach ($uploaded as $upload) - { // Needs the latest upload handler (with legacy and 'future' interfaces) to work - if ($upload['name'] && ($upload['index'] == 'avatar') && $pref['avatar_upload']) + if ($uploaded = file_upload(e_FILE."public/avatars/", "avatar")) + { + foreach ($uploaded as $upload) + { // Needs the latest upload handler (with legacy and 'future' interfaces) to work + if ($upload['name'] && ($upload['index'] == 'avatar') && $pref['avatar_upload']) + { + // avatar uploaded - give it a reference which identifies it as server-stored + $_POST['image'] = "-upload-".$upload['name']; + if ($_POST['image'] != $udata['user_image']) { - // avatar uploaded - give it a reference which identifies it as server-stored - $_POST['image'] = "-upload-".$upload['name']; - if ($_POST['image'] != $currentUser['user_image']) - { - $avatar_to_delete = str_replace("-upload-", "", $currentUser['user_image']); -// echo "Avatar change; deleting {$avatar_to_delete}
"; - } - if (!resize_image(e_FILE."public/avatars/".$upload['name'], e_FILE."public/avatars/".$upload['name'], "avatar")) - { - unset($message); - $error .= RESIZE_NOT_SUPPORTED."\\n"; - @unlink(e_FILE."public/avatars/".$upload['name']); - $_POST['image'] = ''; - } + $avatar_to_delete = str_replace("-upload-", "", $udata['user_image']); +// echo "Avatar change; deleting {$avatar_to_delete}
"; + $changed_user_data['user_image'] = $_POST['image']; } - if ($upload['name'] && ($upload['index'] == 'photo') && $pref['photo_upload'] ) + if (!resize_image(e_FILE."public/avatars/".$upload['name'], e_FILE."public/avatars/".$upload['name'], "avatar")) { - // photograph uploaded - $user_sess = $upload['name']; - if (!resize_image(e_FILE."public/avatars/".$user_sess, e_FILE."public/avatars/".$user_sess, 180)) - { - unset($message); - $error .= RESIZE_NOT_SUPPORTED."\\n"; - @unlink(e_FILE."public/avatars/".$user_sess); - $user_sess = ''; - } + unset($message); + $error .= RESIZE_NOT_SUPPORTED."\\n"; + @unlink(e_FILE."public/avatars/".$upload['name']); + $_POST['image'] = ''; + unset($changed_user_data['user_image']); + } + } + + if ($upload['name'] && ($upload['index'] == 'photo') && $pref['photo_upload'] ) + { + // photograph uploaded + if ($udata['user_sess'] != $upload['name']) + { + $photo_to_delete = $udata['user_sess']; + $changed_user_data['user_sess'] = $upload['name']; + } + + if (!resize_image(e_FILE."public/avatars/".$upload['name'], e_FILE."public/avatars/".$upload['name'], 180)) + { + unset($message); + $error .= RESIZE_NOT_SUPPORTED."\\n"; + @unlink(e_FILE."public/avatars/".$upload['name']); + unset($changed_user_data['user_sess']); } } } + } } // See if user just wants to delete existing photo if (isset($_POST['user_delete_photo'])) { - $photo_to_delete = $currentUser['user_sess']; - $sesschange = "user_sess = '', "; + $photo_to_delete = $udata['user_sess']; + $changed_user_data['user_sess'] = ''; // echo "Just delete old photo: {$photo_to_delete}
"; } - elseif ($user_sess != "") - { // Update DB with photo - $sesschange = "user_sess = '".$tp->toDB($user_sess)."', "; - if ($currentUser['user_sess'] == $tp->toDB($user_sess)) - { - $sesschange = ''; // Same photo - do nothing -// echo "Photo not changed
"; - } - else - { - $photo_to_delete = $currentUser['user_sess']; -// echo "New photo: {$user_sess} Delete old photo: {$photo_to_delete}
"; - } - } + + // Validate Extended User Fields. if($_POST['ue']) { - if($sql->db_Select('user_extended_struct')) { - while($row = $sql->db_Fetch()) - { - $extList["user_".$row['user_extended_struct_name']] = $row; - } - } - - $ue_fields = ""; - foreach($_POST['ue'] as $key => $val) + if($sql->db_Select('user_extended_struct')) + { + while($row = $sql->db_Fetch()) { + $extList["user_".$row['user_extended_struct_name']] = $row; + } + } + + $ue_fields = ""; + foreach($_POST['ue'] as $key => $val) + { $err = false; $parms = explode("^,^", $extList[$key]['user_extended_struct_parms']); $regex = $tp->toText($parms[1]); @@ -336,12 +428,13 @@ if (isset($_POST['updatesettings'])) $ue_fields .= ($ue_fields) ? ", " : ""; $ue_fields .= $key."='".$val."'"; } - } + } } -// All validated here -// ------------------ + +// All key fields validated here +// ----------------------------- // $inp - UID of user whose data is being changed (may not be the currently logged in user) if (!$error) @@ -355,52 +448,14 @@ if (isset($_POST['updatesettings'])) $ret = $e_event->trigger("preuserset", $_POST); - if(trim($_POST['user_xup']) != "") - { - if($sql->db_Select('user', 'user_xup', "user_id = '".intval($inp)."'")) - { - $row = $sql->db_Fetch(); - $update_xup = ($row['user_xup'] != $_POST['user_xup']) ? TRUE : FALSE; - } - } - if ($ret == '') { - $udata = get_user_data($inp); // Get all the user data, including any extended fields - $peer = ($inp == USERID ? false : true); - - $loginname = strip_tags($_POST['loginname']); - if (!$loginname) - { -// $sql->db_Select("user", "user_loginname", "user_id='".intval($inp)."'"); -// $row = $sql -> db_Fetch(); - $loginname = $udata['user_loginname']; - } - else - { - if(!check_class($pref['displayname_class'], $udata['user_class'], $peer)) - { - $new_username = "user_name = '{$loginname}', "; - $username = $loginname; - } - } - -// if (isset($_POST['username']) && check_class($pref['displayname_class'])) - if (isset($_POST['username']) && check_class($pref['displayname_class'], $udata['user_class'], $peer)) - { // Allow change of display name if in right class - $username = strip_tags($_POST['username']); - $username = $tp->toDB(substr($username, 0, $pref['displayname_maxlength'])); - $new_username = "user_name = '{$username}', "; - } - - - $_POST['signature'] = $tp->toDB($_POST['signature']); - $_POST['realname'] = $tp->toDB($_POST['realname']); - + // Either delete this block, or delete user_customtitle from the later loop for non-vetted fields $new_customtitle = ""; if(isset($_POST['customtitle']) && ($pref['forum_user_customtitle'] || ADMIN)) { - $new_customtitle = ", user_customtitle = '".$tp->toDB($_POST['customtitle'])."' "; + $new_customtitle = $tp->toDB($_POST['customtitle']); + if ($new_customtitle != $udata['user_customtitle']) $changed_user_data['user_customtitle'] = $new_customtitle; } @@ -416,51 +471,39 @@ if (isset($_POST['updatesettings'])) } - // We can update the basic user record now - $sql->db_Update("user", "{$new_username} {$pwreset} {$sesschange} user_email='".$tp -> toDB($_POST['email'])."', user_signature='".$_POST['signature']."', user_image='".$tp -> toDB($_POST['image'])."', user_timezone='".$tp -> toDB($_POST['timezone'])."', user_hideemail='".intval($tp -> toDB($_POST['hideemail']))."', user_login='".$_POST['realname']."' {$new_customtitle}, user_xup='".$tp -> toDB($_POST['user_xup'])."' WHERE user_id='".intval($inp)."' "); - if ($photo_to_delete) - { // Photo may be a flat file, or in the database - delete_file($photo_to_delete); - } - if ($avatar_to_delete) - { // Avatar may be a flat file, or in the database - delete_file($avatar_to_delete); - } - - - // If user has changed display name, update the record in the online table - if(isset($username) && ($username != USERNAME) && !$_uid) + // Handle fields which are just transferred without vetting (but are subject to toDB() for exploit restriction) + $copy_list = array('user_signature' => 'signature', + 'user_login' => 'realname', + 'user_email' => 'email', + 'user_timezone' => 'timezone', + 'user_customtitle' => 'customtitle', + 'user_hideemail' =>'hideemail', + 'user_xup' => 'user_xup'); + + // Next list identifies numerics which might take a value of 0 + $non_text_list = array( + 'user_hideemail' =>'hideemail' + ); + foreach ($copy_list as $k => $v) { - $sql->db_Update("online", "online_user_id = '".USERID.".".$username."' WHERE online_user_id = '".USERID.".".USERNAME."'"); - } - - - // Only admins can update login name - if(ADMIN && getperms("4")) - { - $sql -> db_Update("user", "user_loginname='".$tp -> toDB($loginname)."' WHERE user_id='".intval($inp)."' "); - } - - - // Save extended field values - if($ue_fields) - { -// ***** Next line creates a record which presumably should be there anyway, so could generate an error - $sql->db_Select_gen("INSERT INTO #user_extended (user_extended_id, user_hidden_fields) values ('".intval($inp)."', '')"); - $sql->db_Update("user_extended", $ue_fields." WHERE user_extended_id = '".intval($inp)."'"); + if (isset($_POST[$v]) && (trim($_POST[$v]) || isset($non_text_list[$k]))) + { + $_POST[$v] = $tp->toDB(trim($_POST[$v])); + if ($_POST[$v] != $udata[$k]) + { + $changed_user_data[$k] = $_POST[$v]; +// echo "Changed {$k}, {$v} from {$udata[$k]} to {$_POST[$v]}
"; + } + } } // Update Userclass - only if its the user changing their own data (admins can do it another way) -// if (!$_uid && $sql->db_Select("userclass_classes", "*", "userclass_editclass IN (".USERCLASS_LIST.")")) if (!$_uid && $sql->db_Select("userclass_classes", "userclass_id", "userclass_editclass IN (".USERCLASS_LIST.")")) { $ucList = $sql->db_getList(); // List of classes which this user can edit if (US_DEBUG) $admin_log->e_log_event(10,debug_backtrace(),"DEBUG","Usersettings test","Read editable list. Current user classes: ".$udata['user_class'],FALSE,LOG_TO_ROLLING); -// if ($sql->db_Select("user", "user_class", "user_id = '".intval($inp)."'")) -// { -// $row = $sql->db_Fetch(); -// $cur_classes = explode(",", $row['user_class']); + $cur_classes = explode(",", $udata['user_class']); // Current class membership $newclist = array_flip($cur_classes); // Array keys are now the class IDs @@ -479,20 +522,143 @@ if (isset($_POST['updatesettings'])) } $newclist = array_keys($newclist); $nid = implode(',', array_diff($newclist, array(''))); +// echo "Userclass data - new: {$nid}, old: {$udata['user_class']}
"; if ($nid != $udata['user_class']) { - if (US_DEBUG) $admin_log->e_log_event(10,debug_backtrace(),"DEBUG","Usersettings test","Write back classes; new list: ".$nid,FALSE,LOG_TO_ROLLING); - $sql->db_Update("user", "user_class='".$nid."' WHERE user_id=".intval($inp)); + if (US_DEBUG) $admin_log->e_log_event(10,debug_backtrace(),"DEBUG","Usersettings test","Write back classes; old list: {$udata['user_class']}; new list: ".$nid,FALSE,LOG_TO_ROLLING); + $changed_user_data['user_class'] = $nid; } -// } } - if($update_xup == TRUE) + + // Only admins can update login name - do this just in case one of the event triggers has mucked it about + if (!(ADMIN && getperms("4"))) + { + unset($changed_user_data['user_loginname']); + } + + + // We can update the basic user record now - can just update fields from $changed_user_data + $new_data = array(); + foreach ($changed_user_data as $fn => $fv) + { + $new_data[] = "`{$fn}`='{$fv}'"; + } + if (US_DEBUG) $admin_log->e_log_event(10,debug_backtrace(),"DEBUG","Usersettings test","Changed data:
".var_export($changed_user_data,TRUE),FALSE,LOG_TO_ROLLING); + $sql->db_Update("user",implode(', ',$new_data)." WHERE user_id='".intval($inp)."' "); + + + // Now see if we need to log anything. First check the options and class membership + // (Normally we would leave logging decision to the log class. But this one's a bit more complicated) + $user_logging_opts = array_flip(explode(',',varset($pref['user_audit_opts'],''))); + $do_log = array(); + $log_action = ''; + if ($_uid) + { // Its an admin changing someone elses data - add an admin log entry here + echo "Admin changing user data
"; + // Check against the class of the target user, not the admin! + if (!check_class(varset($pref['user_audit_class'],''),$udata['user_class'])) $user_logging_opts = array(); + } + else + { + if (!check_class(varset($pref['user_audit_class'],''))) $user_logging_opts = array(); + } + + // Now log changes if required + if (count($user_logging_opts)) + { + // Start with any specific fields we're changing + + if (isset($changed_user_data['user_name'])) + { + if (isset($user_logging_opts[USER_AUDIT_NEW_DN])) + { + $do_log['user_name'] = $changed_user_data['user_name']; + $log_action = USER_AUDIT_NEW_DN; + } + unset($changed_user_data['user_name']); + } + + if (isset($changed_user_data['user_password'])) + { + if (isset($user_logging_opts[USER_AUDIT_NEW_PW])) + { // Password has already been changed to an md5(), so OK to leave the data + $do_log['user_password'] = $changed_user_data['user_password']; + $log_action = USER_AUDIT_NEW_PW; + } + unset($changed_user_data['user_password']); + } + + if (isset($changed_user_data['user_email'])) + { + if (isset($user_logging_opts[USER_AUDIT_NEW_EML])) + { + $do_log['user_email'] = $changed_user_data['user_email']; + $log_action = USER_AUDIT_NEW_EML; + } + unset($changed_user_data['user_email']); + } + + if (count($changed_user_data) && isset($user_logging_opts[USER_AUDIT_NEW_SET])) + { + $do_log = array_merge($do_log,$changed_user_data); + $log_action = USER_AUDIT_NEW_SET; + } + if (count($do_log)) + { // Got some changes to audit +// echo "Adding to audit log
"; + if ($_uid) + { + $log_action = USER_AUDIT_ADMIN; // If an admin did the mod, different heading + // Embed a message saying who changed the data + $changed_user_data['message'] = str_replace(array('--ID--','--LOGNAME--'),array(USERID,USERNAME),LAN_USET_18); + $admin_log->user_audit($log_action,$do_log, $udata['user_id'],$udata['user_loginname']); + } + else + { + if (count($do_log) > 1) $log_action = USER_AUDIT_NEW_SET; // Log multiple entries to one record + $admin_log->user_audit($log_action,$do_log); + } + } + } // End of audit logging + + + // Now tidy up + if ($photo_to_delete) + { // Photo may be a flat file, or in the database + delete_file($photo_to_delete); + } + if ($avatar_to_delete) + { // Avatar may be a flat file, or in the database + delete_file($avatar_to_delete); + } + + + // If user has changed display name, update the record in the online table + if(isset($changed_user_data['user_name']) && !$_uid) + { + $sql->db_Update("online", "online_user_id = '".USERID.".".$changed_user_data['user_name']."' WHERE online_user_id = '".USERID.".".USERNAME."'"); + } + + + // Save extended field values + if($ue_fields) + { +// ***** Next line creates a record which presumably should be there anyway, so could generate an error + $sql->db_Select_gen("INSERT INTO #user_extended (user_extended_id, user_hidden_fields) values ('".intval($inp)."', '')"); + $sql->db_Update("user_extended", $ue_fields." WHERE user_extended_id = '".intval($inp)."'"); + } + + +/* +Needed - but check bits of the file first + if(isset($changed_user_data['user_xup'])) { require_once(e_HANDLER."login.php"); - userlogin::update_xup($inp, $_POST['user_xup']); + userlogin::update_xup($inp, $changed_user_data['user_xup']); } +*/ $e_event->trigger("postuserset", $_POST); @@ -520,17 +686,19 @@ if ($error) $adref = $_POST['adminreturn']; } -// --- User data has been update here if appropriate --- +// --- User data has been updated here if appropriate --- if(isset($message)) { $ns->tablerender($caption, $message); } -// --------------------- +//----------------------------------------------------- +// Re-read the user data into curVal (ready for display) +//----------------------------------------------------- -$uuid = ($_uid) ? $_uid : USERID; +$uuid = ($_uid) ? $_uid : USERID; // If $_uid is set, its an admin changing another user's data $qry = " SELECT u.*, ue.* FROM #user AS u @@ -555,15 +723,16 @@ if (strpos($curVal['user_perms'],'0') === 0) $curVal['userclass_list'] = implode(",", $tmp); if($_POST) -{ // Fix for all the values being lost when an error occurred. - foreach($_POST as $key => $val) - { - $curVal["user_".$key] = $val; - } - foreach($_POST['ue'] as $key => $val) - { - $curVal[$key] = $val; - } +{ // Fix for all the values being lost when there was an error in a field - restore from the latest $_POST values + // (Password fields have intentionally been cleared). If no error, there's an unset($_POST) to disable this block + foreach($_POST as $key => $val) + { + $curVal["user_".$key] = $val; + } + foreach($_POST['ue'] as $key => $val) + { + $curVal[$key] = $val; + } } require_once(e_HANDLER."form_handler.php"); @@ -588,9 +757,10 @@ $text .= " $ns->tablerender(LAN_155, $text); require_once(FOOTERF); -//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------// -function req($field) { +// If a field is required, returns a red asterisk +function req($field) +{ global $pref; if ($field == 2) { @@ -602,7 +772,8 @@ function req($field) { } return $ret; } -//--------------------------------------------------------------------------------- + + // Delete a file from the public directories. Return TRUE on success, FALSE on failure. // Also deletes from database if appropriate. @@ -624,7 +795,8 @@ function delete_file($fname, $dir = 'avatars/') } -function headerjs() { +function headerjs() +{ global $cal; $script = "