<?php
//----------------------------------------------------------------------
// src/Services/LogTools.php
//----------------------------------------------------------------------
namespace App\Services;
use Doctrine\Persistence\ManagerRegistry;
use Psr\Log\LoggerInterface;
use Symfony\Component\Security\Core\Authentication\Token\SwitchUserToken;
use Symfony\Component\Security\Core\Security;
use Symfony\Contracts\Translation\TranslatorInterface;
use App\Entity\Access;
class LogTools
{
public function __construct(ManagerRegistry $doctrine, TranslatorInterface $translator, Security $security, LoggerInterface $ouchLogger)
{
$this->em = $doctrine->getManager();
$this->translator = $translator;
$this->security = $security;
$this->ouchLogger = $ouchLogger;
}
public function plooplog($msg)
{
error_log("\n".$msg."\n", 3, "ploop.log");
}
public function ploop_debug($active, $msg)
{
if (!$active)
return false;
error_log("\n".$msg."\n",3,"ploop.log");
}
public function errorlog_db($e)
{
if (!is_object($e))
{
return null;
}
if (!($e instanceof \Exception))
{
return null;
}
$sql = null;
$params = null;
$msg = null;
if (method_exists($e, 'getMessage') &&
method_exists($e, 'getQuery') &&
method_exists($e->getQuery(), 'getSql') &&
method_exists($e->getQuery(), 'getParams'))
{
$sql = $e->getQuery()->getSql();
$params = print_r($e->getQuery()->getParams(), true);
$msg = $e->getMessage();
}
$backTrace = debug_backtrace()[1];
$method = $backTrace['function'];
$class = $backTrace['class'];
// Access handling
$access = $this->getCurrentUser();
$originalUser = $this->getOriginalUser();
$accessData = "";
$originalUserData = "";
if ($access !== null)
{
$accessData = $access->displayForLog();
}
if ($originalUser !== null)
{
$originalUserData = $originalUser->displayForLog();
}
$args = array(
'class' => $class,
'method' => $method,
'access' => $accessData,
'original_access' => $originalUserData,
'msg' => $msg,
'query' => $sql,
'params' => $params,
);
$this->plooplog(print_r($args, true));
$this->ouchLogger->error('', $args);
}
public function errorlog($msg)
{
$backTrace = debug_backtrace()[1];
$method = $backTrace['function'];
$class = $backTrace['class'];
// Access handling
$access = $this->getCurrentUser();
$originalUser = $this->getOriginalUser();
$accessData = "";
$originalUserData = "";
if ($access !== null)
{
$accessData = $access->displayForLog();
}
if ($originalUser !== null)
{
$originalUserData = $originalUser->displayForLog();
}
$args = array(
'class' => $class,
'method' => $method,
'access' => $accessData,
'original_access' => $originalUserData,
'msg' => $msg,
);
$this->plooplog(print_r($args, true));
$this->ouchLogger->error('', $args);
}
public function getCurrentUser()
{
$access = $this->security->getUser();
if (empty($access))
{
$access = $this->em->getRepository(Access::class)->findOneByEmail(Access::EMPTY_ACCESS);
}
return $access;
}
// https://symfony.com/doc/5.4/security/impersonating_user.html
// This is also in AccessTools
// This is also in LogTools
public function getOriginalUser()
{
$originalUser = null;
// #3251 Fix to avoid infinity loop
$currentUser = $this->getCurrentUser();
if ($currentUser === null || $currentUser->getEmail() == Access::EMPTY_ACCESS)
{
return null;
}
$token = $this->security->getToken();
if ($token instanceof SwitchUserToken)
{
$originalUser = $token->getOriginalToken()->getUser();
}
return $originalUser;
}
}