drg_elfinder 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/README.md +28 -0
- data/Rakefile +8 -0
- data/app/assets/config/drg_elfinder_manifest.js +1 -0
- data/app/assets/javascripts/drg_elfinder.js +15 -0
- data/app/assets/javascripts/elfinder/Changelog +1283 -0
- data/app/assets/javascripts/elfinder/LICENSE.md +15 -0
- data/app/assets/javascripts/elfinder/README.md +216 -0
- data/app/assets/javascripts/elfinder/bower.json +28 -0
- data/app/assets/javascripts/elfinder/composer.json +39 -0
- data/app/assets/javascripts/elfinder/css/elfinder.full.css +5350 -0
- data/app/assets/javascripts/elfinder/css/elfinder.min.css +9 -0
- data/app/assets/javascripts/elfinder/css/theme.css +430 -0
- data/app/assets/javascripts/elfinder/elfinder.html +74 -0
- data/app/assets/javascripts/elfinder/elfinder.legacy.html +94 -0
- data/app/assets/javascripts/elfinder/img/arrows-active.png +0 -0
- data/app/assets/javascripts/elfinder/img/arrows-normal.png +0 -0
- data/app/assets/javascripts/elfinder/img/crop.gif +0 -0
- data/app/assets/javascripts/elfinder/img/dialogs.png +0 -0
- data/app/assets/javascripts/elfinder/img/edit_aceeditor.png +0 -0
- data/app/assets/javascripts/elfinder/img/edit_ckeditor.png +0 -0
- data/app/assets/javascripts/elfinder/img/edit_ckeditor5.png +0 -0
- data/app/assets/javascripts/elfinder/img/edit_codemirror.png +0 -0
- data/app/assets/javascripts/elfinder/img/edit_creativecloud.png +0 -0
- data/app/assets/javascripts/elfinder/img/edit_onlineconvert.png +0 -0
- data/app/assets/javascripts/elfinder/img/edit_pixlreditor.png +0 -0
- data/app/assets/javascripts/elfinder/img/edit_pixlrexpress.png +0 -0
- data/app/assets/javascripts/elfinder/img/edit_simplemde.png +0 -0
- data/app/assets/javascripts/elfinder/img/edit_tinymce.png +0 -0
- data/app/assets/javascripts/elfinder/img/edit_tuiimgedit.png +0 -0
- data/app/assets/javascripts/elfinder/img/edit_zohooffice.png +0 -0
- data/app/assets/javascripts/elfinder/img/editor-icons.png +0 -0
- data/app/assets/javascripts/elfinder/img/icons-big.png +0 -0
- data/app/assets/javascripts/elfinder/img/icons-big.svg +1 -0
- data/app/assets/javascripts/elfinder/img/icons-small.png +0 -0
- data/app/assets/javascripts/elfinder/img/logo.png +0 -0
- data/app/assets/javascripts/elfinder/img/progress.gif +0 -0
- data/app/assets/javascripts/elfinder/img/quicklook-bg.png +0 -0
- data/app/assets/javascripts/elfinder/img/quicklook-icons.png +0 -0
- data/app/assets/javascripts/elfinder/img/resize.png +0 -0
- data/app/assets/javascripts/elfinder/img/spinner-mini.gif +0 -0
- data/app/assets/javascripts/elfinder/img/toolbar.png +0 -0
- data/app/assets/javascripts/elfinder/img/trashmesh.png +0 -0
- data/app/assets/javascripts/elfinder/img/tui-icon-a.svg +235 -0
- data/app/assets/javascripts/elfinder/img/tui-icon-b.svg +224 -0
- data/app/assets/javascripts/elfinder/img/tui-icon-c.svg +224 -0
- data/app/assets/javascripts/elfinder/img/tui-icon-d.svg +224 -0
- data/app/assets/javascripts/elfinder/img/ui-icons_ffffff_256x240.png +0 -0
- data/app/assets/javascripts/elfinder/img/volume_icon_box.png +0 -0
- data/app/assets/javascripts/elfinder/img/volume_icon_box.svg +1 -0
- data/app/assets/javascripts/elfinder/img/volume_icon_dropbox.png +0 -0
- data/app/assets/javascripts/elfinder/img/volume_icon_dropbox.svg +1 -0
- data/app/assets/javascripts/elfinder/img/volume_icon_ftp.png +0 -0
- data/app/assets/javascripts/elfinder/img/volume_icon_ftp.svg +1 -0
- data/app/assets/javascripts/elfinder/img/volume_icon_googledrive.png +0 -0
- data/app/assets/javascripts/elfinder/img/volume_icon_googledrive.svg +1 -0
- data/app/assets/javascripts/elfinder/img/volume_icon_local.png +0 -0
- data/app/assets/javascripts/elfinder/img/volume_icon_local.svg +1 -0
- data/app/assets/javascripts/elfinder/img/volume_icon_network.png +0 -0
- data/app/assets/javascripts/elfinder/img/volume_icon_network.svg +1 -0
- data/app/assets/javascripts/elfinder/img/volume_icon_onedrive.png +0 -0
- data/app/assets/javascripts/elfinder/img/volume_icon_onedrive.svg +1 -0
- data/app/assets/javascripts/elfinder/img/volume_icon_sql.png +0 -0
- data/app/assets/javascripts/elfinder/img/volume_icon_sql.svg +1 -0
- data/app/assets/javascripts/elfinder/img/volume_icon_trash.png +0 -0
- data/app/assets/javascripts/elfinder/img/volume_icon_trash.svg +1 -0
- data/app/assets/javascripts/elfinder/img/volume_icon_zip.png +0 -0
- data/app/assets/javascripts/elfinder/img/volume_icon_zip.svg +1 -0
- data/app/assets/javascripts/elfinder/js/elfinder.full.js +36019 -0
- data/app/assets/javascripts/elfinder/js/elfinder.min.js +25 -0
- data/app/assets/javascripts/elfinder/js/extras/editors.default.js +2643 -0
- data/app/assets/javascripts/elfinder/js/extras/editors.default.min.js +2 -0
- data/app/assets/javascripts/elfinder/js/extras/quicklook.googledocs.js +75 -0
- data/app/assets/javascripts/elfinder/js/extras/quicklook.googledocs.min.js +1 -0
- data/app/assets/javascripts/elfinder/js/i18n/elfinder.LANG.js +587 -0
- data/app/assets/javascripts/elfinder/js/i18n/elfinder.ar.js +580 -0
- data/app/assets/javascripts/elfinder/js/i18n/elfinder.bg.js +559 -0
- data/app/assets/javascripts/elfinder/js/i18n/elfinder.ca.js +375 -0
- data/app/assets/javascripts/elfinder/js/i18n/elfinder.cs.js +581 -0
- data/app/assets/javascripts/elfinder/js/i18n/elfinder.da.js +580 -0
- data/app/assets/javascripts/elfinder/js/i18n/elfinder.de.js +582 -0
- data/app/assets/javascripts/elfinder/js/i18n/elfinder.el.js +374 -0
- data/app/assets/javascripts/elfinder/js/i18n/elfinder.es.js +546 -0
- data/app/assets/javascripts/elfinder/js/i18n/elfinder.fa.js +580 -0
- data/app/assets/javascripts/elfinder/js/i18n/elfinder.fallback.js +11 -0
- data/app/assets/javascripts/elfinder/js/i18n/elfinder.fo.js +419 -0
- data/app/assets/javascripts/elfinder/js/i18n/elfinder.fr.js +578 -0
- data/app/assets/javascripts/elfinder/js/i18n/elfinder.fr_CA.js +580 -0
- data/app/assets/javascripts/elfinder/js/i18n/elfinder.he.js +375 -0
- data/app/assets/javascripts/elfinder/js/i18n/elfinder.hr.js +434 -0
- data/app/assets/javascripts/elfinder/js/i18n/elfinder.hu.js +580 -0
- data/app/assets/javascripts/elfinder/js/i18n/elfinder.id.js +498 -0
- data/app/assets/javascripts/elfinder/js/i18n/elfinder.it.js +552 -0
- data/app/assets/javascripts/elfinder/js/i18n/elfinder.ja.js +581 -0
- data/app/assets/javascripts/elfinder/js/i18n/elfinder.ko.js +582 -0
- data/app/assets/javascripts/elfinder/js/i18n/elfinder.nl.js +581 -0
- data/app/assets/javascripts/elfinder/js/i18n/elfinder.no.js +374 -0
- data/app/assets/javascripts/elfinder/js/i18n/elfinder.pl.js +580 -0
- data/app/assets/javascripts/elfinder/js/i18n/elfinder.pt_BR.js +580 -0
- data/app/assets/javascripts/elfinder/js/i18n/elfinder.ro.js +417 -0
- data/app/assets/javascripts/elfinder/js/i18n/elfinder.ru.js +582 -0
- data/app/assets/javascripts/elfinder/js/i18n/elfinder.si.js +537 -0
- data/app/assets/javascripts/elfinder/js/i18n/elfinder.sk.js +581 -0
- data/app/assets/javascripts/elfinder/js/i18n/elfinder.sl.js +374 -0
- data/app/assets/javascripts/elfinder/js/i18n/elfinder.sr.js +374 -0
- data/app/assets/javascripts/elfinder/js/i18n/elfinder.sv.js +375 -0
- data/app/assets/javascripts/elfinder/js/i18n/elfinder.tr.js +583 -0
- data/app/assets/javascripts/elfinder/js/i18n/elfinder.ug_CN.js +374 -0
- data/app/assets/javascripts/elfinder/js/i18n/elfinder.uk.js +580 -0
- data/app/assets/javascripts/elfinder/js/i18n/elfinder.vi.js +579 -0
- data/app/assets/javascripts/elfinder/js/i18n/elfinder.zh_CN.js +585 -0
- data/app/assets/javascripts/elfinder/js/i18n/elfinder.zh_TW.js +582 -0
- data/app/assets/javascripts/elfinder/js/i18n/help/cs.html.js +10 -0
- data/app/assets/javascripts/elfinder/js/i18n/help/de.html.js +15 -0
- data/app/assets/javascripts/elfinder/js/i18n/help/en.html.js +10 -0
- data/app/assets/javascripts/elfinder/js/i18n/help/es.html.js +10 -0
- data/app/assets/javascripts/elfinder/js/i18n/help/ja.html.js +10 -0
- data/app/assets/javascripts/elfinder/js/i18n/help/ko.html.js +10 -0
- data/app/assets/javascripts/elfinder/js/i18n/help/pl.html.js +10 -0
- data/app/assets/javascripts/elfinder/js/i18n/help/ru.html.js +10 -0
- data/app/assets/javascripts/elfinder/js/i18n/help/sk.html.js +10 -0
- data/app/assets/javascripts/elfinder/js/i18n/help/tr.html.js +10 -0
- data/app/assets/javascripts/elfinder/js/proxy/elFinderSupportVer1.js +408 -0
- data/app/assets/javascripts/elfinder/js/worker/calcfilehash.js +20 -0
- data/app/assets/javascripts/elfinder/js/worker/quicklook.tiff.js +7 -0
- data/app/assets/javascripts/elfinder/js/worker/quicklook.unzip.js +55 -0
- data/app/assets/javascripts/elfinder/main.default.js +175 -0
- data/app/assets/javascripts/elfinder/package.json +13 -0
- data/app/assets/javascripts/elfinder/php/MySQLStorage.sql +47 -0
- data/app/assets/javascripts/elfinder/php/autoload.php +56 -0
- data/app/assets/javascripts/elfinder/php/connector.maximal.php-dist +449 -0
- data/app/assets/javascripts/elfinder/php/connector.minimal.php-dist +180 -0
- data/app/assets/javascripts/elfinder/php/editors/OnlineConvert/editor.php +113 -0
- data/app/assets/javascripts/elfinder/php/editors/ZipArchive/editor.php +12 -0
- data/app/assets/javascripts/elfinder/php/editors/ZohoOffice/editor.php +206 -0
- data/app/assets/javascripts/elfinder/php/editors/editor.php +79 -0
- data/app/assets/javascripts/elfinder/php/elFinder.class.php +5401 -0
- data/app/assets/javascripts/elfinder/php/elFinderConnector.class.php +380 -0
- data/app/assets/javascripts/elfinder/php/elFinderFlysystemGoogleDriveNetmount.php +380 -0
- data/app/assets/javascripts/elfinder/php/elFinderPlugin.php +113 -0
- data/app/assets/javascripts/elfinder/php/elFinderSession.php +335 -0
- data/app/assets/javascripts/elfinder/php/elFinderSessionInterface.php +57 -0
- data/app/assets/javascripts/elfinder/php/elFinderVolumeBox.class.php +1972 -0
- data/app/assets/javascripts/elfinder/php/elFinderVolumeDriver.class.php +7651 -0
- data/app/assets/javascripts/elfinder/php/elFinderVolumeDropbox.class.php +1464 -0
- data/app/assets/javascripts/elfinder/php/elFinderVolumeDropbox2.class.php +1516 -0
- data/app/assets/javascripts/elfinder/php/elFinderVolumeFTP.class.php +1810 -0
- data/app/assets/javascripts/elfinder/php/elFinderVolumeGoogleDrive.class.php +2163 -0
- data/app/assets/javascripts/elfinder/php/elFinderVolumeGroup.class.php +315 -0
- data/app/assets/javascripts/elfinder/php/elFinderVolumeLocalFileSystem.class.php +1477 -0
- data/app/assets/javascripts/elfinder/php/elFinderVolumeMySQL.class.php +1022 -0
- data/app/assets/javascripts/elfinder/php/elFinderVolumeOneDrive.class.php +2131 -0
- data/app/assets/javascripts/elfinder/php/elFinderVolumeSFTPphpseclib.class.php +838 -0
- data/app/assets/javascripts/elfinder/php/elFinderVolumeTrash.class.php +51 -0
- data/app/assets/javascripts/elfinder/php/elFinderVolumeTrashMySQL.class.php +51 -0
- data/app/assets/javascripts/elfinder/php/libs/GdBmp.php +473 -0
- data/app/assets/javascripts/elfinder/php/mime.types +781 -0
- data/app/assets/javascripts/elfinder/php/plugins/AutoResize/plugin.php +151 -0
- data/app/assets/javascripts/elfinder/php/plugins/AutoRotate/plugin.php +148 -0
- data/app/assets/javascripts/elfinder/php/plugins/Normalizer/plugin.php +204 -0
- data/app/assets/javascripts/elfinder/php/plugins/Sanitizer/plugin.php +157 -0
- data/app/assets/javascripts/elfinder/php/plugins/Watermark/logo.png +0 -0
- data/app/assets/javascripts/elfinder/php/plugins/Watermark/plugin.php +432 -0
- data/app/assets/javascripts/elfinder/php/plugins/WinRemoveTailDots/plugin.php +114 -0
- data/app/assets/javascripts/elfinder/php/resources/image.png +0 -0
- data/app/assets/javascripts/elfinder/php/resources/video.png +0 -0
- data/app/assets/javascripts/elfinder/sounds/rm.wav +0 -0
- data/app/controllers/dc_elfinder_controller.rb +63 -0
- data/app/models/drgcms_form_fields/elfinder.rb +85 -0
- data/changelog.md +0 -0
- data/lib/drg_elfinder/engine.rb +5 -0
- data/lib/drg_elfinder/version.rb +3 -0
- data/lib/drg_elfinder.rb +9 -0
- data/lib/el_finder/action.rb +19 -0
- data/lib/el_finder/base64.rb +24 -0
- data/lib/el_finder/connector.rb +625 -0
- data/lib/el_finder/image.rb +33 -0
- data/lib/el_finder/mime_type.rb +86 -0
- data/lib/el_finder/pathname.rb +185 -0
- data/lib/el_finder/version.rb +5 -0
- data/lib/el_finder.rb +8 -0
- data/lib/patches/patch_for_elfinder.rb +115 -0
- data/lib/tasks/drg_elfinder_tasks.rake +10 -0
- 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
|