137748cd8SNickeau<?php 237748cd8SNickeau/** 337748cd8SNickeau * Copyright (c) 2020. ComboStrap, Inc. and its affiliates. All Rights Reserved. 437748cd8SNickeau * 537748cd8SNickeau * This source code is licensed under the GPL license found in the 637748cd8SNickeau * COPYING file in the root directory of this source tree. 737748cd8SNickeau * 837748cd8SNickeau * @license GPL 3 (https://www.gnu.org/licenses/gpl-3.0.en.html) 937748cd8SNickeau * @author ComboStrap <support@combostrap.com> 1037748cd8SNickeau * 1137748cd8SNickeau */ 1237748cd8SNickeau 1337748cd8SNickeaunamespace ComboStrap; 1437748cd8SNickeau 1537748cd8SNickeaurequire_once(__DIR__ . '/PluginUtility.php'); 1637748cd8SNickeau 1737748cd8SNickeauclass LogUtility 1837748cd8SNickeau{ 1937748cd8SNickeau 2037748cd8SNickeau /** 2137748cd8SNickeau * Constant for the function {@link msg()} 2237748cd8SNickeau * -1 = error, 0 = info, 1 = success, 2 = notify 2337748cd8SNickeau * (Not even in order of importance) 2437748cd8SNickeau */ 2537748cd8SNickeau const LVL_MSG_ERROR = 4; //-1; 2637748cd8SNickeau const LVL_MSG_WARNING = 3; //2; 2737748cd8SNickeau const LVL_MSG_SUCCESS = 2; //1; 2837748cd8SNickeau const LVL_MSG_INFO = 1; //0; 2937748cd8SNickeau const LVL_MSG_DEBUG = 0; //3; 3037748cd8SNickeau 3137748cd8SNickeau 3237748cd8SNickeau /** 3337748cd8SNickeau * Id level to name 3437748cd8SNickeau */ 3537748cd8SNickeau const LVL_NAME = array( 3637748cd8SNickeau 0 => "debug", 3737748cd8SNickeau 1 => "info", 3837748cd8SNickeau 3 => "warning", 3937748cd8SNickeau 2 => "success", 4037748cd8SNickeau 4 => "error" 4137748cd8SNickeau ); 4237748cd8SNickeau 4337748cd8SNickeau /** 4437748cd8SNickeau * Id level to name 4537748cd8SNickeau * {@link msg()} constant 4637748cd8SNickeau */ 4737748cd8SNickeau const LVL_TO_MSG_LEVEL = array( 4837748cd8SNickeau 0 => 3, 4937748cd8SNickeau 1 => 0, 5037748cd8SNickeau 2 => 1, 5137748cd8SNickeau 3 => 2, 5237748cd8SNickeau 4 => -1 5337748cd8SNickeau ); 5437748cd8SNickeau 5537748cd8SNickeau 5637748cd8SNickeau const LOGLEVEL_URI_QUERY_PROPERTY = "loglevel"; 5737748cd8SNickeau 5837748cd8SNickeau /** 5937748cd8SNickeau * Send a message to a manager and log it 6037748cd8SNickeau * Fail if in test 6137748cd8SNickeau * @param string $message 6237748cd8SNickeau * @param int $level - the level see LVL constant 6337748cd8SNickeau * @param string $canonical - the canonical 6437748cd8SNickeau */ 6537748cd8SNickeau public static function msg($message, $level = self::LVL_MSG_ERROR, $canonical = "support") 6637748cd8SNickeau { 6737748cd8SNickeau 6837748cd8SNickeau /** 6937748cd8SNickeau * Log to frontend 7037748cd8SNickeau */ 7137748cd8SNickeau self::log2FrontEnd($message, $level, $canonical, true); 7237748cd8SNickeau 7337748cd8SNickeau /** 7437748cd8SNickeau * Log level passed for a page (only for file used) 7537748cd8SNickeau * to not allow an attacker to see all errors in frontend 7637748cd8SNickeau */ 7737748cd8SNickeau global $INPUT; 7837748cd8SNickeau $loglevelProp = $INPUT->str(self::LOGLEVEL_URI_QUERY_PROPERTY, null); 7937748cd8SNickeau if (!empty($loglevelProp)) { 8037748cd8SNickeau $level = $loglevelProp; 8137748cd8SNickeau } 82*2f4da794Sgerardnico /** 83*2f4da794Sgerardnico * TODO: Make it a configuration ? 84*2f4da794Sgerardnico */ 85*2f4da794Sgerardnico if($level >= self::LVL_MSG_WARNING) { 8637748cd8SNickeau self::log2file($message, $level, $canonical); 87*2f4da794Sgerardnico } 8837748cd8SNickeau 8937748cd8SNickeau /** 9037748cd8SNickeau * If test, we throw an error 9137748cd8SNickeau */ 9237748cd8SNickeau if (defined('DOKU_UNITTEST') 9337748cd8SNickeau && ($level >= self::LVL_MSG_WARNING) 9437748cd8SNickeau ) { 9537748cd8SNickeau throw new \RuntimeException(PluginUtility::$PLUGIN_NAME . " - " . $message); 9637748cd8SNickeau } 9737748cd8SNickeau } 9837748cd8SNickeau 9937748cd8SNickeau /** 10037748cd8SNickeau * Print log to a file 10137748cd8SNickeau * 10237748cd8SNickeau * Adapted from {@link dbglog} 10337748cd8SNickeau * Note: {@link dbg()} dbg print to the web page 10437748cd8SNickeau * 10537748cd8SNickeau * @param string $msg 10637748cd8SNickeau * @param int $logLevel 10737748cd8SNickeau * @param null $canonical 10837748cd8SNickeau */ 10937748cd8SNickeau static function log2file($msg, $logLevel = self::LVL_MSG_INFO, $canonical = null) 11037748cd8SNickeau { 11137748cd8SNickeau 11237748cd8SNickeau if (defined('DOKU_UNITTEST') || $logLevel >= self::LVL_MSG_WARNING) { 11337748cd8SNickeau 11437748cd8SNickeau $prefix = PluginUtility::$PLUGIN_NAME; 11537748cd8SNickeau if (!empty($canonical)) { 11637748cd8SNickeau $prefix .= ' - ' . $canonical; 11737748cd8SNickeau } 11837748cd8SNickeau $msg = $prefix . ' - ' . $msg; 11937748cd8SNickeau 12037748cd8SNickeau global $INPUT; 12137748cd8SNickeau global $conf; 12237748cd8SNickeau 12337748cd8SNickeau $id = PluginUtility::getPageId(); 12437748cd8SNickeau 12537748cd8SNickeau $file = $conf['cachedir'] . '/debug.log'; 12637748cd8SNickeau $fh = fopen($file, 'a'); 12737748cd8SNickeau if ($fh) { 12837748cd8SNickeau $sep = " - "; 12937748cd8SNickeau fwrite($fh, date('c') . $sep . self::LVL_NAME[$logLevel] . $sep . $msg . $sep . $INPUT->server->str('REMOTE_ADDR') . $sep . $id . "\n"); 13037748cd8SNickeau fclose($fh); 13137748cd8SNickeau } 13237748cd8SNickeau } 13337748cd8SNickeau 13437748cd8SNickeau } 13537748cd8SNickeau 13637748cd8SNickeau /** 13737748cd8SNickeau * @param $message 13837748cd8SNickeau * @param $level 13937748cd8SNickeau * @param $canonical 14037748cd8SNickeau * @param bool $withIconURL 14137748cd8SNickeau */ 14237748cd8SNickeau public static function log2FrontEnd($message, $level, $canonical="support", $withIconURL = true) 14337748cd8SNickeau { 14437748cd8SNickeau /** 14537748cd8SNickeau * If we are not in the console 14637748cd8SNickeau * and not in test 14737748cd8SNickeau * we test that the message comes in the front end 14837748cd8SNickeau * (example {@link \plugin_combo_frontmatter_test} 14937748cd8SNickeau */ 15037748cd8SNickeau $isCLI = (php_sapi_name() == 'cli'); 15137748cd8SNickeau $print = true; 15237748cd8SNickeau if ($isCLI) { 15337748cd8SNickeau if (!defined('DOKU_UNITTEST')) { 15437748cd8SNickeau $print = false; 15537748cd8SNickeau } 15637748cd8SNickeau } 15737748cd8SNickeau if ($print) { 15837748cd8SNickeau $htmlMsg = PluginUtility::getUrl("", PluginUtility::$PLUGIN_NAME, $withIconURL); 15937748cd8SNickeau if ($canonical != null) { 16037748cd8SNickeau $htmlMsg = PluginUtility::getUrl($canonical, ucfirst(str_replace(":", " ", $canonical))); 16137748cd8SNickeau } 16237748cd8SNickeau 16337748cd8SNickeau /** 16437748cd8SNickeau * Adding page - context information 16537748cd8SNickeau * We are not creating the page 16637748cd8SNickeau * direction from {@link Page::createRequestedPageFromEnvironment()} 16737748cd8SNickeau * because it throws an error message when the environment 16837748cd8SNickeau * is not good, creating a recursive call. 16937748cd8SNickeau */ 17037748cd8SNickeau $id = PluginUtility::getPageId(); 17137748cd8SNickeau if ($id!=null) { 17237748cd8SNickeau $page = Page::createPageFromId($id); 17337748cd8SNickeau if ($page != null) { 17437748cd8SNickeau $htmlMsg .= " - " . $page->getAnchorLink(); 17537748cd8SNickeau } 17637748cd8SNickeau } 17737748cd8SNickeau 17837748cd8SNickeau /** 17937748cd8SNickeau * 18037748cd8SNickeau */ 18137748cd8SNickeau $htmlMsg .= " - " . $message; 18237748cd8SNickeau if ($level > self::LVL_MSG_DEBUG) { 18337748cd8SNickeau $dokuWikiLevel = self::LVL_TO_MSG_LEVEL[$level]; 18437748cd8SNickeau msg($htmlMsg, $dokuWikiLevel, '', '', MSG_USERS_ONLY); 18537748cd8SNickeau } 18637748cd8SNickeau } 18737748cd8SNickeau } 18837748cd8SNickeau 18937748cd8SNickeau /** 19037748cd8SNickeau * Log a message to the browser console 19137748cd8SNickeau * @param $message 19237748cd8SNickeau */ 19337748cd8SNickeau public static function log2BrowserConsole($message) 19437748cd8SNickeau { 19537748cd8SNickeau // TODO 19637748cd8SNickeau } 19737748cd8SNickeau} 198