HEX
Server: Apache
System: Linux WWW 6.1.0-40-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.153-1 (2025-09-20) x86_64
User: web11 (1011)
PHP: 8.2.29
Disabled: NONE
Upload Files
File: //var/www/biblioteka/wp-content/plugins/core-rollback/src/Core.php
<?php
/**
 * Core Rollback
 *
 * @author  Andy Fragen
 * @license MIT
 * @link    https://github.com/afragen/core-rollback
 * @package core-rollback
 */

namespace Fragen\Rollback;

/*
 * Exit if called directly.
 */
if ( ! defined( 'WPINC' ) ) {
	die;
}

/**
 * Class Core
 */
class Core {
	/**
	 * Core versions for re-installation.
	 *
	 * @var array
	 */
	public static $core_versions;

	/**
	 * Constructor.
	 */
	public function __construct() {
		static::$core_versions = $this->get_core_versions();
	}

	/**
	 * Get all core versions from Core API.
	 *
	 * @return array Array of versions and downloads.
	 */
	public function get_core_versions() {
		$versions = get_site_transient( 'core_rollback' );
		if ( ! $versions ) {
			$versions = [];
			$locale   = get_locale();
			$response = wp_remote_get( "https://api.wordpress.org/core/version-check/1.7/?locale={$locale}" );
			if ( is_wp_error( $response ) ) {
				return [];
			}
			$body   = wp_remote_retrieve_body( $response );
			$body   = json_decode( $body );
			$offers = $body->offers;
			foreach ( $offers as $offer ) {
				if ( version_compare( $offer->version, '4.0', '>=' ) ) {
					$offer->response             = 'latest';
					$versions[ $offer->version ] = $offer;
				}
			}
			set_site_transient( 'core_rollback', $versions, DAY_IN_SECONDS );
		}

		return $versions;
	}

	/**
	 * Load hooks.
	 */
	public function load_hooks() {
		add_filter( 'http_request_args', [ $this, 'filter_http_request_args' ], 10, 2 );
		add_filter( 'pre_http_request', [ $this, 'filter_http_request' ], 10, 3 );
	}

	/**
	 * Add core rollback version to http_request_args.
	 *
	 * @param array  $args Array of HTTP request args.
	 * @param string $url  URL for HTTP request.
	 *
	 * @return array
	 */
	public function filter_http_request_args( $args, $url ) {
		if ( false === strpos( $url, '//api.wordpress.org/core/version-check/' ) ) {
			return $args;
		}
		$rollback = get_site_transient( '_core_rollback' );

		if ( $rollback ) {
			$args['_rollback_version'] = $rollback['core_dropdown'];
		}

		return $args;
	}

	/**
	 * Filter 'pre_http_request' to add rollback API check.
	 *
	 * @param mixed  $result $result from filter.
	 * @param array  $args   Array of filter args.
	 * @param string $url    URL from filter.
	 *
	 * @return \stdClass $response Output from wp_remote_get().
	 */
	public function filter_http_request( $result, $args, $url ) {
		if ( $result || isset( $args['_core_rollback'] ) ) {
			return $result;
		}
		if ( false === strpos( $url, '//api.wordpress.org/core/version-check/' ) ) {
			return $result;
		}

		// It's a core-update request.
		$args['_core_rollback'] = true;

		$response = wp_remote_get( $url, $args );
		if ( is_wp_error( $response ) ) {
			return $result;
		}
		if ( isset( $args['_rollback_version'] ) ) {
			$rollback_version = sanitize_text_field( $args['_rollback_version'] );
			$response         = $this->set_rollback( $response, $rollback_version );
		}

		return $response;
	}

	/**
	 * Update Core API update response to add rollback.
	 *
	 * @param \stdClass $response         Core API response.
	 * @param string    $rollback_version Rollback version.
	 *
	 * @return \stdClass
	 */
	public function set_rollback( $response, $rollback_version ) {
		if ( ! array_key_exists( $rollback_version, static::$core_versions ) ) {
			return $response;
		}
		$body   = wp_remote_retrieve_body( $response );
		$offers = \json_decode( $body );
		$latest = false;
		$num    = count( array_keys( $offers->offers ) );
		foreach ( array_keys( $offers->offers ) as $key ) {
			if ( 0 === $key ) {
				continue;
			}

			if ( 'latest' === $offers->offers[ $key ]->response ) {
				$offers->offers[ $key ] = static::$core_versions[ $rollback_version ];
				$latest                 = true;
			}
		}

		if ( ! $latest && ( ( $key + 1 ) === $num ) ) {
			$offers->offers[ $num ] = static::$core_versions[ $rollback_version ];
		}

		$body             = \json_encode( $offers );
		$response['body'] = $body;

		return $response;
	}
}