WordPress.org

Make WordPress Core

Ticket #7652: 7652-wpapp.diff

File 7652-wpapp.diff, 8.8 KB (added by rmccue, 3 years ago)

All of AtomParser converted to SimplePie in wp-app.php

  • wp-app.php

     
    1616require_once('./wp-load.php'); 
    1717 
    1818/** Atom Publishing Protocol Class */ 
    19 require_once(ABSPATH . WPINC . '/atomlib.php'); 
     19require_once(ABSPATH . WPINC . '/class-simplepie.php'); 
    2020 
    2121/** Admin Image API for metadata updating */ 
    2222require_once(ABSPATH . '/wp-admin/includes/image.php'); 
     
    7676} 
    7777add_filter('posts_where', 'wa_posts_where_include_drafts_filter'); 
    7878 
     79define('SIMPLEPIE_NAMESPACE_ATOMPUB', 'http://www.w3.org/2007/app'); 
     80 
    7981/** 
     82 * SimplePie Helper for AtomPub 
     83 * 
     84 * @package WordPress 
     85 * @subpackage Publishing 
     86 * @since 3.1 
     87 */ 
     88class SimplePieAtomPub_Item extends SimplePie_Item { 
     89        /** 
     90         * Constructor 
     91         */ 
     92        function SimplePieAtomPub_Item($feed, $data) { 
     93                parent::SimplePie_Item($feed, $data); 
     94        } 
     95 
     96        /** 
     97         * Get the status of the entry 
     98         * 
     99         * @return bool True if the item is a draft, false otherwise 
     100         */ 
     101        function get_draft_status() { 
     102                $draft = false; 
     103                if (($control = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOMPUB, 'control')) && !empty($control[0]['child'][SIMPLEPIE_NAMESPACE_ATOMPUB]['draft'][0]['data'])) { 
     104                        $draft = ('yes' == $control[0]['child'][SIMPLEPIE_NAMESPACE_ATOMPUB]['draft'][0]['data']); 
     105                } 
     106                return $draft; 
     107        } 
     108 
     109        /** 
     110         * Get the GMT timestamp of the entry 
     111         * 
     112         * @param string $format date() format 
     113         * @return int|string|null 
     114         */ 
     115        function get_gmdate($format = 'j F Y, g:i a') { 
     116                return gmdate($format, $this->get_date('U')); 
     117        } 
     118 
     119        /** 
     120         * Get the updated timestamp of the entry 
     121         * 
     122         * AtomPub needs the distinction between "created" and "updated". 
     123         * @param string $format date() format 
     124         * @return string|int|null 
     125         */ 
     126        function get_updated($format = 'j F Y, g:i a') { 
     127                if ($updated = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'updated')) { 
     128                        $return = date('Y-m-d H:i:s', $updated[0]['data']); 
     129                } 
     130                else { 
     131                        return null; 
     132                } 
     133 
     134                if ($return) { 
     135                        $parser = SimplePie_Parse_Date::get(); 
     136                        $parsed = $parser->parse($return); 
     137                        $date_format = (string) $date_format; 
     138                        switch ($date_format) { 
     139                                case '': 
     140                                        return $this->sanitize($return, SIMPLEPIE_CONSTRUCT_TEXT); 
     141 
     142                                case 'U': 
     143                                        return $parsed; 
     144 
     145                                default: 
     146                                        return date($date_format, $parsed); 
     147                        } 
     148                } 
     149                else { 
     150                        return null; 
     151                } 
     152        } 
     153 
     154        /** 
     155         * Get the updated GMT timestamp of the entry 
     156         * 
     157         * @param string $format date() format 
     158         * @return int|string|null 
     159         */ 
     160        function get_gmupdated($format = 'j F Y, g:i a') { 
     161                return gmdate($format, $this->get_updated('U')); 
     162        } 
     163} 
     164 
     165/** 
    80166 * WordPress AtomPub API implementation. 
    81167 * 
    82168 * @package WordPress 
     
    258344         * @since 2.2.0 
    259345         */ 
    260346        function handle_request() { 
    261                 global $always_authenticate; 
    262  
    263347                if ( !empty( $_SERVER['ORIG_PATH_INFO'] ) ) 
    264348                        $path = $_SERVER['ORIG_PATH_INFO']; 
    265349                else 
     
    294378                                        // authenticate regardless of the operation and set the current 
    295379                                        // user. each handler will decide if auth is required or not. 
    296380                                        if ( !$this->authenticate() ) { 
    297                                                 if ( $always_authenticate ) 
    298                                                         $this->auth_required('Credentials required.'); 
     381                                                $this->auth_required('Credentials required.'); 
    299382                                        } 
    300383 
    301384                                        array_shift($matches); 
     
    390473                global $user_ID; 
    391474                $this->get_accepted_content_type($this->atom_content_types); 
    392475 
    393                 $parser = new AtomParser(); 
    394                 if ( !$parser->parse() ) 
    395                         $this->client_error(); 
     476                $feed = $this->get_parser(); 
     477                $entry = $feed->get_item(0); 
    396478 
    397                 $entry = array_pop($parser->feed->entries); 
     479                log_app('Received entry:', $entry->get_title()); 
    398480 
    399                 log_app('Received entry:', print_r($entry,true)); 
    400  
    401481                $catnames = array(); 
    402                 foreach ( $entry->categories as $cat ) { 
    403                         array_push($catnames, $cat["term"]); 
     482                foreach ( (array) $entry->get_categories() as $category ) { 
     483                        array_push($catnames, $category->get_term()); 
    404484                } 
    405485 
    406486                $wp_cats = get_categories(array('hide_empty' => false)); 
     
    412492                                array_push($post_category, $cat->term_id); 
    413493                } 
    414494 
    415                 $publish = ! ( isset( $entry->draft ) && 'yes' == trim( $entry->draft ) ); 
     495                $publish = !$entry->get_draft_status(); 
    416496 
    417497                $cap = ($publish) ? 'publish_posts' : 'edit_posts'; 
    418498 
     
    422502                $blog_ID = get_current_blog_id(); 
    423503                $post_status = ($publish) ? 'publish' : 'draft'; 
    424504                $post_author = (int) $user_ID; 
    425                 $post_title = $entry->title[1]; 
    426                 $post_content = $entry->content[1]; 
    427                 $post_excerpt = $entry->summary[1]; 
    428                 $pubtimes = $this->get_publish_time($entry->published); 
    429                 $post_date = $pubtimes[0]; 
    430                 $post_date_gmt = $pubtimes[1]; 
     505                $post_title = $entry->get_title(); 
     506                $post_content = $entry->get_content(); 
     507                $post_excerpt = $entry->get_description(); 
     508                $post_date = $entry->get_date('Y-m-d H:i:s'); 
     509                $post_date_gmt = $entry->get_gmdate('Y-m-d H:i:s'); 
    431510 
    432511                if ( isset( $_SERVER['HTTP_SLUG'] ) ) 
    433512                        $post_name = $_SERVER['HTTP_SLUG']; 
     
    490569                // quick check and exit 
    491570                $this->get_accepted_content_type($this->atom_content_types); 
    492571 
    493                 $parser = new AtomParser(); 
    494                 if ( !$parser->parse() ) 
    495                         $this->bad_request(); 
     572                $feed = $this->get_parser(); 
     573                $parsed = $feed->get_item(0); 
    496574 
    497                 $parsed = array_pop($parser->feed->entries); 
    498  
    499575                log_app('Received UPDATED entry:', print_r($parsed,true)); 
    500576 
    501577                // check for not found 
     
    505581                if ( !current_user_can('edit_post', $entry['ID']) ) 
    506582                        $this->auth_required(__('Sorry, you do not have the right to edit this post.')); 
    507583 
    508                 $publish = ! ( isset($parsed->draft) && 'yes' == trim($parsed->draft) ); 
     584                $publish = !$parsed->get_draft_status(); 
    509585                $post_status = ($publish) ? 'publish' : 'draft'; 
    510586 
    511587                extract($entry); 
    512588 
    513                 $post_title = $parsed->title[1]; 
    514                 $post_content = $parsed->content[1]; 
    515                 $post_excerpt = $parsed->summary[1]; 
    516                 $pubtimes = $this->get_publish_time($entry->published); 
    517                 $post_date = $pubtimes[0]; 
    518                 $post_date_gmt = $pubtimes[1]; 
    519                 $pubtimes = $this->get_publish_time($parsed->updated); 
    520                 $post_modified = $pubtimes[0]; 
    521                 $post_modified_gmt = $pubtimes[1]; 
     589                $post_title = $parsed->get_title(); 
     590                $post_content = $parsed->get_content(); 
     591                $post_excerpt = $parsed->get_description(); 
    522592 
     593                $post_date = $parsed->get_date('Y-m-d H:i:s'); 
     594                $post_date_gmt = $parsed->get_gmdate('Y-m-d H:i:s'); 
     595 
     596                $post_modified =  $parsed->get_updated('Y-m-d H:i:s'); 
     597                $post_modified_gmt =  $parsed->get_gmupdated('Y-m-d H:i:s'); 
     598 
    523599                $postdata = compact('ID', 'post_content', 'post_title', 'post_category', 'post_status', 'post_excerpt', 'post_date', 'post_date_gmt', 'post_modified', 'post_modified_gmt'); 
    524600                $this->escape($postdata); 
    525601 
     
    657733                // quick check and exit 
    658734                $this->get_accepted_content_type($this->atom_content_types); 
    659735 
    660                 $parser = new AtomParser(); 
    661                 if (!$parser->parse()) { 
    662                         $this->bad_request(); 
    663                 } 
     736                $feed = $this->get_parser(); 
     737                $parsed = $feed->get_item(0); 
    664738 
    665                 $parsed = array_pop($parser->feed->entries); 
    666  
    667739                // check for not found 
    668740                global $entry; 
    669741                $this->set_current_entry($postID); 
     
    673745 
    674746                extract($entry); 
    675747 
    676                 $post_title = $parsed->title[1]; 
    677                 $post_content = $parsed->summary[1]; 
    678                 $pubtimes = $this->get_publish_time($parsed->updated); 
    679                 $post_modified = $pubtimes[0]; 
    680                 $post_modified_gmt = $pubtimes[1]; 
     748                $post_title = $parsed->get_title(); 
     749                $post_content = $parsed->get_description(); 
     750                $post_modified = $parsed->get_date('Y-m-d H:i:s'); 
     751                $post_modified_gmt = $parsed->get_gmdate('Y-m-d H:i:s'); 
    681752 
    682753                $postdata = compact('ID', 'post_content', 'post_title', 'post_category', 'post_status', 'post_excerpt', 'post_modified', 'post_modified_gmt'); 
    683754                $this->escape($postdata); 
     
    12321303                log_app('Status','400: Bad Request'); 
    12331304                header('Content-Type: text/plain'); 
    12341305                status_header('400'); 
     1306                echo $msg; 
    12351307                exit; 
    12361308        } 
    12371309 
     
    13361408                log_app('Status','400: Client Error'); 
    13371409                header('Content-Type: text/plain'); 
    13381410                status_header('400'); 
     1411                echo $msg; 
    13391412                exit; 
    13401413        } 
    13411414 
     
    14481521         * @return bool 
    14491522         */ 
    14501523        function authenticate() { 
     1524                global $always_authenticate; 
     1525 
    14511526                log_app("authenticate()",print_r($_ENV, true)); 
    14521527 
    14531528                // if using mod_rewrite/ENV hack 
     
    14741549                        } 
    14751550                } 
    14761551 
     1552                // If we're forcing admin abilities 
     1553                if (!$always_authenticate) { 
     1554                        wp_set_current_user(1); 
     1555                        return true; 
     1556                } 
     1557 
    14771558                return false; 
    14781559        } 
    14791560 
     
    15981679                } 
    15991680        } 
    16001681 
     1682        function &get_parser() { 
     1683                $data = file_get_contents('php://input'); 
     1684                // SimplePie expects the feed element to be the top element 
     1685                if (strpos($data, '<feed') === false) { 
     1686                        $data = str_replace('<entry', '<feed xmlns="' . SIMPLEPIE_NAMESPACE_ATOM_10 . '"><entry', $data); 
     1687                        $data = str_replace('</entry>', '</entry></feed>', $data); 
     1688                } 
     1689                $feed = new SimplePie(); 
     1690                $feed->set_item_class('SimplePieAtomPub_Item'); 
     1691                $feed->set_raw_data($data); 
     1692                $feed->init(); 
     1693                if ( $feed->error() ) 
     1694                        $this->bad_request($feed->error()); 
     1695                return $feed; 
     1696        } 
    16011697} 
    16021698 
    16031699/**