/usr/share/usermin/forward
NameSizeModeActions
images/-0755rm
ulang/-0755rm
autoreply-file-lib.pl23390755editdlrm
autoreply.pl129800755editdlrm
CHANGELOG13340644editdlrm
config710644editdlrm
config-msc-linux710644editdlrm
config.info2970644editdlrm
config.info.ca3330755editdlrm
config.info.de2990644editdlrm
config.info.el5840644editdlrm
config.info.nl3350644editdlrm
config.info.no3040644editdlrm
edit_afile.cgi9000755editdlrm
edit_alias.cgi3530755editdlrm
edit_ffile.cgi17660755editdlrm
edit_forward.cgi6040755editdlrm
edit_rfile.cgi26950755editdlrm
edit_vacation.cgi23030755editdlrm
edit_vfile.cgi18510755editdlrm
filter.pl20360755editdlrm
forward-lib.pl116420755editdlrm
index.cgi59890755editdlrm
module.info1950644editdlrm
module.info.ar00644editdlrm
module.info.ar.auto2270644editdlrm
module.info.bg00644editdlrm
module.info.bg.auto2680644editdlrm
module.info.ca420644editdlrm
module.info.ca.auto1250644editdlrm
module.info.cs360644editdlrm
module.info.cs.auto1190644editdlrm
module.info.da00644editdlrm
module.info.da.auto1550644editdlrm
module.info.de1050644editdlrm
module.info.el00644editdlrm
module.info.el.auto3550644editdlrm
module.info.es260644editdlrm
module.info.es.auto1270644editdlrm
module.info.eu00644editdlrm
module.info.eu.auto1760644editdlrm
module.info.fa00644editdlrm
module.info.fa.auto2290644editdlrm
module.info.fi00644editdlrm
module.info.fi.auto1610644editdlrm
module.info.fr260644editdlrm
module.info.fr.auto1170644editdlrm
module.info.hr00644editdlrm
module.info.hr.auto1640644editdlrm
module.info.hu310644editdlrm
module.info.hu.auto1380644editdlrm
module.info.it00644editdlrm
module.info.it.auto1470644editdlrm
module.info.ja250644editdlrm
module.info.ja.auto1430644editdlrm
module.info.ko00644editdlrm
module.info.ko.auto1800644editdlrm
module.info.ms00644editdlrm
module.info.ms.auto1520644editdlrm
module.info.nl420644editdlrm
module.info.nl.auto1290644editdlrm
module.info.no370644editdlrm
module.info.no.auto1170644editdlrm
module.info.pl1770644editdlrm
module.info.pl.auto1770644editdlrm
module.info.pt00644editdlrm
module.info.pt.auto1650644editdlrm
module.info.pt_BR490644editdlrm
module.info.pt_BR.auto1220644editdlrm
module.info.ru500644editdlrm
module.info.ru.auto2410644editdlrm
module.info.sk00644editdlrm
module.info.sk.auto1620644editdlrm
module.info.sv00644editdlrm
module.info.sv.auto1620644editdlrm
module.info.tr00644editdlrm
module.info.tr.auto1680644editdlrm
module.info.uk00644editdlrm
module.info.uk.auto2950644editdlrm
module.info.zh00644editdlrm
module.info.zh.auto1370644editdlrm
module.info.zh_TW00644editdlrm
module.info.zh_TW.auto1430644editdlrm
save_afile.cgi3720755editdlrm
save_alias.cgi30630755editdlrm
save_ffile.cgi6910755editdlrm
save_forward.cgi2990755editdlrm
save_rfile.cgi10510755editdlrm
save_simple.cgi21460755editdlrm
save_vacation.cgi10760755editdlrm
save_vfile.cgi7880755editdlrm
Edit: /usr/share/usermin/forward/forward-lib.pl (11642B)
# forward-lib.pl # Common functions for editing .forward BEGIN { push(@INC, ".."); }; use WebminCore; &init_config(); do 'autoreply-file-lib.pl'; # Copy scripts to /etc/usermin and set up smrsh if needed while we still can # (before a user switch) foreach $script ("autoreply.pl", "filter.pl") { local $rpath = "$module_root_directory/$script"; local $cpath = "$module_config_directory/$script"; local @rst = stat($rpath); local @cst = stat($cpath); if (!@cst || $cst[7] != $rst[7]) { ©_source_dest($rpath, $cpath); &set_ownership_permissions(undef, undef, 0755, $cpath); } if ($config{'smrsh_dir'} && !-r "$config{'smrsh_dir'}/$script") { symlink($cpath, "$config{'smrsh_dir'}/$script"); } } # If vacation is installed, link it from /etc/smrsh too $vacation_path = &has_command("vacation"); if ($vacation_path) { if ($config{'smrsh_dir'} && !-r "$config{'smrsh_dir'}/vacation") { symlink($vacation_path, "$config{'smrsh_dir'}/vacation"); } } &switch_to_remote_user(); &create_user_config_dirs(); $forward_file = "$remote_user_info[7]/.forward"; &foreign_require("mailbox", "mailbox-lib.pl"); $mail_path = &mailbox::mailbox_file(); # list_aliases() # Returns an array of data structures, each containing information about # one sendmail alias from .forward sub list_aliases { local($lnum, @rv, $file, $lalias); $lnum = 0; open(AFILE, $forward_file); while() { s/\r|\n//g; # remove newlines if (/^(#*)\s*(.*)$/) { local(%alias, @values, $v); $alias{'eline'} = $alias{'line'} = $lnum; $alias{'file'} = $forward_file; $alias{'enabled'} = $1 ? 0 : 1; $v = $alias{'value'} = $2; while($v =~ /^\s*,?\s*()"([^"]+)"(.*)$/ || $v =~ /^\s*,?\s*(\|)"([^"]+)"(.*)$/ || $v =~ /^\s*,?\s*()([^,\s]+)(.*)$/) { push(@values, $1.$2); $v = $3; } $alias{'values'} = \@values; $alias{'num'} = scalar(@rv); if (&indexof($alias{'name'}, @skip) < 0) { push(@rv, \%alias); $lalias = \%alias; } } elsif (/^(#*)\s+(\S.*)$/ && $lalias && ($1 && !$lalias->{'enabled'} || !$1 && $lalias->{'enabled'})) { # continuation of last alias $lalias->{'eline'} = $lnum; local $v = $2; $lalias->{'value'} .= $v; while($v =~ /^\s*,?\s*()"([^"]+)"(.*)$/ || $v =~ /^\s*,?\s*(\|)"([^"]+)"(.*)$/ || $v =~ /^\s*,?\s*()([^,\s]+)(.*)$/) { push(@{$lalias->{'values'}}, $1.$2); $v = $3; } } else { $lalias = undef; } $lnum++; } close(AFILE); return @rv; } # alias_form([alias]) # Display a form for editing or creating an alias. Each alias can map to # 1 or more programs, files, lists or users sub alias_form { local($a, @values, $v, $type, $val, @typenames); $a = $_[1]; if ($a) { @values = @{$a->{'values'}}; } @typenames = map { $text{"aform_type$_"} } (0 .. 8); $typenames[0] = "<$typenames[0]>"; my @js; for($i=0; $i<=@values; $i++) { ($type, $val) = $values[$i] ? &alias_type($values[$i]) : (0, ""); push @js,"document.forms[0].val_$i.disabled=".(($type==0||$type==7||$type==8)?"true":"false") } &ui_print_header(undef, $_[0],"", undef, undef, undef, undef, undef,undef, "onload=\"".join(";",@js)."\""); print "
\n"; if ($a) { print "\n"; print "\n"; } else { print "\n"; } print "\n"; print "\n"; print "
",$a ? $text{'aform_edit'} : $text{'aform_create'},"
\n"; if ($config{'mail_system'} == 0) { print "\n"; printf "\n", !$a || $a->{'enabled'} ? "" : "checked"; } else { print "\n"; printf "\n", $a->{'name'}; } local %types = map { $_, 1 } split(/\,/, $config{'types'}); $types{8} = $types{5}; for($i=0; $i<=@values; $i++) { ($type, $val) = $values[$i] ? &alias_type($values[$i]) : (0, ""); print "\n"; print "\n"; } print "\n"; print "
$text{'aform_enabled'} $text{'yes'}\n", !$a || $a->{'enabled'} ? "checked" : ""; printf " $text{'no'}
$text{'aform_name'} %s\n", $a->{'name'} ? '' : 'checked', $remote_user; print " " x 3; printf " %s-", $a->{'name'} ? 'checked' : '', $remote_user; printf "
$text{'aform_val'}\n"; print "\n"; local $lnk = $config{'mail_system'} == 1 ? "file=$a->{'file'}" : "num=$a->{'num'}"; if ($type == 2 && $a) { print "", "$text{'aform_afile'}\n"; } elsif ($type == 5 && $a) { print "", "$text{'aform_afile'}\n"; } elsif ($type == 6 && $a) { print "", "$text{'aform_afile'}\n"; } elsif ($type == 8 && $a) { print "$text{'aform_vacation'}\n"; } print "
\n"; if ($a) { print "\n"; print "\n"; } else { print "\n"; } print "
\n"; &ui_print_footer("index.cgi?simple=0", $text{'index_return'}); } # create_alias(&details) # Create a new alias sub create_alias { if ($config{'mail_system'} == 0) { &open_tempfile(AFILE, ">>$forward_file"); &print_tempfile(AFILE, $_[0]->{'enabled'} ? "" : "# ", join(',', map { /\s/ ? "\"$_\"" : $_ } @{$_[0]->{'values'}}),"\n"); &close_tempfile(AFILE); &set_forward_perms(); } else { &open_tempfile(AFILE, ">$remote_user_info[7]/". ($_[0]->{'name'} ? ".qmail-$_[0]->{'name'}" : ".qmail")); foreach $v (@{$_[0]->{'values'}}) { &print_tempfile(AFILE, $v,"\n"); } &close_tempfile(AFILE); } } # delete_alias(&details) sub delete_alias { if ($config{'mail_system'} == 0) { local $lref = &read_file_lines($_[0]->{'file'}); local $len = $_[0]->{'eline'} - $_[0]->{'line'} + 1; splice(@$lref, $_[0]->{'line'}, $len); &flush_file_lines(); } else { unlink("$remote_user_info[7]/$_[0]->{'file'}"); } } # modify_alias(&old, &details) # Update some existing alias sub modify_alias { if ($config{'mail_system'} == 0) { local $str = ($_[1]->{'enabled'} ? "" : "# ") . join(',', map { /\s/ ? "\"$_\"" : $_ } @{$_[1]->{'values'}}); local $lref = &read_file_lines($_[0]->{'file'}); local $len = $_[0]->{'eline'} - $_[0]->{'line'} + 1; splice(@$lref, $_[0]->{'line'}, $len, $str); &flush_file_lines(); } else { &delete_alias($_[0]); &create_alias($_[1]); } } # alias_type(string) # Return the type and destination of some alias string sub alias_type { local @rv; if ($_[0] =~ /^\|($user_module_config_directory|$module_config_directory)\/autoreply.pl\s+(\S+)/) { @rv = (5, $2); } elsif ($_[0] =~ /^\|($user_module_config_directory|$module_config_directory)\/filter.pl\s+(\S+)/) { @rv = (6, $2); } elsif ($vacation_path && $_[0] =~ /^\|$vacation_path\s*(.*)/) { @rv = (8, $1); } elsif ($_[0] =~ /^\|(.*)$/) { @rv = (4, $1); } elsif ($_[0] eq $mail_path) { @rv = (7, undef); } elsif ($_[0] =~ /^(\..*)$/ && $config{'mail_system'} == 1) { @rv = (3, $1); } elsif ($_[0] =~ /^(\/.*)$/) { @rv = (3, $1); } elsif ($_[0] =~ /^:include:(.*)$/ && $config{'mail_system'} == 0) { @rv = (2, $1); } elsif ($_[0] =~ /^\\($remote_user)$/ && $config{'mail_system'} == 0) { @rv = (7, undef); } elsif ($remote_user =~ /^(\S+)\@(\S+)$/ && $_[0] eq "\\$1-$2" && $config{'mail_system'} == 0) { # Virtualmin created user for Postfix when username contains @ @rv = (7, undef); } elsif ($_[0] =~ /^&(.*)$/) { @rv = (1, $1); } else { @rv = (1, $_[0]); } return wantarray ? @rv : $rv[0]; } # list_dotqmails() # Returns a list of .qmail* files in the user's home directory sub list_dotqmails { local @rv; opendir(DIR, $remote_user_info[7]); while($f = readdir(DIR)) { next if ($f !~ /^\.qmail(-(\S+))?$/); push(@rv, &get_dotqmail($f)); } closedir(DIR); return @rv; } sub get_dotqmail { $_[0] =~ /^\.qmail(-(\S+))?$/; local $alias = { 'file' => $_[0], 'name' => $2 }; open(AFILE, "$remote_user_info[7]/$_[0]"); while() { s/\r|\n//g; s/#.*$//g; if (/\S/) { push(@{$alias->{'values'}}, $_); } } close(AFILE); return $alias; } sub set_forward_perms { chmod(0644, $forward_file); } sub make_absolute { if ($_[0] =~ /^\//) { return $_[0]; } else { return "$remote_user_info[7]/$_[0]"; } } sub make_relative { if ($_[0] =~ /^\Q$remote_user_info[7]\/\E(.*)$/) { return $1; } else { return $_[0]; } } # get_simple() # If the current forwarding rules are simple (local delivery, autoreply # and forwarding only), return a hash ref containing the settings. Otherwise, # return undef. sub get_simple { local @aliases = &list_aliases(); local $simple; foreach my $a (@aliases) { foreach my $v (@{$a->{'values'}}) { local ($atype, $aval) = &alias_type($v); if ($atype == 1) { # Forward to an address return undef if ($simple->{'forward'}); $simple->{'forward'} = $aval; } elsif ($atype == 7) { # Local delivery $simple->{'local'} = 1; } elsif ($atype == 5) { # Usermin autoreply program return undef if ($simple->{'autoreply'}); $simple->{'autoreply'} = &make_absolute($aval); $simple->{'auto'} = 1; &read_autoreply($simple->{'autoreply'}, $simple); } else { # Some un-supported rule return undef; } } } $simple ||= { 'local' => 1 }; # if no settings, assume local delivery if (!$simple->{'autoreply'}) { # Get autoreply message from default file $simple->{'autoreply'} = &make_absolute("autoreply.txt"); &read_autoreply($simple->{'autoreply'}, $simple); } return $simple; } # save_simple(&simple) # Creates a .forward file with the given simple settings sub save_simple { local ($simple) = @_; if ($simple->{'local'} && !$simple->{'forward'} && !$simple->{'auto'}) { # If doing only local delivery, just remove .forward &unlink_file($forward_file); } else { # Need to create .forward &open_tempfile(FORWARD, ">$forward_file"); if ($simple->{'local'}) { if ($remote_user =~ /^(\S+)\@(\S+)$/ && defined(getpwnam("$1-$2"))) { # Handle users created by Virtualmin for Postfix # with @ in names &print_tempfile(FORWARD, "\\$1-$2\n"); } else { &print_tempfile(FORWARD, "\\$remote_user\n"); } } if ($simple->{'forward'}) { &print_tempfile(FORWARD, $simple->{'forward'},"\n"); } if ($simple->{'auto'}) { local $afile = $simple->{'autoreply'}; &print_tempfile(FORWARD, "\"|$module_config_directory/autoreply.pl $afile $remote_user\"\n"); } &close_tempfile(FORWARD); &set_forward_perms(); } if ($simple->{'autotext'}) { # Save autoreply text if (!$simple->{'autoreply'}) { # Create autoreply file $simple->{'autoreply'} = "$remote_user_info[7]/autoreply.txt"; } &write_autoreply($simple->{'autoreply'}, $simple); } } 1;