HEX
Server: Apache/2.4.6 (CentOS) OpenSSL/1.0.2k-fips PHP/7.4.30
System: Linux iZj6c1151k3ad370bosnmsZ 3.10.0-1160.76.1.el7.x86_64 #1 SMP Wed Aug 10 16:21:17 UTC 2022 x86_64
User: root (0)
PHP: 7.4.30
Disabled: NONE
Upload Files
File: //var/www/html/phpmyfaq/admin/stat.main.php
<?php

/**
 * The main statistics page.
 *
 * This Source Code Form is subject to the terms of the Mozilla Public License,
 * v. 2.0. If a copy of the MPL was not distributed with this file, You can
 * obtain one at http://mozilla.org/MPL/2.0/.
 *
 * @package phpMyFAQ
 * @author Thorsten Rinne <thorsten@phpmyfaq.de>
 * @author Matteo Scaramuccia <matteo@scaramuccia.com>
 * @copyright 2003-2022 phpMyFAQ Team
 * @license http://www.mozilla.org/MPL/2.0/ Mozilla Public License Version 2.0
 * @link https://www.phpmyfaq.de
 * @since 2003-02-24
 */

use phpMyFAQ\Date;
use phpMyFAQ\Filter;
use phpMyFAQ\Session;
use phpMyFAQ\Visits;

if (!defined('IS_VALID_PHPMYFAQ')) {
    http_response_code(400);
    exit();
}
?>
<header class="row">
  <div class="col-lg-12">
    <h2 class="page-header">
      <i aria-hidden="true" class="fa fa-tasks"></i> <?= $PMF_LANG['ad_stat_sess'] ?>
      <div class="float-right">
        <a class="btn btn-danger"
           href="?action=clear-visits&csrf=<?= $user->getCsrfTokenFromSession() ?>">
          <i aria-hidden="true" class="fa fa-trash"></i> <?= $PMF_LANG['ad_clear_all_visits'] ?>
        </a>
      </div>
    </h2>
  </div>
</header>

