XMLRPC: Don't allow private posts to be sticky.

Merge of [33325], [33612], and [34135] to the 4.2 branch.

See #20662.
Built from https://develop.svn.wordpress.org/branches/4.2@34152


git-svn-id: http://core.svn.wordpress.org/branches/4.2@34120 1a063a9b-81f0-0310-95a4-ce76da25c4cd
This commit is contained in:
Dominik Schilling 2015-09-14 22:51:28 +00:00
parent a4dba03383
commit ec4db723d2
2 changed files with 72 additions and 26 deletions

View File

@ -1540,10 +1540,12 @@ function wp_ajax_inline_save() {
$data['parent_id'] = $data['post_parent']; $data['parent_id'] = $data['post_parent'];
// Status. // Status.
if ( isset($data['keep_private']) && 'private' == $data['keep_private'] ) if ( isset( $data['keep_private'] ) && 'private' == $data['keep_private'] ) {
$data['visibility'] = 'private';
$data['post_status'] = 'private'; $data['post_status'] = 'private';
else } else {
$data['post_status'] = $data['_status']; $data['post_status'] = $data['_status'];
}
if ( empty($data['comment_status']) ) if ( empty($data['comment_status']) )
$data['comment_status'] = 'closed'; $data['comment_status'] = 'closed';

View File

@ -1150,6 +1150,56 @@ class wp_xmlrpc_server extends IXR_Server {
return $count > 1; return $count > 1;
} }
private function _validate_boolean( $var ) {
if ( is_bool( $var ) ) {
return $var;
}
if ( is_string( $var ) && 'false' === strtolower( $var ) ) {
return false;
}
return (bool) $var;
}
/**
* Encapsulate the logic for sticking a post
* and determining if the user has permission to do so
*
* @since 4.3.0
* @access private
*
* @param array $post_data
* @param bool $update
* @return void|IXR_Error
*/
private function _toggle_sticky( $post_data, $update = false ) {
$post_type = get_post_type_object( $post_data['post_type'] );
// Private and password-protected posts cannot be stickied.
if ( 'private' === $post_data['post_status'] || ! empty( $post_data['post_password'] ) ) {
// Error if the client tried to stick the post, otherwise, silently unstick.
if ( ! empty( $post_data['sticky'] ) ) {
return new IXR_Error( 401, __( 'Sorry, you cannot stick a private post.' ) );
}
if ( $update ) {
unstick_post( $post_data['ID'] );
}
} elseif ( isset( $post_data['sticky'] ) ) {
if ( ! current_user_can( $post_type->cap->edit_others_posts ) ) {
return new IXR_Error( 401, __( 'Sorry, you are not allowed to stick this post.' ) );
}
$sticky = $this->_validate_boolean( $post_data['sticky'] );
if ( $sticky ) {
stick_post( $post_data['ID'] );
} else {
unstick_post( $post_data['ID'] );
}
}
}
/** /**
* Helper method for wp_newPost and wp_editPost, containing shared logic. * Helper method for wp_newPost and wp_editPost, containing shared logic.
* *
@ -1242,20 +1292,9 @@ class wp_xmlrpc_server extends IXR_Server {
$post_ID = $post_data['ID']; $post_ID = $post_data['ID'];
if ( $post_data['post_type'] == 'post' ) { if ( $post_data['post_type'] == 'post' ) {
// Private and password-protected posts cannot be stickied. $error = $this->_toggle_sticky( $post_data, $update );
if ( $post_data['post_status'] == 'private' || ! empty( $post_data['post_password'] ) ) { if ( $error ) {
// Error if the client tried to stick the post, otherwise, silently unstick. return $error;
if ( ! empty( $post_data['sticky'] ) )
return new IXR_Error( 401, __( 'Sorry, you cannot stick a private post.' ) );
if ( $update )
unstick_post( $post_ID );
} elseif ( isset( $post_data['sticky'] ) ) {
if ( ! current_user_can( $post_type->cap->edit_others_posts ) )
return new IXR_Error( 401, __( 'Sorry, you are not allowed to stick this post.' ) );
if ( $post_data['sticky'] )
stick_post( $post_ID );
else
unstick_post( $post_ID );
} }
} }
@ -4580,10 +4619,12 @@ class wp_xmlrpc_server extends IXR_Server {
// Only posts can be sticky // 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 ) $data = $postdata;
stick_post( $post_ID ); $data['sticky'] = $content_struct['sticky'];
elseif ( $content_struct['sticky'] == false ) $error = $this->_toggle_sticky( $data );
unstick_post( $post_ID ); if ( $error ) {
return $error;
}
} }
if ( isset($content_struct['custom_fields']) ) if ( isset($content_struct['custom_fields']) )
@ -4873,8 +4914,8 @@ class wp_xmlrpc_server extends IXR_Server {
$tags_input = isset( $content_struct['mt_keywords'] ) ? $content_struct['mt_keywords'] : null; $tags_input = isset( $content_struct['mt_keywords'] ) ? $content_struct['mt_keywords'] : null;
if ( ('publish' == $post_status) ) { if ( 'publish' == $post_status || 'private' == $post_status ) {
if ( ( 'page' == $post_type ) && ! current_user_can( 'publish_pages' ) ) { if ( 'page' == $post_type && ! current_user_can( 'publish_pages' ) ) {
return new IXR_Error( 401, __( 'Sorry, you do not have the right to publish this page.' ) ); return new IXR_Error( 401, __( 'Sorry, you do not have the right to publish this page.' ) );
} elseif ( ! current_user_can( 'publish_posts' ) ) { } elseif ( ! current_user_can( 'publish_posts' ) ) {
return new IXR_Error( 401, __( 'Sorry, you do not have the right to publish this post.' ) ); return new IXR_Error( 401, __( 'Sorry, you do not have the right to publish this post.' ) );
@ -4918,10 +4959,13 @@ class wp_xmlrpc_server extends IXR_Server {
// Only posts can be sticky // 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 ) $data = $newpost;
stick_post( $post_ID ); $data['sticky'] = $content_struct['sticky'];
elseif ( $content_struct['sticky'] == false ) $data['post_type'] = 'post';
unstick_post( $post_ID ); $error = $this->_toggle_sticky( $data, true );
if ( $error ) {
return $error;
}
} }
if ( isset($content_struct['custom_fields']) ) if ( isset($content_struct['custom_fields']) )