Files
medicalalert-web-reloaded/wp/wp-content/plugins/wp-media-folder/requirements.php
2024-11-25 13:10:11 -05:00

545 lines
22 KiB
PHP

<?php
/**
* WP Media Folder
*
* @package WP Media Folder
* @author Joomunited
* @version 1.0
*/
namespace Joomunited\WPMF;
defined('ABSPATH') || die('No direct script access allowed!');
/**
* Class JUCheckRequirements
*/
class JUCheckRequirements
{
/**
* Error string
*
* @var string
*/
private static $error = '';
/**
* Warning string
*
* @var stringversionCompare
*/
private static $warning = '';
/**
* Information string
*
* @var string
*/
private static $info = '';
/**
* If requirements are pass return true
*
* @var boolean
*/
public static $isMeetRequirements = true;
/**
* Plugins name
*
* @var string
*/
public static $name = '';
/**
* Plugin Domain name
*
* @var string
*/
public static $namedomain = '';
/**
* Plugins path to disable
*
* @var string
*/
public static $path = '';
/**
* Plugin current version
*
* @var string
*/
public static $version = '';
/**
* Minimum php version are requirement
*
* @var string
*/
public static $requirePhpVersion = '';
/**
* Requirement classes
*
* @var array
*/
public static $requireClasses = array();
/**
* Requirement functions
*
* @var array
*/
public static $requireFunctions = array();
/**
* Requirement php modules
*
* @var array
*/
public static $requirePhpModules = array();
/**
* Requirement plugins
*
* @var array
*/
public static $requirePlugins = array();
/**
* Minimum addons version
*
* @var array
*/
public static $addonsVersion = array();
/**
* Addons meet requirements to load
*
* @var array
*/
public static $loadAddons = array();
/**
* Class JUCheckRequirements constructor.
*
* @param array $args Options
*
* @return array
*/
public static function init($args)
{
if (is_array($args) && !empty($args)) {
foreach ($args as $key => $value) {
switch ($key) {
case 'plugin_name':
self::$name = $value;
break;
case 'plugin_path':
self::$path = $value;
break;
case 'plugin_textdomain':
self::$namedomain = $value;
break;
case 'requirements':
if (is_array($value) && !empty($value)) {
// Requirement plugins
if (isset($value['plugins']) && is_array($value['plugins'])) {
self::$requirePlugins = $value['plugins'];
}
// Requirement minimum php version
if (isset($value['php_version']) && $value['php_version'] !== '') {
self::$requirePhpVersion = $value['php_version'];
}
// Requirement php modules
if (isset($value['php_modules']) && is_array($value['php_modules'])) {
self::$requirePhpModules = $value['php_modules'];
}
// Requirement php classes
if (isset($value['classes']) && is_array($value['classes'])) {
self::$requireClasses = $value['classes'];
}
// Requirement php functions
if (isset($value['functions']) && is_array($value['functions'])) {
self::$requireFunctions = $value['functions'];
}
// Requirement addons version
if (isset($value['addons_version']) && is_array($value['addons_version'])) {
self::$addonsVersion = $value['addons_version'];
}
}
break;
default:
break;
}
}
if (!function_exists('get_plugin_data')) {
include_once(ABSPATH . 'wp-admin/includes/plugin.php');
}
$addonData = get_plugin_data(WP_PLUGIN_DIR . DIRECTORY_SEPARATOR . self::$path, false, false);
self::$version = isset($addonData['Version']) ? $addonData['Version'] : null;
}
// self::checkPhpVersion();
self::checkRequirementModules();
self::checkRequirementClasses();
self::checkRequirementFunctions();
self::checkRequiredPlugins();
self::checkMinimumAddonsVersion();
if (is_admin() && !(defined('DOING_AJAX') && DOING_AJAX)) {
self::displayNotify();
}
return array(
'success' => self::$isMeetRequirements,
'load' => self::$loadAddons
);
}
/**
* Check requirement php modules
*
* @return void
*/
private static function checkRequirementModules()
{
$modules = self::$requirePhpModules;
if (is_array($modules) && !empty($modules)) {
foreach ($modules as $module => $type) {
if (function_exists('extension_loaded')) {
if (!extension_loaded($module)) {
$additionsMessage = '';
if ($type === 'warning') {
$additionsMessage = ' Some function may not work properly!';
}
/* translators: Plugins name and requirement module name */
// phpcs:ignore WordPress.WP.I18n.NonSingularStringLiteralDomain,WordPress.WP.I18n.NonSingularStringLiteralText
$message = '<strong>%s</strong> requires php extension <strong>%s</strong> installed.' . $additionsMessage;
self::addText(
$type,
sprintf(strip_tags($message, '<strong>'), self::$name, $module)
);
}
}
}
}
}
/**
* Check requirement classes
*
* @return void
*/
private static function checkRequirementClasses()
{
$classes = self::$requireClasses;
if (is_array($classes) && !empty($classes)) {
foreach ($classes as $class => $type) {
if (!class_exists($class)) {
$additionsMessage = '';
if ($type === 'warning') {
$additionsMessage = ' Some function may not work properly!';
}
/* translators: Plugins name and requirement class name */
// phpcs:ignore WordPress.WP.I18n.NonSingularStringLiteralDomain,WordPress.WP.I18n.NonSingularStringLiteralText
$message = '<strong>%s</strong> requires php class <strong>%s</strong> to be enable.' . $additionsMessage;
self::addText(
$type,
sprintf(strip_tags($message, '<strong>'), self::$name, $class)
);
}
}
}
}
/**
* Check requirement functions
*
* @return void
*/
private static function checkRequirementFunctions()
{
$functions =self::$requireFunctions;
if (is_array($functions) && !empty($functions)) {
foreach ($functions as $function => $type) {
if (!function_exists($function)) {
$additionsMessage = '';
if ($type === 'warning') {
$additionsMessage = ' Some function may not work properly!';
}
/* translators: Plugins name and requirement function name */
// phpcs:ignore WordPress.WP.I18n.NonSingularStringLiteralDomain,WordPress.WP.I18n.NonSingularStringLiteralText
$message = '<strong>%s</strong> requires php function <strong>%s</strong> to be enable.' . $additionsMessage;
self::addText(
$type,
sprintf(strip_tags($message, '<strong>'), self::$name, $function)
);
}
}
}
}
/**
* Check for php version is meet requirements
*
* @return void
*/
private static function checkPhpVersion()
{
if (self::$requirePhpVersion !== '') {
if (version_compare(PHP_VERSION, self::$requirePhpVersion, '<')) {
/* translators: Plugins name and version */
// phpcs:ignore WordPress.WP.I18n.NonSingularStringLiteralDomain,WordPress.WP.I18n.NonSingularStringLiteralText
$message = '<strong>%1$s</strong> need at least PHP %2$s version, please update php before installing the plugin.';
self::addText(
'error',
sprintf(strip_tags($message, '<strong>'), self::$name, self::$requirePhpVersion)
);
}
}
}
/**
* Check requirement plugins
*
* @return void
*/
private static function checkRequiredPlugins()
{
if (!function_exists('is_plugin_active') || !function_exists('get_plugin_data')) {
include_once(ABSPATH . 'wp-admin/includes/plugin.php');
}
$plugins = self::$requirePlugins;
if (is_array($plugins) && !empty($plugins)) {
foreach ($plugins as $plugin) {
if (function_exists('is_plugin_active')) {
if (!is_plugin_active($plugin['path'])) {
/* translators: Plugins name and plugin requirement name */
// phpcs:ignore WordPress.WP.I18n.NonSingularStringLiteralDomain,WordPress.WP.I18n.NonSingularStringLiteralText
$message = '<strong>%1$s</strong> requires <strong>%2$s</strong> plugin to be activated.';
self::addText(
isset($plugin['type']) ? $plugin['type'] : 'error',
sprintf(strip_tags($message, '<strong>'), self::$name, $plugin['name'])
);
} else {
$pluginPath = WP_PLUGIN_DIR . DIRECTORY_SEPARATOR . $plugin['path'];
if (file_exists($pluginPath)) {
// Check minimum of require plugin version if set
if (isset($plugin['requireVersion']) && $plugin['requireVersion'] !== '') {
$requireVersion = $plugin['requireVersion'];
$addonData = get_plugin_data($pluginPath, false, false);
$installedVersion = (isset($addonData['Version']) && strpos($addonData['Version'], '{{version') === false) ? $addonData['Version'] : null;
if ($installedVersion !== null) {
if (self::versionCompare((string) $installedVersion, '<', (string) $requireVersion)) {
/* translators: Plugins name and requirement function name */
// phpcs:ignore WordPress.WP.I18n.NonSingularStringLiteralDomain,WordPress.WP.I18n.NonSingularStringLiteralText
$message = '<strong>%1$s %2$s</strong> requires at least <strong>%3$s %4$s</strong>.';
self::addText(
'error',
sprintf(strip_tags($message, '<strong>'), self::$name, self::$version, $plugin['name'], $requireVersion)
);
}
}
}
}
}
}
}
}
}
/**
* Check minimum requirement version of addons
*
* @return void
*/
public static function checkMinimumAddonsVersion()
{
if (!empty(self::$addonsVersion)) {
if (!function_exists('get_plugin_data') || !function_exists('deactivate_plugins') || !function_exists('is_plugin_active')) {
include_once(ABSPATH . 'wp-admin/includes/plugin.php');
}
foreach (self::$addonsVersion as $addonName => $requireVersion) {
$addonPath = '';
if (function_exists($addonName.'_getPath')) {
$addonPath = call_user_func($addonName.'_getPath');
}
if (!is_plugin_active($addonPath)) {
continue;
}
if (function_exists('get_plugin_data')) {
$pluginPath = WP_PLUGIN_DIR . DIRECTORY_SEPARATOR . $addonPath;
if (file_exists($pluginPath)) {
$addonData = get_plugin_data($pluginPath, false, false);
$addonVersion = (isset($addonData['Version']) && strpos($addonData['Version'], '{{version') === false) ? $addonData['Version'] : null;
if ($addonVersion !== null) {
if (self::versionCompare($addonVersion, '<', $requireVersion)) {
/* translators: Plugins name and requirement function name */
// phpcs:ignore WordPress.WP.I18n.NonSingularStringLiteralDomain,WordPress.WP.I18n.NonSingularStringLiteralText
$message = 'Minimum required version of <strong>%1$s is %2$s</strong> to work with <strong>%3$s %4$s</strong>. Please update the plugin automatically or manually by downloading the latest version from JoomUnited website.';
self::addText(
'warning',
sprintf(strip_tags($message, '<strong>'), $addonData['Name'], $requireVersion, self::$name, self::$version)
);
//deactivate_plugins(array($path));
} else {
// Load this addons
self::$loadAddons[] = $addonName;
}
}
// Fix for developer
if (isset($addonData['Version']) && strpos($addonData['Version'], '{{version') === 0) {
// Load addons
self::$loadAddons[] = $addonName;
}
}
}
}
}
}
/**
* Disable plugin
*
* @return void
*/
public static function disablePlugin()
{
if (!function_exists('is_plugin_active') || !function_exists('deactivate_plugins')) {
require_once(ABSPATH . 'wp-admin/includes/plugin.php');
}
if (current_user_can('activate_plugins') && is_plugin_active(plugin_basename(self::$path))) {
deactivate_plugins(array(self::$path));
}
}
/**
* Add notify text
*
* @param string $type Type of notify
* @param string $string Notify message
*
* @return void
*/
private static function addText($type, $string)
{
switch ($type) {
case 'error':
self::$error .= '<p>'. $string .'</p>';
self::$isMeetRequirements = false;
break;
case 'warning':
self::$warning .= '<p>'. $string .'</p>';
break;
case 'info':
self::$info .= '<p>'. $string .'</p>';
break;
default:
break;
}
}
/**
* Add notify text to admin_notices
*
* @return void
*/
private static function displayNotify()
{
if (self::$error !== '' && empty($_COOKIE['ju-dismiss-error-requirement-' . sanitize_title(self::$name)])) {
add_action('admin_notices', array(__NAMESPACE__ . '\JUCheckRequirements', 'printError'));
}
if (self::$warning !== '' && empty($_COOKIE['ju-dismiss-warning-requirement-' . sanitize_title(self::$name)])) {
add_action('admin_notices', array(__NAMESPACE__ . '\JUCheckRequirements', 'printWarning'));
}
if (self::$info !== '' && empty($_COOKIE['ju-dismiss-info-requirement-' . sanitize_title(self::$name)])) {
add_action('admin_notices', array(__NAMESPACE__ . '\JUCheckRequirements', 'printInfo'));
}
if (!self::$isMeetRequirements) {
add_action('admin_init', array(__NAMESPACE__ . '\JUCheckRequirements', 'disablePlugin'));
}
}
/**
* Render Error text
*
* @return void
*/
public static function printError()
{
?>
<script>
jQuery(document).ready(function ($) {
$('.ju-requirement-notice-error-dismiss').on('click', function () {
var plugin = $(this).data('plugin');
$(this).closest('.ju-requirement-notice').hide();
let d = new Date();
d.setTime(d.getTime() + (7 * 24 * 60 * 60 * 1000));
let expires = "expires=" + d.toUTCString();
document.cookie = 'ju-dismiss-error-requirement-' + plugin + "=1;" + expires + ";path=/";
});
});
</script>
<div class="ju-notice ju-notice-error ju-is-dismissible" style="background: #fff; border: 1px solid #ccd0d4; border-left-width: 4px; box-shadow: 0 1px 1px rgba(0,0,0,.04); margin: 5px 15px 5px 0; padding: 1px 12px; border-left-color: #dc3232; position: relative">
<?php echo self::$error; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Notify text?>
<button type="button" class="notice-dismiss ju-requirement-notice-error-dismiss" data-plugin="<?php echo esc_html(sanitize_title(self::$name)) ?>"><span class="screen-reader-text" style="position: absolute; top: 0; right: 1px; border: none; margin: 0; padding: 9px; background: none; color: #72777c; cursor: pointer;"></span></button>
</div>
<?php
}
/**
* Render Warning text
*
* @return void
*/
public static function printWarning()
{
?>
<script>
jQuery(document).ready(function ($) {
$('.ju-requirement-notice-warning-dismiss').on('click', function () {
var plugin = $(this).data('plugin');
$(this).closest('.ju-requirement-notice').hide();
let d = new Date();
d.setTime(d.getTime() + (365 * 24 * 60 * 60 * 1000));
let expires = "expires=" + d.toUTCString();
document.cookie = 'ju-dismiss-warning-requirement-' + plugin + "=1;" + expires + ";path=/";
});
});
</script>
<div class="ju-notice ju-notice-warning ju-is-dismissible ju-requirement-notice" style="background: #fff; border: 1px solid #ccd0d4; border-left-width: 4px; box-shadow: 0 1px 1px rgba(0,0,0,.04); margin: 5px 15px 5px 0; padding: 1px 12px; border-left-color: #ffb900; position: relative">
<?php echo self::$warning; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Notify text?>
<button type="button" class="notice-dismiss ju-requirement-notice-warning-dismiss" data-plugin="<?php echo esc_html(sanitize_title(self::$name)) ?>"><span class="screen-reader-text" style="position: absolute; top: 0; right: 1px; border: none; margin: 0; padding: 9px; background: none; color: #72777c; cursor: pointer;"></span></button>
</div>
<?php
}
/**
* Render Info text
*
* @return void
*/
public static function printInfo()
{
?>
<script>
jQuery(document).ready(function ($) {
$('.ju-requirement-notice-info-dismiss').on('click', function () {
var plugin = $(this).data('plugin');
$(this).closest('.ju-requirement-notice').hide();
let d = new Date();
d.setTime(d.getTime() + (365 * 24 * 60 * 60 * 1000));
let expires = "expires=" + d.toUTCString();
document.cookie = 'ju-dismiss-info-requirement-' + plugin + "=1;" + expires + ";path=/";
});
});
</script>
<div class="ju-notice ju-notice-info ju-is-dismissible" style="background: #fff; border: 1px solid #ccd0d4; border-left-width: 4px; box-shadow: 0 1px 1px rgba(0,0,0,.04); margin: 5px 15px 5px 0; padding: 1px 12px; border-left-color: #00a0d2; position: relative">
<?php echo self::$info; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Notify text?>
<button type="button" class="notice-dismiss ju-requirement-notice-info-dismiss" data-plugin="<?php echo esc_html(sanitize_title(self::$name)) ?>"><span class="screen-reader-text" style="position: absolute; top: 0; right: 1px; border: none; margin: 0; padding: 9px; background: none; color: #72777c; cursor: pointer;"></span></button>
</div>
<?php
}
/**
* Compare version
*
* @param string $version1 Version 1
* @param string $operator Operator
* @param string $version2 Version 2
*
* @return boolean
*/
private static function versionCompare($version1, $operator, $version2)
{
return version_compare((string) $version1, (string) $version2, $operator);
}
}