END
our $usage2 = <<'END';
actions
- create [REDIRECT-TO] [#comment]
- update LOCAL-PART [REDIRECT-TO] [#comment]
- reject LOCAL-PART
+ create [REDIRECT] [#COMMENT]
+ update LOCAL-PART [REDIRECT] [#COMMENT]
show LOCAL-PART
list
list-actions
+empty value for REDIRECT means reject
+END
+our $usage3 = <<'END';
privileged actions
list-user USER
insert-exact LOCAL-PART USER REDIRECT COMMENT
}
my $pa = $row->{'localpart'};
$pa .= '@'.$dom if defined $dom;
- if (defined $row->{'redirect'}) {
+ if (length $row->{'redirect'}) {
print "$pa: $row->{'redirect'}" or die $!;
} else {
print "# reject $pa" or die $!;
sub qualify (\$) {
my ($ref) = @_;
- if (defined $$ref && $$ref !~ m/\@/) {
+ if (defined $$ref && $$ref =~ m/[^\041-\177]/) {
+ die "bad characters in redirection target\n";
+ }
+ if (defined $$ref && length $$ref && $$ref !~ m/\@/) {
die "unqualified redirection target\n" unless defined $qualdom;
$$ref .= '@'.$qualdom;
}
prow($row);
}
-sub action_reject {
- my $localpart = nextarg;
- nomoreargs;
- begin_row($localpart);
- $dbh->do("UPDATE addrs SET redirect=NULL WHERE localpart=?",
- {}, $localpart);
- $dbh->commit;
-}
-
sub action_show {
my $localpart = nextarg;
nomoreargs;
sub action_insert_exact {
die unless $priv;
- my $localpart = nextarg;
- $user = nextarg;
- my $redirect = nextarg;
+ my $row = { };
+ $row->{'localpart'} = nextarg;
+ $row->{'user'} = $user = nextarg;
+ $row->{'redirect'} = nextarg;
+ $row->{'comment'} = nextarg;
nomoreargs;
- my $row = {'localpart'=>$localpart, 'user'=>$user, 'redirect'=>$redirect};
insertrow($row);
$dbh->commit;
}
} elsif (s/^-C/-/) {
$showcomment = 1;
} elsif (s/^-h/-/) {
- print $usage1.$usage2 or die $!;
+ print $usage1.$usage2.$usage3 or die $!;
exit 0;
} else {
die "unknown option \`$_'\n";