Modify Styleable to avoid using static inline styles

To prevent CSP violation the following changes has been made in `Styleable::class`:
1) `Styleable::getStyle()` method is modified to return `ipl\Web\Style::class`
2) `Styleable::additionalStyle` property type is changed to array
3) `Styleable::setAdditionalStyle()` parameter type is changed to array
This commit is contained in:
raviks789 2023-08-17 12:28:42 +02:00
parent 4e8107c231
commit 97a14d7b18
3 changed files with 20 additions and 13 deletions

View File

@ -112,7 +112,7 @@ class BarGraph extends Styleable implements Drawable
$rect->setAttribute('data-icinga-graph-index', $index); $rect->setAttribute('data-icinga-graph-index', $index);
} }
$rect->setAttribute('data-icinga-graph-type', 'bar'); $rect->setAttribute('data-icinga-graph-type', 'bar');
$rect->setAdditionalStyle('clip-path: url(#clip);'); $rect->setAdditionalStyle(['clip-path' => 'url(#clip)']);
return $rect; return $rect;
} }

View File

@ -165,8 +165,8 @@ class LineGraph extends Styleable implements Drawable
$path->setFill($this->fill); $path->setFill($this->fill);
} }
$path->setAdditionalStyle('clip-path: url(#clip);'); $path->setAdditionalStyle(['clip-path' => 'url(#clip)']);
$path->setId($this->id); $path->setId($this->id ?? uniqid('line-graph-'));
$group = $path->toSvg($ctx); $group = $path->toSvg($ctx);
foreach ($this->dataset as $x => $point) { foreach ($this->dataset as $x => $point) {
@ -180,7 +180,7 @@ class LineGraph extends Styleable implements Drawable
if (isset($this->tooltips[$x])) { if (isset($this->tooltips[$x])) {
$invisible = new Circle($point[0], $point[1], 20); $invisible = new Circle($point[0], $point[1], 20);
$invisible->setFill($this->strokeColor); $invisible->setFill($this->strokeColor);
$invisible->setAdditionalStyle('opacity: 0.0;'); $invisible->setAdditionalStyle(['opacity' => '0.0']);
$data = array( $data = array(
'label' => isset($this->graphs[$this->order]['label']) ? 'label' => isset($this->graphs[$this->order]['label']) ?
strtolower($this->graphs[$this->order]['label']) : '', strtolower($this->graphs[$this->order]['label']) : '',

View File

@ -5,6 +5,8 @@
namespace Icinga\Chart\Primitive; namespace Icinga\Chart\Primitive;
use DOMElement; use DOMElement;
use Icinga\Util\Csp;
use ipl\Web\Style;
/** /**
* Base class for stylable drawables * Base class for stylable drawables
@ -36,14 +38,14 @@ class Styleable
/** /**
* Additional styles to be appended to the style attribute * Additional styles to be appended to the style attribute
* *
* @var string * @var array<string, string>
*/ */
public $additionalStyle = ''; public $additionalStyle = [];
/** /**
* The id of this element * The id of this element
* *
* @var string * @var ?string
*/ */
public $id = null; public $id = null;
@ -83,7 +85,7 @@ class Styleable
/** /**
* Set additional styles for this drawable * Set additional styles for this drawable
* *
* @param string $styles The styles to set additionally * @param array<string, string> $styles The styles to set additionally
* *
* @return $this Fluid interface * @return $this Fluid interface
*/ */
@ -121,15 +123,20 @@ class Styleable
} }
/** /**
* Return the content of the style attribute as a string * Return the ruleset used for styling the DOMNode
* *
* @return string A string containing styles * @return Style A ruleset containing styles
*/ */
public function getStyle() public function getStyle()
{ {
$base = sprintf("fill: %s; stroke: %s;stroke-width: %s;", $this->fill, $this->strokeColor, $this->strokeWidth); $styles = $this->additionalStyle;
$base .= ';' . $this->additionalStyle . ';'; $styles['fill'] = $this->fill;
return $base; $styles['stroke'] = $this->strokeColor;
$styles['stroke-width'] = (string) $this->strokeWidth;
return (new Style())
->setNonce(Csp::getStyleNonce())
->add("#$this->id", $styles);
} }
/** /**