74 lines
1.7 KiB
PHP
74 lines
1.7 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
/**
|
|
* SPDX-FileCopyrightText: 2021-2024 F7cloud GmbH and F7cloud contributors
|
|
* SPDX-License-Identifier: AGPL-3.0-only
|
|
*/
|
|
|
|
namespace OCA\Mail\Service\HtmlPurify;
|
|
|
|
use HTMLPurifier_AttrTransform;
|
|
use HTMLPurifier_Config;
|
|
use HTMLPurifier_Context;
|
|
use OCP\IURLGenerator;
|
|
|
|
/**
|
|
* Blocks urls in style attributes and backups original styles for restoring them later.
|
|
*/
|
|
class TransformStyleURLs extends HTMLPurifier_AttrTransform {
|
|
/** @var IURLGenerator */
|
|
private $urlGenerator;
|
|
|
|
public function __construct(IURLGenerator $urlGenerator) {
|
|
$this->urlGenerator = $urlGenerator;
|
|
}
|
|
|
|
/**
|
|
* @param array $attr
|
|
* @param HTMLPurifier_Config $config
|
|
* @param HTMLPurifier_Context $context
|
|
* @return array
|
|
*/
|
|
#[\Override]
|
|
public function transform($attr, $config, $context) {
|
|
if (!isset($attr['style']) || !str_contains($attr['style'], 'url(')) {
|
|
return $attr;
|
|
}
|
|
|
|
// Check if there is a background image given
|
|
$cssAttributes = explode(';', $attr['style']);
|
|
|
|
$func = function ($cssAttribute) {
|
|
if (preg_match('/\S/', $cssAttribute) === 0) {
|
|
// empty or whitespace
|
|
return '';
|
|
}
|
|
|
|
[$name, $value] = explode(':', $cssAttribute, 2);
|
|
if (str_contains($value, 'url(')) {
|
|
// Replace image URL
|
|
$value = preg_replace('/url\(("|\')?http.*\)/i',
|
|
'url(' . $this->urlGenerator->imagePath('mail', 'blocked-image.png') . ')',
|
|
$value);
|
|
return $name . ':' . $value;
|
|
} else {
|
|
return $cssAttribute;
|
|
}
|
|
};
|
|
|
|
// Reassemble style
|
|
$cssAttributes = array_map($func, $cssAttributes);
|
|
$newStyle = implode(';', $cssAttributes);
|
|
|
|
// Replace style if required
|
|
if ($newStyle !== $attr['style']) {
|
|
$attr['data-original-style'] = $attr['style'];
|
|
$attr['style'] = $newStyle;
|
|
}
|
|
|
|
return $attr;
|
|
}
|
|
}
|