PluginProbe ʕ •ᴥ•ʔ
Independent Analytics – WordPress Analytics Plugin / 2.14.1
Independent Analytics – WordPress Analytics Plugin v2.14.1
2.15.5 2.15.4 2.15.3 2.15.2 2.15.1 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
Polyfill 10 months ago AbstractCsv.php 10 months ago ByteSequence.php 10 months ago CannotInsertRecord.php 10 months ago CharsetConverter.php 10 months ago ColumnConsistency.php 10 months ago EncloseField.php 10 months ago EscapeFormula.php 10 months ago Exception.php 10 months ago HTMLConverter.php 10 months ago Info.php 10 months ago InvalidArgument.php 10 months ago MapIterator.php 10 months ago RFC4180Field.php 10 months ago Reader.php 10 months ago ResultSet.php 10 months ago Statement.php 10 months ago Stream.php 10 months ago SyntaxError.php 10 months ago TabularDataReader.php 10 months ago UnableToProcessCsv.php 10 months ago UnavailableFeature.php 10 months ago UnavailableStream.php 10 months ago Writer.php 10 months ago XMLConverter.php 10 months ago functions.php 10 months ago functions_include.php 10 months ago
EscapeFormula.php
143 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 /**
32 * Spreadsheet formula starting character.
33 */
34 const FORMULA_STARTING_CHARS = ['=', '-', '+', '@', "\t", "\r"];
35 /**
36 * Effective Spreadsheet formula starting characters.
37 *
38 * @var array
39 */
40 protected $special_chars = [];
41 /**
42 * Escape character to escape each CSV formula field.
43 *
44 * @var string
45 */
46 protected $escape;
47 /**
48 * New instance.
49 *
50 * @param string $escape escape character to escape each CSV formula field
51 * @param string[] $special_chars additional spreadsheet formula starting characters
52 *
53 */
54 public function __construct(string $escape = "'", array $special_chars = [])
55 {
56 $this->escape = $escape;
57 if ([] !== $special_chars) {
58 $special_chars = $this->filterSpecialCharacters(...$special_chars);
59 }
60 $chars = array_unique(array_merge(self::FORMULA_STARTING_CHARS, $special_chars));
61 $this->special_chars = array_fill_keys($chars, 1);
62 }
63 /**
64 * Filter submitted special characters.
65 *
66 * @param string ...$characters
67 *
68 * @throws InvalidArgumentException if the string is not a single character
69 *
70 * @return string[]
71 */
72 protected function filterSpecialCharacters(string ...$characters) : array
73 {
74 foreach ($characters as $str) {
75 if (1 != \strlen($str)) {
76 throw new InvalidArgumentException('The submitted string ' . $str . ' must be a single character');
77 }
78 }
79 return $characters;
80 }
81 /**
82 * Returns the list of character the instance will escape.
83 *
84 * @return string[]
85 */
86 public function getSpecialCharacters() : array
87 {
88 return array_keys($this->special_chars);
89 }
90 /**
91 * Returns the escape character.
92 */
93 public function getEscape() : string
94 {
95 return $this->escape;
96 }
97 /**
98 * League CSV formatter hook.
99 *
100 * @see escapeRecord
101 */
102 public function __invoke(array $record) : array
103 {
104 return $this->escapeRecord($record);
105 }
106 /**
107 * Escape a CSV record.
108 */
109 public function escapeRecord(array $record) : array
110 {
111 return array_map([$this, 'escapeField'], $record);
112 }
113 /**
114 * Escape a CSV cell if its content is stringable.
115 *
116 * @param int|float|string|object|resource|array $cell the content of the cell
117 *
118 * @return mixed the escaped content
119 */
120 protected function escapeField($cell)
121 {
122 if (!is_string($cell) && (!is_object($cell) || !method_exists($cell, '__toString'))) {
123 return $cell;
124 }
125 $str_cell = (string) $cell;
126 if (isset($str_cell[0], $this->special_chars[$str_cell[0]])) {
127 return $this->escape . $str_cell;
128 }
129 return $cell;
130 }
131 /**
132 * @deprecated since 9.7.2 will be removed in the next major release
133 *
134 * Tells whether the submitted value is stringable.
135 *
136 * @param mixed $value value to check if it is stringable
137 */
138 protected function isStringable($value) : bool
139 {
140 return is_string($value) || is_object($value) && method_exists($value, '__toString');
141 }
142 }
143