drg_elfinder 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (185) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +28 -0
  4. data/Rakefile +8 -0
  5. data/app/assets/config/drg_elfinder_manifest.js +1 -0
  6. data/app/assets/javascripts/drg_elfinder.js +15 -0
  7. data/app/assets/javascripts/elfinder/Changelog +1283 -0
  8. data/app/assets/javascripts/elfinder/LICENSE.md +15 -0
  9. data/app/assets/javascripts/elfinder/README.md +216 -0
  10. data/app/assets/javascripts/elfinder/bower.json +28 -0
  11. data/app/assets/javascripts/elfinder/composer.json +39 -0
  12. data/app/assets/javascripts/elfinder/css/elfinder.full.css +5350 -0
  13. data/app/assets/javascripts/elfinder/css/elfinder.min.css +9 -0
  14. data/app/assets/javascripts/elfinder/css/theme.css +430 -0
  15. data/app/assets/javascripts/elfinder/elfinder.html +74 -0
  16. data/app/assets/javascripts/elfinder/elfinder.legacy.html +94 -0
  17. data/app/assets/javascripts/elfinder/img/arrows-active.png +0 -0
  18. data/app/assets/javascripts/elfinder/img/arrows-normal.png +0 -0
  19. data/app/assets/javascripts/elfinder/img/crop.gif +0 -0
  20. data/app/assets/javascripts/elfinder/img/dialogs.png +0 -0
  21. data/app/assets/javascripts/elfinder/img/edit_aceeditor.png +0 -0
  22. data/app/assets/javascripts/elfinder/img/edit_ckeditor.png +0 -0
  23. data/app/assets/javascripts/elfinder/img/edit_ckeditor5.png +0 -0
  24. data/app/assets/javascripts/elfinder/img/edit_codemirror.png +0 -0
  25. data/app/assets/javascripts/elfinder/img/edit_creativecloud.png +0 -0
  26. data/app/assets/javascripts/elfinder/img/edit_onlineconvert.png +0 -0
  27. data/app/assets/javascripts/elfinder/img/edit_pixlreditor.png +0 -0
  28. data/app/assets/javascripts/elfinder/img/edit_pixlrexpress.png +0 -0
  29. data/app/assets/javascripts/elfinder/img/edit_simplemde.png +0 -0
  30. data/app/assets/javascripts/elfinder/img/edit_tinymce.png +0 -0
  31. data/app/assets/javascripts/elfinder/img/edit_tuiimgedit.png +0 -0
  32. data/app/assets/javascripts/elfinder/img/edit_zohooffice.png +0 -0
  33. data/app/assets/javascripts/elfinder/img/editor-icons.png +0 -0
  34. data/app/assets/javascripts/elfinder/img/icons-big.png +0 -0
  35. data/app/assets/javascripts/elfinder/img/icons-big.svg +1 -0
  36. data/app/assets/javascripts/elfinder/img/icons-small.png +0 -0
  37. data/app/assets/javascripts/elfinder/img/logo.png +0 -0
  38. data/app/assets/javascripts/elfinder/img/progress.gif +0 -0
  39. data/app/assets/javascripts/elfinder/img/quicklook-bg.png +0 -0
  40. data/app/assets/javascripts/elfinder/img/quicklook-icons.png +0 -0
  41. data/app/assets/javascripts/elfinder/img/resize.png +0 -0
  42. data/app/assets/javascripts/elfinder/img/spinner-mini.gif +0 -0
  43. data/app/assets/javascripts/elfinder/img/toolbar.png +0 -0
  44. data/app/assets/javascripts/elfinder/img/trashmesh.png +0 -0
  45. data/app/assets/javascripts/elfinder/img/tui-icon-a.svg +235 -0
  46. data/app/assets/javascripts/elfinder/img/tui-icon-b.svg +224 -0
  47. data/app/assets/javascripts/elfinder/img/tui-icon-c.svg +224 -0
  48. data/app/assets/javascripts/elfinder/img/tui-icon-d.svg +224 -0
  49. data/app/assets/javascripts/elfinder/img/ui-icons_ffffff_256x240.png +0 -0
  50. data/app/assets/javascripts/elfinder/img/volume_icon_box.png +0 -0
  51. data/app/assets/javascripts/elfinder/img/volume_icon_box.svg +1 -0
  52. data/app/assets/javascripts/elfinder/img/volume_icon_dropbox.png +0 -0
  53. data/app/assets/javascripts/elfinder/img/volume_icon_dropbox.svg +1 -0
  54. data/app/assets/javascripts/elfinder/img/volume_icon_ftp.png +0 -0
  55. data/app/assets/javascripts/elfinder/img/volume_icon_ftp.svg +1 -0
  56. data/app/assets/javascripts/elfinder/img/volume_icon_googledrive.png +0 -0
  57. data/app/assets/javascripts/elfinder/img/volume_icon_googledrive.svg +1 -0
  58. data/app/assets/javascripts/elfinder/img/volume_icon_local.png +0 -0
  59. data/app/assets/javascripts/elfinder/img/volume_icon_local.svg +1 -0
  60. data/app/assets/javascripts/elfinder/img/volume_icon_network.png +0 -0
  61. data/app/assets/javascripts/elfinder/img/volume_icon_network.svg +1 -0
  62. data/app/assets/javascripts/elfinder/img/volume_icon_onedrive.png +0 -0
  63. data/app/assets/javascripts/elfinder/img/volume_icon_onedrive.svg +1 -0
  64. data/app/assets/javascripts/elfinder/img/volume_icon_sql.png +0 -0
  65. data/app/assets/javascripts/elfinder/img/volume_icon_sql.svg +1 -0
  66. data/app/assets/javascripts/elfinder/img/volume_icon_trash.png +0 -0
  67. data/app/assets/javascripts/elfinder/img/volume_icon_trash.svg +1 -0
  68. data/app/assets/javascripts/elfinder/img/volume_icon_zip.png +0 -0
  69. data/app/assets/javascripts/elfinder/img/volume_icon_zip.svg +1 -0
  70. data/app/assets/javascripts/elfinder/js/elfinder.full.js +36019 -0
  71. data/app/assets/javascripts/elfinder/js/elfinder.min.js +25 -0
  72. data/app/assets/javascripts/elfinder/js/extras/editors.default.js +2643 -0
  73. data/app/assets/javascripts/elfinder/js/extras/editors.default.min.js +2 -0
  74. data/app/assets/javascripts/elfinder/js/extras/quicklook.googledocs.js +75 -0
  75. data/app/assets/javascripts/elfinder/js/extras/quicklook.googledocs.min.js +1 -0
  76. data/app/assets/javascripts/elfinder/js/i18n/elfinder.LANG.js +587 -0
  77. data/app/assets/javascripts/elfinder/js/i18n/elfinder.ar.js +580 -0
  78. data/app/assets/javascripts/elfinder/js/i18n/elfinder.bg.js +559 -0
  79. data/app/assets/javascripts/elfinder/js/i18n/elfinder.ca.js +375 -0
  80. data/app/assets/javascripts/elfinder/js/i18n/elfinder.cs.js +581 -0
  81. data/app/assets/javascripts/elfinder/js/i18n/elfinder.da.js +580 -0
  82. data/app/assets/javascripts/elfinder/js/i18n/elfinder.de.js +582 -0
  83. data/app/assets/javascripts/elfinder/js/i18n/elfinder.el.js +374 -0
  84. data/app/assets/javascripts/elfinder/js/i18n/elfinder.es.js +546 -0
  85. data/app/assets/javascripts/elfinder/js/i18n/elfinder.fa.js +580 -0
  86. data/app/assets/javascripts/elfinder/js/i18n/elfinder.fallback.js +11 -0
  87. data/app/assets/javascripts/elfinder/js/i18n/elfinder.fo.js +419 -0
  88. data/app/assets/javascripts/elfinder/js/i18n/elfinder.fr.js +578 -0
  89. data/app/assets/javascripts/elfinder/js/i18n/elfinder.fr_CA.js +580 -0
  90. data/app/assets/javascripts/elfinder/js/i18n/elfinder.he.js +375 -0
  91. data/app/assets/javascripts/elfinder/js/i18n/elfinder.hr.js +434 -0
  92. data/app/assets/javascripts/elfinder/js/i18n/elfinder.hu.js +580 -0
  93. data/app/assets/javascripts/elfinder/js/i18n/elfinder.id.js +498 -0
  94. data/app/assets/javascripts/elfinder/js/i18n/elfinder.it.js +552 -0
  95. data/app/assets/javascripts/elfinder/js/i18n/elfinder.ja.js +581 -0
  96. data/app/assets/javascripts/elfinder/js/i18n/elfinder.ko.js +582 -0
  97. data/app/assets/javascripts/elfinder/js/i18n/elfinder.nl.js +581 -0
  98. data/app/assets/javascripts/elfinder/js/i18n/elfinder.no.js +374 -0
  99. data/app/assets/javascripts/elfinder/js/i18n/elfinder.pl.js +580 -0
  100. data/app/assets/javascripts/elfinder/js/i18n/elfinder.pt_BR.js +580 -0
  101. data/app/assets/javascripts/elfinder/js/i18n/elfinder.ro.js +417 -0
  102. data/app/assets/javascripts/elfinder/js/i18n/elfinder.ru.js +582 -0
  103. data/app/assets/javascripts/elfinder/js/i18n/elfinder.si.js +537 -0
  104. data/app/assets/javascripts/elfinder/js/i18n/elfinder.sk.js +581 -0
  105. data/app/assets/javascripts/elfinder/js/i18n/elfinder.sl.js +374 -0
  106. data/app/assets/javascripts/elfinder/js/i18n/elfinder.sr.js +374 -0
  107. data/app/assets/javascripts/elfinder/js/i18n/elfinder.sv.js +375 -0
  108. data/app/assets/javascripts/elfinder/js/i18n/elfinder.tr.js +583 -0
  109. data/app/assets/javascripts/elfinder/js/i18n/elfinder.ug_CN.js +374 -0
  110. data/app/assets/javascripts/elfinder/js/i18n/elfinder.uk.js +580 -0
  111. data/app/assets/javascripts/elfinder/js/i18n/elfinder.vi.js +579 -0
  112. data/app/assets/javascripts/elfinder/js/i18n/elfinder.zh_CN.js +585 -0
  113. data/app/assets/javascripts/elfinder/js/i18n/elfinder.zh_TW.js +582 -0
  114. data/app/assets/javascripts/elfinder/js/i18n/help/cs.html.js +10 -0
  115. data/app/assets/javascripts/elfinder/js/i18n/help/de.html.js +15 -0
  116. data/app/assets/javascripts/elfinder/js/i18n/help/en.html.js +10 -0
  117. data/app/assets/javascripts/elfinder/js/i18n/help/es.html.js +10 -0
  118. data/app/assets/javascripts/elfinder/js/i18n/help/ja.html.js +10 -0
  119. data/app/assets/javascripts/elfinder/js/i18n/help/ko.html.js +10 -0
  120. data/app/assets/javascripts/elfinder/js/i18n/help/pl.html.js +10 -0
  121. data/app/assets/javascripts/elfinder/js/i18n/help/ru.html.js +10 -0
  122. data/app/assets/javascripts/elfinder/js/i18n/help/sk.html.js +10 -0
  123. data/app/assets/javascripts/elfinder/js/i18n/help/tr.html.js +10 -0
  124. data/app/assets/javascripts/elfinder/js/proxy/elFinderSupportVer1.js +408 -0
  125. data/app/assets/javascripts/elfinder/js/worker/calcfilehash.js +20 -0
  126. data/app/assets/javascripts/elfinder/js/worker/quicklook.tiff.js +7 -0
  127. data/app/assets/javascripts/elfinder/js/worker/quicklook.unzip.js +55 -0
  128. data/app/assets/javascripts/elfinder/main.default.js +175 -0
  129. data/app/assets/javascripts/elfinder/package.json +13 -0
  130. data/app/assets/javascripts/elfinder/php/MySQLStorage.sql +47 -0
  131. data/app/assets/javascripts/elfinder/php/autoload.php +56 -0
  132. data/app/assets/javascripts/elfinder/php/connector.maximal.php-dist +449 -0
  133. data/app/assets/javascripts/elfinder/php/connector.minimal.php-dist +180 -0
  134. data/app/assets/javascripts/elfinder/php/editors/OnlineConvert/editor.php +113 -0
  135. data/app/assets/javascripts/elfinder/php/editors/ZipArchive/editor.php +12 -0
  136. data/app/assets/javascripts/elfinder/php/editors/ZohoOffice/editor.php +206 -0
  137. data/app/assets/javascripts/elfinder/php/editors/editor.php +79 -0
  138. data/app/assets/javascripts/elfinder/php/elFinder.class.php +5401 -0
  139. data/app/assets/javascripts/elfinder/php/elFinderConnector.class.php +380 -0
  140. data/app/assets/javascripts/elfinder/php/elFinderFlysystemGoogleDriveNetmount.php +380 -0
  141. data/app/assets/javascripts/elfinder/php/elFinderPlugin.php +113 -0
  142. data/app/assets/javascripts/elfinder/php/elFinderSession.php +335 -0
  143. data/app/assets/javascripts/elfinder/php/elFinderSessionInterface.php +57 -0
  144. data/app/assets/javascripts/elfinder/php/elFinderVolumeBox.class.php +1972 -0
  145. data/app/assets/javascripts/elfinder/php/elFinderVolumeDriver.class.php +7651 -0
  146. data/app/assets/javascripts/elfinder/php/elFinderVolumeDropbox.class.php +1464 -0
  147. data/app/assets/javascripts/elfinder/php/elFinderVolumeDropbox2.class.php +1516 -0
  148. data/app/assets/javascripts/elfinder/php/elFinderVolumeFTP.class.php +1810 -0
  149. data/app/assets/javascripts/elfinder/php/elFinderVolumeGoogleDrive.class.php +2163 -0
  150. data/app/assets/javascripts/elfinder/php/elFinderVolumeGroup.class.php +315 -0
  151. data/app/assets/javascripts/elfinder/php/elFinderVolumeLocalFileSystem.class.php +1477 -0
  152. data/app/assets/javascripts/elfinder/php/elFinderVolumeMySQL.class.php +1022 -0
  153. data/app/assets/javascripts/elfinder/php/elFinderVolumeOneDrive.class.php +2131 -0
  154. data/app/assets/javascripts/elfinder/php/elFinderVolumeSFTPphpseclib.class.php +838 -0
  155. data/app/assets/javascripts/elfinder/php/elFinderVolumeTrash.class.php +51 -0
  156. data/app/assets/javascripts/elfinder/php/elFinderVolumeTrashMySQL.class.php +51 -0
  157. data/app/assets/javascripts/elfinder/php/libs/GdBmp.php +473 -0
  158. data/app/assets/javascripts/elfinder/php/mime.types +781 -0
  159. data/app/assets/javascripts/elfinder/php/plugins/AutoResize/plugin.php +151 -0
  160. data/app/assets/javascripts/elfinder/php/plugins/AutoRotate/plugin.php +148 -0
  161. data/app/assets/javascripts/elfinder/php/plugins/Normalizer/plugin.php +204 -0
  162. data/app/assets/javascripts/elfinder/php/plugins/Sanitizer/plugin.php +157 -0
  163. data/app/assets/javascripts/elfinder/php/plugins/Watermark/logo.png +0 -0
  164. data/app/assets/javascripts/elfinder/php/plugins/Watermark/plugin.php +432 -0
  165. data/app/assets/javascripts/elfinder/php/plugins/WinRemoveTailDots/plugin.php +114 -0
  166. data/app/assets/javascripts/elfinder/php/resources/image.png +0 -0
  167. data/app/assets/javascripts/elfinder/php/resources/video.png +0 -0
  168. data/app/assets/javascripts/elfinder/sounds/rm.wav +0 -0
  169. data/app/controllers/dc_elfinder_controller.rb +63 -0
  170. data/app/models/drgcms_form_fields/elfinder.rb +85 -0
  171. data/changelog.md +0 -0
  172. data/lib/drg_elfinder/engine.rb +5 -0
  173. data/lib/drg_elfinder/version.rb +3 -0
  174. data/lib/drg_elfinder.rb +9 -0
  175. data/lib/el_finder/action.rb +19 -0
  176. data/lib/el_finder/base64.rb +24 -0
  177. data/lib/el_finder/connector.rb +625 -0
  178. data/lib/el_finder/image.rb +33 -0
  179. data/lib/el_finder/mime_type.rb +86 -0
  180. data/lib/el_finder/pathname.rb +185 -0
  181. data/lib/el_finder/version.rb +5 -0
  182. data/lib/el_finder.rb +8 -0
  183. data/lib/patches/patch_for_elfinder.rb +115 -0
  184. data/lib/tasks/drg_elfinder_tasks.rake +10 -0
  185. metadata +245 -0
@@ -0,0 +1,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
+ }