148 lines
4.0 KiB
Plaintext
148 lines
4.0 KiB
Plaintext
{
|
|
$OUT = '';
|
|
|
|
# Generate qmail user assignments for pseudonyms. These will
|
|
# be handled by ~user/.qmail in the case of a user pseudonym
|
|
# or by ~admin/.qmail in the case of a system pseudonym or by
|
|
# alias/.qmail-groupname in the case of a group pseudonym.
|
|
|
|
my (undef, undef, $uid, $gid, undef, undef, undef, $dir, undef)
|
|
= getpwnam("alias");
|
|
|
|
# It is almost impossible to get Text::Template to output nothing
|
|
# on failure. It can be done by removing the newline at the end of
|
|
# this file but that is messy. Therefore, we'll simply return an
|
|
# error message that will make qmail-newu fail. Also send a
|
|
# warning message that will be captured in the logs.
|
|
|
|
unless (defined $uid && defined $gid && defined $dir)
|
|
{
|
|
my $msg =
|
|
"Failed to obtain user details for \'alias\' "
|
|
. "while processing pseudonym assignments.";
|
|
|
|
warn "$msg\n";
|
|
$OUT = $msg;
|
|
return;
|
|
}
|
|
|
|
my $alias_assign = "alias:${uid}:${gid}:${dir}";
|
|
|
|
undef $uid;
|
|
undef $gid;
|
|
undef $dir;
|
|
|
|
(undef, undef, $uid, $gid, undef, undef, undef, $dir, undef)
|
|
= getpwnam("admin");
|
|
|
|
unless (defined $uid && defined $gid && defined $dir)
|
|
{
|
|
my $msg =
|
|
"Failed to obtain user details for \'admin\' "
|
|
. "while processing pseudonym assignments.";
|
|
|
|
warn "$msg\n";
|
|
$OUT = $msg;
|
|
return;
|
|
}
|
|
|
|
my $admin_assign = "admin:${uid}:${gid}:${dir}";
|
|
|
|
# Create assignments for each pseudonym.
|
|
|
|
use esmith::AccountsDB;
|
|
my $adb = esmith::AccountsDB->open_ro();
|
|
|
|
foreach $pseudonym ( $adb->pseudonyms )
|
|
{
|
|
next if ( $pseudonym->key =~ /@/ ); # user@domain goes in virtualdomains
|
|
|
|
my $account = $pseudonym->prop('Account');
|
|
unless ($account)
|
|
{
|
|
my $key = $pseudonym->key;
|
|
warn "pseudonym $key has no account property, default to admin";
|
|
$account = $adb->get('admin');
|
|
#next;
|
|
}
|
|
|
|
$account = $adb->get($pseudonym->prop('Account'));
|
|
unless ($account)
|
|
{
|
|
my $key = $pseudonym->key;
|
|
warn "pseudonym $key points to account which does not exist, default to admin";
|
|
$account = $adb->get('admin');
|
|
#next;
|
|
}
|
|
|
|
my $i = 1;
|
|
while ( $account->prop('type') eq "pseudonym")
|
|
{
|
|
$account = $adb->get($account->prop('Account'));
|
|
unless ($account)
|
|
{
|
|
my $key = $pseudonym->key;
|
|
warn "pseudonym $key points to account which does not exist, default to admin";
|
|
$account = $adb->get('admin');
|
|
last;
|
|
}
|
|
$i ++; last if $i>10;
|
|
}
|
|
|
|
if ($account->prop('type') eq "pseudonym")
|
|
{
|
|
warn "users/assign: Skipping " . $pseudonym->key . " - too many pseudonym levels\n";
|
|
next;
|
|
}
|
|
|
|
if ($account->prop('type') eq "user")
|
|
{
|
|
my (undef, undef, $uid, $gid, undef, undef, undef, $dir, undef)
|
|
= getpwnam($account->key);
|
|
|
|
unless (defined $uid && defined $gid && defined $dir)
|
|
{
|
|
my $msg =
|
|
"Failed to obtain user details for \'" . $account->key . "\' "
|
|
. "while processing pseudonym assignments.";
|
|
|
|
warn "$msg\n";
|
|
$OUT = $msg;
|
|
return;
|
|
}
|
|
|
|
$assign = $account->key . ":${uid}:${gid}:${dir}";
|
|
|
|
# Assign mail for user_pseudonym@
|
|
$OUT .= "=" . $pseudonym->key . ":${assign}:::\n";
|
|
$OUT .= "+" . $pseudonym->key . "-:${assign}:-::\n";
|
|
next;
|
|
}
|
|
|
|
if ($account->prop('type') eq "group" || $account->key eq "shared")
|
|
{
|
|
$OUT .= "=" . $pseudonym->key . ":${alias_assign}:-:" . $account->key . ":\n";
|
|
$OUT .= "+" . $pseudonym->key . "-:${alias_assign}:-:" . $account->key . ":\n";
|
|
next;
|
|
}
|
|
|
|
if ($account->prop('type') eq "system" )
|
|
{
|
|
$OUT .= "=" . $pseudonym->key . ":${admin_assign}:::\n";
|
|
$OUT .= "+" . $pseudonym->key . "-:${admin_assign}:-::\n";
|
|
next;
|
|
}
|
|
}
|
|
|
|
# Need to remove the final newline character. Blank lines in
|
|
# /var/qmail/users/assign are prohibited.
|
|
|
|
chomp($OUT);
|
|
|
|
# Failsafe: /var/qmail/users/assign cannot have blank lines.
|
|
# Therefore, if $OUT is empty, simply set up an assign for the
|
|
# alias user.
|
|
|
|
$OUT = "=alias:${alias_assign}:::" unless $OUT;
|
|
}
|