X-Git-Url: https://scripts.mit.edu/gitweb/autoinstalls/wordpress.git/blobdiff_plain/d3b1ea255664edd2deef17f900a655613d20820d..58f607a1de715c9bca69340a4d6fb9e1b9c2bed2:/xmlrpc.php diff --git a/xmlrpc.php b/xmlrpc.php index 55279426..fdd670e2 100644 --- a/xmlrpc.php +++ b/xmlrpc.php @@ -39,11 +39,11 @@ header('Content-Type: text/xml; charset=' . get_option('blog_charset'), true); http://wordpress.org/ - - - - - + + + + + @@ -201,6 +201,9 @@ class wp_xmlrpc_server extends IXR_Server { $this->initialise_blog_option_info( ); $this->methods = apply_filters('xmlrpc_methods', $this->methods); + } + + function serve_request() { $this->IXR_Server($this->methods); } @@ -243,7 +246,7 @@ class wp_xmlrpc_server extends IXR_Server { */ function login_pass_ok($user_login, $user_pass) { if ( !get_option( 'enable_xmlrpc' ) ) { - $this->error = new IXR_Error( 405, sprintf( __( 'XML-RPC services are disabled on this blog. An admin user can enable them at %s'), admin_url('options-writing.php') ) ); + $this->error = new IXR_Error( 405, sprintf( __( 'XML-RPC services are disabled on this site. An admin user can enable them at %s'), admin_url('options-writing.php') ) ); return false; } @@ -265,7 +268,7 @@ class wp_xmlrpc_server extends IXR_Server { */ function login($username, $password) { if ( !get_option( 'enable_xmlrpc' ) ) { - $this->error = new IXR_Error( 405, sprintf( __( 'XML-RPC services are disabled on this blog. An admin user can enable them at %s'), admin_url('options-writing.php') ) ); + $this->error = new IXR_Error( 405, sprintf( __( 'XML-RPC services are disabled on this site. An admin user can enable them at %s'), admin_url('options-writing.php') ) ); return false; } @@ -276,7 +279,7 @@ class wp_xmlrpc_server extends IXR_Server { return false; } - set_current_user( $user->ID ); + wp_set_current_user( $user->ID ); return $user; } @@ -291,14 +294,13 @@ class wp_xmlrpc_server extends IXR_Server { function escape(&$array) { global $wpdb; - if(!is_array($array)) { + if (!is_array($array)) { return($wpdb->escape($array)); - } - else { + } else { foreach ( (array) $array as $k => $v ) { - if (is_array($v)) { + if ( is_array($v) ) { $this->escape($array[$k]); - } else if (is_object($v)) { + } else if ( is_object($v) ) { //skip } else { $array[$k] = $wpdb->escape($v); @@ -367,7 +369,7 @@ class wp_xmlrpc_server extends IXR_Server { } /** - * Setup blog options property. + * Set up blog options property. * * Passes property through 'xmlrpc_blog_options' filter. * @@ -389,7 +391,7 @@ class wp_xmlrpc_server extends IXR_Server { 'value' => $wp_version ), 'blog_url' => array( - 'desc' => __( 'Blog URL' ), + 'desc' => __( 'Site URL' ), 'readonly' => true, 'option' => 'siteurl' ), @@ -401,12 +403,12 @@ class wp_xmlrpc_server extends IXR_Server { 'option' => 'gmt_offset' ), 'blog_title' => array( - 'desc' => __( 'Blog Title' ), + 'desc' => __( 'Site Title' ), 'readonly' => false, 'option' => 'blogname' ), 'blog_tagline' => array( - 'desc' => __( 'Blog Tagline' ), + 'desc' => __( 'Site Tagline' ), 'readonly' => false, 'option' => 'blogdescription' ), @@ -419,6 +421,11 @@ class wp_xmlrpc_server extends IXR_Server { 'desc' => __( 'Time Format' ), 'readonly' => false, 'option' => 'time_format' + ), + 'users_can_register' => array( + 'desc' => __( 'Allow new users to sign up' ), + 'readonly' => false, + 'option' => 'users_can_register' ) ); @@ -434,8 +441,9 @@ class wp_xmlrpc_server extends IXR_Server { * @return array */ function wp_getUsersBlogs( $args ) { + global $current_site; // If this isn't on WPMU then just use blogger_getUsersBlogs - if( !function_exists( 'is_site_admin' ) ) { + if ( !is_multisite() ) { array_unshift( $args, 1 ); return $this->blogger_getUsersBlogs( $args ); } @@ -445,23 +453,23 @@ class wp_xmlrpc_server extends IXR_Server { $username = $args[0]; $password = $args[1]; - if ( !$user = $this->login($username, $password) ) { + if ( !$user = $this->login($username, $password) ) return $this->error; - } + do_action( 'xmlrpc_call', 'wp.getUsersBlogs' ); $blogs = (array) get_blogs_of_user( $user->ID ); $struct = array( ); - foreach( $blogs as $blog ) { + foreach ( $blogs as $blog ) { // Don't include blogs that aren't hosted at this site - if( $blog->site_id != $current_site->id ) + if ( $blog->site_id != $current_site->id ) continue; $blog_id = $blog->userblog_id; switch_to_blog($blog_id); - $is_admin = current_user_can('level_8'); + $is_admin = current_user_can('manage_options'); $struct[] = array( 'isAdmin' => $is_admin, @@ -497,7 +505,7 @@ class wp_xmlrpc_server extends IXR_Server { return $this->error; } - if( !current_user_can( 'edit_page', $page_id ) ) + if ( !current_user_can( 'edit_page', $page_id ) ) return new IXR_Error( 401, __( 'Sorry, you cannot edit this page.' ) ); do_action('xmlrpc_call', 'wp.getPage'); @@ -506,14 +514,14 @@ class wp_xmlrpc_server extends IXR_Server { $page = get_page($page_id); // If we found the page then format the data. - if($page->ID && ($page->post_type == "page")) { + if ( $page->ID && ($page->post_type == "page") ) { // Get all of the page content and link. $full_page = get_extended($page->post_content); $link = post_permalink($page->ID); // Get info the page parent if there is one. $parent_title = ""; - if(!empty($page->post_parent)) { + if ( !empty($page->post_parent) ) { $parent = get_page($page->post_parent); $parent_title = $parent->post_title; } @@ -526,9 +534,13 @@ class wp_xmlrpc_server extends IXR_Server { $page_date = mysql2date("Ymd\TH:i:s", $page->post_date, false); $page_date_gmt = mysql2date("Ymd\TH:i:s", $page->post_date_gmt, false); + // For drafts use the GMT version of the date + if ( $page->post_status == 'draft' ) + $page_date_gmt = get_gmt_from_date( mysql2date( 'Y-m-d H:i:s', $page->post_date ), 'Ymd\TH:i:s' ); + // Pull the categories info together. $categories = array(); - foreach(wp_get_post_categories($page->ID) as $cat_id) { + foreach ( wp_get_post_categories($page->ID) as $cat_id ) { $categories[] = get_cat_name($cat_id); } @@ -536,7 +548,7 @@ class wp_xmlrpc_server extends IXR_Server { $author = get_userdata($page->post_author); $page_template = get_post_meta( $page->ID, '_wp_page_template', true ); - if( empty( $page_template ) ) + if ( empty( $page_template ) ) $page_template = 'default'; $page_struct = array( @@ -588,30 +600,24 @@ class wp_xmlrpc_server extends IXR_Server { $blog_id = (int) $args[0]; $username = $args[1]; $password = $args[2]; - $num_pages = (int) $args[3]; + $num_pages = isset($args[3]) ? (int) $args[3] : 10; - if ( !$user = $this->login($username, $password) ) { + if ( !$user = $this->login($username, $password) ) return $this->error; - } - if( !current_user_can( 'edit_pages' ) ) + if ( !current_user_can( 'edit_pages' ) ) return new IXR_Error( 401, __( 'Sorry, you cannot edit pages.' ) ); do_action('xmlrpc_call', 'wp.getPages'); - $page_limit = 10; - if( isset( $num_pages ) ) { - $page_limit = $num_pages; - } - - $pages = get_posts( array('post_type' => 'page', 'post_status' => 'all', 'numberposts' => $page_limit) ); + $pages = get_posts( array('post_type' => 'page', 'post_status' => 'any', 'numberposts' => $num_pages) ); $num_pages = count($pages); // If we have pages, put together their info. - if($num_pages >= 1) { + if ( $num_pages >= 1 ) { $pages_struct = array(); - for($i = 0; $i < $num_pages; $i++) { + for ( $i = 0; $i < $num_pages; $i++ ) { $page = wp_xmlrpc_server::wp_getPage(array( $blog_id, $pages[$i]->ID, $username, $password )); @@ -641,16 +647,14 @@ class wp_xmlrpc_server extends IXR_Server { $page = $args[3]; $publish = $args[4]; - if ( !$user = $this->login($username, $password) ) { + if ( !$user = $this->login($username, $password) ) return $this->error; - } do_action('xmlrpc_call', 'wp.newPage'); // Make sure the user is allowed to add new pages. - if(!current_user_can("publish_pages")) { + if ( !current_user_can("publish_pages") ) return(new IXR_Error(401, __("Sorry, you cannot add new pages."))); - } // Mark this as content for a page. $args[3]["post_type"] = "page"; @@ -675,32 +679,25 @@ class wp_xmlrpc_server extends IXR_Server { $password = $args[2]; $page_id = (int) $args[3]; - if ( !$user = $this->login($username, $password) ) { + if ( !$user = $this->login($username, $password) ) return $this->error; - } do_action('xmlrpc_call', 'wp.deletePage'); // Get the current page based on the page_id and // make sure it is a page and not a post. $actual_page = wp_get_single_post($page_id, ARRAY_A); - if( - !$actual_page - || ($actual_page["post_type"] != "page") - ) { + if ( !$actual_page || ($actual_page["post_type"] != "page") ) return(new IXR_Error(404, __("Sorry, no such page."))); - } // Make sure the user can delete pages. - if(!current_user_can("delete_page", $page_id)) { + if ( !current_user_can("delete_page", $page_id) ) return(new IXR_Error(401, __("Sorry, you do not have the right to delete this page."))); - } // Attempt to delete the page. $result = wp_delete_post($page_id); - if(!$result) { + if ( !$result ) return(new IXR_Error(500, __("Failed to delete the page."))); - } return(true); } @@ -722,25 +719,19 @@ class wp_xmlrpc_server extends IXR_Server { $content = $args[4]; $publish = $args[5]; - if ( !$user = $this->login($username, $password) ) { + if ( !$user = $this->login($username, $password) ) return $this->error; - } do_action('xmlrpc_call', 'wp.editPage'); // Get the page data and make sure it is a page. $actual_page = wp_get_single_post($page_id, ARRAY_A); - if( - !$actual_page - || ($actual_page["post_type"] != "page") - ) { + if ( !$actual_page || ($actual_page["post_type"] != "page") ) return(new IXR_Error(404, __("Sorry, no such page."))); - } // Make sure the user is allowed to edit pages. - if(!current_user_can("edit_page", $page_id)) { + if ( !current_user_can("edit_page", $page_id) ) return(new IXR_Error(401, __("Sorry, you do not have the right to edit this page."))); - } // Mark this as content for a page. $content["post_type"] = "page"; @@ -775,11 +766,10 @@ class wp_xmlrpc_server extends IXR_Server { $username = $args[1]; $password = $args[2]; - if ( !$user = $this->login($username, $password) ) { + if ( !$user = $this->login($username, $password) ) return $this->error; - } - if( !current_user_can( 'edit_pages' ) ) + if ( !current_user_can( 'edit_pages' ) ) return new IXR_Error( 401, __( 'Sorry, you cannot edit pages.' ) ); do_action('xmlrpc_call', 'wp.getPageList'); @@ -790,7 +780,8 @@ class wp_xmlrpc_server extends IXR_Server { post_title page_title, post_parent page_parent_id, post_date_gmt, - post_date + post_date, + post_status FROM {$wpdb->posts} WHERE post_type = 'page' ORDER BY ID @@ -798,15 +789,22 @@ class wp_xmlrpc_server extends IXR_Server { // The date needs to be formated properly. $num_pages = count($page_list); - for($i = 0; $i < $num_pages; $i++) { + for ( $i = 0; $i < $num_pages; $i++ ) { $post_date = mysql2date("Ymd\TH:i:s", $page_list[$i]->post_date, false); $post_date_gmt = mysql2date("Ymd\TH:i:s", $page_list[$i]->post_date_gmt, false); $page_list[$i]->dateCreated = new IXR_Date($post_date); $page_list[$i]->date_created_gmt = new IXR_Date($post_date_gmt); + // For drafts use the GMT version of the date + if ( $page_list[$i]->post_status == 'draft' ) { + $page_list[$i]->date_created_gmt = get_gmt_from_date( mysql2date( 'Y-m-d H:i:s', $page_list[$i]->post_date ), 'Ymd\TH:i:s' ); + $page_list[$i]->date_created_gmt = new IXR_Date( $page_list[$i]->date_created_gmt ); + } + unset($page_list[$i]->post_date_gmt); unset($page_list[$i]->post_date); + unset($page_list[$i]->post_status); } return($page_list); @@ -828,18 +826,16 @@ class wp_xmlrpc_server extends IXR_Server { $username = $args[1]; $password = $args[2]; - if ( !$user = $this->login($username, $password) ) { + if ( !$user = $this->login($username, $password) ) return $this->error; - } - if(!current_user_can("edit_posts")) { - return(new IXR_Error(401, __("Sorry, you cannot edit posts on this blog."))); - } + if ( !current_user_can("edit_posts") ) + return(new IXR_Error(401, __("Sorry, you cannot edit posts on this site."))); do_action('xmlrpc_call', 'wp.getAuthors'); $authors = array(); - foreach( (array) get_users_of_blog() as $row ) { + foreach ( (array) get_users_of_blog() as $row ) { $authors[] = array( "user_id" => $row->user_id, "user_login" => $row->user_login, @@ -865,19 +861,17 @@ class wp_xmlrpc_server extends IXR_Server { $username = $args[1]; $password = $args[2]; - if ( !$user = $this->login($username, $password) ) { + if ( !$user = $this->login($username, $password) ) return $this->error; - } - if( !current_user_can( 'edit_posts' ) ) { - return new IXR_Error( 401, __( 'Sorry, you must be able to edit posts on this blog in order to view tags.' ) ); - } + if ( !current_user_can( 'edit_posts' ) ) + return new IXR_Error( 401, __( 'Sorry, you must be able to edit posts on this site in order to view tags.' ) ); do_action( 'xmlrpc_call', 'wp.getKeywords' ); $tags = array( ); - if( $all_tags = get_tags( ) ) { + if ( $all_tags = get_tags() ) { foreach( (array) $all_tags as $tag ) { $struct['tag_id'] = $tag->term_id; $struct['name'] = $tag->name; @@ -909,22 +903,19 @@ class wp_xmlrpc_server extends IXR_Server { $password = $args[2]; $category = $args[3]; - if ( !$user = $this->login($username, $password) ) { + if ( !$user = $this->login($username, $password) ) return $this->error; - } do_action('xmlrpc_call', 'wp.newCategory'); // Make sure the user is allowed to add a category. - if(!current_user_can("manage_categories")) { + if ( !current_user_can("manage_categories") ) return(new IXR_Error(401, __("Sorry, you do not have the right to add a category."))); - } // If no slug was provided make it empty so that // WordPress will generate one. - if(empty($category["slug"])) { + if ( empty($category["slug"]) ) $category["slug"] = ""; - } // If no parent_id was provided make it empty // so that it will be a top level page (no parent). @@ -932,9 +923,8 @@ class wp_xmlrpc_server extends IXR_Server { $category["parent_id"] = ""; // If no description was provided make it empty. - if(empty($category["description"])) { + if ( empty($category["description"]) ) $category["description"] = ""; - } $new_category = array( "cat_name" => $category["name"], @@ -943,8 +933,13 @@ class wp_xmlrpc_server extends IXR_Server { "category_description" => $category["description"] ); - $cat_id = wp_insert_category($new_category); - if(!$cat_id) { + $cat_id = wp_insert_category($new_category, true); + if ( is_wp_error( $cat_id ) ) { + if ( 'term_exists' == $cat_id->get_error_code() ) + return (int) $cat_id->get_error_data(); + else + return(new IXR_Error(500, __("Sorry, the new category failed."))); + } elseif ( ! $cat_id ) { return(new IXR_Error(500, __("Sorry, the new category failed."))); } @@ -967,15 +962,13 @@ class wp_xmlrpc_server extends IXR_Server { $password = $args[2]; $category_id = (int) $args[3]; - if ( !$user = $this->login($username, $password) ) { + if ( !$user = $this->login($username, $password) ) return $this->error; - } do_action('xmlrpc_call', 'wp.deleteCategory'); - if( !current_user_can("manage_categories") ) { + if ( !current_user_can("manage_categories") ) return new IXR_Error( 401, __( "Sorry, you do not have the right to delete a category." ) ); - } return wp_delete_category( $category_id ); } @@ -997,12 +990,11 @@ class wp_xmlrpc_server extends IXR_Server { $category = $args[3]; $max_results = (int) $args[4]; - if ( !$user = $this->login($username, $password) ) { + if ( !$user = $this->login($username, $password) ) return $this->error; - } - if( !current_user_can( 'edit_posts' ) ) - return new IXR_Error( 401, __( 'Sorry, you must be able to edit posts to this blog in order to view categories.' ) ); + if ( !current_user_can( 'edit_posts' ) ) + return new IXR_Error( 401, __( 'Sorry, you must be able to edit posts to this site in order to view categories.' ) ); do_action('xmlrpc_call', 'wp.suggestCategories'); @@ -1034,12 +1026,11 @@ class wp_xmlrpc_server extends IXR_Server { $password = $args[2]; $comment_id = (int) $args[3]; - if ( !$user = $this->login($username, $password) ) { + if ( !$user = $this->login($username, $password) ) return $this->error; - } if ( !current_user_can( 'moderate_comments' ) ) - return new IXR_Error( 403, __( 'You are not allowed to moderate comments on this blog.' ) ); + return new IXR_Error( 403, __( 'You are not allowed to moderate comments on this site.' ) ); do_action('xmlrpc_call', 'wp.getComment'); @@ -1050,11 +1041,11 @@ class wp_xmlrpc_server extends IXR_Server { $comment_date = mysql2date("Ymd\TH:i:s", $comment->comment_date, false); $comment_date_gmt = mysql2date("Ymd\TH:i:s", $comment->comment_date_gmt, false); - if ( 0 == $comment->comment_approved ) + if ( '0' == $comment->comment_approved ) $comment_status = 'hold'; else if ( 'spam' == $comment->comment_approved ) $comment_status = 'spam'; - else if ( 1 == $comment->comment_approved ) + else if ( '1' == $comment->comment_approved ) $comment_status = 'approve'; else $comment_status = $comment->comment_approved; @@ -1090,6 +1081,7 @@ class wp_xmlrpc_server extends IXR_Server { * @return array */ function wp_getComments($args) { + $raw_args = $args; $this->escape($args); $blog_id = (int) $args[0]; @@ -1097,9 +1089,8 @@ class wp_xmlrpc_server extends IXR_Server { $password = $args[2]; $struct = $args[3]; - if ( !$user = $this->login($username, $password) ) { + if ( !$user = $this->login($username, $password) ) return $this->error; - } if ( !current_user_can( 'moderate_comments' ) ) return new IXR_Error( 401, __( 'Sorry, you cannot edit comments.' ) ); @@ -1133,7 +1124,7 @@ class wp_xmlrpc_server extends IXR_Server { for ( $i = 0; $i < $num_comments; $i++ ) { $comment = wp_xmlrpc_server::wp_getComment(array( - $blog_id, $username, $password, $comments[$i]->comment_ID, + $raw_args[0], $raw_args[1], $raw_args[2], $comments[$i]->comment_ID, )); $comments_struct[] = $comment; } @@ -1157,12 +1148,11 @@ class wp_xmlrpc_server extends IXR_Server { $password = $args[2]; $comment_ID = (int) $args[3]; - if ( !$user = $this->login($username, $password) ) { + if ( !$user = $this->login($username, $password) ) return $this->error; - } if ( !current_user_can( 'moderate_comments' ) ) - return new IXR_Error( 403, __( 'You are not allowed to moderate comments on this blog.' ) ); + return new IXR_Error( 403, __( 'You are not allowed to moderate comments on this site.' ) ); do_action('xmlrpc_call', 'wp.deleteComment'); @@ -1189,12 +1179,11 @@ class wp_xmlrpc_server extends IXR_Server { $comment_ID = (int) $args[3]; $content_struct = $args[4]; - if ( !$user = $this->login($username, $password) ) { + if ( !$user = $this->login($username, $password) ) return $this->error; - } if ( !current_user_can( 'moderate_comments' ) ) - return new IXR_Error( 403, __( 'You are not allowed to moderate comments on this blog.' ) ); + return new IXR_Error( 403, __( 'You are not allowed to moderate comments on this site.' ) ); do_action('xmlrpc_call', 'wp.editComment'); @@ -1340,12 +1329,11 @@ class wp_xmlrpc_server extends IXR_Server { $username = $args[1]; $password = $args[2]; - if ( !$user = $this->login($username, $password) ) { + if ( !$user = $this->login($username, $password) ) return $this->error; - } if ( !current_user_can( 'moderate_comments' ) ) - return new IXR_Error( 403, __( 'You are not allowed access to details about this blog.' ) ); + return new IXR_Error( 403, __( 'You are not allowed access to details about this site.' ) ); do_action('xmlrpc_call', 'wp.getCommentStatusList'); @@ -1368,13 +1356,11 @@ class wp_xmlrpc_server extends IXR_Server { $password = $args[2]; $post_id = (int) $args[3]; - if ( !$user = $this->login($username, $password) ) { + if ( !$user = $this->login($username, $password) ) return $this->error; - } - if( !current_user_can( 'edit_posts' ) ) { + if ( !current_user_can( 'edit_posts' ) ) return new IXR_Error( 403, __( 'You are not allowed access to details about comments.' ) ); - } do_action('xmlrpc_call', 'wp.getCommentCount'); @@ -1402,13 +1388,11 @@ class wp_xmlrpc_server extends IXR_Server { $username = $args[1]; $password = $args[2]; - if ( !$user = $this->login($username, $password) ) { + if ( !$user = $this->login($username, $password) ) return $this->error; - } - if( !current_user_can( 'edit_posts' ) ) { - return new IXR_Error( 403, __( 'You are not allowed access to details about this blog.' ) ); - } + if ( !current_user_can( 'edit_posts' ) ) + return new IXR_Error( 403, __( 'You are not allowed access to details about this site.' ) ); do_action('xmlrpc_call', 'wp.getPostStatusList'); @@ -1430,13 +1414,11 @@ class wp_xmlrpc_server extends IXR_Server { $username = $args[1]; $password = $args[2]; - if ( !$user = $this->login($username, $password) ) { + if ( !$user = $this->login($username, $password) ) return $this->error; - } - if( !current_user_can( 'edit_posts' ) ) { - return new IXR_Error( 403, __( 'You are not allowed access to details about this blog.' ) ); - } + if ( !current_user_can( 'edit_posts' ) ) + return new IXR_Error( 403, __( 'You are not allowed access to details about this site.' ) ); do_action('xmlrpc_call', 'wp.getPageStatusList'); @@ -1458,13 +1440,11 @@ class wp_xmlrpc_server extends IXR_Server { $username = $args[1]; $password = $args[2]; - if ( !$user = $this->login($username, $password) ) { + if ( !$user = $this->login($username, $password) ) return $this->error; - } - if( !current_user_can( 'edit_pages' ) ) { - return new IXR_Error( 403, __( 'You are not allowed access to details about this blog.' ) ); - } + if ( !current_user_can( 'edit_pages' ) ) + return new IXR_Error( 403, __( 'You are not allowed access to details about this site.' ) ); $templates = get_page_templates( ); $templates['Default'] = 'default'; @@ -1488,14 +1468,12 @@ class wp_xmlrpc_server extends IXR_Server { $password = $args[2]; $options = (array) $args[3]; - if ( !$user = $this->login($username, $password) ) { + if ( !$user = $this->login($username, $password) ) return $this->error; - } // If no specific options where asked for, return all of them - if (count( $options ) == 0 ) { + if ( count( $options ) == 0 ) $options = array_keys($this->blog_options); - } return $this->_getOptions($options); } @@ -1508,15 +1486,13 @@ class wp_xmlrpc_server extends IXR_Server { * @param array $options Options to retrieve. * @return array */ - function _getOptions($options) - { + function _getOptions($options) { $data = array( ); - foreach( $options as $option ) { - if( array_key_exists( $option, $this->blog_options ) ) - { + foreach ( $options as $option ) { + if ( array_key_exists( $option, $this->blog_options ) ) { $data[$option] = $this->blog_options[$option]; //Is the value static or dynamic? - if( isset( $data[$option]['option'] ) ) { + if ( isset( $data[$option]['option'] ) ) { $data[$option]['value'] = get_option( $data[$option]['option'] ); unset($data[$option]['option']); } @@ -1542,22 +1518,18 @@ class wp_xmlrpc_server extends IXR_Server { $password = $args[2]; $options = (array) $args[3]; - if ( !$user = $this->login($username, $password) ) { + if ( !$user = $this->login($username, $password) ) return $this->error; - } - if( !current_user_can( 'manage_options' ) ) + if ( !current_user_can( 'manage_options' ) ) return new IXR_Error( 403, __( 'You are not allowed to update options.' ) ); - foreach( $options as $o_name => $o_value ) { + foreach ( $options as $o_name => $o_value ) { $option_names[] = $o_name; - if( empty( $o_value ) ) + if ( !array_key_exists( $o_name, $this->blog_options ) ) continue; - if( !array_key_exists( $o_name, $this->blog_options ) ) - continue; - - if( $this->blog_options[$o_name]['readonly'] == true ) + if ( $this->blog_options[$o_name]['readonly'] == true ) continue; update_option( $this->blog_options[$o_name]['option'], $o_value ); @@ -1582,15 +1554,16 @@ class wp_xmlrpc_server extends IXR_Server { * @return array */ function blogger_getUsersBlogs($args) { + if ( is_multisite() ) + return $this->_multisite_getUsersBlogs($args); $this->escape($args); $username = $args[1]; $password = $args[2]; - if ( !$user = $this->login($username, $password) ) { + if ( !$user = $this->login($username, $password) ) return $this->error; - } do_action('xmlrpc_call', 'blogger.getUsersBlogs'); @@ -1607,6 +1580,35 @@ class wp_xmlrpc_server extends IXR_Server { return array($struct); } + /** + * Private function for retrieving a users blogs for multisite setups + * + * @access protected + */ + function _multisite_getUsersBlogs($args) { + global $current_blog; + $domain = $current_blog->domain; + $path = $current_blog->path . 'xmlrpc.php'; + $protocol = is_ssl() ? 'https' : 'http'; + + $rpc = new IXR_Client("$protocol://{$domain}{$path}"); + $rpc->query('wp.getUsersBlogs', $args[1], $args[2]); + $blogs = $rpc->getResponse(); + + if ( isset($blogs['faultCode']) ) + return new IXR_Error($blogs['faultCode'], $blogs['faultString']); + + if ( $_SERVER['HTTP_HOST'] == $domain && $_SERVER['REQUEST_URI'] == $path ) { + return $blogs; + } else { + foreach ( (array) $blogs as $blog ) { + if ( strpos($blog['url'], $_SERVER['HTTP_HOST']) ) + return array($blog); + } + return array(); + } + } + /** * Retrieve user's data. * @@ -1624,12 +1626,11 @@ class wp_xmlrpc_server extends IXR_Server { $username = $args[1]; $password = $args[2]; - if ( !$user = $this->login($username, $password) ) { + if ( !$user = $this->login($username, $password) ) return $this->error; - } - if( !current_user_can( 'edit_posts' ) ) - return new IXR_Error( 401, __( 'Sorry, you do not have access to user data on this blog.' ) ); + if ( !current_user_can( 'edit_posts' ) ) + return new IXR_Error( 401, __( 'Sorry, you do not have access to user data on this site.' ) ); do_action('xmlrpc_call', 'blogger.getUserInfo'); @@ -1660,11 +1661,10 @@ class wp_xmlrpc_server extends IXR_Server { $username = $args[2]; $password = $args[3]; - if ( !$user = $this->login($username, $password) ) { + if ( !$user = $this->login($username, $password) ) return $this->error; - } - if( !current_user_can( 'edit_post', $post_ID ) ) + if ( !current_user_can( 'edit_post', $post_ID ) ) return new IXR_Error( 401, __( 'Sorry, you cannot edit this post.' ) ); do_action('xmlrpc_call', 'blogger.getPost'); @@ -1704,21 +1704,20 @@ class wp_xmlrpc_server extends IXR_Server { $password = $args[3]; $num_posts = $args[4]; - if ( !$user = $this->login($username, $password) ) { + if ( !$user = $this->login($username, $password) ) return $this->error; - } do_action('xmlrpc_call', 'blogger.getRecentPosts'); $posts_list = wp_get_recent_posts($num_posts); - if (!$posts_list) { + if ( !$posts_list ) { $this->error = new IXR_Error(500, __('Either there are no posts, or something went wrong.')); return $this->error; } foreach ($posts_list as $entry) { - if( !current_user_can( 'edit_post', $entry['ID'] ) ) + if ( !current_user_can( 'edit_post', $entry['ID'] ) ) continue; $post_date = mysql2date('Ymd\TH:i:s', $entry['post_date'], false); @@ -1738,7 +1737,7 @@ class wp_xmlrpc_server extends IXR_Server { } $recent_posts = array(); - for ($j=0; $jlogin($username, $password) ) { + if ( !$user = $this->login($username, $password) ) return $this->error; - } do_action('xmlrpc_call', 'blogger.getTemplate'); - if ( !current_user_can('edit_themes') ) { + if ( !current_user_can('edit_themes') ) return new IXR_Error(401, __('Sorry, this user can not edit the template.')); - } /* warning: here we make the assumption that the blog's URL is on the same server */ $filename = get_option('home') . '/'; @@ -1804,15 +1801,13 @@ class wp_xmlrpc_server extends IXR_Server { $content = $args[4]; $template = $args[5]; /* could be 'main' or 'archiveIndex', but we don't use it */ - if ( !$user = $this->login($username, $password) ) { + if ( !$user = $this->login($username, $password) ) return $this->error; - } do_action('xmlrpc_call', 'blogger.setTemplate'); - if ( !current_user_can('edit_themes') ) { + if ( !current_user_can('edit_themes') ) return new IXR_Error(401, __('Sorry, this user cannot edit the template.')); - } /* warning: here we make the assumption that the blog's URL is on the same server */ $filename = get_option('home') . '/'; @@ -1846,15 +1841,14 @@ class wp_xmlrpc_server extends IXR_Server { $content = $args[4]; $publish = $args[5]; - if ( !$user = $this->login($username, $password) ) { + if ( !$user = $this->login($username, $password) ) return $this->error; - } do_action('xmlrpc_call', 'blogger.newPost'); $cap = ($publish) ? 'publish_posts' : 'edit_posts'; if ( !current_user_can($cap) ) - return new IXR_Error(401, __('Sorry, you are not allowed to post on this blog.')); + return new IXR_Error(401, __('Sorry, you are not allowed to post on this site.')); $post_status = ($publish) ? 'publish' : 'draft'; @@ -1873,7 +1867,7 @@ class wp_xmlrpc_server extends IXR_Server { if ( is_wp_error( $post_ID ) ) return new IXR_Error(500, $post_ID->get_error_message()); - if (!$post_ID) + if ( !$post_ID ) return new IXR_Error(500, __('Sorry, your entry could not be posted. Something wrong happened.')); $this->attach_uploads( $post_ID, $post_content ); @@ -1901,17 +1895,15 @@ class wp_xmlrpc_server extends IXR_Server { $content = $args[4]; $publish = $args[5]; - if ( !$user = $this->login($username, $password) ) { + if ( !$user = $this->login($username, $password) ) return $this->error; - } do_action('xmlrpc_call', 'blogger.editPost'); $actual_post = wp_get_single_post($post_ID,ARRAY_A); - if (!$actual_post || $actual_post['post_type'] != 'post') { + if ( !$actual_post || $actual_post['post_type'] != 'post' ) return new IXR_Error(404, __('Sorry, no such post.')); - } $this->escape($actual_post); @@ -1931,9 +1923,9 @@ class wp_xmlrpc_server extends IXR_Server { $result = wp_update_post($postdata); - if (!$result) { + if ( !$result ) return new IXR_Error(500, __('For some strange yet very annoying reason, this post could not be edited.')); - } + $this->attach_uploads( $ID, $post_content ); return true; @@ -1955,26 +1947,23 @@ class wp_xmlrpc_server extends IXR_Server { $password = $args[3]; $publish = $args[4]; - if ( !$user = $this->login($username, $password) ) { + if ( !$user = $this->login($username, $password) ) return $this->error; - } do_action('xmlrpc_call', 'blogger.deletePost'); $actual_post = wp_get_single_post($post_ID,ARRAY_A); - if (!$actual_post || $actual_post['post_type'] != 'post') { + if ( !$actual_post || $actual_post['post_type'] != 'post' ) return new IXR_Error(404, __('Sorry, no such post.')); - } if ( !current_user_can('edit_post', $post_ID) ) return new IXR_Error(401, __('Sorry, you do not have the right to delete this post.')); $result = wp_delete_post($post_ID); - if (!$result) { + if ( !$result ) return new IXR_Error(500, __('For some strange yet very annoying reason, this post could not be deleted.')); - } return true; } @@ -2000,76 +1989,63 @@ class wp_xmlrpc_server extends IXR_Server { $content_struct = $args[3]; $publish = $args[4]; - if ( !$user = $this->login($username, $password) ) { + if ( !$user = $this->login($username, $password) ) return $this->error; - } do_action('xmlrpc_call', 'metaWeblog.newPost'); $cap = ( $publish ) ? 'publish_posts' : 'edit_posts'; - $error_message = __( 'Sorry, you are not allowed to publish posts on this blog.' ); + $error_message = __( 'Sorry, you are not allowed to publish posts on this site.' ); $post_type = 'post'; $page_template = ''; - if( !empty( $content_struct['post_type'] ) ) { - if( $content_struct['post_type'] == 'page' ) { + if ( !empty( $content_struct['post_type'] ) ) { + if ( $content_struct['post_type'] == 'page' ) { $cap = ( $publish ) ? 'publish_pages' : 'edit_pages'; - $error_message = __( 'Sorry, you are not allowed to publish pages on this blog.' ); + $error_message = __( 'Sorry, you are not allowed to publish pages on this site.' ); $post_type = 'page'; - if( !empty( $content_struct['wp_page_template'] ) ) + if ( !empty( $content_struct['wp_page_template'] ) ) $page_template = $content_struct['wp_page_template']; - } - elseif( $content_struct['post_type'] == 'post' ) { + } elseif ( $content_struct['post_type'] == 'post' ) { // This is the default, no changes needed - } - else { + } else { // No other post_type values are allowed here return new IXR_Error( 401, __( 'Invalid post type.' ) ); } } - if( !current_user_can( $cap ) ) { + if ( !current_user_can( $cap ) ) return new IXR_Error( 401, $error_message ); - } // Let WordPress generate the post_name (slug) unless // one has been provided. $post_name = ""; - if(isset($content_struct["wp_slug"])) { + if ( isset($content_struct["wp_slug"]) ) $post_name = $content_struct["wp_slug"]; - } // Only use a password if one was given. - if(isset($content_struct["wp_password"])) { + if ( isset($content_struct["wp_password"]) ) $post_password = $content_struct["wp_password"]; - } // Only set a post parent if one was provided. - if(isset($content_struct["wp_page_parent_id"])) { + if ( isset($content_struct["wp_page_parent_id"]) ) $post_parent = $content_struct["wp_page_parent_id"]; - } // Only set the menu_order if it was provided. - if(isset($content_struct["wp_page_order"])) { + if ( isset($content_struct["wp_page_order"]) ) $menu_order = $content_struct["wp_page_order"]; - } $post_author = $user->ID; // If an author id was provided then use it instead. - if( - isset($content_struct["wp_author_id"]) - && ($user->ID != $content_struct["wp_author_id"]) - ) { - switch($post_type) { + if ( isset($content_struct["wp_author_id"]) && ($user->ID != $content_struct["wp_author_id"]) ) { + switch ( $post_type ) { case "post": - if(!current_user_can("edit_others_posts")) { + if ( !current_user_can("edit_others_posts") ) return(new IXR_Error(401, __("You are not allowed to post as this user"))); - } break; case "page": - if(!current_user_can("edit_others_pages")) { + if ( !current_user_can("edit_others_pages") ) return(new IXR_Error(401, __("You are not allowed to create pages as this user"))); - } break; default: return(new IXR_Error(401, __("Invalid post type."))); @@ -2079,12 +2055,12 @@ class wp_xmlrpc_server extends IXR_Server { } $post_title = $content_struct['title']; - $post_content = apply_filters( 'content_save_pre', $content_struct['description'] ); + $post_content = $content_struct['description']; $post_status = $publish ? 'publish' : 'draft'; - if( isset( $content_struct["{$post_type}_status"] ) ) { - switch( $content_struct["{$post_type}_status"] ) { + if ( isset( $content_struct["{$post_type}_status"] ) ) { + switch ( $content_struct["{$post_type}_status"] ) { case 'draft': case 'private': case 'publish': @@ -2092,9 +2068,8 @@ class wp_xmlrpc_server extends IXR_Server { break; case 'pending': // Pending is only valid for posts, not pages. - if( $post_type === 'post' ) { + if ( $post_type === 'post' ) $post_status = $content_struct["{$post_type}_status"]; - } break; default: $post_status = $publish ? 'publish' : 'draft'; @@ -2107,9 +2082,9 @@ class wp_xmlrpc_server extends IXR_Server { $tags_input = $content_struct['mt_keywords']; - if(isset($content_struct["mt_allow_comments"])) { - if(!is_numeric($content_struct["mt_allow_comments"])) { - switch($content_struct["mt_allow_comments"]) { + if ( isset($content_struct["mt_allow_comments"]) ) { + if ( !is_numeric($content_struct["mt_allow_comments"]) ) { + switch ( $content_struct["mt_allow_comments"] ) { case "closed": $comment_status = "closed"; break; @@ -2120,9 +2095,8 @@ class wp_xmlrpc_server extends IXR_Server { $comment_status = get_option("default_comment_status"); break; } - } - else { - switch((int) $content_struct["mt_allow_comments"]) { + } else { + switch ( (int) $content_struct["mt_allow_comments"] ) { case 0: case 2: $comment_status = "closed"; @@ -2135,14 +2109,13 @@ class wp_xmlrpc_server extends IXR_Server { break; } } - } - else { + } else { $comment_status = get_option("default_comment_status"); } - if(isset($content_struct["mt_allow_pings"])) { - if(!is_numeric($content_struct["mt_allow_pings"])) { - switch($content_struct['mt_allow_pings']) { + if ( isset($content_struct["mt_allow_pings"]) ) { + if ( !is_numeric($content_struct["mt_allow_pings"]) ) { + switch ( $content_struct['mt_allow_pings'] ) { case "closed": $ping_status = "closed"; break; @@ -2153,9 +2126,8 @@ class wp_xmlrpc_server extends IXR_Server { $ping_status = get_option("default_ping_status"); break; } - } - else { - switch((int) $content_struct["mt_allow_pings"]) { + } else { + switch ( (int) $content_struct["mt_allow_pings"] ) { case 0: $ping_status = "closed"; break; @@ -2167,14 +2139,12 @@ class wp_xmlrpc_server extends IXR_Server { break; } } - } - else { + } else { $ping_status = get_option("default_ping_status"); } - if ($post_more) { + if ( $post_more ) $post_content = $post_content . "" . $post_more; - } $to_ping = $content_struct['mt_tb_ping_urls']; if ( is_array($to_ping) ) @@ -2198,7 +2168,7 @@ class wp_xmlrpc_server extends IXR_Server { logIO('O', 'Post cats: ' . var_export($catnames,true)); $post_category = array(); - if (is_array($catnames)) { + if ( is_array($catnames) ) { foreach ($catnames as $cat) { $post_category[] = get_cat_ID($cat); } @@ -2211,20 +2181,19 @@ class wp_xmlrpc_server extends IXR_Server { if ( is_wp_error( $post_ID ) ) return new IXR_Error(500, $post_ID->get_error_message()); - if (!$post_ID) { + if ( !$post_ID ) return new IXR_Error(500, __('Sorry, your entry could not be posted. Something wrong happened.')); - } // Only posts can be sticky - if ( $post_type == 'post' && isset( $content_struct['sticky'] ) ) + if ( $post_type == 'post' && isset( $content_struct['sticky'] ) ) { if ( $content_struct['sticky'] == true ) stick_post( $post_ID ); elseif ( $content_struct['sticky'] == false ) unstick_post( $post_ID ); + } - if ( isset($content_struct['custom_fields']) ) { + if ( isset($content_struct['custom_fields']) ) $this->set_custom_fields($post_ID, $content_struct['custom_fields']); - } // Handle enclosures $this->add_enclosure_if_new($post_ID, $content_struct['enclosure']); @@ -2237,7 +2206,7 @@ class wp_xmlrpc_server extends IXR_Server { } function add_enclosure_if_new($post_ID, $enclosure) { - if( is_array( $enclosure ) && isset( $enclosure['url'] ) && isset( $enclosure['length'] ) && isset( $enclosure['type'] ) ) { + if ( is_array( $enclosure ) && isset( $enclosure['url'] ) && isset( $enclosure['length'] ) && isset( $enclosure['type'] ) ) { $encstring = $enclosure['url'] . "\n" . $enclosure['length'] . "\n" . $enclosure['type']; $found = false; @@ -2251,9 +2220,8 @@ class wp_xmlrpc_server extends IXR_Server { } } } - if (!$found) { + if (!$found) add_post_meta( $post_ID, 'enclosure', $encstring ); - } } } @@ -2269,12 +2237,11 @@ class wp_xmlrpc_server extends IXR_Server { global $wpdb; // find any unattached files - $attachments = $wpdb->get_results( "SELECT ID, guid FROM {$wpdb->posts} WHERE post_parent = '-1' AND post_type = 'attachment'" ); - if( is_array( $attachments ) ) { - foreach( $attachments as $file ) { - if( strpos( $post_content, $file->guid ) !== false ) { + $attachments = $wpdb->get_results( "SELECT ID, guid FROM {$wpdb->posts} WHERE post_parent = '0' AND post_type = 'attachment'" ); + if ( is_array( $attachments ) ) { + foreach ( $attachments as $file ) { + if ( strpos( $post_content, $file->guid ) !== false ) $wpdb->update($wpdb->posts, array('post_parent' => $post_ID), array('ID' => $file->ID) ); - } } } } @@ -2297,87 +2264,73 @@ class wp_xmlrpc_server extends IXR_Server { $content_struct = $args[3]; $publish = $args[4]; - if ( !$user = $this->login($username, $password) ) { + if ( !$user = $this->login($username, $password) ) return $this->error; - } do_action('xmlrpc_call', 'metaWeblog.editPost'); $cap = ( $publish ) ? 'publish_posts' : 'edit_posts'; - $error_message = __( 'Sorry, you are not allowed to publish posts on this blog.' ); + $error_message = __( 'Sorry, you are not allowed to publish posts on this site.' ); $post_type = 'post'; $page_template = ''; - if( !empty( $content_struct['post_type'] ) ) { - if( $content_struct['post_type'] == 'page' ) { + if ( !empty( $content_struct['post_type'] ) ) { + if ( $content_struct['post_type'] == 'page' ) { $cap = ( $publish ) ? 'publish_pages' : 'edit_pages'; - $error_message = __( 'Sorry, you are not allowed to publish pages on this blog.' ); + $error_message = __( 'Sorry, you are not allowed to publish pages on this site.' ); $post_type = 'page'; - if( !empty( $content_struct['wp_page_template'] ) ) + if ( !empty( $content_struct['wp_page_template'] ) ) $page_template = $content_struct['wp_page_template']; - } - elseif( $content_struct['post_type'] == 'post' ) { + } elseif ( $content_struct['post_type'] == 'post' ) { // This is the default, no changes needed - } - else { + } else { // No other post_type values are allowed here return new IXR_Error( 401, __( 'Invalid post type.' ) ); } } - if( !current_user_can( $cap ) ) { + if ( !current_user_can( $cap ) ) return new IXR_Error( 401, $error_message ); - } $postdata = wp_get_single_post($post_ID, ARRAY_A); // If there is no post data for the give post id, stop // now and return an error. Other wise a new post will be // created (which was the old behavior). - if(empty($postdata["ID"])) { + if ( empty($postdata["ID"]) ) return(new IXR_Error(404, __("Invalid post ID."))); - } $this->escape($postdata); extract($postdata, EXTR_SKIP); // Let WordPress manage slug if none was provided. $post_name = ""; - if(isset($content_struct["wp_slug"])) { + if ( isset($content_struct["wp_slug"]) ) $post_name = $content_struct["wp_slug"]; - } // Only use a password if one was given. - if(isset($content_struct["wp_password"])) { + if ( isset($content_struct["wp_password"]) ) $post_password = $content_struct["wp_password"]; - } // Only set a post parent if one was given. - if(isset($content_struct["wp_page_parent_id"])) { + if ( isset($content_struct["wp_page_parent_id"]) ) $post_parent = $content_struct["wp_page_parent_id"]; - } // Only set the menu_order if it was given. - if(isset($content_struct["wp_page_order"])) { + if ( isset($content_struct["wp_page_order"]) ) $menu_order = $content_struct["wp_page_order"]; - } $post_author = $postdata["post_author"]; // Only set the post_author if one is set. - if( - isset($content_struct["wp_author_id"]) - && ($user->ID != $content_struct["wp_author_id"]) - ) { - switch($post_type) { + if ( isset($content_struct["wp_author_id"]) && ($user->ID != $content_struct["wp_author_id"]) ) { + switch ( $post_type ) { case "post": - if(!current_user_can("edit_others_posts")) { + if ( !current_user_can("edit_others_posts") ) return(new IXR_Error(401, __("You are not allowed to change the post author as this user."))); - } break; case "page": - if(!current_user_can("edit_others_pages")) { + if ( !current_user_can("edit_others_pages") ) return(new IXR_Error(401, __("You are not allowed to change the page author as this user."))); - } break; default: return(new IXR_Error(401, __("Invalid post type."))); @@ -2386,9 +2339,9 @@ class wp_xmlrpc_server extends IXR_Server { $post_author = $content_struct["wp_author_id"]; } - if(isset($content_struct["mt_allow_comments"])) { - if(!is_numeric($content_struct["mt_allow_comments"])) { - switch($content_struct["mt_allow_comments"]) { + if ( isset($content_struct["mt_allow_comments"]) ) { + if ( !is_numeric($content_struct["mt_allow_comments"]) ) { + switch ( $content_struct["mt_allow_comments"] ) { case "closed": $comment_status = "closed"; break; @@ -2399,9 +2352,8 @@ class wp_xmlrpc_server extends IXR_Server { $comment_status = get_option("default_comment_status"); break; } - } - else { - switch((int) $content_struct["mt_allow_comments"]) { + } else { + switch ( (int) $content_struct["mt_allow_comments"] ) { case 0: case 2: $comment_status = "closed"; @@ -2416,9 +2368,9 @@ class wp_xmlrpc_server extends IXR_Server { } } - if(isset($content_struct["mt_allow_pings"])) { - if(!is_numeric($content_struct["mt_allow_pings"])) { - switch($content_struct["mt_allow_pings"]) { + if ( isset($content_struct["mt_allow_pings"]) ) { + if ( !is_numeric($content_struct["mt_allow_pings"]) ) { + switch ( $content_struct["mt_allow_pings"] ) { case "closed": $ping_status = "closed"; break; @@ -2429,9 +2381,8 @@ class wp_xmlrpc_server extends IXR_Server { $ping_status = get_option("default_ping_status"); break; } - } - else { - switch((int) $content_struct["mt_allow_pings"]) { + } else { + switch ( (int) $content_struct["mt_allow_pings"] ) { case 0: $ping_status = "closed"; break; @@ -2446,12 +2397,12 @@ class wp_xmlrpc_server extends IXR_Server { } $post_title = $content_struct['title']; - $post_content = apply_filters( 'content_save_pre', $content_struct['description'] ); + $post_content = $content_struct['description']; $catnames = $content_struct['categories']; $post_category = array(); - if (is_array($catnames)) { + if ( is_array($catnames) ) { foreach ($catnames as $cat) { $post_category[] = get_cat_ID($cat); } @@ -2461,7 +2412,7 @@ class wp_xmlrpc_server extends IXR_Server { $post_more = $content_struct['mt_text_more']; $post_status = $publish ? 'publish' : 'draft'; - if( isset( $content_struct["{$post_type}_status"] ) ) { + if ( isset( $content_struct["{$post_type}_status"] ) ) { switch( $content_struct["{$post_type}_status"] ) { case 'draft': case 'private': @@ -2470,9 +2421,8 @@ class wp_xmlrpc_server extends IXR_Server { break; case 'pending': // Pending is only valid for posts, not pages. - if( $post_type === 'post' ) { + if ( $post_type === 'post' ) $post_status = $content_struct["{$post_type}_status"]; - } break; default: $post_status = $publish ? 'publish' : 'draft'; @@ -2489,9 +2439,8 @@ class wp_xmlrpc_server extends IXR_Server { return new IXR_Error(401, __('Sorry, you do not have the right to publish this post.')); } - if ($post_more) { + if ( $post_more ) $post_content = $post_content . "" . $post_more; - } $to_ping = $content_struct['mt_tb_ping_urls']; if ( is_array($to_ping) ) @@ -2518,20 +2467,19 @@ class wp_xmlrpc_server extends IXR_Server { if ( is_wp_error( $result ) ) return new IXR_Error(500, $result->get_error_message()); - if (!$result) { + if ( !$result ) return new IXR_Error(500, __('Sorry, your entry could not be edited. Something wrong happened.')); - } // Only posts can be sticky - if ( $post_type == 'post' && isset( $content_struct['sticky'] ) ) + if ( $post_type == 'post' && isset( $content_struct['sticky'] ) ) { if ( $content_struct['sticky'] == true ) stick_post( $post_ID ); elseif ( $content_struct['sticky'] == false ) unstick_post( $post_ID ); + } - if ( isset($content_struct['custom_fields']) ) { + if ( isset($content_struct['custom_fields']) ) $this->set_custom_fields($post_ID, $content_struct['custom_fields']); - } // Handle enclosures $this->add_enclosure_if_new($post_ID, $content_struct['enclosure']); @@ -2559,11 +2507,10 @@ class wp_xmlrpc_server extends IXR_Server { $username = $args[1]; $password = $args[2]; - if ( !$user = $this->login($username, $password) ) { + if ( !$user = $this->login($username, $password) ) return $this->error; - } - if( !current_user_can( 'edit_post', $post_ID ) ) + if ( !current_user_can( 'edit_post', $post_ID ) ) return new IXR_Error( 401, __( 'Sorry, you cannot edit this post.' ) ); do_action('xmlrpc_call', 'metaWeblog.getPost'); @@ -2574,6 +2521,10 @@ class wp_xmlrpc_server extends IXR_Server { $post_date = mysql2date('Ymd\TH:i:s', $postdata['post_date'], false); $post_date_gmt = mysql2date('Ymd\TH:i:s', $postdata['post_date_gmt'], false); + // For drafts use the GMT version of the post date + if ( $postdata['post_status'] == 'draft' ) + $post_date_gmt = get_gmt_from_date( mysql2date( 'Y-m-d H:i:s', $postdata['post_date'] ), 'Ymd\TH:i:s' ); + $categories = array(); $catids = wp_get_post_categories($post_ID); foreach($catids as $catid) @@ -2599,9 +2550,8 @@ class wp_xmlrpc_server extends IXR_Server { $allow_pings = ('open' == $postdata['ping_status']) ? 1 : 0; // Consider future posts as published - if( $postdata['post_status'] === 'future' ) { + if ( $postdata['post_status'] === 'future' ) $postdata['post_status'] = 'publish'; - } $sticky = false; if ( is_sticky( $post_ID ) ) @@ -2613,7 +2563,7 @@ class wp_xmlrpc_server extends IXR_Server { foreach ( (array) $val as $enc ) { $encdata = split("\n", $enc); $enclosure['url'] = trim(htmlspecialchars($encdata[0])); - $enclosure['length'] = trim($encdata[1]); + $enclosure['length'] = (int) trim($encdata[1]); $enclosure['type'] = trim($encdata[2]); break 2; } @@ -2646,7 +2596,7 @@ class wp_xmlrpc_server extends IXR_Server { 'sticky' => $sticky ); - if (!empty($enclosure)) $resp['enclosure'] = $enclosure; + if ( !empty($enclosure) ) $resp['enclosure'] = $enclosure; return $resp; } else { @@ -2671,30 +2621,31 @@ class wp_xmlrpc_server extends IXR_Server { $password = $args[2]; $num_posts = (int) $args[3]; - if ( !$user = $this->login($username, $password) ) { + if ( !$user = $this->login($username, $password) ) return $this->error; - } do_action('xmlrpc_call', 'metaWeblog.getRecentPosts'); $posts_list = wp_get_recent_posts($num_posts); - if (!$posts_list) { + if ( !$posts_list ) return array( ); - } foreach ($posts_list as $entry) { - if( !current_user_can( 'edit_post', $entry['ID'] ) ) + if ( !current_user_can( 'edit_post', $entry['ID'] ) ) continue; $post_date = mysql2date('Ymd\TH:i:s', $entry['post_date'], false); $post_date_gmt = mysql2date('Ymd\TH:i:s', $entry['post_date_gmt'], false); + // For drafts use the GMT version of the date + if ( $entry['post_status'] == 'draft' ) + $post_date_gmt = get_gmt_from_date( mysql2date( 'Y-m-d H:i:s', $entry['post_date'] ), 'Ymd\TH:i:s' ); + $categories = array(); $catids = wp_get_post_categories($entry['ID']); - foreach($catids as $catid) { + foreach( $catids as $catid ) $categories[] = get_cat_name($catid); - } $tagnames = array(); $tags = wp_get_post_tags( $entry['ID'] ); @@ -2717,9 +2668,8 @@ class wp_xmlrpc_server extends IXR_Server { $allow_pings = ('open' == $entry['ping_status']) ? 1 : 0; // Consider future posts as published - if( $entry['post_status'] === 'future' ) { + if ( $entry['post_status'] === 'future' ) $entry['post_status'] = 'publish'; - } $struct[] = array( 'dateCreated' => new IXR_Date($post_date), @@ -2749,7 +2699,7 @@ class wp_xmlrpc_server extends IXR_Server { } $recent_posts = array(); - for ($j=0; $jlogin($username, $password) ) { + if ( !$user = $this->login($username, $password) ) return $this->error; - } - if( !current_user_can( 'edit_posts' ) ) - return new IXR_Error( 401, __( 'Sorry, you must be able to edit posts on this blog in order to view categories.' ) ); + if ( !current_user_can( 'edit_posts' ) ) + return new IXR_Error( 401, __( 'Sorry, you must be able to edit posts on this site in order to view categories.' ) ); do_action('xmlrpc_call', 'metaWeblog.getCategories'); $categories_struct = array(); - if ( $cats = get_categories('get=all') ) { + if ( $cats = get_categories(array('get' => 'all')) ) { foreach ( $cats as $cat ) { $struct['categoryId'] = $cat->term_id; $struct['parentId'] = $cat->parent; @@ -2826,9 +2775,8 @@ class wp_xmlrpc_server extends IXR_Server { logIO('O', '(MW) Received '.strlen($bits).' bytes'); - if ( !$user = $this->login($username, $password) ) { + if ( !$user = $this->login($username, $password) ) return $this->error; - } do_action('xmlrpc_call', 'metaWeblog.newMediaObject'); @@ -2841,7 +2789,7 @@ class wp_xmlrpc_server extends IXR_Server { if ( $upload_err = apply_filters( "pre_upload_error", false ) ) return new IXR_Error(500, $upload_err); - if(!empty($data["overwrite"]) && ($data["overwrite"] == true)) { + if ( !empty($data["overwrite"]) && ($data["overwrite"] == true) ) { // Get postmeta info on the object. $old_file = $wpdb->get_row(" SELECT ID @@ -2866,8 +2814,8 @@ class wp_xmlrpc_server extends IXR_Server { return new IXR_Error(500, $errorString); } // Construct the attachment array - // attach to post_id -1 - $post_id = -1; + // attach to post_id 0 + $post_id = 0; $attachment = array( 'post_title' => $name, 'post_content' => '', @@ -2881,7 +2829,7 @@ class wp_xmlrpc_server extends IXR_Server { $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 ) ); + return apply_filters( 'wp_handle_upload', array( 'file' => $name, 'url' => $upload[ 'url' ], 'type' => $type ), 'upload' ); } /* MovableType API functions @@ -2905,26 +2853,29 @@ class wp_xmlrpc_server extends IXR_Server { $password = $args[2]; $num_posts = (int) $args[3]; - if ( !$user = $this->login($username, $password) ) { + if ( !$user = $this->login($username, $password) ) return $this->error; - } do_action('xmlrpc_call', 'mt.getRecentPostTitles'); $posts_list = wp_get_recent_posts($num_posts); - if (!$posts_list) { + if ( !$posts_list ) { $this->error = new IXR_Error(500, __('Either there are no posts, or something went wrong.')); return $this->error; } foreach ($posts_list as $entry) { - if( !current_user_can( 'edit_post', $entry['ID'] ) ) + if ( !current_user_can( 'edit_post', $entry['ID'] ) ) continue; $post_date = mysql2date('Ymd\TH:i:s', $entry['post_date'], false); $post_date_gmt = mysql2date('Ymd\TH:i:s', $entry['post_date_gmt'], false); + // For drafts use the GMT version of the date + if ( $entry['post_status'] == 'draft' ) + $post_date_gmt = get_gmt_from_date( mysql2date( 'Y-m-d H:i:s', $entry['post_date'] ), 'Ymd\TH:i:s' ); + $struct[] = array( 'dateCreated' => new IXR_Date($post_date), 'userid' => $entry['post_author'], @@ -2936,7 +2887,7 @@ class wp_xmlrpc_server extends IXR_Server { } $recent_posts = array(); - for ($j=0; $jlogin($username, $password) ) { + if ( !$user = $this->login($username, $password) ) return $this->error; - } - if( !current_user_can( 'edit_posts' ) ) - return new IXR_Error( 401, __( 'Sorry, you must be able to edit posts on this blog in order to view categories.' ) ); + if ( !current_user_can( 'edit_posts' ) ) + return new IXR_Error( 401, __( 'Sorry, you must be able to edit posts on this site in order to view categories.' ) ); do_action('xmlrpc_call', 'mt.getCategoryList'); $categories_struct = array(); - if ( $cats = get_categories('hide_empty=0&hierarchical=0') ) { - foreach ($cats as $cat) { + if ( $cats = get_categories(array('hide_empty' => 0, 'hierarchical' => 0)) ) { + foreach ( $cats as $cat ) { $struct['categoryId'] = $cat->term_id; $struct['categoryName'] = $cat->name; @@ -2998,11 +2948,10 @@ class wp_xmlrpc_server extends IXR_Server { $username = $args[1]; $password = $args[2]; - if ( !$user = $this->login($username, $password) ) { + if ( !$user = $this->login($username, $password) ) return $this->error; - } - if( !current_user_can( 'edit_post', $post_ID ) ) + if ( !current_user_can( 'edit_post', $post_ID ) ) return new IXR_Error( 401, __( 'Sorry, you can not edit this post.' ) ); do_action('xmlrpc_call', 'mt.getPostCategories'); @@ -3011,7 +2960,7 @@ class wp_xmlrpc_server extends IXR_Server { $catids = wp_get_post_categories(intval($post_ID)); // first listed category will be the primary category $isPrimary = true; - foreach($catids as $catid) { + foreach ( $catids as $catid ) { $categories[] = array( 'categoryName' => get_cat_name($catid), 'categoryId' => (string) $catid, @@ -3040,16 +2989,15 @@ class wp_xmlrpc_server extends IXR_Server { $password = $args[2]; $categories = $args[3]; - if ( !$user = $this->login($username, $password) ) { + if ( !$user = $this->login($username, $password) ) return $this->error; - } do_action('xmlrpc_call', 'mt.setPostCategories'); if ( !current_user_can('edit_post', $post_ID) ) return new IXR_Error(401, __('Sorry, you cannot edit this post.')); - foreach($categories as $cat) { + foreach ( $categories as $cat ) { $catids[] = $cat['categoryId']; } @@ -3071,7 +3019,7 @@ class wp_xmlrpc_server extends IXR_Server { do_action('xmlrpc_call', 'mt.supportedMethods'); $supported_methods = array(); - foreach($this->methods as $key=>$value) { + foreach ( $this->methods as $key => $value ) { $supported_methods[] = $key; } @@ -3108,18 +3056,16 @@ class wp_xmlrpc_server extends IXR_Server { $actual_post = wp_get_single_post($post_ID, ARRAY_A); - if (!$actual_post) { + if ( !$actual_post ) return new IXR_Error(404, __('Sorry, no such post.')); - } $comments = $wpdb->get_results( $wpdb->prepare("SELECT comment_author_url, comment_content, comment_author_IP, comment_type FROM $wpdb->comments WHERE comment_post_ID = %d", $post_ID) ); - if (!$comments) { + if ( !$comments ) return array(); - } $trackback_pings = array(); - foreach($comments as $comment) { + foreach ( $comments as $comment ) { if ( 'trackback' == $comment->comment_type ) { $content = $comment->comment_content; $title = substr($content, 8, (strpos($content, '') - 8)); @@ -3128,7 +3074,7 @@ class wp_xmlrpc_server extends IXR_Server { 'pingURL' => $comment->comment_author_url, 'pingIP' => $comment->comment_author_IP ); - } + } } return $trackback_pings; @@ -3150,9 +3096,8 @@ class wp_xmlrpc_server extends IXR_Server { $username = $args[1]; $password = $args[2]; - if ( !$user = $this->login($username, $password) ) { + if ( !$user = $this->login($username, $password) ) return $this->error; - } do_action('xmlrpc_call', 'mt.publishPost'); @@ -3203,36 +3148,36 @@ class wp_xmlrpc_server extends IXR_Server { // Check if the page linked to is in our site $pos1 = strpos($pagelinkedto, str_replace(array('http://www.','http://','https://www.','https://'), '', get_option('home'))); - if( !$pos1 ) + if ( !$pos1 ) return new IXR_Error(0, __('Is there no link to us?')); // let's find which post is linked to // FIXME: does url_to_postid() cover all these cases already? // if so, then let's use it and drop the old code. $urltest = parse_url($pagelinkedto); - if ($post_ID = url_to_postid($pagelinkedto)) { + if ( $post_ID = url_to_postid($pagelinkedto) ) { $way = 'url_to_postid()'; - } elseif (preg_match('#p/[0-9]{1,}#', $urltest['path'], $match)) { + } elseif ( preg_match('#p/[0-9]{1,}#', $urltest['path'], $match) ) { // the path defines the post_ID (archives/p/XXXX) $blah = explode('/', $match[0]); $post_ID = (int) $blah[1]; $way = 'from the path'; - } elseif (preg_match('#p=[0-9]{1,}#', $urltest['query'], $match)) { + } elseif ( preg_match('#p=[0-9]{1,}#', $urltest['query'], $match) ) { // the querystring defines the post_ID (?p=XXXX) $blah = explode('=', $match[0]); $post_ID = (int) $blah[1]; $way = 'from the querystring'; - } elseif (isset($urltest['fragment'])) { + } elseif ( isset($urltest['fragment']) ) { // an #anchor is there, it's either... - if (intval($urltest['fragment'])) { + if ( intval($urltest['fragment']) ) { // ...an integer #XXXX (simpliest case) $post_ID = (int) $urltest['fragment']; $way = 'from the fragment (numeric)'; - } elseif (preg_match('/post-[0-9]+/',$urltest['fragment'])) { + } elseif ( preg_match('/post-[0-9]+/',$urltest['fragment']) ) { // ...a post id in the form 'post-###' $post_ID = preg_replace('/[^0-9]+/', '', $urltest['fragment']); $way = 'from the fragment (post-###)'; - } elseif (is_string($urltest['fragment'])) { + } elseif ( is_string($urltest['fragment']) ) { // ...or a string #title, a little more complicated $title = preg_replace('/[^a-z0-9]/i', '.', $urltest['fragment']); $sql = $wpdb->prepare("SELECT ID FROM $wpdb->posts WHERE post_title RLIKE %s", $title); @@ -3264,10 +3209,8 @@ class wp_xmlrpc_server extends IXR_Server { return new IXR_Error(33, __('The specified target URL cannot be used as a target. It either doesn’t exist, or it is not a pingback-enabled resource.')); // Let's check that the remote site didn't already pingback this entry - $wpdb->get_results( $wpdb->prepare("SELECT * FROM $wpdb->comments WHERE comment_post_ID = %d AND comment_author_url = %s", $post_ID, $pagelinkedfrom) ); - - if ( $wpdb->num_rows ) // We already have a Pingback from this URL - return new IXR_Error(48, __('The pingback has already been registered.')); + if ( $wpdb->get_results( $wpdb->prepare("SELECT * FROM $wpdb->comments WHERE comment_post_ID = %d AND comment_author_url = %s", $post_ID, $pagelinkedfrom) ) ) + return new IXR_Error( 48, __( 'The pingback has already been registered.' ) ); // very stupid, but gives time to the 'from' server to publish ! sleep(1); @@ -3293,7 +3236,7 @@ class wp_xmlrpc_server extends IXR_Server { $p = explode( "\n\n", $linea ); - $preg_target = preg_quote($pagelinkedto); + $preg_target = preg_quote($pagelinkedto, '|'); foreach ( $p as $para ) { if ( strpos($para, $pagelinkedto) !== false ) { // it exists, but is it a link? @@ -3315,7 +3258,7 @@ class wp_xmlrpc_server extends IXR_Server { $excerpt= str_replace($context[0], $marker, $excerpt); // swap out the link for our marker $excerpt = strip_tags($excerpt, ''); // strip all tags but our context marker $excerpt = trim($excerpt); - $preg_marker = preg_quote($marker); + $preg_marker = preg_quote($marker, '|'); $excerpt = preg_replace("|.*?\s(.{0,100}$preg_marker.{0,100})\s.*|s", '$1', $excerpt); $excerpt = strip_tags($excerpt); // YES, again, to remove the marker wrapper break; @@ -3367,26 +3310,25 @@ class wp_xmlrpc_server extends IXR_Server { $url = $args; $post_ID = url_to_postid($url); - if (!$post_ID) { + if ( !$post_ID ) { // We aren't sure that the resource is available and/or pingback enabled return new IXR_Error(33, __('The specified target URL cannot be used as a target. It either doesn’t exist, or it is not a pingback-enabled resource.')); } $actual_post = wp_get_single_post($post_ID, ARRAY_A); - if (!$actual_post) { + if ( !$actual_post ) { // No such post = resource not found return new IXR_Error(32, __('The specified target URL does not exist.')); } $comments = $wpdb->get_results( $wpdb->prepare("SELECT comment_author_url, comment_content, comment_author_IP, comment_type FROM $wpdb->comments WHERE comment_post_ID = %d", $post_ID) ); - if (!$comments) { + if ( !$comments ) return array(); - } $pingbacks = array(); - foreach($comments as $comment) { + foreach ( $comments as $comment ) { if ( 'pingback' == $comment->comment_type ) $pingbacks[] = $comment->comment_author_url; } @@ -3396,5 +3338,5 @@ class wp_xmlrpc_server extends IXR_Server { } $wp_xmlrpc_server = new wp_xmlrpc_server(); - +$wp_xmlrpc_server->serve_request(); ?>