/
usr
/
share
/
usermin
/
forward
/
/usr/share/usermin/forward
mkdir
upload
Name
Size
Mode
Actions
images/
-
0755
rm
ulang/
-
0755
rm
autoreply-file-lib.pl
2339
0755
edit
dl
rm
autoreply.pl
12980
0755
edit
dl
rm
CHANGELOG
1334
0644
edit
dl
rm
config
71
0644
edit
dl
rm
config-msc-linux
71
0644
edit
dl
rm
config.info
297
0644
edit
dl
rm
config.info.ca
333
0755
edit
dl
rm
config.info.de
299
0644
edit
dl
rm
config.info.el
584
0644
edit
dl
rm
config.info.nl
335
0644
edit
dl
rm
config.info.no
304
0644
edit
dl
rm
edit_afile.cgi
900
0755
edit
dl
rm
edit_alias.cgi
353
0755
edit
dl
rm
edit_ffile.cgi
1766
0755
edit
dl
rm
edit_forward.cgi
604
0755
edit
dl
rm
edit_rfile.cgi
2695
0755
edit
dl
rm
edit_vacation.cgi
2303
0755
edit
dl
rm
edit_vfile.cgi
1851
0755
edit
dl
rm
filter.pl
2036
0755
edit
dl
rm
forward-lib.pl
11642
0755
edit
dl
rm
index.cgi
5989
0755
edit
dl
rm
module.info
195
0644
edit
dl
rm
module.info.ar
0
0644
edit
dl
rm
module.info.ar.auto
227
0644
edit
dl
rm
module.info.bg
0
0644
edit
dl
rm
module.info.bg.auto
268
0644
edit
dl
rm
module.info.ca
42
0644
edit
dl
rm
module.info.ca.auto
125
0644
edit
dl
rm
module.info.cs
36
0644
edit
dl
rm
module.info.cs.auto
119
0644
edit
dl
rm
module.info.da
0
0644
edit
dl
rm
module.info.da.auto
155
0644
edit
dl
rm
module.info.de
105
0644
edit
dl
rm
module.info.el
0
0644
edit
dl
rm
module.info.el.auto
355
0644
edit
dl
rm
module.info.es
26
0644
edit
dl
rm
module.info.es.auto
127
0644
edit
dl
rm
module.info.eu
0
0644
edit
dl
rm
module.info.eu.auto
176
0644
edit
dl
rm
module.info.fa
0
0644
edit
dl
rm
module.info.fa.auto
229
0644
edit
dl
rm
module.info.fi
0
0644
edit
dl
rm
module.info.fi.auto
161
0644
edit
dl
rm
module.info.fr
26
0644
edit
dl
rm
module.info.fr.auto
117
0644
edit
dl
rm
module.info.hr
0
0644
edit
dl
rm
module.info.hr.auto
164
0644
edit
dl
rm
module.info.hu
31
0644
edit
dl
rm
module.info.hu.auto
138
0644
edit
dl
rm
module.info.it
0
0644
edit
dl
rm
module.info.it.auto
147
0644
edit
dl
rm
module.info.ja
25
0644
edit
dl
rm
module.info.ja.auto
143
0644
edit
dl
rm
module.info.ko
0
0644
edit
dl
rm
module.info.ko.auto
180
0644
edit
dl
rm
module.info.ms
0
0644
edit
dl
rm
module.info.ms.auto
152
0644
edit
dl
rm
module.info.nl
42
0644
edit
dl
rm
module.info.nl.auto
129
0644
edit
dl
rm
module.info.no
37
0644
edit
dl
rm
module.info.no.auto
117
0644
edit
dl
rm
module.info.pl
177
0644
edit
dl
rm
module.info.pl.auto
177
0644
edit
dl
rm
module.info.pt
0
0644
edit
dl
rm
module.info.pt.auto
165
0644
edit
dl
rm
module.info.pt_BR
49
0644
edit
dl
rm
module.info.pt_BR.auto
122
0644
edit
dl
rm
module.info.ru
50
0644
edit
dl
rm
module.info.ru.auto
241
0644
edit
dl
rm
module.info.sk
0
0644
edit
dl
rm
module.info.sk.auto
162
0644
edit
dl
rm
module.info.sv
0
0644
edit
dl
rm
module.info.sv.auto
162
0644
edit
dl
rm
module.info.tr
0
0644
edit
dl
rm
module.info.tr.auto
168
0644
edit
dl
rm
module.info.uk
0
0644
edit
dl
rm
module.info.uk.auto
295
0644
edit
dl
rm
module.info.zh
0
0644
edit
dl
rm
module.info.zh.auto
137
0644
edit
dl
rm
module.info.zh_TW
0
0644
edit
dl
rm
module.info.zh_TW.auto
143
0644
edit
dl
rm
save_afile.cgi
372
0755
edit
dl
rm
save_alias.cgi
3063
0755
edit
dl
rm
save_ffile.cgi
691
0755
edit
dl
rm
save_forward.cgi
299
0755
edit
dl
rm
save_rfile.cgi
1051
0755
edit
dl
rm
save_simple.cgi
2146
0755
edit
dl
rm
save_vacation.cgi
1076
0755
edit
dl
rm
save_vfile.cgi
788
0755
edit
dl
rm
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(<AFILE>) { 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 "<form method=post action=save_alias.cgi name=edit_aliases>\n"; if ($a) { print "<input type=hidden name=num value='$a->{'num'}'>\n"; print "<input type=hidden name=file value='$a->{'file'}'>\n"; } else { print "<input type=hidden name=new value=1>\n"; } print "<table border>\n"; print "<tr $tb> <td><b>",$a ? $text{'aform_edit'} : $text{'aform_create'},"</b></td> </tr>\n"; print "<tr $cb> <td><table>\n"; if ($config{'mail_system'} == 0) { print "<tr> <td><b>$text{'aform_enabled'}</b></td>\n"; printf "<td><input type=radio name=enabled value=1 %s> $text{'yes'}\n", !$a || $a->{'enabled'} ? "checked" : ""; printf "<input type=radio name=enabled value=0 %s> $text{'no'}</td></tr>\n", !$a || $a->{'enabled'} ? "" : "checked"; } else { print "<tr> <td><b>$text{'aform_name'}</b></td>\n"; printf "<td><input type=radio name=name_def value=1 %s> <tt>%s</tt>\n", $a->{'name'} ? '' : 'checked', $remote_user; print " " x 3; printf "<input type=radio name=name_def value=0 %s> <tt>%s-</tt>", $a->{'name'} ? 'checked' : '', $remote_user; printf "<input name=name size=20 value='%s'></td> </tr>\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 "<tr> <td valign=top><b>$text{'aform_val'}</b></td>\n"; print "<td><select name=type_$i onchange=\"". "document.forms[0].val_$i.disabled=(this.value=='0'||this.value=='7'||this.value=='8');\">\n"; for($j=0; $j<@typenames; $j++) { next if ($j == 2 && $config{'mail_system'} == 1); next if ($j == 7 && $config{'mail_system'} == 1 && !$mail_path); next if ($j == 8 && !$vacation_path); next if ($j && !$types{$j}); printf "<option value=$j %s>$typenames[$j]\n", $type == $j ? "selected" : ""; } print "</select>\n"; print "<input name=val_$i size=30 value=\"$val\">\n"; local $lnk = $config{'mail_system'} == 1 ? "file=$a->{'file'}" : "num=$a->{'num'}"; if ($type == 2 && $a) { print "<a href='edit_afile.cgi?$lnk&vfile=$val'>", "$text{'aform_afile'}</a>\n"; } elsif ($type == 5 && $a) { print "<a href='edit_rfile.cgi?$lnk&vfile=$val'>", "$text{'aform_afile'}</a>\n"; } elsif ($type == 6 && $a) { print "<a href='edit_ffile.cgi?$lnk&vfile=$val'>", "$text{'aform_afile'}</a>\n"; } elsif ($type == 8 && $a) { print "<a href='edit_vacation.cgi?$lnk&idx=$i'>$text{'aform_vacation'}</a>\n"; } print "</td></tr>\n"; } print "<tr> <td colspan=2 align=right>\n"; if ($a) { print "<input type=submit value=$text{'save'}>\n"; print "<input type=submit name=delete value=$text{'delete'}>\n"; } else { print "<input type=submit value=$text{'create'}>\n"; } print "</td> </tr>\n"; print "</table></td></tr></table></form>\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(<AFILE>) { 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;
Save
cmd:
run