16980370bSSascha Leib<?php 26980370bSSascha Leib 36980370bSSascha Leibuse dokuwiki\Extension\EventHandler; 46980370bSSascha Leibuse dokuwiki\Extension\Event; 56980370bSSascha Leib 66980370bSSascha Leib/** 76980370bSSascha Leib * Action Component for the Monitor Plugin 86980370bSSascha Leib * 96980370bSSascha Leib * @license GPL 3 (http://www.gnu.org/licenses/gpl.html) 106980370bSSascha Leib * @author Sascha Leib <sascha.leib(at)kolmio.com> 116980370bSSascha Leib */ 126980370bSSascha Leib 136980370bSSascha Leibclass action_plugin_monitor extends DokuWiki_Action_Plugin { 146980370bSSascha Leib 156980370bSSascha Leib /** 166980370bSSascha Leib * Registers a callback functions 176980370bSSascha Leib * 186980370bSSascha Leib * @param EventHandler $controller DokuWiki's event controller object 196980370bSSascha Leib * @return void 206980370bSSascha Leib */ 216980370bSSascha Leib public function register(EventHandler $controller) { 226980370bSSascha Leib $controller->register_hook('TPL_METAHEADER_OUTPUT', 'BEFORE', $this, 'insertHeader'); 236980370bSSascha Leib } 246980370bSSascha Leib 256980370bSSascha Leib /** 266980370bSSascha Leib * Inserts tracking code to the page header 276980370bSSascha Leib * 286980370bSSascha Leib * @param Event $event event object by reference 296980370bSSascha Leib * @return void 306980370bSSascha Leib */ 316980370bSSascha Leib public function insertHeader(Event $event, $param) { 326980370bSSascha Leib 336980370bSSascha Leib global $INFO; 346980370bSSascha Leib 356980370bSSascha Leib // is there a user logged in? 366980370bSSascha Leib $username = ( !empty($INFO['userinfo']) && !empty($INFO['userinfo']['name']) 376980370bSSascha Leib ? $INFO['userinfo']['name'] : null); 386980370bSSascha Leib 396980370bSSascha Leib // build the tracker code: 406980370bSSascha Leib $code = NL . DOKU_TAB . "document._monitor = {'t0': Date.now()};" . NL; 416980370bSSascha Leib if ($username) { 426980370bSSascha Leib $code .= DOKU_TAB . 'document._monitor.user = "' . $username . '";'. NL; 436980370bSSascha Leib } 446980370bSSascha Leib $code .= DOKU_TAB . "addEventListener('load',function(){" . NL; 456980370bSSascha Leib 466980370bSSascha Leib $code .= DOKU_TAB . DOKU_TAB . "const e=document.createElement('script');" . NL; 476980370bSSascha Leib $code .= DOKU_TAB . DOKU_TAB . "e.async=true;e.defer=true;" . NL; 486980370bSSascha Leib $code .= DOKU_TAB . DOKU_TAB . "e.src='".DOKU_BASE."lib/plugins/monitor/client.js';" . NL; 496980370bSSascha Leib $code .= DOKU_TAB . DOKU_TAB . "document.getElementsByTagName('head')[0].appendChild(e);" . NL; 506980370bSSascha Leib $code .= DOKU_TAB . "});" . NL; 516980370bSSascha Leib 526980370bSSascha Leib $event->data['script'][] = [ 536980370bSSascha Leib '_data' => $code 546980370bSSascha Leib ]; 55cf9f7fe8SSascha Leib 56cf9f7fe8SSascha Leib /* Write out client info to a server log: */ 57*091b5998SSascha Leib 58*091b5998SSascha Leib // what is the session identifier? 59*091b5998SSascha Leib $sessionId = $_COOKIE['DokuWiki'] ?? null; 60*091b5998SSascha Leib $sessionType = 'dw'; 61*091b5998SSascha Leib if (!$sessionId) { 62*091b5998SSascha Leib if (session_id()) { 63*091b5998SSascha Leib // if a session ID is set, use it 64*091b5998SSascha Leib $sessionId = session_id(); 65*091b5998SSascha Leib $sessionType = 'php'; 66*091b5998SSascha Leib } else { 67*091b5998SSascha Leib // if no session ID is set, use the ip address: 68*091b5998SSascha Leib $sessionId = $_SERVER['REMOTE_ADDR'] ?? ''; 69*091b5998SSascha Leib $sessionType = 'ip'; 70*091b5998SSascha Leib } 71*091b5998SSascha Leib } 72*091b5998SSascha Leib 73cf9f7fe8SSascha Leib $logArr = Array( 7487d76396SSascha Leib $_SERVER['REMOTE_ADDR'] ?? '', /* remote IP */ 7587d76396SSascha Leib $INFO['id'] ?? '', /* page ID */ 76*091b5998SSascha Leib $sessionId, /* Session ID */ 77*091b5998SSascha Leib $sessionType, 78cf9f7fe8SSascha Leib $username, 79cf9f7fe8SSascha Leib $_SERVER['HTTP_USER_AGENT'] ?? '' /* User agent */ 80cf9f7fe8SSascha Leib ); 81cf9f7fe8SSascha Leib 82cf9f7fe8SSascha Leib //* create the log line */ 83cf9f7fe8SSascha Leib $filename = __DIR__ .'/logs/' . gmdate('Y-m-d') . '.srv'; /* use GMT date for filename */ 84cf9f7fe8SSascha Leib $logline = gmdate('Y-m-d H:i:s'); /* use GMT time for log entries */ 85cf9f7fe8SSascha Leib foreach ($logArr as $tab) { 86cf9f7fe8SSascha Leib $logline .= "\t" . $tab; 87cf9f7fe8SSascha Leib }; 88cf9f7fe8SSascha Leib 89cf9f7fe8SSascha Leib /* write the log line to the file */ 90cf9f7fe8SSascha Leib $logfile = fopen($filename, 'a'); 91cf9f7fe8SSascha Leib if (!$logfile) die(); 92cf9f7fe8SSascha Leib if (fwrite($logfile, $logline . "\n") === false) { 93cf9f7fe8SSascha Leib fclose($logfile); 94cf9f7fe8SSascha Leib die(); 956980370bSSascha Leib } 96cf9f7fe8SSascha Leib 97cf9f7fe8SSascha Leib /* Done */ 98cf9f7fe8SSascha Leib fclose($logfile); 99cf9f7fe8SSascha Leib 100cf9f7fe8SSascha Leib } 101cf9f7fe8SSascha Leib 1026980370bSSascha Leib}