OwlCyberSecurity - MANAGER
Edit File: class-imagify-requirements-check.php
<?php defined( 'ABSPATH' ) || die( 'Cheatin’ uh?' ); /** * Class to check if the current WordPress and PHP versions meet our requirements. * * @since 1.9 * @source Based on class WP_Rocket_Requirements_Check from WP Rocket plugin. * @author Grégory Viguier * @author Remy Perona */ class Imagify_Requirements_Check { /** * Plugin Name. * * @var string * @since 1.9 * @access private * @author Grégory Viguier */ private $plugin_name; /** * Plugin filepath. * * @var string * @since 1.9 * @access private * @author Grégory Viguier */ private $plugin_file; /** * Plugin version. * * @var string * @since 1.9 * @access private * @author Grégory Viguier */ private $plugin_version; /** * Last plugin version handling the current version of WP. * * @var string * @since 1.9 * @access private * @author Grégory Viguier */ private $wp_last_version; /** * Last plugin version handling the current version of PHP. * * @var string * @since 1.9 * @access private * @author Grégory Viguier */ private $php_last_version; /** * Required WordPress version. * * @var string * @since 1.9 * @access private * @author Grégory Viguier */ private $wp_version; /** * Required PHP version. * * @var string * @since 1.9 * @access private * @author Grégory Viguier */ private $php_version; /** * Constructor. * * @since 1.9 * @access public * @author Grégory Viguier * * @param array $args { * Arguments to populate the class properties. * * @type string $plugin_name Plugin name. * @type string $plugin_file Plugin filepath. * @type string $plugin_version Plugin version. * @type string $wp_last_version Last plugin version handling the current version of WP. * @type string $php_last_version Last plugin version handling the current version of PHP. * @type string $wp_version Required WordPress version. * @type string $php_version Required PHP version. * } */ public function __construct( $args ) { foreach ( array( 'plugin_name', 'plugin_file', 'plugin_version', 'wp_last_version', 'php_last_version', 'wp_version', 'php_version' ) as $setting ) { if ( isset( $args[ $setting ] ) ) { $this->$setting = $args[ $setting ]; } } if ( empty( $this->wp_last_version ) ) { $this->wp_last_version = '1.6.14.2'; } if ( empty( $this->php_last_version ) ) { $this->php_last_version = '1.8.4.1'; } } /** * Check if all requirements are ok, if not, display a notice and the rollback. * * @since 1.9 * @access public * @author Grégory Viguier * * @return bool */ public function check() { if ( ! $this->php_passes() || ! $this->wp_passes() ) { add_action( 'admin_notices', array( $this, 'print_notice' ) ); add_action( 'admin_post_imagify_rollback', array( $this, 'rollback' ) ); return false; } return true; } /** * Check if the current PHP version is equal or superior to the required PHP version. * * @since 1.9 * @access private * @author Grégory Viguier * * @return bool */ private function php_passes() { return version_compare( PHP_VERSION, $this->php_version ) >= 0; } /** * Check if the current WordPress version is equal or superior to the required PHP version. * * @since 1.9 * @access private * @author Grégory Viguier * * @return bool */ private function wp_passes() { global $wp_version; return version_compare( $wp_version, $this->wp_version ) >= 0; } /** * Get the last version of the plugin that can run with the current WP and PHP versions. * * @since 1.9 * @access private * @author Grégory Viguier * * @return string */ private function get_last_version() { $last_version = ''; if ( ! $this->php_passes() ) { $last_version = $this->php_last_version; } if ( ! $this->wp_passes() ) { $last_version = ! $last_version || version_compare( $last_version, $this->wp_last_version ) > 0 ? $this->wp_last_version : $last_version; } return $last_version; } /** * Tell if the current user can rollback. * * @since 1.9 * @access private * @author Grégory Viguier * * @return bool */ private function current_user_can() { $describer = 'manage'; $capacity = $this->is_active_for_network() ? 'manage_network_options' : 'manage_options'; // This filter is documented in classes/Context/AbstractContext.php. $capacity = (string) apply_filters( 'imagify_capacity', $capacity, $describer, 'wp' ); $user_can = current_user_can( $capacity ); // This filter is documented in classes/Context/AbstractContext.php. $user_can = (bool) apply_filters( 'imagify_current_user_can', $user_can, $capacity, $describer, null, 'wp' ); return $user_can; } /** * Tell if Imagify is activated on the network. * * @since 1.9 * @access private * @author Grégory Viguier * * return bool True if Imagify is activated on the network. */ private function is_active_for_network() { if ( ! is_multisite() ) { return false; } if ( ! function_exists( 'is_plugin_active_for_network' ) ) { require_once ABSPATH . 'wp-admin/includes/plugin.php'; } return is_plugin_active_for_network( plugin_basename( $this->plugin_file ) ); } /** * Warn if PHP version is less than 5.4 and offers to rollback. * * @since 1.9 * @access public * @author Grégory Viguier */ public function print_notice() { if ( ! $this->current_user_can() ) { return; } imagify_load_translations(); $message = array(); $required = array(); $rollback_url = wp_nonce_url( admin_url( 'admin-post.php?action=imagify_rollback' ), 'imagify_rollback' ); if ( ! $this->php_passes() ) { /* translators: %1$s = Plugin name, %2$s = PHP version required. */ $message[] = sprintf( esc_html__( 'To use this %1$s version, please ask your web host how to upgrade your server to PHP %2$s or higher.', 'imagify' ), $this->plugin_name, $this->php_version ); $required[] = 'PHP ' . $this->php_version; } if ( ! $this->wp_passes() ) { /* translators: %1$s = Plugin name, %2$s = WordPress version required. */ $message[] = sprintf( esc_html__( 'To use this %1$s version, please upgrade WordPress to version %2$s or higher.', 'imagify' ), $this->plugin_name, $this->wp_version ); $required[] = 'WordPress ' . $this->wp_version; } $message = '<p>' . implode( '<br/>', $message ) . "</p>\n"; $required = wp_sprintf_l( '%l', $required ); /* translators: %1$s = Plugin name, %2$s = Plugin version, $3$s is something like "PHP 5.4" or "PHP 5.4 and WordPress 4.0". */ $message = '<p>' . sprintf( esc_html__( 'To function properly, %1$s %2$s requires at least %3$s.', 'imagify' ), '<strong>' . $this->plugin_name . '</strong>', $this->plugin_version, $required ) . "</p>\n" . $message; $message .= '<p>' . esc_html__( 'If you are not able to upgrade, you can rollback to the previous version by using the button below.', 'imagify' ) . "</p>\n"; /* translators: %s = Previous plugin version. */ $message .= '<p class="submit"><a href="' . esc_url( $rollback_url ) . '" class="button">' . sprintf( __( 'Re-install version %s', 'imagify' ), $this->get_last_version() ) . '</a></p>'; echo '<div class="notice notice-error">' . $message . '</div>'; } /** * Do the rollback. * * @since 1.9 * @access public * @author Grégory Viguier */ public function rollback() { check_ajax_referer( 'imagify_rollback' ); if ( ! $this->current_user_can() ) { wp_die(); } imagify_load_translations(); $plugin_transient = get_site_transient( 'update_plugins' ); $plugin_basename = plugin_basename( $this->plugin_file ); $plugin_folder = dirname( $plugin_basename ); $last_version = $this->get_last_version(); $package_filename = $plugin_folder . '.' . $last_version . '.zip'; $plugin_transient->checked[ $plugin_basename ] = $last_version; if ( ! empty( $plugin_transient->response[ $plugin_basename ] ) ) { $tmp_obj = $plugin_transient->response[ $plugin_basename ]; } elseif ( ! empty( $plugin_transient->no_update[ $plugin_basename ] ) ) { $tmp_obj = $plugin_transient->no_update[ $plugin_basename ]; } else { $tmp_obj = (object) array( 'id' => 'w.org/plugins/' . $plugin_folder, 'slug' => $plugin_folder, 'plugin' => $plugin_basename, 'new_version' => $last_version, 'url' => 'https://wordpress.org/plugins/' . $plugin_folder . '/', 'package' => 'https://downloads.wordpress.org/plugin/' . $package_filename, 'icons' => array(), 'banners' => array(), 'banners_rtl' => array(), ); } $tmp_obj->new_version = $last_version; $tmp_obj->package = preg_replace( '@/[^/]+$@', '/' . $package_filename, $tmp_obj->package ); $plugin_transient->response[ $plugin_basename ] = $tmp_obj; unset( $plugin_transient->no_update[ $plugin_basename ] ); set_site_transient( 'update_plugins', $plugin_transient ); require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php'; /* translators: %s is the plugin name. */ $title = sprintf( __( '%s Update Rollback', 'imagify' ), $this->plugin_name ); $nonce = 'upgrade-plugin_' . $plugin_basename; $url = 'update.php?action=upgrade-plugin&plugin=' . rawurlencode( $plugin_basename ); $upgrader_skin = new Plugin_Upgrader_Skin( compact( 'title', 'nonce', 'url', 'plugin' ) ); $upgrader = new Plugin_Upgrader( $upgrader_skin ); $upgrader->upgrade( $plugin_basename ); wp_die( '', /* translators: %s is the plugin name. */ sprintf( __( '%s Update Rollback', 'imagify' ), $this->plugin_name ), array( 'response' => 200 ) ); } }