Files
doitinpoland.com/wp-content/plugins/sitepress-multilingual-cms/vendor/otgs/installer/includes/class-installer-dependencies.php
2023-09-12 21:41:04 +02:00

313 lines
9.2 KiB
PHP

<?php
class Installer_Dependencies {
private $uploading_allowed = null;
private $is_win_paths_exception = array();
private $missing_php_libraries = array();
function __construct() {
add_action( 'admin_init', array( $this, 'prevent_plugins_update_on_plugins_page' ), 100 );
global $pagenow;
if ( $pagenow == 'update.php' ) {
if ( isset( $_GET['action'] ) && $_GET['action'] == 'update-selected' ) {
add_action( 'admin_head', array(
$this,
'prevent_plugins_update_on_updates_screen'
) ); //iframe/bulk
} else {
add_action( 'all_admin_notices', array(
$this,
'prevent_plugins_update_on_updates_screen'
) ); //regular/singular
}
}
add_action( 'wp_ajax_update-plugin', array(
$this,
'prevent_plugins_update_on_updates_screen'
), 0 ); // high priority, before WP
}
public function is_win_paths_exception( $repository_id ) {
if ( ! isset( $this->is_win_paths_exception[ $repository_id ] ) ) {
$this->is_win_paths_exception[ $repository_id ] = false;
if ( strtoupper( substr( constant('PHP_OS'), 0, 3 ) ) === 'WIN' ) {
$windows_max_path_length = 256;
$longest_path['wpml'] = 109;
$longest_path['toolset'] = 99;
$margin = 15;
$upgrade_path_length = strlen( WP_CONTENT_DIR . '/upgrade' );
$installer_settings = WP_Installer()->settings;
if ( isset( $installer_settings['repositories'][ $repository_id ]['data']['downloads']['plugins'] ) ) {
$a_plugin = current( $installer_settings['repositories'][ $repository_id ]['data']['downloads']['plugins'] );
$url = WP_Installer()->append_site_key_to_download_url( $a_plugin['url'], 'xxxxxx', $repository_id );
$tmpfname = wp_tempnam( $url );
$tmpname_length = strlen( basename( $tmpfname ) ) - 4; // -.tmp
wp_delete_file( $tmpfname );
if ( $upgrade_path_length + $tmpname_length + $longest_path[ $repository_id ] + $margin > $windows_max_path_length ) {
$this->is_win_paths_exception[ $repository_id ] = true;
}
}
}
}
return $this->is_win_paths_exception[ $repository_id ];
}
public function is_uploading_allowed() {
if ( ! isset( $this->uploading_allowed ) ) {
require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
require_once WP_Installer()->plugin_path() . '/includes/class-installer-upgrader-skins.php';
$upgrader_skins = new Installer_Upgrader_Skins(); //use our custom (mute) Skin
$upgrader = new Plugin_Upgrader( $upgrader_skins );
ob_start();
$res = $upgrader->fs_connect( array( WP_CONTENT_DIR, WP_PLUGIN_DIR ) );
ob_end_clean();
if ( ! $res || is_wp_error( $res ) ) {
$this->uploading_allowed = false;
} else {
$this->uploading_allowed = true;
}
}
return $this->uploading_allowed;
}
public function cant_download( $repository_id ) {
return ! $this->is_uploading_allowed() || $this->is_win_paths_exception( $repository_id );
}
public function win_paths_exception_message() {
return __( 'Downloading is not possible. WordPress cannot create required folders because of the
256 characters limitation of the current Windows environment.', 'installer' );
}
public function prevent_plugins_update_on_plugins_page() {
$plugins = get_site_transient( 'update_plugins' );
if ( isset( $plugins->response ) && is_array( $plugins->response ) ) {
$plugins_with_updates = array_keys( $plugins->response );
}
if ( ! empty( $plugins_with_updates ) ) {
$plugins = get_plugins();
$installer_settings = WP_Installer()->settings;
if ( isset( $installer_settings['repositories'] ) ) {
foreach ( $installer_settings['repositories'] as $repository_id => $repository ) {
if ( $this->is_win_paths_exception( $repository_id ) ) {
$repositories_plugins = array();
foreach ( $repository['data']['packages'] as $package ) {
foreach ( $package['products'] as $product ) {
foreach ( $product['plugins'] as $plugin_slug ) {
$download = $installer_settings['repositories'][ $repository_id ]['data']['downloads']['plugins'][ $plugin_slug ];
if ( empty( $download['free-on-wporg'] ) ) {
$repositories_plugins[ $download['slug'] ] = $download['name'];
}
}
}
}
foreach ( $plugins as $plugin_id => $plugin ) {
if ( in_array( $plugin_id, $plugins_with_updates ) ) {
$wp_plugin_slug = dirname( $plugin_id );
if ( empty( $wp_plugin_slug ) ) {
$wp_plugin_slug = basename( $plugin_id, '.php' );
}
foreach ( $repositories_plugins as $slug => $name ) {
if ( $wp_plugin_slug == $slug || $name == $plugin['Name'] || $name == $plugin['Title'] ) { //match order: slug, name, title
remove_action( "after_plugin_row_$plugin_id", 'wp_plugin_update_row', 10, 2 );
add_action( "after_plugin_row_$plugin_id", array(
$this,
'wp_plugin_update_row_win_exception',
), 10, 2 );
}
}
}
}
}
}
}
}
}
public function wp_plugin_update_row_win_exception() {
$wp_list_table = _get_list_table( 'WP_Plugins_List_Table' );
echo '<tr class="plugin-update-tr">';
echo '<td class="plugin-update colspanchange" colspan="' . esc_attr( $wp_list_table->get_column_count() ) .
'"><div class="update-message">' . $this->win_paths_exception_message() . '</div></td>';
echo '</tr>';
}
public function prevent_plugins_update_on_updates_screen() {
if ( isset( $_REQUEST['action'] ) ) {
$action = isset( $_REQUEST['action'] ) ? sanitize_text_field( $_REQUEST['action'] ) : '';
$installer_settings = WP_Installer()->settings;
//bulk mode
if ( 'update-selected' == $action ) {
global $plugins;
if ( isset( $plugins ) && is_array( $plugins ) ) {
foreach ( $plugins as $k => $plugin ) {
$wp_plugin_slug = dirname( $plugin );
foreach ( $installer_settings['repositories'] as $repository_id => $repository ) {
if ( $this->is_win_paths_exception( $repository_id ) ) {
foreach ( $repository['data']['packages'] as $package ) {
foreach ( $package['products'] as $product ) {
foreach ( $product['plugins'] as $plugin_slug ) {
$download = $installer_settings['repositories'][ $repository_id ]['data']['downloads']['plugins'][ $plugin_slug ];
if ( $download['slug'] == $wp_plugin_slug && empty( $download['free-on-wporg'] ) ) {
echo '<div class="updated error"><p>' . $this->win_paths_exception_message() .
' <strong>(' . $download['name'] . ')</strong>' . '</p></div>';
unset( $plugins[ $k ] );
break( 3 );
}
}
}
}
}
}
}
}
}
if ( 'upgrade-plugin' == $action || 'update-plugin' == $action ) {
$plugin = isset( $_REQUEST['plugin'] ) ? trim( sanitize_text_field( $_REQUEST['plugin'] ) ) : '';
$wp_plugin_slug = dirname( $plugin );
foreach ( $installer_settings['repositories'] as $repository_id => $repository ) {
if ( $this->is_win_paths_exception( $repository_id ) ) {
foreach ( $repository['data']['packages'] as $package ) {
foreach ( $package['products'] as $product ) {
foreach ( $product['plugins'] as $plugin_slug ) {
$download = $installer_settings['repositories'][ $repository_id ]['data']['downloads']['plugins'][ $plugin_slug ];
//match by folder, will change to match by name and folder
if ( $download['slug'] == $wp_plugin_slug && empty ( $download['free-on-wporg'] ) ) {
echo '<div class="updated error"><p>' . $this->win_paths_exception_message() . '</p></div>';
echo '<div class="wrap">';
echo '<h2>' . __( 'Update Plugin' ) . '</h2>';
echo '<a href="' . admin_url( 'update-core.php' ) . '">' . __( 'Return to the updates page', 'installer' ) . '</a>';
echo '</div>';
require_once( ABSPATH . 'wp-admin/admin-footer.php' );
exit;
}
}
}
}
}
}
}
}
}
public function php_libraries_missing() {
$requirements = new OTGS_Installer_Requirements();
foreach ( $requirements->get() as $requirement ) {
if ( ! $requirement['active'] ) {
$this->missing_php_libraries[] = $requirement['name'];
}
}
if ( $this->missing_php_libraries ) {
add_action( 'admin_notices', array( $this, 'missing_php_functions_notice' ) );
}
}
public function missing_php_functions_notice() {
$installer_doc_url = 'https://wpml.org/?p=72674#automated-updates';
$installer_doc_link = '<a href="' . $installer_doc_url . '">' . __( 'OTGS Installer', 'installer' ) . '</a>';
echo '<div class="updated error">';
echo '<p>';
echo sprintf(
__( '%s, responsible for receiving automated updates for WPML and Toolset, requires the following PHP component(s) in order to function:', 'installer' ),
$installer_doc_link
);
echo '<code>' . join( ', ', $this->missing_php_libraries ) . '</code>';
echo '</p>';
$minimum_requirements_link = '<a href="https://wpml.org/?page_id=716">' . __( 'Minimum WPML requirements' ) . '</a>';
echo '<p>' . sprintf( __( 'Learn more: %s', 'installer' ), $minimum_requirements_link ) . '</p>';
echo '</div>';
}
}