From 40e6d19d7352ad096b15985f09cc53152ee689be Mon Sep 17 00:00:00 2001 From: Christophe Coevoet Date: Thu, 29 Dec 2016 15:39:39 +0100 Subject: [PATCH 1/2] Implement schema validation for repositories --- res/composer-schema.json | 124 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 123 insertions(+), 1 deletion(-) diff --git a/res/composer-schema.json b/res/composer-schema.json index 69f586c98..41086fbe9 100644 --- a/res/composer-schema.json +++ b/res/composer-schema.json @@ -393,7 +393,23 @@ "repositories": { "type": ["object", "array"], "description": "A set of additional repositories where packages can be found.", - "additionalProperties": true + "additionalProperties": { + "oneOf": [ + { "$ref": "#/definitions/repository" }, + { "type": "boolean", "enum": [false] } + ] + }, + "items": { + "oneOf": [ + { "$ref": "#/definitions/repository" }, + { + "type": "object", + "additionalProperties": { "type": "boolean", "enum": [false] }, + "minProperties": 1, + "maxProperties": 1 + } + ] + } }, "minimum-stability": { "type": ["string"], @@ -548,5 +564,111 @@ "type": ["array", "string"], "description": "A key to store comments in" } + }, + "definitions": { + "repository": { + "type": "object", + "oneOf": [ + { "$ref": "#/definitions/composer-repository" }, + { "$ref": "#/definitions/vcs-repository" }, + { "$ref": "#/definitions/path-repository" }, + { "$ref": "#/definitions/artifact-repository" }, + { "$ref": "#/definitions/pear-repository" }, + { "$ref": "#/definitions/package-repository" } + ] + }, + "composer-repository": { + "type": "object", + "required": ["type", "url"], + "properties": { + "type": { "type": "string", "enum": ["composer"] }, + "url": { "type": "string", "format": "uri" }, + "options": { + "type": "object", + "additionalProperties": true + }, + "allow_ssl_downgrade": { "type": "boolean" }, + "force-lazy-providers": { "type": "boolean" } + } + }, + "vcs-repository": { + "type": "object", + "required": ["type", "url"], + "properties": { + "type": { "type": "string", "enum": ["vcs", "github", "git", "gitlab", "git-bitbucket", "hg", "hg-bitbucket", "fossil", "perforce", "svn"] }, + "url": { "type": "string", "format": "uri" }, + "no-api": { "type": "boolean" }, + "secure-http": { "type": "boolean" }, + "svn-cache-credentials": { "type": "boolean" }, + "trunk-path": { "type": "string" }, + "branches-path": { "type": "string" }, + "tags-path": { "type": "string" }, + "package-path": { "type": "string" }, + "depot": { "type": "string" }, + "branch": { "type": "string" }, + "unique_perforce_client_name": { "type": "string" }, + "p4user": { "type": "string" }, + "p4password": { "type": "string" } + } + }, + "path-repository": { + "type": "object", + "required": ["type", "url"], + "properties": { + "type": { "type": "string", "enum": ["path"] }, + "url": { "type": "string" }, + "options": { + "type": "object", + "properties": { + "symlink": { "type": ["boolean", "null"] } + }, + "additionalProperties": true + } + } + }, + "artifact-repository": { + "type": "object", + "required": ["type", "url"], + "properties": { + "type": { "type": "string", "enum": ["artifact"] }, + "url": { "type": "string" } + } + }, + "pear-repository": { + "type": "object", + "required": ["type", "url"], + "properties": { + "type": { "type": "string", "enum": ["pear"] }, + "url": { "type": "string", "format": "uri" }, + "vendor-alias": { "type": "string" } + } + }, + "package-repository": { + "type": "object", + "required": ["type", "package"], + "properties": { + "type": { "type": "string", "enum": ["package"] }, + "package": { + "oneOf": [ + { "$ref": "#/definitions/inline-package" }, + { + "type": "array", + "items": { + "type": { "$ref": "#/definitions/inline-package" } + } + } + ] + } + } + }, + "inline-package": { + "type": "object", + "allOf": [ + { "$ref": "#" }, + { + "required": ["name", "version"] + } + ] + } } } From 6daa2afdd3fc47376929575f8ab6953143bfe8d4 Mon Sep 17 00:00:00 2001 From: Christophe Coevoet Date: Thu, 29 Dec 2016 17:16:06 +0100 Subject: [PATCH 2/2] Fix the handling of references in JSON schemas when validating References must be resolved when loading the schema, otherwise they will fail when using them. The easiest way is actually to let the JsonSchema library load the file itself. --- composer.json | 2 +- composer.lock | 2 +- src/Composer/Json/JsonFile.php | 8 +++++++- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/composer.json b/composer.json index 8e9ba218a..6251e3f19 100644 --- a/composer.json +++ b/composer.json @@ -23,7 +23,7 @@ }, "require": { "php": "^5.3.2 || ^7.0", - "justinrainbow/json-schema": "^1.6 || ^2.0 || ^3.0 || ^4.0", + "justinrainbow/json-schema": "^3.0 || ^4.0", "composer/ca-bundle": "^1.0", "composer/semver": "^1.0", "composer/spdx-licenses": "^1.0", diff --git a/composer.lock b/composer.lock index 331413f0c..9925bc490 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "content-hash": "deb4df08cdd39eac7d11880586076ba1", + "content-hash": "e18501d127e13e3619f80abbcf372c81", "packages": [ { "name": "composer/ca-bundle", diff --git a/src/Composer/Json/JsonFile.php b/src/Composer/Json/JsonFile.php index 32e6d129e..1a33992f3 100644 --- a/src/Composer/Json/JsonFile.php +++ b/src/Composer/Json/JsonFile.php @@ -157,7 +157,13 @@ class JsonFile } $schemaFile = __DIR__ . '/../../../res/composer-schema.json'; - $schemaData = json_decode(file_get_contents($schemaFile)); + + // Prepend with file:// only when not using a special schema already (e.g. in the phar) + if (false === strpos($schemaFile, '://')) { + $schemaFile = 'file://' . $schemaFile; + } + + $schemaData = (object) array('$ref' => $schemaFile); if ($schema === self::LAX_SCHEMA) { $schemaData->additionalProperties = true;