Checks ACL paths for logical validity before application. Checks of the various IDs are done by the existing format checkers to avoid code duplication. Also introduces a distinction between malformed (syntactically incorrect) and invalid (syntactically correct, but contextually wrong) paths. --- PVE/API2/ACL.pm | 4 +++- PVE/AccessControl.pm | 13 +++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-)
diff --git a/PVE/API2/ACL.pm b/PVE/API2/ACL.pm index d37771b..20d3d2a 100644 --- a/PVE/API2/ACL.pm +++ b/PVE/API2/ACL.pm @@ -132,7 +132,9 @@ __PACKAGE__->register_method ({ } my $path = PVE::AccessControl::normalize_path($param->{path}); - raise_param_exc({ path => "invalid ACL path '$param->{path}'" }) if !$path; + raise_param_exc({ path => "malformed ACL path '$param->{path}'" }) if !$path; + raise_param_exc({ path => "invalid ACL path '$param->{path}'" }) + if !PVE::AccessControl::validate_path($path); PVE::AccessControl::lock_user_config( sub { diff --git a/PVE/AccessControl.pm b/PVE/AccessControl.pm index f0fb7dc..183bf21 100644 --- a/PVE/AccessControl.pm +++ b/PVE/AccessControl.pm @@ -591,6 +591,19 @@ sub verify_privname { return $priv; } +sub validate_path { + my $path = shift; + return 0 if $path !~ m'^/(vms|nodes|storage|pool|access/(?:groups|realms))(?:/([[:alnum:]\.\-\_]+))?$'; + + if ($1 eq 'vms') {PVE::JSONSchema::pve_verify_vmid($2) if $2;} + elsif ($1 eq 'nodes') {PVE::JSONSchema::pve_verify_node_name($2) if $2;} + elsif ($1 eq 'storage') {PVE::JSONSchema::parse_storage_id($2) if $2;} + elsif ($1 eq 'pool') {verify_poolname($2) if $2;} + elsif ($1 eq 'access/realms') {PVE::Auth::Plugin::pve_verify_realm($2) if $2;} + + return 1; +} + sub userconfig_force_defaults { my ($cfg) = @_; -- 2.11.0 _______________________________________________ pve-devel mailing list pve-devel@pve.proxmox.com https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel