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>