forward/0040775000567100000120000000000007510774776012234 5ustar jcameronwheelforward/images/0040775000567100000120000000000007430416474013466 5ustar jcameronwheelforward/images/icon.gif0100644000567100000120000000061507431332671015077 0ustar jcameronwheelGIF89a00ãÌÌÌÿÿÿ™™™fffÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ!þMade with GIMP!ù,00þÉI«½8ëÍ;`(Žd z¬lë¾°€Nê`öïDO²Bµ+º È_pF4: †‚R8tZ Щ°¹ÊétÖÖò@æÔ¾-/ËËɇ }«wïv÷^Μq8utm€z|~iaFK{}\7‹bp”aŽq™V›œžŸŒ—ª«¬­®¯¡§T´–µ¸³¹µ»¼T¾¿3ÁÂÄÅÇÈÊ˦·ÎÉÐÑÌÓÔÏ)&ÛÜ'¶Ù)¤¥ßž‚ha>ZÄ‘¤HR@ä£â+Pðc¢óôXêeÊ‘ÔzƒÓ0]ε™Ä‚ 5xIsP¢ ‡àP:Hqcž‹)œ* #HY|49J;z+bÉÃ%Í25¤‚ųgÎk@ƒNˆ;forward/lang/0040775000567100000120000000000007510772620013137 5ustar jcameronwheelforward/lang/fr0100644000567100000120000000670607442004640013467 0ustar jcameronwheelindex_title=Règles de gestion des messages index_desc=Ce module vous permet de définir des règles de gestion des messages qui vous sont envoyés sur ce serveur. Si vous choisissez de définir des règles, vos messages ne seront plus délivrés dans votre boîte aux lettres, à moins que vous ne le spécifiez dans l'une des règles. index_none=Aucune règle de gestion n'est définie. Tous les messages seront delivrés normalement dans votre bôite aux lettres. index_add=Ajouter une règle de gestion. index_return=règles de gestion des messages aliases_to=Règle de gestion aliases_from=Message destiné à.. aliases_type1=Transférer à $1 aliases_type2=Transférer aux adresses listées dans le fichier $1 aliases_type3=Ecrire dans le fichier $1 aliases_type4=Passer au programme $1 aliases_type5=Répondre automatiquement avec le message contenu dans le fichier $1 aliases_type6=Appliquer les filtres du fichier $1 aliases_type7=Délivrer dans ma boîte aux lettres aliases_enabled=Activée? aform_type0=(aucune) aform_type1=Transférer à... aform_type2=Transférer aux adresses listées dans le fichier... aform_type3=Stocker dans le fichier... aform_type4=Passer au programme... aform_type5=Répondre automatiquement avec le message contenu dans le fichier... aform_type6=Appliquer les filtres du fichier... aform_type7=Délivrer dans ma boîte aux lettres aform_edit=Editer une règle de gestion aform_create=Ajouter une règle de gestion aform_enabled=Activée? aform_val=Action aform_afile=Modifier.. aform_return=règle de gestion aform_name=Message destiné à... afile_title=Edition du fichier d'adresses afile_desc=Utilisez la zone de texte ci-dessous pour modifier les adresses du fichier $1 afile_undo=Annuler les modifications afile_ewrite=Erreur lors de l'écriture dans le fichier d'adresses : $1 asave_err=Impossible de sauvegarder la règle de gestion asave_eaddr='$1' n'est pas une adresse valide asave_etype1='$1' n'est pas une adresse email valide asave_etype2=Le fichier d'adresse '$1' n'est pas valide ou n'existe pas asave_etype3='$1' n'est pas un nom de fichier valide asave_etype4='$1' n'est pas un programme valide ou n'existe pas asave_etype5=Le fichier de réponse automatique '$1' n'est pas valide asave_etype4none=Vous devez indiquer un programme asave_etype6=Le fichier de filtres '$1' n'est pas valide asave_ename=L'adresse e-mail manque ou est invalide asave_esame=Un alias pour cette adresse existe déjà ffile_title=Edition du fichier de filtres ffile_desc=Utilisez le formulaire ci-dessous pour définir les filtres du fichier $1. ffile_efile=Vous n'avez pas la permission d'éditer $1. ffile_line=Si le champ $1 $2 $3 alors transférer à $4 ffile_from=expéditeur ffile_to=destinataire ffile_subject=sujet ffile_cc=CC ffile_body=corps du message ffile_what0=ne correspond pas à ffile_what1=correpond à ffile_other=sinon transférer à $1 ffile_err=La sauvegarde du fichier de filtres a échoué ffile_ematch=Correspondance manquante ffile_eaction=Vous devez indiquer une adresse de transfert ffile_ewrite=Erreur lors de l'écriture dans le fichier de filtre : $1 rfile_title=Edition du fichier de réponse automatique rfile_desc=Utilisez la zone de texte ci-dessous pour éditer le message de réponse automatique $1. Ce message peut contenir les macros $SUBJECT, $FROM, $TO, $DATE et $BODY qui seront résolues lorsque le message sera envoyé. rfile_efile=Vous n'avez pas la permission d'éditer le fichier $1. rfile_undo=Annuler les modifications rfile_ewrite=Erreur lors de l'écriture dans le fichier de réponse automatique : $1 forward/lang/en0100664000567100000120000000630707510772620013467 0ustar jcameronwheelindex_title=Mail Forwarding index_desc=This module allows you to setup forwarding for email sent to your account on this server. If you choose to forward mail, it will no longer be delivered to your mailbox unless specified in one of the forwarding rules. index_none=No mail forwarding is setup. All mail will be delivered only to your mailbox. index_add=Add a mail forwarding rule. index_return=mail forwarding index_edit=Edit $1 file manually. aliases_to=Forward to.. aliases_from=Mail for.. aliases_type1=Address $1 aliases_type2=Addresses in file $1 aliases_type3=File $1 aliases_type4=Program $1 aliases_type5=Autoreply file $1 aliases_type6=Apply filter file $1 aliases_type7=Normal user mailbox aliases_enabled=Enabled? aform_type0=None aform_type1=Email address aform_type2=Addresses in file aform_type3=Write to file aform_type4=Feed to program aform_type5=Autoreply from file aform_type6=Apply filter file aform_type7=Normal user mailbox aform_edit=Edit Mail Forwarding aform_create=Add Mail Forwarding aform_enabled=Enabled? aform_val=Alias to aform_afile=Edit.. aform_return=alias aform_name=Mail for.. afile_title=Edit Address File afile_desc=Use the text area below to edit the addresses in the file $1. afile_undo=Undo Changes afile_ewrite=Failed to write to addresses file : $1 asave_err=Failed to save forwarding asave_eaddr='$1' is not a valid address asave_etype1='$1' is not a valid email address asave_etype2=Addresses file '$1' is not valid or does not exist asave_etype3='$1' is not a valid filename asave_etype4='$1' is not a valid program or does not exist asave_etype5=Autoreply file '$1' is not valid asave_etype4none=No program given asave_etype6=Filter file '$1' is not valid asave_etype1q=Qmail does not support :include: asave_etype2q=Qmail requires the Mailbox path to be set by system administrator asave_ename=Missing or invalid mail for name asave_esame=An alias for that address already exists asave_enone=Nothing was selected to forward to ffile_title=Edit Filter File ffile_desc=Use the form below to setup filter rules in the file $1. ffile_efile=You are not allowed to edit $1. ffile_line=If the $1 field $2 $3 then forward to $4 ffile_from=from ffile_to=to ffile_subject=subject ffile_cc=CC ffile_body=body ffile_what0=doesn't match ffile_what1=matches ffile_other=Otherwise forward to $1 ffile_err=Failed to save filter file ffile_ematch=Missing match ffile_eaction=Missing forwarding address ffile_ewrite=Failed to write to filter file : $1 rfile_title=Edit Autoreply File rfile_desc=Use the text area below to edit the autoreply message in $1. The message may contain the macros $SUBJECT, $FROM, $TO, $DATE and $BODY which will be expanded when the autoreply is activated. rfile_desc2=You can also set mail headers that add to or replace the defaults used in the autoreply by putting lines like:
From: foo@bar.com
Subject: On holiday
at the top of the message, separated from the body by a single blank line. rfile_efile=You are not allowed to edit $1. rfile_undo=Undo Changes rfile_ewrite=Failed to write to autoreply file : $1 edit_title=Edit Forward File edit_desc=This page allows you to manually edit the contents of your $1 file. Be careful, as no error checking is done on your input. forward/lang/de0100664000567100000120000000645107463122757013464 0ustar jcameronwheelindex_title=E-Mail-Weiterleitung index_desc=Mit diesem Modul können Sie Ihre E-Mail weiterleiten. In diesem Fall wird Ihre E-Mail nicht mehr auf dem lokalen System zugestellt, sofern Sie dies nicht ausdrücklich in einer der Regeln angeben. index_none=Keine Weiterleitung; alle Mail wird lokal zugestellt. index_add=Neue Weiterleitung hinzufügen index_return=mail forwarding index_edit=Edit $1 file manually. aliases_to=Weiteleiten an.. aliases_from=Mail an... aliases_type1=Adresse $1 aliases_type2=Adressen in Datei $1 aliases_type3=Datei/Verzeichnis $1 aliases_type4=Programm $1 aliases_type5=Automatisch mit Datei $1 antworten aliases_type6=Filtern durch Filterdatei $1 aliases_type7=Lokales Postfach aliases_enabled=Aktiv? aform_type0=Keine aform_type1=E-Mail-Adresse aform_type2=E-Mail-Addressen in Datei aform_type3=Datei/Verzeichnis aform_type4=Programm aform_type5=Automatisch antworten mit Datei aform_type6=Filtern durch Filterdatei aform_type7=Lokales Postfach aform_edit=Weiterleitung bearbeiten aform_create=Weiterleitung hinzufügen aform_enabled=Aktiv? aform_val=Weiterleiten an aform_afile=Bearbeiten... aform_return=alias aform_name=Mail an... afile_title=Adressdatei bearbeiten afile_desc=Sie können hier die Adressen in der Datei $1 ändern. afile_undo=Änderungen rückgängig machen afile_ewrite=Konnte Datei nicht schreiben: $1 asave_err=Konnte Einstellungen nicht sichern asave_eaddr='$1' ist keine gültige Adresse asave_etype1='$1' ist keine gültige E-Mail-Adresse asave_etype2=Die Datei '$1' ist keine gültige Adressdatei oder existiert nicht asave_etype3='$1' ist kein gültiger Dateiname asave_etype4='$1' ist kein gültiger Programmname oder existiert nicht asave_etype5=Die Datei '$1' ist keine gültige Datei für automatische Antworten asave_etype4none=Kein Programm angegeben asave_etype6=Die Datei '$1' ist keine gültige Filterdatei asave_etype1q=Qmail unterstützt :include: nicht asave_etype2q=Bei Qmail muss der pfad für Ihr lokales Postfach vom Systemadministrator konfiguriert werden asave_ename=Die Adresse, für die eine Weiterleitung definiert werden soll, ist ungültig asave_esame=Ein Alias für diese Adresse existiert bereits ffile_title=Filterdatei bearbeiten ffile_desc=Sie können hier die Filterdatei $1 bearbeiten. ffile_efile=Zugriff auf Datei $1 Zugriff verweigert. ffile_line=$1 vergleichen mit Regelausdruck $3, bei $2 weiterleiten an $4 ffile_from=From (Absender) ffile_to=To (Empfänger) ffile_subject=Subject (Betreff) ffile_cc=CC (Kopie an) ffile_body=Inhalt der Mail ffile_what0=Übereinstimmung ffile_what1=keiner Übereinstimmung ffile_other=Andernfalls weiterleiten an $1 ffile_err=Konnte Filterdatei nicht schreiben ffile_ematch=Regelausdruck fehlt ffile_eaction=Zieladresse fehlt ffile_ewrite=Konnte Datei nicht speichern : $1 rfile_title=Text für automatische Antwort bearbeiten rfile_desc=Sie können hier die Antwort in der Datei $1 bearbeiten. Sie könne die Makros $SUBJECT, $FROM, $TO, $DATE und $BODY verwenden, die durch den jeweiligen Wert ersetzt werden, wenn eine automatische Antwort verschickt wird. rfile_efile=Zugriff auf die Datei $1 verweigert. rfile_undo=Änderungen rückgängig machen rfile_ewrite=Konnte Datei nicht schreiben : $1 edit_title=Weiterleitung von Hand bearbeiten edit_desc=Sie können hier den Inhalt der Datei $1 von Hand bearbeiten. Vorsicht, es erfolgt keine Überprüfung auf Fehler. forward/index.cgi0100775000567100000120000000557407451721023014017 0ustar jcameronwheel#!/usr/local/bin/perl # index.cgi # Display mail forwarding from .forward file require './forward-lib.pl'; &header($text{'index_title'}, "", undef, 0, 1); print "
\n"; print "
$text{'index_desc'}

