#!/usr/local/bin/perl
# save_passwd.cgi
# Create, update or delete a CVS user

require './pserver-lib.pl';
$access{'passwd'} || &error($text{'passwd_ecannot'});
&ReadParse();
@passwd = &list_passwords();
$user = $passwd[$in{'idx'}] if (!$in{'new'});

&lock_file($passwd_file);
if ($in{'delete'}) {
	# Just delete the user
	&delete_password($user);
	}
else {
	# Validate and store inputs
	&error_setup($text{'save_err'});
	$in{'user'} =~ /^[^:\s]+$/ || &error($text{'save_euser'});
	$user->{'user'} = $in{'user'};
	if ($in{'pass_def'} == 2) {
		$user->{'pass'} = undef;
		}
	elsif ($in{'pass_def'} == 0) {
		local $salt = chr(int(rand(26))+65) . chr(int(rand(26))+65);
		$user->{'pass'} = crypt($in{'pass'}, $salt);
		}
	elsif ($in{'pass_def'} == 3) {
		&foreign_require("useradmin", "user-lib.pl");
		@users = &useradmin::list_users();
		($copy) = grep { $_->{'user'} eq $in{'user'} } @users;
		$copy || &error($text{'save_ecopy'});
		$copy->{'pass'} =~ /^\$1\$/ &&  &error($text{'save_emd5'});
		$user->{'pass'} = $copy->{'pass'};
		}
	if ($in{'unix_def'}) {
		$user->{'unix'} = undef;
		}
	else {
		defined(getpwnam($in{'unix'})) || &error($text{'save_eunix'});
		$user->{'unix'} = $in{'unix'};
		}

	# Save or create the user
	if ($in{'new'}) {
		&create_password($user);
		}
	else {
		&modify_password($user);
		}
	}
&unlock_file($passwd_file);
&webmin_log($in{'delete'} ? "delete" : $in{'new'} ? "create" : "modify",
	    "user", $user->{'user'}, $user);
&redirect("list_passwd.cgi");

