diff --git a/packages/wp-mu-plugin/stretch-extra/stretch-extra/inc/plugin-block-list/plugin-block-list.php b/packages/wp-mu-plugin/stretch-extra/stretch-extra/inc/plugin-block-list/plugin-block-list.php new file mode 100644 index 000000000..7a7673158 --- /dev/null +++ b/packages/wp-mu-plugin/stretch-extra/stretch-extra/inc/plugin-block-list/plugin-block-list.php @@ -0,0 +1,313 @@ + reason) + */ +function get_disallowed_plugins() +{ + return [ + 'bwp-minify/bwp-minify.php', + 'e-mail-broadcasting/e-mail-broadcasting.php', + 'send-email-from-admin/send-email-from-admin.php', + 'mailit/mailit.php', + 'nginx-helper/nginx-helper.php', + 'stopbadbots/stopbadbots.php', + 'w3-total-cache/w3-total-cache.php', + 'wp-fastest-cache/wpFastestCache.php', + 'wp-super-cache/wp-cache.php', + 'wp-rest-api-log/wp-rest-api-log.php', + 'website-file-changes-monitor/website-file-changes-monitor.php', + ]; +} + +function get_blocked_plugins_slug(){ + return array_map('dirname', get_disallowed_plugins()); +} + +function get_plugin_slug($plugin) { + return strpos($plugin, '/') !== false ? dirname($plugin) : $plugin; +} + +/** + * Disable install button for disallowed plugins + */ +function disable_plugin_install_link($action_links, $plugin) +{ + $disallowed_slugs = get_blocked_plugins_slug(); + + if (in_array($plugin['slug'], $disallowed_slugs, true)) { + return [ + '' . __('Not Supported', 'stretch-extra') . '', + ]; + } + + return $action_links; +} +add_filter('plugin_install_action_links', 'disable_plugin_install_link', 0, 2); + +/** + * Disable activate button for disallowed plugins + */ +function disable_plugin_activate_link($actions, $plugin_file) +{ + $disallowed = get_disallowed_plugins(); + + if (isset($actions['activate']) && in_array($plugin_file, $disallowed, true)) { + $actions['activate'] = __('Disabled', 'stretch-extra'); + unset($actions['edit']); + } + + return $actions; +} +add_filter('plugin_action_links', 'disable_plugin_activate_link', 10, 2); +add_filter('network_admin_plugin_action_links', 'disable_plugin_activate_link', 10, 2); + +/** + * Deactivate disallowed plugins if they are active + */ +function deactivate_disallowed_plugins() +{ + // Make sure plugin functions are available + require_once ABSPATH . 'wp-admin/includes/plugin.php'; + + $disallowed = get_disallowed_plugins(); + + foreach ($disallowed as $plugin_file) { + if (is_plugin_active($plugin_file)) { + + // Get plugin data (real name from header) + $plugin_data = get_plugin_data(WP_PLUGIN_DIR . '/' . $plugin_file); + $plugin_name = ! empty($plugin_data['Name']) + ? $plugin_data['Name'] + : $plugin_file; // fallback + + deactivate_plugins($plugin_file); + + add_action('admin_notices', function () use ($plugin_name) { + + $message = sprintf( + __('The use of "%s" is not allowed and cannot be activated. Uninstall is recommended.', 'stretch-extra'), + $plugin_name + ); + + echo '

' . + wp_kses_post($message) . + '

'; + }); + } + } +} +add_action('admin_init', 'deactivate_disallowed_plugins', 0); + +/** + * Disallow installation of blocked plugins via the installer + */ +function block_disallowed_post_install($true, $hook_extra, $result) +{ + $disallowed = get_disallowed_plugins(); + + if (empty($result['destination']) || ! is_dir($result['destination'])) { + return $true; + } + + $plugin_folder = basename($result['destination']); + $files = scandir($result['destination']); + + // Normal text after "Unpacking the package…" + wp_register_style('stretch-extra-inline', false); + wp_enqueue_style('stretch-extra-inline'); + + wp_add_inline_style('stretch-extra-inline', ' + .zip-upload-text { + margin: 0 0 8px 0; + font-style: italic; + color: #555; + } + '); + + echo '

' . esc_html__( + 'Validating against blocked plugins…', + 'stretch-extra' + ) . '

'; + + foreach ($files as $file) { + + // skip non-PHP files + if (substr($file, -4) !== '.php') { + continue; + } + + $plugin_file = "{$plugin_folder}/{$file}"; + + // skip allowed plugins + if (! in_array($plugin_file, $disallowed, true)) { + continue; + } + + $it = new RecursiveDirectoryIterator($result['destination'], RecursiveDirectoryIterator::SKIP_DOTS); + $files_iter = new RecursiveIteratorIterator($it, RecursiveIteratorIterator::CHILD_FIRST); + + foreach ($files_iter as $fileinfo) { + $todo = ($fileinfo->isDir() ? 'rmdir' : 'unlink'); + $todo($fileinfo->getRealPath()); + } + + rmdir($result['destination']); + + return new WP_Error('plugin_blocked', error_notice_for_blocked_plugin()); + } + + return $true; +} +if ( ! ( defined( 'WP_CLI' ) && WP_CLI ) ) { + add_filter( 'upgrader_post_install', 'block_disallowed_post_install', 10, 3 ); +} + +function error_notice_for_blocked_plugin() +{ + return '
' . + '

' . sprintf( + /* translators: %s: link to blocked plugins list */ + __('This plugin is not supported on our Managed WordPress platform. %s', 'stretch-extra'), + '' . __('Full list of blocked plugins', 'stretch-extra') . '' + ) . '

' . + '
'; +} + +// Only run in WP-CLI +if (defined('WP_CLI') && WP_CLI) { + // Helper variables and functions to block plugin activation via WP-CLI for disallowed plugins + $blocked_slugs = get_blocked_plugins_slug(); + $blocked_slug_map = array_flip($blocked_slugs); + + $get_plugin_slug = function($plugin) { + return strpos($plugin, '/') !== false ? dirname($plugin) : $plugin; + }; + + $is_disallowed = function($plugin) use ($blocked_slug_map, $get_plugin_slug) { + $slug = $get_plugin_slug($plugin); + return isset($blocked_slug_map[$slug]); + }; + + // Extract plugin slugs from CLI command + $extract_plugins_from_argv = function($command) { + $argv = $_SERVER['argv'] ?? []; + $plugins = []; + $found_command = false; + + foreach ($argv as $arg) { + // Start collecting after the command (activate / install) + if ($found_command) { + $plugins[] = $arg; + } + if ($arg === $command) { + $found_command = true; + } + } + + return $plugins; + }; + + // Block "wp plugin activate" + \WP_CLI::add_hook('before_invoke:plugin activate', function($args, $assoc_args = []) use ($is_disallowed, $extract_plugins_from_argv) { + + $plugins = $extract_plugins_from_argv('activate'); + + foreach ($plugins as $plugin) { + if ($is_disallowed($plugin)) { + \WP_CLI::error(sprintf( + __('The use of "%s" is not allowed and cannot be activated. Uninstall is recommended.', 'stretch-extra'), + $plugin + )); + } + } + }); + + // Block "wp plugin install --activate" + \WP_CLI::add_hook('before_invoke:plugin install', function($args, $assoc_args = []) use ($is_disallowed) { + + $argv = $_SERVER['argv'] ?? []; + + // Only run blocking if --activate is present + if (!in_array('--activate', $argv, true)) { + return; + } + + // Collect all plugin slugs after "install" + $plugins = []; + $found_install = false; + foreach ($argv as $arg) { + if ($found_install) { + // stop at any option starting with -- + if (str_starts_with($arg, '--')) { + break; + } + $plugins[] = $arg; + } + if ($arg === 'install') { + $found_install = true; + } + } + + foreach ($plugins as $plugin) { + if ($is_disallowed($plugin)) { + \WP_CLI::error(sprintf( + __('The use of "%s" is not allowed and cannot be activated via install. Uninstall is recommended.', 'stretch-extra'), + $plugin + )); + } + } +}); +} + +add_action('admin_enqueue_scripts', function ($hook) { + if ($hook !== 'plugin-install.php') { + return; + } + + // Get the HTML notice from your PHP function + $notice_html = str_replace(["\n", "'"], ['', "\\'"], error_notice_for_blocked_plugin()); + + // Get the "Not Supported" text for the JS check + $not_supported_text = __('Not Supported', 'stretch-extra'); + + // Add inline vanilla JS + wp_add_inline_script('jquery-core', " + document.addEventListener('DOMContentLoaded', function () { + document.querySelectorAll('.plugin-card').forEach(function (card) { + var pluginBox = card.querySelector('.plugin-card-top'); + if (!pluginBox) return; + + // Check if a button contains the 'Not Supported' text + var buttons = pluginBox.querySelectorAll('.button-disabled'); + var hasNotSupported = Array.from(buttons).some(function(btn) { + return btn.textContent.includes('{$not_supported_text}'); + }); + + if (hasNotSupported && !pluginBox.classList.contains('blocked-notice-added')) { + pluginBox.insertAdjacentHTML('afterbegin', '{$notice_html}'); + pluginBox.classList.add('blocked-notice-added'); + } + }); + }); + "); +}); + +add_action('admin_head', function () { + $screen = get_current_screen(); + if ($screen && $screen->id === 'plugin-install') { + echo ''; + } +}); diff --git a/packages/wp-mu-plugin/stretch-extra/stretch-extra/index.php b/packages/wp-mu-plugin/stretch-extra/stretch-extra/index.php index 4de767574..6dcfcfbe6 100644 --- a/packages/wp-mu-plugin/stretch-extra/stretch-extra/index.php +++ b/packages/wp-mu-plugin/stretch-extra/stretch-extra/index.php @@ -41,3 +41,4 @@ require_once __DIR__ . '/inc/secondary-theme-dir.php'; require_once __DIR__ . '/inc/apcu.php'; require_once __DIR__ . '/inc/marketplace/marketplace.php'; +require_once __DIR__ . '/inc/plugin-block-list/plugin-block-list.php'; diff --git a/packages/wp-mu-plugin/stretch-extra/stretch-extra/languages/stretch-extra-de_DE.po b/packages/wp-mu-plugin/stretch-extra/stretch-extra/languages/stretch-extra-de_DE.po index 566e63ba9..d3d38ef02 100644 --- a/packages/wp-mu-plugin/stretch-extra/stretch-extra/languages/stretch-extra-de_DE.po +++ b/packages/wp-mu-plugin/stretch-extra/stretch-extra/languages/stretch-extra-de_DE.po @@ -62,3 +62,30 @@ msgstr "" #: stretch-extra/inc/marketplace/config.php msgid "Provides guided onboarding and a Site Assistant in the WordPress admin." msgstr "" + +#: stretch-extra/inc/plugin-block-list/plugin-block-list.php +msgid "Not Supported" +msgstr "" + +#: stretch-extra/inc/plugin-block-list/plugin-block-list.php +msgid "Disabled" +msgstr "" + +#: stretch-extra/inc/plugin-block-list/plugin-block-list.php +msgid "Validating against blocked plugins…" +msgstr "" + +#. translators: %s: link to blocked plugins list +#: stretch-extra/inc/plugin-block-list/plugin-block-list.php +#, php-format +msgid "This plugin is not supported on our Managed WordPress platform. %s" +msgstr "" + +#: stretch-extra/inc/plugin-block-list/plugin-block-list.php +msgid "Full list of blocked plugins" +msgstr "" + +#: stretch-extra/inc/plugin-block-list/plugin-block-list.php +#, php-format +msgid "The use of \"%s\" is not allowed and cannot be activated. Uninstall is recommended." +msgstr "" diff --git a/packages/wp-mu-plugin/stretch-extra/stretch-extra/languages/stretch-extra-en_US.po b/packages/wp-mu-plugin/stretch-extra/stretch-extra/languages/stretch-extra-en_US.po index bf624f30c..fb94b6fc1 100644 --- a/packages/wp-mu-plugin/stretch-extra/stretch-extra/languages/stretch-extra-en_US.po +++ b/packages/wp-mu-plugin/stretch-extra/stretch-extra/languages/stretch-extra-en_US.po @@ -62,3 +62,30 @@ msgstr "" #: stretch-extra/inc/marketplace/config.php msgid "Provides guided onboarding and a Site Assistant in the WordPress admin." msgstr "" + +#: stretch-extra/inc/plugin-block-list/plugin-block-list.php +msgid "Not Supported" +msgstr "" + +#: stretch-extra/inc/plugin-block-list/plugin-block-list.php +msgid "Disabled" +msgstr "" + +#: stretch-extra/inc/plugin-block-list/plugin-block-list.php +msgid "Validating against blocked plugins…" +msgstr "" + +#. translators: %s: link to blocked plugins list +#: stretch-extra/inc/plugin-block-list/plugin-block-list.php +#, php-format +msgid "This plugin is not supported on our Managed WordPress platform. %s" +msgstr "" + +#: stretch-extra/inc/plugin-block-list/plugin-block-list.php +msgid "Full list of blocked plugins" +msgstr "" + +#: stretch-extra/inc/plugin-block-list/plugin-block-list.php +#, php-format +msgid "The use of \"%s\" is not allowed and cannot be activated. Uninstall is recommended." +msgstr "" diff --git a/packages/wp-mu-plugin/stretch-extra/stretch-extra/languages/stretch-extra-es_ES.po b/packages/wp-mu-plugin/stretch-extra/stretch-extra/languages/stretch-extra-es_ES.po index 7f3f44208..5e636a1de 100644 --- a/packages/wp-mu-plugin/stretch-extra/stretch-extra/languages/stretch-extra-es_ES.po +++ b/packages/wp-mu-plugin/stretch-extra/stretch-extra/languages/stretch-extra-es_ES.po @@ -62,3 +62,30 @@ msgstr "" #: stretch-extra/inc/marketplace/config.php msgid "Provides guided onboarding and a Site Assistant in the WordPress admin." msgstr "" + +#: stretch-extra/inc/plugin-block-list/plugin-block-list.php +msgid "Not Supported" +msgstr "" + +#: stretch-extra/inc/plugin-block-list/plugin-block-list.php +msgid "Disabled" +msgstr "" + +#: stretch-extra/inc/plugin-block-list/plugin-block-list.php +msgid "Validating against blocked plugins…" +msgstr "" + +#. translators: %s: link to blocked plugins list +#: stretch-extra/inc/plugin-block-list/plugin-block-list.php +#, php-format +msgid "This plugin is not supported on our Managed WordPress platform. %s" +msgstr "" + +#: stretch-extra/inc/plugin-block-list/plugin-block-list.php +msgid "Full list of blocked plugins" +msgstr "" + +#: stretch-extra/inc/plugin-block-list/plugin-block-list.php +#, php-format +msgid "The use of \"%s\" is not allowed and cannot be activated. Uninstall is recommended." +msgstr "" diff --git a/packages/wp-mu-plugin/stretch-extra/stretch-extra/languages/stretch-extra-es_MX.po b/packages/wp-mu-plugin/stretch-extra/stretch-extra/languages/stretch-extra-es_MX.po index e3c31daf1..4c0c7e89a 100644 --- a/packages/wp-mu-plugin/stretch-extra/stretch-extra/languages/stretch-extra-es_MX.po +++ b/packages/wp-mu-plugin/stretch-extra/stretch-extra/languages/stretch-extra-es_MX.po @@ -62,3 +62,30 @@ msgstr "" #: stretch-extra/inc/marketplace/config.php msgid "Provides guided onboarding and a Site Assistant in the WordPress admin." msgstr "" + +#: stretch-extra/inc/plugin-block-list/plugin-block-list.php +msgid "Not Supported" +msgstr "" + +#: stretch-extra/inc/plugin-block-list/plugin-block-list.php +msgid "Disabled" +msgstr "" + +#: stretch-extra/inc/plugin-block-list/plugin-block-list.php +msgid "Validating against blocked plugins…" +msgstr "" + +#. translators: %s: link to blocked plugins list +#: stretch-extra/inc/plugin-block-list/plugin-block-list.php +#, php-format +msgid "This plugin is not supported on our Managed WordPress platform. %s" +msgstr "" + +#: stretch-extra/inc/plugin-block-list/plugin-block-list.php +msgid "Full list of blocked plugins" +msgstr "" + +#: stretch-extra/inc/plugin-block-list/plugin-block-list.php +#, php-format +msgid "The use of \"%s\" is not allowed and cannot be activated. Uninstall is recommended." +msgstr "" diff --git a/packages/wp-mu-plugin/stretch-extra/stretch-extra/languages/stretch-extra-fr_FR.po b/packages/wp-mu-plugin/stretch-extra/stretch-extra/languages/stretch-extra-fr_FR.po index c91094fa2..6c94d6644 100644 --- a/packages/wp-mu-plugin/stretch-extra/stretch-extra/languages/stretch-extra-fr_FR.po +++ b/packages/wp-mu-plugin/stretch-extra/stretch-extra/languages/stretch-extra-fr_FR.po @@ -62,3 +62,30 @@ msgstr "" #: stretch-extra/inc/marketplace/config.php msgid "Provides guided onboarding and a Site Assistant in the WordPress admin." msgstr "" + +#: stretch-extra/inc/plugin-block-list/plugin-block-list.php +msgid "Not Supported" +msgstr "" + +#: stretch-extra/inc/plugin-block-list/plugin-block-list.php +msgid "Disabled" +msgstr "" + +#: stretch-extra/inc/plugin-block-list/plugin-block-list.php +msgid "Validating against blocked plugins…" +msgstr "" + +#. translators: %s: link to blocked plugins list +#: stretch-extra/inc/plugin-block-list/plugin-block-list.php +#, php-format +msgid "This plugin is not supported on our Managed WordPress platform. %s" +msgstr "" + +#: stretch-extra/inc/plugin-block-list/plugin-block-list.php +msgid "Full list of blocked plugins" +msgstr "" + +#: stretch-extra/inc/plugin-block-list/plugin-block-list.php +#, php-format +msgid "The use of \"%s\" is not allowed and cannot be activated. Uninstall is recommended." +msgstr "" diff --git a/packages/wp-mu-plugin/stretch-extra/stretch-extra/languages/stretch-extra-it_IT.po b/packages/wp-mu-plugin/stretch-extra/stretch-extra/languages/stretch-extra-it_IT.po index 862973c17..82bdf5c63 100644 --- a/packages/wp-mu-plugin/stretch-extra/stretch-extra/languages/stretch-extra-it_IT.po +++ b/packages/wp-mu-plugin/stretch-extra/stretch-extra/languages/stretch-extra-it_IT.po @@ -62,3 +62,30 @@ msgstr "" #: stretch-extra/inc/marketplace/config.php msgid "Provides guided onboarding and a Site Assistant in the WordPress admin." msgstr "" + +#: stretch-extra/inc/plugin-block-list/plugin-block-list.php +msgid "Not Supported" +msgstr "" + +#: stretch-extra/inc/plugin-block-list/plugin-block-list.php +msgid "Disabled" +msgstr "" + +#: stretch-extra/inc/plugin-block-list/plugin-block-list.php +msgid "Validating against blocked plugins…" +msgstr "" + +#. translators: %s: link to blocked plugins list +#: stretch-extra/inc/plugin-block-list/plugin-block-list.php +#, php-format +msgid "This plugin is not supported on our Managed WordPress platform. %s" +msgstr "" + +#: stretch-extra/inc/plugin-block-list/plugin-block-list.php +msgid "Full list of blocked plugins" +msgstr "" + +#: stretch-extra/inc/plugin-block-list/plugin-block-list.php +#, php-format +msgid "The use of \"%s\" is not allowed and cannot be activated. Uninstall is recommended." +msgstr "" diff --git a/packages/wp-mu-plugin/stretch-extra/stretch-extra/languages/stretch-extra-nl_NL.po b/packages/wp-mu-plugin/stretch-extra/stretch-extra/languages/stretch-extra-nl_NL.po index f8f1fe0b0..ae5ed0434 100644 --- a/packages/wp-mu-plugin/stretch-extra/stretch-extra/languages/stretch-extra-nl_NL.po +++ b/packages/wp-mu-plugin/stretch-extra/stretch-extra/languages/stretch-extra-nl_NL.po @@ -62,3 +62,30 @@ msgstr "" #: stretch-extra/inc/marketplace/config.php msgid "Provides guided onboarding and a Site Assistant in the WordPress admin." msgstr "" + +#: stretch-extra/inc/plugin-block-list/plugin-block-list.php +msgid "Not Supported" +msgstr "" + +#: stretch-extra/inc/plugin-block-list/plugin-block-list.php +msgid "Disabled" +msgstr "" + +#: stretch-extra/inc/plugin-block-list/plugin-block-list.php +msgid "Validating against blocked plugins…" +msgstr "" + +#. translators: %s: link to blocked plugins list +#: stretch-extra/inc/plugin-block-list/plugin-block-list.php +#, php-format +msgid "This plugin is not supported on our Managed WordPress platform. %s" +msgstr "" + +#: stretch-extra/inc/plugin-block-list/plugin-block-list.php +msgid "Full list of blocked plugins" +msgstr "" + +#: stretch-extra/inc/plugin-block-list/plugin-block-list.php +#, php-format +msgid "The use of \"%s\" is not allowed and cannot be activated. Uninstall is recommended." +msgstr "" diff --git a/packages/wp-mu-plugin/stretch-extra/stretch-extra/languages/stretch-extra-sv_SE.po b/packages/wp-mu-plugin/stretch-extra/stretch-extra/languages/stretch-extra-sv_SE.po index 0b5c86c3b..73f376d1a 100644 --- a/packages/wp-mu-plugin/stretch-extra/stretch-extra/languages/stretch-extra-sv_SE.po +++ b/packages/wp-mu-plugin/stretch-extra/stretch-extra/languages/stretch-extra-sv_SE.po @@ -62,3 +62,30 @@ msgstr "" #: stretch-extra/inc/marketplace/config.php msgid "Provides guided onboarding and a Site Assistant in the WordPress admin." msgstr "" + +#: stretch-extra/inc/plugin-block-list/plugin-block-list.php +msgid "Not Supported" +msgstr "" + +#: stretch-extra/inc/plugin-block-list/plugin-block-list.php +msgid "Disabled" +msgstr "" + +#: stretch-extra/inc/plugin-block-list/plugin-block-list.php +msgid "Validating against blocked plugins…" +msgstr "" + +#. translators: %s: link to blocked plugins list +#: stretch-extra/inc/plugin-block-list/plugin-block-list.php +#, php-format +msgid "This plugin is not supported on our Managed WordPress platform. %s" +msgstr "" + +#: stretch-extra/inc/plugin-block-list/plugin-block-list.php +msgid "Full list of blocked plugins" +msgstr "" + +#: stretch-extra/inc/plugin-block-list/plugin-block-list.php +#, php-format +msgid "The use of \"%s\" is not allowed and cannot be activated. Uninstall is recommended." +msgstr "" diff --git a/packages/wp-mu-plugin/stretch-extra/stretch-extra/languages/stretch-extra.pot b/packages/wp-mu-plugin/stretch-extra/stretch-extra/languages/stretch-extra.pot index c58281174..519dcb072 100644 --- a/packages/wp-mu-plugin/stretch-extra/stretch-extra/languages/stretch-extra.pot +++ b/packages/wp-mu-plugin/stretch-extra/stretch-extra/languages/stretch-extra.pot @@ -9,9 +9,9 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"POT-Creation-Date: 2026-02-11T10:50:16+00:00\n" +"POT-Creation-Date: 2026-04-01T14:13:44+00:00\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"X-Generator: WP-CLI 2.11.0\n" +"X-Generator: WP-CLI 2.12.0\n" "X-Domain: stretch-extra\n" #. Plugin Name of the plugin @@ -62,3 +62,30 @@ msgstr "" #: stretch-extra/inc/marketplace/marketplace.php msgid "recommends" msgstr "" + +#: stretch-extra/inc/plugin-block-list/plugin-block-list.php +msgid "Not Supported" +msgstr "" + +#: stretch-extra/inc/plugin-block-list/plugin-block-list.php +msgid "Disabled" +msgstr "" + +#: stretch-extra/inc/plugin-block-list/plugin-block-list.php +#, php-format +msgid "The use of \"%s\" is not allowed and cannot be activated. Uninstall is recommended." +msgstr "" + +#: stretch-extra/inc/plugin-block-list/plugin-block-list.php +msgid "Validating against blocked plugins…" +msgstr "" + +#. translators: %s: link to blocked plugins list +#: stretch-extra/inc/plugin-block-list/plugin-block-list.php +#, php-format +msgid "This plugin is not supported on our Managed WordPress platform. %s" +msgstr "" + +#: stretch-extra/inc/plugin-block-list/plugin-block-list.php +msgid "Full list of blocked plugins" +msgstr ""