diff --git a/core/modules/update/src/ProjectSecurityRequirement.php b/core/modules/update/src/ProjectSecurityRequirement.php index cd994e04c9..cac06ba8b6 100644 --- a/core/modules/update/src/ProjectSecurityRequirement.php +++ b/core/modules/update/src/ProjectSecurityRequirement.php @@ -138,11 +138,16 @@ private function getVersionEndRequirement() { if ($security_coverage_message = $this->getVersionEndCoverageMessage()) { $requirement['description'] = $security_coverage_message; if ($this->securityCoverageInfo['additional_minors_coverage'] > 0) { - $requirement['value'] = $this->t('Supported minor version'); - $requirement['severity'] = $this->securityCoverageInfo['additional_minors_coverage'] > 1 ? REQUIREMENT_INFO : REQUIREMENT_WARNING; + $requirement['value'] = $this->t( + 'Covered until @end_version', + ['@end_version' => $this->securityCoverageInfo['security_coverage_end_version']] + ); + $requirement['severity'] = $this->securityCoverageInfo['additional_minors_coverage'] > 1 + ? REQUIREMENT_INFO + : REQUIREMENT_WARNING; } else { - $requirement['value'] = $this->t('Unsupported minor version'); + $requirement['value'] = $this->t('Coverage has ended'); $requirement['severity'] = REQUIREMENT_ERROR; } } @@ -158,22 +163,21 @@ private function getVersionEndRequirement() { * @see \Drupal\update\ProjectSecurityData::getCoverageInfo() */ private function getVersionEndCoverageMessage() { + $message = ''; if ($this->securityCoverageInfo['additional_minors_coverage'] > 0) { // If the installed minor version will receive security coverage until // newer minor versions are released, inform the user. - $translation_arguments = [ - '@project' => $this->projectTitle, - '@version' => $this->existingMajorMinorVersion, - '@coverage_version' => $this->securityCoverageInfo['security_coverage_end_version'], - ]; - $message = '

' . $this->t('The installed minor version of @project (@version), will stop receiving official security support after the release of @coverage_version.', $translation_arguments) . '

'; - if ($this->securityCoverageInfo['additional_minors_coverage'] === 1) { // If the installed minor version will only receive security coverage // for 1 newer minor core version, encourage the site owner to update // soon. - $message .= '

' . $this->t('Update to @next_minor or higher soon to continue receiving security updates.', ['@next_minor' => $this->nextMajorMinorVersion]) - . ' ' . static::getAvailableUpdatesMessage() . '

'; + $message = $this->t( + 'Update to @next_minor or higher soon to continue receiving security updates.', + [ + ':update_status_report' => Url::fromRoute('update.status')->toString(), + '@next_minor' => $this->nextMajorMinorVersion, + ] + ); } } else { @@ -181,9 +185,9 @@ private function getVersionEndCoverageMessage() { // advise the site owner to update. $message = $this->getVersionNoSecurityCoverageMessage(); } - $message .= $this->getReleaseCycleLink(); + $message = ltrim("$message ") . $this->getReleaseCycleLink(); - return Markup::create($message); + return Markup::create("

$message

"); } /** @@ -212,35 +216,36 @@ private function getDateEndRequirement() { // 'Y-m' format. $full_security_coverage_end_date = $this->securityCoverageInfo['security_coverage_end_date'] . '-15'; } - $security_coverage_end_timestamp = \DateTime::createFromFormat('Y-m-d', $full_security_coverage_end_date)->getTimestamp(); - $formatted_end_date = $date_format === 'Y-m-d' - ? $this->securityCoverageInfo['security_coverage_end_date'] - : $date_formatter->format($security_coverage_end_timestamp, 'custom', 'F Y'); - $comparable_request_date = $date_formatter->format($time->getRequestTime(), 'custom', $date_format); + + $description = ''; + $comparable_request_date = $date_formatter + ->format($time->getRequestTime(), 'custom', $date_format); if ($this->securityCoverageInfo['security_coverage_end_date'] <= $comparable_request_date) { // Security coverage is over. - $requirement['value'] = $this->t('Unsupported minor version'); + $requirement['value'] = $this->t('Coverage has ended'); $requirement['severity'] = REQUIREMENT_ERROR; - $requirement['description'] = $this->getVersionNoSecurityCoverageMessage(); + $description = $this->getVersionNoSecurityCoverageMessage(); } else { - $requirement['value'] = $this->t('Supported minor version'); + $security_coverage_end_timestamp + = \DateTime::createFromFormat('Y-m-d', $full_security_coverage_end_date) + ->getTimestamp(); + $output_date_format = $date_format === 'Y-m-d' ? 'Y-M-d' : 'Y-M'; + $formatted_end_date = $date_formatter + ->format($security_coverage_end_timestamp, 'custom', $output_date_format); + $translation_arguments = ['@date' => $formatted_end_date]; + $requirement['value'] = $this->t('Covered until @date', $translation_arguments); $requirement['severity'] = REQUIREMENT_INFO; - $translation_arguments = [ - '@project' => $this->projectTitle, - '@version' => $this->existingMajorMinorVersion, - '@date' => $formatted_end_date, - ]; - $requirement['description'] = '

' . $this->t('The installed minor version of @project (@version), will stop receiving official security support after @date.', $translation_arguments) . '

'; // 'security_coverage_ending_warn_date' will always be in the format // 'Y-m-d'. $request_date = $date_formatter->format($time->getRequestTime(), 'custom', 'Y-m-d'); if (!empty($this->securityCoverageInfo['security_coverage_ending_warn_date']) && $this->securityCoverageInfo['security_coverage_ending_warn_date'] <= $request_date) { - $requirement['description'] .= '

' . $this->t('Update to a supported minor version soon to continue receiving security updates.') . '

'; + $description = $this->t('Update to a supported minor version soon to continue receiving security updates.'); $requirement['severity'] = REQUIREMENT_WARNING; } } - $requirement['description'] = Markup::create($requirement['description'] . $this->getReleaseCycleLink()); + $description = ltrim("$description ") . $this->getReleaseCycleLink(); + $requirement['description'] = Markup::create("

$description

"); return $requirement; } @@ -251,26 +256,8 @@ private function getDateEndRequirement() { * The message for a version with no security coverage. */ private function getVersionNoSecurityCoverageMessage() { - return '

' . $this->t( - 'The installed minor version of @project (@version), is no longer supported and will not receive security updates.', - [ - '@project' => $this->projectTitle, - '@version' => $this->existingMajorMinorVersion, - ]) - . '

' - . $this->t('Update to a supported minor as soon as possible to continue receiving security updates.') - . ' ' . static::getAvailableUpdatesMessage() . '

'; - } - - /** - * Gets the message with a link to the available updates page. - * - * @return \Drupal\Core\StringTranslation\TranslatableMarkup - * The message. - */ - private function getAvailableUpdatesMessage() { return $this->t( - 'See the available updates page for more information.', + 'Update to a supported minor as soon as possible to continue receiving security updates.', [':update_status_report' => Url::fromRoute('update.status')->toString()] ); } @@ -282,10 +269,10 @@ private function getAvailableUpdatesMessage() { * A link to the release cycle page on drupal.org. */ private function getReleaseCycleLink() { - return '

' . $this->t( + return $this->t( 'Visit the release cycle overview for more information on supported releases.', [':url' => 'https://www.drupal.org/core/release-cycle-overview'] - ) . '

'; + ); } } diff --git a/core/modules/update/tests/src/Functional/UpdateCoreTest.php b/core/modules/update/tests/src/Functional/UpdateCoreTest.php index 763fe9124a..21c7a51b04 100644 --- a/core/modules/update/tests/src/Functional/UpdateCoreTest.php +++ b/core/modules/update/tests/src/Functional/UpdateCoreTest.php @@ -395,8 +395,9 @@ public function testSecurityCoverageMessage($installed_version, $fixture, $requi // Ensure that messages are under the correct heading which could be // 'Checked', 'Warnings found', or 'Errors found'. $requirements_section_element = $requirements_details->getParent(); + $this->assertCount(1, $requirements_section_element->findAll('css', 'h3')); $this->assertCount(1, $requirements_section_element->findAll('css', "h3:contains('$requirements_section_heading')")); - $actual_message = $requirements_details->find('css', 'div.description')->getText(); + $actual_message = $requirements_details->find('css', 'div.system-status-report__entry__value')->getText(); $this->assertNotEmpty($actual_message); $this->assertEquals($message, $actual_message); } @@ -421,7 +422,7 @@ public function testSecurityCoverageMessage($installed_version, $fixture, $requi */ public function securityCoverageMessageProvider() { $release_coverage_message = 'Visit the release cycle overview for more information on supported releases.'; - $see_available_message = 'See the available updates page for more information.'; + $coverage_ended_message = 'Coverage has ended'; $update_asap_message = 'Update to a supported minor as soon as possible to continue receiving security updates.'; $update_soon_message = 'Update to a supported minor version soon to continue receiving security updates.'; $test_cases = [ @@ -429,35 +430,35 @@ public function securityCoverageMessageProvider() { 'installed_version' => '8.0.0', 'fixture' => 'sec.2.0_3.0-rc1', 'requirements_section_heading' => 'Errors found', - 'message' => "The installed minor version of Drupal (8.0), is no longer supported and will not receive security updates.$update_asap_message $see_available_message$release_coverage_message", + 'message' => "$coverage_ended_message $update_asap_message $release_coverage_message", 'mock_date' => '', ], '8.1.0, supported with 3rc' => [ 'installed_version' => '8.1.0', 'fixture' => 'sec.2.0_3.0-rc1', 'requirements_section_heading' => 'Warnings found', - 'message' => "The installed minor version of Drupal (8.1), will stop receiving official security support after the release of 8.3.0.Update to 8.2 or higher soon to continue receiving security updates. $see_available_message$release_coverage_message", + 'message' => "Covered until 8.3.0 Update to 8.2 or higher soon to continue receiving security updates. $release_coverage_message", 'mock_date' => '', ], '8.1.0, supported' => [ 'installed_version' => '8.1.0', 'fixture' => 'sec.2.0', 'requirements_section_heading' => 'Warnings found', - 'message' => "The installed minor version of Drupal (8.1), will stop receiving official security support after the release of 8.3.0.Update to 8.2 or higher soon to continue receiving security updates. $see_available_message$release_coverage_message", + 'message' => "Covered until 8.3.0 Update to 8.2 or higher soon to continue receiving security updates. $release_coverage_message", 'mock_date' => '', ], '8.2.0, supported with 3rc' => [ 'installed_version' => '8.2.0', 'fixture' => 'sec.2.0_3.0-rc1', 'requirements_section_heading' => 'Checked', - 'message' => "The installed minor version of Drupal (8.2), will stop receiving official security support after the release of 8.4.0.$release_coverage_message", + 'message' => "Covered until 8.4.0 $release_coverage_message", 'mock_date' => '', ], '8.2.0, supported' => [ 'installed_version' => '8.2.0', 'fixture' => 'sec.2.0', 'requirements_section_heading' => 'Checked', - 'message' => "The installed minor version of Drupal (8.2), will stop receiving official security support after the release of 8.4.0.$release_coverage_message", + 'message' => "Covered until 8.4.0 $release_coverage_message", 'mock_date' => '', ], // Ensure we don't show messages for pre-release or dev versions. @@ -482,7 +483,7 @@ public function securityCoverageMessageProvider() { 'installed_version' => '8.0.0', 'fixture' => 'sec.2.0_9.0.0', 'requirements_section_heading' => 'Errors found', - 'message' => "The installed minor version of Drupal (8.0), is no longer supported and will not receive security updates.$update_asap_message $see_available_message$release_coverage_message", + 'message' => "$coverage_ended_message $update_asap_message $release_coverage_message", 'mock_date' => '', ], // Ensures the message is correct if the next major version has been @@ -492,7 +493,7 @@ public function securityCoverageMessageProvider() { 'installed_version' => '8.2.0', 'fixture' => 'sec.2.0_9.0.0', 'requirements_section_heading' => 'Warnings found', - 'message' => "The installed minor version of Drupal (8.2), will stop receiving official security support after the release of 8.4.0.Update to 8.3 or higher soon to continue receiving security updates. $see_available_message$release_coverage_message", + 'message' => "Covered until 8.4.0 Update to 8.3 or higher soon to continue receiving security updates. $release_coverage_message", 'mock_date' => '', ], ]; @@ -504,7 +505,7 @@ public function securityCoverageMessageProvider() { 'installed_version' => '8.8.0', 'fixture' => 'sec.9.0', 'requirements_section_heading' => 'Checked', - 'message' => "The installed minor version of Drupal (8.8), will stop receiving official security support after 2020-12-02.$release_coverage_message", + 'message' => "Covered until 2020-Dec-02 $release_coverage_message", 'mock_date' => '2020-06-01', ], // Ensure a warning is displayed if less than six months remain until the @@ -513,7 +514,7 @@ public function securityCoverageMessageProvider() { 'installed_version' => '8.8.0', 'fixture' => 'sec.9.0', 'requirements_section_heading' => 'Warnings found', - 'message' => "The installed minor version of Drupal (8.8), will stop receiving official security support after 2020-12-02.$update_soon_message$release_coverage_message", + 'message' => "Covered until 2020-Dec-02 $update_soon_message $release_coverage_message", 'mock_date' => '2020-06-02', ], ]; @@ -528,7 +529,7 @@ public function securityCoverageMessageProvider() { 'installed_version' => '8.8.0', 'fixture' => 'sec.9.0', 'requirements_section_heading' => 'Errors found', - 'message' => "The installed minor version of Drupal (8.8), is no longer supported and will not receive security updates.$update_asap_message $see_available_message$release_coverage_message", + 'message' => "$coverage_ended_message $update_asap_message $release_coverage_message", 'mock_date' => '2020-12-02', ]; @@ -537,7 +538,7 @@ public function securityCoverageMessageProvider() { 'installed_version' => '8.9.0', 'fixture' => 'sec.9.0', 'requirements_section_heading' => 'Checked', - 'message' => "The installed minor version of Drupal (8.9), will stop receiving official security support after November 2021.$release_coverage_message", + 'message' => "Covered until 2021-Nov $release_coverage_message", 'mock_date' => '2021-01-01', ]; // Ensure that the message does not change, including on the last day of @@ -550,7 +551,7 @@ public function securityCoverageMessageProvider() { 'installed_version' => '8.9.0', 'fixture' => 'sec.9.0', 'requirements_section_heading' => 'Errors found', - 'message' => "The installed minor version of Drupal (8.9), is no longer supported and will not receive security updates.$update_asap_message $see_available_message$release_coverage_message", + 'message' => "$coverage_ended_message $update_asap_message $release_coverage_message", 'mock_date' => '2021-11-01', ]; @@ -561,14 +562,14 @@ public function securityCoverageMessageProvider() { 'installed_version' => '9.9.0', 'fixture' => 'sec.9.9.0', 'requirements_section_heading' => 'Checked', - 'message' => "The installed minor version of Drupal (9.9), will stop receiving official security support after the release of 9.11.0.$release_coverage_message", + 'message' => "Covered until 9.11.0 $release_coverage_message", 'mock_date' => '', ], '9.8.0' => [ 'installed_version' => '9.8.0', 'fixture' => 'sec.9.9.0', 'requirements_section_heading' => 'Warnings found', - 'message' => "The installed minor version of Drupal (9.8), will stop receiving official security support after the release of 9.10.0.Update to 9.9 or higher soon to continue receiving security updates. $see_available_message$release_coverage_message", + 'message' => "Covered until 9.10.0 Update to 9.9 or higher soon to continue receiving security updates. $release_coverage_message", 'mock_date' => '', ], ];