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,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