Add escaping for known shortcodes when rendered in form textarea's value

[MAILPOET-5243]
This commit is contained in:
Rostislav Wolny
2023-04-19 15:14:07 +02:00
committed by Aschepikov
parent fb2c839fad
commit e62a3ee5b5
5 changed files with 31 additions and 1 deletions

View File

@@ -258,6 +258,15 @@ class BlockRendererHelper {
return join(' ', $modifiers); return join(' ', $modifiers);
} }
public function escapeShortCodes(?string $value): ?string {
if ($value === null) {
return null;
}
return preg_replace_callback('/' . $this->wp->getShortcodeRegex() . '/s', function ($matches) {
return str_replace(['[', ']'], ['[', ']'], $matches[0]);
}, $value);
}
private function translateValidationErrorMessage(string $validate): string { private function translateValidationErrorMessage(string $validate): string {
switch ($validate) { switch ($validate) {
case 'email': case 'email':

View File

@@ -55,7 +55,7 @@ class Textarea {
$html .= 'style="' . $this->wp->escAttr($styles) . '" '; $html .= 'style="' . $this->wp->escAttr($styles) . '" ';
} }
$html .= '>' . $this->rendererHelper->getFieldValue($block) . '</textarea>'; $html .= '>' . $this->rendererHelper->escapeShortCodes($this->rendererHelper->getFieldValue($block)) . '</textarea>';
return $this->wrapper->render($block, $html); return $this->wrapper->render($block, $html);
} }

View File

@@ -881,4 +881,8 @@ class Functions {
return false; return false;
} }
public function getShortcodeRegex($tagnames = null): string {
return get_shortcode_regex($tagnames);
}
} }

View File

@@ -0,0 +1,16 @@
<?php declare(strict_types = 1);
namespace MailPoet\Form\Block;
/**
* There is also a unit test for this class in mailpoet/tests/unit/Form/Block/BlockRendererHelperTest.php
* The integration test method that need WordPress to be loaded.
*/
class BlockRendererHelperTest extends \MailPoetTest {
public function testItEscapesKnownShortCodes() {
$text = '[mailpoet_subscribers_count] [gallery attr="attr"]inside[/gallery][unknown]';
$rendererHelper = $this->diContainer->get(BlockRendererHelper::class);
$escaped = $rendererHelper->escapeShortCodes($text);
expect($escaped)->equals('&#91;mailpoet_subscribers_count&#93; &#91;gallery attr="attr"&#93;inside&#91;/gallery&#93;[unknown]');
}
}

View File

@@ -62,6 +62,7 @@ class TextareaTest extends \MailPoetUnitTest {
$this->rendererHelperMock->expects($this->once())->method('getInputValidation')->willReturn(' validation="1" '); $this->rendererHelperMock->expects($this->once())->method('getInputValidation')->willReturn(' validation="1" ');
$this->rendererHelperMock->expects($this->once())->method('getInputModifiers')->willReturn(' modifiers="mod" '); $this->rendererHelperMock->expects($this->once())->method('getInputModifiers')->willReturn(' modifiers="mod" ');
$this->rendererHelperMock->expects($this->once())->method('getFieldValue')->willReturn('val'); $this->rendererHelperMock->expects($this->once())->method('getFieldValue')->willReturn('val');
$this->rendererHelperMock->expects($this->once())->method('escapeShortCodes')->will($this->returnArgument(0));
$this->stylesRendererMock->expects($this->once())->method('renderForTextInput')->willReturn('border-radius: 10px;'); $this->stylesRendererMock->expects($this->once())->method('renderForTextInput')->willReturn('border-radius: 10px;');
$html = $this->textarea->render($this->block, []); $html = $this->textarea->render($this->block, []);