added a validate schema function to make sure the user does not enter vomit into the config files

main
Joshua Estes 12 years ago
parent 7b00dfab4c
commit cec8debcdc

@ -16,9 +16,11 @@ use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
use JsonSchema\Validator;
use Composer\Config;
use Composer\Factory;
use Composer\Json\JsonFile;
use Composer\Json\JsonValidationException;
class ConfigCommand extends Command
{
@ -168,6 +170,41 @@ EOT
}
return $tmp;
}
/**
* After the command sets a new config value, this will parse it writes
* it to disk to make sure that it is valid according the the composer.json
* schema.
*
* @param array $data
* @throws JsonValidationException
* @return boolean
*/
protected function validateSchema(array $data)
{
// @todo Figure out what should be excluded from the validation check
// @todo validation should vary based on if it's global or local
$schemaFile = __DIR__ . '/../../../res/composer-schema.json';
$schemaData = json_decode(file_get_contents($schemaFile));
//die(var_dump($schemaData));
unset(
$schemaData->properties->name,
$schemaData->properties->description
);
$validator = new Validator();
$validator->check(json_decode(json_encode($data)), $schemaData);
if (!$validator->isValid()) {
$errors = array();
foreach ((array) $validator->getErrors() as $error) {
$errors[] = ($error['property'] ? $error['property'].' : ' : '').$error['message'];
}
throw new JsonValidationException('"'.$this->configFile->getPath().'" does not match the expected JSON schema'."\n". implode("\n",$errors));
}
return true;
}
}

Loading…
Cancel
Save