VUser-Email

 view release on metacpan or  search on metacpan

lib/VUser/Email/Postfix.pm  view on Meta::CPAN


our $user_exists;

sub depends { return qw(Email); }

sub init {
    my $eh = shift;
    my %cfg = @_;

    #%meta = %VUser::Email::meta;
    
    if (defined $main::log) {
        $log = $main::log;
    } else {
        $log = VUser::Log->new(\%cfg, 'vuser')
    }
    
    $eh->register_task('email', 'add', \&email_add);
    $eh->register_task('email', 'mod', \&email_mod);
    $eh->register_task('email', 'del', \&email_del);

    $eh->register_task('domain', 'add', \&domain_add);
    $eh->register_task('domain', 'mod', \&domain_mod);
    $eh->register_task('domain', 'del', \&domain_del);
}

sub email_add {
    my ($cfg, $opts, $action, $eh) = @_;

    my $account = $opts->{account};
    my $user;
    my $domain;

    VUser::Email::split_address ($cfg, $account, \$user, \$domain);

    die "'account' must be in the form user\@domain" if (!$user or !$domain);

    if (defined $user_exists) {
	die "User $account exists\n" if &$user_exists($cfg, $opts, $account);
    }

    my $userdir = $opts->{home};
    if (not defined $userdir or not $userdir) {
	$userdir = get_home_directory ($cfg, $user, $domain);
    }
    my $user_parentdir = $userdir;
    $user_parentdir =~ s!/[^/]*$!!;

    my $vuid = (getpwnam($cfg->{$VUser::Email::c_sec}{'virtual user'}))[2];
    my $vgid = (getgrnam($cfg->{$VUser::Email::c_sec}{'virtual group'}))[2];

    mkdir_p ($user_parentdir,
	     0775, $vuid, $vgid,
	     ) or die "Could not create user directory: $user_parentdir\n";

    my $rc = 0xffff & system ('cp', '-R', $cfg->{$VUser::Email::c_sec}{'skeldir'}, $userdir);
    $rc <<= 8;

    die "Can't copy skel dir ".$cfg->{$VUser::Email::c_sec}{'skeldir'}." to $userdir: $!\n" if $rc != 0;

    $rc = 0xffff & system ('chown', '-R', "$vuid:$vgid", $userdir);
}

sub email_mod {
    my ($cfg, $opts, $action, $eh) = @_;

    my $account = $opts->{account};

    my $old_user;
    my $old_domain;
    VUser::Email::split_address( $cfg, $account, \$old_user, \$old_domain);

    die "account must be in form user\@domain\n" if( !$old_user or !$old_domain );

    my $new_account = $opts->{newaccount};
    if ($new_account and $new_account ne $account) {
	if (defined $user_exists) {
	    die "User $new_account exists\n" if &$user_exists($cfg, $opts, $new_account);
	}

	# User is changing the email address for the account.
	my $new_user;
	my $new_domain;
	VUser::Email::split_address( $cfg, $new_account, \$new_user, \$new_domain);
	die "newaccount must be in form user\@domain" if( !$new_user or !$new_domain );

	my $old_userdir = get_home_directory($cfg, $old_user, $old_domain);
	my $new_userdir = get_home_directory($cfg, $new_user, $new_domain);
	$log->log(LOG_DEBUG, "Old: $old_userdir");
	$log->log(LOG_DEBUG, "New: $new_userdir");
	VUser::ExtLib::mvdir($old_userdir, $new_userdir);
    }
}

sub email_del {
    my ($cfg, $opts, $action, $eh) = @_;

    my $account = $opts->{account};
    my $user;
    my $domain;

    VUser::Email::split_address( $cfg, $account, \$user, \$domain );
    
    die "account must be in form user\@domain" if( !$user or !$domain );

    if (defined $user_exists
	and not &$user_exists($cfg, $opts, $account)) {
	$log->log(LOG_NOTICE, "Deleting unknown user $account");
	die "Deleting unknown user $account";
    }

    my $userdir = get_home_directory( $cfg, $user, $domain );
    rm_r ("$userdir");
}

sub domain_mod {
    my ($cfg, $opts, $action, $eh) = @_;

    my $domain = $opts->{domain};
    my $new_domain = $opts->{newdomain};



( run in 0.871 second using v1.01-cache-2.11-cpan-5511b514fd6 )