Am 18/10/2022 um 16:02 schrieb Dominik Csapak:
> by adding a 'user-tag-privileges' and 'admin-tags' option.
> The first sets the policy by which "normal" users (with
> 'VM.Config.Options' on the respective guest) can create/delete tags
> and the second is a list of tags only settable by 'admins'
> ('Sys.Modify' on '/')
> 
> also add a helper 'get_user_admin_tags' that returns two hashmaps that
> determines the allowed user tags and admin tags that require elevated
> permissions
> 
> Signed-off-by: Dominik Csapak <d.csa...@proxmox.com>
> ---
>  data/PVE/DataCenterConfig.pm | 93 ++++++++++++++++++++++++++++++++++++
>  1 file changed, 93 insertions(+)
> 
> diff --git a/data/PVE/DataCenterConfig.pm b/data/PVE/DataCenterConfig.pm
> index bb29d26..e2140ff 100644
> --- a/data/PVE/DataCenterConfig.pm
> +++ b/data/PVE/DataCenterConfig.pm
> @@ -154,6 +154,26 @@ my $tag_style_format = {
>      },
>  };
>  
> +my $user_tag_privs_format = {
> +    'usable' => {
> +     optional => 1,
> +     type => 'string',
> +     enum => ['none', 'list', 'existing', 'free'],
> +     default => 'free',
> +     dscription => "Determines which tags a user without Sys.Modify on '/' 
> can set and delete. ".
> +         "'none' means no tags are settable.'list' allows tags from the 
> given list. ".
> +         "'existing' means only already existing tags or from the given 
> list. ".
> +         "And 'free' means users can assign any tags."

could be split into a "description" (for CLI usage) and a "verbose_description" 
(for man page/docs),
something like:

description => "Controls tag usage for users without `Sys.Modify` on `/` by 
either"
    ." allowing `none`, a `list`, already `existing` (used) or anything 
(`free`).",
verbose_description => "Controls which tags can be set or deleted on resources 
an user
    ." controls (such as guests). Users with the `Sys.Modify` privilege on `/` 
are always unrestricted."
    ."* `none`: ..."
    ."* `list`: ..."
    ."* `existing`: ..."
    ."* `free`: ...",

> +    },
> +    'list' => {
> +     optional => 1,
> +     type => 'string',
> +     pattern => 
> "${PVE::JSONSchema::PVE_TAG_RE}(?:\;${PVE::JSONSchema::PVE_TAG_RE})*",
> +     typetext => "<tag>[;<tag>=...]",
> +     description => "List of tags users are allowd to set and delete 
> (semicolon separated).",
> +    },
> +};
> +
>  my $datacenter_schema = {
>      type => "object",
>      additionalProperties => 0,
> @@ -285,12 +305,60 @@ my $datacenter_schema = {
>           description => "Tag style options.",
>           format => $tag_style_format,
>       },
> +     'user-tag-privileges' => {
> +         optional => 1,
> +         type => 'string',
> +         description => "Privilege options for user settable tags",
> +         format => $user_tag_privs_format,
> +     },
> +     'admin-tags' => {
> +         optional => 1,
> +         type => 'string',
> +         description => "A list of tags only admins (Sys.Modify on '/') are 
> allowed to set/delete",
> +         pattern => 
> "(?:${PVE::JSONSchema::PVE_TAG_RE};)*${PVE::JSONSchema::PVE_TAG_RE}",
> +     },
>      },
>  };
>  
>  # make schema accessible from outside (for documentation)
>  sub get_datacenter_schema { return $datacenter_schema };
>  
> +# returns two hashmaps of tags, the first is the list of tags that can

returns a tuple of two hash maps with tags as keys, ...

> +# be used by users with 'VM.Config.Options', and the second is a list

be used with just 'VM.Config.Options' on '/vms/{vmid}'

> +# that needs 'Sys.Modify' on '/'
> +#
> +# If the first map is 'undef', it means there is generally no restriction
> +# besides the tags defined in the second map.
> +#
> +# CAUTION: this function may include tags from *all* guest configs,
> +# regardless of the current authuser
> +sub get_user_admin_tags {

hmm, sounds a bit confusing, mabye one of:

* add and: get_user_and_admin_tags

* get_unrestricted_and_registered_tags

* or just get_allowed_tags (with the comment highlighting that it returns two, 
the
  allowed for all, and the one for "admins" it would be quite clear and also 
short)



_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel

Reply via email to