Categories
WordPress

Pequeños ajustes en WordPress

Corrección de problema de seguridad en xmlrpc.php y cambios para que se muestren bien los emoticonos

El primero tiene que ver con un pequeño problema de seguridad que permite a cualquier usuario eliminar los archivos adjuntos que se suben utilizando WordPress, para corregirlo tienen que buscar la función mw_newMediaObject en xmlrpc.php. En la siguiente porción de código, se muestra como debería quedar finalmente esa función.

php:

/* metaweblog.newMediaObject uploads a file, following your settings */
function mw_newMediaObject($args) {
        // adapted from a patch by Johann Richard
        // http://mycvs.org/archives/2004/06/30/file-upload-to-wordpress-in-ecto/

        global $wpdb;

        $blog_ID     = (int) $args[0];
        $user_login  = $wpdb->escape($args[1]);
        $user_pass   = $wpdb->escape($args[2]);
        $data        = $args[3];

        $name = sanitize_file_name( $data['name'] );
        $type = $data['type'];
        $bits = $data['bits'];

        logIO('O', '(MW) Received '.strlen($bits).' bytes');
        if ( !$this->login_pass_ok($user_login, $user_pass) )
                return $this->error;
        set_current_user(0, $user_login);
        if ( !current_user_can('upload_files') ) {
                logIO('O', '(MW) User does not have upload_files capability');
                $this->error = new IXR_Error(401, __('You are not allowed to upload files to this site.'));
                return $this->error;
        }
        if ( $upload_err = apply_filters( "pre_upload_error", false ) )
                return new IXR_Error(500, $upload_err);

        if(!empty($data["overwrite"]) && ($data["overwrite"] == true)) {
                // Get postmeta info on the object.
                $old_file = $wpdb->get_row("
                        SELECT ID
                        FROM {$wpdb->posts}
                        WHERE post_title = '{$name}'
                                AND post_type = 'attachment'
                ");

                // Delete previous file.
                wp_delete_attachment($old_file->ID);

                // Make sure the new name is different by pre-pending the
                // previous post id.
                $filename = preg_replace("/^wpid\d+-/", "", $name);
                $name = "wpid{$old_file->ID}-{$filename}";
        }

        $upload = wp_upload_bits($name, $type, $bits, $overwrite);
        if ( ! empty($upload['error']) ) {
                $errorString = 'Could not write file ' . $name . ' (' . $upload['error'] . ')';
                logIO('O', '(MW) ' . $errorString);
                return new IXR_Error(500, $errorString);
        }
        // Construct the attachment array
        // attach to post_id -1
        $post_id = -1;
        $attachment = array(
                'post_title' => $name,
                'post_content' => '',
                'post_type' => 'attachment',
                'post_parent' => $post_id,
                'post_mime_type' => $type,
                'guid' => $upload[ 'url' ]
        );

        // Save the data
        $id = wp_insert_attachment( $attachment, $upload[ 'file' ], $post_id );
        wp_update_attachment_metadata( $id, wp_generate_attachment_metadata( $id, $upload['file'] ) );

        return apply_filters( 'wp_handle_upload', array( 'file' => $name, 'url' => $upload[ 'url' ], 'type' => $type ) );
}

El segundo cambio, es más cosmético y es para que los emoticonos se muestren aún cuando éstos no estén rodeados de espacios o inicio y fin de cadena ;).

Tienen que cambiar la siguiente línea (vars.php:90 en la versión 2.1 y wp-includes/functions.php:1477 en la versión 2.2):

php:

$wp_smiliessearch[] = '/(\s|^)'.preg_quote($smiley, '/').'(\s|$)/';

por

php:

$wp_smiliessearch[] = '/(\B|^)'.preg_quote($smiley, '/').'(\B|$)/';

*: Este problema si no me equivoco, afecta a la versión 2.2 y 2.1.