Нет описания

ApiDataSanitizer.php 1.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. <?php
  2. namespace MailPoet\Form;
  3. if (!defined('ABSPATH')) exit;
  4. class ApiDataSanitizer {
  5. /** @var FormHtmlSanitizer */
  6. private $htmlSanitizer;
  7. /**
  8. * List of blocks and their parameters that will be sanitized
  9. * @var string[][]
  10. */
  11. private $htmlSanitizeConfig = [
  12. 'paragraph' => [
  13. 'content',
  14. ],
  15. 'heading' => [
  16. 'content',
  17. ],
  18. 'image' => [
  19. 'caption',
  20. ],
  21. 'checkbox' => [
  22. 'values',
  23. ],
  24. ];
  25. public function __construct(
  26. FormHtmlSanitizer $htmlSanitizer
  27. ) {
  28. $this->htmlSanitizer = $htmlSanitizer;
  29. }
  30. public function sanitizeBody(array $body): array {
  31. foreach ($body as $key => $block) {
  32. $sanitizedBlock = $this->sanitizeBlock($block);
  33. if (isset($sanitizedBlock['body']) && is_array($sanitizedBlock['body']) && !empty($sanitizedBlock['body'])) {
  34. $sanitizedBlock['body'] = $this->sanitizeBody($sanitizedBlock['body']);
  35. }
  36. $body[$key] = $sanitizedBlock;
  37. }
  38. return $body;
  39. }
  40. private function sanitizeBlock(array $block): array {
  41. if (!isset($this->htmlSanitizeConfig[$block['type']])) {
  42. return $block;
  43. }
  44. $params = $block['params'] ?? [];
  45. foreach ($this->htmlSanitizeConfig[$block['type']] as $parameter) {
  46. if (!isset($params[$parameter])) continue;
  47. if ($parameter === 'values' && is_array($params[$parameter])) {
  48. $params[$parameter] = $this->sanitizeValues($params[$parameter]);
  49. } else {
  50. $params[$parameter] = $this->htmlSanitizer->sanitize($params[$parameter]);
  51. }
  52. }
  53. $block['params'] = $params;
  54. return $block;
  55. }
  56. private function sanitizeValues(array $values) {
  57. foreach ($values as $key => $value) {
  58. if (!isset($value['value'])) continue;
  59. $values[$key]['value'] = $this->htmlSanitizer->sanitize($value['value']);
  60. }
  61. return $values;
  62. }
  63. }