\n"; if ($config{'mail_system'} == 0) { # Sendmail forwarding @aliases = &list_aliases(); if (@aliases) { # find a good place to split $lines = 0; for($i=0; $i<@aliases; $i++) { $aline[$i] = $lines; $al = scalar(@{$aliases[$i]->{'values'}}); $lines += ($al ? $al : 1); } $midline = int(($lines+1) / 2); for($mid=0; $mid<@aliases && $aline[$mid] < $midline; $mid++) { } # render tables print "
\n"; &aliases_table(@aliases[0..$mid-1]); print "\n"; if ($mid < @aliases) { &aliases_table(@aliases[$mid..$#aliases]); } print "
\n"; } else { print "$text{'index_none'}

\n"; } print "",&text('index_edit', ".forward"),"   \n"; } else { # Qmail forwarding @aliases = &list_dotqmails(); if (@aliases) { # find a good place to split $lines = 0; for($i=0; $i<@aliases; $i++) { $aline[$i] = $lines; $al = scalar(@{$aliases[$i]->{'values'}}); $lines += ($al ? $al : 1); } $midline = int(($lines+1) / 2); for($mid=0; $mid<@aliases && $aline[$mid] < $midline; $mid++) { } # render tables print "
\n"; &dotqmail_table(@aliases[0..$mid-1]); print "\n"; if ($mid < @aliases) { &dotqmail_table(@aliases[$mid..$#aliases]); } print "
\n"; } else { print "$text{'index_none'}

