Site Health: Validate the test result data format in JS before using it.

This will discard any invalid responses instead of causing fatal errors.

It also makes badges optional, on the same basis as actions are optional. They are expected, but there may be situations where they are not present.

Props Clorith, dogwithblog, kraftbj, whyisjake, SergeyBiryukov.
Fixes #50145.

git-svn-id: https://develop.svn.wordpress.org/trunk@49537 602fd350-edb4-49c9-b593-d223f7449a82
This commit is contained in:
Sergey Biryukov 2020-11-08 09:50:07 +00:00
parent 0ecd258cf1
commit 8f86eb9550
2 changed files with 62 additions and 1 deletions

View File

@ -65,6 +65,57 @@ jQuery( document ).ready( function( $ ) {
$( this ).attr( 'aria-expanded', ! goodIssuesWrapper.hasClass( 'hidden' ) );
} );
/**
* Validates the Site Health test result format.
*
* @since 5.6.0
*
* @param {Object} issue
*
* @return {boolean}
*/
function validateIssueData( issue ) {
// Expected minimum format of a valid SiteHealth test response.
var minimumExpected = {
test: 'string',
label: 'string',
description: 'string'
},
passed = true,
key, value, subKey, subValue;
// If the issue passed is not an object, return a `false` state early.
if ( 'object' !== typeof( issue ) ) {
return false;
}
// Loop over expected data and match the data types.
for ( key in minimumExpected ) {
value = minimumExpected[ key ];
if ( 'object' === typeof( value ) ) {
for ( subKey in value ) {
subValue = value[ subKey ];
if ( 'undefined' === typeof( issue[ key ] ) ||
'undefined' === typeof( issue[ key ][ subKey ] ) ||
subValue !== typeof( issue[ key ][ subKey ] )
) {
passed = false;
}
}
} else {
if ( 'undefined' === typeof( issue[ key ] ) ||
value !== typeof( issue[ key ] )
) {
passed = false;
}
}
}
return passed;
}
/**
* Appends a new issue to the issue list.
*
@ -78,6 +129,14 @@ jQuery( document ).ready( function( $ ) {
heading,
count;
/*
* Validate the issue data format before using it.
* If the output is invalid, discard it.
*/
if ( ! validateIssueData( issue ) ) {
return false;
}
SiteHealth.site_status.issues[ issue.status ]++;
count = SiteHealth.site_status.issues[ issue.status ];

View File

@ -144,7 +144,9 @@ require_once ABSPATH . 'wp-admin/admin-header.php';
<h4 class="health-check-accordion-heading">
<button aria-expanded="false" class="health-check-accordion-trigger" aria-controls="health-check-accordion-block-{{ data.test }}" type="button">
<span class="title">{{ data.label }}</span>
<span class="badge {{ data.badge.color }}">{{ data.badge.label }}</span>
<# if ( data.badge ) { #>
<span class="badge {{ data.badge.color }}">{{ data.badge.label }}</span>
<# } #>
<span class="icon"></span>
</button>
</h4>