X-Git-Url: http://git.cyclocoop.org/?a=blobdiff_plain;f=includes%2Fregistration%2FExtensionJsonValidator.php;h=9d6c1a5b3315fc91db5f973325691890f9a131fc;hb=7cd7c534f7c86fff63bbd372dc081816df7d65ca;hp=7e3afaa803a2057f850273ee76ed70af887cb6df;hpb=0c2687f44eb0e8c7f480b7303f89056682ba0bfb;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/registration/ExtensionJsonValidator.php b/includes/registration/ExtensionJsonValidator.php index 7e3afaa803..9d6c1a5b33 100644 --- a/includes/registration/ExtensionJsonValidator.php +++ b/includes/registration/ExtensionJsonValidator.php @@ -21,8 +21,19 @@ use Composer\Spdx\SpdxLicenses; use JsonSchema\Validator; +use Seld\JsonLint\JsonParser; +use Seld\JsonLint\ParsingException; /** + * Validate extension.json files against their JSON schema. + * + * This is used for static validation from the command-line via + * validateRegistrationFile.php, and the PHPUnit structure test suite + * (ExtensionJsonValidationTest). + * + * The files are normally read by the ExtensionRegistry + * and ExtensionProcessor classes. + * * @since 1.29 */ class ExtensionJsonValidator { @@ -54,6 +65,10 @@ class ExtensionJsonValidator { 'The spdx-licenses library cannot be found, please install it through composer.' ); return false; + } elseif ( !class_exists( JsonParser::class ) ) { + call_user_func( $this->missingDepCallback, + 'The JSON lint library cannot be found, please install it through composer.' + ); } return true; @@ -65,8 +80,14 @@ class ExtensionJsonValidator { * @throws ExtensionJsonValidationError on any failure */ public function validate( $path ) { - $data = json_decode( file_get_contents( $path ) ); - if ( !is_object( $data ) ) { + $contents = file_get_contents( $path ); + $jsonParser = new JsonParser(); + try { + $data = $jsonParser->parse( $contents, JsonParser::DETECT_KEY_CONFLICTS ); + } catch ( ParsingException $e ) { + if ( $e instanceof \Seld\JsonLint\DuplicateKeyException ) { + throw new ExtensionJsonValidationError( $e->getMessage() ); + } throw new ExtensionJsonValidationError( "$path is not valid JSON" ); } @@ -89,20 +110,34 @@ class ExtensionJsonValidator { ); } - $licenseError = false; + $extraErrors = []; // Check if it's a string, if not, schema validation will display an error if ( isset( $data->{'license-name'} ) && is_string( $data->{'license-name'} ) ) { $licenses = new SpdxLicenses(); $valid = $licenses->validate( $data->{'license-name'} ); if ( !$valid ) { - $licenseError = '[license-name] Invalid SPDX license identifier, ' + $extraErrors[] = '[license-name] Invalid SPDX license identifier, ' . 'see '; } } + if ( isset( $data->url ) && is_string( $data->url ) ) { + $parsed = wfParseUrl( $data->url ); + $mwoUrl = false; + if ( $parsed['host'] === 'www.mediawiki.org' ) { + $mwoUrl = true; + } elseif ( $parsed['host'] === 'mediawiki.org' ) { + $mwoUrl = true; + $extraErrors[] = '[url] Should use www.mediawiki.org domain'; + } + + if ( $mwoUrl && $parsed['scheme'] !== 'https' ) { + $extraErrors[] = '[url] Should use HTTPS for www.mediawiki.org URLs'; + } + } $validator = new Validator; $validator->check( $data, (object)[ '$ref' => 'file://' . $schemaPath ] ); - if ( $validator->isValid() && !$licenseError ) { + if ( $validator->isValid() && !$extraErrors ) { // All good. return true; } else { @@ -110,8 +145,8 @@ class ExtensionJsonValidator { foreach ( $validator->getErrors() as $error ) { $out .= "[{$error['property']}] {$error['message']}\n"; } - if ( $licenseError ) { - $out .= "$licenseError\n"; + if ( $extraErrors ) { + $out .= implode( "\n", $extraErrors ) . "\n"; } throw new ExtensionJsonValidationError( $out ); }