WordPress.org

Make WordPress Core

Ticket #10784: press-this.patch

File press-this.patch, 13.0 KB (added by noel, 9 years ago)

Fixes errors when files have query strings in them and we need to validate the extension.

  • wp-admin/includes/media.php

     
    249249 */
    250250function media_handle_sideload($file_array, $post_id, $desc = null, $post_data = array()) {
    251251        $overrides = array('test_form'=>false);
     252       
    252253        $file = wp_handle_sideload($file_array, $overrides);
    253 
    254254        if ( isset($file['error']) )
    255255                return new WP_Error( 'upload_error', $file['error'] );
    256256
     
    279279                'post_content' => $content,
    280280        ), $post_data );
    281281
    282         // Save the data
     282        // Save the attachment metadata
    283283        $id = wp_insert_attachment($attachment, $file, $post_id);
    284284        if ( !is_wp_error($id) ) {
    285285                wp_update_attachment_metadata( $id, wp_generate_attachment_metadata( $id, $file ) );
     
    520520 */
    521521function media_sideload_image($file, $post_id, $desc = null) {
    522522        if (!empty($file) ) {
    523                 $file_array['name'] = basename($file);
     523                // Download file to temp location
    524524                $tmp = download_url($file);
     525               
     526                // Set variables for storage
     527                // fix file filename for query strings
     528                preg_match('/[^\?]+\.(jpg|JPG|jpe|JPE|jpeg|JPEG|gif|GIF|png|PNG)/', $file, $matches);
     529                $file_array['name'] = basename($matches[0]);
    525530                $file_array['tmp_name'] = $tmp;
    526                 $desc = @$desc;
    527531
     532                // If error storing temporarily, unlink
    528533                if ( is_wp_error($tmp) ) {
    529534                        @unlink($file_array['tmp_name']);
    530535                        $file_array['tmp_name'] = '';
    531536                }
    532 
    533                 $id = media_handle_sideload($file_array, $post_id, $desc);
     537               
     538                // do the validation and storage stuff
     539                $id = media_handle_sideload($file_array, $post_id, @$desc);
    534540                $src = $id;
    535 
     541               
     542                // If error storing permanently, unlink
    536543                if ( is_wp_error($id) ) {
    537544                        @unlink($file_array['tmp_name']);
    538545                        return $id;
    539546                }
    540547        }
    541 
     548       
     549        // Finally check to make sure the file has been saved, then return the html
    542550        if ( !empty($src) ) {
    543551                $alt = @$desc;
    544552                $html = "<img src='$src' alt='$alt' />";
  • wp-admin/press-this.php

     
    4242function press_it() {
    4343        // define some basic variables
    4444        $quick['post_status'] = 'draft'; // set as draft first
    45         $quick['post_category'] = isset($_REQUEST['post_category']) ? $_REQUEST['post_category'] : null;
    46         $quick['tax_input'] = isset($_REQUEST['tax_input']) ? $_REQUEST['tax_input'] : '';
    47         $quick['post_title'] = isset($_REQUEST['title']) ? $_REQUEST['title'] : '';
     45        $quick['post_category'] = isset($_POST['post_category']) ? $_POST['post_category'] : null;
     46        $quick['tax_input'] = isset($_POST['tax_input']) ? $_POST['tax_input'] : '';
     47        $quick['post_title'] = isset($_POST['title']) ? $_POST['title'] : '';
    4848        $quick['post_content'] = '';
    4949
    5050        // insert the post with nothing in it, to get an ID
    5151        $post_ID = wp_insert_post($quick, true);
    52         $content = isset($_REQUEST['content']) ? $_REQUEST['content'] : '';
     52        $content = isset($_POST['content']) ? $_POST['content'] : '';
    5353
    5454        $upload = false;
    55         if( !empty($_REQUEST['photo_src']) && current_user_can('upload_files') )
    56                 foreach( (array) $_REQUEST['photo_src'] as $key => $image)
     55        if( !empty($_POST['photo_src']) && current_user_can('upload_files') )
     56                foreach( (array) $_POST['photo_src'] as $key => $image)
    5757                        // see if files exist in content - we don't want to upload non-used selected files.
    58                         if( strpos($_REQUEST['content'], $image) !== false ) {
    59                                 $desc = isset($_REQUEST['photo_description'][$key]) ? $_REQUEST['photo_description'][$key] : '';
     58                        if( strpos($_POST['content'], htmlspecialchars($image)) !== false ) {
     59                                $desc = isset($_POST['photo_description'][$key]) ? $_POST['photo_description'][$key] : '';
    6060                                $upload = media_sideload_image($image, $post_ID, $desc);
    6161
    6262                                // Replace the POSTED content <img> with correct uploaded ones. Regex contains fix for Magic Quotes
    63                                 if( !is_wp_error($upload) ) $content = preg_replace('/<img ([^>]*)src=\\\?(\"|\')'.preg_quote($image, '/').'\\\?(\2)([^>\/]*)\/*>/is', $upload, $content);
     63                                if( !is_wp_error($upload) ) $content = preg_replace('/<img ([^>]*)src=\\\?(\"|\')'.preg_quote(htmlspecialchars($image), '/').'\\\?(\2)([^>\/]*)\/*>/is', $upload, $content);
    6464                        }
    65 
     65       
    6666        // set the post_content and status
    67         $quick['post_status'] = isset($_REQUEST['publish']) ? 'publish' : 'draft';
     67        $quick['post_status'] = isset($_POST['publish']) ? 'publish' : 'draft';
    6868        $quick['post_content'] = $content;
    6969        // error handling for $post
    7070        if ( is_wp_error($post_ID)) {
     
    100100$url = isset($_GET['u']) ? esc_url($_GET['u']) : '';
    101101$image = isset($_GET['i']) ? $_GET['i'] : '';
    102102
    103 if ( !empty($_REQUEST['ajax']) ) {
    104 switch ($_REQUEST['ajax']) {
    105         case 'video': ?>
    106                 <script type="text/javascript" charset="utf-8">
    107                         jQuery('.select').click(function() {
    108                                 append_editor(jQuery('#embed-code').val());
    109                                 jQuery('#extra_fields').hide();
    110                                 jQuery('#extra_fields').html('');
    111                         });
    112                         jQuery('.close').click(function() {
    113                                 jQuery('#extra_fields').hide();
    114                                 jQuery('#extra_fields').html('');
    115                         });
    116                 </script>
    117                 <div class="postbox">
    118                 <h2><label for="embed-code"><?php _e('Embed Code') ?></label></h2>
    119                 <div class="inside">
    120                         <textarea name="embed-code" id="embed-code" rows="8" cols="40"><?php echo format_to_edit($selection, true); ?></textarea>
    121                         <p id="options"><a href="#" class="select button"><?php _e('Insert Video'); ?></a> <a href="#" class="close button"><?php _e('Cancel'); ?></a></p>
    122                 </div>
    123                 </div>
    124                 <?php break;
     103if ( !empty($_GET['ajax']) ) {
     104        switch ($_GET['ajax']) {
     105                case 'video': ?>
     106                        <script type="text/javascript" charset="utf-8">
     107                        /* <![CDATA[ */
     108                                jQuery('.select').click(function() {
     109                                        append_editor(jQuery('#embed-code').val());
     110                                        jQuery('#extra_fields').hide();
     111                                        jQuery('#extra_fields').html('');
     112                                });
     113                                jQuery('.close').click(function() {
     114                                        jQuery('#extra_fields').hide();
     115                                        jQuery('#extra_fields').html('');
     116                                });
     117                        /* ]]> */
     118                        </script>
     119                        <div class="postbox">
     120                                <h2><label for="embed-code"><?php _e('Embed Code') ?></label></h2>
     121                                <div class="inside">
     122                                        <textarea name="embed-code" id="embed-code" rows="8" cols="40"><?php echo format_to_edit($selection, true); ?></textarea>
     123                                        <p id="options"><a href="#" class="select button"><?php _e('Insert Video'); ?></a> <a href="#" class="close button"><?php _e('Cancel'); ?></a></p>
     124                                </div>
     125                        </div>
     126                        <?php break;
    125127
    126         case 'photo_thickbox': ?>
    127                 <script type="text/javascript" charset="utf-8">
    128                         jQuery('.cancel').click(function() {
    129                                 tb_remove();
    130                         });
    131                         jQuery('.select').click(function() {
    132                                 image_selector();
    133                         });
    134                 </script>
    135                 <h3 class="tb"><label for="this_photo_description"><?php _e('Description') ?></label></h3>
    136                 <div class="titlediv">
    137                 <div class="titlewrap">
    138                         <input id="this_photo_description" name="photo_description" class="tbtitle text" onkeypress="if(event.keyCode==13) image_selector();" value="<?php echo esc_attr($title);?>"/>
    139                 </div>
    140                 </div>
     128                case 'photo_thickbox': ?>
     129                        <script type="text/javascript" charset="utf-8">
     130                                /* <![CDATA[ */
     131                                jQuery('.cancel').click(function() {
     132                                        tb_remove();
     133                                });
     134                                jQuery('.select').click(function() {
     135                                        image_selector();
     136                                });
     137                                /* ]]> */
     138                        </script>
     139                        <h3 class="tb"><label for="this_photo_description"><?php _e('Description') ?></label></h3>
     140                        <div class="titlediv">
     141                                <div class="titlewrap">
     142                                        <input id="this_photo_description" name="photo_description" class="tbtitle text" onkeypress="if(event.keyCode==13) image_selector();" value="<?php echo esc_attr($title);?>"/>
     143                                </div>
     144                        </div>
    141145
    142                 <p class="centered"><input type="hidden" name="this_photo" value="<?php echo esc_attr($image); ?>" id="this_photo" />
    143                         <a href="#" class="select"><img src="<?php echo esc_url($image); ?>" alt="<?php echo esc_attr(__('Click to insert.')); ?>" title="<?php echo esc_attr(__('Click to insert.')); ?>" /></a></p>
     146                        <p class="centered">
     147                                <input type="hidden" name="this_photo" value="<?php echo esc_attr($image); ?>" id="this_photo" />
     148                                <a href="#" class="select">
     149                                        <img src="<?php echo esc_url($image); ?>" alt="<?php echo esc_attr(__('Click to insert.')); ?>" title="<?php echo esc_attr(__('Click to insert.')); ?>" />
     150                                </a>
     151                        </p>
    144152
    145                 <p id="options"><a href="#" class="select button"><?php _e('Insert Image'); ?></a> <a href="#" class="cancel button"><?php _e('Cancel'); ?></a></p>
     153                        <p id="options"><a href="#" class="select button"><?php _e('Insert Image'); ?></a> <a href="#" class="cancel button"><?php _e('Cancel'); ?></a></p>
     154                        <?php break;
    146155
     156                case 'photo_thickbox_url': ?>
     157                        <script type="text/javascript" charset="utf-8">
     158                                /* <![CDATA[ */
     159                                jQuery('.cancel').click(function() {
     160                                        tb_remove();
     161                                });
    147162
    148                 <?php break;
    149 
    150         case 'photo_thickbox_url': ?>
    151                 <script type="text/javascript" charset="utf-8">
    152                         jQuery('.cancel').click(function() {
    153                                 tb_remove();
    154                         });
    155 
    156                         jQuery('.select').click(function() {
    157                                 image_selector();
    158                         });
    159                 </script>
    160                 <h3 class="tb"><label for="this_photo"><?php _e('URL') ?></label></h3>
    161                 <div class="titlediv">
    162                         <div class="titlewrap">
    163                         <input id="this_photo" name="this_photo" class="tbtitle text" onkeypress="if(event.keyCode==13) image_selector();" />
     163                                jQuery('.select').click(function() {
     164                                        image_selector();
     165                                });
     166                                /* ]]> */
     167                        </script>
     168                        <h3 class="tb"><label for="this_photo"><?php _e('URL') ?></label></h3>
     169                        <div class="titlediv">
     170                                <div class="titlewrap">
     171                                        <input id="this_photo" name="this_photo" class="tbtitle text" onkeypress="if(event.keyCode==13) image_selector();" />
     172                                </div>
    164173                        </div>
    165                 </div>
    166 
    167 
    168                 <h3 class="tb"><label for="photo_description"><?php _e('Description') ?></label></h3>
    169                 <div id="titlediv">
    170                         <div class="titlewrap">
    171                         <input id="this_photo_description" name="photo_description" class="tbtitle text" onkeypress="if(event.keyCode==13) image_selector();" value="<?php echo esc_attr($title);?>"/>
     174                        <h3 class="tb"><label for="photo_description"><?php _e('Description') ?></label></h3>
     175                        <div id="titlediv">
     176                                <div class="titlewrap">
     177                                        <input id="this_photo_description" name="photo_description" class="tbtitle text" onkeypress="if(event.keyCode==13) image_selector();" value="<?php echo esc_attr($title);?>"/>
     178                                </div>
    172179                        </div>
    173                 </div>
    174180
    175                 <p id="options"><a href="#" class="select"><?php _e('Insert Image'); ?></a> | <a href="#" class="cancel"><?php _e('Cancel'); ?></a></p>
    176                 <?php break;
     181                        <p id="options"><a href="#" class="select"><?php _e('Insert Image'); ?></a> | <a href="#" class="cancel"><?php _e('Cancel'); ?></a></p>
     182                        <?php break;
    177183        case 'photo_images':
    178184                /**
    179185                 * Retrieve all image URLs from given URI.
     
    186192                 * @return string
    187193                 */
    188194                function get_images_from_uri($uri) {
    189                         if( preg_match('/\.(jpg|jpe|jpeg|png|gif)$/', $uri) && !strpos($uri,'blogger.com') )
    190                                 return "'".$uri."'";
     195                        if( preg_match('/\.(jpg|jpe|jpeg|png|gif)/', $uri) && !strpos($uri,'blogger.com') )
     196                                return "'".html_entity_decode($uri)."'";
    191197                        $content = wp_remote_fopen($uri);
    192198                        if ( false === $content )
    193199                                return '';
    194200                        $host = parse_url($uri);
    195                         $pattern = '/<img ([^>]*)src=(\"|\')([^<>]+?\.(png|jpeg|jpg|jpe|gif))[^<>\'\"]*(\2)([^>\/]*)\/*>/is';
     201                        $pattern = '/<img ([^>]*)src=(\"|\')([^<>]+?\.(png|jpeg|jpg|jpe|gif)[^<>\'\"]*)(\2)([^>\/]*)\/*>/is';
    196202                        preg_match_all($pattern, $content, $matches);
    197203                        if ( empty($matches[0]) )
    198204                                return '';
     
    210216                        return "'" . implode("','", $sources) . "'";
    211217                }
    212218                $url = urldecode($url);
    213                 $url = str_replace(' ', '%20', $url);
    214219                echo 'new Array('.get_images_from_uri($url).')';
    215220
    216221                break;
     
    219224                // gather images and load some default JS
    220225                var last = null
    221226                var img, img_tag, aspect, w, h, skip, i, strtoappend = "";
     227                var my_src = eval(
     228                        jQuery.ajax({
     229                                type: "GET",
     230                                url: "<?php echo esc_url($_SERVER['PHP_SELF']); ?>",
     231                                cache : false,
     232                                async : false,
     233                                data: "ajax=photo_images&u=<?php echo urlencode($url); ?>",
     234                                dataType : "script"
     235                        }).responseText
     236                );
     237                if(my_src.length == 0) {
    222238                        var my_src = eval(
    223239                                jQuery.ajax({
    224                                         type: "GET",
    225                                         url: "<?php echo esc_url($_SERVER['PHP_SELF']); ?>",
     240                                        type: "GET",
     241                                        url: "<?php echo esc_url($_SERVER['PHP_SELF']); ?>",
    226242                                        cache : false,
    227243                                        async : false,
    228                                         data: "ajax=photo_images&u=<?php echo urlencode($url); ?>",
     244                                        data: "ajax=photo_images&u=<?php echo urlencode($url); ?>",
    229245                                        dataType : "script"
    230246                                }).responseText
    231247                        );
    232248                        if(my_src.length == 0) {
    233                                 var my_src = eval(
    234                                 jQuery.ajax({
    235                                         type: "GET",
    236                                         url: "<?php echo esc_url($_SERVER['PHP_SELF']); ?>",
    237                                         cache : false,
    238                                         async : false,
    239                                         data: "ajax=photo_images&u=<?php echo urlencode($url); ?>",
    240                                         dataType : "script"
    241                                 }).responseText
    242                                 );
    243                                 if(my_src.length == 0) {
    244                                         strtoappend = '<?php _e('Unable to retrieve images or no images on page.'); ?>';
    245                                 }
     249                                strtoappend = '<?php _e('Unable to retrieve images or no images on page.'); ?>';
    246250                        }
     251                }
    247252
    248253                for (i = 0; i < my_src.length; i++) {
    249254                        img = new Image();