PluginProbe ʕ •ᴥ•ʔ
Independent Analytics – WordPress Analytics Plugin / 2.15.0
Independent Analytics – WordPress Analytics Plugin v2.15.0
2.15.0 2.14.10 trunk 1.1 1.10 1.10.1 1.11 1.12 1.13 1.14 1.15 1.16 1.17 1.17.1 1.17.2 1.17.3 1.17.4 1.18 1.18.1 1.19.0 1.19.1 1.2 1.20.0 1.21.0 1.22.0 1.22.1 1.23.0 1.23.1 1.24.0 1.24.1 1.25.0 1.25.1 1.26.0 1.27.0 1.28.0 1.28.1 1.28.2 1.28.3 1.29.0 1.3 1.30.0 1.30.1 1.4 1.5 1.6 1.7 1.8 1.9 2.0.0 2.0.1 2.1.4 2.1.5 2.1.6 2.10.0 2.10.1 2.10.2 2.10.3 2.10.4 2.11.0 2.11.1 2.11.10 2.11.2 2.11.3 2.11.4 2.11.5 2.11.6 2.11.7 2.11.8 2.11.9 2.12.0 2.12.1 2.12.2 2.13.1 2.13.2 2.13.5 2.13.6 2.14.0 2.14.1 2.14.2 2.14.4 2.14.6 2.14.7 2.14.8 2.14.9 2.2.0 2.2.1 2.3.1 2.3.2 2.4.2 2.4.3 2.5.0 2.5.1 2.6.0 2.6.1 2.6.2 2.6.3 2.6.4 2.7.0 2.7.1 2.7.2 2.7.3 2.8.2 2.8.3 2.8.4 2.8.5 2.8.6 2.8.7 2.8.8 2.8.9 2.9.2 2.9.3 2.9.4 2.9.5 2.9.6 2.9.7
independent-analytics / vendor / league / csv / src / EscapeFormula.php
independent-analytics / vendor / league / csv / src Last commit date
AbstractCsv.php 4 days ago ByteSequence.php 4 days ago CannotInsertRecord.php 4 days ago CharsetConverter.php 4 days ago ColumnConsistency.php 4 days ago EncloseField.php 4 days ago EscapeFormula.php 4 days ago Exception.php 9 months ago HTMLConverter.php 4 days ago Info.php 4 days ago InvalidArgument.php 9 months ago MapIterator.php 4 days ago RFC4180Field.php 4 days ago Reader.php 4 days ago ResultSet.php 4 days ago Statement.php 4 days ago Stream.php 4 days ago SyntaxError.php 4 days ago TabularDataReader.php 4 days ago UnableToProcessCsv.php 9 months ago UnavailableFeature.php 9 months ago UnavailableStream.php 9 months ago Writer.php 4 days ago XMLConverter.php 4 days ago functions.php 9 months ago functions_include.php 9 months ago
EscapeFormula.php
131 lines
1 <?php
2
3 /**
4 * League.Csv (https://csv.thephpleague.com)
5 *
6 * (c) Ignace Nyamagana Butera <nyamsprod@gmail.com>
7 *
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
10 */
11 declare (strict_types=1);
12 namespace IAWPSCOPED\League\Csv;
13
14 use InvalidArgumentException;
15 use function array_fill_keys;
16 use function array_keys;
17 use function array_map;
18 use function array_merge;
19 use function array_unique;
20 use function is_object;
21 use function is_string;
22 use function method_exists;
23 /**
24 * A Formatter to tackle CSV Formula Injection.
25 *
26 * @see http://georgemauer.net/2017/10/07/csv-injection.html
27 * @internal
28 */
29 class EscapeFormula
30 {
31 /** Spreadsheet formula starting character. */
32 const FORMULA_STARTING_CHARS = ['=', '-', '+', '@', "\t", "\r"];
33 /** Effective Spreadsheet formula starting characters. */
34 protected array $special_chars = [];
35 /** Escape character to escape each CSV formula field. */
36 protected string $escape;
37 /**
38 * @param string $escape escape character to escape each CSV formula field
39 * @param string[] $special_chars additional spreadsheet formula starting characters
40 */
41 public function __construct(string $escape = "'", array $special_chars = [])
42 {
43 $this->escape = $escape;
44 if ([] !== $special_chars) {
45 $special_chars = $this->filterSpecialCharacters(...$special_chars);
46 }
47 $chars = array_unique(array_merge(self::FORMULA_STARTING_CHARS, $special_chars));
48 $this->special_chars = array_fill_keys($chars, 1);
49 }
50 /**
51 * Filter submitted special characters.
52 *
53 * @param string ...$characters
54 *
55 * @throws InvalidArgumentException if the string is not a single character
56 *
57 * @return array<string>
58 */
59 protected function filterSpecialCharacters(string ...$characters) : array
60 {
61 foreach ($characters as $str) {
62 if (1 != \strlen($str)) {
63 throw new InvalidArgumentException('The submitted string ' . $str . ' must be a single character');
64 }
65 }
66 return $characters;
67 }
68 /**
69 * Returns the list of character the instance will escape.
70 *
71 * @return array<string>
72 */
73 public function getSpecialCharacters() : array
74 {
75 return array_keys($this->special_chars);
76 }
77 /**
78 * Returns the escape character.
79 */
80 public function getEscape() : string
81 {
82 return $this->escape;
83 }
84 /**
85 * League CSV formatter hook.
86 *
87 * @see escapeRecord
88 */
89 public function __invoke(array $record) : array
90 {
91 return $this->escapeRecord($record);
92 }
93 /**
94 * Escape a CSV record.
95 */
96 public function escapeRecord(array $record) : array
97 {
98 return array_map([$this, 'escapeField'], $record);
99 }
100 /**
101 * Escape a CSV cell if its content is stringable.
102 *
103 * @param int|float|string|object|resource|array $cell the content of the cell
104 *
105 * @return mixed the escaped content
106 */
107 protected function escapeField($cell)
108 {
109 if (!is_string($cell) && (!is_object($cell) || !method_exists($cell, '__toString'))) {
110 return $cell;
111 }
112 $str_cell = (string) $cell;
113 if (isset($str_cell[0], $this->special_chars[$str_cell[0]])) {
114 return $this->escape . $str_cell;
115 }
116 return $cell;
117 }
118 /**
119 * @deprecated since 9.7.2 will be removed in the next major release
120 * @codeCoverageIgnore
121 *
122 * Tells whether the submitted value is stringable.
123 *
124 * @param mixed $value value to check if it is stringable
125 */
126 protected function isStringable($value) : bool
127 {
128 return is_string($value) || is_object($value) && method_exists($value, '__toString');
129 }
130 }
131