\n"; } } print "$text{'index_add'}

\n"; print "


\n"; &footer("/", $text{'index'}); sub aliases_table { print "\n"; print "\n"; foreach $a (@_) { print "\n"; print "\n"; printf "\n", $a->{'enabled'} ? $text{'yes'} : "$text{'no'}"; print "\n"; } print "
$text{'aliases_to'} $text{'aliases_enabled'}
{'num'}\">"; foreach $v (@{$a->{'values'}}) { ($anum, $astr) = &alias_type($v); print &text("aliases_type$anum", "$astr"),"
\n"; } print "
%s
\n"; } sub dotqmail_table { print "\n"; print "\n"; foreach $a (@_) { print "\n"; print "\n"; } print "
$text{'aliases_from'} $text{'aliases_to'}
{'file'}\">", $a->{'name'} ? "$remote_user-$a->{'name'}" : $remote_user, " \n"; foreach $v (@{$a->{'values'}}) { ($anum, $astr) = &alias_type($v); print &text("aliases_type$anum", "$astr"),"
\n"; } print "
\n"; } forward/module.info0100664000567100000120000000012507514524111014345 0ustar jcameronwheeldesc=Mail Forwarding desc_de=Mailweiterleitung category=mail usermin=1 version=0.932 forward/edit_alias.cgi0100755000567100000120000000054707463122757015013 0ustar jcameronwheel#!/usr/local/bin/perl # edit_alias.cgi # Edit an existing .forward entry require './forward-lib.pl'; &ReadParse(); if (!$in{'new'}) { if ($in{'file'}) { $a = &get_dotqmail($in{'file'}); } else { @aliases = &list_aliases(); $a = $aliases[$in{'num'}]; } &alias_form($text{'aform_edit'}, $a); } else { &alias_form($text{'aform_create'}, $a); } forward/forward-lib.pl0100664000567100000120000001655507510773543015001 0ustar jcameronwheel# forward-lib.pl # Common functions for editing .forward do '../web-lib.pl'; &init_config(); &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 .. 7); $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)?"true":"false") } &header($_[0],"", undef, undef, undef, undef, undef,undef, "onload=\"".join(";",@js)."\""); print "
\n"; 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'}; } 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"; $script .= ""; print "\n"; 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"; } print "
\n"; if ($a) { print "\n"; print "\n"; } else { print "\n"; } print "
\n"; print $script; print "
\n"; &footer("", $text{'index_return'}); } # create_alias(&details) # Create a new alias sub create_alias { if ($config{'mail_system'} == 0) { open(AFILE, ">>$forward_file"); print AFILE $_[0]->{'enabled'} ? "" : "# ", join(',', map { /\s/ ? "\"$_\"" : $_ } @{$_[0]->{'values'}}),"\n"; close(AFILE); } else { open(AFILE, ">$remote_user_info[7]/". ($_[0]->{'name'} ? ".qmail-$_[0]->{'name'}" : ".qmail")); foreach $v (@{$_[0]->{'values'}}) { print AFILE $v,"\n"; } close(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\/autoreply.pl\s+(\S+)/) { @rv = (5, $1); } elsif ($_[0] =~ /^\|$user_module_config_directory\/filter.pl\s+(\S+)/) { @rv = (6, $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 ($_[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; } 1; forward/save_alias.cgi0100755000567100000120000000474307510772620015017 0ustar jcameronwheel#!/usr/local/bin/perl # save_alias.cgi # Save or delete a new or existing .forward entry require './forward-lib.pl'; &ReadParse(); &error_setup($text{'asave_err'}); if (!$in{'new'}) { if ($config{'mail_system'} == 0) { @aliases = &list_aliases(); $a = $aliases[$in{'num'}]; } else { $a = &get_dotqmail($in{'file'}); } } if ($in{'delete'}) { # delete some alias $loga = $a; &delete_alias($a); } else { # saving or creating .. check inputs for($i=0; defined($t = $in{"type_$i"}); $i++) { $v = $in{"val_$i"}; if ($t == 1 && $v !~ /^(\S+)$/) { &error(&text('asave_etype1', $v)); } elsif ($t == 3 && $v !~ /^\/(\S+)$/ && $config{'mail_system'} == 0) { &error(&text('asave_etype3', $v)); } elsif ($t == 3 && $v !~ /^[\/\.](\S+)$/ && $config{'mail_system'} == 1) { &error(&text('asave_etype3', $v)); } elsif ($t == 4) { $v =~ /^(\S+)/ || &error($text{'asave_etype4none'}); -x $1 || &error(&text('asave_etype4', $1)); } elsif ($t == 2 && $config{'mail_system'} == 1) { &error(&text('asave_etype1q', $v)); } elsif ($t == 7 && $config{'mail_system'} == 1 && !$mail_path) { &error(&text('asave_etype2q', $v)); } if ($t >= 2 && $t <= 6 && $v !~ /^\//) { # Path is relative to home dir $v = "$remote_user_info[7]/$v"; } if ($t == 1 || $t == 3) { push(@values, $v); } elsif ($t == 2) { push(@values, ":include:$v"); } elsif ($t == 4) { push(@values, "|$v"); } elsif ($t == 5) { # Setup autoreply script push(@values, "|$user_module_config_directory/autoreply.pl $v $remote_user"); system("cp autoreply.pl $user_module_config_directory"); } elsif ($t == 6) { # Setup filter script push(@values, "|$user_module_config_directory/filter.pl $v $remote_user"); system("cp filter.pl $user_module_config_directory"); } elsif ($t == 7) { push(@values, $config{'mail_system'} ? $mail_path : "\\$remote_user"); } } @values || &error($text{'asave_enone'}); $newa{'values'} = \@values; if ($config{'mail_system'} == 0) { $newa{'enabled'} = $in{'enabled'}; } else { $in{'name_def'} || $in{'name'} =~ /^\S+$/ || &error($text{'asave_ename'}); $newa{'name'} = $in{'name_def'} ? undef : $in{'name'}; if ($in{'new'} || $newa{'name'} ne $a->{'name'}) { @aliases = &list_dotqmails(); ($same) = grep { $_->{'name'} eq $newa{'name'} } @aliases; $same && &error($text{'asave_esame'}); } } if ($in{'new'}) { &create_alias(\%newa); } else { &modify_alias($a, \%newa); } $loga = \%newa; } &redirect(""); forward/edit_afile.cgi0100775000567100000120000000144607430654237015000 0ustar jcameronwheel#!/usr/local/bin/perl # edit_afile.cgi # Display the contents of an address file require './forward-lib.pl'; &ReadParse(); &header($text{'afile_title'}, ""); print "
\n"; open(FILE, $in{'file'}); @lines = ; close(FILE); print "",&text('afile_desc', "$in{'file'}"),"

\n"; print "

\n"; print "\n"; print "\n"; print "

\n"; print " ", "\n"; print "

\n"; print "
\n"; &footer("edit_alias.cgi?num=$in{'num'}", $text{'aform_return'}); forward/save_afile.cgi0100775000567100000120000000043107430654265015003 0ustar jcameronwheel#!/usr/local/bin/perl # save_afile.cgi # Save an addresses file require './forward-lib.pl'; &ReadParseMime(); $in{'text'} =~ s/\r//g; $in{'text'} =~ s/\n*$/\n/; open(FILE, ">$in{'file'}") || &error(&text('afile_ewrite', $!)); print FILE $in{'text'}; close(FILE); &redirect(""); forward/autoreply.pl0100775000567100000120000000527707502037275014613 0ustar jcameronwheel#!/usr/local/bin/perl # autoreply.pl # Simple autoreply script # read sendmail module config $p = -l $0 ? readlink($0) : $0; $p =~ /^(.*)\/[^\/]+$/; if (open(CONF, "$1/config")) { while() { if (/^(\S+)=(.*)/) { $config{$1} = $2; } } close(CONF); } else { # Make some guesses about sendmail if (-x "/usr/sbin/sendmail") { %config = ( 'sendmail_path' => '/usr/sbin/sendmail' ); } elsif (-x "/usr/lib/sendmail") { %config = ( 'sendmail_path' => '/usr/lib/sendmail' ); } else { die "Failed to find sendmail or config file"; } } # read headers and body while() { s/\r|\n//g; if (/^(\S+):\s+(.*)/) { $header{lc($1)} = $2; } elsif (!$_) { last; } } while() { $body .= $_; } if ($header{'from'} =~ /mailer-daemon/i) { print STDERR "Cancelling autoreply to bounced email\n"; exit 1; } if ($header{'x-webmin-autoreply'}) { print STDERR "Cancelling autoreply to an autoreply\n"; exit 1; } # work out the correct to address @to = ( &split_addresses($header{'to'}), &split_addresses($header{'cc'}), &split_addresses($header{'bcc'}) ); $to = $to[0]->[0]; foreach $t (@to) { if ($t->[0] =~ /^([^\@\s]+)/ && $1 eq $ARGV[1]) { $to = $t->[0]; } } # build list of default reply headers $rheader{'From'} = $to; $rheader{'To'} = $header{'reply-to'} ? $header{'reply-to'} : $header{'from'}; $rheader{'Subject'} = "Autoreply to $header{'subject'}"; $rheader{'X-Webmin-Autoreply'} = 1; $rheader{'X-Originally-To'} = $header{'to'}; # read the autoreply file if (open(AUTO, $ARGV[0])) { while() { s/\$SUBJECT/$header{'subject'}/g; s/\$FROM/$header{'from'}/g; s/\$TO/$to/g; s/\$DATE/$header{'date'}/g; s/\$BODY/$body/g; if (/^(\S+):\s*(.*)/ && !$doneheaders) { $rheader{$1} = $2; } else { $rbody .= $_; $doneheaders = 1; } } close(AUTO); } else { $rbody = "Autoreply file $ARGV[0] does not exist!\n"; } # run sendmail and feed it the reply open(MAIL, "|$config{'sendmail_path'} -t"); foreach $h (keys %rheader) { print MAIL "$h: $rheader{$h}\n"; } print MAIL "\n"; print MAIL $rbody; close(MAIL); # split_addresses(string) # Splits a comma-separated list of addresses into [ email, real-name ] pairs sub split_addresses { local (@rv, $str = $_[0]); while(1) { if ($str =~ /^[\s,]*(([^<>\(\)\s]+)\s+\(([^\(\)]+)\))(.*)$/) { push(@rv, [ $2, $3, $1 ]); $str = $4; } elsif ($str =~ /^[\s,]*("([^"]+)"\s+<([^\s<>]+)>)(.*)$/ || $str =~ /^[\s,]*(([^<>]+)\s+<([^\s<>]+)>)(.*)$/ || $str =~ /^[\s,]*(([^<>\[\]]+)\s+\[mailto:([^\s\[\]]+)\])(.*)$/|| $str =~ /^[\s,]*(()<([^\s<>]+)>)(.*)/ || $str =~ /^[\s,]*(()([^\s<>,]+))(.*)/) { push(@rv, [ $3, $2, $1 ]); $str = $4; } else { last; } } return @rv; } forward/filter.pl0100775000567100000120000000350707430663343014047 0ustar jcameronwheel#!/usr/local/bin/perl # filter.pl # read sendmail module config $p = -l $0 ? readlink($0) : $0; $p =~ /^(.*)\/[^\/]+$/; if (open(CONF, "$1/config")) { while() { if (/^(\S+)=(.*)/) { $config{$1} = $2; } } close(CONF); } else { # Make some guesses about sendmail if (-x "/usr/sbin/sendmail") { %config = ( 'sendmail_path' => '/usr/sbin/sendmail' ); } elsif (-x "/usr/lib/sendmail") { %config = ( 'sendmail_path' => '/usr/lib/sendmail' ); } else { die "Failed to find sendmail or config file"; } } # read headers and body $fromline = ; while() { $headers .= $_; s/\r|\n//g; if (/^(\S+):\s+(.*)/) { $header{lc($1)} = $2; } elsif (!$_) { last; } } while() { $body .= $_; } # read the filter file if (open(FILTER, $ARGV[0])) { while() { s/\r|\n//g; if (/^(\S+)\s+(\S+)\s+(\S+)\s+(.*)$/) { push(@filter, [ $1, $2, $3, $4 ]); } elsif (/^(\S+)\s+(\S+)$/) { push(@filter, [ $1, $2 ]); } } close(FILTER); } else { print STDERR "Filter file $ARGV[0] does not exist!\n"; exit 1; } # run the filter to find the first matching rule open(LOG, ">>$ARGV[0].log"); foreach $f (@filter) { local $field = $f->[2] eq 'body' ? $body : $header{$f->[2]}; local $st = 0; if ($f->[0] == 0) { $st = ($field !~ /$f->[3]/i); } elsif ($f->[0] == 1) { $st = ($field =~ /$f->[3]/i); } elsif ($f->[0] == 2) { $st = 1; } if ($st) { # The rule matched! if ($f->[1] =~ /^\//) { # Write to a file open(MAIL, ">>$f->[1]"); print MAIL $fromline; } else { # Forward to another address $f->[1] =~ s/\\/\\\\/g; $f->[1] =~ s/'/\\'/g; open(MAIL, "|$config{'sendmail_path'} '$f->[1]'"); } print MAIL $headers; print MAIL $body; close(MAIL); $now = localtime(time()); print LOG "[$now] [$header{'from'}] [",join(" ",@$f),"]\n"; last; } } forward/edit_rfile.cgi0100775000567100000120000000150107474340672015014 0ustar jcameronwheel#!/usr/local/bin/perl # edit_rfile.cgi # Display the contents of an autoreply file require './forward-lib.pl'; &ReadParse(); &header($text{'rfile_title'}, ""); print "
\n"; open(FILE, $in{'file'}); @lines = ; close(FILE); print &text('rfile_desc', "$in{'file'}"),"

