Make WordPress Core

Ticket #7652: 7652-wpapp.diff

File 7652-wpapp.diff, 8.8 KB (added by rmccue, 14 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/**