]> git.proxmox.com Git - pve-manager.git/commitdiff
api: backup/vzdump: add permission check for fleecing storage
authorFiona Ebner <f.ebner@proxmox.com>
Wed, 13 Mar 2024 13:26:01 +0000 (14:26 +0100)
committerFiona Ebner <f.ebner@proxmox.com>
Fri, 19 Apr 2024 13:57:28 +0000 (15:57 +0200)
Similar to how Datastore.AllocateSpace is required for the backup
storage, it should also be required for the fleecing storage.

Removing a fleecing storage from a job does not require more
permissions than for modifying the job.

Suggested-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
PVE/API2/Backup.pm
PVE/API2/VZDump.pm
PVE/VZDump.pm

index 70753c2e09d3263a6b0fd2f78f6fde0d140ff52f..8814032382ea3729d7050d957250135f76581fb6 100644 (file)
@@ -42,7 +42,7 @@ my $vzdump_job_id_prop = {
 
 # NOTE: also used by the vzdump API call.
 sub assert_param_permission_common {
-    my ($rpcenv, $user, $param) = @_;
+    my ($rpcenv, $user, $param, $is_delete) = @_;
     return if $user eq 'root@pam'; # always OK
 
     for my $key (qw(tmpdir dumpdir script)) {
@@ -52,6 +52,12 @@ sub assert_param_permission_common {
     if (grep { defined($param->{$_}) } qw(bwlimit ionice performance)) {
        $rpcenv->check($user, "/", [ 'Sys.Modify' ]);
     }
+
+    if ($param->{fleecing} && !$is_delete) {
+       my $fleecing = PVE::VZDump::parse_fleecing($param) // {};
+       $rpcenv->check($user, "/storage/$fleecing->{storage}", [ 'Datastore.AllocateSpace' ])
+           if $fleecing->{storage};
+    }
 }
 
 my sub assert_param_permission_create {
@@ -70,7 +76,7 @@ my sub assert_param_permission_update {
     return if $user eq 'root@pam'; # always OK
 
     assert_param_permission_common($rpcenv, $user, $update);
-    assert_param_permission_common($rpcenv, $user, $delete);
+    assert_param_permission_common($rpcenv, $user, $delete, 1);
 
     if ($update->{storage}) {
        $rpcenv->check($user, "/storage/$update->{storage}", [ 'Datastore.Allocate' ])
index f66fc740330d14392eb32a48270059eefb4dd208..7f92e7ec4a3cd503e8e52ec7e5209e52889c42fd 100644 (file)
@@ -41,10 +41,11 @@ __PACKAGE__->register_method ({
     description => "Create backup.",
     permissions => {
        description => "The user needs 'VM.Backup' permissions on any VM, and "
-           ."'Datastore.AllocateSpace' on the backup storage. The 'tmpdir', 'dumpdir' and "
-           ."'script' parameters are restricted to the 'root\@pam' user. The 'maxfiles' and "
-           ."'prune-backups' settings require 'Datastore.Allocate' on the backup storage. The "
-           ."'bwlimit', 'performance' and 'ionice' parameters require 'Sys.Modify' on '/'. ",
+           ."'Datastore.AllocateSpace' on the backup storage (and fleecing storage when fleecing "
+           ."is used). The 'tmpdir', 'dumpdir' and 'script' parameters are restricted to the "
+           ."'root\@pam' user. The 'maxfiles' and 'prune-backups' settings require "
+           ."'Datastore.Allocate' on the backup storage. The 'bwlimit', 'performance' and "
+           ."'ionice' parameters require 'Sys.Modify' on '/'.",
        user => 'all',
     },
     protected => 1,
index 2b2da3c331cd5d41fba3cc545901da1e31ee8a04..8b6acda68977f4d40da71b6e4e36e10816a6156a 100644 (file)
@@ -130,7 +130,7 @@ my $generate_notes = sub {
     return $notes_template;
 };
 
-my sub parse_fleecing {
+sub parse_fleecing {
     my ($param) = @_;
 
     if (defined(my $fleecing = $param->{fleecing})) {