HEX
Server: Apache/2.4.52 (Ubuntu)
System: Linux spn-python 5.15.0-89-generic #99-Ubuntu SMP Mon Oct 30 20:42:41 UTC 2023 x86_64
User: arjun (1000)
PHP: 8.1.2-1ubuntu2.20
Disabled: NONE
Upload Files
File: /var/www/html/triad-infosec/wp-content/plugins/autoupdater/lib/Task/Extensions.php
<?php
defined('AUTOUPDATER_LIB') or die;

class AutoUpdater_Task_Extensions extends AutoUpdater_Task_Base
{
    protected $admin_privileges = true;
    protected $high_priority = false;
    protected $current_theme = '';
    protected $updates = array();

    /**
     * @return array
     */
    public function doTask()
    {
        AutoUpdater_Loader::loadClass('Helper_Version');

        AutoUpdater_Config::set('update_themes', (int) $this->input('update_themes', 0));

        $extensions = $this->getExtensions();

        return array(
            'success' => true,
            'extensions' => array(
                'changed' => $extensions,
                'checksum' => sha1(json_encode($extensions)),
            ),
            /** @see AutoUpdater_Task_Environment::doTask() */
            'environment' => AutoUpdater_Task::getInstance('Environment')->doTask(),
        );
    }

    /**
     * @return array
     */
    protected function getExtensions()
    {
        require_once ABSPATH . '/wp-admin/includes/plugin.php';
        require_once ABSPATH . '/wp-admin/includes/theme.php';

        $extensions = array();
        $this->updates = $this->getUpdatesFromRemoteServers();

        $core = new stdClass();
        $core->name = 'WordPress';
        $core->type = 'core';
        $core->slug = 'wordpress';
        $core->version = AUTOUPDATER_WP_VERSION;
        $core->enabled = 1;
        $core->update = $this->checkForUpdates($core->slug, $core->type);

        $translations = new stdClass();
        $translations->name = 'Translations';
        $translations->type = 'translation';
        $translations->slug = 'core';
        $translations->version = AUTOUPDATER_WP_VERSION;
        $translations->enabled = 1;
        $translations->update = $this->checkForUpdates($translations->slug, $translations->type);

        $extensions[] = $core;
        $extensions[] = $translations;

        $list = get_plugins();

        if (version_compare(AUTOUPDATER_WP_VERSION, '3.4.0', '>=')) {
            $list = array_merge($list, wp_get_themes());
            $this->current_theme = AutoUpdater_Helper_Version::filterHTML(wp_get_theme()->get('Name'));
        } else {
            $list = array_merge($list, get_themes()); // phpcs:ignore WordPress.WP.DeprecatedFunctions.get_themesFound
            $this->current_theme = AutoUpdater_Helper_Version::filterHTML(get_current_theme()); // phpcs:ignore WordPress.WP.DeprecatedFunctions.get_get_current_themeFound
        }

        foreach ($list as $slug => $item) {
            if ($item instanceof WP_Theme || isset($item['Template'])) {
                $extensions[] = $this->getThemeInfo($slug, $item);
            } elseif (isset($item['PluginURI'])) {
                $plugin = $this->getPluginInfo($slug, $item);
                $extensions[] = $plugin;
            }
        }

        return $extensions;
    }

    /**
     * @param string $slug
     * @param array  $plugin
     *
     * @return array
     */
    protected function getPluginInfo($slug, $plugin)
    {
        $item = new stdClass();
        $item->name = AutoUpdater_Helper_Version::filterHTML($plugin['Name']);
        $item->type = 'plugin';
        $item->slug = $slug;
        $item->version = strtolower(AutoUpdater_Helper_Version::filterHTML((string) $plugin['Version']));
        $item->enabled = (int) is_plugin_active($slug);
        $item->update = $this->checkForUpdates($item->slug, $item->type);

        if ($slug == AUTOUPDATER_WP_PLUGIN_SLUG) {
            $item->name = AutoUpdater_Helper_Version::filterHTML(AutoUpdater_Config::get('whitelabel_name', $item->name));
        }

        return $item;
    }

    /**
     * @param string         $slug
     * @param array|WP_Theme $theme
     *
     * @return array
     */
    protected function getThemeInfo($slug, $theme)
    {
        /**
         * @var WP_Theme $theme
         * @since 3.4.0
         */
        $legacy = !($theme instanceof WP_Theme);

        // build array with themes data to Dashboard
        $item = new stdClass();
        $item->name = AutoUpdater_Helper_Version::filterHTML($legacy ? $theme['Name'] : $theme->get('Name'));
        $item->type = 'theme';
        $item->slug = $legacy ? $theme['Stylesheet'] : basename($slug);
        $item->version = strtolower(AutoUpdater_Helper_Version::filterHTML((string) ($legacy ? $theme['Version'] : $theme->get('Version'))));
        $item->enabled = (int) ($this->current_theme == $item->name);
        $item->update = $this->checkForUpdates($item->slug, $item->type);

        $template = $legacy ? $theme['Template'] : $theme->get_template();
        if ($template !== $item->slug) {
            $item->parent_slug = (string) $template;
        }

        return $item;
    }

    /**
     * @return array
     */
    protected function getUpdatesFromRemoteServers()
    {
        if (AutoUpdater_Config::get('debug')) {
            // See which plugins and themes have hooked their updates
            AutoUpdater_Log::traceRegisteredHooks();
        }

        // get updates
        $core = get_site_transient('update_core');
        $plugins = get_site_transient('update_plugins');
        $themes = get_site_transient('update_themes');

        $updates = array(
            'wordpress_core' => $this->getCoreUpdate($core)
        );

        if (!empty($plugins->response)) {
            foreach ($plugins->response as $slug => $plugin) {
                if (!is_object($plugin)) {
                    if (!is_array($plugin)) {
                        continue;
                    }
                    $plugin = (object) $plugin;
                }
                if (!empty($plugin->new_version)) {
                    $updates[$slug . '_plugin'] = $this->getUpdate($plugin);
                }
            }
        }

        if (!empty($themes->response)) {
            foreach ($themes->response as $slug => $theme) {
                if (!is_object($theme)) {
                    if (!is_array($theme)) {
                        continue;
                    }
                    $theme = (object) $theme;
                }
                if (!empty($theme->new_version)) {
                    $updates[$slug . '_theme'] = $this->getUpdate($theme);
                }
            }
        }

        $translations = false;
        if (!empty($plugins->translations) || !empty($themes->translations)) {
            $translations = true;
        } else {
            if (!empty($core->translations)) {
                $translations = true;
            }
        }

        if ($translations) {
            $updates['core_translation'] = array(
                'version' => AUTOUPDATER_WP_VERSION . (substr_count(AUTOUPDATER_WP_VERSION, '.') === 1 ? '.0.1' : '.1'),
                'download_url' => null,
                'core_version_max' => AUTOUPDATER_WP_VERSION,
            );
        }

        return $updates;
    }

    /**
     * @param object $update
     *
     * @return array
     */
    protected function getUpdate($update)
    {
        return array(
            'version' => (string) $update->new_version,
            'download_url' => $this->getUpdateDownloadUrl($update),
            'core_version_min' => !empty($update->requires) ? (string) $update->requires : null,
            'core_version_max' => !empty($update->tested) ? (string) $update->tested : null,
            'php_version_min' => !empty($update->requires_php) ? (string) $update->requires_php : null
        );
    }

    /**
     * @param object|null $core_transient
     *
     * @return object|null
     */
    protected function getCoreUpdate($core_transient)
    {
        if (!isset($core_transient->updates) || !is_array($core_transient->updates)) {
            return null;
        }

        $wp_version = AUTOUPDATER_WP_VERSION;
        @list($wp_version_major, $wp_version_minor, $wp_version_dev) = explode($wp_version, '.'); // phpcs:ignore
        $wp_version_next = intval($wp_version_major) . '.' . intval($wp_version_minor) . '.' . ($wp_version_dev ? intval($wp_version_dev) + 1 : 1);

        $wp_upgrade = null;
        $wp_update = null;
        $development = false;

        foreach ($core_transient->updates as $update) {
            if (!is_object($update)) {
                if (!is_array($update)) {
                    continue;
                }
                $update = (object) $update;
            }

            if (in_array($update->response, array('upgrade', 'latest', 'development'))) {
                if (in_array($update->response, array('latest', 'development'))) {
                    $development = true;
                }
                $wp_upgrade = array(
                    'version' => (string) $update->current,
                    'download_url' => $this->getUpdateDownloadUrl($update),
                    'php_version_min' => !empty($update->php_version) ? (string) $update->php_version : null
                );
            }
            elseif ('autoupdate' === $update->response && $wp_version_next === $update->current) {
                $wp_update = array(
                    'version' => (string) $update->current,
                    'download_url' => $this->getUpdateDownloadUrl($update),
                    'php_version_min' => !empty($update->php_version) ? (string) $update->php_version : null
                );
            }
        }

        if ($development || !$wp_update) {
            if ($wp_upgrade['version'] && version_compare($wp_upgrade['version'], AUTOUPDATER_WP_VERSION, '>')) {
                return $wp_upgrade;
            }

            return null;
        }

        if ($wp_update['version'] && version_compare($wp_update['version'], AUTOUPDATER_WP_VERSION, '>')) {
            return $wp_update;
        }

        return null;
    }

    /**
     * @param object $update
     *
     * @return string
     */
    protected function getUpdateDownloadUrl($update)
    {
        if (empty($update->download) && empty($update->package)) {
            return '';
        }

        // Filter and validate download URL
        $download_url = !empty($update->package) ? $update->package : $update->download;
        $download_url = trim(html_entity_decode($download_url, ENT_QUOTES, 'UTF-8'));
        if (filter_var($download_url, FILTER_VALIDATE_URL) === false) {
            return '';
        }

        return $download_url;
    }

    /**
     * @param string $slug
     * @param string $type
     *
     * @return object|null
     */
    protected function checkForUpdates($slug, $type)
    {
        return isset($this->updates[$slug . '_' . $type]) ? $this->updates[$slug . '_' . $type] : null;
    }
}