301 lines
7.9 KiB
PHP
301 lines
7.9 KiB
PHP
<?php
|
|
/**
|
|
* Login/Logout logging plugin
|
|
*
|
|
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
|
|
* @author Andreas Gohr <gohr@cosmocode.de>
|
|
*/
|
|
|
|
class action_plugin_loglog extends DokuWiki_Action_Plugin
|
|
{
|
|
/**
|
|
* @var \helper_plugin_loglog_logging
|
|
*/
|
|
protected $logHelper;
|
|
|
|
/**
|
|
* @var \helper_plugin_loglog_main
|
|
*/
|
|
protected $mainHelper;
|
|
|
|
/**
|
|
* @var \helper_plugin_loglog_alert
|
|
*/
|
|
protected $alertHelper;
|
|
|
|
public function __construct()
|
|
{
|
|
$this->mainHelper = $this->loadHelper('loglog_main');
|
|
$this->logHelper = $this->loadHelper('loglog_logging');
|
|
$this->alertHelper = $this->loadHelper('loglog_alert');
|
|
}
|
|
|
|
/** @inheritDoc */
|
|
function register(Doku_Event_Handler $controller)
|
|
{
|
|
// tasks to perform on login/logoff
|
|
$controller->register_hook(
|
|
'ACTION_ACT_PREPROCESS',
|
|
'BEFORE',
|
|
$this,
|
|
'handleAuth'
|
|
);
|
|
|
|
// allow other plugins to emit logging events
|
|
$controller->register_hook(
|
|
'PLUGIN_LOGLOG_LOG',
|
|
'BEFORE',
|
|
$this,
|
|
'handleCustom'
|
|
);
|
|
|
|
// autologout plugin
|
|
$controller->register_hook(
|
|
'ACTION_AUTH_AUTOLOGOUT',
|
|
'BEFORE',
|
|
$this,
|
|
'handleAutologout'
|
|
);
|
|
|
|
// log admin access
|
|
$controller->register_hook(
|
|
'ACTION_ACT_PREPROCESS',
|
|
'BEFORE',
|
|
$this,
|
|
'handleAdminAccess'
|
|
);
|
|
|
|
// log user modifications
|
|
$controller->register_hook(
|
|
'AUTH_USER_CHANGE',
|
|
'BEFORE',
|
|
$this,
|
|
'handleUsermod'
|
|
);
|
|
|
|
// log admin actions triggered via Ajax
|
|
$controller->register_hook(
|
|
'AJAX_CALL_UNKNOWN',
|
|
'AFTER',
|
|
$this,
|
|
'handleAjax'
|
|
);
|
|
|
|
// log other admin actions
|
|
$controller->register_hook(
|
|
'DOKUWIKI_STARTED',
|
|
'AFTER',
|
|
$this,
|
|
'handleOther'
|
|
);
|
|
|
|
// log other admin actions
|
|
$controller->register_hook(
|
|
'INDEXER_TASKS_RUN',
|
|
'AFTER',
|
|
$this,
|
|
'handleReport'
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Log login/logoff actions and optionally trigger alerts
|
|
* if configured thresholds have just been exceeded
|
|
*
|
|
* @param $msg
|
|
* @param null|string $user
|
|
*/
|
|
protected function logAuth($msg, $user = null)
|
|
{
|
|
$this->logHelper->writeLine($msg, $user);
|
|
|
|
// trigger alert notifications if necessary
|
|
$this->alertHelper->checkAlertThresholds();
|
|
}
|
|
|
|
/**
|
|
* Log usage of admin tools
|
|
*
|
|
* @param array $data
|
|
* @param string $more
|
|
*/
|
|
protected function logAdmin(array $data = [], $more = '')
|
|
{
|
|
global $INPUT;
|
|
$msg = 'admin';
|
|
$page = $INPUT->str('page');
|
|
if ($page) $msg .= " - $page";
|
|
if ($more && $more !== $page) $msg .= " - $more";
|
|
$this->logHelper->writeLine($msg,null, $data);
|
|
}
|
|
|
|
/**
|
|
* Handle custom logging events
|
|
*
|
|
* @param Doku_Event $event
|
|
* @param mixed $param data passed to the event handler
|
|
*/
|
|
public function handleCustom(Doku_Event $event, $param)
|
|
{
|
|
if (isset($event->data['message'])) {
|
|
$log = $event->data['message'];
|
|
} else {
|
|
return;
|
|
}
|
|
if (isset($event->data['user'])) {
|
|
$user = $event->data['user'];
|
|
} else {
|
|
$user = null;
|
|
}
|
|
|
|
$this->logHelper->writeLine($log, $user);
|
|
}
|
|
|
|
/**
|
|
* Handle autologoffs by the autologout plugin
|
|
*
|
|
* @param Doku_Event $event
|
|
* @param mixed $param data passed to the event handler
|
|
*/
|
|
public function handleAutologout(Doku_Event $event, $param)
|
|
{
|
|
$this->logAuth('has been automatically logged off');
|
|
}
|
|
|
|
/**
|
|
* catch standard logins/logouts, check if any alert notifications should be sent
|
|
*
|
|
* @param Doku_Event $event
|
|
* @param mixed $param data passed to the event handler
|
|
*/
|
|
public function handleAuth(Doku_Event $event, $param)
|
|
{
|
|
// log authentication events
|
|
$act = act_clean($event->data);
|
|
if ($act == 'logout') {
|
|
$this->logAuth('logged off');
|
|
} elseif (!empty($_SERVER['REMOTE_USER']) && $act == 'login') {
|
|
if (isset($_REQUEST['r'])) {
|
|
$this->logAuth('logged in permanently');
|
|
} else {
|
|
$this->logAuth('logged in temporarily');
|
|
}
|
|
} elseif ($_REQUEST['u'] && empty($_REQUEST['http_credentials']) && empty($_SERVER['REMOTE_USER'])) {
|
|
$this->logAuth('failed login attempt');
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Log access to admin pages
|
|
*
|
|
* @param Doku_Event $event
|
|
*/
|
|
public function handleAdminAccess(Doku_Event $event)
|
|
{
|
|
global $ACT;
|
|
if ($ACT === 'admin') {
|
|
$this->logAdmin();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Log user modifications
|
|
*
|
|
* @param Doku_Event $event
|
|
*/
|
|
public function handleUsermod(Doku_Event $event)
|
|
{
|
|
$modType = $event->data['type'];
|
|
$modUser = $event->data['params'][0];
|
|
if (is_array($modUser)) $modUser = implode(', ', $modUser);
|
|
|
|
// check if admin or user are modifying the data
|
|
global $ACT;
|
|
if ($ACT === 'profile') {
|
|
$this->logHelper->writeLine('user profile',null, [$modType . ' user', $modUser]);
|
|
} else {
|
|
$this->logAdmin([$modType . ' user', $modUser]);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Catch admin actions performed via Ajax
|
|
*
|
|
* @param Doku_Event $event
|
|
*/
|
|
public function handleAjax(Doku_Event $event)
|
|
{
|
|
global $INPUT;
|
|
|
|
// extension manager
|
|
if ($event->data === 'plugin_extension') {
|
|
$this->logAdmin([$INPUT->str('act') . ' ' . $INPUT->str('ext')], 'extension');
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Log activity in select core admin modules
|
|
*
|
|
* @param \Doku_Event $event
|
|
*/
|
|
public function handleOther(\Doku_Event $event)
|
|
{
|
|
global $INPUT;
|
|
|
|
// configuration manager
|
|
if ($INPUT->str('page') === 'config'
|
|
&& $INPUT->bool('save') === true
|
|
&& !empty($INPUT->arr('config'))
|
|
) {
|
|
$this->logAdmin(['save config']);
|
|
}
|
|
|
|
// extension manager
|
|
if ($INPUT->str('page') === 'extension') {
|
|
if ($INPUT->post->has('fn')) {
|
|
$actions = $INPUT->post->arr('fn');
|
|
foreach ($actions as $action => $extensions) {
|
|
foreach ($extensions as $extname => $label) {
|
|
$this->logAdmin([$action, $extname]);
|
|
}
|
|
}
|
|
} elseif ($INPUT->post->str('installurl')) {
|
|
$this->logAdmin(['installurl', $INPUT->post->str('installurl')]);
|
|
} elseif (isset($_FILES['installfile'])) {
|
|
$this->logAdmin(['installfile', $_FILES['installfile']['name']]);
|
|
}
|
|
}
|
|
|
|
// ACL manager
|
|
if ($INPUT->str('page') === 'acl' && $INPUT->has('cmd')) {
|
|
$cmd = $INPUT->extract('cmd')->str('cmd');
|
|
$del = $INPUT->arr('del');
|
|
if ($cmd === 'update' && !empty($del)) {
|
|
$cmd = 'delete';
|
|
$rule = $del;
|
|
} else {
|
|
$rule = [
|
|
'ns' => $INPUT->str('ns'),
|
|
'acl_t' => $INPUT->str('acl_t'),
|
|
'acl_w' => $INPUT->str('acl_w'),
|
|
'acl' => $INPUT->str('acl')
|
|
];
|
|
}
|
|
|
|
$this->logAdmin([$cmd, $rule]);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Handle monthly usage reports
|
|
*
|
|
* @param Doku_Event $event
|
|
*/
|
|
public function handleReport(Doku_Event $event)
|
|
{
|
|
$reportHelper = new helper_plugin_loglog_report();
|
|
$reportHelper->handleReport();
|
|
}
|
|
}
|
|
|