17bd08c30SSascha Leib<?php /* BOT MONITOR PLUGIN PAGE VIEW SCRIPT */ 2cf9f7fe8SSascha Leib 3cf9f7fe8SSascha Leib/* parse the JSON payload */ 4cf9f7fe8SSascha Leib$json = json_decode($_POST['pageview'], true); 5cf9f7fe8SSascha Leibif (!$json) { 6cf9f7fe8SSascha Leib http_response_code(400); 7b2e3bd8bSSascha Leib die("Invalid JSON Data."); 8cf9f7fe8SSascha Leib} 9cf9f7fe8SSascha Leib 10b2e3bd8bSSascha Leib// select the session identifier? 1113c9d29dSSascha Leib$sessionId = $_COOKIE['DokuWiki'] ?? ''; 12abfc901fSSascha Leib$sessionType = 'dw'; 1313c9d29dSSascha Leibif ($sessionId == '') { 14abfc901fSSascha Leib $sessionId = $_SERVER['REMOTE_ADDR'] ?? ''; 15f162e4a9SSascha Leib if ($sessionId == '127.0.0.1' || $sessionId == '::1') { 16abfc901fSSascha Leib $sessionId = 'localhost'; 17abfc901fSSascha Leib } 18abfc901fSSascha Leib $sessionType = 'ip'; 19abfc901fSSascha Leib} 20abfc901fSSascha Leib 21b2e3bd8bSSascha Leib// check if valid session id string: 22b2e3bd8bSSascha Leibif (strlen($sessionId) < 46 && !preg_match('/^[\w\d\.:]+$/', $sessionId)) { 23b2e3bd8bSSascha Leib $sessionId = 'invalid-session-id'; 24b2e3bd8bSSascha Leib} 25b2e3bd8bSSascha Leib 26b2e3bd8bSSascha Leib// clean the page ID 27b2e3bd8bSSascha Leib$pageId = preg_replace('/[\x00-\x1F{};]/', "\u{FFFD}", $json['pg'] ?? ''); 28b2e3bd8bSSascha Leib 29b2e3bd8bSSascha Leib// clean the user-name 30b2e3bd8bSSascha Leib$userName = preg_replace('/[\x00-\x1F]/', "\u{FFFD}", $json['u'] ?? ''); 31b2e3bd8bSSascha Leib 32b2e3bd8bSSascha Leib// check load time 33b2e3bd8bSSascha Leib$loadTime = $json['lt'] ?? ''; 34b2e3bd8bSSascha Leibif ($loadTime !== '' ) $loadTime = intval($loadTime); 35b2e3bd8bSSascha Leib 36b2e3bd8bSSascha Leib// clean the user agent string 37b2e3bd8bSSascha Leib$agent = preg_replace('/[\x00-\x1F]/', "\u{FFFD}", $_SERVER['HTTP_USER_AGENT'] ?? ''); 38b2e3bd8bSSascha Leib 39b2e3bd8bSSascha Leib// clean the referer 40b2e3bd8bSSascha Leib$referer = preg_replace('/[\x00-\x1F]/', "\u{FFFD}", $json['r'] ?? ''); 41b2e3bd8bSSascha Leib 42b2e3bd8bSSascha Leib 43cf9f7fe8SSascha Leib/* build the resulting log line (ensure fixed column positions!) */ 44cf9f7fe8SSascha Leib$logArr = Array( 4587d76396SSascha Leib $_SERVER['REMOTE_ADDR'] ?? '', /* remote IP */ 46b2e3bd8bSSascha Leib $pageId, /* DW Page ID */ 47abfc901fSSascha Leib $sessionId, /* Session ID */ 48b2e3bd8bSSascha Leib $userName, /* DW User name (if logged in) */ 49b2e3bd8bSSascha Leib $loadTime, /* load time */ 50b2e3bd8bSSascha Leib $referer, /* Referrer URL */ 51b2e3bd8bSSascha Leib $agent /* User agent */ 5287d76396SSascha Leib // $json['lg'] ?? '', /* browser language */ 5387d76396SSascha Leib // $json['scr'] ?? '', /* Screen dimensions */ 542f2bc93aSSascha Leib // $json['tz'] ?? '', /* timzone offset */ 5587d76396SSascha Leib // $json['l'] ?? '', /* Accepted languages list */ 5687d76396SSascha Leib // $json['url'] ?? '', /* Full request URL */ 57cf9f7fe8SSascha Leib // $json['t'] ?? '' /* Page title */ 58cf9f7fe8SSascha Leib); 59cf9f7fe8SSascha Leib 60cf9f7fe8SSascha Leib/* create the log line */ 614cddc661SSascha Leib$filename = 'logs/' . gmdate('Y-m-d') . '.log.txt'; /* use server datetime */ 62cf9f7fe8SSascha Leib$logline = gmdate('Y-m-d H:i:s'); 63cf9f7fe8SSascha Leibforeach ($logArr as $val) { 64cf9f7fe8SSascha Leib $logline .= "\t" . $val; 65cf9f7fe8SSascha Leib}; 66cf9f7fe8SSascha Leib 67cf9f7fe8SSascha Leib/* write the log line to the file */ 68cf9f7fe8SSascha Leib$logfile = fopen($filename, 'a'); 69cf9f7fe8SSascha Leibif (!$logfile) { 70*451abfadSSascha Leib http_response_code(507); 71cf9f7fe8SSascha Leib die("Error: Unable to open log file. Please check file permissions."); 72cf9f7fe8SSascha Leib} 73cf9f7fe8SSascha Leib 74cf9f7fe8SSascha Leibif (fwrite($logfile, $logline . "\n") === false) { 75cf9f7fe8SSascha Leib http_response_code(500); 76cf9f7fe8SSascha Leib fclose($logfile); 77cf9f7fe8SSascha Leib die("Error: Could not write to log file."); 78cf9f7fe8SSascha Leib} 79cf9f7fe8SSascha Leibfclose($logfile); 80cf9f7fe8SSascha Leib 81cf9f7fe8SSascha Leib/* send a 202 response */ 82cf9f7fe8SSascha Leibhttp_response_code(202); 83cf9f7fe8SSascha Leibecho "OK";