Making WordPress.org


Ignore:
Timestamp:
10/19/2016 03:27:01 AM (10 years ago)
Author:
dd32
Message:

Plugin Directory: Readme Validator: Strip out the wp-admin handling in the readme handler and streamline the error checks a little.

See #2128

File:
1 edited

Legend:

Unmodified
Added
Removed
  • sites/trunk/wordpress.org/public_html/wp-content/plugins/plugin-directory/readme/class-validator.php

    r4259 r4261  
    2222
    2323        /**
    24          * Validator constructor.
     24         * Validates a readme by URL.
     25         *
     26         * @param string $url The URL of the readme to validate.
     27         * @return array Array of the readme validation results.
    2528         */
    26         private function __construct() {
    27                 add_action( 'plugin_page_readme_validator', array( $this, 'add_form_fields' ) );
    28                 add_action( 'plugin_page_readme_validator', array( $this, 'validate' ) );
     29        public function validate_url( $url ) {
     30                $url = esc_url_raw( $url );
     31
     32                if ( strtolower( substr( $url, -10 ) ) != 'readme.txt' ) {
     33                        /* Translators: File name; */
     34                        $error = sprintf( __( 'URL must end in %s!', 'wporg-plugins' ), '<code>readme.txt</code>' );
     35                        return array(
     36                                'errors' => array( $error )
     37                        );
     38                }
     39
     40                $readme = wp_safe_remote_get( $url );
     41                if ( ! $readme_text = wp_remote_retrieve_body( $readme ) ) {
     42                        $error = __( 'Invalid readme.txt URL.', 'wporg-plugins' );
     43                        return array(
     44                                'errors' => array( $error )
     45                        );
     46                }
     47
     48                return $this->validate_content( $readme_text );
    2949        }
    3050
    3151        /**
    32          * Displays a for to validate readme.txt files and blobs of text.
    33          */
    34         public function display() {
    35                 ?>
    36                 <div class="wrap">
    37                         <h2><?php _e( 'WordPress Plugin readme.txt Validator', 'wporg-plugins' ); ?></h2>
    38                         <?php settings_errors( 'wporg-plugins-readme' ); ?>
    39                         <form method="post" action="<?php echo esc_url( add_query_arg( array( 'post_type' => 'plugin', 'page' => 'readme_validator' ), admin_url( 'edit.php' ) ) ); ?>">
    40                                 <?php
    41                                 wp_nonce_field( 'validate-readme' );
    42                                 do_settings_sections( 'readme_validator' );
    43                                 submit_button( __( 'Validate', 'wporg-plugins' ) );
    44                                 ?>
    45                         </form>
    46                 </div>
    47                 <?php
    48         }
    49 
    50         /**
    51          * Registers form fields for this admin page.
    52          */
    53         public function add_form_fields() {
    54                 add_settings_section( 'default', '', array( $this, 'section_description' ), 'readme_validator' );
    55 
    56                 add_settings_field( 'readme_url', __( 'URL to readme.txt file', 'wporg-plugins' ), array( $this, 'url_input' ), 'readme_validator', 'default', array(
    57                         'label_for' => 'readme_url',
    58                 ) );
    59                 add_settings_field( 'readme_text', __( 'Text of readme.txt', 'wporg-plugins' ), array( $this, 'textarea' ),  'readme_validator', 'default', array(
    60                         'label_for' => 'readme_contents',
    61                 ) );
    62         }
    63 
    64         /**
    65          * Validates readme.txt contents and adds feedback.
    66          */
    67         public function validate() {
    68                 if ( ! isset( $_REQUEST['_wpnonce'] ) ) {
    69                         return;
    70                 }
    71                 check_admin_referer( 'validate-readme' );
    72 
    73                 $readme    = '';
    74 
    75                 if ( ! empty( $_REQUEST['readme_url'] ) ) {
    76                         $url = esc_url_raw( $_REQUEST['readme_url'] );
    77 
    78                         if ( strtolower( substr( $url, -10 ) ) != 'readme.txt' ) {
    79                                 /* Translators: File name; */
    80                                 add_settings_error( 'wporg-plugins-readme', 'readme-validator', sprintf( __( 'URL must end in %s!', 'wporg-plugins' ), '<code>readme.txt</code>' ) );
    81                                 return;
    82                         }
    83 
    84                         if ( ! $readme = @file_get_contents( $url ) ) {
    85                                 add_settings_error( 'wporg-plugins-readme', 'readme-validator', __( 'Invalid readme.txt URL.', 'wporg-plugins' ) );
    86                                 return;
    87                         }
    88 
    89                 } elseif ( ! empty( $_REQUEST['readme_contents'] ) && is_string( $_REQUEST['readme_contents'] ) ) {
    90                         $readme = wp_unslash( $_REQUEST['readme_contents'] );
    91                 }
    92 
    93                 if ( empty( $readme ) ) {
    94                         return;
    95                 }
    96 
    97                 return $this->validate_content( $readme );
    98         }
    99 
    100         /**
    101          * Validates content via a string paramater and adds feedback.
     52         * Validates readme contents by string.
     53         *
     54         * @param string $readme The text of the readme.
     55         * @return array Array of the readme validation results.
    10256         */
    10357        public function validate_content( $readme ) {
    10458
    105                 $temp_file = Filesystem::temp_directory() . '/readme.txt';
    106                 $errors    = array();
    107                 $warnings  = array();
    108                 $notes     = array();
     59                $readme = new Parser( 'data:text/plain,' . urlencode( $readme ) );
    10960
    110                 file_put_contents( $temp_file, $readme );
    111                 $readme = new Parser( $temp_file );
     61                $errors = $warnings = $notes = array();
    11262
    11363                // Fatal errors.
    11464                if ( empty( $readme->name ) ) {
    11565                        /* Translators: Plugin header tag; */
    116                         add_settings_error( 'wporg-plugins-readme', 'readme-validator', sprintf( __( "Fatal Error:\nNo plugin name detected. Plugin names look like: %s", 'wporg-plugins' ), '<code>=== Plugin Name ===</code>' ) );
    117                         $errors[] = array( 'error', sprintf( __( "Fatal Error:\nNo plugin name detected.    Plugin names look like: %s", 'wporg-plugins' ), '<code>=== Plugin Name ===</code>' ) );
    118                         return $errors;
     66                        $errors[] = sprintf( __( "No plugin name detected. Plugin names look like: %s", 'wporg-plugins' ), '<code>=== Plugin Name ===</code>' );
    11967                }
    12068
     
    13583                        /* Translators: Plugin header tag; */
    13684                        $warnings[] = sprintf( __( 'No %s listed.', 'wporg-plugins' ), '<code>Contributors</code>' );
    137                 }
    138 
    139                 if ( $warnings ) {
    140                         $message = __( 'Warnings:', 'wporg-plugins' ) . "\n<ul class='warning error'>\n";
    141                         foreach ( $warnings as $warning ) {
    142                                 $message .= "<li>$warning</li>\n";
    143                         }
    144                         $message .= "</ul>\n</div>";
    145 
    146                         if ( function_exists( 'add_settings_error' ) ) {
    147                                 add_settings_error( 'wporg-plugins-readme', 'readme-validator', $message, 'notice-warning' );
    148                         }
    149                         return $message;
    15085                }
    15186
     
    171106                }
    172107
    173                 if ( $notes ) {
    174                         $message = __( 'Notes:' ) . "\n<ul class='note error'>\n";
    175                         foreach ( $notes as $note ) {
    176                                 $message .= "<li>$note</li>\n";
    177                         }
    178                         $message .= "</ul>\n</div>";
     108                return compact( 'errors', 'warnings', 'notes' );
    179109
    180                         if ( function_exists( 'add_settings_error' ) ) {
    181                                 add_settings_error( 'wporg-plugins-readme', 'readme-validator', $message, 'notice-info' );
    182                         }
    183                         return $message;
    184                 }
    185 
    186                 /* Translators: File name; */
    187                 if ( function_exists( 'add_settings_error' ) ) {
    188                         add_settings_error( 'wporg-plugins-readme', 'readme-validator', sprintf( __( 'Your %s rocks.  Seriously.  Flying colors.', 'wporg-plugins' ), '<code>readme.txt</code>' ), 'updated' );
    189                 }
    190110        }
    191111
    192 
    193         /**
    194          * Help text for the form following after it.
    195          */
    196         public function section_description() {
    197                 /* Translators: File name; */
    198                 echo '<p>' . sprintf( __( 'Enter the URL to your %s file or paste its content below.' ), '<code>readme.txt</code>' ) . '</p>';
    199         }
    200 
    201         /**
    202          * Displays an input field for the readme.txt URL.
    203          */
    204         public function url_input() {
    205                 $url = empty( $_REQUEST['readme_url'] ) ? '' : $_REQUEST['readme_url'];
    206                 ?>
    207                 <label>
    208                         <input type="url" id="readme_url" name="readme_url" size="70" value="<?php echo esc_url( $url ); ?>" />
    209                 </label>
    210                 <?php
    211         }
    212 
    213         /**
    214          * Displays a textarea for readme.txt blobs.
    215          */
    216         public function textarea() {
    217                 $text = empty( $_REQUEST['readme_contents'] ) ? '' : wp_unslash( $_REQUEST['readme_contents'] );
    218                 ?>
    219                 <label>
    220                         <textarea type="text" id="readme_contents" class="large-text" name="readme_contents" cols="50" rows="10"><?php echo esc_textarea( $text ); ?></textarea>
    221                 </label>
    222                 <?php
    223         }
    224112}
Note: See TracChangeset for help on using the changeset viewer.