added 'extra-args' CLI handling
authorWolfgang Bumiller <w.bumiller@proxmox.com>
Tue, 1 Sep 2015 09:32:30 +0000 (11:32 +0200)
committerDietmar Maurer <dietmar@proxmox.com>
Tue, 1 Sep 2015 15:46:04 +0000 (17:46 +0200)
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
src/PVE/RESTHandler.pm

index 2837cf5..c925ecb 100644 (file)
@@ -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;
index ae0a695..87a2c18 100644 (file)
@@ -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);