From 5851be88ad2a1187c949045541b37c442cc18221 Mon Sep 17 00:00:00 2001 From: Wolfgang Bumiller Date: Tue, 1 Sep 2015 11:32:30 +0200 Subject: [PATCH] added 'extra-args' CLI handling 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 | 25 ++++++++++++++++++++----- src/PVE/RESTHandler.pm | 2 ++ 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/src/PVE/JSONSchema.pm b/src/PVE/JSONSchema.pm index 2837cf5..c925ecb 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,24 @@ 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) { - $opts->{$p} = shift @$args; + foreach my $arg_name (@$arg_param) { + if ($opts->{'extra-args'}) { + raise("internal error: extra-args must be the last argument\n", code => HTTP_BAD_REQUEST); + } + if ($arg_name eq 'extra-args') { + $opts->{'extra-args'} = $args; + $args = []; + next; + } + raise("not enough arguments\n", code => HTTP_BAD_REQUEST) if !@$args; + $opts->{$arg_name} = 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.39.2