Version Description
- Added ability to preview SVG on both grid and list view in the wp-admin media area
- Updated underlying library version
Download this release
Release Info
| Developer | enshrined |
| Plugin | |
| Version | 1.4.0 |
| Comparing to | |
| See all releases | |
Code changes from version 1.3.2 to 1.4.0
- licence.txt +1 -1
- readme.txt +25 -15
- safe-svg.php +92 -3
licence.txt
CHANGED
|
@@ -1,4 +1,4 @@
|
|
| 1 |
-
Safe SVG - Upload and sanitize SVGs within
|
| 2 |
|
| 3 |
Copyright 2015 Daryll Doyle
|
| 4 |
|
| 1 |
+
Safe SVG - Upload and sanitize SVGs within WordPress
|
| 2 |
|
| 3 |
Copyright 2015 Daryll Doyle
|
| 4 |
|
readme.txt
CHANGED
|
@@ -4,7 +4,7 @@ Donate link: http://enshrined.co.uk
|
|
| 4 |
Tags: svg, sanitize, uploads, sanitise, security, svg upload
|
| 5 |
Requires at least: 4.0
|
| 6 |
Tested up to: 4.7.2
|
| 7 |
-
Stable tag: 1.
|
| 8 |
License: GPLv2 or later
|
| 9 |
License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
| 10 |
|
|
@@ -24,25 +24,35 @@ Install through the WordPress directory or download, unzip and upload the files
|
|
| 24 |
|
| 25 |
== Changelog ==
|
| 26 |
|
| 27 |
-
= 1.
|
| 28 |
-
*
|
|
|
|
| 29 |
|
| 30 |
-
= 1.
|
| 31 |
-
*
|
| 32 |
-
* Added da, de ,en, es, fr, nl and ru translations
|
| 33 |
-
* Fixed an issue with filename not being pulled over on failed uploads
|
| 34 |
|
| 35 |
-
= 1.
|
| 36 |
-
*
|
| 37 |
|
| 38 |
-
= 1.2
|
| 39 |
-
*
|
|
|
|
|
|
|
|
|
|
| 40 |
|
| 41 |
= 1.3.0 =
|
| 42 |
* Minify SVGs after cleaning so they can be loaded correctly through file_get_contents
|
| 43 |
|
| 44 |
-
= 1.
|
| 45 |
-
*
|
| 46 |
|
| 47 |
-
= 1.
|
| 48 |
-
*
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 4 |
Tags: svg, sanitize, uploads, sanitise, security, svg upload
|
| 5 |
Requires at least: 4.0
|
| 6 |
Tested up to: 4.7.2
|
| 7 |
+
Stable tag: 1.4.0
|
| 8 |
License: GPLv2 or later
|
| 9 |
License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
| 10 |
|
| 24 |
|
| 25 |
== Changelog ==
|
| 26 |
|
| 27 |
+
= 1.4.0 =
|
| 28 |
+
* Added ability to preview SVG on both grid and list view in the wp-admin media area
|
| 29 |
+
* Updated underlying library version
|
| 30 |
|
| 31 |
+
= 1.3.4 =
|
| 32 |
+
* A fix for SVGZ uploads failing and not sanitising correctly
|
|
|
|
|
|
|
| 33 |
|
| 34 |
+
= 1.3.3 =
|
| 35 |
+
* Allow SVGZ uploads
|
| 36 |
|
| 37 |
+
= 1.3.2 =
|
| 38 |
+
* Fix for the mime type issue in 4.7.1. Mad props to @lewiscowles
|
| 39 |
+
|
| 40 |
+
= 1.3.1 =
|
| 41 |
+
* Updated underlying library version
|
| 42 |
|
| 43 |
= 1.3.0 =
|
| 44 |
* Minify SVGs after cleaning so they can be loaded correctly through file_get_contents
|
| 45 |
|
| 46 |
+
= 1.2.0 =
|
| 47 |
+
* Added support for camel case attributes such as viewBox
|
| 48 |
|
| 49 |
+
= 1.1.1 =
|
| 50 |
+
* Fixed an issue with empty svg elements self-closing
|
| 51 |
+
|
| 52 |
+
= 1.1.0 =
|
| 53 |
+
* Added i18n
|
| 54 |
+
* Added da, de ,en, es, fr, nl and ru translations
|
| 55 |
+
* Fixed an issue with filename not being pulled over on failed uploads
|
| 56 |
+
|
| 57 |
+
= 1.0.0 =
|
| 58 |
+
* Initial Release
|
safe-svg.php
CHANGED
|
@@ -2,8 +2,8 @@
|
|
| 2 |
/*
|
| 3 |
Plugin Name: Safe SVG
|
| 4 |
Plugin URI: https://wordpress.org/plugins/safe-svg/
|
| 5 |
-
Description: Allows SVG uploads into
|
| 6 |
-
Version: 1.
|
| 7 |
Author: Daryll Doyle
|
| 8 |
Author URI: http://enshrined.co.uk
|
| 9 |
Text Domain: safe-svg
|
|
@@ -38,6 +38,8 @@ if ( ! class_exists( 'safe_svg' ) ) {
|
|
| 38 |
add_filter( 'upload_mimes', array( $this, 'allow_svg' ) );
|
| 39 |
add_filter( 'wp_handle_upload_prefilter', array( $this, 'check_for_svg' ) );
|
| 40 |
add_filter( 'wp_check_filetype_and_ext', array( $this, 'fix_mime_type_svg' ), 75, 4 );
|
|
|
|
|
|
|
| 41 |
}
|
| 42 |
|
| 43 |
/**
|
|
@@ -49,6 +51,7 @@ if ( ! class_exists( 'safe_svg' ) ) {
|
|
| 49 |
*/
|
| 50 |
public function allow_svg( $mimes ) {
|
| 51 |
$mimes['svg'] = 'image/svg+xml';
|
|
|
|
| 52 |
|
| 53 |
return $mimes;
|
| 54 |
}
|
|
@@ -73,7 +76,10 @@ if ( ! class_exists( 'safe_svg' ) ) {
|
|
| 73 |
if ( $ext === 'svg' ) {
|
| 74 |
$data['type'] = 'image/svg+xml';
|
| 75 |
$data['ext'] = 'svg';
|
| 76 |
-
}
|
|
|
|
|
|
|
|
|
|
| 77 |
|
| 78 |
return $data;
|
| 79 |
}
|
|
@@ -107,17 +113,100 @@ if ( ! class_exists( 'safe_svg' ) ) {
|
|
| 107 |
protected function sanitize( $file ) {
|
| 108 |
$dirty = file_get_contents( $file );
|
| 109 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 110 |
$clean = $this->sanitizer->sanitize( $dirty );
|
| 111 |
|
| 112 |
if ( $clean === false ) {
|
| 113 |
return false;
|
| 114 |
}
|
| 115 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 116 |
file_put_contents( $file, $clean );
|
| 117 |
|
| 118 |
return true;
|
| 119 |
}
|
| 120 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 121 |
}
|
| 122 |
}
|
| 123 |
|
| 2 |
/*
|
| 3 |
Plugin Name: Safe SVG
|
| 4 |
Plugin URI: https://wordpress.org/plugins/safe-svg/
|
| 5 |
+
Description: Allows SVG uploads into WordPress and sanitizes the SVG before saving it
|
| 6 |
+
Version: 1.4.0
|
| 7 |
Author: Daryll Doyle
|
| 8 |
Author URI: http://enshrined.co.uk
|
| 9 |
Text Domain: safe-svg
|
| 38 |
add_filter( 'upload_mimes', array( $this, 'allow_svg' ) );
|
| 39 |
add_filter( 'wp_handle_upload_prefilter', array( $this, 'check_for_svg' ) );
|
| 40 |
add_filter( 'wp_check_filetype_and_ext', array( $this, 'fix_mime_type_svg' ), 75, 4 );
|
| 41 |
+
add_filter( 'wp_prepare_attachment_for_js', array( $this, 'fix_admin_preview' ), 10, 3 );
|
| 42 |
+
add_filter( 'wp_get_attachment_image_src', array( $this, 'one_pixel_fix' ), 10, 4 );
|
| 43 |
}
|
| 44 |
|
| 45 |
/**
|
| 51 |
*/
|
| 52 |
public function allow_svg( $mimes ) {
|
| 53 |
$mimes['svg'] = 'image/svg+xml';
|
| 54 |
+
$mimes['svgz'] = 'image/svg+xml';
|
| 55 |
|
| 56 |
return $mimes;
|
| 57 |
}
|
| 76 |
if ( $ext === 'svg' ) {
|
| 77 |
$data['type'] = 'image/svg+xml';
|
| 78 |
$data['ext'] = 'svg';
|
| 79 |
+
} elseif ( $ext === 'svgz' ) {
|
| 80 |
+
$data['type'] = 'image/svg+xml';
|
| 81 |
+
$data['ext'] = 'svgz';
|
| 82 |
+
}
|
| 83 |
|
| 84 |
return $data;
|
| 85 |
}
|
| 113 |
protected function sanitize( $file ) {
|
| 114 |
$dirty = file_get_contents( $file );
|
| 115 |
|
| 116 |
+
// Is the SVG gzipped? If so we try and decode the string
|
| 117 |
+
if ( $is_zipped = $this->is_gzipped( $dirty ) ) {
|
| 118 |
+
$dirty = gzdecode( $dirty );
|
| 119 |
+
|
| 120 |
+
// If decoding fails, bail as we're not secure
|
| 121 |
+
if ( $dirty === false ) {
|
| 122 |
+
return false;
|
| 123 |
+
}
|
| 124 |
+
}
|
| 125 |
+
|
| 126 |
$clean = $this->sanitizer->sanitize( $dirty );
|
| 127 |
|
| 128 |
if ( $clean === false ) {
|
| 129 |
return false;
|
| 130 |
}
|
| 131 |
|
| 132 |
+
// If we were gzipped, we need to re-zip
|
| 133 |
+
if ( $is_zipped ) {
|
| 134 |
+
$clean = gzencode( $clean );
|
| 135 |
+
}
|
| 136 |
+
|
| 137 |
file_put_contents( $file, $clean );
|
| 138 |
|
| 139 |
return true;
|
| 140 |
}
|
| 141 |
|
| 142 |
+
/**
|
| 143 |
+
* Check if the contents are gzipped
|
| 144 |
+
* @see http://www.gzip.org/zlib/rfc-gzip.html#member-format
|
| 145 |
+
*
|
| 146 |
+
* @param $contents
|
| 147 |
+
*
|
| 148 |
+
* @return bool
|
| 149 |
+
*/
|
| 150 |
+
protected function is_gzipped( $contents ) {
|
| 151 |
+
return 0 === mb_strpos( $contents , "\x1f" . "\x8b" . "\x08" );
|
| 152 |
+
}
|
| 153 |
+
|
| 154 |
+
/**
|
| 155 |
+
* Filters the attachment data prepared for JavaScript to add the sizes array to the response
|
| 156 |
+
*
|
| 157 |
+
* @param array $response Array of prepared attachment data.
|
| 158 |
+
* @param int|object $attachment Attachment ID or object.
|
| 159 |
+
* @param array $meta Array of attachment meta data.
|
| 160 |
+
*
|
| 161 |
+
* @return array
|
| 162 |
+
*/
|
| 163 |
+
public function fix_admin_preview( $response, $attachment, $meta ) {
|
| 164 |
+
|
| 165 |
+
if ( $response['mime'] == 'image/svg+xml' ) {
|
| 166 |
+
$possible_sizes = apply_filters( 'image_size_names_choose', array(
|
| 167 |
+
'thumbnail' => __( 'Thumbnail' ),
|
| 168 |
+
'medium' => __( 'Medium' ),
|
| 169 |
+
'large' => __( 'Large' ),
|
| 170 |
+
'full' => __( 'Full Size' ),
|
| 171 |
+
) );
|
| 172 |
+
|
| 173 |
+
$sizes = array();
|
| 174 |
+
|
| 175 |
+
foreach ( $possible_sizes as $size ) {
|
| 176 |
+
$sizes[ $size ] = array(
|
| 177 |
+
'height' => 2000,
|
| 178 |
+
'width' => 2000,
|
| 179 |
+
'url' => $response['url'],
|
| 180 |
+
'orientation' => 'portrait',
|
| 181 |
+
);
|
| 182 |
+
}
|
| 183 |
+
|
| 184 |
+
$response['sizes'] = $sizes;
|
| 185 |
+
}
|
| 186 |
+
|
| 187 |
+
return $response;
|
| 188 |
+
}
|
| 189 |
+
|
| 190 |
+
/**
|
| 191 |
+
* Filters the image src result.
|
| 192 |
+
* Here we're gonna spoof the image size and set it to 100 width and height
|
| 193 |
+
*
|
| 194 |
+
* @param array|false $image Either array with src, width & height, icon src, or false.
|
| 195 |
+
* @param int $attachment_id Image attachment ID.
|
| 196 |
+
* @param string|array $size Size of image. Image size or array of width and height values
|
| 197 |
+
* (in that order). Default 'thumbnail'.
|
| 198 |
+
* @param bool $icon Whether the image should be treated as an icon. Default false.
|
| 199 |
+
*
|
| 200 |
+
* @return array
|
| 201 |
+
*/
|
| 202 |
+
public function one_pixel_fix( $image, $attachment_id, $size, $icon ) {
|
| 203 |
+
if ( get_post_mime_type( $attachment_id ) == 'image/svg+xml' ) {
|
| 204 |
+
$image['1'] = 100;
|
| 205 |
+
$image['2'] = 100;
|
| 206 |
+
}
|
| 207 |
+
|
| 208 |
+
return $image;
|
| 209 |
+
}
|
| 210 |
}
|
| 211 |
}
|
| 212 |
|
