Activity - everything you did, from the audit log: your * changes, your sign ins (and wrong MFA codes), the passwords you looked at * and what you exported, with when, the client and from where. Searched, * filtered by date, in views, a page at a time, each entry linking to its * record while it still exists. Yours only. */ // Default Column Sortby Filter $sort = "log_id"; $order = "DESC"; require_once "includes/inc_all_user.php"; $page_title = 'Activity'; $sortable_columns = [ 'log_id' => "log_id $order", 'log_created_at' => "log_created_at $order, log_id $order", 'client_name' => "client_name IS NULL, client_name $order, log_id DESC", 'log_type' => "log_type $order, log_action $order, log_id DESC", 'log_action' => "log_action $order, log_id DESC", 'log_ip' => "log_ip IS NULL, log_ip $order, log_id DESC", ]; if (!isset($sortable_columns[$sort])) { $sort = 'log_id'; } $views = auditLogViews(); unset($views['security']); $views['signins']['title'] = 'Signing in and out, and wrong MFA codes'; $views['data']['title'] = 'Passwords you looked at, and what you exported, downloaded and shared'; $view = isset($_GET['view']) && is_string($_GET['view']) && isset($views[$_GET['view']]) ? $_GET['view'] : ''; $scope = "log_user_id = " . intval($session_user_id); $filter_src = array_merge($_GET, ['user' => '', 'dtf' => $dtf, 'dtt' => $dtt, 'view' => $view]); $joins = auditLogJoinsSql(); $sql = mysqli_query($mysqli, "SELECT SQL_CALC_FOUND_ROWS log_id, log_type, log_action, log_description, log_ip, log_user_agent, log_created_at, log_client_id, log_user_id, log_entity_id, user_name, client_name FROM logs $joins WHERE $scope AND " . auditLogFiltersSql($filter_src) . " ORDER BY {$sortable_columns[$sort]} LIMIT $record_from, $record_to"); $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()")); $rows = []; while ($row = mysqli_fetch_assoc($sql)) { // A client they can't open (now, or ever - a refused attempt) isn't named or linked $row['hidden'] = intval($row['log_client_id']) > 0 && !hasClientAccess($row['log_client_id']); if ($row['hidden']) { $row['client_name'] = null; } $rows[] = $row; } $records = auditLogRecords(array_filter($rows, function ($row) { return !$row['hidden']; })); $new_ips = signInNewIpIds($rows); $kinds = auditLogKinds(); // Each view counted for the search and dates $count_sql = []; foreach ($views as $definition) { $count_sql[] = 'COALESCE(SUM(' . ($definition['where'] === '' ? '1' : $definition['where']) . '), 0)'; } $counts = array_combine(array_keys($views), array_map('intval', mysqli_fetch_row(mysqli_query($mysqli, "SELECT " . implode(', ', $count_sql) . " FROM logs $joins WHERE $scope AND " . auditLogFiltersSql(array_merge($filter_src, ['view' => ''])))))); $any_filter = $q !== '' || $dtf !== '1970-01-01' || $dtt !== '2099-12-31'; $sort_link = function ($column, $label) use ($url_query_strings_sort, $sort, $disp, $order_icon) { return '' . $label . ($sort === $column ? " $order_icon" : '') . ''; }; $view_url = function ($key) { $query = $_GET; unset($query['page']); $query['view'] = $key; return '?' . http_build_query(array_filter($query, function ($value) { return $value !== '' && $value !== null && $value !== []; })); }; $view_empty = [ 'changes' => 'No changes yet', 'deletions' => 'Nothing deleted yet', 'signins' => 'No sign ins yet', 'data' => 'Nothing looked at or taken out yet', ]; ?>
| = $sort_link('log_created_at', 'When') ?> | = $sort_link('log_type', 'What') ?> | Description | = $sort_link('client_name', 'Client') ?> | = $sort_link('log_ip', 'From') ?> |
|---|---|---|---|---|
|
= escapeHtml(date('M j, Y g:i A', strtotime($row['log_created_at']))) ?>
= escapeHtml(timeAgo($row['log_created_at'])) ?>
|
= escapeHtml($type) ?>
= auditLogActionPill($row['log_action']) ?>= isset($new_ips[intval($row['log_id'])]) ? ' ' . signInNewIpBadge() : '' ?>
|
= escapeHtml(auditLogDescription($row)) ?>
= $link ?>
No longer here
= escapeHtml($from) ?>
|
A client you cannot open = escapeHtml($row['client_name']) ?> - |
= escapeHtml((string) $row['log_ip']) ?>
= escapeHtml($device) ?>
|