xref: /plugin/combo/ComboStrap/LogUtility.php (revision 2f4da794995388a7aaff6ec355c28c615e2d7330)
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