File: /sites/nuofama.com/wp-content/themes/blocksy/admin/dashboard/plugins/ct-plugin-manager.php
<?php
class Blocksy_Plugin_Manager {
protected $config = [];
public function __construct() {
$this->load_config();
}
public function get_config() {
return $this->config;
}
protected function load_config() {
$this->config = blocksy_akg(
'plug',
blocksy_get_variables_from_file(
dirname( __FILE__ ) . '/config.php',
[ 'plug' => [] ]
)
);
}
public function get_plugins() {
if (isset($this->config)) {
return $this->config;
}
return [];
}
public function get_companion_status() {
$free_status = $this->get_plugin_status('blocksy-companion');
$status = $this->get_plugin_status('blocksy-companion-pro');
if ($status !== 'uninstalled') {
return [
'slug' => 'blocksy-companion-pro',
'status' => $status
];
}
return [
'slug' => 'blocksy-companion',
'status' => $free_status
];
}
public function get_plugins_api($slug) {
static $api = []; // Cache received responses.
if (! isset($api[$slug])) {
if ( ! function_exists( 'plugins_api' ) ) {
require_once ABSPATH . 'wp-admin/includes/plugin-install.php';
}
require_once dirname(__FILE__) . '/ct-wp-upgrader-skin.php';
$response = plugins_api(
'plugin_information',
[
'slug' => $slug,
'fields' => [
'sections' => false,
],
]
);
$api[$slug] = false;
if (is_wp_error($response)) {
} else {
$api[$slug] = $response;
}
}
return $api[$slug];
}
/**
* Wrapper around the core WP get_plugins function,
* making sure it's actually available.
*/
public function get_installed_plugins($plugin_folder = '') {
// https://github.com/WordPress/WordPress/blob/ba92ed7615dec870a363bc99d6668faedfa77415/wp-admin/includes/plugin.php#L2254
wp_cache_delete('plugins', 'plugins');
if (! function_exists('get_plugins')) {
require_once ABSPATH . 'wp-admin/includes/plugin.php';
}
return get_plugins($plugin_folder);
}
public function is_plugin_installed($slug) {
$installed_plugins = $this->get_installed_plugins();
foreach ($installed_plugins as $plugin => $data) {
$parts = explode('/', $plugin);
$plugin_first_part = $parts[0];
if (strtolower($slug) === strtolower($plugin_first_part)) {
return $plugin;
}
}
return false;
}
public function can($capability = 'install_plugins') {
if (defined('WP_CLI') && WP_CLI) {
return true;
}
if (is_multisite()) {
// Only network admin can change files that affects the entire network.
$can = current_user_can_for_blog(get_current_blog_id(), $capability);
} else {
$can = current_user_can($capability);
}
if ($can) {
// Also you can use this method to get the capability.
$can = $capability;
}
return $can;
}
protected function require_wp_headers() {
require_once ABSPATH . 'wp-admin/includes/file.php';
if (! class_exists('Plugin_Upgrader', false)) {
require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
}
if (! class_exists('Blocksy_WP_Upgrader_Skin', false)) {
require_once dirname(__FILE__) . '/ct-wp-upgrader-skin.php';
}
}
public function prepare_install($plugin) {
if (! $this->can()) {
return false;
}
$avaible_plugins = $this->get_plugins();
if (! array_key_exists($plugin, $avaible_plugins)) {
return $this->download_and_install($plugin);
}
$plugin_info = $avaible_plugins[ $plugin ];
if ( 'premium' === $plugin_info['type'] ) {
return $this->download_and_install_premium_plugin( $plugin );
}
if ( 'web' === $plugin_info['type'] ) {
return $this->download_and_install( $plugin );
}
}
public function has_direct_access( $context = null ) {
require_once ABSPATH . 'wp-admin/includes/file.php';
WP_Filesystem();
/** @var WP_Filesystem_Base $wp_filesystem */
global $wp_filesystem;
if ( $wp_filesystem ) {
if ( is_wp_error( $wp_filesystem->errors ) && $wp_filesystem->errors->get_error_code() ) {
return false;
} else {
return $wp_filesystem->method === 'direct';
}
}
if ( get_filesystem_method( [], $context ) === 'direct' ) {
ob_start();
{
$creds = request_filesystem_credentials( admin_url(), '', false, $context, null );
}
ob_end_clean();
if ( WP_Filesystem( $creds ) ) {
return true;
}
}
return false;
}
public function is_plugin_active( $plugin ) {
if ( ! function_exists( 'activate_plugin' ) ) {
require_once ABSPATH . 'wp-admin/includes/plugin.php';
}
return is_plugin_active( $plugin );
}
public function plugin_activation( $plugin ) {
$full_name = $this->is_plugin_installed( $plugin );
if ( $full_name ) {
if ( ! $this->is_plugin_active( $full_name ) ) {
return activate_plugin( $full_name, '', false, true );
}
}
return new WP_Error();
}
public function plugin_deactivation( $plugin ) {
$full_name = $this->is_plugin_installed( $plugin );
if ( $full_name ) {
if ( is_plugin_active( $full_name ) ) {
return deactivate_plugins( $full_name );
}
}
return new WP_Error();
}
public function uninstall_plugin( $plugin ) {
$this->init_filesystem();
$full_name = $this->is_plugin_installed( $plugin );
if ( $full_name ) {
if ( ! is_plugin_active( $full_name ) ) {
return delete_plugins( [ $full_name ] );
}
}
return new WP_Error();
}
public function get_premium_plugin_download_url( $slug ) {
$opts = fw_akg( $slug . '/download', $this->get_plugins() );
$manager = new CT_Validation_Transients_And_Options_Manager();
$manager->reset_transient();
$purchase_code = $manager->get_purchase_code();
if ( ! $manager->is_activated() ) {
return null;
}
return 'http://updates.creativethemes.com/releases/?' . http_build_query(
[
'purchase_code' => $purchase_code['purchase_code'],
'domain' => $manager->get_home_domain(),
'action' => 'download_release',
'repo' => fw_akg( 'repo', $opts ),
'user' => fw_akg( 'user', $opts ),
]
);
}
public function get_plugin_status($slug) {
$full_name = $this->is_plugin_installed( $slug );
if (!$full_name) {
return 'uninstalled';
}
if (!$this->is_plugin_active($full_name)) {
return 'installed';
}
return 'active';
}
public function download_and_install_premium_plugin( $slug ) {
$this->require_wp_headers();
if ( $this->is_plugin_installed( $slug ) ) {
return true;
}
// Prep variables for Plugin_Installer_Skin class.
$source = $this->get_premium_plugin_download_url( $slug );
if ( ! $source ) {
return false;
}
$skin = new Blocksy_WP_Upgrader_Skin();
// Create a new instance of Plugin_Upgrader.
$upgrader = new Plugin_Upgrader( $skin );
$res = $upgrader->fs_connect( [ WP_CONTENT_DIR, WP_PLUGIN_DIR ] );
if ( ! $res ) {
return false;
}
$upgrader->install( $source );
}
public function download_and_install( $slug ) {
$this->require_wp_headers();
if ($this->is_plugin_installed($slug)) {
return true;
}
$api = $this->get_plugins_api($slug);
if (! isset($api->download_link)) {
return true;
}
// Prep variables for Plugin_Installer_Skin class.
$source = $api->download_link;
if (! $source) {
return false;
}
$skin = new Blocksy_WP_Upgrader_Skin();
// Create a new instance of Plugin_Upgrader.
$upgrader = new Plugin_Upgrader($skin);
$res = $upgrader->fs_connect([WP_CONTENT_DIR, WP_PLUGIN_DIR]);
if (! $res) {
return false;
}
$upgrader->install($source);
}
public function init_filesystem() {
require_once ABSPATH . 'wp-admin/includes/file.php';
WP_Filesystem();
}
}