\n"; print "$text{'rfile_desc2'}

\n"; print "

\n"; print "\n"; print "\n"; print "

\n"; print " ", "\n"; print "

\n"; print "
\n"; &footer("edit_alias.cgi?num=$in{'num'}", $text{'aform_return'}); forward/save_rfile.cgi0100775000567100000120000000037607436575364015044 0ustar jcameronwheel#!/usr/local/bin/perl # save_rfile.cgi # Save an autoreply file require './forward-lib.pl'; &ReadParseMime(); $in{'text'} =~ s/\r//g; open(FILE, ">$in{'file'}") || &error(&text('rfile_ewrite', $!)); print FILE $in{'text'}; close(FILE); &redirect(""); forward/edit_ffile.cgi0100775000567100000120000000320707430661513014775 0ustar jcameronwheel#!/usr/local/bin/perl # edit_ffile.cgi # Allow editing of a filter config file require './forward-lib.pl'; &ReadParse(); &header($text{'ffile_title'}, ""); print "
\n"; open(FILE, $in{'file'}); while() { s/\r|\n//g; if (/^(\S+)\s+(\S+)\s+(\S+)\s+(.*)$/) { push(@filter, [ $1, $2, $3, $4 ]); } elsif (/^(2)\s+(\S+)$/) { $other = $2; } } close(FILE); print "",&text('ffile_desc', "$in{'file'}"),"

