Skip to content

Commit 11e7b00

Browse files
committed
Grouped backports to the 5.4 branch.
- Comments: Prevent users who can not see a post from seeing comments on it. - Shortcodes: Restrict media shortcode ajax to certain type. - REST API: Ensure no-cache headers are sent when methods are overridden. - REST API: Limit `search_columns` for users without `list_users`. - Prevent unintended behavior when certain objects are unserialized. Merges [56833], [56834], [56835], [56836], and [56838] to the 5.4 branch. Props xknown, jorbin, joehoyle, timothyblynjacobs, peterwilsoncc, ehtis, tykoted, antpb, rmccue. git-svn-id: https://develop.svn.wordpress.org/branches/5.4@56878 602fd350-edb4-49c9-b593-d223f7449a82
1 parent 2575350 commit 11e7b00

File tree

14 files changed

+216
-25
lines changed

14 files changed

+216
-25
lines changed

src/wp-admin/includes/ajax-actions.php

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3739,13 +3739,29 @@ function wp_ajax_parse_media_shortcode() {
37393739

37403740
$shortcode = wp_unslash( $_POST['shortcode'] );
37413741

3742+
// Only process previews for media related shortcodes:
3743+
$found_shortcodes = get_shortcode_tags_in_content( $shortcode );
3744+
$media_shortcodes = array(
3745+
'audio',
3746+
'embed',
3747+
'playlist',
3748+
'video',
3749+
'gallery',
3750+
);
3751+
3752+
$other_shortcodes = array_diff( $found_shortcodes, $media_shortcodes );
3753+
3754+
if ( ! empty( $other_shortcodes ) ) {
3755+
wp_send_json_error();
3756+
}
3757+
37423758
if ( ! empty( $_POST['post_ID'] ) ) {
37433759
$post = get_post( (int) $_POST['post_ID'] );
37443760
}
37453761

37463762
// The embed shortcode requires a post.
37473763
if ( ! $post || ! current_user_can( 'edit_post', $post->ID ) ) {
3748-
if ( 'embed' === $shortcode ) {
3764+
if ( in_array( 'embed', $found_shortcodes, true ) ) {
37493765
wp_send_json_error();
37503766
}
37513767
} else {

src/wp-admin/includes/class-wp-comments-list-table.php

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -561,6 +561,19 @@ public function single_row( $item ) {
561561
}
562562
$this->user_can = current_user_can( 'edit_comment', $comment->comment_ID );
563563

564+
$edit_post_cap = $post ? 'edit_post' : 'edit_posts';
565+
if (
566+
current_user_can( $edit_post_cap, $comment->comment_post_ID ) ||
567+
(
568+
empty( $post->post_password ) &&
569+
current_user_can( 'read_post', $comment->comment_post_ID )
570+
)
571+
) {
572+
// The user has access to the post
573+
} else {
574+
return false;
575+
}
576+
564577
echo "<tr id='comment-$comment->comment_ID' class='$the_comment_class'>";
565578
$this->single_row_columns( $comment );
566579
echo "</tr>\n";

src/wp-admin/includes/class-wp-list-table.php

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -682,7 +682,20 @@ protected function comments_bubble( $post_id, $pending_comments ) {
682682
$pending_comments_number
683683
);
684684

685-
// No comments at all.
685+
$post_object = get_post( $post_id );
686+
$edit_post_cap = $post_object ? 'edit_post' : 'edit_posts';
687+
if (
688+
current_user_can( $edit_post_cap, $post_id ) ||
689+
(
690+
empty( $post_object->post_password ) &&
691+
current_user_can( 'read_post', $post_id )
692+
)
693+
) {
694+
// The user has access to the post and thus can see comments
695+
} else {
696+
return false;
697+
}
698+
686699
if ( ! $approved_comments && ! $pending_comments ) {
687700
printf(
688701
'<span aria-hidden="true">&#8212;</span><span class="screen-reader-text">%s</span>',

src/wp-admin/includes/dashboard.php

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1034,7 +1034,16 @@ function wp_dashboard_recent_comments( $total_items = 5 ) {
10341034

10351035
echo '<ul id="the-comment-list" data-wp-lists="list:comment">';
10361036
foreach ( $comments as $comment ) {
1037-
_wp_dashboard_recent_comments_row( $comment );
1037+
$comment_post = get_post( $comment->comment_post_ID );
1038+
if (
1039+
current_user_can( 'edit_post', $comment->comment_post_ID ) ||
1040+
(
1041+
empty( $comment_post->post_password ) &&
1042+
current_user_can( 'read_post', $comment->comment_post_ID )
1043+
)
1044+
) {
1045+
_wp_dashboard_recent_comments_row( $comment );
1046+
}
10381047
}
10391048
echo '</ul>';
10401049

src/wp-includes/Requests/Hooks.php

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,4 +65,8 @@ public function dispatch($hook, $parameters = array()) {
6565

6666
return true;
6767
}
68-
}
68+
69+
public function __wakeup() {
70+
throw new \LogicException( __CLASS__ . ' should never be unserialized' );
71+
}
72+
}

src/wp-includes/Requests/IRI.php

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -703,6 +703,20 @@ public function is_valid() {
703703
return true;
704704
}
705705

706+
public function __wakeup() {
707+
$class_props = get_class_vars( __CLASS__ );
708+
$string_props = array( 'scheme', 'iuserinfo', 'ihost', 'port', 'ipath', 'iquery', 'ifragment' );
709+
$array_props = array( 'normalization' );
710+
foreach ( $class_props as $prop => $default_value ) {
711+
if ( in_array( $prop, $string_props, true ) && ! is_string( $this->$prop ) ) {
712+
throw new UnexpectedValueException();
713+
} elseif ( in_array( $prop, $array_props, true ) && ! is_array( $this->$prop ) ) {
714+
throw new UnexpectedValueException();
715+
}
716+
$this->$prop = null;
717+
}
718+
}
719+
706720
/**
707721
* Set the entire IRI. Returns true on success, false on failure (if there
708722
* are any invalid characters).

src/wp-includes/Requests/Session.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,10 @@ public function request_multiple($requests, $options = array()) {
227227
return Requests::request_multiple($requests, $options);
228228
}
229229

230+
public function __wakeup() {
231+
throw new \LogicException( __CLASS__ . ' should never be unserialized' );
232+
}
233+
230234
/**
231235
* Merge a request's data with the default data
232236
*

src/wp-includes/class-wp-block-type-registry.php

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,20 @@ public function is_registered( $name ) {
154154
return isset( $this->registered_block_types[ $name ] );
155155
}
156156

157+
public function __wakeup() {
158+
if ( ! $this->registered_block_types ) {
159+
return;
160+
}
161+
if ( ! is_array( $this->registered_block_types ) ) {
162+
throw new UnexpectedValueException();
163+
}
164+
foreach ( $this->registered_block_types as $value ) {
165+
if ( ! $value instanceof WP_Block_Type ) {
166+
throw new UnexpectedValueException();
167+
}
168+
}
169+
}
170+
157171
/**
158172
* Utility method to retrieve the main instance of the class.
159173
*

src/wp-includes/class-wp-theme.php

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -675,6 +675,28 @@ public function parent() {
675675
return isset( $this->parent ) ? $this->parent : false;
676676
}
677677

678+
/**
679+
* Perform reinitialization tasks.
680+
*
681+
* Prevents a callback from being injected during unserialization of an object.
682+
*
683+
* @return void
684+
*/
685+
public function __wakeup() {
686+
if ( $this->parent && ! $this->parent instanceof self ) {
687+
throw new UnexpectedValueException();
688+
}
689+
if ( $this->headers && ! is_array( $this->headers ) ) {
690+
throw new UnexpectedValueException();
691+
}
692+
foreach ( $this->headers as $value ) {
693+
if ( ! is_string( $value ) ) {
694+
throw new UnexpectedValueException();
695+
}
696+
}
697+
$this->headers_sanitized = array();
698+
}
699+
678700
/**
679701
* Adds theme data to cache.
680702
*
@@ -1667,4 +1689,16 @@ private static function _name_sort( $a, $b ) {
16671689
private static function _name_sort_i18n( $a, $b ) {
16681690
return strnatcasecmp( $a->name_translated, $b->name_translated );
16691691
}
1692+
1693+
private static function _check_headers_property_has_correct_type( $headers ) {
1694+
if ( ! is_array( $headers ) ) {
1695+
return false;
1696+
}
1697+
foreach ( $headers as $key => $value ) {
1698+
if ( ! is_string( $key ) || ! is_string( $value ) ) {
1699+
return false;
1700+
}
1701+
}
1702+
return true;
1703+
}
16701704
}

src/wp-includes/media.php

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1930,7 +1930,8 @@ function gallery_shortcode( $attr ) {
19301930
$attachments[ $val->ID ] = $_attachments[ $key ];
19311931
}
19321932
} elseif ( ! empty( $atts['exclude'] ) ) {
1933-
$attachments = get_children(
1933+
$post_parent_id = $id;
1934+
$attachments = get_children(
19341935
array(
19351936
'post_parent' => $id,
19361937
'exclude' => $atts['exclude'],
@@ -1942,7 +1943,8 @@ function gallery_shortcode( $attr ) {
19421943
)
19431944
);
19441945
} else {
1945-
$attachments = get_children(
1946+
$post_parent_id = $id;
1947+
$attachments = get_children(
19461948
array(
19471949
'post_parent' => $id,
19481950
'post_status' => 'inherit',
@@ -1954,6 +1956,17 @@ function gallery_shortcode( $attr ) {
19541956
);
19551957
}
19561958

1959+
if ( ! empty( $post_parent_id ) ) {
1960+
$post_parent = get_post( $post_parent_id );
1961+
1962+
// terminate the shortcode execution if user cannot read the post or password-protected
1963+
if (
1964+
( ! is_post_publicly_viewable( $post_parent->ID ) && ! current_user_can( 'read_post', $post_parent->ID ) )
1965+
|| post_password_required( $post_parent ) ) {
1966+
return '';
1967+
}
1968+
}
1969+
19571970
if ( empty( $attachments ) ) {
19581971
return '';
19591972
}
@@ -2272,6 +2285,15 @@ function wp_playlist_shortcode( $attr ) {
22722285
$attachments = get_children( $args );
22732286
}
22742287

2288+
if ( ! empty( $args['post_parent'] ) ) {
2289+
$post_parent = get_post( $id );
2290+
2291+
// terminate the shortcode execution if user cannot read the post or password-protected
2292+
if ( ! current_user_can( 'read_post', $post_parent->ID ) || post_password_required( $post_parent ) ) {
2293+
return '';
2294+
}
2295+
}
2296+
22752297
if ( empty( $attachments ) ) {
22762298
return '';
22772299
}

0 commit comments

Comments
 (0)