mirror of
https://git.proxmox.com/git/pve-access-control
synced 2025-07-15 14:24:29 +00:00
realm: add default-sync-options to config
This allows us to have a convenient way to set the desired default sync options, and thus not forcing users to pass always all options when they want to trigger a sync. We still die when an option is neither specified in the domains (realm) config nor as API/CLI parameter. Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
This commit is contained in:
parent
415179b03a
commit
d29d2d4a11
@ -276,7 +276,7 @@ my $update_users = sub {
|
|||||||
my $olduser = $oldusers->{$userid} // {};
|
my $olduser = $oldusers->{$userid} // {};
|
||||||
if (defined(my $enabled = $olduser->{enable})) {
|
if (defined(my $enabled = $olduser->{enable})) {
|
||||||
$user->{enable} = $enabled;
|
$user->{enable} = $enabled;
|
||||||
} elsif ($opts->{enable}) {
|
} elsif ($opts->{'enable-new'}) {
|
||||||
$user->{enable} = 1;
|
$user->{enable} = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -340,6 +340,31 @@ my $update_groups = sub {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
my $parse_sync_opts = sub {
|
||||||
|
my ($param, $realmconfig) = @_;
|
||||||
|
|
||||||
|
my $sync_opts_fmt = PVE::JSONSchema::get_format('realm-sync-options');
|
||||||
|
|
||||||
|
my $res = {};
|
||||||
|
if (defined(my $cfg_opts = $realmconfig->{'sync-defaults-options'})) {
|
||||||
|
$res = PVE::JSONSchema::parse_property_string($sync_opts_fmt, $cfg_opts);
|
||||||
|
}
|
||||||
|
|
||||||
|
for my $opt (sort keys %$sync_opts_fmt) {
|
||||||
|
my $fmt = $sync_opts_fmt->{$opt};
|
||||||
|
|
||||||
|
if (exists $param->{$opt}) {
|
||||||
|
$res->{$opt} = $param->{$opt};
|
||||||
|
} elsif (!exists $res->{$opt}) {
|
||||||
|
raise_param_exc({
|
||||||
|
"$opt" => 'Not passed as parameter and not defined in realm default sync options.'
|
||||||
|
}) if !$fmt->{optional};
|
||||||
|
$res->{$opt} = $fmt->{default} if exists $fmt->{default};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $res;
|
||||||
|
};
|
||||||
|
|
||||||
__PACKAGE__->register_method ({
|
__PACKAGE__->register_method ({
|
||||||
name => 'sync',
|
name => 'sync',
|
||||||
path => '{realm}/sync',
|
path => '{realm}/sync',
|
||||||
@ -358,28 +383,9 @@ __PACKAGE__->register_method ({
|
|||||||
protected => 1,
|
protected => 1,
|
||||||
parameters => {
|
parameters => {
|
||||||
additionalProperties => 0,
|
additionalProperties => 0,
|
||||||
properties => {
|
properties => get_standard_option('realm-sync-options', {
|
||||||
realm => get_standard_option('realm'),
|
realm => get_standard_option('realm'),
|
||||||
scope => {
|
})
|
||||||
description => "Select what to sync.",
|
|
||||||
type => 'string',
|
|
||||||
enum => [qw(users groups both)],
|
|
||||||
},
|
|
||||||
full => {
|
|
||||||
description => "If set, uses the LDAP Directory as source of truth, ".
|
|
||||||
"deleting all information not contained there. ".
|
|
||||||
"Otherwise only syncs information set explicitly.",
|
|
||||||
type => 'boolean',
|
|
||||||
},
|
|
||||||
enable => {
|
|
||||||
description => "Enable newly synced users.",
|
|
||||||
type => 'boolean',
|
|
||||||
},
|
|
||||||
purge => {
|
|
||||||
description => "Remove ACLs for users/groups that were removed from the config.",
|
|
||||||
type => 'boolean',
|
|
||||||
},
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
returns => {
|
returns => {
|
||||||
description => 'Worker Task-UPID',
|
description => 'Worker Task-UPID',
|
||||||
@ -402,8 +408,9 @@ __PACKAGE__->register_method ({
|
|||||||
die "Cannot sync realm type '$type'! Only LDAP/AD realms can be synced.\n";
|
die "Cannot sync realm type '$type'! Only LDAP/AD realms can be synced.\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
my $opts = $parse_sync_opts->($param, $realmconfig); # can throw up
|
||||||
|
|
||||||
my $scope = $param->{scope};
|
my $scope = $opts->{scope};
|
||||||
my $whatstring = $scope eq 'both' ? "users and groups" : $scope;
|
my $whatstring = $scope eq 'both' ? "users and groups" : $scope;
|
||||||
|
|
||||||
my $plugin = PVE::Auth::Plugin->lookup($type);
|
my $plugin = PVE::Auth::Plugin->lookup($type);
|
||||||
@ -422,11 +429,11 @@ __PACKAGE__->register_method ({
|
|||||||
print "got data from server, updating $whatstring\n";
|
print "got data from server, updating $whatstring\n";
|
||||||
|
|
||||||
if ($scope eq 'users' || $scope eq 'both') {
|
if ($scope eq 'users' || $scope eq 'both') {
|
||||||
$update_users->($usercfg, $realm, $synced_users, $param);
|
$update_users->($usercfg, $realm, $synced_users, $opts);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($scope eq 'groups' || $scope eq 'both') {
|
if ($scope eq 'groups' || $scope eq 'both') {
|
||||||
$update_groups->($usercfg, $realm, $synced_groups, $param);
|
$update_groups->($usercfg, $realm, $synced_groups, $opts);
|
||||||
}
|
}
|
||||||
|
|
||||||
cfs_write_file("user.cfg", $usercfg);
|
cfs_write_file("user.cfg", $usercfg);
|
||||||
|
@ -3,9 +3,11 @@ package PVE::Auth::LDAP;
|
|||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
|
|
||||||
use PVE::Tools;
|
|
||||||
use PVE::Auth::Plugin;
|
use PVE::Auth::Plugin;
|
||||||
|
use PVE::JSONSchema;
|
||||||
use PVE::LDAP;
|
use PVE::LDAP;
|
||||||
|
use PVE::Tools;
|
||||||
|
|
||||||
use base qw(PVE::Auth::Plugin);
|
use base qw(PVE::Auth::Plugin);
|
||||||
|
|
||||||
sub type {
|
sub type {
|
||||||
@ -109,6 +111,12 @@ sub properties {
|
|||||||
format => 'ldap-simple-attr-list',
|
format => 'ldap-simple-attr-list',
|
||||||
optional => 1,
|
optional => 1,
|
||||||
},
|
},
|
||||||
|
'sync-defaults-options' => {
|
||||||
|
description => "The default options for behavior of synchronizations.",
|
||||||
|
type => 'string',
|
||||||
|
format => 'realm-sync-options',
|
||||||
|
optional => 1,
|
||||||
|
},
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -136,6 +144,7 @@ sub options {
|
|||||||
group_name_attr => { optional => 1 },
|
group_name_attr => { optional => 1 },
|
||||||
group_filter => { optional => 1 },
|
group_filter => { optional => 1 },
|
||||||
group_classes => { optional => 1 },
|
group_classes => { optional => 1 },
|
||||||
|
'sync-defaults-options' => { optional => 1 },
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -47,6 +47,37 @@ PVE::JSONSchema::register_standard_option('realm', {
|
|||||||
maxLength => 32,
|
maxLength => 32,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
my $realm_sync_options_desc = {
|
||||||
|
scope => {
|
||||||
|
description => "Select what to sync.",
|
||||||
|
type => 'string',
|
||||||
|
enum => [qw(users groups both)],
|
||||||
|
optional => '1',
|
||||||
|
},
|
||||||
|
full => {
|
||||||
|
description => "If set, uses the LDAP Directory as source of truth,"
|
||||||
|
." deleting users or groups not returned from the sync. Otherwise"
|
||||||
|
." only syncs information which is not already present, and does not"
|
||||||
|
." deletes or modifies anything else.",
|
||||||
|
type => 'boolean',
|
||||||
|
optional => '1',
|
||||||
|
},
|
||||||
|
'enable-new' => {
|
||||||
|
description => "Enable newly synced users immediately.",
|
||||||
|
type => 'boolean',
|
||||||
|
default => '1',
|
||||||
|
optional => '1',
|
||||||
|
},
|
||||||
|
purge => {
|
||||||
|
description => "Remove ACLs for users or groups which were removed from"
|
||||||
|
." the config during a sync.",
|
||||||
|
type => 'boolean',
|
||||||
|
optional => '1',
|
||||||
|
},
|
||||||
|
};
|
||||||
|
PVE::JSONSchema::register_standard_option('realm-sync-options', $realm_sync_options_desc);
|
||||||
|
PVE::JSONSchema::register_format('realm-sync-options', $realm_sync_options_desc);
|
||||||
|
|
||||||
PVE::JSONSchema::register_format('pve-userid', \&verify_username);
|
PVE::JSONSchema::register_format('pve-userid', \&verify_username);
|
||||||
sub verify_username {
|
sub verify_username {
|
||||||
my ($username, $noerr) = @_;
|
my ($username, $noerr) = @_;
|
||||||
|
Loading…
Reference in New Issue
Block a user