restrictAccess(Auth::isManager()) ->setPageTitle(WT_I18N::translate('Logs')); require WT_ROOT.'includes/functions/functions_edit.php'; $earliest=WT_DB::prepare("SELECT DATE(MIN(log_time)) FROM `##log`")->execute(array())->fetchOne(); $latest =WT_DB::prepare("SELECT DATE(MAX(log_time)) FROM `##log`")->execute(array())->fetchOne(); // Filtering $action = WT_Filter::get('action'); $from = WT_Filter::get('from', '\d\d\d\d-\d\d-\d\d', $earliest); $to = WT_Filter::get('to', '\d\d\d\d-\d\d-\d\d', $latest); $type = WT_Filter::get('type', 'auth|change|config|debug|edit|error|media|search'); $text = WT_Filter::get('text'); $ip = WT_Filter::get('ip'); $user = WT_Filter::get('user'); $search = WT_Filter::get('search'); $search = isset($search['value']) ? $search['value'] : null; if (Auth::isAdmin()) { // Administrators can see all logs $gedc = WT_Filter::get('gedc'); } else { // Managers can only see logs relating to this gedcom $gedc = WT_GEDCOM; } $query=array(); $args =array(); if ($search) { $query[] = "log_message LIKE CONCAT('%', ?, '%')"; $args [] = $search; } if ($from) { $query[]='log_time>=?'; $args []=$from; } if ($to) { $query[]='log_timeexecute($args); break; case 'export': Zend_Session::writeClose(); header('Content-Type: text/csv'); header('Content-Disposition: attachment; filename="webtrees-logs.csv"'); $rows=WT_DB::prepare($SELECT1.$WHERE.' ORDER BY log_id')->execute($args)->fetchAll(); foreach ($rows as $row) { echo '"', $row->log_time, '",', '"', $row->log_type, '",', '"', str_replace('"', '""', $row->log_message), '",', '"', $row->ip_address, '",', '"', str_replace('"', '""', $row->user_name), '",', '"', str_replace('"', '""', $row->gedcom_name), '"', "\n"; } exit; case 'load_json': Zend_Session::writeClose(); $start = WT_Filter::getInteger('start'); $length = WT_Filter::getInteger('length'); Auth::user()->setPreference('admin_site_log_page_size', $length); if ($length>0) { $LIMIT=" LIMIT " . $start . ',' . $length; } else { $LIMIT=""; } $order = WT_Filter::get('order'); if ($order) { $ORDER_BY=' ORDER BY '; for ($i = 0; $i < count($order); ++$i) { if ($i > 0) { $ORDER_BY .= ','; } // Datatables numbers columns 0, 1, 2, ... // MySQL numbers columns 1, 2, 3, ... switch ($order[$i]['dir']) { case 'asc': $ORDER_BY .= (1 + $order[$i]['column']) . ' ASC '; break; case 'desc': $ORDER_BY .= (1 + $order[$i]['column']) . ' DESC '; break; } } } else { $ORDER_BY = '1 ASC'; } // This becomes a JSON list, not array, so need to fetch with numeric keys. $data = WT_DB::prepare($SELECT1.$WHERE.$ORDER_BY.$LIMIT)->execute($args)->fetchAll(PDO::FETCH_NUM); foreach ($data as &$datum) { $datum[2] = WT_Filter::escapeHtml($datum[2]); } // Total filtered/unfiltered rows $recordsFiltered=WT_DB::prepare("SELECT FOUND_ROWS()")->fetchOne(); $recordsTotal=WT_DB::prepare($SELECT2.$WHERE)->execute($args)->fetchOne(); header('Content-type: application/json'); echo json_encode(array( // See http://www.datatables.net/usage/server-side 'sEcho' => WT_Filter::getInteger('sEcho'), // Always an integer 'recordsTotal' => $recordsTotal, 'recordsFiltered' => $recordsFiltered, 'data' => $data )); exit; } $controller ->pageHeader() ->addExternalJavascript(WT_JQUERY_DATATABLES_URL) ->addInlineJavascript(' jQuery("#log_list").dataTable( { dom: \'<"H"pf<"dt-clear">irl>t<"F"pl>\', processing: true, serverSide: true, ajax: "'.WT_SERVER_NAME.WT_SCRIPT_PATH.WT_SCRIPT_NAME.'?action=load_json&from='.$from.'&to='.$to.'&type='.$type.'&text='.rawurlencode($text).'&ip='.rawurlencode($ip).'&user='.rawurlencode($user).'&gedc='.rawurlencode($gedc).'", '.WT_I18N::datatablesI18N(array(10,20,50,100,500,1000,-1)).', jQueryUI: true, autoWidth: false, sorting: [[ 0, "desc" ]], pageLength: ' . Auth::user()->getPreference('admin_site_log_page_size', 20) . ', pagingType: "full_numbers" }); '); $url= WT_SCRIPT_NAME.'?from='.rawurlencode($from). '&to='.rawurlencode($to). '&type='.rawurlencode($type). '&text='.rawurlencode($text). '&ip='.rawurlencode($ip). '&user='.rawurlencode($user). '&gedc='.rawurlencode($gedc); $users_array = array(); foreach (User::all() as $tmp_user) { $users_array[$tmp_user->getUserName()] = $tmp_user->getUserName(); } echo '
', '', '', '', '', '', '', '', '', '', '', '', '', '', '
', // I18N: %s are both user-input date fields WT_I18N::translate('From %s to %s', '', ''), '
', WT_I18N::translate('Type'), '
', select_edit_control('type', array(''=>'', 'auth'=>'auth','config'=>'config','debug'=>'debug','edit'=>'edit','error'=>'error','media'=>'media','search'=>'search'), null, $type, ''), '
', WT_I18N::translate('Message'), '
', '
', WT_I18N::translate('IP address'), '
', '
', WT_I18N::translate('User'), '
', select_edit_control('user', $users_array, '', $user, ''), '
', WT_I18N::translate('Family tree'), '
', select_edit_control('gedc', WT_Tree::getNameList(), '', $gedc, Auth::isAdmin() ? '' : 'disabled'), '
', '', '', '', '
', '
'; if ($action) { echo '
', '', '', '', '', '', '', '', '', '', '', '', '', '', '
', WT_I18N::translate('Timestamp'), '', WT_I18N::translate('Type'), '', WT_I18N::translate('Message'), '', WT_I18N::translate('IP address'), '', WT_I18N::translate('User'), '', WT_I18N::translate('Family tree'), '
'; }