
do "acl-lib.pl";

# useradmin_create_user(&details)
# Create a new webmin user in the group
sub useradmin_create_user
{
return if (!$config{'sync_create'});
local ($group) = grep { $_->{'name'} eq $config{'sync_group'} }
		      &list_groups();
return if (!$group);
local ($clash) = grep { $_->{'name'} eq $_[0]->{'user'} }
			(&list_users(), &list_groups());
return if ($clash);
return if ($_[0]->{'user'} !~ /^[A-z0-9\-\_\.]+$/);
local $user = { 'name' => $_[0]->{'user'},
		'pass' => $_[0]->{'pass'},
		'sync' => 1,
		'modules' => $group->{'modules'} };
&create_user($user);
push(@{$group->{'members'}}, $user->{'name'});
&modify_group($group->{'name'}, $group);

foreach $m (@{$group->{'modules'}}, "") {
	local %groupacl;
	unlink("$config_directory/$m/$user->{'name'}.acl");
	if (&read_file("$config_directory/$m/$group->{'name'}.acl",
		       \%groupacl)) {
		&write_file("$config_directory/$m/$user->{'name'}.acl",
			    \%groupacl);
		}
	}
&restart_miniserv();
}

# useradmin_delete_user(&details)
# Delete this webmin user if in sync
sub useradmin_delete_user
{
return if (!$config{'sync_delete'});
local @list = &list_users();
foreach $u (@list) {
	if ($u->{'name'} eq $_[0]->{'user'}) {
		&delete_user($u->{'name'});
		&restart_miniserv();
		}
	}
foreach $g (&list_groups()) {
	local @mems = @{$g->{'members'}};
	local $i = &indexof($_[0]->{'user'}, @mems);
	if ($i >= 0) {
		splice(@mems, $i, 1);
		$g->{'members'} = \@mems;
		&modify_group($g->{'name'}, $g);
		}
	}
}

# useradmin_modify_user(&details)
# Update this users password if in sync
sub useradmin_modify_user
{
return if ($_[0]->{'passmode'} == 4 && $_[0]->{'olduser'} eq $_[0]->{'user'});
foreach $u (&list_users()) {
	if ($u->{'name'} eq $_[0]->{'olduser'} && $u->{'sync'}) {
		if ($_[0]->{'user'} ne $_[0]->{'olduser'}) {
			# New name might clash (or be invalid)
			local ($clash) =grep { $_->{'name'} eq $_[0]->{'user'} }
						(&list_users(), &list_groups());
			return if ($clash);
			return if ($_[0]->{'user'} !~ /^[A-z0-9\-\_\.]+$/);
			}
		$u->{'name'} = $_[0]->{'user'};
		$u->{'pass'} = $_[0]->{'passmode'} == 3 ?
			crypt($_[0]->{'plainpass'}, substr(time(), 0, 2)) :
			$_[0]->{'pass'};
		&modify_user($_[0]->{'olduser'}, $u);
		&restart_miniserv();
		}

	# Check other users' acl module acls
	local %uaccess = &get_module_acl($u->{'name'});
	local @au = split(/\s+/, $uaccess{'users'});
	local $idx = &indexof($_[0]->{'olduser'}, @au);
	if ($idx != -1) {
		$au[$idx] = $_[0]->{'user'};
		$uaccess{'users'} = join(" ", @au);
		&save_module_acl(\%uaccess, $u->{'name'});
		}
	}

# Rename the user in his group
if ($_[0]->{'user'} ne $_[0]->{'olduser'}) {
	foreach $g (&list_groups()) {
		local @mems = @{$g->{'members'}};
		local $i = &indexof($_[0]->{'olduser'}, @mems);
		if ($i >= 0) {
			$mems[$i] = $_[0]->{'user'};
			$g->{'members'} = \@mems;
			&modify_group($g->{'name'}, $g);
			}
		}
	}
}

1;

