drg_elfinder 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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,151 @@
|
|
|
1
|
+
<?php
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* elFinder Plugin AutoResize
|
|
5
|
+
* Auto resize on file upload.
|
|
6
|
+
* ex. binding, configure on connector options
|
|
7
|
+
* $opts = array(
|
|
8
|
+
* 'bind' => array(
|
|
9
|
+
* 'upload.presave' => array(
|
|
10
|
+
* 'Plugin.AutoResize.onUpLoadPreSave'
|
|
11
|
+
* )
|
|
12
|
+
* ),
|
|
13
|
+
* // global configure (optional)
|
|
14
|
+
* 'plugin' => array(
|
|
15
|
+
* 'AutoResize' => array(
|
|
16
|
+
* 'enable' => true, // For control by volume driver
|
|
17
|
+
* 'maxWidth' => 1024, // Path to Water mark image
|
|
18
|
+
* 'maxHeight' => 1024, // Margin right pixel
|
|
19
|
+
* 'quality' => 95, // JPEG image save quality
|
|
20
|
+
* 'preserveExif' => false, // Preserve EXIF data (Imagick only)
|
|
21
|
+
* 'forceEffect' => false, // For change quality or make progressive JPEG of small images
|
|
22
|
+
* 'targetType' => IMG_GIF|IMG_JPG|IMG_PNG|IMG_WBMP, // Target image formats ( bit-field )
|
|
23
|
+
* 'offDropWith' => null, // Enabled by default. To disable it if it is dropped with pressing the meta key
|
|
24
|
+
* // Alt: 8, Ctrl: 4, Meta: 2, Shift: 1 - sum of each value
|
|
25
|
+
* // In case of using any key, specify it as an array
|
|
26
|
+
* 'onDropWith' => null // Disabled by default. To enable it if it is dropped with pressing the meta key
|
|
27
|
+
* // Alt: 8, Ctrl: 4, Meta: 2, Shift: 1 - sum of each value
|
|
28
|
+
* // In case of using any key, specify it as an array
|
|
29
|
+
* )
|
|
30
|
+
* ),
|
|
31
|
+
* // each volume configure (optional)
|
|
32
|
+
* 'roots' => array(
|
|
33
|
+
* array(
|
|
34
|
+
* 'driver' => 'LocalFileSystem',
|
|
35
|
+
* 'path' => '/path/to/files/',
|
|
36
|
+
* 'URL' => 'http://localhost/to/files/'
|
|
37
|
+
* 'plugin' => array(
|
|
38
|
+
* 'AutoResize' => array(
|
|
39
|
+
* 'enable' => true, // For control by volume driver
|
|
40
|
+
* 'maxWidth' => 1024, // Path to Water mark image
|
|
41
|
+
* 'maxHeight' => 1024, // Margin right pixel
|
|
42
|
+
* 'quality' => 95, // JPEG image save quality
|
|
43
|
+
* 'preserveExif' => false, // Preserve EXIF data (Imagick only)
|
|
44
|
+
* 'forceEffect' => false, // For change quality or make progressive JPEG of small images
|
|
45
|
+
* 'targetType' => IMG_GIF|IMG_JPG|IMG_PNG|IMG_WBMP, // Target image formats ( bit-field )
|
|
46
|
+
* 'offDropWith' => null, // Enabled by default. To disable it if it is dropped with pressing the meta key
|
|
47
|
+
* // Alt: 8, Ctrl: 4, Meta: 2, Shift: 1 - sum of each value
|
|
48
|
+
* // In case of using any key, specify it as an array
|
|
49
|
+
* 'onDropWith' => null // Disabled by default. To enable it if it is dropped with pressing the meta key
|
|
50
|
+
* // Alt: 8, Ctrl: 4, Meta: 2, Shift: 1 - sum of each value
|
|
51
|
+
* // In case of using any key, specify it as an array
|
|
52
|
+
* )
|
|
53
|
+
* )
|
|
54
|
+
* )
|
|
55
|
+
* )
|
|
56
|
+
* );
|
|
57
|
+
*
|
|
58
|
+
* @package elfinder
|
|
59
|
+
* @author Naoki Sawada
|
|
60
|
+
* @license New BSD
|
|
61
|
+
*/
|
|
62
|
+
class elFinderPluginAutoResize extends elFinderPlugin
|
|
63
|
+
{
|
|
64
|
+
|
|
65
|
+
public function __construct($opts)
|
|
66
|
+
{
|
|
67
|
+
$defaults = array(
|
|
68
|
+
'enable' => true, // For control by volume driver
|
|
69
|
+
'maxWidth' => 1024, // Path to Water mark image
|
|
70
|
+
'maxHeight' => 1024, // Margin right pixel
|
|
71
|
+
'quality' => 95, // JPEG image save quality
|
|
72
|
+
'preserveExif' => false, // Preserve EXIF data (Imagick only)
|
|
73
|
+
'forceEffect' => false, // For change quality or make progressive JPEG of small images
|
|
74
|
+
'targetType' => IMG_GIF | IMG_JPG | IMG_PNG | IMG_WBMP, // Target image formats ( bit-field )
|
|
75
|
+
'offDropWith' => null, // To disable it if it is dropped with pressing the meta key
|
|
76
|
+
// Alt: 8, Ctrl: 4, Meta: 2, Shift: 1 - sum of each value
|
|
77
|
+
// In case of using any key, specify it as an array
|
|
78
|
+
'disableWithContentSaveId' => true // Disable on URL upload with post data "contentSaveId"
|
|
79
|
+
);
|
|
80
|
+
|
|
81
|
+
$this->opts = array_merge($defaults, $opts);
|
|
82
|
+
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
public function onUpLoadPreSave(&$thash, &$name, $src, $elfinder, $volume)
|
|
86
|
+
{
|
|
87
|
+
if (!$src) {
|
|
88
|
+
return false;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
$opts = $this->getCurrentOpts($volume);
|
|
92
|
+
|
|
93
|
+
if (!$this->iaEnabled($opts, $elfinder)) {
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
$imageType = null;
|
|
98
|
+
$srcImgInfo = null;
|
|
99
|
+
if (extension_loaded('fileinfo') && function_exists('mime_content_type')) {
|
|
100
|
+
$mime = mime_content_type($src);
|
|
101
|
+
if (substr($mime, 0, 5) !== 'image') {
|
|
102
|
+
return false;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
if (extension_loaded('exif') && function_exists('exif_imagetype')) {
|
|
106
|
+
$imageType = exif_imagetype($src);
|
|
107
|
+
if ($imageType === false) {
|
|
108
|
+
return false;
|
|
109
|
+
}
|
|
110
|
+
} else {
|
|
111
|
+
$srcImgInfo = getimagesize($src);
|
|
112
|
+
if ($srcImgInfo === false) {
|
|
113
|
+
return false;
|
|
114
|
+
}
|
|
115
|
+
$imageType = $srcImgInfo[2];
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// check target image type
|
|
119
|
+
$imgTypes = array(
|
|
120
|
+
IMAGETYPE_GIF => IMG_GIF,
|
|
121
|
+
IMAGETYPE_JPEG => IMG_JPEG,
|
|
122
|
+
IMAGETYPE_PNG => IMG_PNG,
|
|
123
|
+
IMAGETYPE_BMP => IMG_WBMP,
|
|
124
|
+
IMAGETYPE_WBMP => IMG_WBMP
|
|
125
|
+
);
|
|
126
|
+
if (!isset($imgTypes[$imageType]) || !($opts['targetType'] & $imgTypes[$imageType])) {
|
|
127
|
+
return false;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
if (!$srcImgInfo) {
|
|
131
|
+
$srcImgInfo = getimagesize($src);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
if ($opts['forceEffect'] || $srcImgInfo[0] > $opts['maxWidth'] || $srcImgInfo[1] > $opts['maxHeight']) {
|
|
135
|
+
return $this->resize($volume, $src, $srcImgInfo, $opts['maxWidth'], $opts['maxHeight'], $opts['quality'], $opts['preserveExif']);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
return false;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
private function resize($volume, $src, $srcImgInfo, $maxWidth, $maxHeight, $jpgQuality, $preserveExif)
|
|
142
|
+
{
|
|
143
|
+
$zoom = min(($maxWidth / $srcImgInfo[0]), ($maxHeight / $srcImgInfo[1]));
|
|
144
|
+
$width = round($srcImgInfo[0] * $zoom);
|
|
145
|
+
$height = round($srcImgInfo[1] * $zoom);
|
|
146
|
+
$unenlarge = true;
|
|
147
|
+
$checkAnimated = true;
|
|
148
|
+
|
|
149
|
+
return $volume->imageUtil('resize', $src, compact('width', 'height', 'jpgQuality', 'preserveExif', 'unenlarge', 'checkAnimated'));
|
|
150
|
+
}
|
|
151
|
+
}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
<?php
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* elFinder Plugin AutoRotate
|
|
5
|
+
* Auto rotation on file upload of JPEG file by EXIF Orientation.
|
|
6
|
+
* ex. binding, configure on connector options
|
|
7
|
+
* $opts = array(
|
|
8
|
+
* 'bind' => array(
|
|
9
|
+
* 'upload.presave' => array(
|
|
10
|
+
* 'Plugin.AutoRotate.onUpLoadPreSave'
|
|
11
|
+
* )
|
|
12
|
+
* ),
|
|
13
|
+
* // global configure (optional)
|
|
14
|
+
* 'plugin' => array(
|
|
15
|
+
* 'AutoRotate' => array(
|
|
16
|
+
* 'enable' => true, // For control by volume driver
|
|
17
|
+
* 'quality' => 95, // JPEG image save quality
|
|
18
|
+
* 'offDropWith' => null, // Enabled by default. To disable it if it is dropped with pressing the meta key
|
|
19
|
+
* // Alt: 8, Ctrl: 4, Meta: 2, Shift: 1 - sum of each value
|
|
20
|
+
* // In case of using any key, specify it as an array
|
|
21
|
+
* 'onDropWith' => null // Disabled by default. To enable it if it is dropped with pressing the meta key
|
|
22
|
+
* // Alt: 8, Ctrl: 4, Meta: 2, Shift: 1 - sum of each value
|
|
23
|
+
* // In case of using any key, specify it as an array
|
|
24
|
+
* )
|
|
25
|
+
* ),
|
|
26
|
+
* // each volume configure (optional)
|
|
27
|
+
* 'roots' => array(
|
|
28
|
+
* array(
|
|
29
|
+
* 'driver' => 'LocalFileSystem',
|
|
30
|
+
* 'path' => '/path/to/files/',
|
|
31
|
+
* 'URL' => 'http://localhost/to/files/'
|
|
32
|
+
* 'plugin' => array(
|
|
33
|
+
* 'AutoRotate' => array(
|
|
34
|
+
* 'enable' => true, // For control by volume driver
|
|
35
|
+
* 'quality' => 95, // JPEG image save quality
|
|
36
|
+
* 'offDropWith' => null, // Enabled by default. To disable it if it is dropped with pressing the meta key
|
|
37
|
+
* // Alt: 8, Ctrl: 4, Meta: 2, Shift: 1 - sum of each value
|
|
38
|
+
* // In case of using any key, specify it as an array
|
|
39
|
+
* 'onDropWith' => null // Disabled by default. To enable it if it is dropped with pressing the meta key
|
|
40
|
+
* // Alt: 8, Ctrl: 4, Meta: 2, Shift: 1 - sum of each value
|
|
41
|
+
* // In case of using any key, specify it as an array
|
|
42
|
+
* )
|
|
43
|
+
* )
|
|
44
|
+
* )
|
|
45
|
+
* )
|
|
46
|
+
* );
|
|
47
|
+
*
|
|
48
|
+
* @package elfinder
|
|
49
|
+
* @author Naoki Sawada
|
|
50
|
+
* @license New BSD
|
|
51
|
+
*/
|
|
52
|
+
class elFinderPluginAutoRotate extends elFinderPlugin
|
|
53
|
+
{
|
|
54
|
+
|
|
55
|
+
public function __construct($opts)
|
|
56
|
+
{
|
|
57
|
+
$defaults = array(
|
|
58
|
+
'enable' => true, // For control by volume driver
|
|
59
|
+
'quality' => 95, // JPEG image save quality
|
|
60
|
+
'offDropWith' => null, // To disable it if it is dropped with pressing the meta key
|
|
61
|
+
// Alt: 8, Ctrl: 4, Meta: 2, Shift: 1 - sum of each value
|
|
62
|
+
// In case of using any key, specify it as an array
|
|
63
|
+
'disableWithContentSaveId' => true // Disable on URL upload with post data "contentSaveId"
|
|
64
|
+
);
|
|
65
|
+
|
|
66
|
+
$this->opts = array_merge($defaults, $opts);
|
|
67
|
+
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
public function onUpLoadPreSave(&$thash, &$name, $src, $elfinder, $volume)
|
|
71
|
+
{
|
|
72
|
+
if (!$src) {
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
$opts = $this->getCurrentOpts($volume);
|
|
77
|
+
|
|
78
|
+
if (!$this->iaEnabled($opts, $elfinder)) {
|
|
79
|
+
return false;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
$imageType = null;
|
|
83
|
+
$srcImgInfo = null;
|
|
84
|
+
if (extension_loaded('fileinfo') && function_exists('mime_content_type')) {
|
|
85
|
+
$mime = mime_content_type($src);
|
|
86
|
+
if (substr($mime, 0, 5) !== 'image') {
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
if (extension_loaded('exif') && function_exists('exif_imagetype')) {
|
|
91
|
+
$imageType = exif_imagetype($src);
|
|
92
|
+
if ($imageType === false) {
|
|
93
|
+
return false;
|
|
94
|
+
}
|
|
95
|
+
} else {
|
|
96
|
+
$srcImgInfo = getimagesize($src);
|
|
97
|
+
if ($srcImgInfo === false) {
|
|
98
|
+
return false;
|
|
99
|
+
}
|
|
100
|
+
$imageType = $srcImgInfo[2];
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// check target image type
|
|
104
|
+
if ($imageType !== IMAGETYPE_JPEG) {
|
|
105
|
+
return false;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
if (!$srcImgInfo) {
|
|
109
|
+
$srcImgInfo = getimagesize($src);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
return $this->rotate($volume, $src, $srcImgInfo, $opts['quality']);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
private function rotate($volume, $src, $srcImgInfo, $quality)
|
|
116
|
+
{
|
|
117
|
+
if (!function_exists('exif_read_data')) {
|
|
118
|
+
return false;
|
|
119
|
+
}
|
|
120
|
+
$degree = 0;
|
|
121
|
+
$errlev =error_reporting();
|
|
122
|
+
error_reporting($errlev ^ E_WARNING);
|
|
123
|
+
$exif = exif_read_data($src);
|
|
124
|
+
error_reporting($errlev);
|
|
125
|
+
if ($exif && !empty($exif['Orientation'])) {
|
|
126
|
+
switch ($exif['Orientation']) {
|
|
127
|
+
case 8:
|
|
128
|
+
$degree = 270;
|
|
129
|
+
break;
|
|
130
|
+
case 3:
|
|
131
|
+
$degree = 180;
|
|
132
|
+
break;
|
|
133
|
+
case 6:
|
|
134
|
+
$degree = 90;
|
|
135
|
+
break;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
if (!$degree) {
|
|
139
|
+
return false;
|
|
140
|
+
}
|
|
141
|
+
$opts = array(
|
|
142
|
+
'degree' => $degree,
|
|
143
|
+
'jpgQuality' => $quality,
|
|
144
|
+
'checkAnimated' => true
|
|
145
|
+
);
|
|
146
|
+
return $volume->imageUtil('rotate', $src, $opts);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
<?php
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* elFinder Plugin Normalizer
|
|
5
|
+
* UTF-8 Normalizer of file-name and file-path etc.
|
|
6
|
+
* nfc(NFC): Canonical Decomposition followed by Canonical Composition
|
|
7
|
+
* nfkc(NFKC): Compatibility Decomposition followed by Canonical
|
|
8
|
+
* This plugin require Class "Normalizer" (PHP 5 >= 5.3.0, PECL intl >= 1.0.0)
|
|
9
|
+
* or PEAR package "I18N_UnicodeNormalizer"
|
|
10
|
+
* ex. binding, configure on connector options
|
|
11
|
+
* $opts = array(
|
|
12
|
+
* 'bind' => array(
|
|
13
|
+
* 'upload.pre mkdir.pre mkfile.pre rename.pre archive.pre ls.pre' => array(
|
|
14
|
+
* 'Plugin.Normalizer.cmdPreprocess'
|
|
15
|
+
* ),
|
|
16
|
+
* 'upload.presave paste.copyfrom' => array(
|
|
17
|
+
* 'Plugin.Normalizer.onUpLoadPreSave'
|
|
18
|
+
* )
|
|
19
|
+
* ),
|
|
20
|
+
* // global configure (optional)
|
|
21
|
+
* 'plugin' => array(
|
|
22
|
+
* 'Normalizer' => array(
|
|
23
|
+
* 'enable' => true,
|
|
24
|
+
* 'nfc' => true,
|
|
25
|
+
* 'nfkc' => true,
|
|
26
|
+
* 'umlauts' => false,
|
|
27
|
+
* 'lowercase' => false,
|
|
28
|
+
* 'convmap' => array()
|
|
29
|
+
* )
|
|
30
|
+
* ),
|
|
31
|
+
* // each volume configure (optional)
|
|
32
|
+
* 'roots' => array(
|
|
33
|
+
* array(
|
|
34
|
+
* 'driver' => 'LocalFileSystem',
|
|
35
|
+
* 'path' => '/path/to/files/',
|
|
36
|
+
* 'URL' => 'http://localhost/to/files/'
|
|
37
|
+
* 'plugin' => array(
|
|
38
|
+
* 'Normalizer' => array(
|
|
39
|
+
* 'enable' => true,
|
|
40
|
+
* 'nfc' => true,
|
|
41
|
+
* 'nfkc' => true,
|
|
42
|
+
* 'umlauts' => false,
|
|
43
|
+
* 'lowercase' => false,
|
|
44
|
+
* 'convmap' => array()
|
|
45
|
+
* )
|
|
46
|
+
* )
|
|
47
|
+
* )
|
|
48
|
+
* )
|
|
49
|
+
* );
|
|
50
|
+
*
|
|
51
|
+
* @package elfinder
|
|
52
|
+
* @author Naoki Sawada
|
|
53
|
+
* @license New BSD
|
|
54
|
+
*/
|
|
55
|
+
class elFinderPluginNormalizer extends elFinderPlugin
|
|
56
|
+
{
|
|
57
|
+
private $replaced = array();
|
|
58
|
+
private $keyMap = array(
|
|
59
|
+
'ls' => 'intersect',
|
|
60
|
+
'upload' => 'renames',
|
|
61
|
+
'mkdir' => array('name', 'dirs')
|
|
62
|
+
);
|
|
63
|
+
|
|
64
|
+
public function __construct($opts)
|
|
65
|
+
{
|
|
66
|
+
$defaults = array(
|
|
67
|
+
'enable' => true, // For control by volume driver
|
|
68
|
+
'nfc' => true, // Canonical Decomposition followed by Canonical Composition
|
|
69
|
+
'nfkc' => true, // Compatibility Decomposition followed by Canonical
|
|
70
|
+
'umlauts' => false, // Convert umlauts with their closest 7 bit ascii equivalent
|
|
71
|
+
'lowercase' => false, // Make chars lowercase
|
|
72
|
+
'convmap' => array()// Convert map ('FROM' => 'TO') array
|
|
73
|
+
);
|
|
74
|
+
|
|
75
|
+
$this->opts = array_merge($defaults, $opts);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
public function cmdPreprocess($cmd, &$args, $elfinder, $volume)
|
|
79
|
+
{
|
|
80
|
+
$opts = $this->getCurrentOpts($volume);
|
|
81
|
+
if (!$opts['enable']) {
|
|
82
|
+
return false;
|
|
83
|
+
}
|
|
84
|
+
$this->replaced[$cmd] = array();
|
|
85
|
+
$key = (isset($this->keyMap[$cmd])) ? $this->keyMap[$cmd] : 'name';
|
|
86
|
+
|
|
87
|
+
if (is_array($key)) {
|
|
88
|
+
$keys = $key;
|
|
89
|
+
} else {
|
|
90
|
+
$keys = array($key);
|
|
91
|
+
}
|
|
92
|
+
foreach ($keys as $key) {
|
|
93
|
+
if (isset($args[$key])) {
|
|
94
|
+
if (is_array($args[$key])) {
|
|
95
|
+
foreach ($args[$key] as $i => $name) {
|
|
96
|
+
if ($cmd === 'mkdir' && $key === 'dirs') {
|
|
97
|
+
// $name need '/' as prefix see #2607
|
|
98
|
+
$name = '/' . ltrim($name, '/');
|
|
99
|
+
$_names = explode('/', $name);
|
|
100
|
+
$_res = array();
|
|
101
|
+
foreach ($_names as $_name) {
|
|
102
|
+
$_res[] = $this->normalize($_name, $opts);
|
|
103
|
+
}
|
|
104
|
+
$this->replaced[$cmd][$name] = $args[$key][$i] = join('/', $_res);
|
|
105
|
+
} else {
|
|
106
|
+
$this->replaced[$cmd][$name] = $args[$key][$i] = $this->normalize($name, $opts);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
} else if ($args[$key] !== '') {
|
|
110
|
+
$name = $args[$key];
|
|
111
|
+
$this->replaced[$cmd][$name] = $args[$key] = $this->normalize($name, $opts);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
if ($cmd === 'ls' || $cmd === 'mkdir') {
|
|
116
|
+
if (!empty($this->replaced[$cmd])) {
|
|
117
|
+
// un-regist for legacy settings
|
|
118
|
+
$elfinder->unbind($cmd, array($this, 'cmdPostprocess'));
|
|
119
|
+
$elfinder->bind($cmd, array($this, 'cmdPostprocess'));
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
return true;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
public function cmdPostprocess($cmd, &$result, $args, $elfinder, $volume)
|
|
126
|
+
{
|
|
127
|
+
if ($cmd === 'ls') {
|
|
128
|
+
if (!empty($result['list']) && !empty($this->replaced['ls'])) {
|
|
129
|
+
foreach ($result['list'] as $hash => $name) {
|
|
130
|
+
if ($keys = array_keys($this->replaced['ls'], $name)) {
|
|
131
|
+
if (count($keys) === 1) {
|
|
132
|
+
$result['list'][$hash] = $keys[0];
|
|
133
|
+
} else {
|
|
134
|
+
$result['list'][$hash] = $keys;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
} else if ($cmd === 'mkdir') {
|
|
140
|
+
if (!empty($result['hashes']) && !empty($this->replaced['mkdir'])) {
|
|
141
|
+
foreach ($result['hashes'] as $name => $hash) {
|
|
142
|
+
if ($keys = array_keys($this->replaced['mkdir'], $name)) {
|
|
143
|
+
$result['hashes'][$keys[0]] = $hash;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// NOTE: $thash is directory hash so it unneed to process at here
|
|
151
|
+
public function onUpLoadPreSave(&$thash, &$name, $src, $elfinder, $volume)
|
|
152
|
+
{
|
|
153
|
+
$opts = $this->getCurrentOpts($volume);
|
|
154
|
+
if (!$opts['enable']) {
|
|
155
|
+
return false;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
$name = $this->normalize($name, $opts);
|
|
159
|
+
return true;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
protected function normalize($str, $opts)
|
|
163
|
+
{
|
|
164
|
+
if ($opts['nfc'] || $opts['nfkc']) {
|
|
165
|
+
if (class_exists('Normalizer', false)) {
|
|
166
|
+
if ($opts['nfc'] && !Normalizer::isNormalized($str, Normalizer::FORM_C))
|
|
167
|
+
$str = Normalizer::normalize($str, Normalizer::FORM_C);
|
|
168
|
+
if ($opts['nfkc'] && !Normalizer::isNormalized($str, Normalizer::FORM_KC))
|
|
169
|
+
$str = Normalizer::normalize($str, Normalizer::FORM_KC);
|
|
170
|
+
} else {
|
|
171
|
+
if (!class_exists('I18N_UnicodeNormalizer', false)) {
|
|
172
|
+
if (is_readable('I18N/UnicodeNormalizer.php')) {
|
|
173
|
+
include_once 'I18N/UnicodeNormalizer.php';
|
|
174
|
+
} else {
|
|
175
|
+
trigger_error('Plugin Normalizer\'s options "nfc" or "nfkc" require PHP class "Normalizer" or PEAR package "I18N_UnicodeNormalizer"', E_USER_WARNING);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
if (class_exists('I18N_UnicodeNormalizer', false)) {
|
|
179
|
+
$normalizer = new I18N_UnicodeNormalizer();
|
|
180
|
+
if ($opts['nfc'])
|
|
181
|
+
$str = $normalizer->normalize($str, 'NFC');
|
|
182
|
+
if ($opts['nfkc'])
|
|
183
|
+
$str = $normalizer->normalize($str, 'NFKC');
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
if ($opts['umlauts']) {
|
|
188
|
+
if (strpos($str = htmlentities($str, ENT_QUOTES, 'UTF-8'), '&') !== false) {
|
|
189
|
+
$str = html_entity_decode(preg_replace('~&([a-z]{1,2})(?:acute|caron|cedil|circ|grave|lig|orn|ring|slash|tilde|uml);~i', '$1', $str), ENT_QUOTES, 'utf-8');
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
if ($opts['convmap'] && is_array($opts['convmap'])) {
|
|
193
|
+
$str = strtr($str, $opts['convmap']);
|
|
194
|
+
}
|
|
195
|
+
if ($opts['lowercase']) {
|
|
196
|
+
if (function_exists('mb_strtolower')) {
|
|
197
|
+
$str = mb_strtolower($str, 'UTF-8');
|
|
198
|
+
} else {
|
|
199
|
+
$str = strtolower($str);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
return $str;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
<?php
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* elFinder Plugin Sanitizer
|
|
5
|
+
* Sanitizer of file-name and file-path etc.
|
|
6
|
+
* ex. binding, configure on connector options
|
|
7
|
+
* $opts = array(
|
|
8
|
+
* 'bind' => array(
|
|
9
|
+
* 'upload.pre mkdir.pre mkfile.pre rename.pre archive.pre ls.pre' => array(
|
|
10
|
+
* 'Plugin.Sanitizer.cmdPreprocess'
|
|
11
|
+
* ),
|
|
12
|
+
* 'upload.presave paste.copyfrom' => array(
|
|
13
|
+
* 'Plugin.Sanitizer.onUpLoadPreSave'
|
|
14
|
+
* )
|
|
15
|
+
* ),
|
|
16
|
+
* // global configure (optional)
|
|
17
|
+
* 'plugin' => array(
|
|
18
|
+
* 'Sanitizer' => array(
|
|
19
|
+
* 'enable' => true,
|
|
20
|
+
* 'targets' => array('\\','/',':','*','?','"','<','>','|'), // target chars
|
|
21
|
+
* 'replace' => '_', // replace to this
|
|
22
|
+
* 'callBack' => null // Or @callable sanitize function
|
|
23
|
+
* )
|
|
24
|
+
* ),
|
|
25
|
+
* // each volume configure (optional)
|
|
26
|
+
* 'roots' => array(
|
|
27
|
+
* array(
|
|
28
|
+
* 'driver' => 'LocalFileSystem',
|
|
29
|
+
* 'path' => '/path/to/files/',
|
|
30
|
+
* 'URL' => 'http://localhost/to/files/'
|
|
31
|
+
* 'plugin' => array(
|
|
32
|
+
* 'Sanitizer' => array(
|
|
33
|
+
* 'enable' => true,
|
|
34
|
+
* 'targets' => array('\\','/',':','*','?','"','<','>','|'), // target chars
|
|
35
|
+
* 'replace' => '_', // replace to this
|
|
36
|
+
* 'callBack' => null // Or @callable sanitize function
|
|
37
|
+
* )
|
|
38
|
+
* )
|
|
39
|
+
* )
|
|
40
|
+
* )
|
|
41
|
+
* );
|
|
42
|
+
*
|
|
43
|
+
* @package elfinder
|
|
44
|
+
* @author Naoki Sawada
|
|
45
|
+
* @license New BSD
|
|
46
|
+
*/
|
|
47
|
+
class elFinderPluginSanitizer extends elFinderPlugin
|
|
48
|
+
{
|
|
49
|
+
private $replaced = array();
|
|
50
|
+
private $keyMap = array(
|
|
51
|
+
'ls' => 'intersect',
|
|
52
|
+
'upload' => 'renames',
|
|
53
|
+
'mkdir' => array('name', 'dirs')
|
|
54
|
+
);
|
|
55
|
+
|
|
56
|
+
public function __construct($opts)
|
|
57
|
+
{
|
|
58
|
+
$defaults = array(
|
|
59
|
+
'enable' => true, // For control by volume driver
|
|
60
|
+
'targets' => array('\\', '/', ':', '*', '?', '"', '<', '>', '|'), // target chars
|
|
61
|
+
'replace' => '_', // replace to this
|
|
62
|
+
'callBack' => null // Or callable sanitize function
|
|
63
|
+
);
|
|
64
|
+
$this->opts = array_merge($defaults, $opts);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
public function cmdPreprocess($cmd, &$args, $elfinder, $volume)
|
|
68
|
+
{
|
|
69
|
+
$opts = $this->getCurrentOpts($volume);
|
|
70
|
+
if (!$opts['enable']) {
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
$this->replaced[$cmd] = array();
|
|
74
|
+
$key = (isset($this->keyMap[$cmd])) ? $this->keyMap[$cmd] : 'name';
|
|
75
|
+
|
|
76
|
+
if (is_array($key)) {
|
|
77
|
+
$keys = $key;
|
|
78
|
+
} else {
|
|
79
|
+
$keys = array($key);
|
|
80
|
+
}
|
|
81
|
+
foreach ($keys as $key) {
|
|
82
|
+
if (isset($args[$key])) {
|
|
83
|
+
if (is_array($args[$key])) {
|
|
84
|
+
foreach ($args[$key] as $i => $name) {
|
|
85
|
+
if ($cmd === 'mkdir' && $key === 'dirs') {
|
|
86
|
+
// $name need '/' as prefix see #2607
|
|
87
|
+
$name = '/' . ltrim($name, '/');
|
|
88
|
+
$_names = explode('/', $name);
|
|
89
|
+
$_res = array();
|
|
90
|
+
foreach ($_names as $_name) {
|
|
91
|
+
$_res[] = $this->sanitizeFileName($_name, $opts);
|
|
92
|
+
}
|
|
93
|
+
$this->replaced[$cmd][$name] = $args[$key][$i] = join('/', $_res);
|
|
94
|
+
} else {
|
|
95
|
+
$this->replaced[$cmd][$name] = $args[$key][$i] = $this->sanitizeFileName($name, $opts);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
} else if ($args[$key] !== '') {
|
|
99
|
+
$name = $args[$key];
|
|
100
|
+
$this->replaced[$cmd][$name] = $args[$key] = $this->sanitizeFileName($name, $opts);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
if ($cmd === 'ls' || $cmd === 'mkdir') {
|
|
105
|
+
if (!empty($this->replaced[$cmd])) {
|
|
106
|
+
// un-regist for legacy settings
|
|
107
|
+
$elfinder->unbind($cmd, array($this, 'cmdPostprocess'));
|
|
108
|
+
$elfinder->bind($cmd, array($this, 'cmdPostprocess'));
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return true;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
public function cmdPostprocess($cmd, &$result, $args, $elfinder, $volume)
|
|
115
|
+
{
|
|
116
|
+
if ($cmd === 'ls') {
|
|
117
|
+
if (!empty($result['list']) && !empty($this->replaced['ls'])) {
|
|
118
|
+
foreach ($result['list'] as $hash => $name) {
|
|
119
|
+
if ($keys = array_keys($this->replaced['ls'], $name)) {
|
|
120
|
+
if (count($keys) === 1) {
|
|
121
|
+
$result['list'][$hash] = $keys[0];
|
|
122
|
+
} else {
|
|
123
|
+
$result['list'][$hash] = $keys;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
} else if ($cmd === 'mkdir') {
|
|
129
|
+
if (!empty($result['hashes']) && !empty($this->replaced['mkdir'])) {
|
|
130
|
+
foreach ($result['hashes'] as $name => $hash) {
|
|
131
|
+
if ($keys = array_keys($this->replaced['mkdir'], $name)) {
|
|
132
|
+
$result['hashes'][$keys[0]] = $hash;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// NOTE: $thash is directory hash so it unneed to process at here
|
|
140
|
+
public function onUpLoadPreSave(&$thash, &$name, $src, $elfinder, $volume)
|
|
141
|
+
{
|
|
142
|
+
$opts = $this->getCurrentOpts($volume);
|
|
143
|
+
if (!$opts['enable']) {
|
|
144
|
+
return false;
|
|
145
|
+
}
|
|
146
|
+
$name = $this->sanitizeFileName($name, $opts);
|
|
147
|
+
return true;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
protected function sanitizeFileName($filename, $opts)
|
|
151
|
+
{
|
|
152
|
+
if (!empty($opts['callBack']) && is_callable($opts['callBack'])) {
|
|
153
|
+
return call_user_func_array($opts['callBack'], array($filename, $opts));
|
|
154
|
+
}
|
|
155
|
+
return str_replace($opts['targets'], $opts['replace'], $filename);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
Binary file
|