Safe SVG - Version 1.9.5

Version Description

  • Underlying library update that fixes some security issues
Download this release

Release Info

Developer enshrined
Plugin Icon 128x128 Safe SVG
Version 1.9.5
Comparing to
See all releases

Code changes from version 1.9.4 to 1.9.5

Files changed (31) hide show
  1. composer.json +15 -0
  2. lib/composer.lock +10 -6
  3. lib/vendor/composer/installed.json +11 -7
  4. lib/vendor/enshrined/svg-sanitize/.gitignore +1 -0
  5. lib/vendor/enshrined/svg-sanitize/README.md +21 -1
  6. lib/vendor/enshrined/svg-sanitize/composer.json +10 -2
  7. lib/vendor/enshrined/svg-sanitize/composer.lock +0 -2259
  8. lib/vendor/enshrined/svg-sanitize/{phpunit.xml.dist → phpunit.xml} +1 -2
  9. lib/vendor/enshrined/svg-sanitize/src/ElementReference/Resolver.php +123 -0
  10. lib/vendor/enshrined/svg-sanitize/src/ElementReference/Subject.php +148 -0
  11. lib/vendor/enshrined/svg-sanitize/src/ElementReference/Usage.php +49 -0
  12. lib/vendor/enshrined/svg-sanitize/src/Helper.php +53 -0
  13. lib/vendor/enshrined/svg-sanitize/src/Sanitizer.php +132 -13
  14. lib/vendor/enshrined/svg-sanitize/src/data/AttributeInterface.php +0 -2
  15. lib/vendor/enshrined/svg-sanitize/src/data/TagInterface.php +0 -3
  16. lib/vendor/enshrined/svg-sanitize/src/data/XPath.php +64 -0
  17. lib/vendor/enshrined/svg-sanitize/src/svg-scanner.php +187 -0
  18. lib/vendor/enshrined/svg-sanitize/tests/AllowedAttributesTest.php +2 -1
  19. lib/vendor/enshrined/svg-sanitize/tests/AllowedTagsTest.php +2 -1
  20. lib/vendor/enshrined/svg-sanitize/tests/{data → Fixtures}/TestAllowedAttributes.php +4 -3
  21. lib/vendor/enshrined/svg-sanitize/tests/{data → Fixtures}/TestAllowedTags.php +4 -3
  22. lib/vendor/enshrined/svg-sanitize/tests/SanitizerTest.php +68 -22
  23. lib/vendor/enshrined/svg-sanitize/tests/SubjectTest.php +143 -0
  24. lib/vendor/enshrined/svg-sanitize/tests/data/hrefCleanOne.svg +2 -0
  25. lib/vendor/enshrined/svg-sanitize/tests/data/hrefTestOne.svg +2 -0
  26. lib/vendor/enshrined/svg-sanitize/tests/data/xlinkLaughsClean.svg +69 -0
  27. lib/vendor/enshrined/svg-sanitize/tests/data/xlinkLaughsTest.svg +146 -0
  28. lib/vendor/enshrined/svg-sanitize/tests/data/xlinkLoopClean.svg +6 -0
  29. lib/vendor/enshrined/svg-sanitize/tests/data/xlinkLoopTest.svg +31 -0
  30. readme.txt +16 -3
  31. safe-svg.php +1 -1
composer.json ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "darylldoyle/safe-svg",
3
+ "description": "Enable SVG uploads and sanitize them to stop XML/SVG vulnerabilities in your WordPress website",
4
+ "type": "wordpress-plugin",
5
+ "license": "GPL-2.0-or-later",
6
+ "authors": [
7
+ {
8
+ "name": "Daryll Doyle",
9
+ "homepage": "https://wpsvg.com/"
10
+ }
11
+ ],
12
+ "require": {
13
+ "php": "^5.6 || ^7.0"
14
+ }
15
+ }
lib/composer.lock CHANGED
@@ -8,18 +8,22 @@
8
  "packages": [
9
  {
10
  "name": "enshrined/svg-sanitize",
11
- "version": "0.9.2",
12
  "source": {
13
  "type": "git",
14
  "url": "https://github.com/darylldoyle/svg-sanitizer.git",
15
- "reference": "e0cb5ad3abea5459e0962cf79a92d34714c74dfa"
16
  },
17
  "dist": {
18
  "type": "zip",
19
- "url": "https://api.github.com/repos/darylldoyle/svg-sanitizer/zipball/e0cb5ad3abea5459e0962cf79a92d34714c74dfa",
20
- "reference": "e0cb5ad3abea5459e0962cf79a92d34714c74dfa",
21
  "shasum": ""
22
  },
 
 
 
 
23
  "require-dev": {
24
  "codeclimate/php-test-reporter": "^0.1.2",
25
  "phpunit/phpunit": "^6"
@@ -32,7 +36,7 @@
32
  },
33
  "notification-url": "https://packagist.org/downloads/",
34
  "license": [
35
- "GPL-2.0+"
36
  ],
37
  "authors": [
38
  {
@@ -41,7 +45,7 @@
41
  }
42
  ],
43
  "description": "An SVG sanitizer for PHP",
44
- "time": "2018-10-01T17:11:02+00:00"
45
  }
46
  ],
47
  "packages-dev": [],
8
  "packages": [
9
  {
10
  "name": "enshrined/svg-sanitize",
11
+ "version": "0.12.0",
12
  "source": {
13
  "type": "git",
14
  "url": "https://github.com/darylldoyle/svg-sanitizer.git",
15
+ "reference": "51ca4b713f3706d6b27769c6296bbc0c28a5bbd0"
16
  },
17
  "dist": {
18
  "type": "zip",
19
+ "url": "https://api.github.com/repos/darylldoyle/svg-sanitizer/zipball/51ca4b713f3706d6b27769c6296bbc0c28a5bbd0",
20
+ "reference": "51ca4b713f3706d6b27769c6296bbc0c28a5bbd0",
21
  "shasum": ""
22
  },
23
+ "require": {
24
+ "ext-dom": "*",
25
+ "ext-libxml": "*"
26
+ },
27
  "require-dev": {
28
  "codeclimate/php-test-reporter": "^0.1.2",
29
  "phpunit/phpunit": "^6"
36
  },
37
  "notification-url": "https://packagist.org/downloads/",
38
  "license": [
39
+ "GPL-2.0-or-later"
40
  ],
41
  "authors": [
42
  {
45
  }
46
  ],
47
  "description": "An SVG sanitizer for PHP",
48
+ "time": "2019-10-21T22:39:08+00:00"
49
  }
50
  ],
51
  "packages-dev": [],
