drg_elfinder 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (185) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +28 -0
  4. data/Rakefile +8 -0
  5. data/app/assets/config/drg_elfinder_manifest.js +1 -0
  6. data/app/assets/javascripts/drg_elfinder.js +15 -0
  7. data/app/assets/javascripts/elfinder/Changelog +1283 -0
  8. data/app/assets/javascripts/elfinder/LICENSE.md +15 -0
  9. data/app/assets/javascripts/elfinder/README.md +216 -0
  10. data/app/assets/javascripts/elfinder/bower.json +28 -0
  11. data/app/assets/javascripts/elfinder/composer.json +39 -0
  12. data/app/assets/javascripts/elfinder/css/elfinder.full.css +5350 -0
  13. data/app/assets/javascripts/elfinder/css/elfinder.min.css +9 -0
  14. data/app/assets/javascripts/elfinder/css/theme.css +430 -0
  15. data/app/assets/javascripts/elfinder/elfinder.html +74 -0
  16. data/app/assets/javascripts/elfinder/elfinder.legacy.html +94 -0
  17. data/app/assets/javascripts/elfinder/img/arrows-active.png +0 -0
  18. data/app/assets/javascripts/elfinder/img/arrows-normal.png +0 -0
  19. data/app/assets/javascripts/elfinder/img/crop.gif +0 -0
  20. data/app/assets/javascripts/elfinder/img/dialogs.png +0 -0
  21. data/app/assets/javascripts/elfinder/img/edit_aceeditor.png +0 -0
  22. data/app/assets/javascripts/elfinder/img/edit_ckeditor.png +0 -0
  23. data/app/assets/javascripts/elfinder/img/edit_ckeditor5.png +0 -0
  24. data/app/assets/javascripts/elfinder/img/edit_codemirror.png +0 -0
  25. data/app/assets/javascripts/elfinder/img/edit_creativecloud.png +0 -0
  26. data/app/assets/javascripts/elfinder/img/edit_onlineconvert.png +0 -0
  27. data/app/assets/javascripts/elfinder/img/edit_pixlreditor.png +0 -0
  28. data/app/assets/javascripts/elfinder/img/edit_pixlrexpress.png +0 -0
  29. data/app/assets/javascripts/elfinder/img/edit_simplemde.png +0 -0
  30. data/app/assets/javascripts/elfinder/img/edit_tinymce.png +0 -0
  31. data/app/assets/javascripts/elfinder/img/edit_tuiimgedit.png +0 -0
  32. data/app/assets/javascripts/elfinder/img/edit_zohooffice.png +0 -0
  33. data/app/assets/javascripts/elfinder/img/editor-icons.png +0 -0
  34. data/app/assets/javascripts/elfinder/img/icons-big.png +0 -0
  35. data/app/assets/javascripts/elfinder/img/icons-big.svg +1 -0
  36. data/app/assets/javascripts/elfinder/img/icons-small.png +0 -0
  37. data/app/assets/javascripts/elfinder/img/logo.png +0 -0
  38. data/app/assets/javascripts/elfinder/img/progress.gif +0 -0
  39. data/app/assets/javascripts/elfinder/img/quicklook-bg.png +0 -0
  40. data/app/assets/javascripts/elfinder/img/quicklook-icons.png +0 -0
  41. data/app/assets/javascripts/elfinder/img/resize.png +0 -0
  42. data/app/assets/javascripts/elfinder/img/spinner-mini.gif +0 -0
  43. data/app/assets/javascripts/elfinder/img/toolbar.png +0 -0
  44. data/app/assets/javascripts/elfinder/img/trashmesh.png +0 -0
  45. data/app/assets/javascripts/elfinder/img/tui-icon-a.svg +235 -0
  46. data/app/assets/javascripts/elfinder/img/tui-icon-b.svg +224 -0
  47. data/app/assets/javascripts/elfinder/img/tui-icon-c.svg +224 -0
  48. data/app/assets/javascripts/elfinder/img/tui-icon-d.svg +224 -0
  49. data/app/assets/javascripts/elfinder/img/ui-icons_ffffff_256x240.png +0 -0
  50. data/app/assets/javascripts/elfinder/img/volume_icon_box.png +0 -0
  51. data/app/assets/javascripts/elfinder/img/volume_icon_box.svg +1 -0
  52. data/app/assets/javascripts/elfinder/img/volume_icon_dropbox.png +0 -0
  53. data/app/assets/javascripts/elfinder/img/volume_icon_dropbox.svg +1 -0
  54. data/app/assets/javascripts/elfinder/img/volume_icon_ftp.png +0 -0
  55. data/app/assets/javascripts/elfinder/img/volume_icon_ftp.svg +1 -0
  56. data/app/assets/javascripts/elfinder/img/volume_icon_googledrive.png +0 -0
  57. data/app/assets/javascripts/elfinder/img/volume_icon_googledrive.svg +1 -0
  58. data/app/assets/javascripts/elfinder/img/volume_icon_local.png +0 -0
  59. data/app/assets/javascripts/elfinder/img/volume_icon_local.svg +1 -0
  60. data/app/assets/javascripts/elfinder/img/volume_icon_network.png +0 -0
  61. data/app/assets/javascripts/elfinder/img/volume_icon_network.svg +1 -0
  62. data/app/assets/javascripts/elfinder/img/volume_icon_onedrive.png +0 -0
  63. data/app/assets/javascripts/elfinder/img/volume_icon_onedrive.svg +1 -0
  64. data/app/assets/javascripts/elfinder/img/volume_icon_sql.png +0 -0
  65. data/app/assets/javascripts/elfinder/img/volume_icon_sql.svg +1 -0
  66. data/app/assets/javascripts/elfinder/img/volume_icon_trash.png +0 -0
  67. data/app/assets/javascripts/elfinder/img/volume_icon_trash.svg +1 -0
  68. data/app/assets/javascripts/elfinder/img/volume_icon_zip.png +0 -0
  69. data/app/assets/javascripts/elfinder/img/volume_icon_zip.svg +1 -0
  70. data/app/assets/javascripts/elfinder/js/elfinder.full.js +36019 -0
  71. data/app/assets/javascripts/elfinder/js/elfinder.min.js +25 -0
  72. data/app/assets/javascripts/elfinder/js/extras/editors.default.js +2643 -0
  73. data/app/assets/javascripts/elfinder/js/extras/editors.default.min.js +2 -0
  74. data/app/assets/javascripts/elfinder/js/extras/quicklook.googledocs.js +75 -0
  75. data/app/assets/javascripts/elfinder/js/extras/quicklook.googledocs.min.js +1 -0
  76. data/app/assets/javascripts/elfinder/js/i18n/elfinder.LANG.js +587 -0
  77. data/app/assets/javascripts/elfinder/js/i18n/elfinder.ar.js +580 -0
  78. data/app/assets/javascripts/elfinder/js/i18n/elfinder.bg.js +559 -0
  79. data/app/assets/javascripts/elfinder/js/i18n/elfinder.ca.js +375 -0
  80. data/app/assets/javascripts/elfinder/js/i18n/elfinder.cs.js +581 -0
  81. data/app/assets/javascripts/elfinder/js/i18n/elfinder.da.js +580 -0
  82. data/app/assets/javascripts/elfinder/js/i18n/elfinder.de.js +582 -0
  83. data/app/assets/javascripts/elfinder/js/i18n/elfinder.el.js +374 -0
  84. data/app/assets/javascripts/elfinder/js/i18n/elfinder.es.js +546 -0
  85. data/app/assets/javascripts/elfinder/js/i18n/elfinder.fa.js +580 -0
  86. data/app/assets/javascripts/elfinder/js/i18n/elfinder.fallback.js +11 -0
  87. data/app/assets/javascripts/elfinder/js/i18n/elfinder.fo.js +419 -0
  88. data/app/assets/javascripts/elfinder/js/i18n/elfinder.fr.js +578 -0
  89. data/app/assets/javascripts/elfinder/js/i18n/elfinder.fr_CA.js +580 -0
  90. data/app/assets/javascripts/elfinder/js/i18n/elfinder.he.js +375 -0
  91. data/app/assets/javascripts/elfinder/js/i18n/elfinder.hr.js +434 -0
  92. data/app/assets/javascripts/elfinder/js/i18n/elfinder.hu.js +580 -0
  93. data/app/assets/javascripts/elfinder/js/i18n/elfinder.id.js +498 -0
  94. data/app/assets/javascripts/elfinder/js/i18n/elfinder.it.js +552 -0
  95. data/app/assets/javascripts/elfinder/js/i18n/elfinder.ja.js +581 -0
  96. data/app/assets/javascripts/elfinder/js/i18n/elfinder.ko.js +582 -0
  97. data/app/assets/javascripts/elfinder/js/i18n/elfinder.nl.js +581 -0
  98. data/app/assets/javascripts/elfinder/js/i18n/elfinder.no.js +374 -0
  99. data/app/assets/javascripts/elfinder/js/i18n/elfinder.pl.js +580 -0
  100. data/app/assets/javascripts/elfinder/js/i18n/elfinder.pt_BR.js +580 -0
  101. data/app/assets/javascripts/elfinder/js/i18n/elfinder.ro.js +417 -0
  102. data/app/assets/javascripts/elfinder/js/i18n/elfinder.ru.js +582 -0
  103. data/app/assets/javascripts/elfinder/js/i18n/elfinder.si.js +537 -0
  104. data/app/assets/javascripts/elfinder/js/i18n/elfinder.sk.js +581 -0
  105. data/app/assets/javascripts/elfinder/js/i18n/elfinder.sl.js +374 -0
  106. data/app/assets/javascripts/elfinder/js/i18n/elfinder.sr.js +374 -0
  107. data/app/assets/javascripts/elfinder/js/i18n/elfinder.sv.js +375 -0
  108. data/app/assets/javascripts/elfinder/js/i18n/elfinder.tr.js +583 -0
  109. data/app/assets/javascripts/elfinder/js/i18n/elfinder.ug_CN.js +374 -0
  110. data/app/assets/javascripts/elfinder/js/i18n/elfinder.uk.js +580 -0
  111. data/app/assets/javascripts/elfinder/js/i18n/elfinder.vi.js +579 -0
  112. data/app/assets/javascripts/elfinder/js/i18n/elfinder.zh_CN.js +585 -0
  113. data/app/assets/javascripts/elfinder/js/i18n/elfinder.zh_TW.js +582 -0
  114. data/app/assets/javascripts/elfinder/js/i18n/help/cs.html.js +10 -0
  115. data/app/assets/javascripts/elfinder/js/i18n/help/de.html.js +15 -0
  116. data/app/assets/javascripts/elfinder/js/i18n/help/en.html.js +10 -0
  117. data/app/assets/javascripts/elfinder/js/i18n/help/es.html.js +10 -0
  118. data/app/assets/javascripts/elfinder/js/i18n/help/ja.html.js +10 -0
  119. data/app/assets/javascripts/elfinder/js/i18n/help/ko.html.js +10 -0
  120. data/app/assets/javascripts/elfinder/js/i18n/help/pl.html.js +10 -0
  121. data/app/assets/javascripts/elfinder/js/i18n/help/ru.html.js +10 -0
  122. data/app/assets/javascripts/elfinder/js/i18n/help/sk.html.js +10 -0
  123. data/app/assets/javascripts/elfinder/js/i18n/help/tr.html.js +10 -0
  124. data/app/assets/javascripts/elfinder/js/proxy/elFinderSupportVer1.js +408 -0
  125. data/app/assets/javascripts/elfinder/js/worker/calcfilehash.js +20 -0
  126. data/app/assets/javascripts/elfinder/js/worker/quicklook.tiff.js +7 -0
  127. data/app/assets/javascripts/elfinder/js/worker/quicklook.unzip.js +55 -0
  128. data/app/assets/javascripts/elfinder/main.default.js +175 -0
  129. data/app/assets/javascripts/elfinder/package.json +13 -0
  130. data/app/assets/javascripts/elfinder/php/MySQLStorage.sql +47 -0
  131. data/app/assets/javascripts/elfinder/php/autoload.php +56 -0
  132. data/app/assets/javascripts/elfinder/php/connector.maximal.php-dist +449 -0
  133. data/app/assets/javascripts/elfinder/php/connector.minimal.php-dist +180 -0
  134. data/app/assets/javascripts/elfinder/php/editors/OnlineConvert/editor.php +113 -0
  135. data/app/assets/javascripts/elfinder/php/editors/ZipArchive/editor.php +12 -0
  136. data/app/assets/javascripts/elfinder/php/editors/ZohoOffice/editor.php +206 -0
  137. data/app/assets/javascripts/elfinder/php/editors/editor.php +79 -0
  138. data/app/assets/javascripts/elfinder/php/elFinder.class.php +5401 -0
  139. data/app/assets/javascripts/elfinder/php/elFinderConnector.class.php +380 -0
  140. data/app/assets/javascripts/elfinder/php/elFinderFlysystemGoogleDriveNetmount.php +380 -0
  141. data/app/assets/javascripts/elfinder/php/elFinderPlugin.php +113 -0
  142. data/app/assets/javascripts/elfinder/php/elFinderSession.php +335 -0
  143. data/app/assets/javascripts/elfinder/php/elFinderSessionInterface.php +57 -0
  144. data/app/assets/javascripts/elfinder/php/elFinderVolumeBox.class.php +1972 -0
  145. data/app/assets/javascripts/elfinder/php/elFinderVolumeDriver.class.php +7651 -0
  146. data/app/assets/javascripts/elfinder/php/elFinderVolumeDropbox.class.php +1464 -0
  147. data/app/assets/javascripts/elfinder/php/elFinderVolumeDropbox2.class.php +1516 -0
  148. data/app/assets/javascripts/elfinder/php/elFinderVolumeFTP.class.php +1810 -0
  149. data/app/assets/javascripts/elfinder/php/elFinderVolumeGoogleDrive.class.php +2163 -0
  150. data/app/assets/javascripts/elfinder/php/elFinderVolumeGroup.class.php +315 -0
  151. data/app/assets/javascripts/elfinder/php/elFinderVolumeLocalFileSystem.class.php +1477 -0
  152. data/app/assets/javascripts/elfinder/php/elFinderVolumeMySQL.class.php +1022 -0
  153. data/app/assets/javascripts/elfinder/php/elFinderVolumeOneDrive.class.php +2131 -0
  154. data/app/assets/javascripts/elfinder/php/elFinderVolumeSFTPphpseclib.class.php +838 -0
  155. data/app/assets/javascripts/elfinder/php/elFinderVolumeTrash.class.php +51 -0
  156. data/app/assets/javascripts/elfinder/php/elFinderVolumeTrashMySQL.class.php +51 -0
  157. data/app/assets/javascripts/elfinder/php/libs/GdBmp.php +473 -0
  158. data/app/assets/javascripts/elfinder/php/mime.types +781 -0
  159. data/app/assets/javascripts/elfinder/php/plugins/AutoResize/plugin.php +151 -0
  160. data/app/assets/javascripts/elfinder/php/plugins/AutoRotate/plugin.php +148 -0
  161. data/app/assets/javascripts/elfinder/php/plugins/Normalizer/plugin.php +204 -0
  162. data/app/assets/javascripts/elfinder/php/plugins/Sanitizer/plugin.php +157 -0
  163. data/app/assets/javascripts/elfinder/php/plugins/Watermark/logo.png +0 -0
  164. data/app/assets/javascripts/elfinder/php/plugins/Watermark/plugin.php +432 -0
  165. data/app/assets/javascripts/elfinder/php/plugins/WinRemoveTailDots/plugin.php +114 -0
  166. data/app/assets/javascripts/elfinder/php/resources/image.png +0 -0
  167. data/app/assets/javascripts/elfinder/php/resources/video.png +0 -0
  168. data/app/assets/javascripts/elfinder/sounds/rm.wav +0 -0
  169. data/app/controllers/dc_elfinder_controller.rb +63 -0
  170. data/app/models/drgcms_form_fields/elfinder.rb +85 -0
  171. data/changelog.md +0 -0
  172. data/lib/drg_elfinder/engine.rb +5 -0
  173. data/lib/drg_elfinder/version.rb +3 -0
  174. data/lib/drg_elfinder.rb +9 -0
  175. data/lib/el_finder/action.rb +19 -0
  176. data/lib/el_finder/base64.rb +24 -0
  177. data/lib/el_finder/connector.rb +625 -0
  178. data/lib/el_finder/image.rb +33 -0
  179. data/lib/el_finder/mime_type.rb +86 -0
  180. data/lib/el_finder/pathname.rb +185 -0
  181. data/lib/el_finder/version.rb +5 -0
  182. data/lib/el_finder.rb +8 -0
  183. data/lib/patches/patch_for_elfinder.rb +115 -0
  184. data/lib/tasks/drg_elfinder_tasks.rake +10 -0
  185. metadata +245 -0
