misuzu/src/audit_log.php

111 lines
4.5 KiB
PHP
Raw Normal View History

2018-07-17 19:17:57 +02:00
<?php
define('MSZ_AUDIT_PERSONAL_EMAIL_CHANGE', 'PERSONAL_EMAIL_CHANGE');
define('MSZ_AUDIT_PERSONAL_PASSWORD_CHANGE', 'PERSONAL_PASSWORD_CHANGE');
define('MSZ_AUDIT_PERSONAL_SESSION_DESTROY', 'PERSONAL_SESSION_DESTROY');
define('MSZ_AUDIT_PERSONAL_SESSION_DESTROY_ALL', 'PERSONAL_SESSION_DESTROY_ALL');
define('MSZ_AUDIT_PASSWORD_RESET', 'PASSWORD_RESET');
define('MSZ_AUDIT_CHANGELOG_ENTRY_CREATE', 'CHANGELOG_ENTRY_CREATE');
define('MSZ_AUDIT_CHANGELOG_ENTRY_EDIT', 'CHANGELOG_ENTRY_EDIT');
define('MSZ_AUDIT_CHANGELOG_TAG_ADD', 'CHANGELOG_TAG_ADD');
define('MSZ_AUDIT_CHANGELOG_TAG_REMOVE', 'CHANGELOG_TAG_REMOVE');
define('MSZ_AUDIT_CHANGELOG_TAG_CREATE', 'CHANGELOG_TAG_CREATE');
define('MSZ_AUDIT_CHANGELOG_TAG_EDIT', 'CHANGELOG_TAG_EDIT');
define('MSZ_AUDIT_CHANGELOG_ACTION_CREATE', 'CHANGELOG_ACTION_CREATE');
define('MSZ_AUDIT_CHANGELOG_ACTION_EDIT', 'CHANGELOG_ACTION_EDIT');
2018-12-15 19:14:23 +01:00
// replace this with a localisation system
define('MSZ_AUDIT_LOG_STRINGS', [
MSZ_AUDIT_PERSONAL_EMAIL_CHANGE => 'Changed e-mail address to %s.',
MSZ_AUDIT_PERSONAL_PASSWORD_CHANGE => 'Changed account password.',
MSZ_AUDIT_PERSONAL_SESSION_DESTROY => 'Ended session #%d.',
MSZ_AUDIT_PERSONAL_SESSION_DESTROY_ALL => 'Ended all personal sessions.',
MSZ_AUDIT_PASSWORD_RESET => 'Successfully used the password reset form to change password.',
MSZ_AUDIT_CHANGELOG_ENTRY_CREATE => 'Created a new changelog entry #%d.',
MSZ_AUDIT_CHANGELOG_ENTRY_EDIT => 'Edited changelog entry #%d.',
MSZ_AUDIT_CHANGELOG_TAG_ADD => 'Added tag #%2$d to changelog entry #%1$d.',
MSZ_AUDIT_CHANGELOG_TAG_REMOVE => 'Removed tag #%2$d from changelog entry #%1$d.',
MSZ_AUDIT_CHANGELOG_TAG_CREATE => 'Created new changelog tag #%d.',
MSZ_AUDIT_CHANGELOG_TAG_EDIT => 'Edited changelog tag #%d.',
MSZ_AUDIT_CHANGELOG_ACTION_CREATE => 'Created new changelog action #%d.',
MSZ_AUDIT_CHANGELOG_ACTION_EDIT => 'Edited changelog action #%d.',
2018-12-15 19:14:23 +01:00
]);
2018-07-17 19:17:57 +02:00
function audit_log(
string $action,
int $userId = 0,
array $params = [],
2018-09-27 09:15:33 +02:00
?string $ipAddress = null
2018-07-17 19:17:57 +02:00
): void {
$ipAddress = $ipAddress ?? ip_remote_address();
2018-07-17 19:17:57 +02:00
for ($i = 0; $i < count($params); $i++) {
2018-07-23 15:29:57 +02:00
if (preg_match('#^(-?[0-9]+)$#', $params[$i])) {
2018-07-17 19:17:57 +02:00
$params[$i] = (int)$params[$i];
}
}
$addLog = db_prepare('
2018-07-17 19:17:57 +02:00
INSERT INTO `msz_audit_log`
2018-07-23 15:29:57 +02:00
(`log_action`, `user_id`, `log_params`, `log_ip`, `log_country`)
2018-07-17 19:17:57 +02:00
VALUES
2018-09-27 09:15:33 +02:00
(:action, :user, :params, INET6_ATON(:ip), :country)
2018-07-17 19:17:57 +02:00
');
$addLog->bindValue('action', $action);
$addLog->bindValue('user', $userId < 1 ? null : $userId);
$addLog->bindValue('params', json_encode($params));
2018-09-27 09:15:33 +02:00
$addLog->bindValue('ip', $ipAddress);
$addLog->bindValue('country', ip_country_code($ipAddress));
2018-07-17 19:17:57 +02:00
$addLog->execute();
}
2018-07-23 15:29:57 +02:00
function audit_log_count($userId = 0): int
{
$getCount = db_prepare(sprintf('
2018-07-23 15:29:57 +02:00
SELECT COUNT(`log_id`)
FROM `msz_audit_log`
2018-12-15 19:14:23 +01:00
%s
', $userId < 1 ? '' : 'WHERE `user_id` = :user_id'));
2018-07-23 15:29:57 +02:00
if ($userId >= 1) {
$getCount->bindValue('user_id', $userId);
}
return $getCount->execute() ? (int)$getCount->fetchColumn() : 0;
}
2018-07-17 19:17:57 +02:00
function audit_log_list(int $offset, int $take, int $userId = 0): array
{
$offset = max(0, $offset);
$take = max(1, $take);
2018-12-15 19:14:23 +01:00
$isGlobal = $userId < 1;
2018-07-17 19:17:57 +02:00
2018-12-15 19:14:23 +01:00
$getLogs = db_prepare(sprintf(
'
SELECT
l.`log_id`, l.`log_action`, l.`log_params`, l.`log_created`, l.`log_country`,
INET6_NTOA(l.`log_ip`) as `log_ip`
%2$s
FROM `msz_audit_log` as l
%1$s
ORDER BY l.`log_id` DESC
LIMIT :offset, :take
',
$isGlobal
? 'LEFT JOIN `msz_users` as u ON u.`user_id` = l.`user_id` LEFT JOIN `msz_roles` as r ON r.`role_id` = u.`display_role`'
: 'WHERE l.`user_id` = :user_id',
$isGlobal
? ', u.`user_id`, u.`username`, COALESCE(u.`user_colour`, r.`role_colour`) as `user_colour`'
: ''
));
2018-07-17 19:17:57 +02:00
2018-12-15 19:14:23 +01:00
if (!$isGlobal) {
2018-07-23 15:29:57 +02:00
$getLogs->bindValue('user_id', $userId);
2018-07-17 19:17:57 +02:00
}
$getLogs->bindValue('offset', $offset);
$getLogs->bindValue('take', $take);
2018-10-29 20:12:06 +01:00
$logs = $getLogs->execute() ? $getLogs->fetchAll(PDO::FETCH_ASSOC) : false;
2018-07-17 19:17:57 +02:00
2018-10-29 20:12:06 +01:00
return $logs ? $logs : [];
2018-07-17 19:17:57 +02:00
}