\n"; print "

\n"; print "\n"; print "\n"; $i = 0; foreach $f (@filter, [ 1, '', '', '' ]) { $field = "\n"; $what = "\n"; $match = "\n"; $action = "\n"; print &text('ffile_line', $field, $what, $match, $action),"
\n"; $i++; } print &text('ffile_other', ""),"
\n"; print "\n"; print "
\n"; print "
\n"; &footer("edit_alias.cgi?num=$in{'num'}", $text{'aform_return'}); forward/save_ffile.cgi0100775000567100000120000000113107436575373015016 0ustar jcameronwheel#!/usr/local/bin/perl # save_ffile.cgi # Save a filter file require './forward-lib.pl'; &ReadParseMime(); &error_setup($text{'ffile_err'}); for($i=0; defined($in{"field_$i"}); $i++) { next if (!$in{"field_$i"}); $in{"match_$i"} || &error($text{'ffile_ematch'}); $in{"action_$i"} || &error($text{'ffile_eaction'}); push(@filter, $in{"what_$i"}." ".$in{"action_$i"}." ". $in{"field_$i"}." ".$in{"match_$i"}."\n"); } push(@filter, "2 ".$in{'other'}."\n") if ($in{'other'}); open(FILE, ">$in{'file'}") || &error(&text('ffile_ewrite', $!)); print FILE @filter; close(FILE); &redirect(""); forward/config-msc-linux0100664000567100000120000000001607436564771015332 0ustar jcameronwheelmail_system=1 forward/config.info0100664000567100000120000000006707463130207014334 0ustar jcameronwheelmail_system=Mail system installed,1,0-Sendmail,1-Qmail forward/config0100664000567100000120000000001607436564757013421 0ustar jcameronwheelmail_system=0 forward/edit_forward.cgi0100775000567100000120000000112707451721613015354 0ustar jcameronwheel#!/usr/local/bin/perl # edit_forward.cgi # Display a form for editing the .forward file manually require './forward-lib.pl'; &header($text{'edit_title'}, ""); print "
\n"; print &text('edit_desc', ".forward"),"

\n"; print "

\n"; print "
\n"; print "
\n"; print "
\n"; &footer("", $text{'index_return'}); forward/save_forward.cgi0100775000567100000120000000037307451722102015361 0ustar jcameronwheel#!/usr/local/bin/perl # save_forward.cgi # Save the manually edited .forward file require './forward-lib.pl'; &ReadParseMime(); $in{'forward'} =~ s/\r//g; open(FORWARD, ">$forward_file"); print FORWARD $in{'forward'}; close(FORWARD); &redirect("");