lib/vendor/composer/installed.json CHANGED
@@ -1,24 +1,28 @@
1
  [
2
  {
3
  "name": "enshrined/svg-sanitize",
4
- "version": "0.9.2",
5
- "version_normalized": "0.9.2.0",
6
  "source": {
7
  "type": "git",
8
  "url": "https://github.com/darylldoyle/svg-sanitizer.git",
9
- "reference": "e0cb5ad3abea5459e0962cf79a92d34714c74dfa"
10
  },
11
  "dist": {
12
  "type": "zip",
13
- "url": "https://api.github.com/repos/darylldoyle/svg-sanitizer/zipball/e0cb5ad3abea5459e0962cf79a92d34714c74dfa",
14
- "reference": "e0cb5ad3abea5459e0962cf79a92d34714c74dfa",
15
  "shasum": ""
16
  },
 
 
 
 
17
  "require-dev": {
18
  "codeclimate/php-test-reporter": "^0.1.2",
19
  "phpunit/phpunit": "^6"
20
  },
21
- "time": "2018-10-01T17:11:02+00:00",
22
  "type": "library",
23
  "installation-source": "dist",
24
  "autoload": {
@@ -28,7 +32,7 @@
28
  },
29
  "notification-url": "https://packagist.org/downloads/",
30
  "license": [
31
- "GPL-2.0+"
32
  ],
33
  "authors": [
34
  {
1
  [
2
  {
3
  "name": "enshrined/svg-sanitize",
4
+ "version": "0.12.0",
5
+ "version_normalized": "0.12.0.0",
6
  "source": {
7
  "type": "git",
8
  "url": "https://github.com/darylldoyle/svg-sanitizer.git",
9
+ "reference": "51ca4b713f3706d6b27769c6296bbc0c28a5bbd0"
10
  },
11
  "dist": {
12
  "type": "zip",
13
+ "url": "https://api.github.com/repos/darylldoyle/svg-sanitizer/zipball/51ca4b713f3706d6b27769c6296bbc0c28a5bbd0",
14
+ "reference": "51ca4b713f3706d6b27769c6296bbc0c28a5bbd0",
15
  "shasum": ""
16
  },
17
+ "require": {
18
+ "ext-dom": "*",
19
+ "ext-libxml": "*"
20
+ },
21
  "require-dev": {
22
  "codeclimate/php-test-reporter": "^0.1.2",
23
  "phpunit/phpunit": "^6"
24
  },
25
+ "time": "2019-10-21T22:39:08+00:00",
26
  "type": "library",
27
  "installation-source": "dist",
28
  "autoload": {
32
  },
33
  "notification-url": "https://packagist.org/downloads/",
34
  "license": [
35
+ "GPL-2.0-or-later"
36
  ],
37
  "authors": [
38
  {
lib/vendor/enshrined/svg-sanitize/.gitignore CHANGED
@@ -1,3 +1,4 @@
1
  /vendor
2
  /build
3
  /.idea
 
1
  /vendor
2
  /build
3
  /.idea
4
+ composer.lock
lib/vendor/enshrined/svg-sanitize/README.md CHANGED
@@ -48,6 +48,14 @@ This defaults to false, set to true to remove references.
48
 
49
  `$sanitizer->removeRemoteReferences(true);`
50
 
 
 
 
 
 
 
 
 
51
  ## Minification
52
 
53
  You can minify the XML output by calling `$sanitiser->minify(true);`.
@@ -63,9 +71,21 @@ I've just released a WordPress plugin containing this code so you can sanitize y
63
 
64
  [Michael Potter](https://github.com/heyMP) has kindly created a Drupal module for this library which is available at: [https://www.drupal.org/project/svg_sanitizer](https://www.drupal.org/project/svg_sanitizer)
65
 
 
 
 
 
66
  ## Tests
67
 
68
- You can run these by running `phpunit`
 
 
 
 
 
 
 
 
69
 
70
  ## To-Do
71
 
48
 
49
  `$sanitizer->removeRemoteReferences(true);`
50
 
51
+ ## Viewing Sanitisation Issues
52
+
53
+ You may use the `getXmlIssues()` method to return an array of issues that occurred during sanitisation.
54
+
55
+ This may be useful for logging or providing feedback to the user on why an SVG was refused.
56
+
57
+ `$issues = $sanitizer->getXmlIssues();`
58
+
59
  ## Minification
60
 
61
  You can minify the XML output by calling `$sanitiser->minify(true);`.
71
 
72
  [Michael Potter](https://github.com/heyMP) has kindly created a Drupal module for this library which is available at: [https://www.drupal.org/project/svg_sanitizer](https://www.drupal.org/project/svg_sanitizer)
73
 
74
+ ## TYPO3
75
+
76
+ An integration for TYPO3 CMS of this library is available as composer package `t3g/svg-sanitizer` at [https://bitbucket.typo3.com/projects/EXT/repos/svg_sanitizer/](https://bitbucket.typo3.com/projects/EXT/repos/svg_sanitizer/)
77
+
78
  ## Tests
79
 
80
+ You can run these by running `vendor/bin/phpunit` from the base directory of this package.
81
+
82
+ ## Standalone scanning of files via CLI
83
+
84
+ Thanks to the work by [gudmdharalds](https://github.com/gudmdharalds) there's now a standalone scanner that can be used via the CLI.
85
+
86
+ Any errors will be output in JSON format. See [the PR](https://github.com/darylldoyle/svg-sanitizer/pull/25) for an example.
87
+
88
+ Use it as follows: `php svg-scanner.php ~/svgs/myfile.svg`
89
 
90
  ## To-Do
91
 
lib/vendor/enshrined/svg-sanitize/composer.json CHANGED
@@ -1,7 +1,7 @@
1
  {
2
  "name": "enshrined/svg-sanitize",
3
  "description": "An SVG sanitizer for PHP",
4
- "license": "GPL-2.0+",
5
  "authors": [
6
  {
7
  "name": "Daryll Doyle",
@@ -13,8 +13,16 @@
13
  "enshrined\\svgSanitize\\": "src"
14
  }
15
  },
 
 
 
 
 
16
  "minimum-stability": "stable",
17
- "require": {},
 
 
 
18
  "require-dev": {
19
  "phpunit/phpunit": "^6",
20
  "codeclimate/php-test-reporter": "^0.1.2"
1
  {
2
  "name": "enshrined/svg-sanitize",
3
  "description": "An SVG sanitizer for PHP",
4
+ "license": "GPL-2.0-or-later",
5
  "authors": [
6
  {
7
  "name": "Daryll Doyle",
13
  "enshrined\\svgSanitize\\": "src"
14
  }
15
  },
16
+ "autoload-dev": {
17
+ "psr-4": {
18
+ "enshrined\\svgSanitize\\Tests\\": "tests"
19
+ }
20
+ },
21
  "minimum-stability": "stable",
22
+ "require": {
23
+ "ext-dom": "*",
24
+ "ext-libxml": "*"
25
+ },
26
  "require-dev": {
27
  "phpunit/phpunit": "^6",
28
  "codeclimate/php-test-reporter": "^0.1.2"
lib/vendor/enshrined/svg-sanitize/composer.lock DELETED
@@ -1,2259 +0,0 @@
1
- {
2
- "_readme": [
3
- "This file locks the dependencies of your project to a known state",
4
- "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
5
- "This file is @generated automatically"
6
- ],
7
- "content-hash": "cf1f0e14b588378abe1857f6f62083e9",
8
- "packages": [],
9
- "packages-dev": [
10
- {
11
- "name": "codeclimate/php-test-reporter",
12
- "version": "v0.1.2",
13
- "source": {
14
- "type": "git",
15
- "url": "https://github.com/codeclimate/php-test-reporter.git",
16
- "reference": "8ed24ff30f3663ecf40f1c12d6c97eb56c69e646"
17
- },
18
- "dist": {
19
- "type": "zip",
20
- "url": "https://api.github.com/repos/codeclimate/php-test-reporter/zipball/8ed24ff30f3663ecf40f1c12d6c97eb56c69e646",
21
- "reference": "8ed24ff30f3663ecf40f1c12d6c97eb56c69e646",
22
- "shasum": ""
23
- },
24
- "require": {
25
- "ext-curl": "*",
26
- "php": ">=5.3",
27
- "satooshi/php-coveralls": "0.6.*",
28
- "symfony/console": ">=2.0"
29
- },
30
- "require-dev": {
31
- "phpunit/phpunit": "3.7.*@stable"
32
- },
33
- "bin": [
34
- "composer/bin/test-reporter"
35
- ],
36
- "type": "library",
37
- "extra": {
38
- "branch-alias": {
39
- "dev-master": "0.1.x-dev"
40
- }
41
- },
42
- "autoload": {
43
- "psr-0": {
44
- "CodeClimate\\Component": "src/",
45
- "CodeClimate\\Bundle": "src/"
46
- }
47
- },
48
- "notification-url": "https://packagist.org/downloads/",
49
- "license": [
50
- "MIT"
51
- ],
52
- "authors": [
53
- {
54
- "name": "Code Climate",
55
- "email": "hello@codeclimate.com",
56
- "homepage": "https://codeclimate.com"
57
- }
58
- ],
59
- "description": "PHP client for reporting test coverage to Code Climate",
60
- "homepage": "https://github.com/codeclimate/php-test-reporter",
61
- "keywords": [
62
- "codeclimate",
63
- "coverage"
64
- ],
65
- "time": "2014-07-23T13:42:41+00:00"
66
- },
67
- {
68
- "name": "doctrine/instantiator",
69
- "version": "1.0.5",
70
- "source": {
71
- "type": "git",
72
- "url": "https://github.com/doctrine/instantiator.git",
73
- "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d"
74
- },
75
- "dist": {
76
- "type": "zip",
77
- "url": "https://api.github.com/repos/doctrine/instantiator/zipball/8e884e78f9f0eb1329e445619e04456e64d8051d",
78
- "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d",
79
- "shasum": ""
80
- },
81
- "require": {
82
- "php": ">=5.3,<8.0-DEV"
83
- },
84
- "require-dev": {
85
- "athletic/athletic": "~0.1.8",
86
- "ext-pdo": "*",
87
- "ext-phar": "*",
88
- "phpunit/phpunit": "~4.0",
89
- "squizlabs/php_codesniffer": "~2.0"
90
- },
91
- "type": "library",
92
- "extra": {
93
- "branch-alias": {
94
- "dev-master": "1.0.x-dev"
95
- }
96
- },
97
- "autoload": {
98
- "psr-4": {
99
- "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/"
100
- }
101
- },
102
- "notification-url": "https://packagist.org/downloads/",
103
- "license": [
104
- "MIT"
105
- ],
106
- "authors": [
107
- {
108
- "name": "Marco Pivetta",
109
- "email": "ocramius@gmail.com",
110
- "homepage": "http://ocramius.github.com/"
111
- }
112
- ],
113
- "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors",
114
- "homepage": "https://github.com/doctrine/instantiator",
115
- "keywords": [
116
- "constructor",
117
- "instantiate"
118
- ],
119
- "time": "2015-06-14T21:17:01+00:00"
120
- },
121
- {
122
- "name": "guzzle/guzzle",
123
- "version": "v3.9.3",
124
- "source": {
125
- "type": "git",
126
- "url": "https://github.com/guzzle/guzzle3.git",
127
- "reference": "0645b70d953bc1c067bbc8d5bc53194706b628d9"
128
- },
129
- "dist": {
130
- "type": "zip",
131
- "url": "https://api.github.com/repos/guzzle/guzzle3/zipball/0645b70d953bc1c067bbc8d5bc53194706b628d9",
132
- "reference": "0645b70d953bc1c067bbc8d5bc53194706b628d9",
133
- "shasum": ""
134
- },
135
- "require": {
136
- "ext-curl": "*",
137
- "php": ">=5.3.3",
138
- "symfony/event-dispatcher": "~2.1"
139
- },
140
- "replace": {
141
- "guzzle/batch": "self.version",
142
- "guzzle/cache": "self.version",
143
- "guzzle/common": "self.version",
144
- "guzzle/http": "self.version",
145
- "guzzle/inflection": "self.version",
146
- "guzzle/iterator": "self.version",
147
- "guzzle/log": "self.version",
148
- "guzzle/parser": "self.version",
149
- "guzzle/plugin": "self.version",
150
- "guzzle/plugin-async": "self.version",
151
- "guzzle/plugin-backoff": "self.version",
152
- "guzzle/plugin-cache": "self.version",
153
- "guzzle/plugin-cookie": "self.version",
154
- "guzzle/plugin-curlauth": "self.version",
155
- "guzzle/plugin-error-response": "self.version",
156
- "guzzle/plugin-history": "self.version",
157
- "guzzle/plugin-log": "self.version",
158
- "guzzle/plugin-md5": "self.version",
159
- "guzzle/plugin-mock": "self.version",
160
- "guzzle/plugin-oauth": "self.version",
161
- "guzzle/service": "self.version",
162
- "guzzle/stream": "self.version"
163
- },
164
- "require-dev": {
165
- "doctrine/cache": "~1.3",
166
- "monolog/monolog": "~1.0",
167
- "phpunit/phpunit": "3.7.*",
168
- "psr/log": "~1.0",
169
- "symfony/class-loader": "~2.1",
170
- "zendframework/zend-cache": "2.*,<2.3",
171
- "zendframework/zend-log": "2.*,<2.3"
172
- },
173
- "suggest": {
174
- "guzzlehttp/guzzle": "Guzzle 5 has moved to a new package name. The package you have installed, Guzzle 3, is deprecated."
175
- },
176
- "type": "library",
177
- "extra": {
178
- "branch-alias": {
179
- "dev-master": "3.9-dev"
180
- }
181
- },
182
- "autoload": {
183
- "psr-0": {
184
- "Guzzle": "src/",
185
- "Guzzle\\Tests": "tests/"
186
- }
187
- },
188
- "notification-url": "https://packagist.org/downloads/",
189
- "license": [
190
- "MIT"
191
- ],
192
- "authors": [
193
- {
194
- "name": "Michael Dowling",
195
- "email": "mtdowling@gmail.com",
196
- "homepage": "https://github.com/mtdowling"
197
- },
198
- {
199
- "name": "Guzzle Community",
200
- "homepage": "https://github.com/guzzle/guzzle/contributors"
201
- }
202
- ],
203
- "description": "PHP HTTP client. This library is deprecated in favor of https://packagist.org/packages/guzzlehttp/guzzle",
204
- "homepage": "http://guzzlephp.org/",
205
- "keywords": [
206
- "client",
207
- "curl",
208
- "framework",
209
- "http",
210
- "http client",
211
- "rest",
212
- "web service"
213
- ],
214
- "abandoned": "guzzlehttp/guzzle",
215
- "time": "2015-03-18T18:23:50+00:00"
216
- },
217
- {
218
- "name": "myclabs/deep-copy",
219
- "version": "1.7.0",
220
- "source": {
221
- "type": "git",
222
- "url": "https://github.com/myclabs/DeepCopy.git",
223
- "reference": "3b8a3a99ba1f6a3952ac2747d989303cbd6b7a3e"
224
- },
225
- "dist": {
226
- "type": "zip",
227
- "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3b8a3a99ba1f6a3952ac2747d989303cbd6b7a3e",
228
- "reference": "3b8a3a99ba1f6a3952ac2747d989303cbd6b7a3e",
229
- "shasum": ""
230
- },
231
- "require": {
232
- "php": "^5.6 || ^7.0"
233
- },
234
- "require-dev": {
235
- "doctrine/collections": "^1.0",
236
- "doctrine/common": "^2.6",
237
- "phpunit/phpunit": "^4.1"
238
- },
239
- "type": "library",
240
- "autoload": {
241
- "psr-4": {
242
- "DeepCopy\\": "src/DeepCopy/"
243
- },
244
- "files": [
245
- "src/DeepCopy/deep_copy.php"
246
- ]
247
- },
248
- "notification-url": "https://packagist.org/downloads/",
249
- "license": [
250
- "MIT"
251
- ],
252
- "description": "Create deep copies (clones) of your objects",
253
- "keywords": [
254
- "clone",
255
- "copy",
256
- "duplicate",
257
- "object",
258
- "object graph"
259
- ],
260
- "time": "2017-10-19T19:58:43+00:00"
261
- },
262
- {
263
- "name": "phar-io/manifest",
264
- "version": "1.0.1",
265
- "source": {
266
- "type": "git",
267
- "url": "https://github.com/phar-io/manifest.git",
268
- "reference": "2df402786ab5368a0169091f61a7c1e0eb6852d0"
269
- },
270
- "dist": {
271
- "type": "zip",
272
- "url": "https://api.github.com/repos/phar-io/manifest/zipball/2df402786ab5368a0169091f61a7c1e0eb6852d0",
273
- "reference": "2df402786ab5368a0169091f61a7c1e0eb6852d0",
274
- "shasum": ""
275
- },
276
- "require": {
277
- "ext-dom": "*",
278
- "ext-phar": "*",
279
- "phar-io/version": "^1.0.1",
280
- "php": "^5.6 || ^7.0"
281
- },
282
- "type": "library",
283
- "extra": {
284
- "branch-alias": {
285
- "dev-master": "1.0.x-dev"
286
- }
287
- },
288
- "autoload": {
289
- "classmap": [
290
- "src/"
291
- ]
292
- },
293
- "notification-url": "https://packagist.org/downloads/",
294
- "license": [
295
- "BSD-3-Clause"
296
- ],
297
- "authors": [
298
- {
299
- "name": "Arne Blankerts",
300
- "email": "arne@blankerts.de",
301
- "role": "Developer"
302
- },
303
- {
304
- "name": "Sebastian Heuer",
305
- "email": "sebastian@phpeople.de",
306
- "role": "Developer"
307
- },
308
- {
309
- "name": "Sebastian Bergmann",
310
- "email": "sebastian@phpunit.de",
311
- "role": "Developer"
312
- }
313
- ],
314
- "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)",
315
- "time": "2017-03-05T18:14:27+00:00"
316
- },
317
- {
318
- "name": "phar-io/version",
319
- "version": "1.0.1",
320
- "source": {
321
- "type": "git",
322
- "url": "https://github.com/phar-io/version.git",
323
- "reference": "a70c0ced4be299a63d32fa96d9281d03e94041df"
324
- },
325
- "dist": {
326
- "type": "zip",
327
- "url": "https://api.github.com/repos/phar-io/version/zipball/a70c0ced4be299a63d32fa96d9281d03e94041df",
328
- "reference": "a70c0ced4be299a63d32fa96d9281d03e94041df",
329
- "shasum": ""
330
- },
331
- "require": {
332
- "php": "^5.6 || ^7.0"
333
- },
334
- "type": "library",
335
- "autoload": {
336
- "classmap": [
337
- "src/"
338
- ]
339
- },
340
- "notification-url": "https://packagist.org/downloads/",
341
- "license": [
342
- "BSD-3-Clause"
343
- ],
344
- "authors": [
345
- {
346
- "name": "Arne Blankerts",
347
- "email": "arne@blankerts.de",
348
- "role": "Developer"
349
- },
350
- {
351
- "name": "Sebastian Heuer",
352
- "email": "sebastian@phpeople.de",
353
- "role": "Developer"
354
- },
355
- {
356
- "name": "Sebastian Bergmann",
357
- "email": "sebastian@phpunit.de",
358
- "role": "Developer"
359
- }
360
- ],
361
- "description": "Library for handling version information and constraints",
362
- "time": "2017-03-05T17:38:23+00:00"
363
- },
364
- {
365
- "name": "phpdocumentor/reflection-common",
366
- "version": "1.0.1",
367
- "source": {
368
- "type": "git",
369
- "url": "https://github.com/phpDocumentor/ReflectionCommon.git",
370
- "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6"
371
- },
372
- "dist": {
373
- "type": "zip",
374
- "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6",
375
- "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6",
376
- "shasum": ""
377
- },
378
- "require": {
379
- "php": ">=5.5"
380
- },
381
- "require-dev": {
382
- "phpunit/phpunit": "^4.6"
383
- },
384
- "type": "library",
385
- "extra": {
386
- "branch-alias": {
387
- "dev-master": "1.0.x-dev"
388
- }
389
- },
390
- "autoload": {
391
- "psr-4": {
392
- "phpDocumentor\\Reflection\\": [
393
- "src"
394
- ]
395
- }
396
- },
397
- "notification-url": "https://packagist.org/downloads/",
398
- "license": [
399
- "MIT"
400
- ],
401
- "authors": [
402
- {
403
- "name": "Jaap van Otterdijk",
404
- "email": "opensource@ijaap.nl"
405
- }
406
- ],
407
- "description": "Common reflection classes used by phpdocumentor to reflect the code structure",
408
- "homepage": "http://www.phpdoc.org",
409
- "keywords": [
410
- "FQSEN",
411
- "phpDocumentor",
412
- "phpdoc",
413
- "reflection",
414
- "static analysis"
415
- ],
416
- "time": "2017-09-11T18:02:19+00:00"
417
- },
418
- {
419
- "name": "phpdocumentor/reflection-docblock",
420
- "version": "4.3.0",
421
- "source": {
422
- "type": "git",
423
- "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
424
- "reference": "94fd0001232e47129dd3504189fa1c7225010d08"
425
- },
426
- "dist": {
427
- "type": "zip",
428
- "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/94fd0001232e47129dd3504189fa1c7225010d08",
429
- "reference": "94fd0001232e47129dd3504189fa1c7225010d08",
430
- "shasum": ""
431
- },
432
- "require": {
433
- "php": "^7.0",
434
- "phpdocumentor/reflection-common": "^1.0.0",
435
- "phpdocumentor/type-resolver": "^0.4.0",
436
- "webmozart/assert": "^1.0"
437
- },
438
- "require-dev": {
439
- "doctrine/instantiator": "~1.0.5",
440
- "mockery/mockery": "^1.0",
441
- "phpunit/phpunit": "^6.4"
442
- },
443
- "type": "library",
444
- "extra": {
445
- "branch-alias": {
446
- "dev-master": "4.x-dev"
447
- }
448
- },
449
- "autoload": {
450
- "psr-4": {
451
- "phpDocumentor\\Reflection\\": [
452
- "src/"
453
- ]
454
- }
455
- },
456
- "notification-url": "https://packagist.org/downloads/",
457
- "license": [
458
- "MIT"
459
- ],
460
- "authors": [
461
- {
462
- "name": "Mike van Riel",
463
- "email": "me@mikevanriel.com"
464
- }
465
- ],
466
- "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",
467
- "time": "2017-11-30T07:14:17+00:00"
468
- },
469
- {
470
- "name": "phpdocumentor/type-resolver",
471
- "version": "0.4.0",
472
- "source": {
473
- "type": "git",
474
- "url": "https://github.com/phpDocumentor/TypeResolver.git",
475
- "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7"
476
- },
477
- "dist": {
478
- "type": "zip",
479
- "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/9c977708995954784726e25d0cd1dddf4e65b0f7",
480
- "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7",
481
- "shasum": ""
482
- },
483
- "require": {
484
- "php": "^5.5 || ^7.0",
485
- "phpdocumentor/reflection-common": "^1.0"
486
- },
487
- "require-dev": {
488
- "mockery/mockery": "^0.9.4",
489
- "phpunit/phpunit": "^5.2||^4.8.24"
490
- },
491
- "type": "library",
492
- "extra": {
493
- "branch-alias": {
494
- "dev-master": "1.0.x-dev"
495
- }
496
- },
497
- "autoload": {
498
- "psr-4": {
499
- "phpDocumentor\\Reflection\\": [
500
- "src/"
501
- ]
502
- }
503
- },
504
- "notification-url": "https://packagist.org/downloads/",
505
- "license": [
506
- "MIT"
507
- ],
508
- "authors": [
509
- {
510
- "name": "Mike van Riel",
511
- "email": "me@mikevanriel.com"
512
- }
513
- ],
514
- "time": "2017-07-14T14:27:02+00:00"
515
- },
516
- {
517
- "name": "phpspec/prophecy",
518
- "version": "1.8.0",
519
- "source": {
520
- "type": "git",
521
- "url": "https://github.com/phpspec/prophecy.git",
522
- "reference": "4ba436b55987b4bf311cb7c6ba82aa528aac0a06"
523
- },
524
- "dist": {
525
- "type": "zip",
526
- "url": "https://api.github.com/repos/phpspec/prophecy/zipball/4ba436b55987b4bf311cb7c6ba82aa528aac0a06",
527
- "reference": "4ba436b55987b4bf311cb7c6ba82aa528aac0a06",
528
- "shasum": ""
529
- },
530
- "require": {
531
- "doctrine/instantiator": "^1.0.2",
532
- "php": "^5.3|^7.0",
533
- "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0",
534
- "sebastian/comparator": "^1.1|^2.0|^3.0",
535
- "sebastian/recursion-context": "^1.0|^2.0|^3.0"
536
- },
537
- "require-dev": {
538
- "phpspec/phpspec": "^2.5|^3.2",
539
- "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5 || ^7.1"
540
- },
541
- "type": "library",
542
- "extra": {
543
- "branch-alias": {
544
- "dev-master": "1.8.x-dev"
545
- }
546
- },
547
- "autoload": {
548
- "psr-0": {
549
- "Prophecy\\": "src/"
550
- }
551
- },
552
- "notification-url": "https://packagist.org/downloads/",
553
- "license": [
554
- "MIT"
555
- ],
556
- "authors": [
557
- {
558
- "name": "Konstantin Kudryashov",
559
- "email": "ever.zet@gmail.com",
560
- "homepage": "http://everzet.com"
561
- },
562
- {
563
- "name": "Marcello Duarte",
564
- "email": "marcello.duarte@gmail.com"
565
- }
566
- ],
567
- "description": "Highly opinionated mocking framework for PHP 5.3+",
568
- "homepage": "https://github.com/phpspec/prophecy",
569
- "keywords": [
570
- "Double",
571
- "Dummy",
572
- "fake",
573
- "mock",
574
- "spy",
575
- "stub"
576
- ],
577
- "time": "2018-08-05T17:53:17+00:00"
578
- },
579
- {
580
- "name": "phpunit/php-code-coverage",
581
- "version": "5.3.2",
582
- "source": {
583
- "type": "git",
584
- "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
585
- "reference": "c89677919c5dd6d3b3852f230a663118762218ac"
586
- },
587
- "dist": {
588
- "type": "zip",
589
- "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/c89677919c5dd6d3b3852f230a663118762218ac",
590
- "reference": "c89677919c5dd6d3b3852f230a663118762218ac",
591
- "shasum": ""
592
- },
593
- "require": {
594
- "ext-dom": "*",
595
- "ext-xmlwriter": "*",
596
- "php": "^7.0",
597
- "phpunit/php-file-iterator": "^1.4.2",
598
- "phpunit/php-text-template": "^1.2.1",
599
- "phpunit/php-token-stream": "^2.0.1",
600
- "sebastian/code-unit-reverse-lookup": "^1.0.1",
601
- "sebastian/environment": "^3.0",
602
- "sebastian/version": "^2.0.1",
603
- "theseer/tokenizer": "^1.1"
604
- },
605
- "require-dev": {
606
- "phpunit/phpunit": "^6.0"
607
- },
608
- "suggest": {
609
- "ext-xdebug": "^2.5.5"
610
- },
611
- "type": "library",
612
- "extra": {
613
- "branch-alias": {
614
- "dev-master": "5.3.x-dev"
615
- }
616
- },
617
- "autoload": {
618
- "classmap": [
619
- "src/"
620
- ]
621
- },
622
- "notification-url": "https://packagist.org/downloads/",
623
- "license": [
624
- "BSD-3-Clause"
625
- ],
626
- "authors": [
627
- {
628
- "name": "Sebastian Bergmann",
629
- "email": "sebastian@phpunit.de",
630
- "role": "lead"
631
- }
632
- ],
633
- "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.",
634
- "homepage": "https://github.com/sebastianbergmann/php-code-coverage",
635
- "keywords": [
636
- "coverage",
637
- "testing",
638
- "xunit"
639
- ],
640
- "time": "2018-04-06T15:36:58+00:00"
641
- },
642
- {
643
- "name": "phpunit/php-file-iterator",
644
- "version": "1.4.5",
645
- "source": {
646
- "type": "git",
647
- "url": "https://github.com/sebastianbergmann/php-file-iterator.git",
648
- "reference": "730b01bc3e867237eaac355e06a36b85dd93a8b4"
649
- },
650
- "dist": {
651
- "type": "zip",
652
- "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/730b01bc3e867237eaac355e06a36b85dd93a8b4",
653
- "reference": "730b01bc3e867237eaac355e06a36b85dd93a8b4",
654
- "shasum": ""
655
- },
656
- "require": {
657
- "php": ">=5.3.3"
658
- },
659
- "type": "library",
660
- "extra": {
661
- "branch-alias": {
662
- "dev-master": "1.4.x-dev"
663
- }
664
- },
665
- "autoload": {
666
- "classmap": [
667
- "src/"
668
- ]
669
- },
670
- "notification-url": "https://packagist.org/downloads/",
671
- "license": [
672
- "BSD-3-Clause"
673
- ],
674
- "authors": [
675
- {
676
- "name": "Sebastian Bergmann",
677
- "email": "sb@sebastian-bergmann.de",
678
- "role": "lead"
679
- }
680
- ],
681
- "description": "FilterIterator implementation that filters files based on a list of suffixes.",
682
- "homepage": "https://github.com/sebastianbergmann/php-file-iterator/",
683
- "keywords": [
684
- "filesystem",
685
- "iterator"
686
- ],
687
- "time": "2017-11-27T13:52:08+00:00"
688
- },
689
- {
690
- "name": "phpunit/php-text-template",
691
- "version": "1.2.1",
692
- "source": {
693
- "type": "git",
694
- "url": "https://github.com/sebastianbergmann/php-text-template.git",
695
- "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686"
696
- },
697
- "dist": {
698
- "type": "zip",
699
- "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686",
700
- "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686",
701
- "shasum": ""
702
- },
703
- "require": {
704
- "php": ">=5.3.3"
705
- },
706
- "type": "library",
707
- "autoload": {
708
- "classmap": [
709
- "src/"
710
- ]
711
- },
712
- "notification-url": "https://packagist.org/downloads/",
713
- "license": [
714
- "BSD-3-Clause"
715
- ],
716
- "authors": [
717
- {
718
- "name": "Sebastian Bergmann",
719
- "email": "sebastian@phpunit.de",
720
- "role": "lead"
721
- }
722
- ],
723
- "description": "Simple template engine.",
724
- "homepage": "https://github.com/sebastianbergmann/php-text-template/",
725
- "keywords": [
726
- "template"
727
- ],
728
- "time": "2015-06-21T13:50:34+00:00"
729
- },
730
- {
731
- "name": "phpunit/php-timer",
732
- "version": "1.0.9",
733
- "source": {
734
- "type": "git",
735
- "url": "https://github.com/sebastianbergmann/php-timer.git",
736
- "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f"
737
- },
738
- "dist": {
739
- "type": "zip",
740
- "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3dcf38ca72b158baf0bc245e9184d3fdffa9c46f",
741
- "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f",
742
- "shasum": ""
743
- },
744
- "require": {
745
- "php": "^5.3.3 || ^7.0"
746
- },
747
- "require-dev": {
748
- "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0"
749
- },
750
- "type": "library",
751
- "extra": {
752
- "branch-alias": {
753
- "dev-master": "1.0-dev"
754
- }
755
- },
756
- "autoload": {
757
- "classmap": [
758
- "src/"
759
- ]
760
- },
761
- "notification-url": "https://packagist.org/downloads/",
762
- "license": [
763
- "BSD-3-Clause"
764
- ],
765
- "authors": [
766
- {
767
- "name": "Sebastian Bergmann",
768
- "email": "sb@sebastian-bergmann.de",
769
- "role": "lead"
770
- }
771
- ],
772
- "description": "Utility class for timing",
773
- "homepage": "https://github.com/sebastianbergmann/php-timer/",
774
- "keywords": [
775
- "timer"
776
- ],
777
- "time": "2017-02-26T11:10:40+00:00"
778
- },
779
- {
780
- "name": "phpunit/php-token-stream",
781
- "version": "2.0.2",
782
- "source": {
783
- "type": "git",
784
- "url": "https://github.com/sebastianbergmann/php-token-stream.git",
785
- "reference": "791198a2c6254db10131eecfe8c06670700904db"
786
- },
787
- "dist": {
788
- "type": "zip",
789
- "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/791198a2c6254db10131eecfe8c06670700904db",
790
- "reference": "791198a2c6254db10131eecfe8c06670700904db",
791
- "shasum": ""
792
- },
793
- "require": {
794
- "ext-tokenizer": "*",
795
- "php": "^7.0"
796
- },
797
- "require-dev": {
798
- "phpunit/phpunit": "^6.2.4"
799
- },
800
- "type": "library",
801
- "extra": {
802
- "branch-alias": {
803
- "dev-master": "2.0-dev"
804
- }
805
- },
806
- "autoload": {
807
- "classmap": [
808
- "src/"
809
- ]
810
- },
811
- "notification-url": "https://packagist.org/downloads/",
812
- "license": [
813
- "BSD-3-Clause"
814
- ],
815
- "authors": [
816
- {
817
- "name": "Sebastian Bergmann",
818
- "email": "sebastian@phpunit.de"
819
- }
820
- ],
821
- "description": "Wrapper around PHP's tokenizer extension.",
822
- "homepage": "https://github.com/sebastianbergmann/php-token-stream/",
823
- "keywords": [
824
- "tokenizer"
825
- ],
826
- "time": "2017-11-27T05:48:46+00:00"
827
- },
828
- {
829
- "name": "phpunit/phpunit",
830
- "version": "6.5.13",
831
- "source": {
832
- "type": "git",
833
- "url": "https://github.com/sebastianbergmann/phpunit.git",
834
- "reference": "0973426fb012359b2f18d3bd1e90ef1172839693"
835
- },
836
- "dist": {
837
- "type": "zip",
838
- "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/0973426fb012359b2f18d3bd1e90ef1172839693",
839
- "reference": "0973426fb012359b2f18d3bd1e90ef1172839693",
840
- "shasum": ""
841
- },
842
- "require": {
843
- "ext-dom": "*",
844
- "ext-json": "*",
845
- "ext-libxml": "*",
846
- "ext-mbstring": "*",
847
- "ext-xml": "*",
848
- "myclabs/deep-copy": "^1.6.1",
849
- "phar-io/manifest": "^1.0.1",
850
- "phar-io/version": "^1.0",
851
- "php": "^7.0",
852
- "phpspec/prophecy": "^1.7",
853
- "phpunit/php-code-coverage": "^5.3",
854
- "phpunit/php-file-iterator": "^1.4.3",
855
- "phpunit/php-text-template": "^1.2.1",
856
- "phpunit/php-timer": "^1.0.9",
857
- "phpunit/phpunit-mock-objects": "^5.0.9",
858
- "sebastian/comparator": "^2.1",
859
- "sebastian/diff": "^2.0",
860
- "sebastian/environment": "^3.1",
861
- "sebastian/exporter": "^3.1",
862
- "sebastian/global-state": "^2.0",
863
- "sebastian/object-enumerator": "^3.0.3",
864
- "sebastian/resource-operations": "^1.0",
865
- "sebastian/version": "^2.0.1"
866
- },
867
- "conflict": {
868
- "phpdocumentor/reflection-docblock": "3.0.2",
869
- "phpunit/dbunit": "<3.0"
870
- },
871
- "require-dev": {
872
- "ext-pdo": "*"
873
- },
874
- "suggest": {
875
- "ext-xdebug": "*",
876
- "phpunit/php-invoker": "^1.1"
877
- },
878
- "bin": [
879
- "phpunit"
880
- ],
881
- "type": "library",
882
- "extra": {
883
- "branch-alias": {
884
- "dev-master": "6.5.x-dev"
885
- }
886
- },
887
- "autoload": {
888
- "classmap": [
889
- "src/"
890
- ]
891
- },
892
- "notification-url": "https://packagist.org/downloads/",
893
- "license": [
894
- "BSD-3-Clause"
895
- ],
896
- "authors": [
897
- {
898
- "name": "Sebastian Bergmann",
899
- "email": "sebastian@phpunit.de",
900
- "role": "lead"
901
- }
902
- ],
903
- "description": "The PHP Unit Testing framework.",
904
- "homepage": "https://phpunit.de/",
905
- "keywords": [
906
- "phpunit",
907
- "testing",
908
- "xunit"
909
- ],
910
- "time": "2018-09-08T15:10:43+00:00"
911
- },
912
- {
913
- "name": "phpunit/phpunit-mock-objects",
914
- "version": "5.0.10",
915
- "source": {
916
- "type": "git",
917
- "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git",
918
- "reference": "cd1cf05c553ecfec36b170070573e540b67d3f1f"
919
- },
920
- "dist": {
921
- "type": "zip",
922
- "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/cd1cf05c553ecfec36b170070573e540b67d3f1f",
923
- "reference": "cd1cf05c553ecfec36b170070573e540b67d3f1f",
924
- "shasum": ""
925
- },
926
- "require": {
927
- "doctrine/instantiator": "^1.0.5",
928
- "php": "^7.0",
929
- "phpunit/php-text-template": "^1.2.1",
930
- "sebastian/exporter": "^3.1"
931
- },
932
- "conflict": {
933
- "phpunit/phpunit": "<6.0"
934
- },
935
- "require-dev": {
936
- "phpunit/phpunit": "^6.5.11"
937
- },
938
- "suggest": {
939
- "ext-soap": "*"
940
- },
941
- "type": "library",
942
- "extra": {
943
- "branch-alias": {
944
- "dev-master": "5.0.x-dev"
945
- }
946
- },
947
- "autoload": {
948
- "classmap": [
949
- "src/"
950
- ]
951
- },
952
- "notification-url": "https://packagist.org/downloads/",
953
- "license": [
954
- "BSD-3-Clause"
955
- ],
956
- "authors": [
957
- {
958
- "name": "Sebastian Bergmann",
959
- "email": "sebastian@phpunit.de",
960
- "role": "lead"
961
- }
962
- ],
963
- "description": "Mock Object library for PHPUnit",
964
- "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/",
965
- "keywords": [
966
- "mock",
967
- "xunit"
968
- ],
969
- "time": "2018-08-09T05:50:03+00:00"
970
- },
971
- {
972
- "name": "psr/log",
973
- "version": "1.0.0",
974
- "source": {
975
- "type": "git",
976
- "url": "https://github.com/php-fig/log.git",
977
- "reference": "fe0936ee26643249e916849d48e3a51d5f5e278b"
978
- },
979
- "dist": {
980
- "type": "zip",
981
- "url": "https://api.github.com/repos/php-fig/log/zipball/fe0936ee26643249e916849d48e3a51d5f5e278b",
982
- "reference": "fe0936ee26643249e916849d48e3a51d5f5e278b",
983
- "shasum": ""
984
- },
985
- "type": "library",
986
- "autoload": {
987
- "psr-0": {
988
- "Psr\\Log\\": ""
989
- }
990
- },
991
- "notification-url": "https://packagist.org/downloads/",
992
- "license": [
993
- "MIT"
994
- ],
995
- "authors": [
996
- {
997
- "name": "PHP-FIG",
998
- "homepage": "http://www.php-fig.org/"
999
- }
1000
- ],
1001
- "description": "Common interface for logging libraries",
1002
- "keywords": [
1003
- "log",
1004
- "psr",
1005
- "psr-3"
1006
- ],
1007
- "time": "2012-12-21T11:40:51+00:00"
1008
- },
1009
- {
1010
- "name": "satooshi/php-coveralls",
1011
- "version": "v0.6.1",
1012
- "source": {
1013
- "type": "git",
1014
- "url": "https://github.com/satooshi/php-coveralls.git",
1015
- "reference": "dd0df95bd37a7cf5c5c50304dfe260ffe4b50760"
1016
- },
1017
- "dist": {
1018
- "type": "zip",
1019
- "url": "https://api.github.com/repos/satooshi/php-coveralls/zipball/dd0df95bd37a7cf5c5c50304dfe260ffe4b50760",
1020
- "reference": "dd0df95bd37a7cf5c5c50304dfe260ffe4b50760",
1021
- "shasum": ""
1022
- },
1023
- "require": {
1024
- "ext-curl": "*",
1025
- "ext-json": "*",
1026
- "ext-simplexml": "*",
1027
- "guzzle/guzzle": ">=3.0",
1028
- "php": ">=5.3",
1029
- "psr/log": "1.0.0",
1030
- "symfony/config": ">=2.0",
1031
- "symfony/console": ">=2.0",
1032
- "symfony/stopwatch": ">=2.2",
1033
- "symfony/yaml": ">=2.0"
1034
- },
1035
- "require-dev": {
1036
- "apigen/apigen": "2.8.*@stable",
1037
- "pdepend/pdepend": "dev-master",
1038
- "phpmd/phpmd": "dev-master",
1039
- "phpunit/php-invoker": ">=1.1.0,<1.2.0",
1040
- "phpunit/phpunit": "3.7.*@stable",
1041
- "sebastian/finder-facade": "dev-master",
1042
- "sebastian/phpcpd": "1.4.*@stable",
1043
- "squizlabs/php_codesniffer": "1.4.*@stable",
1044
- "theseer/fdomdocument": "dev-master"
1045
- },
1046
- "bin": [
1047
- "composer/bin/coveralls"
1048
- ],
1049
- "type": "library",
1050
- "autoload": {
1051
- "psr-0": {
1052
- "Contrib\\Component": "src/",
1053
- "Contrib\\Bundle": "src/"
1054
- }
1055
- },
1056
- "notification-url": "https://packagist.org/downloads/",
1057
- "license": [
1058
- "MIT"
1059
- ],
1060
- "authors": [
1061
- {
1062
- "name": "Kitamura Satoshi",
1063
- "email": "with.no.parachute@gmail.com",
1064
- "homepage": "https://www.facebook.com/satooshi.jp"
1065
- }
1066
- ],
1067
- "description": "PHP client library for Coveralls API",
1068
- "homepage": "https://github.com/satooshi/php-coveralls",
1069
- "keywords": [
1070
- "ci",
1071
- "coverage",
1072
- "github",
1073
- "test"
1074
- ],
1075
- "abandoned": "php-coveralls/php-coveralls",
1076
- "time": "2013-05-04T08:07:33+00:00"
1077
- },
1078
- {
1079
- "name": "sebastian/code-unit-reverse-lookup",
1080
- "version": "1.0.1",
1081
- "source": {
1082
- "type": "git",
1083
- "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git",
1084
- "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18"
1085
- },
1086
- "dist": {
1087
- "type": "zip",
1088
- "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/4419fcdb5eabb9caa61a27c7a1db532a6b55dd18",
1089
- "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18",
1090
- "shasum": ""
1091
- },
1092
- "require": {
1093
- "php": "^5.6 || ^7.0"
1094
- },
1095
- "require-dev": {
1096
- "phpunit/phpunit": "^5.7 || ^6.0"
1097
- },
1098
- "type": "library",
1099
- "extra": {
1100
- "branch-alias": {
1101
- "dev-master": "1.0.x-dev"
1102
- }
1103
- },
1104
- "autoload": {
1105
- "classmap": [
1106
- "src/"
1107
- ]
1108
- },
1109
- "notification-url": "https://packagist.org/downloads/",
1110
- "license": [
1111
- "BSD-3-Clause"
1112
- ],
1113
- "authors": [
1114
- {
1115
- "name": "Sebastian Bergmann",
1116
- "email": "sebastian@phpunit.de"
1117
- }
1118
- ],
1119
- "description": "Looks up which function or method a line of code belongs to",
1120
- "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/",
1121
- "time": "2017-03-04T06:30:41+00:00"
1122
- },
1123
- {
1124
- "name": "sebastian/comparator",
1125
- "version": "2.1.3",
1126
- "source": {
1127
- "type": "git",
1128
- "url": "https://github.com/sebastianbergmann/comparator.git",
1129
- "reference": "34369daee48eafb2651bea869b4b15d75ccc35f9"
1130
- },
1131
- "dist": {
1132
- "type": "zip",
1133
- "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/34369daee48eafb2651bea869b4b15d75ccc35f9",
1134
- "reference": "34369daee48eafb2651bea869b4b15d75ccc35f9",
1135
- "shasum": ""
1136
- },
1137
- "require": {
1138
- "php": "^7.0",
1139
- "sebastian/diff": "^2.0 || ^3.0",
1140
- "sebastian/exporter": "^3.1"
1141
- },
1142
- "require-dev": {
1143
- "phpunit/phpunit": "^6.4"
1144
- },
1145
- "type": "library",
1146
- "extra": {
1147
- "branch-alias": {
1148
- "dev-master": "2.1.x-dev"
1149
- }
1150
- },
1151
- "autoload": {
1152
- "classmap": [
1153
- "src/"
1154
- ]
1155
- },
1156
- "notification-url": "https://packagist.org/downloads/",
1157
- "license": [
1158
- "BSD-3-Clause"
1159
- ],
1160
- "authors": [
1161
- {
1162
- "name": "Jeff Welch",
1163
- "email": "whatthejeff@gmail.com"
1164
- },
1165
- {
1166
- "name": "Volker Dusch",
1167
- "email": "github@wallbash.com"
1168
- },
1169
- {
1170
- "name": "Bernhard Schussek",
1171
- "email": "bschussek@2bepublished.at"
1172
- },
1173
- {
1174
- "name": "Sebastian Bergmann",
1175
- "email": "sebastian@phpunit.de"
1176
- }
1177
- ],
1178
- "description": "Provides the functionality to compare PHP values for equality",
1179
- "homepage": "https://github.com/sebastianbergmann/comparator",
1180
- "keywords": [
1181
- "comparator",
1182
- "compare",
1183
- "equality"
1184
- ],
1185
- "time": "2018-02-01T13:46:46+00:00"
1186
- },
1187
- {
1188
- "name": "sebastian/diff",
1189
- "version": "2.0.1",
1190
- "source": {
1191
- "type": "git",
1192
- "url": "https://github.com/sebastianbergmann/diff.git",
1193
- "reference": "347c1d8b49c5c3ee30c7040ea6fc446790e6bddd"
1194
- },
1195
- "dist": {
1196
- "type": "zip",
1197
- "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/347c1d8b49c5c3ee30c7040ea6fc446790e6bddd",
1198
- "reference": "347c1d8b49c5c3ee30c7040ea6fc446790e6bddd",
1199
- "shasum": ""
1200
- },
1201
- "require": {
1202
- "php": "^7.0"
1203
- },
1204
- "require-dev": {
1205
- "phpunit/phpunit": "^6.2"
1206
- },
1207
- "type": "library",
1208
- "extra": {
1209
- "branch-alias": {
1210
- "dev-master": "2.0-dev"
1211
- }
1212
- },
1213
- "autoload": {
1214
- "classmap": [
1215
- "src/"
1216
- ]
1217
- },
1218
- "notification-url": "https://packagist.org/downloads/",
1219
- "license": [
1220
- "BSD-3-Clause"
1221
- ],
1222
- "authors": [
1223
- {
1224
- "name": "Kore Nordmann",
1225
- "email": "mail@kore-nordmann.de"
1226
- },
1227
- {
1228
- "name": "Sebastian Bergmann",
1229
- "email": "sebastian@phpunit.de"
1230
- }
1231
- ],
1232
- "description": "Diff implementation",
1233
- "homepage": "https://github.com/sebastianbergmann/diff",
1234
- "keywords": [
1235
- "diff"
1236
- ],
1237
- "time": "2017-08-03T08:09:46+00:00"
1238
- },
1239
- {
1240
- "name": "sebastian/environment",
1241
- "version": "3.1.0",
1242
- "source": {
1243
- "type": "git",
1244
- "url": "https://github.com/sebastianbergmann/environment.git",
1245
- "reference": "cd0871b3975fb7fc44d11314fd1ee20925fce4f5"
1246
- },
1247
- "dist": {
1248
- "type": "zip",
1249
- "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/cd0871b3975fb7fc44d11314fd1ee20925fce4f5",
1250
- "reference": "cd0871b3975fb7fc44d11314fd1ee20925fce4f5",
1251
- "shasum": ""
1252
- },
1253
- "require": {
1254
- "php": "^7.0"
1255
- },
1256
- "require-dev": {
1257
- "phpunit/phpunit": "^6.1"
1258
- },
1259
- "type": "library",
1260
- "extra": {
1261
- "branch-alias": {
1262
- "dev-master": "3.1.x-dev"
1263
- }
1264
- },
1265
- "autoload": {
1266
- "classmap": [
1267
- "src/"
1268
- ]
1269
- },
1270
- "notification-url": "https://packagist.org/downloads/",
1271
- "license": [
1272
- "BSD-3-Clause"
1273
- ],
1274
- "authors": [
1275
- {
1276
- "name": "Sebastian Bergmann",
1277
- "email": "sebastian@phpunit.de"
1278
- }
1279
- ],
1280
- "description": "Provides functionality to handle HHVM/PHP environments",
1281
- "homepage": "http://www.github.com/sebastianbergmann/environment",
1282
- "keywords": [
1283
- "Xdebug",
1284
- "environment",
1285
- "hhvm"
1286
- ],
1287
- "time": "2017-07-01T08:51:00+00:00"
1288
- },
1289
- {
1290
- "name": "sebastian/exporter",
1291
- "version": "3.1.0",
1292
- "source": {
1293
- "type": "git",
1294
- "url": "https://github.com/sebastianbergmann/exporter.git",
1295
- "reference": "234199f4528de6d12aaa58b612e98f7d36adb937"
1296
- },
1297
- "dist": {
1298
- "type": "zip",
1299
- "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/234199f4528de6d12aaa58b612e98f7d36adb937",
1300
- "reference": "234199f4528de6d12aaa58b612e98f7d36adb937",
1301
- "shasum": ""
1302
- },
1303
- "require": {
1304
- "php": "^7.0",
1305
- "sebastian/recursion-context": "^3.0"
1306
- },
1307
- "require-dev": {
1308
- "ext-mbstring": "*",
1309
- "phpunit/phpunit": "^6.0"
1310
- },
1311
- "type": "library",
1312
- "extra": {
1313
- "branch-alias": {
1314
- "dev-master": "3.1.x-dev"
1315
- }
1316
- },
1317
- "autoload": {
1318
- "classmap": [
1319
- "src/"
1320
- ]
1321
- },
1322
- "notification-url": "https://packagist.org/downloads/",
1323
- "license": [
1324
- "BSD-3-Clause"
1325
- ],
1326
- "authors": [
1327
- {
1328
- "name": "Jeff Welch",
1329
- "email": "whatthejeff@gmail.com"
1330
- },
1331
- {
1332
- "name": "Volker Dusch",
1333
- "email": "github@wallbash.com"
1334
- },
1335
- {
1336
- "name": "Bernhard Schussek",
1337
- "email": "bschussek@2bepublished.at"
1338
- },
1339
- {
1340
- "name": "Sebastian Bergmann",
1341
- "email": "sebastian@phpunit.de"
1342
- },
1343
- {
1344
- "name": "Adam Harvey",
1345
- "email": "aharvey@php.net"
1346
- }
1347
- ],
1348
- "description": "Provides the functionality to export PHP variables for visualization",
1349
- "homepage": "http://www.github.com/sebastianbergmann/exporter",
1350
- "keywords": [
1351
- "export",
1352
- "exporter"
1353
- ],
1354
- "time": "2017-04-03T13:19:02+00:00"
1355
- },
1356
- {
1357
- "name": "sebastian/global-state",
1358
- "version": "2.0.0",
1359
- "source": {
1360
- "type": "git",
1361
- "url": "https://github.com/sebastianbergmann/global-state.git",
1362
- "reference": "e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4"
1363
- },
1364
- "dist": {
1365
- "type": "zip",
1366
- "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4",
1367
- "reference": "e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4",
1368
- "shasum": ""
1369
- },
1370
- "require": {
1371
- "php": "^7.0"
1372
- },
1373
- "require-dev": {
1374
- "phpunit/phpunit": "^6.0"
1375
- },
1376
- "suggest": {
1377
- "ext-uopz": "*"
1378
- },
1379
- "type": "library",
1380
- "extra": {
1381
- "branch-alias": {
1382
- "dev-master": "2.0-dev"
1383
- }
1384
- },
1385
- "autoload": {
1386
- "classmap": [
1387
- "src/"
1388
- ]
1389
- },
1390
- "notification-url": "https://packagist.org/downloads/",
1391
- "license": [
1392
- "BSD-3-Clause"
1393
- ],
1394
- "authors": [
1395
- {
1396
- "name": "Sebastian Bergmann",
1397
- "email": "sebastian@phpunit.de"
1398
- }
1399
- ],
1400
- "description": "Snapshotting of global state",
1401
- "homepage": "http://www.github.com/sebastianbergmann/global-state",
1402
- "keywords": [
1403
- "global state"
1404
- ],
1405
- "time": "2017-04-27T15:39:26+00:00"
1406
- },
1407
- {
1408
- "name": "sebastian/object-enumerator",
1409
- "version": "3.0.3",
1410
- "source": {
1411
- "type": "git",
1412
- "url": "https://github.com/sebastianbergmann/object-enumerator.git",
1413
- "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5"
1414
- },
1415
- "dist": {
1416
- "type": "zip",
1417
- "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/7cfd9e65d11ffb5af41198476395774d4c8a84c5",
1418
- "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5",
1419
- "shasum": ""
1420
- },
1421
- "require": {
1422
- "php": "^7.0",
1423
- "sebastian/object-reflector": "^1.1.1",
1424
- "sebastian/recursion-context": "^3.0"
1425
- },
1426
- "require-dev": {
1427
- "phpunit/phpunit": "^6.0"
1428
- },
1429
- "type": "library",
1430
- "extra": {
1431
- "branch-alias": {
1432
- "dev-master": "3.0.x-dev"
1433
- }
1434
- },
1435
- "autoload": {
1436
- "classmap": [
1437
- "src/"
1438
- ]
1439
- },
1440
- "notification-url": "https://packagist.org/downloads/",
1441
- "license": [
1442
- "BSD-3-Clause"
1443
- ],
1444
- "authors": [
1445
- {
1446
- "name": "Sebastian Bergmann",
1447
- "email": "sebastian@phpunit.de"
1448
- }
1449
- ],
1450
- "description": "Traverses array structures and object graphs to enumerate all referenced objects",
1451
- "homepage": "https://github.com/sebastianbergmann/object-enumerator/",
1452
- "time": "2017-08-03T12:35:26+00:00"
1453
- },
1454
- {
1455
- "name": "sebastian/object-reflector",
1456
- "version": "1.1.1",
1457
- "source": {
1458
- "type": "git",
1459
- "url": "https://github.com/sebastianbergmann/object-reflector.git",
1460
- "reference": "773f97c67f28de00d397be301821b06708fca0be"
1461
- },
1462
- "dist": {
1463
- "type": "zip",
1464
- "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/773f97c67f28de00d397be301821b06708fca0be",
1465
- "reference": "773f97c67f28de00d397be301821b06708fca0be",
1466
- "shasum": ""
1467
- },
1468
- "require": {
1469
- "php": "^7.0"
1470
- },
1471
- "require-dev": {
1472
- "phpunit/phpunit": "^6.0"
1473
- },
1474
- "type": "library",
1475
- "extra": {
1476
- "branch-alias": {
1477
- "dev-master": "1.1-dev"
1478
- }
1479
- },
1480
- "autoload": {
1481
- "classmap": [
1482
- "src/"
1483
- ]
1484
- },
1485
- "notification-url": "https://packagist.org/downloads/",
1486
- "license": [
1487
- "BSD-3-Clause"
1488
- ],
1489
- "authors": [
1490
- {
1491
- "name": "Sebastian Bergmann",
1492
- "email": "sebastian@phpunit.de"
1493
- }
1494
- ],
1495
- "description": "Allows reflection of object attributes, including inherited and non-public ones",
1496
- "homepage": "https://github.com/sebastianbergmann/object-reflector/",
1497
- "time": "2017-03-29T09:07:27+00:00"
1498
- },
1499
- {
1500
- "name": "sebastian/recursion-context",
1501
- "version": "3.0.0",
1502
- "source": {
1503
- "type": "git",
1504
- "url": "https://github.com/sebastianbergmann/recursion-context.git",
1505
- "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8"
1506
- },
1507
- "dist": {
1508
- "type": "zip",
1509
- "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8",
1510
- "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8",
1511
- "shasum": ""
1512
- },
1513
- "require": {
1514
- "php": "^7.0"
1515
- },
1516
- "require-dev": {
1517
- "phpunit/phpunit": "^6.0"
1518
- },
1519
- "type": "library",
1520
- "extra": {
1521
- "branch-alias": {
1522
- "dev-master": "3.0.x-dev"
1523
- }
1524
- },
1525
- "autoload": {
1526
- "classmap": [
1527
- "src/"
1528
- ]
1529
- },
1530
- "notification-url": "https://packagist.org/downloads/",
1531
- "license": [
1532
- "BSD-3-Clause"
1533
- ],
1534
- "authors": [
1535
- {
1536
- "name": "Jeff Welch",
1537
- "email": "whatthejeff@gmail.com"
1538
- },
1539
- {
1540
- "name": "Sebastian Bergmann",
1541
- "email": "sebastian@phpunit.de"
1542
- },
1543
- {
1544
- "name": "Adam Harvey",
1545
- "email": "aharvey@php.net"
1546
- }
1547
- ],
1548
- "description": "Provides functionality to recursively process PHP variables",
1549
- "homepage": "http://www.github.com/sebastianbergmann/recursion-context",
1550
- "time": "2017-03-03T06:23:57+00:00"
1551
- },
1552
- {
1553
- "name": "sebastian/resource-operations",
1554
- "version": "1.0.0",
1555
- "source": {
1556
- "type": "git",
1557
- "url": "https://github.com/sebastianbergmann/resource-operations.git",
1558
- "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52"
1559
- },
1560
- "dist": {
1561
- "type": "zip",
1562
- "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/ce990bb21759f94aeafd30209e8cfcdfa8bc3f52",
1563
- "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52",
1564
- "shasum": ""
1565
- },
1566
- "require": {
1567
- "php": ">=5.6.0"
1568
- },
1569
- "type": "library",
1570
- "extra": {
1571
- "branch-alias": {
1572
- "dev-master": "1.0.x-dev"
1573
- }
1574
- },
1575
- "autoload": {
1576
- "classmap": [
1577
- "src/"
1578
- ]
1579
- },
1580
- "notification-url": "https://packagist.org/downloads/",
1581
- "license": [
1582
- "BSD-3-Clause"
1583
- ],
1584
- "authors": [
1585
- {
1586
- "name": "Sebastian Bergmann",
1587
- "email": "sebastian@phpunit.de"
1588
- }
1589
- ],
1590
- "description": "Provides a list of PHP built-in functions that operate on resources",
1591
- "homepage": "https://www.github.com/sebastianbergmann/resource-operations",
1592
- "time": "2015-07-28T20:34:47+00:00"
1593
- },
1594
- {
1595
- "name": "sebastian/version",
1596
- "version": "2.0.1",
1597
- "source": {
1598
- "type": "git",
1599
- "url": "https://github.com/sebastianbergmann/version.git",
1600
- "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019"
1601
- },
1602
- "dist": {
1603
- "type": "zip",
1604
- "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019",
1605
- "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019",
1606
- "shasum": ""
1607
- },
1608
- "require": {
1609
- "php": ">=5.6"
1610
- },
1611
- "type": "library",
1612
- "extra": {
1613
- "branch-alias": {
1614
- "dev-master": "2.0.x-dev"
1615
- }
1616
- },
1617
- "autoload": {
1618
- "classmap": [
1619
- "src/"
1620
- ]
1621
- },
1622
- "notification-url": "https://packagist.org/downloads/",
1623
- "license": [
1624
- "BSD-3-Clause"
1625
- ],
1626
- "authors": [
1627
- {
1628
- "name": "Sebastian Bergmann",
1629
- "email": "sebastian@phpunit.de",
1630
- "role": "lead"
1631
- }
1632
- ],
1633
- "description": "Library that helps with managing the version number of Git-hosted PHP projects",
1634
- "homepage": "https://github.com/sebastianbergmann/version",
1635
- "time": "2016-10-03T07:35:21+00:00"
1636
- },
1637
- {
1638
- "name": "symfony/config",
1639
- "version": "v3.4.16",
1640
- "source": {
1641
- "type": "git",
1642
- "url": "https://github.com/symfony/config.git",
1643
- "reference": "e5389132dc6320682de3643091121c048ff796b3"
1644
- },
1645
- "dist": {
1646
- "type": "zip",
1647
- "url": "https://api.github.com/repos/symfony/config/zipball/e5389132dc6320682de3643091121c048ff796b3",
1648
- "reference": "e5389132dc6320682de3643091121c048ff796b3",
1649
- "shasum": ""
1650
- },
1651
- "require": {
1652
- "php": "^5.5.9|>=7.0.8",
1653
- "symfony/filesystem": "~2.8|~3.0|~4.0",
1654
- "symfony/polyfill-ctype": "~1.8"
1655
- },
1656
- "conflict": {
1657
- "symfony/dependency-injection": "<3.3",
1658
- "symfony/finder": "<3.3"
1659
- },
1660
- "require-dev": {
1661
- "symfony/dependency-injection": "~3.3|~4.0",
1662
- "symfony/event-dispatcher": "~3.3|~4.0",
1663
- "symfony/finder": "~3.3|~4.0",
1664
- "symfony/yaml": "~3.0|~4.0"
1665
- },
1666
- "suggest": {
1667
- "symfony/yaml": "To use the yaml reference dumper"
1668
- },
1669
- "type": "library",
1670
- "extra": {
1671
- "branch-alias": {
1672
- "dev-master": "3.4-dev"
1673
- }
1674
- },
1675
- "autoload": {
1676
- "psr-4": {
1677
- "Symfony\\Component\\Config\\": ""
1678
- },
1679
- "exclude-from-classmap": [
1680
- "/Tests/"
1681
- ]
1682
- },
1683
- "notification-url": "https://packagist.org/downloads/",
1684
- "license": [
1685
- "MIT"
1686
- ],
1687
- "authors": [
1688
- {
1689
- "name": "Fabien Potencier",
1690
- "email": "fabien@symfony.com"
1691
- },
1692
- {
1693
- "name": "Symfony Community",
1694
- "homepage": "https://symfony.com/contributors"
1695
- }
1696
- ],
1697
- "description": "Symfony Config Component",
1698
- "homepage": "https://symfony.com",
1699
- "time": "2018-09-08T13:15:14+00:00"
1700
- },
1701
- {
1702
- "name": "symfony/console",
1703
- "version": "v3.4.16",
1704
- "source": {
1705
- "type": "git",
1706
- "url": "https://github.com/symfony/console.git",
1707
- "reference": "1cbaac35024c9dfc9612b7e2310e82677bf85709"
1708
- },
1709
- "dist": {
1710
- "type": "zip",
1711
- "url": "https://api.github.com/repos/symfony/console/zipball/1cbaac35024c9dfc9612b7e2310e82677bf85709",
1712
- "reference": "1cbaac35024c9dfc9612b7e2310e82677bf85709",
1713
- "shasum": ""
1714
- },
1715
- "require": {
1716
- "php": "^5.5.9|>=7.0.8",
1717
- "symfony/debug": "~2.8|~3.0|~4.0",
1718
- "symfony/polyfill-mbstring": "~1.0"
1719
- },
1720
- "conflict": {
1721
- "symfony/dependency-injection": "<3.4",
1722
- "symfony/process": "<3.3"
1723
- },
1724
- "require-dev": {
1725
- "psr/log": "~1.0",
1726
- "symfony/config": "~3.3|~4.0",
1727
- "symfony/dependency-injection": "~3.4|~4.0",
1728
- "symfony/event-dispatcher": "~2.8|~3.0|~4.0",
1729
- "symfony/lock": "~3.4|~4.0",
1730
- "symfony/process": "~3.3|~4.0"
1731
- },
1732
- "suggest": {
1733
- "psr/log-implementation": "For using the console logger",
1734
- "symfony/event-dispatcher": "",
1735
- "symfony/lock": "",
1736
- "symfony/process": ""
1737
- },
1738
- "type": "library",
1739
- "extra": {
1740
- "branch-alias": {
1741
- "dev-master": "3.4-dev"
1742
- }
1743
- },
1744
- "autoload": {
1745
- "psr-4": {
1746
- "Symfony\\Component\\Console\\": ""
1747
- },
1748
- "exclude-from-classmap": [
1749
- "/Tests/"
1750
- ]
1751
- },
1752
- "notification-url": "https://packagist.org/downloads/",
1753
- "license": [
1754
- "MIT"
1755
- ],
1756
- "authors": [
1757
- {
1758
- "name": "Fabien Potencier",
1759
- "email": "fabien@symfony.com"
1760
- },
1761
- {
1762
- "name": "Symfony Community",
1763
- "homepage": "https://symfony.com/contributors"
1764
- }
1765
- ],
1766
- "description": "Symfony Console Component",
1767
- "homepage": "https://symfony.com",
1768
- "time": "2018-09-30T03:37:36+00:00"
1769
- },
1770
- {
1771
- "name": "symfony/debug",
1772
- "version": "v3.4.16",
1773
- "source": {
1774
- "type": "git",
1775
- "url": "https://github.com/symfony/debug.git",
1776
- "reference": "b70cfaae39009ecde3164bb8cba4d029220d27b1"
1777
- },
1778
- "dist": {
1779
- "type": "zip",
1780
- "url": "https://api.github.com/repos/symfony/debug/zipball/b70cfaae39009ecde3164bb8cba4d029220d27b1",
1781
- "reference": "b70cfaae39009ecde3164bb8cba4d029220d27b1",
1782
- "shasum": ""
1783
- },
1784
- "require": {
1785
- "php": "^5.5.9|>=7.0.8",
1786
- "psr/log": "~1.0"
1787
- },
1788
- "conflict": {
1789
- "symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2"
1790
- },
1791
- "require-dev": {
1792
- "symfony/http-kernel": "~2.8|~3.0|~4.0"
1793
- },
1794
- "type": "library",
1795
- "extra": {
1796
- "branch-alias": {
1797
- "dev-master": "3.4-dev"
1798
- }
1799
- },
1800
- "autoload": {
1801
- "psr-4": {
1802
- "Symfony\\Component\\Debug\\": ""
1803
- },
1804
- "exclude-from-classmap": [
1805
- "/Tests/"
1806
- ]
1807
- },
1808
- "notification-url": "https://packagist.org/downloads/",
1809
- "license": [
1810
- "MIT"
1811
- ],
1812
- "authors": [
1813
- {
1814
- "name": "Fabien Potencier",
1815
- "email": "fabien@symfony.com"
1816
- },
1817
- {
1818
- "name": "Symfony Community",
1819
- "homepage": "https://symfony.com/contributors"
1820
- }
1821
- ],
1822
- "description": "Symfony Debug Component",
1823
- "homepage": "https://symfony.com",
1824
- "time": "2018-09-22T18:25:03+00:00"
1825
- },
1826
- {
1827
- "name": "symfony/event-dispatcher",
1828
- "version": "v2.8.46",
1829
- "source": {
1830
- "type": "git",
1831
- "url": "https://github.com/symfony/event-dispatcher.git",
1832
- "reference": "84ae343f39947aa084426ed1138bb96bf94d1f12"
1833
- },
1834
- "dist": {
1835
- "type": "zip",
1836
- "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/84ae343f39947aa084426ed1138bb96bf94d1f12",
1837
- "reference": "84ae343f39947aa084426ed1138bb96bf94d1f12",
1838
- "shasum": ""
1839
- },
1840
- "require": {
1841
- "php": ">=5.3.9"
1842
- },
1843
- "require-dev": {
1844
- "psr/log": "~1.0",
1845
- "symfony/config": "^2.0.5|~3.0.0",
1846
- "symfony/dependency-injection": "~2.6|~3.0.0",
1847
- "symfony/expression-language": "~2.6|~3.0.0",
1848
- "symfony/stopwatch": "~2.3|~3.0.0"
1849
- },
1850
- "suggest": {
1851
- "symfony/dependency-injection": "",
1852
- "symfony/http-kernel": ""
1853
- },
1854
- "type": "library",
1855
- "extra": {
1856
- "branch-alias": {
1857
- "dev-master": "2.8-dev"
1858
- }
1859
- },
1860
- "autoload": {
1861
- "psr-4": {
1862
- "Symfony\\Component\\EventDispatcher\\": ""
1863
- },
1864
- "exclude-from-classmap": [
1865
- "/Tests/"
1866
- ]
1867
- },
1868
- "notification-url": "https://packagist.org/downloads/",
1869
- "license": [
1870
- "MIT"
1871
- ],
1872
- "authors": [
1873
- {
1874
- "name": "Fabien Potencier",
1875
- "email": "fabien@symfony.com"
1876
- },
1877
- {
1878
- "name": "Symfony Community",
1879
- "homepage": "https://symfony.com/contributors"
1880
- }
1881
- ],
1882
- "description": "Symfony EventDispatcher Component",
1883
- "homepage": "https://symfony.com",
1884
- "time": "2018-07-26T09:03:18+00:00"
1885
- },
1886
- {
1887
- "name": "symfony/filesystem",
1888
- "version": "v3.4.16",
1889
- "source": {
1890
- "type": "git",
1891
- "url": "https://github.com/symfony/filesystem.git",
1892
- "reference": "f89ab242d915d188fca95ee3291c72c5a094a195"
1893
- },
1894
- "dist": {
1895
- "type": "zip",
1896
- "url": "https://api.github.com/repos/symfony/filesystem/zipball/f89ab242d915d188fca95ee3291c72c5a094a195",
1897
- "reference": "f89ab242d915d188fca95ee3291c72c5a094a195",
1898
- "shasum": ""
1899
- },
1900
- "require": {
1901
- "php": "^5.5.9|>=7.0.8",
1902
- "symfony/polyfill-ctype": "~1.8"
1903
- },
1904
- "type": "library",
1905
- "extra": {
1906
- "branch-alias": {
1907
- "dev-master": "3.4-dev"
1908
- }
1909
- },
1910
- "autoload": {
1911
- "psr-4": {
1912
- "Symfony\\Component\\Filesystem\\": ""
1913
- },
1914
- "exclude-from-classmap": [
1915
- "/Tests/"
1916
- ]
1917
- },
1918
- "notification-url": "https://packagist.org/downloads/",
1919
- "license": [
1920
- "MIT"
1921
- ],
1922
- "authors": [
1923
- {
1924
- "name": "Fabien Potencier",
1925
- "email": "fabien@symfony.com"
1926
- },
1927
- {
1928
- "name": "Symfony Community",
1929
- "homepage": "https://symfony.com/contributors"
1930
- }
1931
- ],
1932
- "description": "Symfony Filesystem Component",
1933
- "homepage": "https://symfony.com",
1934
- "time": "2018-09-30T03:32:28+00:00"
1935
- },
1936
- {
1937
- "name": "symfony/polyfill-ctype",
1938
- "version": "v1.9.0",
1939
- "source": {
1940
- "type": "git",
1941
- "url": "https://github.com/symfony/polyfill-ctype.git",
1942
- "reference": "e3d826245268269cd66f8326bd8bc066687b4a19"
1943
- },
1944
- "dist": {
1945
- "type": "zip",
1946
- "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/e3d826245268269cd66f8326bd8bc066687b4a19",
1947
- "reference": "e3d826245268269cd66f8326bd8bc066687b4a19",
1948
- "shasum": ""
1949
- },
1950
- "require": {
1951
- "php": ">=5.3.3"
1952
- },
1953
- "suggest": {
1954
- "ext-ctype": "For best performance"
1955
- },
1956
- "type": "library",
1957
- "extra": {
1958
- "branch-alias": {
1959
- "dev-master": "1.9-dev"
1960
- }
1961
- },
1962
- "autoload": {
1963
- "psr-4": {
1964
- "Symfony\\Polyfill\\Ctype\\": ""
1965
- },
1966
- "files": [
1967
- "bootstrap.php"
1968
- ]
1969
- },
1970
- "notification-url": "https://packagist.org/downloads/",
1971
- "license": [
1972
- "MIT"
1973
- ],
1974
- "authors": [
1975
- {
1976
- "name": "Symfony Community",
1977
- "homepage": "https://symfony.com/contributors"
1978
- },
1979
- {
1980
- "name": "Gert de Pagter",
1981
- "email": "BackEndTea@gmail.com"
1982
- }
1983
- ],
1984
- "description": "Symfony polyfill for ctype functions",
1985
- "homepage": "https://symfony.com",
1986
- "keywords": [
1987
- "compatibility",
1988
- "ctype",
1989
- "polyfill",
1990
- "portable"
1991
- ],
1992
- "time": "2018-08-06T14:22:27+00:00"
1993
- },
1994
- {
1995
- "name": "symfony/polyfill-mbstring",
1996
- "version": "v1.9.0",
1997
- "source": {
1998
- "type": "git",
1999
- "url": "https://github.com/symfony/polyfill-mbstring.git",
2000
- "reference": "d0cd638f4634c16d8df4508e847f14e9e43168b8"
2001
- },
2002
- "dist": {
2003
- "type": "zip",
2004
- "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/d0cd638f4634c16d8df4508e847f14e9e43168b8",
2005
- "reference": "d0cd638f4634c16d8df4508e847f14e9e43168b8",
2006
- "shasum": ""
2007
- },
2008
- "require": {
2009
- "php": ">=5.3.3"
2010
- },
2011
- "suggest": {
2012
- "ext-mbstring": "For best performance"
2013
- },
2014
- "type": "library",
2015
- "extra": {
2016
- "branch-alias": {
2017
- "dev-master": "1.9-dev"
2018
- }
2019
- },
2020
- "autoload": {
2021
- "psr-4": {
2022
- "Symfony\\Polyfill\\Mbstring\\": ""
2023
- },
2024
- "files": [
2025
- "bootstrap.php"
2026
- ]
2027
- },
2028
- "notification-url": "https://packagist.org/downloads/",
2029
- "license": [
2030
- "MIT"
2031
- ],
2032
- "authors": [
2033
- {
2034
- "name": "Nicolas Grekas",
2035
- "email": "p@tchwork.com"
2036
- },
2037
- {
2038
- "name": "Symfony Community",
2039
- "homepage": "https://symfony.com/contributors"
2040
- }
2041
- ],
2042
- "description": "Symfony polyfill for the Mbstring extension",
2043
- "homepage": "https://symfony.com",
2044
- "keywords": [
2045
- "compatibility",
2046
- "mbstring",
2047
- "polyfill",
2048
- "portable",
2049
- "shim"
2050
- ],
2051
- "time": "2018-08-06T14:22:27+00:00"
2052
- },
2053
- {
2054
- "name": "symfony/stopwatch",
2055
- "version": "v3.4.16",
2056
- "source": {
2057
- "type": "git",
2058
- "url": "https://github.com/symfony/stopwatch.git",
2059
- "reference": "deda2765e8dab2fc38492e926ea690f2a681f59d"
2060
- },
2061
- "dist": {
2062
- "type": "zip",
2063
- "url": "https://api.github.com/repos/symfony/stopwatch/zipball/deda2765e8dab2fc38492e926ea690f2a681f59d",
2064
- "reference": "deda2765e8dab2fc38492e926ea690f2a681f59d",
2065
- "shasum": ""
2066
- },
2067
- "require": {
2068
- "php": "^5.5.9|>=7.0.8"
2069
- },
2070
- "type": "library",
2071
- "extra": {
2072
- "branch-alias": {
2073
- "dev-master": "3.4-dev"
2074
- }
2075
- },
2076
- "autoload": {
2077
- "psr-4": {
2078
- "Symfony\\Component\\Stopwatch\\": ""
2079
- },
2080
- "exclude-from-classmap": [
2081
- "/Tests/"
2082
- ]
2083
- },
2084
- "notification-url": "https://packagist.org/downloads/",
2085
- "license": [
2086
- "MIT"
2087
- ],
2088
- "authors": [
2089
- {
2090
- "name": "Fabien Potencier",
2091
- "email": "fabien@symfony.com"
2092
- },
2093
- {
2094
- "name": "Symfony Community",
2095
- "homepage": "https://symfony.com/contributors"
2096
- }
2097
- ],
2098
- "description": "Symfony Stopwatch Component",
2099
- "homepage": "https://symfony.com",
2100
- "time": "2018-07-26T10:03:52+00:00"
2101
- },
2102
- {
2103
- "name": "symfony/yaml",
2104
- "version": "v3.4.16",
2105
- "source": {
2106
- "type": "git",
2107
- "url": "https://github.com/symfony/yaml.git",
2108
- "reference": "61973ecda60e9f3561e929e19c07d4878b960fc1"
2109
- },
2110
- "dist": {
2111
- "type": "zip",
2112
- "url": "https://api.github.com/repos/symfony/yaml/zipball/61973ecda60e9f3561e929e19c07d4878b960fc1",
2113
- "reference": "61973ecda60e9f3561e929e19c07d4878b960fc1",
2114
- "shasum": ""
2115
- },
2116
- "require": {
2117
- "php": "^5.5.9|>=7.0.8",
2118
- "symfony/polyfill-ctype": "~1.8"
2119
- },
2120
- "conflict": {
2121
- "symfony/console": "<3.4"
2122
- },
2123
- "require-dev": {
2124
- "symfony/console": "~3.4|~4.0"
2125
- },
2126
- "suggest": {
2127
- "symfony/console": "For validating YAML files using the lint command"
2128
- },
2129
- "type": "library",
2130
- "extra": {
2131
- "branch-alias": {
2132
- "dev-master": "3.4-dev"
2133
- }
2134
- },
2135
- "autoload": {
2136
- "psr-4": {
2137
- "Symfony\\Component\\Yaml\\": ""
2138
- },
2139
- "exclude-from-classmap": [
2140
- "/Tests/"
2141
- ]
2142
- },
2143
- "notification-url": "https://packagist.org/downloads/",
2144
- "license": [
2145
- "MIT"
2146
- ],
2147
- "authors": [
2148
- {
2149
- "name": "Fabien Potencier",
2150
- "email": "fabien@symfony.com"
2151
- },
2152
- {
2153
- "name": "Symfony Community",
2154
- "homepage": "https://symfony.com/contributors"
2155
- }
2156
- ],
2157
- "description": "Symfony Yaml Component",
2158
- "homepage": "https://symfony.com",
2159
- "time": "2018-09-24T08:15:45+00:00"
2160
- },
2161
- {
2162
- "name": "theseer/tokenizer",
2163
- "version": "1.1.0",
2164
- "source": {
2165
- "type": "git",
2166
- "url": "https://github.com/theseer/tokenizer.git",
2167
- "reference": "cb2f008f3f05af2893a87208fe6a6c4985483f8b"
2168
- },
2169
- "dist": {
2170
- "type": "zip",
2171
- "url": "https://api.github.com/repos/theseer/tokenizer/zipball/cb2f008f3f05af2893a87208fe6a6c4985483f8b",
2172
- "reference": "cb2f008f3f05af2893a87208fe6a6c4985483f8b",
2173
- "shasum": ""
2174
- },
2175
- "require": {
2176
- "ext-dom": "*",
2177
- "ext-tokenizer": "*",
2178
- "ext-xmlwriter": "*",
2179
- "php": "^7.0"
2180
- },
2181
- "type": "library",
2182
- "autoload": {
2183
- "classmap": [
2184
- "src/"
2185
- ]
2186
- },
2187
- "notification-url": "https://packagist.org/downloads/",
2188
- "license": [
2189
- "BSD-3-Clause"
2190
- ],
2191
- "authors": [
2192
- {
2193
- "name": "Arne Blankerts",
2194
- "email": "arne@blankerts.de",
2195
- "role": "Developer"
2196
- }
2197
- ],
2198
- "description": "A small library for converting tokenized PHP source code into XML and potentially other formats",
2199
- "time": "2017-04-07T12:08:54+00:00"
2200
- },
2201
- {
2202
- "name": "webmozart/assert",
2203
- "version": "1.3.0",
2204
- "source": {
2205
- "type": "git",
2206
- "url": "https://github.com/webmozart/assert.git",
2207
- "reference": "0df1908962e7a3071564e857d86874dad1ef204a"
2208
- },
2209
- "dist": {
2210
- "type": "zip",
2211
- "url": "https://api.github.com/repos/webmozart/assert/zipball/0df1908962e7a3071564e857d86874dad1ef204a",
2212
- "reference": "0df1908962e7a3071564e857d86874dad1ef204a",
2213
- "shasum": ""
2214
- },
2215
- "require": {
2216
- "php": "^5.3.3 || ^7.0"
2217
- },
2218
- "require-dev": {
2219
- "phpunit/phpunit": "^4.6",
2220
- "sebastian/version": "^1.0.1"
2221
- },
2222
- "type": "library",
2223
- "extra": {
2224
- "branch-alias": {
2225
- "dev-master": "1.3-dev"
2226
- }
2227
- },
2228
- "autoload": {
2229
- "psr-4": {
2230
- "Webmozart\\Assert\\": "src/"
2231
- }
2232
- },
2233
- "notification-url": "https://packagist.org/downloads/",
2234
- "license": [
2235
- "MIT"
2236
- ],
2237
- "authors": [
2238
- {
2239
- "name": "Bernhard Schussek",
2240
- "email": "bschussek@gmail.com"
2241
- }
2242
- ],
2243
- "description": "Assertions to validate method input/output with nice error messages.",
2244
- "keywords": [
2245
- "assert",
2246
- "check",
2247
- "validate"
2248
- ],
2249
- "time": "2018-01-29T19:49:41+00:00"
2250
- }
2251
- ],
2252
- "aliases": [],
2253
- "minimum-stability": "stable",
2254
- "stability-flags": [],
2255
- "prefer-stable": false,
2256
- "prefer-lowest": false,
2257
- "platform": [],
2258
- "platform-dev": []
2259
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
lib/vendor/enshrined/svg-sanitize/{phpunit.xml.dist → phpunit.xml} RENAMED
@@ -15,9 +15,8 @@
15
  </logging>
16
 
17
  <filter>
18
- <whitelist processUncoveredFilesFromWhitelist="true">
19
  <directory suffix=".php">./src</directory>
20
  </whitelist>
21
  </filter>
22
-
23
  </phpunit>
15
  </logging>
16
 
17
  <filter>
18
+ <whitelist addUncoveredFilesFromWhitelist="true">
19
  <directory suffix=".php">./src</directory>
20
  </whitelist>
21
  </filter>
 
22
  </phpunit>
lib/vendor/enshrined/svg-sanitize/src/ElementReference/Resolver.php ADDED
@@ -0,0 +1,123 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace enshrined\svgSanitize\ElementReference;
3
+
4
+ use enshrined\svgSanitize\data\XPath;
5
+ use enshrined\svgSanitize\Helper;
6
+
7
+ class Resolver
8
+ {
9
+ /**
10
+ * @var XPath
11
+ */
12
+ protected $xPath;
13
+
14
+ /**
15
+ * @var Subject[]
16
+ */
17
+ protected $subjects = [];
18
+
19
+ public function __construct(XPath $xPath)
20
+ {
21
+ $this->xPath = $xPath;
22
+ }
23
+
24
+ public function collect()
25
+ {
26
+ $this->collectIdentifiedElements();
27
+ $this->processReferences();
28
+ $this->determineInvalidSubjects();
29
+ }
30
+
31
+ /**
32
+ * Resolves one subject by element.
33
+ *
34
+ * @param \DOMElement $element
35
+ * @param bool $considerChildren Whether to search in Subject's children as well
36
+ * @return Subject|null
37
+ */
38
+ public function findByElement(\DOMElement $element, $considerChildren = false)
39
+ {
40
+ foreach ($this->subjects as $subject) {
41
+ if (
42
+ $element === $subject->getElement()
43
+ || $considerChildren && Helper::isElementContainedIn($element, $subject->getElement())
44
+ ) {
45
+ return $subject;
46
+ }
47
+ }
48
+ return null;
49
+ }
50
+
51
+ /**
52
+ * Resolves subjects (plural!) by element id - in theory malformed
53
+ * DOM might have same ids assigned to different elements and leaving
54
+ * it to client/browser implementation which element to actually use.
55
+ *
56
+ * @param string $elementId
57
+ * @return Subject[]
58
+ */
59
+ public function findByElementId($elementId)
60
+ {
61
+ return array_filter(
62
+ $this->subjects,
63
+ function (Subject $subject) use ($elementId) {
64
+ return $elementId === $subject->getElementId();
65
+ }
66
+ );
67
+ }
68
+
69
+ /**
70
+ * Collects elements having `id` attribute (those that can be referenced).
71
+ */
72
+ protected function collectIdentifiedElements()
73
+ {
74
+ /** @var \DOMNodeList|\DOMElement[] $elements */
75
+ $elements = $this->xPath->query('//*[@id]');
76
+ foreach ($elements as $element) {
77
+ $this->subjects[$element->getAttribute('id')] = new Subject($element);
78
+ }
79
+ }
80
+
81
+ /**
82
+ * Processes references from and to elements having `id` attribute concerning
83
+ * their occurrence in `<use ... xlink:href="#identifier">` statements.
84
+ */
85
+ protected function processReferences()
86
+ {
87
+ $useNodeName = $this->xPath->createNodeName('use');
88
+ foreach ($this->subjects as $subject) {
89
+ $useElements = $this->xPath->query(
90
+ $useNodeName . '[@href or @xlink:href]',
91
+ $subject->getElement()
92
+ );
93
+ /** @var \DOMElement $useElement */
94
+ foreach ($useElements as $useElement) {
95
+ $useId = Helper::extractIdReferenceFromHref(
96
+ Helper::getElementHref($useElement)
97
+ );
98
+ if ($useId === null || !isset($this->subjects[$useId])) {
99
+ continue;
100
+ }
101
+ $subject->addUse($this->subjects[$useId]);
102
+ $this->subjects[$useId]->addUsedIn($subject);
103
+ }
104
+ }
105
+ }
106
+
107
+ /***
108
+ * Determines and tags infinite loops.
109
+ */
110
+ protected function determineInvalidSubjects()
111
+ {
112
+ foreach ($this->subjects as $subject) {
113
+ $useId = Helper::extractIdReferenceFromHref(
114
+ Helper::getElementHref($subject->getElement())
115
+ );
116
+ if ($useId === $subject->getElementId()) {
117
+ $subject->addTags([Subject::TAG_INVALID, Subject::TAG_SELF_REFERENCE]);
118
+ } elseif ($subject->hasInfiniteLoop()) {
119
+ $subject->addTags([Subject::TAG_INVALID, Subject::TAG_INFINITE_LOOP]);
120
+ }
121
+ }
122
+ }
123
+ }
lib/vendor/enshrined/svg-sanitize/src/ElementReference/Subject.php ADDED
@@ -0,0 +1,148 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace enshrined\svgSanitize\ElementReference;
3
+
4
+ class Subject
5
+ {
6
+ const TAG_INVALID = 1;
7
+ const TAG_SELF_REFERENCE = 2;
8
+ const TAG_INFINITE_LOOP = 3;
9
+
10
+ /**
11
+ * @var \DOMElement
12
+ */
13
+ protected $element;
14
+
15
+ /**
16
+ * @var Usage[]
17
+ */
18
+ protected $useCollection = [];
19
+
20
+ /**
21
+ * @var Usage[]
22
+ */
23
+ protected $usedInCollection = [];
24
+
25
+ /**
26
+ * @var int[]
27
+ */
28
+ protected $tags = [];
29
+
30
+ /**
31
+ * @param \DOMElement $element
32
+ */
33
+ public function __construct(\DOMElement $element)
34
+ {
35
+ $this->element = $element;
36
+ }
37
+
38
+ /**
39
+ * @return \DOMElement
40
+ */
41
+ public function getElement()
42
+ {
43
+ return $this->element;
44
+ }
45
+
46
+ /**
47
+ * @return string
48
+ */
49
+ public function getElementId()
50
+ {
51
+ return $this->element->getAttribute('id');
52
+ }
53
+
54
+ /**
55
+ * @param array $subjects Previously processed subjects
56
+ * @return bool
57
+ */
58
+ public function hasInfiniteLoop(array $subjects = [])
59
+ {
60
+ if (in_array($this, $subjects, true)) {
61
+ return true;
62
+ }
63
+ $subjects[] = $this;
64
+ foreach ($this->useCollection as $usage) {
65
+ if ($usage->getSubject()->hasInfiniteLoop($subjects)) {
66
+ return true;
67
+ }
68
+ }
69
+ return false;
70
+ }
71
+
72
+ /**
73
+ * @param int[] $tags (see Subject constants)
74
+ */
75
+ public function addTags(array $tags)
76
+ {
77
+ $tags = array_map('intval', $tags);
78
+ $this->tags = array_merge($this->tags, array_diff($tags, $this->tags));
79
+ }
80
+
81
+ /**
82
+ * @param int[] $tags (see Subject constants)
83
+ * @return bool
84
+ */
85
+ public function matchesTags(array $tags)
86
+ {
87
+ $amount = count($tags);
88
+ return $amount > 0 && count(array_intersect($this->tags, $tags)) === $amount;
89
+ }
90
+
91
+ /**
92
+ * @param Subject $subject
93
+ */
94
+ public function addUse(Subject $subject)
95
+ {
96
+ if ($subject === $this) {
97
+ throw new \LogicException('Cannot add self usage', 1570713416);
98
+ }
99
+ $identifier = $subject->getElementId();
100
+ if (isset($this->useCollection[$identifier])) {
101
+ $this->useCollection[$identifier]->increment();
102
+ return;
103
+ }
104
+ $this->useCollection[$identifier] = new Usage($subject);
105
+ }
106
+
107
+ /**
108
+ * @param Subject $subject
109
+ */
110
+ public function addUsedIn(Subject $subject)
111
+ {
112
+ if ($subject === $this) {
113
+ throw new \LogicException('Cannot add self as usage', 1570713417);
114
+ }
115
+ $identifier = $subject->getElementId();
116
+ if (isset($this->usedInCollection[$identifier])) {
117
+ $this->usedInCollection[$identifier]->increment();
118
+ return;
119
+ }
120
+ $this->usedInCollection[$identifier] = new Usage($subject);
121
+ }
122
+
123
+ /**
124
+ * @param bool $accumulated
125
+ * @return int
126
+ */
127
+ public function countUse($accumulated = false)
128
+ {
129
+ $count = 0;
130
+ foreach ($this->useCollection as $use) {
131
+ $useCount = $use->getSubject()->countUse();
132
+ $count += $use->getCount() * ($accumulated ? 1 + $useCount : max(1, $useCount));
133
+ }
134
+ return $count;
135
+ }
136
+
137
+ /**
138
+ * @return int
139
+ */
140
+ public function countUsedIn()
141
+ {
142
+ $count = 0;
143
+ foreach ($this->usedInCollection as $usedIn) {
144
+ $count += $usedIn->getCount() * max(1, $usedIn->getSubject()->countUsedIn());
145
+ }
146
+ return $count;
147
+ }
148
+ }
lib/vendor/enshrined/svg-sanitize/src/ElementReference/Usage.php ADDED
@@ -0,0 +1,49 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace enshrined\svgSanitize\ElementReference;
3
+
4
+ class Usage
5
+ {
6
+ /**
7
+ * @var Subject
8
+ */
9
+ protected $subject;
10
+
11
+ /**
12
+ * @var int
13
+ */
14
+ protected $count;
15
+
16
+ /**
17
+ * @param Subject $subject
18
+ * @param int $count
19
+ */
20
+ public function __construct(Subject $subject, $count = 1)
21
+ {
22
+ $this->subject = $subject;
23
+ $this->count = (int)$count;
24
+ }
25
+
26
+ /**
27
+ * @param int $by
28
+ */
29
+ public function increment($by = 1)
30
+ {
31
+ $this->count += (int)$by;
32
+ }
33
+
34
+ /**
35
+ * @return Subject
36
+ */
37
+ public function getSubject()
38
+ {
39
+ return $this->subject;
40
+ }
41
+
42
+ /**
43
+ * @return int
44
+ */
45
+ public function getCount()
46
+ {
47
+ return $this->count;
48
+ }
49
+ }
lib/vendor/enshrined/svg-sanitize/src/Helper.php ADDED
@@ -0,0 +1,53 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace enshrined\svgSanitize;
3
+
4
+ class Helper
5
+ {
6
+ /**
7
+ * @param \DOMElement $element
8
+ * @return string|null
9
+ */
10
+ public static function getElementHref(\DOMElement $element)
11
+ {
12
+ if ($element->hasAttribute('href')) {
13
+ return $element->getAttribute('href');
14
+ }
15
+ if ($element->hasAttributeNS('http://www.w3.org/1999/xlink', 'href')) {
16
+ return $element->getAttributeNS('http://www.w3.org/1999/xlink', 'href');
17
+ }
18
+ return null;
19
+ }
20
+
21
+ /**
22
+ * @param string $href
23
+ * @return string|null
24
+ */
25
+ public static function extractIdReferenceFromHref($href)
26
+ {
27
+ if (!is_string($href) || strpos($href, '#') !== 0) {
28
+ return null;
29
+ }
30
+ return substr($href, 1);
31
+ }
32
+
33
+ /**
34
+ * @param \DOMElement $needle
35
+ * @param \DOMElement $haystack
36
+ * @return bool
37
+ */
38
+ public static function isElementContainedIn(\DOMElement $needle, \DOMElement $haystack)
39
+ {
40
+ if ($needle === $haystack) {
41
+ return true;
42
+ }
43
+ foreach ($haystack->childNodes as $childNode) {
44
+ if (!$childNode instanceof \DOMElement) {
45
+ continue;
46
+ }
47
+ if (self::isElementContainedIn($needle, $childNode)) {
48
+ return true;
49
+ }
50
+ }
51
+ return false;
52
+ }
53
+ }
lib/vendor/enshrined/svg-sanitize/src/Sanitizer.php CHANGED
@@ -2,11 +2,13 @@
2
 
3
  namespace enshrined\svgSanitize;
4
 
5
- use DOMDocument;
6
  use enshrined\svgSanitize\data\AllowedAttributes;
7
  use enshrined\svgSanitize\data\AllowedTags;
8
  use enshrined\svgSanitize\data\AttributeInterface;
9
  use enshrined\svgSanitize\data\TagInterface;
 
 
 
10
 
11
  /**
12
  * Class Sanitizer
@@ -19,10 +21,10 @@ class Sanitizer
19
  /**
20
  * Regex to catch script and data values in attributes
21
  */
22
- const SCRIPT_REGEX = '/(?:\w+script|data):/xi';
23
 
24
  /**
25
- * @var DOMDocument
26
  */
27
  protected $xmlDocument;
28
 
@@ -51,6 +53,11 @@ class Sanitizer
51
  */
52
  protected $removeRemoteReferences = false;
53
 
 
 
 
 
 
54
  /**
55
  * @var bool
56
  */
@@ -61,6 +68,16 @@ class Sanitizer
61
  */
62
  protected $xmlOptions = LIBXML_NOEMPTYTAG;
63
 
 
 
 
 
 
 
 
 
 
 
64
  /**
65
  *
66
  */
@@ -76,7 +93,7 @@ class Sanitizer
76
  */
77
  protected function resetInternal()
78
  {
79
- $this->xmlDocument = new DOMDocument();
80
  $this->xmlDocument->preserveWhiteSpace = false;
81
  $this->xmlDocument->strictErrorChecking = false;
82
  $this->xmlDocument->formatOutput = !$this->minifyXML;
@@ -85,7 +102,7 @@ class Sanitizer
85
  /**
86
  * Set XML options to use when saving XML
87
  * See: DOMDocument::saveXML
88
- *
89
  * @param int $xmlOptions
90
  */
91
  public function setXMLOptions($xmlOptions)
@@ -93,15 +110,15 @@ class Sanitizer
93
  $this->xmlOptions = $xmlOptions;
94
  }
95
 
96
- /**
97
  * Get XML options to use when saving XML
98
  * See: DOMDocument::saveXML
99
- *
100
  * @return int
101
  */
102
  public function getXMLOptions()
103
  {
104
- return $this->xmlOptions;
105
  }
106
 
107
  /**
@@ -154,6 +171,16 @@ class Sanitizer
154
  $this->removeRemoteReferences = $removeRemoteRefs;
155
  }
156
 
 
 
 
 
 
 
 
 
 
 
157
  /**
158
  * Sanitize the passed string
159
  *
@@ -183,6 +210,10 @@ class Sanitizer
183
 
184
  $this->removeDoctype();
185
 
 
 
 
 
186
  // Grab all the elements
187
  $allElements = $this->xmlDocument->getElementsByTagName("*");
188
 
@@ -217,6 +248,9 @@ class Sanitizer
217
 
218
  // Suppress the errors because we don't really have to worry about formation before cleansing
219
  libxml_use_internal_errors(true);
 
 
 
220
  }
221
 
222
  /**
@@ -252,11 +286,16 @@ class Sanitizer
252
  // we do this backwards so we don't skip anything if we delete a node
253
  // see comments at: http://php.net/manual/en/class.domnamednodemap.php
254
  for ($i = $elements->length - 1; $i >= 0; $i--) {
 
255
  $currentElement = $elements->item($i);
256
 
257
  // If the tag isn't in the whitelist, remove it and continue with next iteration
258
  if (!in_array(strtolower($currentElement->tagName), $this->allowedTags)) {
259
  $currentElement->parentNode->removeChild($currentElement);
 
 
 
 
260
  continue;
261
  }
262
 
@@ -266,9 +305,24 @@ class Sanitizer
266
 
267
  $this->cleanHrefs($currentElement);
268
 
 
 
 
 
 
 
 
 
 
269
  if (strtolower($currentElement->tagName) === 'use') {
270
- if ($this->isUseTagDirty($currentElement)) {
 
 
271
  $currentElement->parentNode->removeChild($currentElement);
 
 
 
 
272
  continue;
273
  }
274
  }
@@ -288,7 +342,12 @@ class Sanitizer
288
 
289
  // Remove attribute if not in whitelist
290
  if (!in_array(strtolower($attrName), $this->allowedAttrs) && !$this->isAriaAttribute(strtolower($attrName)) && !$this->isDataAttribute(strtolower($attrName))) {
 
291
  $element->removeAttribute($attrName);
 
 
 
 
292
  }
293
 
294
  // Do we want to strip remote references?
@@ -296,6 +355,10 @@ class Sanitizer
296
  // Remove attribute if it has a remote reference
297
  if (isset($element->attributes->item($x)->value) && $this->hasRemoteReference($element->attributes->item($x)->value)) {
298
  $element->removeAttribute($attrName);
 
 
 
 
299
  }
300
  }
301
  }
@@ -318,6 +381,12 @@ class Sanitizer
318
  'data:image/pjp', // PJPEG
319
  ))) {
320
  $element->removeAttributeNS( 'http://www.w3.org/1999/xlink', 'href' );
 
 
 
 
 
 
321
  }
322
  }
323
  }
@@ -332,6 +401,10 @@ class Sanitizer
332
  $href = $element->getAttribute('href');
333
  if (preg_match(self::SCRIPT_REGEX, $href) === 1) {
334
  $element->removeAttribute('href');
 
 
 
 
335
  }
336
  }
337
 
@@ -386,6 +459,17 @@ class Sanitizer
386
  $this->removeXMLTag = (bool) $removeXMLTag;
387
  }
388
 
 
 
 
 
 
 
 
 
 
 
 
389
  /**
390
  * Check to see if an attribute is an aria attribute or not
391
  *
@@ -410,6 +494,18 @@ class Sanitizer
410
  return strpos($attributeName, 'data-') === 0;
411
  }
412
 
 
 
 
 
 
 
 
 
 
 
 
 
413
  /**
414
  * Make sure our use tag is only referencing internal resources
415
  *
@@ -418,11 +514,34 @@ class Sanitizer
418
  */
419
  protected function isUseTagDirty(\DOMElement $element)
420
  {
421
- $xlinks = $element->getAttributeNS('http://www.w3.org/1999/xlink', 'href');
422
- if ($xlinks && substr($xlinks, 0, 1) !== '#') {
423
- return true;
424
- }
425
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
426
  return false;
427
  }
428
  }
2
 
3
  namespace enshrined\svgSanitize;
4
 
 
5
  use enshrined\svgSanitize\data\AllowedAttributes;
6
  use enshrined\svgSanitize\data\AllowedTags;
7
  use enshrined\svgSanitize\data\AttributeInterface;
8
  use enshrined\svgSanitize\data\TagInterface;
9
+ use enshrined\svgSanitize\data\XPath;
10
+ use enshrined\svgSanitize\ElementReference\Resolver;
11
+ use enshrined\svgSanitize\ElementReference\Subject;
12
 
13
  /**
14
  * Class Sanitizer
21
  /**
22
  * Regex to catch script and data values in attributes
23
  */
24
+ const SCRIPT_REGEX = '/(?:\w+script|data)(?:\s)?:/xi';
25
 
26
  /**
27
+ * @var \DOMDocument
28
  */
29
  protected $xmlDocument;
30
 
53
  */
54
  protected $removeRemoteReferences = false;
55
 
56
+ /**
57
+ * @var int
58
+ */
59
+ protected $useThreshold = 1000;
60
+
61
  /**
62
  * @var bool
63
  */
68
  */
69
  protected $xmlOptions = LIBXML_NOEMPTYTAG;
70
 
71
+ /**
72
+ * @var array
73
+ */
74
+ protected $xmlIssues = array();
75
+
76
+ /**
77
+ * @var Resolver
78
+ */
79
+ protected $elementReferenceResolver;
80
+
81
  /**
82
  *
83
  */
93
  */
94
  protected function resetInternal()
95
  {
96
+ $this->xmlDocument = new \DOMDocument();
97
  $this->xmlDocument->preserveWhiteSpace = false;
98
  $this->xmlDocument->strictErrorChecking = false;
99
  $this->xmlDocument->formatOutput = !$this->minifyXML;
102
  /**
103
  * Set XML options to use when saving XML
104
  * See: DOMDocument::saveXML
105
+ *
106
  * @param int $xmlOptions
107
  */
108
  public function setXMLOptions($xmlOptions)
110
  $this->xmlOptions = $xmlOptions;
111
  }
112
 
113
+ /**
114
  * Get XML options to use when saving XML
115
  * See: DOMDocument::saveXML
116
+ *
117
  * @return int
118
  */
119
  public function getXMLOptions()
120
  {
121
+ return $this->xmlOptions;
122
  }
123
 
124
  /**
171
  $this->removeRemoteReferences = $removeRemoteRefs;
172
  }
173
 
174
+ /**
175
+ * Get XML issues.
176
+ *
177
+ * @return array
178
+ */
179
+ public function getXmlIssues() {
180
+ return $this->xmlIssues;
181
+ }
182
+
183
+
184
  /**
185
  * Sanitize the passed string
186
  *
210
 
211
  $this->removeDoctype();
212
 
213
+ // Pre-process all identified elements
214
+ $xPath = new XPath($this->xmlDocument);
215
+ $this->elementReferenceResolver = new Resolver($xPath);
216
+ $this->elementReferenceResolver->collect();
217
  // Grab all the elements
218
  $allElements = $this->xmlDocument->getElementsByTagName("*");
219
 
248
 
249
  // Suppress the errors because we don't really have to worry about formation before cleansing
250
  libxml_use_internal_errors(true);
251
+
252
+ // Reset array of altered XML
253
+ $this->xmlIssues = array();
254
  }
255
 
256
  /**
286
  // we do this backwards so we don't skip anything if we delete a node
287
  // see comments at: http://php.net/manual/en/class.domnamednodemap.php
288
  for ($i = $elements->length - 1; $i >= 0; $i--) {
289
+ /** @var \DOMElement $currentElement */
290
  $currentElement = $elements->item($i);
291
 
292
  // If the tag isn't in the whitelist, remove it and continue with next iteration
293
  if (!in_array(strtolower($currentElement->tagName), $this->allowedTags)) {
294
  $currentElement->parentNode->removeChild($currentElement);
295
+ $this->xmlIssues[] = array(
296
+ 'message' => 'Suspicious tag \'' . $currentElement->tagName . '\'',
297
+ 'line' => $currentElement->getLineNo(),
298
+ );
299
  continue;
300
  }
301
 
305
 
306
  $this->cleanHrefs($currentElement);
307
 
308
+ if ($this->isTaggedInvalid($currentElement)) {
309
+ $currentElement->parentNode->removeChild($currentElement);
310
+ $this->xmlIssues[] = array(
311
+ 'message' => 'Invalid \'' . $currentElement->tagName . '\'',
312
+ 'line' => $currentElement->getLineNo(),
313
+ );
314
+ continue;
315
+ }
316
+
317
  if (strtolower($currentElement->tagName) === 'use') {
318
+ if ($this->isUseTagDirty($currentElement)
319
+ || $this->isUseTagExceedingThreshold($currentElement)
320
+ ) {
321
  $currentElement->parentNode->removeChild($currentElement);
322
+ $this->xmlIssues[] = array(
323
+ 'message' => 'Suspicious \'' . $currentElement->tagName . '\'',
324
+ 'line' => $currentElement->getLineNo(),
325
+ );
326
  continue;
327
  }
328
  }
342
 
343
  // Remove attribute if not in whitelist
344
  if (!in_array(strtolower($attrName), $this->allowedAttrs) && !$this->isAriaAttribute(strtolower($attrName)) && !$this->isDataAttribute(strtolower($attrName))) {
345
+
346
  $element->removeAttribute($attrName);
347
+ $this->xmlIssues[] = array(
348
+ 'message' => 'Suspicious attribute \'' . $attrName . '\'',
349
+ 'line' => $element->getLineNo(),
350
+ );
351
  }
352
 
353
  // Do we want to strip remote references?
355
  // Remove attribute if it has a remote reference
356
  if (isset($element->attributes->item($x)->value) && $this->hasRemoteReference($element->attributes->item($x)->value)) {
357
  $element->removeAttribute($attrName);
358
+ $this->xmlIssues[] = array(
359
+ 'message' => 'Suspicious attribute \'' . $attrName . '\'',
360
+ 'line' => $element->getLineNo(),
361
+ );
362
  }
363
  }
364
  }
381
  'data:image/pjp', // PJPEG
382
  ))) {
383
  $element->removeAttributeNS( 'http://www.w3.org/1999/xlink', 'href' );
384
+ $this->xmlIssues[] = array(
385
+ 'message' => 'Suspicious attribute \'href\'',
386
+ 'line' => $element->getLineNo(),
387
+ );
388
+
389
+
390
  }
391
  }
392
  }
401
  $href = $element->getAttribute('href');
402
  if (preg_match(self::SCRIPT_REGEX, $href) === 1) {
403
  $element->removeAttribute('href');
404
+ $this->xmlIssues[] = array(
405
+ 'message' => 'Suspicious attribute \'href\'',
406
+ 'line' => $element->getLineNo(),
407
+ );
408
  }
409
  }
410
 
459
  $this->removeXMLTag = (bool) $removeXMLTag;
460
  }
461
 
462
+ /**
463
+ * Whether `<use ... xlink:href="#identifier">` elements shall be
464
+ * removed in case expansion would exceed this threshold.
465
+ *
466
+ * @param int $useThreshold
467
+ */
468
+ public function useThreshold($useThreshold = 1000)
469
+ {
470
+ $this->useThreshold = (int)$useThreshold;
471
+ }
472
+
473
  /**
474
  * Check to see if an attribute is an aria attribute or not
475
  *
494
  return strpos($attributeName, 'data-') === 0;
495
  }
496
 
497
+ /**
498
+ * Determines whether element is used in a Subject that has the "invalid" tag.
499
+ *
500
+ * @param \DOMElement $element
501
+ * @return bool
502
+ */
503
+ protected function isTaggedInvalid(\DOMElement $element)
504
+ {
505
+ $subject = $this->elementReferenceResolver->findByElement($element, true);
506
+ return $subject !== null && $subject->matchesTags([Subject::TAG_INVALID]);
507
+ }
508
+
509
  /**
510
  * Make sure our use tag is only referencing internal resources
511
  *
514
  */
515
  protected function isUseTagDirty(\DOMElement $element)
516
  {
517
+ $href = Helper::getElementHref($element);
518
+ return $href && strpos($href, '#') !== 0;
519
+ }
 
520
 
521
+ /**
522
+ * Determines whether `<use ... xlink:href="#identifier">` is expanded
523
+ * recursively in order to create DoS scenarios. The amount of a actually
524
+ * used element needs to be below `$this->useThreshold`.
525
+ *
526
+ * @param \DOMElement $element
527
+ * @return bool
528
+ */
529
+ protected function isUseTagExceedingThreshold(\DOMElement $element)
530
+ {
531
+ if ($this->useThreshold <= 0) {
532
+ return false;
533
+ }
534
+ $useId = Helper::extractIdReferenceFromHref(
535
+ Helper::getElementHref($element)
536
+ );
537
+ if ($useId === null) {
538
+ return false;
539
+ }
540
+ foreach ($this->elementReferenceResolver->findByElementId($useId) as $subject) {
541
+ if ($subject->countUse() >= $this->useThreshold) {
542
+ return true;
543
+ }
544
+ }
545
  return false;
546
  }
547
  }
lib/vendor/enshrined/svg-sanitize/src/data/AttributeInterface.php CHANGED
@@ -1,6 +1,4 @@
1
  <?php
2
-
3
-
4
  namespace enshrined\svgSanitize\data;
5
 
6
 
1
  <?php
 
 
2
  namespace enshrined\svgSanitize\data;
3
 
4
 
lib/vendor/enshrined/svg-sanitize/src/data/TagInterface.php CHANGED
@@ -1,9 +1,6 @@
1
  <?php
2
-
3
-
4
  namespace enshrined\svgSanitize\data;
5
 
6
-
7
  /**
8
  * Interface TagInterface
9
  *
1
  <?php
 
 
2
  namespace enshrined\svgSanitize\data;
3
 
 
4
  /**
5
  * Interface TagInterface
6
  *
lib/vendor/enshrined/svg-sanitize/src/data/XPath.php ADDED
@@ -0,0 +1,64 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace enshrined\svgSanitize\data;
3
+
4
+ class XPath extends \DOMXPath
5
+ {
6
+ const DEFAULT_NAMESPACE_PREFIX = 'svg';
7
+
8
+ /**
9
+ * @var string
10
+ */
11
+ protected $defaultNamespaceURI;
12
+
13
+ public function __construct(\DOMDocument $doc)
14
+ {
15
+ parent::__construct($doc);
16
+ $this->handleDefaultNamespace();
17
+ }
18
+
19
+ /**
20
+ * @param string $nodeName
21
+ * @return string
22
+ */
23
+ public function createNodeName($nodeName)
24
+ {
25
+ if (empty($this->defaultNamespaceURI)) {
26
+ return $nodeName;
27
+ }
28
+ return self::DEFAULT_NAMESPACE_PREFIX . ':' . $nodeName;
29
+ }
30
+
31
+ protected function handleDefaultNamespace()
32
+ {
33
+ $rootElements = $this->getRootElements();
34
+
35
+ if (count($rootElements) !== 1) {
36
+ throw new \LogicException(
37
+ sprintf('Got %d svg elements, expected exactly one', count($rootElements)),
38
+ 1570870568
39
+ );
40
+ }
41
+ $this->defaultNamespaceURI = (string)$rootElements[0]->namespaceURI;
42
+
43
+ if ($this->defaultNamespaceURI !== '') {
44
+ $this->registerNamespace(self::DEFAULT_NAMESPACE_PREFIX, $this->defaultNamespaceURI);
45
+ }
46
+ }
47
+
48
+ /**
49
+ * @return \DOMElement[]
50
+ */
51
+ protected function getRootElements()
52
+ {
53
+ $rootElements = [];
54
+ $elements = $this->document->getElementsByTagName('svg');
55
+ /** @var \DOMElement $element */
56
+ foreach ($elements as $element) {
57
+ if ($element->parentNode !== $this->document) {
58
+ continue;
59
+ }
60
+ $rootElements[] = $element;
61
+ }
62
+ return $rootElements;
63
+ }
64
+ }
lib/vendor/enshrined/svg-sanitize/src/svg-scanner.php ADDED
@@ -0,0 +1,187 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env php
2
+ <?php
3
+
4
+ /*
5
+ * Simple program that uses svg-sanitizer
6
+ * to find issues in files specified on the
7
+ * command line, and prints a JSON output with
8
+ * the issues found on exit.
9
+ */
10
+
11
+ require_once( __DIR__ . '/data/AttributeInterface.php' );
12
+ require_once( __DIR__ . '/data/TagInterface.php' );
13
+ require_once( __DIR__ . '/data/AllowedAttributes.php' );
14
+ require_once( __DIR__ . '/data/AllowedTags.php' );
15
+ require_once( __DIR__ . '/Sanitizer.php' );
16
+
17
+
18
+ /*
19
+ * Print array as JSON and then
20
+ * exit program with a particular
21
+ * exit-code.
22
+ */
23
+
24
+ function sysexit(
25
+ $results,
26
+ $status
27
+ ) {
28
+ echo json_encode(
29
+ $results,
30
+ JSON_PRETTY_PRINT
31
+ );
32
+
33
+ exit( $status );
34
+ }
35
+
36
+
37
+ /*
38
+ * Main part begins
39
+ */
40
+
41
+ global $argv;
42
+
43
+ /*
44
+ * Set up results array, to
45
+ * be printed on exit.
46
+ */
47
+ $results = array(
48
+ 'totals' => array(
49
+ 'errors' => 0,
50
+ ),
51
+
52
+ 'files' => array(
53
+ ),
54
+ );
55
+
56
+
57
+ /*
58
+ * Catch files to scan from $argv.
59
+ */
60
+
61
+ $files_to_scan = $argv;
62
+ unset( $files_to_scan[0] );
63
+
64
+ $files_to_scan = array_values(
65
+ $files_to_scan
66
+ );
67
+
68
+ /*
69
+ * Catch no file specified.
70
+ */
71
+
72
+ if ( empty( $files_to_scan ) ) {
73
+ $results['totals']['errors']++;
74
+ $results['messages'] = array(
75
+ array( 'No files to scan specified' ),
76
+ );
77
+
78
+ sysexit(
79
+ $results,
80
+ 1
81
+ );
82
+ }
83
+
84
+ /*
85
+ * Initialize the SVG scanner.
86
+ *
87
+ * Make sure to allow custom attributes,
88
+ * and to remove remote references.
89
+ */
90
+ $sanitizer = new enshrined\svgSanitize\Sanitizer();
91
+
92
+ $sanitizer->removeRemoteReferences( true );
93
+
94
+ /*
95
+ * Scan each file specified to be scanned.
96
+ */
97
+
98
+ foreach( $files_to_scan as $file_name ) {
99
+ /*
100
+ * Read SVG file.
101
+ */
102
+ $svg_file = @file_get_contents( $file_name );
103
+
104
+ /*
105
+ * If not found, report that and continue.
106
+ */
107
+ if ( false === $svg_file ) {
108
+ $results['totals']['errors']++;
109
+
110
+ $results['files'][ $file_name ][] = array(
111
+ 'errors' => 1,
112
+ 'messages' => array(
113
+ array(
114
+ 'message' => 'File specified could not be read (' . $file_name . ')',
115
+ 'line' => null,
116
+ ),
117
+ ),
118
+ );
119
+
120
+ continue;
121
+ }
122
+
123
+ /*
124
+ * Sanitize file and get issues found.
125
+ */
126
+ $sanitize_status = $sanitizer->sanitize( $svg_file );
127
+
128
+ $xml_issues = $sanitizer->getXmlIssues();
129
+
130
+ /*
131
+ * If we find no issues, simply note that.
132
+ */
133
+ if ( empty( $xml_issues ) && ( false !== $sanitize_status ) ) {
134
+ $results['files'][ $file_name ] = array(
135
+ 'errors' => 0,
136
+ 'messages' => array()
137
+ );
138
+ }
139
+
140
+ /*
141
+ * Could not sanitize the file.
142
+ */
143
+ else if (
144
+ ( '' === $sanitize_status ) ||
145
+ ( false === $sanitize_status )
146
+ ) {
147
+ $results['totals']['errors']++;
148
+
149
+ $results['files'][ $file_name ] = array(
150
+ 'errors' => 1,
151
+ 'messages' => array(
152
+ array(
153
+ 'message' => 'Unable to sanitize file \'' . $file_name . '\'' ,
154
+ 'line' => null,
155
+ )
156
+ ),
157
+ );
158
+ }
159
+
160
+ /*
161
+ * If we find issues, note it and update statistics.
162
+ */
163
+
164
+ else {
165
+ $results['totals']['errors'] += count( $xml_issues );
166
+
167
+ $results['files'][ $file_name ] = array(
168
+ 'errors' => count( $xml_issues ),
169
+ 'messages' => $xml_issues,
170
+ );
171
+ }
172
+
173
+ unset( $svg_file );
174
+ unset( $xml_issues );
175
+ unset( $sanitize_status );
176
+ }
177
+
178
+
179
+ /*
180
+ * Exit with a status
181
+ * that reflects what issues
182
+ * we found.
183
+ */
184
+ sysexit(
185
+ $results,
186
+ ( $results['totals']['errors'] === 0 ? 0 : 1 )
187
+ );
lib/vendor/enshrined/svg-sanitize/tests/AllowedAttributesTest.php CHANGED
@@ -1,6 +1,7 @@
1
  <?php
 
2
 
3
- use \enshrined\svgSanitize\data\AllowedAttributes;
4
  use PHPUnit\Framework\TestCase;
5
 
6
  /**
1
  <?php
2
+ namespace enshrined\svgSanitize\Tests;
3
 
4
+ use enshrined\svgSanitize\data\AllowedAttributes;
5
  use PHPUnit\Framework\TestCase;
6
 
7
  /**
lib/vendor/enshrined/svg-sanitize/tests/AllowedTagsTest.php CHANGED
@@ -1,6 +1,7 @@
1
  <?php
 
2
 
3
- use \enshrined\svgSanitize\data\AllowedTags;
4
  use PHPUnit\Framework\TestCase;
5
 
6
  /**
1
  <?php
2
+ namespace enshrined\svgSanitize\Tests;
3
 
4
+ use enshrined\svgSanitize\data\AllowedTags;
5
  use PHPUnit\Framework\TestCase;
6
 
7
  /**
lib/vendor/enshrined/svg-sanitize/tests/{data → Fixtures}/TestAllowedAttributes.php RENAMED
@@ -1,9 +1,10 @@
1
  <?php
 
2
 
 
3
 
4
- class TestAllowedAttributes implements \enshrined\svgSanitize\data\AttributeInterface
5
  {
6
-
7
  /**
8
  * Returns an array of attributes
9
  *
@@ -15,4 +16,4 @@ class TestAllowedAttributes implements \enshrined\svgSanitize\data\AttributeInte
15
  'testAttribute',
16
  );
17
  }
18
- }
1
  <?php
2
+ namespace enshrined\svgSanitize\Tests\Fixtures;
3
 
4
+ use enshrined\svgSanitize\data\AttributeInterface;
5
 
6
+ class TestAllowedAttributes implements AttributeInterface
7
  {
 
8
  /**
9
  * Returns an array of attributes
10
  *
16
  'testAttribute',
17
  );
18
  }
19
+ }
lib/vendor/enshrined/svg-sanitize/tests/{data → Fixtures}/TestAllowedTags.php RENAMED
@@ -1,9 +1,10 @@
1
  <?php
 
2
 
 
3
 
4
- class TestAllowedTags implements enshrined\svgSanitize\data\TagInterface
5
  {
6
-
7
  /**
8
  * Returns an array of tags
9
  *
@@ -15,4 +16,4 @@ class TestAllowedTags implements enshrined\svgSanitize\data\TagInterface
15
  'testTag',
16
  );
17
  }
18
- }
1
  <?php
2
+ namespace enshrined\svgSanitize\Tests\Fixtures;
3
 
4
+ use enshrined\svgSanitize\data\TagInterface;
5
 
6
+ class TestAllowedTags implements TagInterface
7
  {
 
8
  /**
9
  * Returns an array of tags
10
  *
16
  'testTag',
17
  );
18
  }
19
+ }
lib/vendor/enshrined/svg-sanitize/tests/SanitizerTest.php CHANGED
@@ -1,8 +1,9 @@
1
  <?php
2
- require 'data/TestAllowedTags.php';
3
- require 'data/TestAllowedAttributes.php';
4
 
5
- use \enshrined\svgSanitize\Sanitizer;
 
 
6
  use PHPUnit\Framework\TestCase;
7
 
8
  /**
@@ -18,11 +19,16 @@ class SanitizerTest extends TestCase
18
  /**
19
  * Set up the test class
20
  */
21
- public function setUp()
22
  {
23
  $this->class = new Sanitizer();
24
  }
25
 
 
 
 
 
 
26
  /**
27
  * Make sure the initial tags are loaded
28
  */
@@ -53,7 +59,8 @@ class SanitizerTest extends TestCase
53
  $tags = $this->class->getAllowedTags();
54
 
55
  $this->assertInternalType('array', $tags);
56
- $this->assertEquals(TestAllowedTags::getTags(), $tags);
 
57
  }
58
 
59
  /**
@@ -66,7 +73,8 @@ class SanitizerTest extends TestCase
66
  $attributes = $this->class->getAllowedAttrs();
67
 
68
  $this->assertInternalType('array', $attributes);
69
- $this->assertEquals(TestAllowedAttributes::getAttributes(), $attributes);
 
70
  }
71
 
72
  /**
@@ -74,8 +82,9 @@ class SanitizerTest extends TestCase
74
  */
75
  public function testSanitizeXMLDoc()
76
  {
77
- $initialData = file_get_contents('tests/data/xmlTestOne.xml');
78
- $expected = file_get_contents('tests/data/xmlCleanOne.xml');
 
79
 
80
  $cleanData = $this->class->sanitize($initialData);
81
 
@@ -87,8 +96,9 @@ class SanitizerTest extends TestCase
87
  */
88
  public function testSanitizeSVGDoc()
89
  {
90
- $initialData = file_get_contents('tests/data/svgTestOne.svg');
91
- $expected = file_get_contents('tests/data/svgCleanOne.svg');
 
92
 
93
  $cleanData = $this->class->sanitize($initialData);
94
 
@@ -100,7 +110,8 @@ class SanitizerTest extends TestCase
100
  */
101
  public function testBadXMLReturnsFalse()
102
  {
103
- $initialData = file_get_contents('tests/data/badXmlTestOne.svg');
 
104
 
105
  $cleanData = $this->class->sanitize($initialData);
106
 
@@ -112,8 +123,9 @@ class SanitizerTest extends TestCase
112
  */
113
  public function testSanitizeHrefs()
114
  {
115
- $initialData = file_get_contents('tests/data/hrefTestOne.svg');
116
- $expected = file_get_contents('tests/data/hrefCleanOne.svg');
 
117
 
118
  $cleanData = $this->class->sanitize($initialData);
119
 
@@ -125,8 +137,9 @@ class SanitizerTest extends TestCase
125
  */
126
  public function testSanitizeExternal()
127
  {
128
- $initialData = file_get_contents('tests/data/externalTest.svg');
129
- $expected = file_get_contents('tests/data/externalClean.svg');
 
130
 
131
  $this->class->removeRemoteReferences(true);
132
  $cleanData = $this->class->sanitize($initialData);
@@ -140,8 +153,9 @@ class SanitizerTest extends TestCase
140
  */
141
  public function testSanitizeAndMinifiySVGDoc()
142
  {
143
- $initialData = file_get_contents('tests/data/svgTestOne.svg');
144
- $expected = file_get_contents('tests/data/svgCleanOneMinified.svg');
 
145
 
146
  $this->class->minify(true);
147
  $cleanData = $this->class->sanitize($initialData);
@@ -155,8 +169,9 @@ class SanitizerTest extends TestCase
155
  */
156
  public function testThatAriaAndDataAttributesAreAllowed()
157
  {
158
- $initialData = file_get_contents('tests/data/ariaDataTest.svg');
159
- $expected = file_get_contents('tests/data/ariaDataClean.svg');
 
160
 
161
  $this->class->minify(false);
162
  $cleanData = $this->class->sanitize($initialData);
@@ -170,8 +185,9 @@ class SanitizerTest extends TestCase
170
  */
171
  public function testThatExternalUseElementsAreStripped()
172
  {
173
- $initialData = file_get_contents('tests/data/useTest.svg');
174
- $expected = file_get_contents('tests/data/useClean.svg');
 
175
 
176
  $this->class->minify(false);
177
  $cleanData = $this->class->sanitize($initialData);
@@ -193,4 +209,34 @@ class SanitizerTest extends TestCase
193
  $output = $this->class->sanitize($input);
194
  $this->assertEquals($input, $output);
195
  }
196
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  <?php
2
+ namespace enshrined\svgSanitize\Tests;
 
3
 
4
+ use enshrined\svgSanitize\Sanitizer;
5
+ use enshrined\svgSanitize\Tests\Fixtures\TestAllowedAttributes;
6
+ use enshrined\svgSanitize\Tests\Fixtures\TestAllowedTags;
7
  use PHPUnit\Framework\TestCase;
8
 
9
  /**
19
  /**
20
  * Set up the test class
21
  */
22
+ protected function setUp()
23
  {
24
  $this->class = new Sanitizer();
25
  }
26
 
27
+ protected function tearDown()
28
+ {
29
+ unset($this->class);
30
+ }
31
+
32
  /**
33
  * Make sure the initial tags are loaded
34
  */
59
  $tags = $this->class->getAllowedTags();
60
 
61
  $this->assertInternalType('array', $tags);
62
+
63
+ $this->assertEquals(array_map('strtolower', TestAllowedTags::getTags()), $tags);
64
  }
65
 
66
  /**
73
  $attributes = $this->class->getAllowedAttrs();
74
 
75
  $this->assertInternalType('array', $attributes);
76
+
77
+ $this->assertEquals( array_map('strtolower', TestAllowedAttributes::getAttributes()), $attributes);
78
  }
79
 
80
  /**
82
  */
83
  public function testSanitizeXMLDoc()
84
  {
85
+ $dataDirectory = __DIR__ . '/data';
86
+ $initialData = file_get_contents($dataDirectory . '/xmlTestOne.xml');
87
+ $expected = file_get_contents($dataDirectory . '/xmlCleanOne.xml');
88
 
89
  $cleanData = $this->class->sanitize($initialData);
90
 
96
  */
97
  public function testSanitizeSVGDoc()
98
  {
99
+ $dataDirectory = __DIR__ . '/data';
100
+ $initialData = file_get_contents($dataDirectory . '/svgTestOne.svg');
101
+ $expected = file_get_contents($dataDirectory . '/svgCleanOne.svg');
102
 
103
  $cleanData = $this->class->sanitize($initialData);
104
 
110
  */
111
  public function testBadXMLReturnsFalse()
112
  {
113
+ $dataDirectory = __DIR__ . '/data';
114
+ $initialData = file_get_contents($dataDirectory . '/badXmlTestOne.svg');
115
 
116
  $cleanData = $this->class->sanitize($initialData);
117
 
123
  */
124
  public function testSanitizeHrefs()
125
  {
126
+ $dataDirectory = __DIR__ . '/data';
127
+ $initialData = file_get_contents($dataDirectory . '/hrefTestOne.svg');
128
+ $expected = file_get_contents($dataDirectory . '/hrefCleanOne.svg');
129
 
130
  $cleanData = $this->class->sanitize($initialData);
131
 
137
  */
138
  public function testSanitizeExternal()
139
  {
140
+ $dataDirectory = __DIR__ . '/data';
141
+ $initialData = file_get_contents($dataDirectory . '/externalTest.svg');
142
+ $expected = file_get_contents($dataDirectory . '/externalClean.svg');
143
 
144
  $this->class->removeRemoteReferences(true);
145
  $cleanData = $this->class->sanitize($initialData);
153
  */
154
  public function testSanitizeAndMinifiySVGDoc()
155
  {
156
+ $dataDirectory = __DIR__ . '/data';
157
+ $initialData = file_get_contents($dataDirectory . '/svgTestOne.svg');
158
+ $expected = file_get_contents($dataDirectory . '/svgCleanOneMinified.svg');
159
 
160
  $this->class->minify(true);
161
  $cleanData = $this->class->sanitize($initialData);
169
  */
170
  public function testThatAriaAndDataAttributesAreAllowed()
171
  {
172
+ $dataDirectory = __DIR__ . '/data';
173
+ $initialData = file_get_contents($dataDirectory . '/ariaDataTest.svg');
174
+ $expected = file_get_contents($dataDirectory . '/ariaDataClean.svg');
175
 
176
  $this->class->minify(false);
177
  $cleanData = $this->class->sanitize($initialData);
185
  */
186
  public function testThatExternalUseElementsAreStripped()
187
  {
188
+ $dataDirectory = __DIR__ . '/data';
189
+ $initialData = file_get_contents($dataDirectory . '/useTest.svg');
190
+ $expected = file_get_contents($dataDirectory . '/useClean.svg');
191
 
192
  $this->class->minify(false);
193
  $cleanData = $this->class->sanitize($initialData);
209
  $output = $this->class->sanitize($input);
210
  $this->assertEquals($input, $output);
211
  }
212
+
213
+ /**
214
+ * @test
215
+ */
216
+ public function useRecursionsAreDetected()
217
+ {
218
+ $dataDirectory = __DIR__ . '/data';
219
+ $initialData = file_get_contents($dataDirectory . '/xlinkLaughsTest.svg');
220
+ $expected = file_get_contents($dataDirectory . '/xlinkLaughsClean.svg');
221
+
222
+ $this->class->minify(false);
223
+ $cleanData = $this->class->sanitize($initialData);
224
+
225
+ $this->assertXmlStringEqualsXmlString($expected, $cleanData);
226
+ }
227
+
228
+ /**
229
+ * @test
230
+ */
231
+ public function infiniteUseLoopsAreDetected()
232
+ {
233
+ $dataDirectory = __DIR__ . '/data';
234
+ $initialData = file_get_contents($dataDirectory . '/xlinkLoopTest.svg');
235
+ $expected = file_get_contents($dataDirectory . '/xlinkLoopClean.svg');
236
+
237
+ $this->class->minify(false);
238
+ $cleanData = $this->class->sanitize($initialData);
239
+
240
+ $this->assertXmlStringEqualsXmlString($expected, $cleanData);
241
+ }
242
+ }
lib/vendor/enshrined/svg-sanitize/tests/SubjectTest.php ADDED
@@ -0,0 +1,143 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace enshrined\svgSanitize\Tests;
3
+
4
+ use enshrined\svgSanitize\ElementReference\Subject;
5
+ use PHPUnit\Framework\TestCase;
6
+
7
+ /**
8
+ * Class SubjectTest
9
+ */
10
+ class SubjectTest extends TestCase
11
+ {
12
+ /**
13
+ * <first>
14
+ * <!-- 0 -->
15
+ * </first>
16
+ *
17
+ * @test
18
+ */
19
+ public function oneLevelCountsUseIsCorrect()
20
+ {
21
+ $first = new \DOMElement('first');
22
+ $firstSubject = new Subject($first);
23
+ self::assertSame(0, $firstSubject->countUse(false));
24
+ self::assertSame(0, $firstSubject->countUse(true));
25
+ }
26
+
27
+ /**
28
+ * <first>
29
+ * <second /> <!-- 1 -->
30
+ * <second /> <!-- 2 -->
31
+ * </first>
32
+ *
33
+ * @test
34
+ */
35
+ public function twoLevelsCountUseIsCorrect()
36
+ {
37
+ $first = new \DOMElement('first');
38
+ $second = new \DOMElement('second');
39
+ $firstSubject = new Subject($first);
40
+ $secondSubject = new Subject($second);
41
+ $firstSubject->addUse($secondSubject);
42
+ $firstSubject->addUse($secondSubject);
43
+ self::assertSame(2, $firstSubject->countUse(false));
44
+ self::assertSame(2, $firstSubject->countUse(true));
45
+ }
46
+
47
+ /**
48
+ * <first>
49
+ * <second> <!-- accumulated=false: 0; accumulated=true: 1 -->
50
+ * <third /> <!-- accumulated=false: 1; accumulated=true: 2 -->
51
+ * <third /> <!-- accumulated=false: 2; accumulated=true: 3 -->
52
+ * <third /> <!-- accumulated=false: 3; accumulated=true: 4 -->
53
+ * </second>
54
+ * <second> <!-- accumulated=false: 3; accumulated=true: 5 -->
55
+ * <third /> <!-- accumulated=false: 4; accumulated=true: 6 -->
56
+ * <third /> <!-- accumulated=false: 5; accumulated=true: 7 -->
57
+ * <third /> <!-- accumulated=false: 6; accumulated=true: 8 -->
58
+ * </second>
59
+ * </first>
60
+ *
61
+ * @test
62
+ */
63
+ public function threeLevelsCountUseIsCorrect()
64
+ {
65
+ $first = new \DOMElement('first');
66
+ $second = new \DOMElement('second');
67
+ $third = new \DOMElement('third');
68
+ $firstSubject = new Subject($first);
69
+ $secondSubject = new Subject($second);
70
+ $thirdSubject = new Subject($third);
71
+ $firstSubject->addUse($secondSubject);
72
+ $firstSubject->addUse($secondSubject);
73
+ $secondSubject->addUse($thirdSubject);
74
+ $secondSubject->addUse($thirdSubject);
75
+ $secondSubject->addUse($thirdSubject);
76
+ self::assertSame(6, $firstSubject->countUse(false));
77
+ self::assertSame(8, $firstSubject->countUse(true));
78
+ }
79
+
80
+ /**
81
+ * <first>
82
+ * </first>
83
+ *
84
+ * @test
85
+ */
86
+ public function oneLevelCountsUsedInIsCorrect()
87
+ {
88
+ $first = new \DOMElement('first');
89
+ $firstSubject = new Subject($first);
90
+ self::assertSame(0, $firstSubject->countUsedIn());
91
+ }
92
+
93
+ /**
94
+ * <first>
95
+ * <second /> <!-- 1 -->
96
+ * <second /> <!-- 2 -->
97
+ * </first>
98
+ *
99
+ * @test
100
+ */
101
+ public function twoLevelsCountUsedInIsCorrect()
102
+ {
103
+ $first = new \DOMElement('first');
104
+ $second = new \DOMElement('second');
105
+ $firstSubject = new Subject($first);
106
+ $secondSubject = new Subject($second);
107
+ $secondSubject->addUsedIn($firstSubject);
108
+ $secondSubject->addUsedIn($firstSubject);
109
+ self::assertSame(2, $secondSubject->countUsedIn());
110
+ }
111
+
112
+ /**
113
+ * <first>
114
+ * <second>
115
+ * <third /> <!-- 1 -->
116
+ * <third /> <!-- 2 -->
117
+ * <third /> <!-- 3 -->
118
+ * </second>
119
+ * <second>
120
+ * <third /> <!-- 4 -->
121
+ * <third /> <!-- 5 -->
122
+ * <third /> <!-- 6 -->
123
+ * </second>
124
+ * </first>
125
+ *
126
+ * @test
127
+ */
128
+ public function threeLevelsCountUsedInIsCorrect()
129
+ {
130
+ $first = new \DOMElement('first');
131
+ $second = new \DOMElement('second');
132
+ $third = new \DOMElement('third');
133
+ $firstSubject = new Subject($first);
134
+ $secondSubject = new Subject($second);
135
+ $thirdSubject = new Subject($third);
136
+ $thirdSubject->addUsedIn($secondSubject);
137
+ $thirdSubject->addUsedIn($secondSubject);
138
+ $thirdSubject->addUsedIn($secondSubject);
139
+ $secondSubject->addUsedIn($firstSubject);
140
+ $secondSubject->addUsedIn($firstSubject);
141
+ self::assertSame(6, $thirdSubject->countUsedIn());
142
+ }
143
+ }
lib/vendor/enshrined/svg-sanitize/tests/data/hrefCleanOne.svg CHANGED
@@ -6,4 +6,6 @@
6
 
7
  <a>test 5</a>
8
  <a>test 6</a>
 
 
9
  </svg>
6
 
7
  <a>test 5</a>
8
  <a>test 6</a>
9
+
10
+ <a>test 7</a>
11
  </svg>
lib/vendor/enshrined/svg-sanitize/tests/data/hrefTestOne.svg CHANGED
@@ -6,4 +6,6 @@
6
 
7
  <a href="data:data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' onload='alert(88)'%3E%3C/svg%3E">test 5</a>
8
  <a xlink:href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' onload='alert(88)'%3E%3C/svg%3E">test 6</a>
 
 
9
  </svg>
6
 
7
  <a href="data:data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' onload='alert(88)'%3E%3C/svg%3E">test 5</a>
8
  <a xlink:href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' onload='alert(88)'%3E%3C/svg%3E">test 6</a>
9
+
10
+ <a href="javascript&#9;:alert(document.domain)">test 7</a>
11
  </svg>
lib/vendor/enshrined/svg-sanitize/tests/data/xlinkLaughsClean.svg ADDED
@@ -0,0 +1,69 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" standalone="no"?>
2
+ <svg viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="512" height="512">
3
+ <defs>
4
+ <g id="a0">
5
+ <circle stroke="#000000" fill="#ffffff" fill-opacity="0.1" r="10"/>
6
+ </g>
7
+ </defs><defs>
8
+ <g id="a1">
9
+ <use x="0" y="10" xlink:href="#a0" />
10
+ <use x="10" y="10" xlink:href="#a0" />
11
+ <use x="20" y="10" xlink:href="#a0" />
12
+ <use x="30" y="10" xlink:href="#a0" />
13
+ <use x="40" y="10" xlink:href="#a0" />
14
+ <use x="50" y="10" xlink:href="#a0" />
15
+ <use x="60" y="10" xlink:href="#a0" />
16
+ <use x="70" y="10" xlink:href="#a0" />
17
+ <use x="80" y="10" xlink:href="#a0" />
18
+ <use x="90" y="10" xlink:href="#a0" />
19
+ </g>
20
+ </defs>
21
+ <defs>
22
+ <g id="a2">
23
+ <use x="0" y="10" xlink:href="#a1" />
24
+ <use x="10" y="10" xlink:href="#a1" />
25
+ <use x="20" y="10" xlink:href="#a1" />
26
+ <use x="30" y="10" xlink:href="#a1" />
27
+ <use x="40" y="10" xlink:href="#a1" />
28
+ <use x="50" y="10" xlink:href="#a1" />
29
+ <use x="60" y="10" xlink:href="#a1" />
30
+ <use x="70" y="10" xlink:href="#a1" />
31
+ <use x="80" y="10" xlink:href="#a1" />
32
+ <use x="90" y="10" xlink:href="#a1" />
33
+ </g>
34
+ </defs>
35
+ <defs>
36
+ <g id="a3">
37
+ <use x="0" y="10" xlink:href="#a2" />
38
+ <use x="10" y="10" xlink:href="#a2" />
39
+ <use x="20" y="10" xlink:href="#a2" />
40
+ <use x="30" y="10" xlink:href="#a2" />
41
+ <use x="40" y="10" xlink:href="#a2" />
42
+ <use x="50" y="10" xlink:href="#a2" />
43
+ <use x="60" y="10" xlink:href="#a2" />
44
+ <use x="70" y="10" xlink:href="#a2" />
45
+ <use x="80" y="10" xlink:href="#a2" />
46
+ <use x="90" y="10" xlink:href="#a2" />
47
+ </g>
48
+ </defs>
49
+ <defs>
50
+ <g id="a4" />
51
+ </defs>
52
+ <defs>
53
+ <g id="a5" />
54
+ </defs>
55
+ <defs>
56
+ <g id="a6" />
57
+ </defs>
58
+ <defs>
59
+ <g id="a7" />
60
+ </defs>
61
+ <defs>
62
+ <g id="a8" />
63
+ </defs>
64
+ <defs>
65
+ <g id="a9" />
66
+ </defs>
67
+ <defs>
68
+ <g id="a10" />
69
+ </defs></svg>
lib/vendor/enshrined/svg-sanitize/tests/data/xlinkLaughsTest.svg ADDED
@@ -0,0 +1,146 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" standalone="no"?>
2
+ <svg viewBox="0 0 512 512" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="512" height="512">
3
+ <defs>
4
+ <g id="a0">
5
+ <circle stroke="#000000" fill="#ffffff" fill-opacity="0.1" r="10"/>
6
+ </g>
7
+ </defs><defs>
8
+ <g id="a1">
9
+ <use x="0" y="10" xlink:href="#a0" />
10
+ <use x="10" y="10" xlink:href="#a0" />
11
+ <use x="20" y="10" xlink:href="#a0" />
12
+ <use x="30" y="10" xlink:href="#a0" />
13
+ <use x="40" y="10" xlink:href="#a0" />
14
+ <use x="50" y="10" xlink:href="#a0" />
15
+ <use x="60" y="10" xlink:href="#a0" />
16
+ <use x="70" y="10" xlink:href="#a0" />
17
+ <use x="80" y="10" xlink:href="#a0" />
18
+ <use x="90" y="10" xlink:href="#a0" />
19
+ </g>
20
+ </defs>
21
+ <defs>
22
+ <g id="a2">
23
+ <use x="0" y="10" xlink:href="#a1" />
24
+ <use x="10" y="10" xlink:href="#a1" />
25
+ <use x="20" y="10" xlink:href="#a1" />
26
+ <use x="30" y="10" xlink:href="#a1" />
27
+ <use x="40" y="10" xlink:href="#a1" />
28
+ <use x="50" y="10" xlink:href="#a1" />
29
+ <use x="60" y="10" xlink:href="#a1" />
30
+ <use x="70" y="10" xlink:href="#a1" />
31
+ <use x="80" y="10" xlink:href="#a1" />
32
+ <use x="90" y="10" xlink:href="#a1" />
33
+ </g>
34
+ </defs>
35
+ <defs>
36
+ <g id="a3">
37
+ <use x="0" y="10" xlink:href="#a2" />
38
+ <use x="10" y="10" xlink:href="#a2" />
39
+ <use x="20" y="10" xlink:href="#a2" />
40
+ <use x="30" y="10" xlink:href="#a2" />
41
+ <use x="40" y="10" xlink:href="#a2" />
42
+ <use x="50" y="10" xlink:href="#a2" />
43
+ <use x="60" y="10" xlink:href="#a2" />
44
+ <use x="70" y="10" xlink:href="#a2" />
45
+ <use x="80" y="10" xlink:href="#a2" />
46
+ <use x="90" y="10" xlink:href="#a2" />
47
+ </g>
48
+ </defs>
49
+ <defs>
50
+ <g id="a4">
51
+ <use x="0" y="10" xlink:href="#a3" />
52
+ <use x="10" y="10" xlink:href="#a3" />
53
+ <use x="20" y="10" xlink:href="#a3" />
54
+ <use x="30" y="10" xlink:href="#a3" />
55
+ <use x="40" y="10" xlink:href="#a3" />
56
+ <use x="50" y="10" xlink:href="#a3" />
57
+ <use x="60" y="10" xlink:href="#a3" />
58
+ <use x="70" y="10" xlink:href="#a3" />
59
+ <use x="80" y="10" xlink:href="#a3" />
60
+ <use x="90" y="10" xlink:href="#a3" />
61
+ </g>
62
+ </defs>
63
+ <defs>
64
+ <g id="a5">
65
+ <use x="0" y="10" xlink:href="#a4" />
66
+ <use x="10" y="10" xlink:href="#a4" />
67
+ <use x="20" y="10" xlink:href="#a4" />
68
+ <use x="30" y="10" xlink:href="#a4" />
69
+ <use x="40" y="10" xlink:href="#a4" />
70
+ <use x="50" y="10" xlink:href="#a4" />
71
+ <use x="60" y="10" xlink:href="#a4" />
72
+ <use x="70" y="10" xlink:href="#a4" />
73
+ <use x="80" y="10" xlink:href="#a4" />
74
+ <use x="90" y="10" xlink:href="#a4" />
75
+ </g>
76
+ </defs>
77
+ <defs>
78
+ <g id="a6">
79
+ <use x="0" y="10" xlink:href="#a5" />
80
+ <use x="10" y="10" xlink:href="#a5" />
81
+ <use x="20" y="10" xlink:href="#a5" />
82
+ <use x="30" y="10" xlink:href="#a5" />
83
+ <use x="40" y="10" xlink:href="#a5" />
84
+ <use x="50" y="10" xlink:href="#a5" />
85
+ <use x="60" y="10" xlink:href="#a5" />
86
+ <use x="70" y="10" xlink:href="#a5" />
87
+ <use x="80" y="10" xlink:href="#a5" />
88
+ <use x="90" y="10" xlink:href="#a5" />
89
+ </g>
90
+ </defs>
91
+ <defs>
92
+ <g id="a7">
93
+ <use x="0" y="10" xlink:href="#a6" />
94
+ <use x="10" y="10" xlink:href="#a6" />
95
+ <use x="20" y="10" xlink:href="#a6" />
96
+ <use x="30" y="10" xlink:href="#a6" />
97
+ <use x="40" y="10" xlink:href="#a6" />
98
+ <use x="50" y="10" xlink:href="#a6" />
99
+ <use x="60" y="10" xlink:href="#a6" />
100
+ <use x="70" y="10" xlink:href="#a6" />
101
+ <use x="80" y="10" xlink:href="#a6" />
102
+ <use x="90" y="10" xlink:href="#a6" />
103
+ </g>
104
+ </defs>
105
+ <defs>
106
+ <g id="a8">
107
+ <use x="0" y="10" xlink:href="#a7" />
108
+ <use x="10" y="10" xlink:href="#a7" />
109
+ <use x="20" y="10" xlink:href="#a7" />
110
+ <use x="30" y="10" xlink:href="#a7" />
111
+ <use x="40" y="10" xlink:href="#a7" />
112
+ <use x="50" y="10" xlink:href="#a7" />
113
+ <use x="60" y="10" xlink:href="#a7" />
114
+ <use x="70" y="10" xlink:href="#a7" />
115
+ <use x="80" y="10" xlink:href="#a7" />
116
+ <use x="90" y="10" xlink:href="#a7" />
117
+ </g>
118
+ </defs>
119
+ <defs>
120
+ <g id="a9">
121
+ <use x="0" y="10" xlink:href="#a8" />
122
+ <use x="10" y="10" xlink:href="#a8" />
123
+ <use x="20" y="10" xlink:href="#a8" />
124
+ <use x="30" y="10" xlink:href="#a8" />
125
+ <use x="40" y="10" xlink:href="#a8" />
126
+ <use x="50" y="10" xlink:href="#a8" />
127
+ <use x="60" y="10" xlink:href="#a8" />
128
+ <use x="70" y="10" xlink:href="#a8" />
129
+ <use x="80" y="10" xlink:href="#a8" />
130
+ <use x="90" y="10" xlink:href="#a8" />
131
+ </g>
132
+ </defs>
133
+ <defs>
134
+ <g id="a10">
135
+ <use x="0" y="10" xlink:href="#a9" />
136
+ <use x="10" y="10" xlink:href="#a9" />
137
+ <use x="20" y="10" xlink:href="#a9" />
138
+ <use x="30" y="10" xlink:href="#a9" />
139
+ <use x="40" y="10" xlink:href="#a9" />
140
+ <use x="50" y="10" xlink:href="#a9" />
141
+ <use x="60" y="10" xlink:href="#a9" />
142
+ <use x="70" y="10" xlink:href="#a9" />
143
+ <use x="80" y="10" xlink:href="#a9" />
144
+ <use x="90" y="10" xlink:href="#a9" />
145
+ </g>
146
+ </defs><use x="0" y="0" xlink:href="#a9" /></svg>
lib/vendor/enshrined/svg-sanitize/tests/data/xlinkLoopClean.svg ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <svg viewBox="0 0 500 500" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
3
+ <!-- ping:pong section to be removed -->
4
+ <!-- nested loop -->
5
+ <!-- self reference to be removed -->
6
+ </svg>
lib/vendor/enshrined/svg-sanitize/tests/data/xlinkLoopTest.svg ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <svg viewBox="0 0 500 500" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
3
+ <!-- ping:pong section to be removed -->
4
+ <g id="ping">
5
+ <text style="font-weight: 700;" x="50" y="50">Ping</text>
6
+ <use href="#pong" />
7
+ </g>
8
+ <g id="pong">
9
+ <text x="50" y="100" style="font-weight: 700">Pong</text>
10
+ <use href="#ping" />
11
+ </g>
12
+ <!-- nested loop -->
13
+ <g id="first">
14
+ <text style="font-weight: 700;" x="50" y="50">1st</text>
15
+ <use href="#second" />
16
+ </g>
17
+ <g id="second">
18
+ <text style="font-weight: 700;" x="50" y="50">2nd</text>
19
+ <use href="#third" />
20
+ </g>
21
+ <g id="third">
22
+ <text style="font-weight: 700;" x="50" y="50">3rd</text>
23
+ <use href="#fourth" />
24
+ </g>
25
+ <g id="fourth">
26
+ <text style="font-weight: 700;" x="50" y="50">4th</text>
27
+ <use href="#first" />
28
+ </g>
29
+ <!-- self reference to be removed -->
30
+ <use id="self" xlink:href="#self" />
31
+ </svg>
readme.txt CHANGED
@@ -3,9 +3,9 @@ Contributors: enshrined
3
  Donate link: https://wpsvg.com/
4
  Tags: svg, sanitize, upload, sanitise, security, svg upload, image, vector, file, graphic, media, mime
5
  Requires at least: 4.0
6
- Tested up to: 5.1
7
  Requires PHP: 5.6
8
- Stable tag: 1.9.4
9
  License: GPLv2 or later
10
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
11
 
@@ -49,19 +49,32 @@ They take one argument that must be returned. See below for examples:
49
 
50
  // Do what you want here...
51
 
 
 
 
 
 
52
  return $attributes;
53
  } );
54
 
55
 
56
  add_filter( 'svg_allowed_tags', function ( $tags ) {
57
 
58
- // Do what you want here...
 
 
 
 
 
59
 
60
  return $tags;
61
  } );
62
 
63
  == Changelog ==
64
 
 
 
 
65
  = 1.9.4 =
66
  * Fixed a bug causing lots of error log output to do with `safe_svg::fix_direct_image_output()`
67
 
3
  Donate link: https://wpsvg.com/
4
  Tags: svg, sanitize, upload, sanitise, security, svg upload, image, vector, file, graphic, media, mime
5
  Requires at least: 4.0
6
+ Tested up to: 5.2.2
7
  Requires PHP: 5.6
8
+ Stable tag: 1.9.5
9
  License: GPLv2 or later
10
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
11
 
49
 
50
  // Do what you want here...
51
 
52
+ // This should return an array so add your attributes to
53
+ // to the $attributes array before returning it. E.G.
54
+
55
+ $attributes[] = 'target'; // This would allow the target="" attribute.
56
+
57
  return $attributes;
58
  } );
59
 
60
 
61
  add_filter( 'svg_allowed_tags', function ( $tags ) {
62
 
63
+ // Do what you want here...
64
+
65
+ // This should return an array so add your tags to
66
+ // to the $tags array before returning it. E.G.
67
+
68
+ $tags[] = 'use'; // This would allow the <use> element.
69
 
70
  return $tags;
71
  } );
72
 
73
  == Changelog ==
74
 
75
+ = 1.9.5 =
76
+ * Underlying library update that fixes some security issues
77
+
78
  = 1.9.4 =
79
  * Fixed a bug causing lots of error log output to do with `safe_svg::fix_direct_image_output()`
80
 
safe-svg.php CHANGED
@@ -3,7 +3,7 @@
3
  Plugin Name: Safe SVG
4
  Plugin URI: https://wpsvg.com/
5
  Description: Allows SVG uploads into WordPress and sanitizes the SVG before saving it
6
- Version: 1.9.4
7
  Author: Daryll Doyle
8
  Author URI: http://enshrined.co.uk
9
  Text Domain: safe-svg
3
  Plugin Name: Safe SVG
4
  Plugin URI: https://wpsvg.com/
5
  Description: Allows SVG uploads into WordPress and sanitizes the SVG before saving it
6
+ Version: 1.9.5
7
  Author: Daryll Doyle
8
  Author URI: http://enshrined.co.uk
9
  Text Domain: safe-svg