Spaces:
No application file
No application file
File size: 2,933 Bytes
d2897cd |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 |
<?php
namespace Mautic\ConfigBundle\Service;
use Mautic\CoreBundle\Helper\IpLookupHelper;
use Mautic\CoreBundle\Model\AuditLogModel;
use Symfony\Component\HttpFoundation\File\UploadedFile;
/**
* Compare normalized for data and log changes.
*/
class ConfigChangeLogger
{
/**
* Keys to remove from log.
*
* @var string[]
*/
private array $filterKeys = [
'transifex_password',
'mailer_is_owner',
];
/**
* @var mixed[]|null
*/
private ?array $originalNormData = null;
public function __construct(
private IpLookupHelper $ipLookupHelper,
private AuditLogModel $auditLogModel
) {
}
/**
* @return ConfigChangeLogger
*/
public function setOriginalNormData(array $originalNormData)
{
$this->originalNormData = $originalNormData;
return $this;
}
/**
* Log changes if something was changed.
* Diff is based on form normalized data before and after post.
*
* @see Form::getNormData()
*/
public function log(array $postNormData): void
{
if (null === $this->originalNormData) {
throw new \RuntimeException('Set original normalized data at first');
}
$originalData = $this->normalizeData($this->originalNormData);
$postData = $this->filterData($this->normalizeData($postNormData));
$diff = [];
foreach ($postData as $key => $value) {
if (array_key_exists($key, $originalData) && $originalData[$key] != $value) {
if ($value instanceof UploadedFile) {
$value = $value->getFilename();
}
$diff[$key] = $value;
}
}
if (empty($diff)) {
return;
}
$log = [
'bundle' => 'config',
'object' => 'config',
'objectId' => 0,
'action' => 'update',
'details' => $diff,
'ipAddress' => $this->ipLookupHelper->getIpAddressFromRequest(),
];
$this->auditLogModel->writeToLog($log);
}
/**
* Some form data (AssetBundle) has 'parameters' inside array too.
* Normalize all.
*/
private function normalizeData(array $data): array
{
$key = 'parameters';
$normData = [];
foreach ($data as $values) {
if (array_key_exists($key, $values)) {
$normData = array_merge($normData, $values[$key]);
} else {
$normData = array_merge($normData, $values);
}
}
return $normData;
}
/**
* Filter unused keys from post data.
*/
private function filterData(array $data): array
{
$keys = $this->filterKeys;
return array_filter($data, fn ($key): bool => !in_array($key, $keys),
ARRAY_FILTER_USE_KEY);
}
}
|