182 lines
5.4 KiB
PHP
182 lines
5.4 KiB
PHP
<?php
|
|
/**
|
|
* Responsible for showing the upgrade message in the plugins page.
|
|
*
|
|
* @package wsal
|
|
* @subpackage helpers
|
|
* @since 4.6.0
|
|
* @copyright 2026 Melapress
|
|
* @license http://www.gnu.org/licenses/gpl-3.0.html GNU General Public License, version 3 or higher
|
|
* @link https://wordpress.org/plugins/wp-security-audit-log/
|
|
*/
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace WSAL\Helpers;
|
|
|
|
// Exit if accessed directly.
|
|
if ( ! defined( 'ABSPATH' ) ) {
|
|
exit;
|
|
}
|
|
|
|
/**
|
|
* Upgrade notice class
|
|
*/
|
|
if ( ! class_exists( '\WSAL\Helpers\Upgrade_Notice' ) ) {
|
|
/**
|
|
* Utility class for showing the upgrade notice in the plugins page.
|
|
*
|
|
* @package wsal
|
|
* @since 4.6.0
|
|
*/
|
|
class Upgrade_Notice {
|
|
/**
|
|
* Inits the upgrade notice hooks.
|
|
*
|
|
* @return void
|
|
*
|
|
* @since 4.6.0
|
|
*/
|
|
public static function init() {
|
|
global $current_screen;
|
|
|
|
if ( ! isset( $current_screen ) ) {
|
|
return;
|
|
}
|
|
|
|
if ( 'plugins' === $current_screen->id ) {
|
|
\add_action( 'in_plugin_update_message-' . \WpSecurityAuditLog::PREMIUM_VERSION_WHOLE_PLUGIN_NAME, array( __CLASS__, 'prefix_plugin_update_message' ), 10, 2 );
|
|
\add_action( 'in_plugin_update_message-' . \WpSecurityAuditLog::FREE_VERSION_WHOLE_PLUGIN_NAME, array( __CLASS__, 'prefix_plugin_update_message' ), 10, 2 );
|
|
\add_action( 'in_plugin_update_message-' . \WpSecurityAuditLog::NOFS_VERSION_WHOLE_PLUGIN_NAME, array( __CLASS__, 'prefix_plugin_update_message' ), 10, 2 );
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Shows the message for the upgrading security audit log version
|
|
*
|
|
* @param array $data - Array with the data.
|
|
* @param object $response - The response.
|
|
*
|
|
* @return void
|
|
*
|
|
* @since 4.6.0
|
|
*/
|
|
public static function prefix_plugin_update_message( $data, $response ) {
|
|
|
|
$current_version_parts = explode( '.', WSAL_VERSION );
|
|
$new_version_parts = explode( '.', $response->new_version );
|
|
|
|
// If user has already moved to the minor version, we don't need to flag up anything.
|
|
if ( version_compare( $current_version_parts[0] . '.' . $current_version_parts[1] . '.' . $current_version_parts[2], $new_version_parts[0] . '.' . $new_version_parts[1] . '.' . $new_version_parts[2], '>' ) ) {
|
|
return;
|
|
}
|
|
|
|
$upgrade_notice = self::get_upgrade_notice( $response->new_version );
|
|
|
|
if ( isset( $upgrade_notice ) && ! empty( $upgrade_notice ) ) {
|
|
printf(
|
|
'</p><div class="update-message">%s</div><p class="dummy">',
|
|
$upgrade_notice // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
|
|
);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Get the upgrade notice from WordPress.org.
|
|
*
|
|
* @param string $version - WSAL new version.
|
|
* @return string
|
|
*
|
|
* @since 4.6.0
|
|
*/
|
|
private static function get_upgrade_notice( $version ) {
|
|
$transient_name = 'wsal_upgrade_notice_' . $version;
|
|
$upgrade_notice = get_transient( $transient_name );
|
|
|
|
if ( false === $upgrade_notice ) {
|
|
$response = wp_safe_remote_get( 'https://plugins.svn.wordpress.org/wp-security-audit-log/trunk/readme.txt' );
|
|
|
|
if ( ! is_wp_error( $response ) && ! empty( $response['body'] ) ) {
|
|
$upgrade_notice = self::parse_update_notice( $response['body'], $version );
|
|
set_transient( $transient_name, $upgrade_notice, DAY_IN_SECONDS );
|
|
}
|
|
}
|
|
|
|
return $upgrade_notice;
|
|
}
|
|
|
|
/**
|
|
* Parse update notice from readme file.
|
|
*
|
|
* @param string $content - WSAL readme file content.
|
|
* @param string $new_version - WSAL new version.
|
|
* @return string
|
|
*
|
|
* @since 4.6.0
|
|
*/
|
|
private static function parse_update_notice( $content, $new_version ) {
|
|
$version_parts = explode( '.', $new_version );
|
|
$check_for_notices = array(
|
|
// $version_parts[0] . '.0', // Major.
|
|
// $version_parts[0] . '.0.0', // Major.
|
|
// $version_parts[0] . '.' . $version_parts[1], // Minor.
|
|
$version_parts[0] . '.' . $version_parts[1] . '.' . $version_parts[2], // Patch.
|
|
);
|
|
$notice_regexp = '~==\s*Upgrade Notice\s*==\s*=\s*(.*)\s*=(.*)(=\s*' . preg_quote( $new_version ) . '\s*=|$)~Uis';
|
|
$upgrade_notice = '';
|
|
|
|
$style = '';
|
|
|
|
foreach ( $check_for_notices as $check_version ) {
|
|
if ( version_compare( WSAL_VERSION, $check_version, '>' ) ) {
|
|
continue;
|
|
}
|
|
|
|
$matches = null;
|
|
if ( preg_match( $notice_regexp, $content, $matches ) ) {
|
|
$notices = (array) preg_split( '~[\r\n]+~', trim( $matches[2] ) );
|
|
|
|
if ( version_compare( trim( $matches[1] ), $check_version, '=' ) ) {
|
|
$style = '<style>
|
|
.wsal_plugin_upgrade_notice {
|
|
font-weight: normal;
|
|
background: #fff8e5 !important;
|
|
border-left: none !important;
|
|
border-top: 1px solid #ffb900;
|
|
padding: 9px 0 20px 32px !important;
|
|
margin: 0 -12px 0 -20px !important;
|
|
}
|
|
p.wsal_plugin_upgrade_notice::before {
|
|
content: "\f348" !important;
|
|
display: inline-block;
|
|
font: 400 18px/1 dashicons;
|
|
speak: never;
|
|
margin: 0 8px 0 -2px;
|
|
vertical-align: top;
|
|
}
|
|
.dummy {
|
|
display: none;
|
|
}
|
|
.update-message {
|
|
margin: 9px !important;
|
|
}
|
|
</style>';
|
|
$upgrade_notice .= '<p class="wsal_plugin_upgrade_notice">';
|
|
|
|
foreach ( $notices as $line ) {
|
|
$upgrade_notice .= preg_replace( '~\[([^\]]*)\]\(([^\)]*)\)~', '<a href="${2}">${1}</a>', $line ) . '<br>';
|
|
}
|
|
|
|
$upgrade_notice .= '</p>';
|
|
|
|
break;
|
|
}
|
|
continue;
|
|
}
|
|
}
|
|
|
|
return $style . ( $upgrade_notice );
|
|
}
|
|
}
|
|
}
|