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,432 @@
1
+ <?php
2
+
3
+ /**
4
+ * elFinder Plugin Watermark
5
+ * Print watermark on file upload.
6
+ * ex. binding, configure on connector options
7
+ * $opts = array(
8
+ * 'bind' => array(
9
+ * 'upload.presave' => array(
10
+ * 'Plugin.Watermark.onUpLoadPreSave'
11
+ * )
12
+ * ),
13
+ * // global configure (optional)
14
+ * 'plugin' => array(
15
+ * 'Watermark' => array(
16
+ * 'enable' => true, // For control by volume driver
17
+ * 'source' => 'logo.png', // Path to Water mark image
18
+ * 'ratio' => 0.2, // Ratio to original image (ratio > 0 and ratio <= 1)
19
+ * 'position' => 'RB', // Position L(eft)/C(enter)/R(ight) and T(op)/M(edium)/B(ottom)
20
+ * 'marginX' => 5, // Margin horizontal pixel
21
+ * 'marginY' => 5, // Margin vertical pixel
22
+ * 'quality' => 95, // JPEG image save quality
23
+ * 'transparency' => 70, // Water mark image transparency ( other than PNG )
24
+ * 'targetType' => IMG_GIF|IMG_JPG|IMG_PNG|IMG_WBMP, // Target image formats ( bit-field )
25
+ * 'targetMinPixel' => 200, // Target image minimum pixel size
26
+ * 'interlace' => IMG_GIF|IMG_JPG, // Set interlacebit image formats ( bit-field )
27
+ * 'offDropWith' => null, // Enabled by default. To disable it if it is dropped with pressing the meta key
28
+ * // Alt: 8, Ctrl: 4, Meta: 2, Shift: 1 - sum of each value
29
+ * // In case of using any key, specify it as an array
30
+ * 'onDropWith' => null // Disabled by default. To enable it if it is dropped with pressing the meta key
31
+ * // Alt: 8, Ctrl: 4, Meta: 2, Shift: 1 - sum of each value
32
+ * // In case of using any key, specify it as an array
33
+ * )
34
+ * ),
35
+ * // each volume configure (optional)
36
+ * 'roots' => array(
37
+ * array(
38
+ * 'driver' => 'LocalFileSystem',
39
+ * 'path' => '/path/to/files/',
40
+ * 'URL' => 'http://localhost/to/files/'
41
+ * 'plugin' => array(
42
+ * 'Watermark' => array(
43
+ * 'enable' => true, // For control by volume driver
44
+ * 'source' => 'logo.png', // Path to Water mark image
45
+ * 'ratio' => 0.2, // Ratio to original image (ratio > 0 and ratio <= 1)
46
+ * 'position' => 'RB', // Position L(eft)/C(enter)/R(ight) and T(op)/M(edium)/B(ottom)
47
+ * 'marginX' => 5, // Margin horizontal pixel
48
+ * 'marginY' => 5, // Margin vertical pixel
49
+ * 'quality' => 95, // JPEG image save quality
50
+ * 'transparency' => 70, // Water mark image transparency ( other than PNG )
51
+ * 'targetType' => IMG_GIF|IMG_JPG|IMG_PNG|IMG_WBMP, // Target image formats ( bit-field )
52
+ * 'targetMinPixel' => 200, // Target image minimum pixel size
53
+ * 'interlace' => IMG_GIF|IMG_JPG, // Set interlacebit image formats ( bit-field )
54
+ * 'offDropWith' => null, // Enabled by default. To disable it if it is dropped with pressing the meta key
55
+ * // Alt: 8, Ctrl: 4, Meta: 2, Shift: 1 - sum of each value
56
+ * // In case of using any key, specify it as an array
57
+ * 'onDropWith' => null // Disabled by default. To enable it if it is dropped with pressing the meta key
58
+ * // Alt: 8, Ctrl: 4, Meta: 2, Shift: 1 - sum of each value
59
+ * // In case of using any key, specify it as an array
60
+ * )
61
+ * )
62
+ * )
63
+ * )
64
+ * );
65
+ *
66
+ * @package elfinder
67
+ * @author Naoki Sawada
68
+ * @license New BSD
69
+ */
70
+ class elFinderPluginWatermark extends elFinderPlugin
71
+ {
72
+
73
+ private $watermarkImgInfo = null;
74
+
75
+ public function __construct($opts)
76
+ {
77
+ $defaults = array(
78
+ 'enable' => true, // For control by volume driver
79
+ 'source' => 'logo.png', // Path to Water mark image
80
+ 'ratio' => 0.2, // Ratio to original image (ratio > 0 and ratio <= 1)
81
+ 'position' => 'RB', // Position L(eft)/C(enter)/R(ight) and T(op)/M(edium)/B(ottom)
82
+ 'marginX' => 5, // Margin horizontal pixel
83
+ 'marginY' => 5, // Margin vertical pixel
84
+ 'quality' => 95, // JPEG image save quality
85
+ 'transparency' => 70, // Water mark image transparency ( other than PNG )
86
+ 'targetType' => IMG_GIF | IMG_JPG | IMG_PNG | IMG_WBMP, // Target image formats ( bit-field )
87
+ 'targetMinPixel' => 200, // Target image minimum pixel size
88
+ 'interlace' => IMG_GIF | IMG_JPG, // Set interlacebit image formats ( bit-field )
89
+ 'offDropWith' => null, // To disable it if it is dropped with pressing the meta key
90
+ // Alt: 8, Ctrl: 4, Meta: 2, Shift: 1 - sum of each value
91
+ // In case of using any key, specify it as an array
92
+ 'marginRight' => 0, // Deprecated - marginX should be used
93
+ 'marginBottom' => 0, // Deprecated - marginY should be used
94
+ 'disableWithContentSaveId' => true // Disable on URL upload with post data "contentSaveId"
95
+ );
96
+
97
+ $this->opts = array_merge($defaults, $opts);
98
+
99
+ }
100
+
101
+ public function onUpLoadPreSave(&$thash, &$name, $src, $elfinder, $volume)
102
+ {
103
+ if (!$src) {
104
+ return false;
105
+ }
106
+
107
+ $opts = $this->getCurrentOpts($volume);
108
+
109
+ if (!$this->iaEnabled($opts, $elfinder)) {
110
+ return false;
111
+ }
112
+
113
+ $imageType = null;
114
+ $srcImgInfo = null;
115
+ if (extension_loaded('fileinfo') && function_exists('mime_content_type')) {
116
+ $mime = mime_content_type($src);
117
+ if (substr($mime, 0, 5) !== 'image') {
118
+ return false;
119
+ }
120
+ }
121
+ if (extension_loaded('exif') && function_exists('exif_imagetype')) {
122
+ $imageType = exif_imagetype($src);
123
+ if ($imageType === false) {
124
+ return false;
125
+ }
126
+ } else {
127
+ $srcImgInfo = getimagesize($src);
128
+ if ($srcImgInfo === false) {
129
+ return false;
130
+ }
131
+ $imageType = $srcImgInfo[2];
132
+ }
133
+
134
+ // check target image type
135
+ $imgTypes = array(
136
+ IMAGETYPE_GIF => IMG_GIF,
137
+ IMAGETYPE_JPEG => IMG_JPEG,
138
+ IMAGETYPE_PNG => IMG_PNG,
139
+ IMAGETYPE_BMP => IMG_WBMP,
140
+ IMAGETYPE_WBMP => IMG_WBMP
141
+ );
142
+ if (!isset($imgTypes[$imageType]) || !($opts['targetType'] & $imgTypes[$imageType])) {
143
+ return false;
144
+ }
145
+
146
+ // check Animation Gif
147
+ if ($imageType === IMAGETYPE_GIF && elFinder::isAnimationGif($src)) {
148
+ return false;
149
+ }
150
+ // check Animation Png
151
+ if ($imageType === IMAGETYPE_PNG && elFinder::isAnimationPng($src)) {
152
+ return false;
153
+ }
154
+ // check water mark image
155
+ if (!file_exists($opts['source'])) {
156
+ $opts['source'] = dirname(__FILE__) . "/" . $opts['source'];
157
+ }
158
+ if (is_readable($opts['source'])) {
159
+ $watermarkImgInfo = getimagesize($opts['source']);
160
+ if (!$watermarkImgInfo) {
161
+ return false;
162
+ }
163
+ } else {
164
+ return false;
165
+ }
166
+
167
+ if (!$srcImgInfo) {
168
+ $srcImgInfo = getimagesize($src);
169
+ }
170
+
171
+ $watermark = $opts['source'];
172
+ $quality = $opts['quality'];
173
+ $transparency = $opts['transparency'];
174
+
175
+ // check target image size
176
+ if ($opts['targetMinPixel'] > 0 && $opts['targetMinPixel'] > min($srcImgInfo[0], $srcImgInfo[1])) {
177
+ return false;
178
+ }
179
+
180
+ $watermark_width = $watermarkImgInfo[0];
181
+ $watermark_height = $watermarkImgInfo[1];
182
+
183
+ // Specified as a ratio to the image size
184
+ if ($opts['ratio'] && $opts['ratio'] > 0 && $opts['ratio'] <= 1) {
185
+ $maxW = $srcImgInfo[0] * $opts['ratio'] - ($opts['marginX'] * 2);
186
+ $maxH = $srcImgInfo[1] * $opts['ratio'] - ($opts['marginY'] * 2);
187
+ $dx = $dy = 0;
188
+ if (($maxW >= $watermarkImgInfo[0] && $maxH >= $watermarkImgInfo[0]) || ($maxW <= $watermarkImgInfo[0] && $maxH <= $watermarkImgInfo[0])) {
189
+ $dx = abs($srcImgInfo[0] - $watermarkImgInfo[0]);
190
+ $dy = abs($srcImgInfo[1] - $watermarkImgInfo[1]);
191
+ } else if ($maxW < $watermarkImgInfo[0]) {
192
+ $dx = -1;
193
+ } else {
194
+ $dy = -1;
195
+ }
196
+ if ($dx < $dy) {
197
+ $ww = $maxW;
198
+ $wh = $watermarkImgInfo[1] * ($ww / $watermarkImgInfo[0]);
199
+ } else {
200
+ $wh = $maxH;
201
+ $ww = $watermarkImgInfo[0] * ($wh / $watermarkImgInfo[1]);
202
+ }
203
+ $watermarkImgInfo[0] = $ww;
204
+ $watermarkImgInfo[1] = $wh;
205
+ } else {
206
+ $opts['ratio'] = null;
207
+ }
208
+
209
+ $opts['position'] = strtoupper($opts['position']);
210
+
211
+ // Set vertical position
212
+ if (strpos($opts['position'], 'T') !== false) {
213
+ // Top
214
+ $dest_x = $opts['marginX'];
215
+ } else if (strpos($opts['position'], 'M') !== false) {
216
+ // Middle
217
+ $dest_x = ($srcImgInfo[0] - $watermarkImgInfo[0]) / 2;
218
+ } else {
219
+ // Bottom
220
+ $dest_x = $srcImgInfo[0] - $watermarkImgInfo[0] - max($opts['marginBottom'], $opts['marginX']);
221
+ }
222
+
223
+ // Set horizontal position
224
+ if (strpos($opts['position'], 'L') !== false) {
225
+ // Left
226
+ $dest_y = $opts['marginY'];
227
+ } else if (strpos($opts['position'], 'C') !== false) {
228
+ // Middle
229
+ $dest_y = ($srcImgInfo[1] - $watermarkImgInfo[1]) / 2;
230
+ } else {
231
+ // Right
232
+ $dest_y = $srcImgInfo[1] - $watermarkImgInfo[1] - max($opts['marginRight'], $opts['marginY']);
233
+ }
234
+
235
+
236
+ // check interlace
237
+ $opts['interlace'] = ($opts['interlace'] & $imgTypes[$imageType]);
238
+
239
+ // Repeated use of Imagick::compositeImage() may cause PHP to hang, so disable it
240
+ //if (class_exists('Imagick', false)) {
241
+ // return $this->watermarkPrint_imagick($src, $watermark, $dest_x, $dest_y, $quality, $transparency, $watermarkImgInfo, $opts);
242
+ //} else {
243
+ elFinder::expandMemoryForGD(array($watermarkImgInfo, $srcImgInfo));
244
+ return $this->watermarkPrint_gd($src, $watermark, $dest_x, $dest_y, $quality, $transparency, $watermarkImgInfo, $srcImgInfo, $opts);
245
+ //}
246
+ }
247
+
248
+ private function watermarkPrint_imagick($src, $watermarkSrc, $dest_x, $dest_y, $quality, $transparency, $watermarkImgInfo, $opts)
249
+ {
250
+
251
+ try {
252
+
253
+ // Open the original image
254
+ $img = new Imagick($src);
255
+
256
+ // Open the watermark
257
+ $watermark = new Imagick($watermarkSrc);
258
+
259
+ // zoom
260
+ if ($opts['ratio']) {
261
+ $watermark->scaleImage($watermarkImgInfo[0], $watermarkImgInfo[1]);
262
+ }
263
+
264
+ // Set transparency
265
+ if (strtoupper($watermark->getImageFormat()) !== 'PNG') {
266
+ $watermark->setImageOpacity($transparency / 100);
267
+ }
268
+
269
+ // Overlay the watermark on the original image
270
+ $img->compositeImage($watermark, imagick::COMPOSITE_OVER, $dest_x, $dest_y);
271
+
272
+ // Set quality
273
+ if (strtoupper($img->getImageFormat()) === 'JPEG') {
274
+ $img->setImageCompression(imagick::COMPRESSION_JPEG);
275
+ $img->setCompressionQuality($quality);
276
+ }
277
+
278
+ // set interlace
279
+ $opts['interlace'] && $img->setInterlaceScheme(Imagick::INTERLACE_PLANE);
280
+
281
+ $result = $img->writeImage($src);
282
+
283
+ $img->clear();
284
+ $img->destroy();
285
+ $watermark->clear();
286
+ $watermark->destroy();
287
+
288
+ return $result ? true : false;
289
+ } catch (Exception $e) {
290
+ $ermsg = $e->getMessage();
291
+ $ermsg && trigger_error($ermsg);
292
+ return false;
293
+ }
294
+ }
295
+
296
+ private function watermarkPrint_gd($src, $watermark, $dest_x, $dest_y, $quality, $transparency, $watermarkImgInfo, $srcImgInfo, $opts)
297
+ {
298
+
299
+ $watermark_width = $watermarkImgInfo[0];
300
+ $watermark_height = $watermarkImgInfo[1];
301
+
302
+ $ermsg = '';
303
+ switch ($watermarkImgInfo['mime']) {
304
+ case 'image/gif':
305
+ if (imagetypes() & IMG_GIF) {
306
+ $oWatermarkImg = imagecreatefromgif($watermark);
307
+ } else {
308
+ $ermsg = 'GIF images are not supported as watermark image';
309
+ }
310
+ break;
311
+ case 'image/jpeg':
312
+ if (imagetypes() & IMG_JPG) {
313
+ $oWatermarkImg = imagecreatefromjpeg($watermark);
314
+ } else {
315
+ $ermsg = 'JPEG images are not supported as watermark image';
316
+ }
317
+ break;
318
+ case 'image/png':
319
+ if (imagetypes() & IMG_PNG) {
320
+ $oWatermarkImg = imagecreatefrompng($watermark);
321
+ } else {
322
+ $ermsg = 'PNG images are not supported as watermark image';
323
+ }
324
+ break;
325
+ case 'image/wbmp':
326
+ if (imagetypes() & IMG_WBMP) {
327
+ $oWatermarkImg = imagecreatefromwbmp($watermark);
328
+ } else {
329
+ $ermsg = 'WBMP images are not supported as watermark image';
330
+ }
331
+ break;
332
+ default:
333
+ $oWatermarkImg = false;
334
+ $ermsg = $watermarkImgInfo['mime'] . ' images are not supported as watermark image';
335
+ break;
336
+ }
337
+
338
+
339
+ if (!$ermsg) {
340
+ // zoom
341
+ if ($opts['ratio']) {
342
+ $tmpImg = imagecreatetruecolor($watermarkImgInfo[0], $watermarkImgInfo[1]);
343
+ imagealphablending($tmpImg, false);
344
+ imagesavealpha($tmpImg, true);
345
+ imagecopyresampled($tmpImg, $oWatermarkImg, 0, 0, 0, 0, $watermarkImgInfo[0], $watermarkImgInfo[1], imagesx($oWatermarkImg), imagesy($oWatermarkImg));
346
+ imageDestroy($oWatermarkImg);
347
+ $oWatermarkImg = $tmpImg;
348
+ $tmpImg = null;
349
+ }
350
+
351
+ switch ($srcImgInfo['mime']) {
352
+ case 'image/gif':
353
+ if (imagetypes() & IMG_GIF) {
354
+ $oSrcImg = imagecreatefromgif($src);
355
+ } else {
356
+ $ermsg = 'GIF images are not supported as source image';
357
+ }
358
+ break;
359
+ case 'image/jpeg':
360
+ if (imagetypes() & IMG_JPG) {
361
+ $oSrcImg = imagecreatefromjpeg($src);
362
+ } else {
363
+ $ermsg = 'JPEG images are not supported as source image';
364
+ }
365
+ break;
366
+ case 'image/png':
367
+ if (imagetypes() & IMG_PNG) {
368
+ $oSrcImg = imagecreatefrompng($src);
369
+ } else {
370
+ $ermsg = 'PNG images are not supported as source image';
371
+ }
372
+ break;
373
+ case 'image/wbmp':
374
+ if (imagetypes() & IMG_WBMP) {
375
+ $oSrcImg = imagecreatefromwbmp($src);
376
+ } else {
377
+ $ermsg = 'WBMP images are not supported as source image';
378
+ }
379
+ break;
380
+ default:
381
+ $oSrcImg = false;
382
+ $ermsg = $srcImgInfo['mime'] . ' images are not supported as source image';
383
+ break;
384
+ }
385
+ }
386
+
387
+ if ($ermsg || false === $oSrcImg || false === $oWatermarkImg) {
388
+ $ermsg && trigger_error($ermsg);
389
+ return false;
390
+ }
391
+
392
+ if ($srcImgInfo['mime'] === 'image/png') {
393
+ if (function_exists('imagecolorallocatealpha')) {
394
+ $bg = imagecolorallocatealpha($oSrcImg, 255, 255, 255, 127);
395
+ imagefill($oSrcImg, 0, 0, $bg);
396
+ }
397
+ }
398
+
399
+ if ($watermarkImgInfo['mime'] === 'image/png') {
400
+ imagecopy($oSrcImg, $oWatermarkImg, $dest_x, $dest_y, 0, 0, $watermark_width, $watermark_height);
401
+ } else {
402
+ imagecopymerge($oSrcImg, $oWatermarkImg, $dest_x, $dest_y, 0, 0, $watermark_width, $watermark_height, $transparency);
403
+ }
404
+
405
+ // set interlace
406
+ $opts['interlace'] && imageinterlace($oSrcImg, true);
407
+
408
+ switch ($srcImgInfo['mime']) {
409
+ case 'image/gif':
410
+ imagegif($oSrcImg, $src);
411
+ break;
412
+ case 'image/jpeg':
413
+ imagejpeg($oSrcImg, $src, $quality);
414
+ break;
415
+ case 'image/png':
416
+ if (function_exists('imagesavealpha') && function_exists('imagealphablending')) {
417
+ imagealphablending($oSrcImg, false);
418
+ imagesavealpha($oSrcImg, true);
419
+ }
420
+ imagepng($oSrcImg, $src);
421
+ break;
422
+ case 'image/wbmp':
423
+ imagewbmp($oSrcImg, $src);
424
+ break;
425
+ }
426
+
427
+ imageDestroy($oSrcImg);
428
+ imageDestroy($oWatermarkImg);
429
+
430
+ return true;
431
+ }
432
+ }
@@ -0,0 +1,114 @@
1
+ <?php
2
+ /**
3
+ * This class describes elFinder plugin window remove tail dots.
4
+ * This plugin is automatically loaded on the Windows server
5
+ * and enabled in the LocalFileSystem driver.
6
+ */
7
+ class elFinderPluginWinRemoveTailDots extends elFinderPlugin
8
+ {
9
+ private $replaced = array();
10
+ private $keyMap = array(
11
+ 'ls' => 'intersect',
12
+ 'upload' => 'renames',
13
+ 'mkdir' => array('name', 'dirs')
14
+ );
15
+
16
+ public function __construct($opts)
17
+ {
18
+ $defaults = array(
19
+ 'enable' => false, // For control by volume driver
20
+ );
21
+
22
+ $this->opts = array_merge($defaults, $opts);
23
+ }
24
+
25
+ public function cmdPreprocess($cmd, &$args, $elfinder, $volume)
26
+ {
27
+ $opts = $this->getCurrentOpts($volume);
28
+ if (!$opts['enable']) {
29
+ return false;
30
+ }
31
+ $this->replaced[$cmd] = array();
32
+ $key = (isset($this->keyMap[$cmd])) ? $this->keyMap[$cmd] : 'name';
33
+
34
+ if (is_array($key)) {
35
+ $keys = $key;
36
+ } else {
37
+ $keys = array($key);
38
+ }
39
+ foreach ($keys as $key) {
40
+ if (isset($args[$key])) {
41
+ if (is_array($args[$key])) {
42
+ foreach ($args[$key] as $i => $name) {
43
+ if ($cmd === 'mkdir' && $key === 'dirs') {
44
+ // $name need '/' as prefix see #2607
45
+ $name = '/' . ltrim($name, '/');
46
+ $_names = explode('/', $name);
47
+ $_res = array();
48
+ foreach ($_names as $_name) {
49
+ $_res[] = $this->normalize($_name, $opts);
50
+ }
51
+ $this->replaced[$cmd][$name] = $args[$key][$i] = join('/', $_res);
52
+ } else {
53
+ $this->replaced[$cmd][$name] = $args[$key][$i] = $this->normalize($name, $opts);
54
+ }
55
+ }
56
+ } else if ($args[$key] !== '') {
57
+ $name = $args[$key];
58
+ $this->replaced[$cmd][$name] = $args[$key] = $this->normalize($name, $opts);
59
+ }
60
+ }
61
+ }
62
+ if ($cmd === 'ls' || $cmd === 'mkdir') {
63
+ if (!empty($this->replaced[$cmd])) {
64
+ // un-regist for legacy settings
65
+ $elfinder->unbind($cmd, array($this, 'cmdPostprocess'));
66
+ $elfinder->bind($cmd, array($this, 'cmdPostprocess'));
67
+ }
68
+ }
69
+ return true;
70
+ }
71
+
72
+ public function cmdPostprocess($cmd, &$result, $args, $elfinder, $volume)
73
+ {
74
+ if ($cmd === 'ls') {
75
+ if (!empty($result['list']) && !empty($this->replaced['ls'])) {
76
+ foreach ($result['list'] as $hash => $name) {
77
+ if ($keys = array_keys($this->replaced['ls'], $name)) {
78
+ if (count($keys) === 1) {
79
+ $result['list'][$hash] = $keys[0];
80
+ } else {
81
+ $result['list'][$hash] = $keys;
82
+ }
83
+ }
84
+ }
85
+ }
86
+ } else if ($cmd === 'mkdir') {
87
+ if (!empty($result['hashes']) && !empty($this->replaced['mkdir'])) {
88
+ foreach ($result['hashes'] as $name => $hash) {
89
+ if ($keys = array_keys($this->replaced['mkdir'], $name)) {
90
+ $result['hashes'][$keys[0]] = $hash;
91
+ }
92
+ }
93
+ }
94
+ }
95
+ }
96
+
97
+ // NOTE: $thash is directory hash so it unneed to process at here
98
+ public function onUpLoadPreSave(&$thash, &$name, $src, $elfinder, $volume)
99
+ {
100
+ $opts = $this->getCurrentOpts($volume);
101
+ if (!$opts['enable']) {
102
+ return false;
103
+ }
104
+
105
+ $name = $this->normalize($name, $opts);
106
+ return true;
107
+ }
108
+
109
+ protected function normalize($str, $opts)
110
+ {
111
+ $str = rtrim($str, '.');
112
+ return $str;
113
+ }
114
+ } // END class elFinderPluginWinRemoveTailDots
@@ -0,0 +1,63 @@
1
+ #coding: utf-8
2
+ #--
3
+ # Copyright (c) 2022+ Damjan Rems
4
+ #
5
+ # Permission is hereby granted, free of charge, to any person obtaining
6
+ # a copy of this software and associated documentation files (the
7
+ # "Software"), to deal in the Software without restriction, including
8
+ # without limitation the rights to use, copy, modify, merge, publish,
9
+ # distribute, sublicense, and/or sell copies of the Software, and to
10
+ # permit persons to whom the Software is furnished to do so, subject to
11
+ # the following conditions:
12
+ #
13
+ # The above copyright notice and this permission notice shall be
14
+ # included in all copies or substantial portions of the Software.
15
+ #
16
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23
+ #++
24
+ ##########################################################################
25
+ #
26
+ ##########################################################################
27
+ #require 'el_finder/action'
28
+
29
+ class DcElfinderController < DcApplicationController
30
+
31
+ skip_before_action :verify_authenticity_token # otherwise it fails on post because of protect_from_forgery
32
+ ##########################################################################
33
+ # elfinder file manager connector
34
+ ##########################################################################
35
+ def connector
36
+ site = dc_get_site
37
+ home_dir = File.join('/',site.files_directory)
38
+ # it is convenient for admin to have access to root dir directly
39
+ if dc_user_has_role('admin') then home_dir = File.join('/',home_dir.split('/')[1])
40
+ else
41
+ user = DcUser.find(session[:user_id])
42
+ home_dir = File.join('/', user.root_folder) if user.respond_to?(:root_folder) and !user.root_folder.blank?
43
+ end
44
+
45
+ h, r = ElFinder::Connector.new(
46
+ :root => File.join(Rails.public_path, home_dir),
47
+ :url => home_dir,
48
+ :perms => { '.' => { :read => true, :write => true, :rm => true }},
49
+ :extractors => {
50
+ 'application/zip' => ['unzip', '-qq', '-o'], # Each argument will be shellescaped (also true for archivers)
51
+ 'application/x-gzip' => ['tar', '-xzf'],
52
+ },
53
+ :archivers => {
54
+ 'application/zip' => ['.zip', 'zip', '-qr9'], # Note first argument is archive extension
55
+ 'application/x-gzip' => ['.tgz', 'tar', '-czf'],
56
+ },
57
+ :user_roles => session[:user_roles]
58
+ ).run(params)
59
+ headers.merge!(h)
60
+ render (r.empty? ? {:nothing => true} : {:plain => r.to_json}), :layout => false
61
+ end
62
+
63
+ end