Privacy: Limit export and erasure to super admins on Multisite.

Multisite networks have a variety of use cases, and in many of them single-site administrators are not trusted to take actions that affect the whole network, require making decisions about legal compliance, etc. By default, those actions should require super admin capabilities. Plugins can be used to override that behavior if a particular site's use case calls for it.

Props allendav, jeremyfelt, iandunn.
Merges [43085] to the 4.9 branch.
Fixes #43919.
Built from https://develop.svn.wordpress.org/branches/4.9@43111


git-svn-id: http://core.svn.wordpress.org/branches/4.9@42940 1a063a9b-81f0-0310-95a4-ce76da25c4cd
This commit is contained in:
Sergey Biryukov 2018-05-02 03:49:26 +00:00
parent a6284311e8
commit c60aa91d76
4 changed files with 20 additions and 9 deletions

View File

@ -4034,7 +4034,7 @@ function wp_ajax_wp_privacy_export_personal_data() {
wp_send_json_error( __( 'Invalid request ID.' ) );
}
if ( ! current_user_can( 'manage_options' ) ) {
if ( ! current_user_can( 'export_others_personal_data' ) ) {
wp_send_json_error( __( 'Invalid request.' ) );
}
@ -4212,7 +4212,8 @@ function wp_ajax_wp_privacy_erase_personal_data() {
wp_send_json_error( __( 'Invalid request ID.' ) );
}
if ( ! current_user_can( 'delete_users' ) ) {
// Both capabilities are required to avoid confusion, see `_wp_personal_data_removal_page()`.
if ( ! current_user_can( 'erase_others_personal_data' ) || ! current_user_can( 'delete_users' ) ) {
wp_send_json_error( __( 'Invalid request.' ) );
}

View File

@ -744,8 +744,8 @@ function _wp_personal_data_cleanup_requests() {
* @access private
*/
function _wp_personal_data_export_page() {
if ( ! current_user_can( 'manage_options' ) ) {
wp_die( esc_html__( 'Sorry, you are not allowed to manage privacy on this site.' ) );
if ( ! current_user_can( 'export_others_personal_data' ) ) {
wp_die( __( 'Sorry, you are not allowed to export personal data on this site.' ) );
}
_wp_personal_data_handle_actions();
@ -809,8 +809,14 @@ function _wp_personal_data_export_page() {
* @access private
*/
function _wp_personal_data_removal_page() {
if ( ! current_user_can( 'delete_users' ) ) {
wp_die( esc_html__( 'Sorry, you are not allowed to manage privacy on this site.' ) );
/*
* Require both caps in order to make it explicitly clear that delegating
* erasure from network admins to single-site admins will give them the
* ability to affect global users, rather than being limited to the site
* that they administer.
*/
if ( ! current_user_can( 'erase_others_personal_data' ) || ! current_user_can( 'delete_users' ) ) {
wp_die( __( 'Sorry, you are not allowed to erase data on this site.' ) );
}
_wp_personal_data_handle_actions();
@ -876,8 +882,8 @@ function _wp_personal_data_removal_page() {
* @access private
*/
function _wp_privacy_hook_requests_page() {
add_submenu_page( 'tools.php', __( 'Export Personal Data' ), __( 'Export Personal Data' ), 'manage_options', 'export_personal_data', '_wp_personal_data_export_page' );
add_submenu_page( 'tools.php', __( 'Remove Personal Data' ), __( 'Remove Personal Data' ), 'manage_options', 'remove_personal_data', '_wp_personal_data_removal_page' );
add_submenu_page( 'tools.php', __( 'Export Personal Data' ), __( 'Export Personal Data' ), 'export_others_personal_data', 'export_personal_data', '_wp_personal_data_export_page' );
add_submenu_page( 'tools.php', __( 'Remove Personal Data' ), __( 'Remove Personal Data' ), 'erase_others_personal_data', 'remove_personal_data', '_wp_personal_data_removal_page' );
}
// TODO: move the following classes in new files.

View File

@ -539,6 +539,10 @@ function map_meta_cap( $cap, $user_id ) {
$caps[] = 'manage_options';
}
break;
case 'export_others_personal_data':
case 'erase_others_personal_data':
$caps[] = is_multisite() ? 'manage_network' : 'manage_options';
break;
default:
// Handle meta capabilities for custom post types.
global $post_type_meta_caps;

View File

@ -4,7 +4,7 @@
*
* @global string $wp_version
*/
$wp_version = '4.9.6-alpha-43110';
$wp_version = '4.9.6-alpha-43111';
/**
* Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema.