289 lines
8.1 KiB
PHP
289 lines
8.1 KiB
PHP
<?php
|
|
/**
|
|
* This file is part of Avatar Privacy.
|
|
*
|
|
* Copyright 2018-2020 Peter Putzer.
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* as published by the Free Software Foundation; either version 2
|
|
* of the License, or (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
*
|
|
* ***
|
|
*
|
|
* @package mundschenk-at/avatar-privacy
|
|
* @license http://www.gnu.org/licenses/gpl-2.0.html
|
|
*/
|
|
|
|
namespace Avatar_Privacy\Components;
|
|
|
|
use Avatar_Privacy\Component;
|
|
|
|
use Avatar_Privacy\Core\User_Fields;
|
|
use Avatar_Privacy\Core\Settings;
|
|
|
|
use Avatar_Privacy\Data_Storage\Database\Comment_Author_Table as Database;
|
|
use Avatar_Privacy\Data_Storage\Filesystem_Cache;
|
|
use Avatar_Privacy\Data_Storage\Network_Options;
|
|
use Avatar_Privacy\Data_Storage\Options;
|
|
use Avatar_Privacy\Data_Storage\Site_Transients;
|
|
use Avatar_Privacy\Data_Storage\Transients;
|
|
|
|
use function Avatar_Privacy\Tools\delete_file;
|
|
|
|
/**
|
|
* Handles plugin activation and deactivation.
|
|
*
|
|
* @since 1.0.0
|
|
* @since 2.1.0 Class is now instantiated from `uninstall.php` all methods have been made non-static.
|
|
*
|
|
* @author Peter Putzer <github@mundschenk.at>
|
|
*/
|
|
class Uninstallation implements Component {
|
|
|
|
/**
|
|
* The options handler.
|
|
*
|
|
* @var Options
|
|
*/
|
|
private $options;
|
|
|
|
/**
|
|
* The options handler.
|
|
*
|
|
* @var Network_Options
|
|
*/
|
|
private $network_options;
|
|
|
|
/**
|
|
* The transients handler.
|
|
*
|
|
* @var Transients
|
|
*/
|
|
private $transients;
|
|
|
|
/**
|
|
* The site transients handler.
|
|
*
|
|
* @var Site_Transients
|
|
*/
|
|
private $site_transients;
|
|
|
|
/**
|
|
* The DB handler.
|
|
*
|
|
* @var Database
|
|
*/
|
|
private $database;
|
|
|
|
/**
|
|
* The filesystem cache handler.
|
|
*
|
|
* @var Filesystem_Cache
|
|
*/
|
|
private $file_cache;
|
|
|
|
/**
|
|
* Creates a new Setup instance.
|
|
*
|
|
* @since 2.1.0 Parameter $plugin_file removed.
|
|
*
|
|
* @param Options $options The options handler.
|
|
* @param Network_Options $network_options The network options handler.
|
|
* @param Transients $transients The transients handler.
|
|
* @param Site_Transients $site_transients The site transients handler.
|
|
* @param Database $database The database handler.
|
|
* @param Filesystem_Cache $file_cache The filesystem cache handler.
|
|
*/
|
|
public function __construct( Options $options, Network_Options $network_options, Transients $transients, Site_Transients $site_transients, Database $database, Filesystem_Cache $file_cache ) {
|
|
$this->options = $options;
|
|
$this->network_options = $network_options;
|
|
$this->transients = $transients;
|
|
$this->site_transients = $site_transients;
|
|
$this->database = $database;
|
|
$this->file_cache = $file_cache;
|
|
}
|
|
|
|
/**
|
|
* Sets up the various hooks for the plugin component.
|
|
*
|
|
* @return void
|
|
*/
|
|
public function run() {
|
|
// Enqueue necessary tasks.
|
|
$this->enqueue_cleanup_tasks();
|
|
|
|
// Clean up the site-specific artifacts.
|
|
$this->do_site_cleanups();
|
|
|
|
/**
|
|
* Cleans up any remaining global artifacts.
|
|
*/
|
|
\do_action( 'avatar_privacy_uninstallation_global' );
|
|
}
|
|
|
|
/**
|
|
* Enqeueus the necessary uninstallation tasks to the `avatar_privacy_uninstallation_site`
|
|
* and `avatar_privacy_uninstallation_global` actions.
|
|
*
|
|
* @since 2.3.0
|
|
*
|
|
* @return void
|
|
*/
|
|
public function enqueue_cleanup_tasks() {
|
|
// Delete cached files.
|
|
\add_action( 'avatar_privacy_uninstallation_global', [ $this->file_cache, 'invalidate' ], 10, 0 );
|
|
|
|
// Delete uploaded user avatars.
|
|
\add_action( 'avatar_privacy_uninstallation_global', [ $this, 'delete_uploaded_avatars' ], 11, 0 );
|
|
|
|
// Delete usermeta for all users.
|
|
\add_action( 'avatar_privacy_uninstallation_global', [ $this, 'delete_user_meta' ], 12, 0 );
|
|
|
|
// Delete/change options (from all sites in case of a multisite network).
|
|
\add_action( 'avatar_privacy_uninstallation_site', [ $this, 'delete_options' ], 10, 0 );
|
|
\add_action( 'avatar_privacy_uninstallation_global', [ $this, 'delete_network_options' ], 13, 0 );
|
|
|
|
// Delete transients from sitemeta or options table.
|
|
\add_action( 'avatar_privacy_uninstallation_site', [ $this, 'delete_transients' ], 11, 0 );
|
|
\add_action( 'avatar_privacy_uninstallation_global', [ $this, 'delete_network_transients' ], 14, 0 );
|
|
|
|
// Drop all our tables.
|
|
\add_action( 'avatar_privacy_uninstallation_site', [ $this->database, 'drop_table' ], 12, 1 );
|
|
}
|
|
|
|
/**
|
|
* Executes all the registered site clean-ups (for all sites if on multisite).
|
|
*
|
|
* @since 2.1.0
|
|
*
|
|
* @return void
|
|
*/
|
|
protected function do_site_cleanups() {
|
|
if ( \is_multisite() ) {
|
|
// We want all the sites across all networks.
|
|
$query = [
|
|
'fields' => 'ids',
|
|
'number' => '',
|
|
];
|
|
foreach ( \get_sites( $query ) as $site_id ) { // @phpstan-ignore-line -- get_sites() always returns a list with the 'ids' argument.
|
|
\switch_to_blog( $site_id );
|
|
|
|
/**
|
|
* Do the registered site clean-ups for the current site.
|
|
*
|
|
* @param int|null $site_id Optional. The site (blog) ID or null if not a multisite installation.
|
|
*/
|
|
\do_action( 'avatar_privacy_uninstallation_site', $site_id );
|
|
|
|
\restore_current_blog();
|
|
}
|
|
} else {
|
|
/** This action is documented in class-uninstallation.php */
|
|
\do_action( 'avatar_privacy_uninstallation_site', null );
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Deletes uploaded avatar images.
|
|
*
|
|
* @since 2.1.0 Visibility changed to public, made non-static.
|
|
*
|
|
* @return void
|
|
*/
|
|
public function delete_uploaded_avatars() {
|
|
$user_avatar = User_Fields::USER_AVATAR_META_KEY;
|
|
$query = [
|
|
'meta_key' => $user_avatar, // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_key
|
|
'meta_compare' => 'EXISTS',
|
|
];
|
|
|
|
foreach ( \get_users( $query ) as $user ) {
|
|
$avatar = $user->$user_avatar;
|
|
|
|
if ( ! empty( $avatar['file'] ) && \file_exists( $avatar['file'] ) ) {
|
|
delete_file( $avatar['file'] );
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Deletes all user meta data added by the plugin.
|
|
*
|
|
* @since 2.1.0 Visibility changed to public, made non-static.
|
|
*
|
|
* @return void
|
|
*/
|
|
public function delete_user_meta() {
|
|
\delete_metadata( 'user', 0, User_Fields::GRAVATAR_USE_META_KEY, null, true );
|
|
\delete_metadata( 'user', 0, User_Fields::ALLOW_ANONYMOUS_META_KEY, null, true );
|
|
\delete_metadata( 'user', 0, User_Fields::USER_AVATAR_META_KEY, null, true );
|
|
\delete_metadata( 'user', 0, User_Fields::EMAIL_HASH_META_KEY, null, true );
|
|
}
|
|
|
|
/**
|
|
* Deletes the site-specific plugin options.
|
|
*
|
|
* @since 2.1.0 Visibility changed to public, made non-static.
|
|
*
|
|
* @return void
|
|
*/
|
|
public function delete_options() {
|
|
// Delete our settings.
|
|
$this->options->delete( Settings::OPTION_NAME );
|
|
|
|
// Reset avatar_default to working value if necessary.
|
|
$this->options->reset_avatar_default();
|
|
}
|
|
|
|
/**
|
|
* Deletes the global plugin options (except for the salt).
|
|
*
|
|
* @since 2.1.0
|
|
*
|
|
* @return void
|
|
*/
|
|
public function delete_network_options() {
|
|
$this->network_options->delete( Network_Options::USE_GLOBAL_TABLE );
|
|
$this->network_options->delete( Network_Options::GLOBAL_TABLE_MIGRATION );
|
|
$this->network_options->delete( Network_Options::START_GLOBAL_TABLE_MIGRATION );
|
|
}
|
|
|
|
/**
|
|
* Deletes all the plugin's site-specific transients.
|
|
*
|
|
* @since 2.1.0 Visibility changed to public, made non-static.
|
|
*
|
|
* @return void
|
|
*/
|
|
public function delete_transients() {
|
|
// Remove regular transients.
|
|
foreach ( $this->transients->get_keys_from_database() as $key ) {
|
|
$this->transients->delete( $key, true );
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Deletes all the plugin's global transients ("site transients").
|
|
*
|
|
* @since 2.1.0
|
|
*
|
|
* @return void
|
|
*/
|
|
public function delete_network_transients() {
|
|
// Remove site transients.
|
|
foreach ( $this->site_transients->get_keys_from_database() as $key ) {
|
|
$this->site_transients->delete( $key, true );
|
|
}
|
|
}
|
|
}
|