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.
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,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
+ }