added 'extra-args' standard option added 'extra-args' handling to PVE::JSONSchema::get_options untainting 'extra-args' separately in RESTHandler::handle --- src/PVE/JSONSchema.pm | 19 ++++++++++++++++--- src/PVE/RESTHandler.pm | 2 ++ 2 files changed, 18 insertions(+), 3 deletions(-)
diff --git a/src/PVE/JSONSchema.pm b/src/PVE/JSONSchema.pm index 2837cf5..e1e8e5b 100644 --- a/src/PVE/JSONSchema.pm +++ b/src/PVE/JSONSchema.pm @@ -83,6 +83,13 @@ PVE::JSONSchema::register_standard_option('pve-config-digest', { maxLength => 40, # sha1 hex digest lenght is 40 }); +PVE::JSONSchema::register_standard_option('extra-args', { + description => "Extra arguments as array", + type => 'array', + items => { type => 'string' }, + optional => 1 +}); + my $format_list = {}; sub register_format { @@ -1074,16 +1081,22 @@ sub get_options { raise("unable to parse option\n", code => HTTP_BAD_REQUEST) if !Getopt::Long::GetOptionsFromArray($args, $opts, @getopt); - if (my $acount = scalar(@$args)) { + if (@$args) { if ($list_param) { $opts->{$list_param} = $args; $args = []; } elsif (ref($arg_param)) { - raise("wrong number of arguments\n", code => HTTP_BAD_REQUEST) - if scalar(@$arg_param) != $acount; foreach my $p (@$arg_param) { + if ($p eq 'extra-args') { + die 'internal error: extra-args must be the last argument' if $opts->{'extra_args'}; + $opts->{'extra-args'} = $args; + $args = []; + next; + } + raise("not enough arguments\n", code => HTTP_BAD_REQUEST) if !@$args; $opts->{$p} = shift @$args; } + raise("too many arguments\n", code => HTTP_BAD_REQUEST) if @$args; } else { raise("too many arguments\n", code => HTTP_BAD_REQUEST) if scalar(@$args) != 0; diff --git a/src/PVE/RESTHandler.pm b/src/PVE/RESTHandler.pm index ae0a695..87a2c18 100644 --- a/src/PVE/RESTHandler.pm +++ b/src/PVE/RESTHandler.pm @@ -386,9 +386,11 @@ sub handle { # warn "validate ". Dumper($param}) . "\n" . Dumper($schema); PVE::JSONSchema::validate($param, $schema); # untaint data (already validated) + my $extra = delete $param->{'extra-args'}; while (my ($key, $val) = each %$param) { ($param->{$key}) = $val =~ /^(.*)$/s; } + $param->{'extra-args'} = [map { /^(.*)$/ } @$extra] if $extra; } my $result = &$func($param); -- 2.1.4 _______________________________________________ pve-devel mailing list pve-devel@pve.proxmox.com http://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel