X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=src%2FPVE%2FJSONSchema.pm;h=29ada5bc06570ea6853ca0736e303f5fd89befa5;hb=eeafe02d81bb06108ca4dc51cd2fb515ce41010c;hp=de2261e5a91c343fa5e19ee1b37b2cf23c0ebff4;hpb=70fdc0501bf90c598bb8e9eb7f3fe3b64c7f8722;p=pve-common.git diff --git a/src/PVE/JSONSchema.pm b/src/PVE/JSONSchema.pm index de2261e..29ada5b 100644 --- a/src/PVE/JSONSchema.pm +++ b/src/PVE/JSONSchema.pm @@ -21,6 +21,8 @@ parse_property_string register_standard_option ); +our $CONFIGID_RE = qr/[a-z][a-z0-9_-]+/i; + # Note: This class implements something similar to JSON schema, but it is not 100% complete. # see: http://tools.ietf.org/html/draft-zyp-json-schema-02 # see: http://json-schema.org/ @@ -177,7 +179,7 @@ register_format('pve-configid', \&pve_verify_configid); sub pve_verify_configid { my ($id, $noerr) = @_; - if ($id !~ m/^[a-z][a-z0-9_-]+$/i) { + if ($id !~ m/^$CONFIGID_RE$/) { return undef if $noerr; die "invalid configuration ID '$id'\n"; } @@ -1613,7 +1615,8 @@ sub get_options { $opts->{$list_param} = $args; $args = []; } elsif (ref($arg_param)) { - foreach my $arg_name (@$arg_param) { + for (my $i = 0; $i < scalar(@$arg_param); $i++) { + my $arg_name = $arg_param->[$i]; if ($opts->{'extra-args'}) { raise("internal error: extra-args must be the last argument\n", code => HTTP_BAD_REQUEST); } @@ -1622,7 +1625,15 @@ sub get_options { $args = []; next; } - raise("not enough arguments\n", code => HTTP_BAD_REQUEST) if !@$args; + if (!@$args) { + # check if all left-over arg_param are optional, else we + # must die as the mapping is then ambigious + for (my $j = $i; $j < scalar(@$arg_param); $j++) { + my $prop = $arg_param->[$j]; + raise("not enough arguments\n", code => HTTP_BAD_REQUEST) + if !$schema->{properties}->{$prop}->{optional}; + } + } $opts->{$arg_name} = shift @$args; } raise("too many arguments\n", code => HTTP_BAD_REQUEST) if @$args; @@ -1635,7 +1646,7 @@ sub get_options { foreach my $arg_name (@$arg_param) { if ($arg_name eq 'extra-args') { $opts->{'extra-args'} = []; - } else { + } elsif (!$schema->{properties}->{$arg_name}->{optional}) { raise("not enough arguments\n", code => HTTP_BAD_REQUEST); } } @@ -1897,9 +1908,12 @@ sub generate_typetext { sub print_property_string { my ($data, $format, $skip, $path) = @_; + my $validator; if (ref($format) ne 'HASH') { my $schema = get_format($format); die "not a valid format: $format\n" if !$schema; + # named formats can have validators attached + $validator = $format_validators->{$format}; $format = $schema; } @@ -1909,6 +1923,8 @@ sub print_property_string { raise "format error", errors => $errors; } + $data = $validator->($data) if $validator; + my ($default_key, $keyAliasProps) = &$find_schema_default_key($format); my $res = '';