<div class="row">
  <div class="col-lg-12">
      <?php
        if ($user->perm->hasPermission($user->getUserId(), 'viewlog')) {
            $session = new Session($faqConfig);
            $date = new Date($faqConfig);
            $visits = new Visits($faqConfig);
            $statdelete = Filter::filterInput(INPUT_POST, 'statdelete', FILTER_UNSAFE_RAW);
            $month = Filter::filterInput(INPUT_POST, 'month', FILTER_UNSAFE_RAW);
            $csrfTokenFromPost = Filter::filterInput(INPUT_POST, 'csrf', FILTER_UNSAFE_RAW);
            $csrfTokenFromGet = Filter::filterInput(INPUT_GET, 'csrf', FILTER_UNSAFE_RAW);

            if (!isset($_SESSION['phpmyfaq_csrf_token']) || $_SESSION['phpmyfaq_csrf_token'] !== $csrfTokenFromPost) {
                $statdelete = null;
            }

            if (!isset($_SESSION['phpmyfaq_csrf_token']) || $_SESSION['phpmyfaq_csrf_token'] !== $csrfTokenFromGet) {
                $clearVisits = false;
            } else {
                $clearVisits = true;
            }

            // Delete sessions and session files
            if (!is_null($statdelete) && !is_null($month)) {
                $dir = opendir(PMF_ROOT_DIR . '/data');
                $first = 9999999999999999999999999;
                $last = 0;
                while ($trackingFile = readdir($dir)) {
                    // The filename format is: trackingDDMMYYYY
                    // e.g.: tracking02042006
                    if (($trackingFile != '.') && ($trackingFile != '..') && (10 == strpos($trackingFile, $month))) {
                        $candidateFirst = Date::getTrackingFileDate($trackingFile);
                        $candidateLast = Date::getTrackingFileDate($trackingFile, true);
                        if (($candidateLast > 0) && ($candidateLast > $last)) {
                            $last = $candidateLast;
                        }
                        if (($candidateFirst > 0) && ($candidateFirst < $first)) {
                            $first = $candidateFirst;
                        }
                        unlink(PMF_ROOT_DIR . '/data/' . $trackingFile);
                    }
                }
                closedir($dir);
                $session->deleteSessions($first, $last);

                printf('<p class="alert alert-success">%s</p>', $PMF_LANG['ad_adminlog_delete_success']);
            }

            // Reset all visits and sessions
            if ('clear-visits' === $action && $clearVisits) {
                // Clear visits
                $visits->resetAll();

                // Delete logifles
                $files = glob(PMF_ROOT_DIR . '/data/*');
                foreach ($files as $file) {
                    if (is_file($file)) {
                        unlink($file);
                    }
                }

                // Delete sessions
                $session->deleteAllSessions();

                printf('<p class="alert alert-success">%s</p>', $PMF_LANG['ad_reset_visits_success']);
            }
            ?>

        <table class="table table-striped">
          <tr>
            <td><?= $PMF_LANG['ad_stat_days'] ?>:</td>
            <td>
                <?php
                $danz = 0;
                $first = 9999999999999999999999999;
                $last = 0;
                $dir = opendir(PMF_ROOT_DIR . '/data');
                while ($dat = readdir($dir)) {
                    if ($dat != '.' && $dat != '..') {
                        ++$danz;
                    }
                    if (Date::getTrackingFileDate($dat) > $last) {
                        $last = Date::getTrackingFileDate($dat);
                    }
                    if (Date::getTrackingFileDate($dat) < $first && Date::getTrackingFileDate($dat) > 0) {
                        $first = Date::getTrackingFileDate($dat);
                    }
                }
                closedir($dir);

                echo $danz;
                ?>
            </td>
          </tr>
          <tr>
            <td><?= $PMF_LANG['ad_stat_vis']; ?>:</td>
            <td><?= $vanz = $session->getNumberOfSessions() ?></td>
          </tr>
          <tr>
            <td><?= $PMF_LANG['ad_stat_vpd'] ?>:</td>
            <td><?= ($danz != 0) ? round(($vanz / $danz), 2) : 0 ?></td>
          </tr>
          <tr>
            <td><?= $PMF_LANG['ad_stat_fien'] ?>:</td>
            <td>
                <?php
                if (is_file(PMF_ROOT_DIR . '/data/tracking' . date('dmY', $first))) {
                    $fp = @fopen(PMF_ROOT_DIR . '/data/tracking' . date('dmY', $first), 'r');
                    while (($data = fgetcsv($fp, 1024, ';')) !== false) {
                        $qstamp = isset($data[7]) && 10 === strlen($data[7]) ? $data[7] : $_SERVER['REQUEST_TIME'];
                    }
                    fclose($fp);
                    echo $date->format(date('Y-m-d H:i', $qstamp));
                } else {
                    echo $PMF_LANG['ad_sess_noentry'];
                }
                ?>
            </td>
          </tr>
          <tr>
            <td><?= $PMF_LANG['ad_stat_laen'] ?>:</td>
            <td>
                <?php
                if (is_file(PMF_ROOT_DIR . '/data/tracking' . date('dmY', $last))) {
                    $fp = fopen(PMF_ROOT_DIR . '/data/tracking' . date('dmY', $last), 'r');

                    while (($data = fgetcsv($fp, 1024, ';')) !== false) {
                        $stamp = isset($data[7]) && 10 === strlen($data[7]) ? $data[7] : $_SERVER['REQUEST_TIME'];
                    }
                    fclose($fp);

                    if (empty($stamp)) {
                        $stamp = $_SERVER['REQUEST_TIME'];
                    }

                    echo $date->format(date('Y-m-d H:i', $stamp)) . '<br>';
                } else {
                    echo $PMF_LANG['ad_sess_noentry'] . '<br>';
                }

                $dir = opendir(PMF_ROOT_DIR . '/data');
                $trackingDates = [];
                while (false !== ($dat = readdir($dir))) {
                    if ($dat != '.' && $dat != '..' && strlen($dat) == 16 && !is_dir($dat)) {
                        $trackingDates[] = Date::getTrackingFileDate($dat);
                    }
                }
                closedir($dir);
                sort($trackingDates);
                ?>
            </td>
          </tr>
          <tr>
            <td><?= $PMF_LANG['ad_stat_browse'] ?>:</td>
            <td class="col-lg-2">
              <form action="?action=sessionbrowse" method="post" accept-charset="utf-8" class="form-inline">
                <div class="form-group mr-2">
                  <label for="day" class="d-none"><?= $PMF_LANG['ad_stat_browse'] ?></label>
                  <select name="day" id="day" class="form-control">
                      <?php
                        foreach ($trackingDates as $trackingDate) {
                            printf('<option value="%d"', $trackingDate);
                            if (date('Y-m-d', $trackingDate) == strftime('%Y-%m-%d', $_SERVER['REQUEST_TIME'])) {
                                echo ' selected="selected"';
                            }
                            echo '>';
                            echo $date->format(date('Y-m-d H:i', $trackingDate));
                            echo "</option>\n";
                        }
                        ?>
                  </select>
                </div>
                <button class="btn btn-primary" type="submit" name="statbrowse">
                      <?= $PMF_LANG['ad_stat_ok'] ?>
                </button>
              </form>
            </td>
          </tr>
        </table>

        <form action="?action=viewsessions" method="post" class="form-inline">
          <fieldset>
            <input type="hidden" name="csrf" value="<?= $user->getCsrfTokenFromSession() ?>">
            <legend><?= $PMF_LANG['ad_stat_management'] ?></legend>

            <div class="form-group mr-2">
              <label class="col-form-label" for="month"><?= $PMF_LANG['ad_stat_choose'] ?>:</label>
              <select name="month" id="month" class="form-control">
                    <?php
                    $oldValue = mktime(0, 0, 0, 1, 1, 1970);
                    $isFirstDate = true;
                    foreach ($trackingDates as $trackingDate) {
                        if (date('Y-m', $oldValue) != date('Y-m', $trackingDate)) {
                            // The filename format is: trackingDDMMYYYY
                            // e.g.: tracking02042006
                            printf('<option value="%s"', date('mY', $trackingDate));
                            // Select the oldest month
                            if ($isFirstDate) {
                                echo ' selected="selected"';
                                $isFirstDate = false;
                            }
                            echo '>';
                            echo date('Y-m', $trackingDate);
                            echo "</option>\n";
                            $oldValue = $trackingDate;
                        }
                    }
                    ?>
              </select>
            </div>
            <button class="btn btn-primary" type="submit" name="statdelete">
                  <?= $PMF_LANG['ad_stat_delete'] ?>
            </button>
          </fieldset>
        </form>
            <?php
        } else {
            print $PMF_LANG['err_NotAuth'];
        }
        ?>
  </div>
</div>