@@ -0,0 +1,380 @@
1
+ <?php
2
+
3
+ /**
4
+ * Default elFinder connector
5
+ *
6
+ * @author Dmitry (dio) Levashov
7
+ **/
8
+ class elFinderConnector
9
+ {
10
+ /**
11
+ * elFinder instance
12
+ *
13
+ * @var elFinder
14
+ **/
15
+ protected $elFinder;
16
+
17
+ /**
18
+ * Options
19
+ *
20
+ * @var array
21
+ **/
22
+ protected $options = array();
23
+
24
+ /**
25
+ * Must be use output($data) $data['header']
26
+ *
27
+ * @var string
28
+ * @deprecated
29
+ **/
30
+ protected $header = '';
31
+
32
+ /**
33
+ * HTTP request method
34
+ *
35
+ * @var string
36
+ */
37
+ protected $reqMethod = '';
38
+
39
+ /**
40
+ * Content type of output JSON
41
+ *
42
+ * @var string
43
+ */
44
+ protected static $contentType = 'Content-Type: application/json; charset=utf-8';
45
+
46
+ /**
47
+ * Constructor
48
+ *
49
+ * @param $elFinder
50
+ * @param bool $debug
51
+ *
52
+ * @author Dmitry (dio) Levashov
53
+ */
54
+ public function __construct($elFinder, $debug = false)
55
+ {
56
+
57
+ $this->elFinder = $elFinder;
58
+ $this->reqMethod = strtoupper($_SERVER["REQUEST_METHOD"]);
59
+ if ($debug) {
60
+ self::$contentType = 'Content-Type: text/plain; charset=utf-8';
61
+ }
62
+ }
63
+
64
+ /**
65
+ * Execute elFinder command and output result
66
+ *
67
+ * @return void
68
+ * @throws Exception
69
+ * @author Dmitry (dio) Levashov
70
+ */
71
+ public function run()
72
+ {
73
+ $isPost = $this->reqMethod === 'POST';
74
+ $src = $isPost ? array_merge($_GET, $_POST) : $_GET;
75
+ $maxInputVars = (!$src || isset($src['targets'])) ? ini_get('max_input_vars') : null;
76
+ if ((!$src || $maxInputVars) && $rawPostData = file_get_contents('php://input')) {
77
+ // for max_input_vars and supports IE XDomainRequest()
78
+ $parts = explode('&', $rawPostData);
79
+ if (!$src || $maxInputVars < count($parts)) {
80
+ $src = array();
81
+ foreach ($parts as $part) {
82
+ list($key, $value) = array_pad(explode('=', $part), 2, '');
83
+ $key = rawurldecode($key);
84
+ if (preg_match('/^(.+?)\[([^\[\]]*)\]$/', $key, $m)) {
85
+ $key = $m[1];
86
+ $idx = $m[2];
87
+ if (!isset($src[$key])) {
88
+ $src[$key] = array();
89
+ }
90
+ if ($idx) {
91
+ $src[$key][$idx] = rawurldecode($value);
92
+ } else {
93
+ $src[$key][] = rawurldecode($value);
94
+ }
95
+ } else {
96
+ $src[$key] = rawurldecode($value);
97
+ }
98
+ }
99
+ $_POST = $this->input_filter($src);
100
+ $_REQUEST = $this->input_filter(array_merge_recursive($src, $_REQUEST));
101
+ }
102
+ }
103
+
104
+ if (isset($src['targets']) && $this->elFinder->maxTargets && count($src['targets']) > $this->elFinder->maxTargets) {
105
+ $this->output(array('error' => $this->elFinder->error(elFinder::ERROR_MAX_TARGTES)));
106
+ }
107
+
108
+ $cmd = isset($src['cmd']) ? $src['cmd'] : '';
109
+ $args = array();
110
+
111
+ if (!function_exists('json_encode')) {
112
+ $error = $this->elFinder->error(elFinder::ERROR_CONF, elFinder::ERROR_CONF_NO_JSON);
113
+ $this->output(array('error' => '{"error":["' . implode('","', $error) . '"]}', 'raw' => true));
114
+ }
115
+
116
+ if (!$this->elFinder->loaded()) {
117
+ $this->output(array('error' => $this->elFinder->error(elFinder::ERROR_CONF, elFinder::ERROR_CONF_NO_VOL), 'debug' => $this->elFinder->mountErrors));
118
+ }
119
+
120
+ // telepat_mode: on
121
+ if (!$cmd && $isPost) {
122
+ $this->output(array('error' => $this->elFinder->error(elFinder::ERROR_UPLOAD, elFinder::ERROR_UPLOAD_TOTAL_SIZE), 'header' => 'Content-Type: text/html'));
123
+ }
124
+ // telepat_mode: off
125
+
126
+ if (!$this->elFinder->commandExists($cmd)) {
127
+ $this->output(array('error' => $this->elFinder->error(elFinder::ERROR_UNKNOWN_CMD)));
128
+ }
129
+
130
+ // collect required arguments to exec command
131
+ $hasFiles = false;
132
+ foreach ($this->elFinder->commandArgsList($cmd) as $name => $req) {
133
+ if ($name === 'FILES') {
134
+ if (isset($_FILES)) {
135
+ $hasFiles = true;
136
+ } elseif ($req) {
137
+ $this->output(array('error' => $this->elFinder->error(elFinder::ERROR_INV_PARAMS, $cmd)));
138
+ }
139
+ } else {
140
+ $arg = isset($src[$name]) ? $src[$name] : '';
141
+
142
+ if (!is_array($arg) && $req !== '') {
143
+ $arg = trim($arg);
144
+ }
145
+ if ($req && $arg === '') {
146
+ $this->output(array('error' => $this->elFinder->error(elFinder::ERROR_INV_PARAMS, $cmd)));
147
+ }
148
+ $args[$name] = $arg;
149
+ }
150
+ }
151
+
152
+ $args['debug'] = isset($src['debug']) ? !!$src['debug'] : false;
153
+
154
+ $args = $this->input_filter($args);
155
+ if ($hasFiles) {
156
+ $args['FILES'] = $_FILES;
157
+ }
158
+
159
+ try {
160
+ $this->output($this->elFinder->exec($cmd, $args));
161
+ } catch (elFinderAbortException $e) {
162
+ // connection aborted
163
+ // unlock session data for multiple access
164
+ $this->elFinder->getSession()->close();
165
+ // HTTP response code
166
+ header('HTTP/1.0 204 No Content');
167
+ // clear output buffer
168
+ while (ob_get_level() && ob_end_clean()) {
169
+ }
170
+ exit();
171
+ }
172
+ }
173
+
174
+ /**
175
+ * Sets the header.
176
+ *
177
+ * @param array|string $value HTTP header(s)
178
+ */
179
+ public function setHeader($value)
180
+ {
181
+ $this->header = $value;
182
+ }
183
+
184
+ /**
185
+ * Output json
186
+ *
187
+ * @param array data to output
188
+ *
189
+ * @return void
190
+ * @throws elFinderAbortException
191
+ * @author Dmitry (dio) Levashov
192
+ */
193
+ protected function output(array $data)
194
+ {
195
+ // unlock session data for multiple access
196
+ $this->elFinder->getSession()->close();
197
+ // client disconnect should abort
198
+ ignore_user_abort(false);
199
+
200
+ if ($this->header) {
201
+ self::sendHeader($this->header);
202
+ }
203
+
204
+ if (isset($data['pointer'])) {
205
+ // set time limit to 0
206
+ elFinder::extendTimeLimit(0);
207
+
208
+ // send optional header
209
+ if (!empty($data['header'])) {
210
+ self::sendHeader($data['header']);
211
+ }
212
+
213
+ // clear output buffer
214
+ while (ob_get_level() && ob_end_clean()) {
215
+ }
216
+
217
+ $toEnd = true;
218
+ $fp = $data['pointer'];
219
+ $sendData = !($this->reqMethod === 'HEAD' || !empty($data['info']['xsendfile']));
220
+ $psize = null;
221
+ if (($this->reqMethod === 'GET' || !$sendData)
222
+ && (elFinder::isSeekableStream($fp) || elFinder::isSeekableUrl($fp))
223
+ && (array_search('Accept-Ranges: none', headers_list()) === false)) {
224
+ header('Accept-Ranges: bytes');
225
+ if (!empty($_SERVER['HTTP_RANGE'])) {
226
+ $size = $data['info']['size'];
227
+ $end = $size - 1;
228
+ if (preg_match('/bytes=(\d*)-(\d*)(,?)/i', $_SERVER['HTTP_RANGE'], $matches)) {
229
+ if (empty($matches[3])) {
230
+ if (empty($matches[1]) && $matches[1] !== '0') {
231
+ $start = $size - $matches[2];
232
+ } else {
233
+ $start = intval($matches[1]);
234
+ if (!empty($matches[2])) {
235
+ $end = intval($matches[2]);
236
+ if ($end >= $size) {
237
+ $end = $size - 1;
238
+ }
239
+ $toEnd = ($end == ($size - 1));
240
+ }
241
+ }
242
+ $psize = $end - $start + 1;
243
+
244
+ header('HTTP/1.1 206 Partial Content');
245
+ header('Content-Length: ' . $psize);
246
+ header('Content-Range: bytes ' . $start . '-' . $end . '/' . $size);
247
+
248
+ // Apache mod_xsendfile dose not support range request
249
+ if (isset($data['info']['xsendfile']) && strtolower($data['info']['xsendfile']) === 'x-sendfile') {
250
+ if (function_exists('header_remove')) {
251
+ header_remove($data['info']['xsendfile']);
252
+ } else {
253
+ header($data['info']['xsendfile'] . ':');
254
+ }
255
+ unset($data['info']['xsendfile']);
256
+ if ($this->reqMethod !== 'HEAD') {
257
+ $sendData = true;
258
+ }
259
+ }
260
+
261
+ $sendData && !elFinder::isSeekableUrl($fp) && fseek($fp, $start);
262
+ }
263
+ }
264
+ }
265
+ if ($sendData && is_null($psize)) {
266
+ elFinder::rewind($fp);
267
+ }
268
+ } else {
269
+ header('Accept-Ranges: none');
270
+ if (isset($data['info']) && !$data['info']['size']) {
271
+ if (function_exists('header_remove')) {
272
+ header_remove('Content-Length');
273
+ } else {
274
+ header('Content-Length:');
275
+ }
276
+ }
277
+ }
278
+
279
+ if ($sendData) {
280
+ if ($toEnd || elFinder::isSeekableUrl($fp)) {
281
+ // PHP < 5.6 has a bug of fpassthru
282
+ // see https://bugs.php.net/bug.php?id=66736
283
+ if (version_compare(PHP_VERSION, '5.6', '<')) {
284
+ file_put_contents('php://output', $fp);
285
+ } else {
286
+ fpassthru($fp);
287
+ }
288
+ } else {
289
+ $out = fopen('php://output', 'wb');
290
+ stream_copy_to_stream($fp, $out, $psize);
291
+ fclose($out);
292
+ }
293
+ }
294
+
295
+ if (!empty($data['volume'])) {
296
+ $data['volume']->close($fp, $data['info']['hash']);
297
+ } else {
298
+ fclose($fp);
299
+ }
300
+ exit();
301
+ } else {
302
+ self::outputJson($data);
303
+ exit(0);
304
+ }
305
+ }
306
+
307
+ /**
308
+ * Remove null & stripslashes applies on "magic_quotes_gpc"
309
+ *
310
+ * @param mixed $args
311
+ *
312
+ * @return mixed
313
+ * @author Naoki Sawada
314
+ */
315
+ protected function input_filter($args)
316
+ {
317
+ static $magic_quotes_gpc = NULL;
318
+
319
+ if ($magic_quotes_gpc === NULL)
320
+ $magic_quotes_gpc = (version_compare(PHP_VERSION, '5.4', '<') && get_magic_quotes_gpc());
321
+
322
+ if (is_array($args)) {
323
+ return array_map(array(& $this, 'input_filter'), $args);
324
+ }
325
+ $res = str_replace("\0", '', $args);
326
+ $magic_quotes_gpc && ($res = stripslashes($res));
327
+ return $res;
328
+ }
329
+
330
+ /**
331
+ * Send HTTP header
332
+ *
333
+ * @param string|array $header optional header
334
+ */
335
+ protected static function sendHeader($header = null)
336
+ {
337
+ if ($header) {
338
+ if (is_array($header)) {
339
+ foreach ($header as $h) {
340
+ header($h);
341
+ }
342
+ } else {
343
+ header($header);
344
+ }
345
+ }
346
+ }
347
+
348
+ /**
349
+ * Output JSON
350
+ *
351
+ * @param array $data
352
+ */
353
+ public static function outputJson($data)
354
+ {
355
+ // send header
356
+ $header = isset($data['header']) ? $data['header'] : self::$contentType;
357
+ self::sendHeader($header);
358
+
359
+ unset($data['header']);
360
+
361
+ if (!empty($data['raw']) && isset($data['error'])) {
362
+ $out = $data['error'];
363
+ } else {
364
+ if (isset($data['debug']) && isset($data['debug']['backendErrors'])) {
365
+ $data['debug']['backendErrors'] = array_merge($data['debug']['backendErrors'], elFinder::$phpErrors);
366
+ }
367
+ $out = json_encode($data);
368
+ }
369
+
370
+ // clear output buffer
371
+ while (ob_get_level() && ob_end_clean()) {
372
+ }
373
+
374
+ header('Content-Length: ' . strlen($out));
375
+
376
+ echo $out;
377
+
378
+ flush();
379
+ }
380
+ }// END class