PluginProbe ʕ •ᴥ•ʔ
Admin and Site Enhancements (ASE) / 8.2.2
Admin and Site Enhancements (ASE) v8.2.2
9.1.0 9.0.2 9.0.1 9.0.0 8.9.2 8.9.1 8.9.0 8.8.8 8.8.7 8.8.6 8.8.5 8.8.4 8.8.3 8.8.2 8.8.1 8.8.0 8.7.3 8.7.2 8.7.1 8.2.1 8.2.2 8.2.3 8.3.0 8.3.1 8.3.2 8.4.0 8.4.1 8.4.2 8.5.0 8.5.1 8.5.2 8.6.0 8.6.1 8.6.2 8.7.0 5.0.1 5.0.2 5.0.2.1 5.0.2.2 5.0.2.3 5.0.2.4 5.1.0 5.2.0 5.2.1 5.2.10 5.2.11 5.2.2 5.2.3 5.2.4 5.2.5 5.2.6 5.2.7 5.2.8 5.2.9 5.3.0 5.3.1 5.3.2 5.4.0 5.4.1 5.5.0 5.5.1 5.5.2 5.6.0 5.6.1 5.6.2 5.7.0 5.7.1 5.8.0 5.8.1 6.0.0 6.0.3 6.0.4 6.0.5 6.0.5.1 6.0.6 6.0.7 6.0.8.1 6.1.0 6.1.3 6.2.0 6.2.1 6.2.2 6.2.3 6.2.4 6.2.5 6.2.6 6.2.7 6.3.0 6.3.1 6.3.2 6.4.0 6.5.0 6.5.1 6.6.0 6.7.0 6.8.0 6.8.2 6.8.3 6.9.0 6.9.1 6.9.10 6.9.11 6.9.12 6.9.13.1 6.9.13.2 6.9.2 6.9.3 6.9.4 6.9.5 6.9.6 6.9.7 6.9.8 6.9.9 7.0.0 7.0.2 7.0.2.1 7.0.2.2 7.0.2.3 7.0.3 7.1.0 7.1.1 7.1.2 7.1.3 7.1.4 7.1.5 7.2.0 7.2.1 7.3.0 7.3.1 7.3.2 7.3.3 7.4.0 7.4.2 7.4.4 7.4.5 7.4.6 7.4.7 7.4.8 7.5.0 7.5.1 7.5.2 7.5.3 7.5.4 7.6.0 7.6.1 7.6.1.1 7.6.10 7.6.11 7.6.2 7.6.3 7.6.4 7.6.5 7.6.6 7.6.7 7.6.7.1 7.6.8 7.6.9 7.7.0 7.8.0 7.8.1 7.8.10 7.8.11 7.8.12 7.8.13 7.8.14 7.8.15 7.8.16 7.8.17 7.8.18 7.8.2 7.8.3 7.8.4 7.8.5 7.8.5.1 7.8.6 7.8.7 7.8.8 7.8.9 7.9.0 7.9.1 7.9.10 7.9.11 7.9.2 7.9.3 7.9.4 7.9.5 7.9.6 7.9.7 7.9.8 7.9.9 8.0.0 8.0.1 8.0.2 8.0.3 8.0.4 8.0.5 8.0.6 8.0.7 8.0.8 8.1.0 8.1.1 8.1.2 8.1.3 8.1.4 8.2.0 trunk 1.0.0 1.1.0 1.2.0 1.3.0 1.4.0 1.5.0 1.6.0 1.7.0 1.8.0 1.9.0 2.0.0 2.1.0 2.2.0 2.3.0 2.4.0 2.5.0 2.6.0 2.7.0 2.8.0 2.8.1 2.8.2 2.8.3 2.9.0 3.0.0 3.0.1 3.0.2 3.0.3 3.0.4 3.0.5 3.0.6 3.1.0 3.2.0 3.3.0 3.4.0 3.5.0 3.6.1 3.7.0 3.8.0 3.9.0 3.9.1 3.9.2 4.0.0 4.0.1 4.1.0 4.2.0 4.2.1 4.2.2 4.3.0 4.3.1 4.4.0 4.5.0 4.6.0 4.7.0 4.7.1 4.7.2 4.7.3 4.7.4 4.8.0 4.8.1 4.8.2 4.8.3 4.9.0 4.9.1 4.9.2 4.9.3 5.0.0
admin-site-enhancements / classes / class-svg-upload.php
admin-site-enhancements / classes Last commit date
class-activation.php 7 months ago class-admin-menu-organizer.php 7 months ago class-admin-menu-svg-icon-mask.php 7 months ago class-auto-publish-posts-with-missed-schedule.php 7 months ago class-avif-upload.php 7 months ago class-captcha-protection.php 7 months ago class-change-login-url.php 7 months ago class-cleanup-admin-bar.php 7 months ago class-common-methods.php 7 months ago class-content-duplication.php 7 months ago class-content-order.php 7 months ago class-custom-admin-footer-text.php 7 months ago class-custom-body-class.php 7 months ago class-custom-css.php 7 months ago class-custom-nav-menu-items-in-new-tab.php 7 months ago class-deactivation.php 7 months ago class-disable-author-archives.php 7 months ago class-disable-comments.php 7 months ago class-disable-dashboard-widgets.php 7 months ago class-disable-embeds.php 7 months ago class-disable-feeds.php 7 months ago class-disable-gutenberg.php 7 months ago class-disable-rest-api.php 7 months ago class-disable-smaller-components.php 7 months ago class-disable-updates.php 7 months ago class-disable-xml-rpc.php 7 months ago class-display-system-summary.php 7 months ago class-email-address-obfuscator.php 7 months ago class-email-delivery.php 7 months ago class-enhance-list-tables.php 7 months ago class-external-permalinks.php 7 months ago class-heartbeat-control.php 7 months ago class-hide-admin-bar.php 7 months ago class-hide-admin-notices.php 7 months ago class-image-sizes-panel.php 7 months ago class-image-upload-control.php 7 months ago class-insert-head-body-footer-code.php 7 months ago class-last-login-column.php 7 months ago class-limit-login-attempts.php 7 months ago class-login-id-type.php 7 months ago class-login-logout-menu.php 7 months ago class-maintenance-mode.php 7 months ago class-manage-ads-appads-txt.php 7 months ago class-manage-robots-txt.php 7 months ago class-media-replacement.php 7 months ago class-multiple-user-roles.php 7 months ago class-obfuscate-author-slugs.php 7 months ago class-open-external-links-in-new-tab.php 7 months ago class-password-protection.php 7 months ago class-redirect-after-login.php 7 months ago class-redirect-after-logout.php 7 months ago class-redirect-fourofour.php 7 months ago class-registration-date-column.php 7 months ago class-revisions-control.php 7 months ago class-search-engines-visibility.php 7 months ago class-settings-fields-render.php 7 months ago class-settings-sanitization.php 7 months ago class-settings-sections-fields.php 7 months ago class-show-custom-taxonomy-filters.php 7 months ago class-site-identity-on-login-page.php 7 months ago class-svg-upload.php 7 months ago class-various-admin-ui-enhancements.php 7 months ago class-view-admin-as-role.php 7 months ago class-wider-admin-menu.php 7 months ago class-wp-config-transformer.php 7 months ago
class-svg-upload.php
314 lines
1 <?php
2
3 namespace ASENHA\Classes;
4
5 /**
6 * Class for SVG Upload module
7 *
8 * @since 6.9.5
9 */
10 class SVG_Upload {
11
12 /**
13 * Add SVG mime type for media library uploads
14 *
15 * @link https://developer.wordpress.org/reference/hooks/upload_mimes/
16 * @since 2.6.0
17 */
18 public function add_svg_mime( $mimes ) {
19
20 global $roles_svg_upload_enabled;
21
22 $current_user = wp_get_current_user();
23 $current_user_roles = (array) $current_user->roles; // single dimensional array of role slugs
24
25 if ( count( $roles_svg_upload_enabled ) > 0 ) {
26
27 // Add mime type for user roles set to enable SVG upload
28 foreach ( $current_user_roles as $role ) {
29 if ( in_array( $role, $roles_svg_upload_enabled ) ) {
30 $mimes['svg'] = 'image/svg+xml';
31 }
32 }
33
34 }
35
36 return $mimes;
37
38 }
39
40 /**
41 * Check and confirm if the real file type is indeed SVG
42 *
43 * @link https://developer.wordpress.org/reference/functions/wp_check_filetype_and_ext/
44 * @since 2.6.0
45 */
46 public function confirm_file_type_is_svg( $filetypes_extensions, $file, $filename, $mimes ) {
47
48 global $roles_svg_upload_enabled;
49
50 $current_user = wp_get_current_user();
51 $current_user_roles = (array) $current_user->roles; // single dimensional array of role slugs
52
53 if ( count( $roles_svg_upload_enabled ) > 0 ) {
54
55 // Check file extension
56 if ( substr( $filename, -4 ) == '.svg' ) {
57
58 // Add mime type for user roles set to enable SVG upload
59 foreach ( $current_user_roles as $role ) {
60 if ( in_array( $role, $roles_svg_upload_enabled ) ) {
61 $filetypes_extensions['type'] = 'image/svg+xml';
62 $filetypes_extensions['ext'] = 'svg';
63 }
64 }
65
66 }
67
68 }
69
70 return $filetypes_extensions;
71
72 }
73
74 /**
75 * Sanitize the SVG file and maybe allow upload based on the result
76 *
77 * @since 2.6.0
78 */
79 public function sanitize_and_maybe_allow_svg_upload( $file ) {
80 if ( ! isset( $file['tmp_name'] ) ) {
81 return $file;
82 }
83
84 $file_tmp_name = $file['tmp_name']; // full path
85 $file_name = isset( $file['name'] ) ? $file['name'] : '';
86 $file_type_ext = wp_check_filetype_and_ext( $file_tmp_name, $file_name );
87 $file_type = ! empty( $file_type_ext['type'] ) ? $file_type_ext['type'] : '';
88
89 if ( 'image/svg+xml' === $file_type ) {
90 $original_svg = file_get_contents( $file_tmp_name );
91
92 $sanitizer = $this->get_svg_sanitizer();
93 $sanitized_svg = $sanitizer->sanitize( $original_svg ); // boolean
94
95 if ( false === $sanitized_svg ) {
96
97 $file['error'] = 'This SVG file could not be sanitized, so, was not uploaded for security reasons.';
98
99 }
100
101 file_put_contents( $file_tmp_name, $sanitized_svg );
102 }
103
104 return $file;
105 }
106
107 /**
108 * Sanitize SVG upload via xmlrpc.php
109 *
110 * @link https://developer.wordpress.org/reference/hooks/xmlrpc_prepare_media_item/
111 * @since 7.9.8
112 */
113 public function sanitize_xmlrpc_svg_upload( $_media_item, $media_item ) {
114 if ( is_object( $media_item ) ) {
115 if ( property_exists( $media_item, 'ID' ) ) {
116 $file_path = get_attached_file( $media_item->ID );
117 $original_svg = file_get_contents( $file_path );
118
119 $sanitizer = $this->get_svg_sanitizer();
120 $sanitized_svg = $sanitizer->sanitize( $original_svg ); // boolean
121
122 if ( false !== $sanitized_svg ) {
123 // Sanitization was a success, let's write the result back to the file
124 file_put_contents( $file_path, $sanitized_svg );
125 }
126 }
127 }
128
129 return $_media_item;
130 }
131
132 /**
133 * Sanitize a file after it is added to the media library, e.g. via REST API POST request
134 *
135 * @since 7.5.2
136 */
137 public function sanitize_after_upload( $attachment, $request, $creating ) {
138 // Let's sanitize SVG upon creation/insertion in the media library.
139 if ( $creating ) {
140 if ( $attachment instanceof WP_Post ) {
141 $file_path = get_attached_file( $attachment->ID );
142 $original_svg = file_get_contents( $file_path );
143
144 $sanitizer = $this->get_svg_sanitizer();
145 $sanitized_svg = $sanitizer->sanitize( $original_svg ); // boolean
146
147 if ( false !== $sanitized_svg ) {
148 // Sanitization was a success, let's write the result back to the file
149 file_put_contents( $file_path, $sanitized_svg );
150 }
151 }
152 }
153 }
154
155 /**
156 * Get sanitizer object
157 *
158 * @since 7.5.2
159 */
160 public function get_svg_sanitizer() {
161 if ( ! class_exists( '\enshrined\svgSanitize\Sanitizer' ) ) {
162 // Load sanitizer library - https://github.com/darylldoyle/svg-sanitizer
163 require_once ASENHA_PATH . 'vendor/enshrined/svg-sanitize/src/data/AttributeInterface.php';
164 require_once ASENHA_PATH . 'vendor/enshrined/svg-sanitize/src/data/TagInterface.php';
165 require_once ASENHA_PATH . 'vendor/enshrined/svg-sanitize/src/data/AllowedAttributes.php';
166 require_once ASENHA_PATH . 'vendor/enshrined/svg-sanitize/src/data/AllowedTags.php';
167 require_once ASENHA_PATH . 'vendor/enshrined/svg-sanitize/src/data/XPath.php';
168 require_once ASENHA_PATH . 'vendor/enshrined/svg-sanitize/src/ElementReference/Resolver.php';
169 require_once ASENHA_PATH . 'vendor/enshrined/svg-sanitize/src/ElementReference/Subject.php';
170 require_once ASENHA_PATH . 'vendor/enshrined/svg-sanitize/src/ElementReference/Usage.php';
171 require_once ASENHA_PATH . 'vendor/enshrined/svg-sanitize/src/Exceptions/NestingException.php';
172 require_once ASENHA_PATH . 'vendor/enshrined/svg-sanitize/src/Helper.php';
173 require_once ASENHA_PATH . 'vendor/enshrined/svg-sanitize/src/Sanitizer.php';
174 }
175
176 // $sanitizer = new Sanitizer();
177 $sanitizer = new \enshrined\svgSanitize\Sanitizer();
178
179 return $sanitizer;
180 }
181
182 /**
183 * Generate metadata for the svg attachment
184 *
185 * @link https://developer.wordpress.org/reference/functions/wp_generate_attachment_metadata/
186 * @since 2.6.0
187 */
188 public function generate_svg_metadata( $metadata, $attachment_id, $context ) {
189
190 if ( get_post_mime_type( $attachment_id ) == 'image/svg+xml' ) {
191
192 // Get SVG dimensions
193 $svg_path = get_attached_file( $attachment_id );
194 $svg = simplexml_load_file( $svg_path );
195 $width = 0;
196 $height = 0;
197
198 if ( $svg ) {
199
200 $attributes = $svg->attributes();
201 if ( isset( $attributes->width, $attributes->height ) ) {
202 $width = intval( floatval( $attributes->width ) );
203 $height = intval( floatval( $attributes->height ) );
204 } elseif ( isset( $attributes->viewBox ) ) {
205 $sizes = explode( ' ', $attributes->viewBox );
206 if ( isset( $sizes[2], $sizes[3] ) ) {
207 $width = intval( floatval( $sizes[2] ) );
208 $height = intval( floatval( $sizes[3] ) );
209 }
210 }
211
212 }
213
214 $metadata['width'] = $width;
215 $metadata['height'] = $height;
216
217 // Get SVG filename
218 $svg_url = wp_get_original_image_url( $attachment_id );
219 $svg_url_path = str_replace( wp_upload_dir()['baseurl'] .'/' , '', $svg_url );
220 $metadata['file'] = $svg_url_path;
221
222 }
223
224 return $metadata;
225
226 }
227
228 /**
229 * Remove responsive image attributes, i.e. srcset attributes, from SVG images HTML
230 * This helps ensure SVGs are displayed properly on the frontend
231 *
232 * @link https://plugins.trac.wordpress.org/browser/svg-support/tags/2.5.7/functions/attachment.php#L282
233 * @since 7.3.0
234 */
235 public function disable_svg_srcset( $sources ) {
236 $first_element = reset( $sources );
237
238 if ( isset( $first_element ) && ! empty( $first_element['url'] ) ) {
239 $extension = pathinfo( reset($sources)['url'], PATHINFO_EXTENSION );
240
241 if ( 'svg' === $extension ) {
242 $sources = array(); // return empty array
243 return $sources;
244 } else {
245 return $sources;
246 }
247 } else {
248 return $sources;
249 }
250 }
251
252 /**
253 * Remove responsive image attributes, i.e. srcset attributes, from SVG images HTML
254 * This helps ensure SVGs are displayed properly on the frontend
255 *
256 * @link https://gist.github.com/ericvalois/5b1e161c127632a1ace7d65ce1363e69
257 * @since 7.3.0
258 */
259 public function remove_svg_responsive_image_attr( string $sizes, $size, $image_src = null ) {
260 $explode = explode( '.', $image_src );
261 $extension = end( $explode );
262
263 if( 'svg' === $extension ){
264 $sizes = '';
265 }
266
267 return $sizes;
268 }
269
270 /**
271 * Return svg file URL to show preview in media library
272 *
273 * @link https://developer.wordpress.org/reference/hooks/wp_ajax_action/
274 * @link https://developer.wordpress.org/reference/functions/wp_get_attachment_url/
275 * @since 2.6.0
276 */
277 public function get_svg_attachment_url() {
278
279 $attachment_url = '';
280 $attachment_id = isset( $_REQUEST['attachmentID'] ) ? $_REQUEST['attachmentID'] : '';
281
282 // Check response mime type
283 if ( $attachment_id ) {
284
285 echo esc_url( wp_get_attachment_url( $attachment_id ) );
286
287 die();
288
289 }
290
291 }
292
293 /**
294 * Return svg file URL to show preview in media library
295 *
296 * @link https://developer.wordpress.org/reference/functions/wp_prepare_attachment_for_js/
297 * @since 2.6.0
298 */
299 public function get_svg_url_in_media_library( $response ) {
300
301 // Check response mime type
302 if ( $response['mime'] === 'image/svg+xml' ) {
303
304 $response['image'] = array(
305 'src' => $response['url'],
306 );
307
308 }
309
310 return $response;
311
312 }
313
314 }