utf-8 support fixed

pretty names work again
fixed check for added mail addresses
config_all added
error messages for list creation clarified
This commit is contained in:
lars 2005-12-24 10:01:08 +00:00
parent 126291edf7
commit 2b79935e9e
12 changed files with 280 additions and 77 deletions

View file

@ -102,4 +102,4 @@ Version 3.0 - 12/21/02005
* commas are not necessary anymore in webusers file * commas are not necessary anymore in webusers file
* support for MAIL_DOMAIN config setting * support for MAIL_DOMAIN config setting
* requires the clearsilver template engine * requires the clearsilver template engine
* changed directory for safely removed mailinglists

View file

@ -6,8 +6,6 @@ support for:
* charset * charset
* show log * show log
split filter and manipulate
allow dynamic addition of user-made config templates (seperate directory, ...) allow dynamic addition of user-made config templates (seperate directory, ...)
language switch support language switch support

View file

@ -201,10 +201,21 @@ elsif ($action eq '' || $action eq 'list_select') {
} elsif (($action eq 'config_ask') || ($action eq 'config_do')) { } elsif (($action eq 'config_ask') || ($action eq 'config_do')) {
# User wants to see/change the configuration ... # User wants to see/change the configuration ...
my $subset = $q->param('config_subset'); my $subset = $q->param('config_subset');
if (defined($q->param('list')) && ($subset ne '') if (defined($q->param('list')) && ($subset ne '')) {
&& ($subset =~ /^[\w]*$/) && (-e "$TEMPLATE_DIR/config_$subset" . ".cs")) { if ($subset =~ m/^RESERVED-([\w_-]*)$/) {
$success = 'UpdateConfig' if (($action eq 'config_do') && &update_config()); $pagename = $1
$pagename = 'config_' . $subset; } elsif (($subset =~ /^[\w]*$/) && (-e "$TEMPLATE_DIR/config_$subset" . ".cs")) {
$pagename = 'config_' . $subset;
} else {
$pagename = '';
}
if ($pagename ne '') {
$success = 'UpdateConfig' if (($action eq 'config_do') && &update_config());
} else {
$error = 'UnknownConfigPage';
warn "missing config page: $subset";
$pagename = 'list_select';
}
} else { } else {
$error = 'ParameterMissing'; $error = 'ParameterMissing';
$pagename = 'list_select'; $pagename = 'list_select';
@ -299,7 +310,7 @@ sub output_page {
die "sub template ($TEMPLATE_DIR/$pagename.cs) not found!" unless (-e "$TEMPLATE_DIR/$pagename.cs"); die "sub template ($TEMPLATE_DIR/$pagename.cs) not found!" unless (-e "$TEMPLATE_DIR/$pagename.cs");
# print http header # print http header
print "Content-Type: text/html\n\n"; print "Content-Type: text/html; charset=utf-8\n\n";
my $cs = ClearSilver::CS->new($pagedata); my $cs = ClearSilver::CS->new($pagedata);
@ -398,12 +409,20 @@ sub set_pagedata4list
&set_pagedata4part_list($part_type) if ($part_type ne ''); &set_pagedata4part_list($part_type) if ($part_type ne '');
$i = 0; $i = 0;
my $item; my $address;
my $addr_name;
my %pretty;
tie %pretty, "DB_File", "$LIST_DIR/$listname/webnames" if ($PRETTY_NAMES);
# TODO: use "pretty" output style for visible mail address # TODO: use "pretty" output style for visible mail address
foreach $item ($list->subscribers($part_type)) { foreach $address (sort $list->subscribers($part_type)) {
$pagedata->setValue("Data.List.Subscribers." . $i, "$item") unless ($item eq ''); if ($address ne '') {
$pagedata->setValue("Data.List.Subscribers." . $i . '.address', "$address");
$addr_name = ($PRETTY_NAMES)? $pretty{$address} : '';
$pagedata->setValue("Data.List.Subscribers." . $i . '.name', $addr_name);
}
$i++; $i++;
} }
untie %pretty if ($PRETTY_NAMES);
$pagedata->setValue("Data.List.hasDenyList", 1) if ($list->isdeny); $pagedata->setValue("Data.List.hasDenyList", 1) if ($list->isdeny);
$pagedata->setValue("Data.List.hasAllowList", 1) if ($list->isallow); $pagedata->setValue("Data.List.hasAllowList", 1) if ($list->isallow);
@ -496,7 +515,7 @@ sub set_pagedata4options {
# they have no meaning, so we should adapt them to reality # they have no meaning, so we should adapt them to reality
$pagedata->setValue("Data.List.Options.t" , 1) $pagedata->setValue("Data.List.Options.t" , 1)
if (-e "$dir_of_list/text/trailer"); if (-e "$dir_of_list/text/trailer");
$pagedata->setValue("Data.List.Options.p" , 1) $pagedata->setValue("Data.List.Options.f" , 1)
if (-e "$dir_of_list/prefix"); if (-e "$dir_of_list/prefix");
$pagedata->setValue("Data.List.Options.x" , 1) $pagedata->setValue("Data.List.Options.x" , 1)
if ((-e "$dir_of_list/mimeremove") || (-e "$dir_of_list/mimereject")); if ((-e "$dir_of_list/mimeremove") || (-e "$dir_of_list/mimereject"));
@ -568,22 +587,30 @@ sub delete_list {
# they don't show up. That way they can always be recovered by a helpful # they don't show up. That way they can always be recovered by a helpful
# sysadmin should he/she be in the mood :) # sysadmin should he/she be in the mood :)
my $SAFE_DIR = "$LIST_DIR/_deleted_lists";
mkdir "$SAFE_DIR", 0700 if (! -e "$SAFE_DIR");
# look for an unused directory name
my $i = 0;
while (-e "$SAFE_DIR/" . $q->param('list') . "-$i") { $i++; }
$SAFE_DIR .= '/' . $q->param('list') . "-$i";
my ($oldfile); $oldfile = "$LIST_DIR/" . $q->param('list'); my ($oldfile); $oldfile = "$LIST_DIR/" . $q->param('list');
my ($newfile); $newfile = "$LIST_DIR/." . $q->param('list'); unless (move($oldfile, $SAFE_DIR)) {
unless (move($oldfile, $newfile)) {
$warning = 'SafeRemoveRenameDirFailed'; $warning = 'SafeRemoveRenameDirFailed';
return (1==0); return (1==0);
} }
mkdir "$HOME_DIR/deleted.qmail", 0700 if(!-e "$HOME_DIR/deleted.qmail");
unless (opendir(DIR, "$HOME_DIR")) { unless (opendir(DIR, "$HOME_DIR")) {
$warning = 'DotQmailDirAccessDenied'; $warning = 'DotQmailDirAccessDenied';
return (1==0); return (1==0);
} }
# TODO: this could possibly move some qmail files of other lists - improve it!
my @files = map { "$HOME_DIR/$1" if m{^(\.qmail.+)$} } grep { /^\.qmail-$listaddress/ } readdir DIR; my @files = map { "$HOME_DIR/$1" if m{^(\.qmail.+)$} } grep { /^\.qmail-$listaddress/ } readdir DIR;
closedir DIR; closedir DIR;
foreach (@files) { foreach (@files) {
unless (move($_, "$HOME_DIR/deleted.qmail/")) { unless (move($_, "$SAFE_DIR")) {
$warning = 'SafeRemoveMoveDotQmailFailed'; $warning = 'SafeRemoveMoveDotQmailFailed';
return (1==0); return (1==0);
} }
@ -624,7 +651,7 @@ sub untaint {
next if($params[$i] eq 'mailaddressfile'); next if($params[$i] eq 'mailaddressfile');
foreach $param ($q->param($params[$i])) { foreach $param ($q->param($params[$i])) {
next if $param eq ''; next if $param eq '';
if ($param =~ /^([#-\@\w\.\/\[\]\:\n\r\>\< _]+)$/) { if ($param =~ /^([#-\@\w\.\/\[\]\:\n\r\>\< _"']+)$/) {
push @values, $1; push @values, $1;
} else { } else {
warn "Tainted input in '$params[$i]': " . $q->param($params[$i]); warn "Tainted input in '$params[$i]': " . $q->param($params[$i]);
@ -666,10 +693,11 @@ sub check_permission_for_action {
sub add_address { sub add_address {
# Add an address to a list .. # Add an address to a list ..
my ($address, $list, $part, @addresses, $count); my ($address, $list, $part, @addresses, $fail_count);
$list = new Mail::Ezmlm("$LIST_DIR/" . $q->param('list')); $list = new Mail::Ezmlm("$LIST_DIR/" . $q->param('list'));
$part = &get_list_part(); $part = &get_list_part();
$fail_count = 0;
if (($q->param('mailaddressfile')) && ($FILE_UPLOAD)) { if (($q->param('mailaddressfile')) && ($FILE_UPLOAD)) {
# Sanity check # Sanity check
@ -684,9 +712,12 @@ sub add_address {
my($fh) = $q->param('mailaddressfile'); my($fh) = $q->param('mailaddressfile');
while (<$fh>) { while (<$fh>) {
next if (/^\s*$/ or /^#/); # blank, comments next if (/^\s*$/ or /^#/); # blank, comments
next unless ( /(\w[\-\w_\.]*)@(\w[\-\w_\.]+)/ ); # email address ... if ( /(\w[\-\w_\.]*)@(\w[\-\w_\.]+)/ ) {
chomp(); chomp();
push @addresses, "$_"; push @addresses, "$_";
} else {
$fail_count++;
}
} }
} }
@ -697,8 +728,8 @@ sub add_address {
$address .= $DEFAULT_HOST if ($q->param('mailaddress_add') =~ /\@$/); $address .= $DEFAULT_HOST if ($q->param('mailaddress_add') =~ /\@$/);
# untaint # untaint
if ($address =~ /(\w[\-\w_\.]*)@(\w[\-\w_\.]+)/) { if ($address =~ m/(\w[\-\w_\.]*)@(\w[\-\w_\.]+)/) {
push @addresses, "$1\@$2"; push @addresses, "$address";
} else { } else {
warn "invalid address to add: $address to $part"; warn "invalid address to add: $address to $part";
$warning = 'AddAddress'; $warning = 'AddAddress';
@ -707,23 +738,28 @@ sub add_address {
} }
$count = 0; my %pretty;
foreach $address (@addresses) { my $add;
tie %pretty, "DB_File", "$LIST_DIR/" . $q->param('list') . "/webnames" if ($PRETTY_NAMES);
foreach $address (@addresses) {
my($add) = Mail::Address->parse($address); ($add) = Mail::Address->parse($address);
if(defined($add->name()) && $PRETTY_NAMES) { if (($add->address() =~ /^\w[\w_-]*\@/) && !($list->issub($add->address(), $part))) {
my(%pretty); # it seems, that we cannot trust the return value of "$list->sub"
tie %pretty, "DB_File", "$LIST_DIR/" . $q->param('list') . "/webnames"; $list->sub($add->address(), $part);
$pretty{$add->address()} = $add->name(); if(defined($add->name()) && $PRETTY_NAMES) {
untie %pretty; $pretty{$add->address()} = $add->name();
} }
if ($list->issub($add->address(), $part)) {
$warning = 'AddAddress';
} else { } else {
$warning = 'AddAddress' unless ($list->sub($add->address(), $part)); $fail_count++;
} }
$count++; }
untie %pretty if ($PRETTY_NAMES);
if ($fail_count gt 0) {
$warning = 'AddAddress';
return (1==0);
} else {
return (0==0);
} }
} }
@ -823,8 +859,12 @@ sub create_list {
$warning = 'InvalidLocalPart'; $warning = 'InvalidLocalPart';
return (1==0); return (1==0);
} }
if(-e ("$LIST_DIR/$listname/lock") || -e ("$HOME_DIR/.qmail-$qmail")) { if (-e "$LIST_DIR/$listname/lock") {
$warning = 'ListAlreadyExists'; $warning = 'ListNameAlreadyExists';
return (1==0);
}
if (-e "$HOME_DIR/.qmail-$qmail") {
$warning = 'ListAddressAlreadyExists';
return (1==0); return (1==0);
} }
@ -1151,17 +1191,6 @@ sub webauth_create_allowed {
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
sub pretty_names {
return undef unless($PRETTY_NAMES);
my (%pretty, %prettymem);
tie %pretty, "DB_File", "$LIST_DIR/" . $q->param('list') . '/webnames';
%prettymem = %pretty;
untie %pretty;
return \%prettymem;
}
# -------------------------------------------------------------------------
sub rmtree { sub rmtree {
# A subroutine to recursively delete a directory (like rm -f). # A subroutine to recursively delete a directory (like rm -f).
# Based on the one in the perl cookbook :) # Based on the one in the perl cookbook :)

View file

@ -10,7 +10,7 @@ Lang {
Subscribers = AbonnentInnen Subscribers = AbonnentInnen
AllowList = Zulassungsliste AllowList = Zulassungsliste
DenyList = Ablehnungsliste DenyList = Ablehnungsliste
DigestList = Übersichtsliste DigestList = Zusammenfassung
ModList = ModeratorInnen ModList = ModeratorInnen
ConfigMain = Einstellungen ConfigMain = Einstellungen
ConfigSub = Einschreibung ConfigSub = Einschreibung
@ -18,6 +18,7 @@ Lang {
ConfigAdmin = Administration ConfigAdmin = Administration
ConfigArchive = Archivierung ConfigArchive = Archivierung
ConfigProcess = Verarbeitung ConfigProcess = Verarbeitung
ConfigAll = Übersicht
TextFiles = Texte TextFiles = Texte
ListSelect = Auswahl einer Liste ListSelect = Auswahl einer Liste
Properties = Eigenschaften von Properties = Eigenschaften von
@ -32,6 +33,7 @@ Lang {
ConfigAdmin = Fern-Administration der Liste ConfigAdmin = Fern-Administration der Liste
ConfigArchive = Archivierung der Liste ConfigArchive = Archivierung der Liste
ConfigProcess = Nachrichtenverarbeitung ConfigProcess = Nachrichtenverarbeitung
ConfigAll = Einstellungen im Überblick
SubscriberList = AbonnentInnen der Liste SubscriberList = AbonnentInnen der Liste
AllowList = Zugelassene Nutzer AllowList = Zugelassene Nutzer
DenyList = Abzuweisende Nutzer DenyList = Abzuweisende Nutzer
@ -62,6 +64,7 @@ Lang {
Forbidden = Fehler: dir fehlen die notwendigen Rechte für diese Aktion Forbidden = Fehler: dir fehlen die notwendigen Rechte für diese Aktion
ListDirUnavailable = Fehler beim Zugriff auf das Hauptverzeichnis der Listen! ListDirUnavailable = Fehler beim Zugriff auf das Hauptverzeichnis der Listen!
InvalidFileName = Der Dateiname ist nicht zulässig. InvalidFileName = Der Dateiname ist nicht zulässig.
UnknownConfigPage = Die gähle Konfigurations-Seite existiert nicht!
} }
@ -72,7 +75,8 @@ Lang {
DeleteList = Die Löschung der Mailingliste schlug fehl! DeleteList = Die Löschung der Mailingliste schlug fehl!
UpdateConfig = Beim Speichern der Einstellungen trat ein Fehler auf! UpdateConfig = Beim Speichern der Einstellungen trat ein Fehler auf!
SaveFile = Die Datei konnte nicht gespeichert werden! SaveFile = Die Datei konnte nicht gespeichert werden!
ListAlreadyExists = Es gibt bereits eine Liste mit diesem Namen. ListNameAlreadyExists = Es gibt bereits eine Liste mit diesem Namen.
ListAddressAlreadyExists = Es gibt bereits eine Liste mit dieser Adresse.
ListDoesNotExist = Eine Liste dieses Namens existiert nicht. ListDoesNotExist = Eine Liste dieses Namens existiert nicht.
ListDirAccessDenied = Fehler beim Zugriff auf das Verzeichnis der Liste ListDirAccessDenied = Fehler beim Zugriff auf das Verzeichnis der Liste
TextDirAccessDenied = Beim Zugriff auf das Text-Verzeichnis der Liste trat ein Fehler auf. TextDirAccessDenied = Beim Zugriff auf das Text-Verzeichnis der Liste trat ein Fehler auf.
@ -93,7 +97,7 @@ Lang {
SuccessMessage { SuccessMessage {
AddAddress = Einschreibung erfolgreich AddAddress = Einschreibung erfolgreich
DeleteAddress = Löschung erfolgreich abgeschlossen DeleteAddress = Austragung erfolgreich abgeschlossen
CreateList = Die neue Liste wurde erfolgreich angelegt. CreateList = Die neue Liste wurde erfolgreich angelegt.
DeleteList = Die Mailingliste wurde gelöscht. DeleteList = Die Mailingliste wurde gelöscht.
UpdateConfig = Die neuen Einstellungen wurden erfolgreich gespeichert. UpdateConfig = Die neuen Einstellungen wurden erfolgreich gespeichert.
@ -147,7 +151,7 @@ Lang {
ListName = Name der Liste ListName = Name der Liste
ListAddress = Addresse der Liste ListAddress = Addresse der Liste
ListOptions = Grundlegende Einstellungen ListOptions = Grundlegende Einstellungen
AllowedToEdit = Die Nutzer, die diese Liste per Web-Interface konfigurieren dürfen: AllowedToEdit = Nutzer, die diese Liste per Web-Interface konfigurieren dürfen:
HeaderRemove = zu entfernende Kopfzeilen HeaderRemove = zu entfernende Kopfzeilen
HeaderAdd = hinzuzufügende Kopfzeilen HeaderAdd = hinzuzufügende Kopfzeilen
MimeRemove = Nachrichtenbestandteile dieses Typs werden entfernt MimeRemove = Nachrichtenbestandteile dieses Typs werden entfernt
@ -182,12 +186,13 @@ Lang {
ConfigAdmin = Fern-AdministratorInnen sind (per Voreinstellung) auch ModeratorInnen für die Einschreibung und für eingesandte Mails. Sie können berechtigt sein, per Mail Nutzer ein- und auszutragen, sowie Textbausteine zu verändern. ConfigAdmin = Fern-AdministratorInnen sind (per Voreinstellung) auch ModeratorInnen für die Einschreibung und für eingesandte Mails. Sie können berechtigt sein, per Mail Nutzer ein- und auszutragen, sowie Textbausteine zu verändern.
ConfigArchive = Das Mailinglisten-Archiv ist per Mail verfügbar. Außerdem benötigst du ein Archiv, falls du vergangene Mails im Internet zur Verfügung stellen möchtest (z.B. mit ezmlm-www). ConfigArchive = Das Mailinglisten-Archiv ist per Mail verfügbar. Außerdem benötigst du ein Archiv, falls du vergangene Mails im Internet zur Verfügung stellen möchtest (z.B. mit ezmlm-www).
ConfigProcess = Die folgenden Regeln werden auf alle Mails angewandt, bevor sie an die AbonnentInnen verteilt werden. ConfigProcess = Die folgenden Regeln werden auf alle Mails angewandt, bevor sie an die AbonnentInnen verteilt werden.
ConfigMain = Die allgemeinen Eigenschaften bestimmen einige wichtige Verhaltensweisen der Mailingliste. ConfigMain = Hier findest du ein paar allgemeine Einstellungen der Mailingliste, die sich nicht in den themenorientierten Rubriken unterbringen ließen.
ConfigPosting = Die Einsende-Konfiguration bestimmt, wer Nachrichten einsenden darf und wie diese Mails verarbeitet werden sollen. ConfigPosting = Die Einsende-Konfiguration bestimmt, wer Nachrichten einsenden darf und welchen Bedingungen die Mails genügen müssen.
ConfigSub = Hier kannst du festlegen, wer sich als Abonnent selbständig eintragen darf und wie der Einschreibungsprozess abläuft. ConfigSub = Hier kannst du festlegen, wer sich als Abonnent selbständig eintragen darf und wie der Einschreibungsprozess abläuft.
ConfigAll = Diese Seite enthält alle verfügbaren Optionen auf einen Blick.
ListDelete = Die Mailingliste und alle damit verbundenen Daten werden hiermit vollständig entfernt. ListDelete = Die Mailingliste und alle damit verbundenen Daten werden hiermit vollständig entfernt.
AllowList = An die Adressen der Zulassungsliste werden keine Mails verschickt. Einsendungen durch diese Adressen werden so behandelt, als kämen sie von AbonnentInnen. Üblicherweise werden Aliase von AbonnentInnen in die Zulassungsliste eingetragen. AllowList = An die Adressen der Zulassungsliste werden keine Mails verschickt. Einsendungen von diesen Adressen werden so behandelt, als kämen sie von AbonnentInnen. Üblicherweise solltest du Aliase von AbonnentInnen in die Zulassungsliste eintragen.
DenyList = Falls du Mails von bestimmte Mailadressen verweigern möchtest, dann füge sie einfach zur (aktivierten) Ablehnungsliste hinzu Dies kann nützlich sein, um unbeliebte Nutzer auszuschließen oder um störende Abwesenheitsbenachrichtigungen zu verhindern. DenyList = Falls du Mails von bestimmte Mailadressen verweigern möchtest, dann füge sie einfach zur Ablehnungsliste hinzu Dies kann nützlich sein, um unbeliebte Nutzer auszuschließen oder um störende Abwesenheitsbenachrichtigungen zu verhindern.
DigestList = Einige AbonnentInnen deiner Mailingliste sind möglicherweise nicht an jeder einzelnen Nachricht interessiert, sondern ziehen es vor, stattdessen regelmäßig automatisch erstellte Zusammenfassungen zu erhalten. DigestList = Einige AbonnentInnen deiner Mailingliste sind möglicherweise nicht an jeder einzelnen Nachricht interessiert, sondern ziehen es vor, stattdessen regelmäßig automatisch erstellte Zusammenfassungen zu erhalten.
ModList = ModeratorInnen (für die Einschreibung von AbonnentInnen und die Einsendungen an die Liste) und Fern-AdministratorInnen können die Kontrolle über viele wichtige Aspekte der Liste übernehmen (falls du sie dementsprechend konfigurierst). ModList = ModeratorInnen (für die Einschreibung von AbonnentInnen und die Einsendungen an die Liste) und Fern-AdministratorInnen können die Kontrolle über viele wichtige Aspekte der Liste übernehmen (falls du sie dementsprechend konfigurierst).
SubscriberList = Die AbonnentInnen der Mailingliste empfangen alle versandten Nachrigten der Liste. Zudem kann es ihnen gestattet sein, Nachrichten direkt oder indirekt zur weiteren Verteilung an die Liste zu senden. Oft ist es anonymen Nutzern gestattet, sich selbständig in die Mailingliste einzuschreiben, ohne die Hilfe eines Administrators in Anspruch nehmen zu müssen. SubscriberList = Die AbonnentInnen der Mailingliste empfangen alle versandten Nachrigten der Liste. Zudem kann es ihnen gestattet sein, Nachrichten direkt oder indirekt zur weiteren Verteilung an die Liste zu senden. Oft ist es anonymen Nutzern gestattet, sich selbständig in die Mailingliste einzuschreiben, ohne die Hilfe eines Administrators in Anspruch nehmen zu müssen.
@ -202,6 +207,7 @@ Lang {
ConfigSub = Einschreibungsdetails ConfigSub = Einschreibungsdetails
ConfigMain = Allgemeine Listen-Einstellungen ConfigMain = Allgemeine Listen-Einstellungen
ConfigProcess = Verarbeitungsregeln ConfigProcess = Verarbeitungsregeln
ConfigAll = Einstellungen
ListCreate = Eigenschaften der neuen Liste ListCreate = Eigenschaften der neuen Liste
ListDelete = Löschung der Mailingliste ListDelete = Löschung der Mailingliste
RelevantOptions = Relevante Optionen RelevantOptions = Relevante Optionen

View file

@ -18,6 +18,7 @@ Lang {
ConfigAdmin = administration ConfigAdmin = administration
ConfigArchive = archive ConfigArchive = archive
ConfigProcess = processing ConfigProcess = processing
ConfigAll = overview
TextFiles = Text files TextFiles = Text files
ListSelect = Choose a list ListSelect = Choose a list
Properties = Properties of Properties = Properties of
@ -32,6 +33,7 @@ Lang {
ConfigAdmin = Remote administration ConfigAdmin = Remote administration
ConfigArchive = Archive options ConfigArchive = Archive options
ConfigProcess = Message processing ConfigProcess = Message processing
ConfigAll = Complete configuration
SubscriberList = Subscribers of the list SubscriberList = Subscribers of the list
AllowList = Allowed users AllowList = Allowed users
DenyList = Blocked users DenyList = Blocked users
@ -62,6 +64,7 @@ Lang {
Forbidden = Error: you are not allowed to do this! Forbidden = Error: you are not allowed to do this!
ListDirUnavailable = Could not create the list directory! ListDirUnavailable = Could not create the list directory!
InvalidFileName = The name of the file is invalid! InvalidFileName = The name of the file is invalid!
UnknownConfigPage = The chosen config page is invalid!
} }
@ -72,7 +75,8 @@ Lang {
DeleteList = Removal of mailing list failed! DeleteList = Removal of mailing list failed!
UpdateConfig = Update of configuration failed! UpdateConfig = Update of configuration failed!
SaveFile = The file could not be saved! SaveFile = The file could not be saved!
ListAlreadyExists = There is already a list with this name! ListNameAlreadyExists = There is already a list with this name!
ListAddressAlreadyExists = There is already a list with this address!
ListDoesNotExist = A list with this name does not exist! ListDoesNotExist = A list with this name does not exist!
ListDirAccessDenied = Unable to access the list's directory: ListDirAccessDenied = Unable to access the list's directory:
TextDirAccessDenied = Unable to access the list's directory of text files: TextDirAccessDenied = Unable to access the list's directory of text files:
@ -147,7 +151,7 @@ Lang {
ListName = List Name ListName = List Name
ListAddress = List Address ListAddress = List Address
ListOptions = Basic List Options ListOptions = Basic List Options
AllowedToEdit = Users allowed to edit this list via web interface AllowedToEdit = Users allowed to edit this list via web interface:
HeaderRemove = Headers to strip from all outgoing mail HeaderRemove = Headers to strip from all outgoing mail
HeaderAdd = Headers to add to all outgoing mail HeaderAdd = Headers to add to all outgoing mail
MimeRemove = Mime types to strip from all outgoing mail MimeRemove = Mime types to strip from all outgoing mail
@ -183,9 +187,10 @@ Lang {
ConfigAdmin = Remote administrators are (by default) also moderators for subscription and for posting. They may have the permission to (un)subscribe users and to change the text files of the list by sending emails to the mailing list software. ConfigAdmin = Remote administrators are (by default) also moderators for subscription and for posting. They may have the permission to (un)subscribe users and to change the text files of the list by sending emails to the mailing list software.
ConfigArchive = The mailing list archive can be accessed by mail. Additionally you will want to create a list archive, if you plan to publish it (e.g. with ezmlm-www). ConfigArchive = The mailing list archive can be accessed by mail. Additionally you will want to create a list archive, if you plan to publish it (e.g. with ezmlm-www).
ConfigProcess = Modify some message properties, before they are distributed to the subscribers. ConfigProcess = Modify some message properties, before they are distributed to the subscribers.
ConfigMain = The basic properties of a list define some important settings (e.g. mail address) and the general behaviour (public or closed). ConfigMain = Here you find some settings, that did not fit into any other category.
ConfigPosting = The posting configuration determines, who is allowed to send messages to the list and how these mails will be processed. ConfigPosting = The posting configuration determines, who is allowed to send messages to the list and how these mails will be processed.
ConfigSub = Here you may define, who is allowed to subscribe to the list and you can set some details of the subscription process. ConfigSub = Here you may define, who is allowed to subscribe to the list and you can set some details of the subscription process.
ConfigAll = This is the complete list of all available properties of the list. Usually it should be easier to use the topic-based configuration pages, but - of course - this is your choice.
ListDelete = This mailinglist and everything inside of it will be removed completely. ListDelete = This mailinglist and everything inside of it will be removed completely.
AllowList = Members of the allow list will not receive outgoing mails, but they have the same rights, as normal subscribers. Usually the allow list will contain mail aliases of subscribers. AllowList = Members of the allow list will not receive outgoing mails, but they have the same rights, as normal subscribers. Usually the allow list will contain mail aliases of subscribers.
DenyList = If you want to prevent specific mail addresses from using this list (subscription, posting, ...), then you should add them to the deny list and activate it. This can be useful for annoying people and even for notorious vacation reply users. But since it is fairly easy to fake an mail address, this will not really improve security. DenyList = If you want to prevent specific mail addresses from using this list (subscription, posting, ...), then you should add them to the deny list and activate it. This can be useful for annoying people and even for notorious vacation reply users. But since it is fairly easy to fake an mail address, this will not really improve security.
@ -203,6 +208,7 @@ Lang {
ConfigSub = Subscription details ConfigSub = Subscription details
ConfigMain = General list configuration ConfigMain = General list configuration
ConfigProcess = Processing rules ConfigProcess = Processing rules
ConfigAll = Available properties
ListCreate = Properties of the new list ListCreate = Properties of the new list
ListDelete = Remove this mailinglist ListDelete = Remove this mailinglist
RelevantOptions = Useful settings RelevantOptions = Useful settings

View file

@ -0,0 +1,163 @@
<div class="title">
<h1><?cs var:html_escape(Lang.Title.ConfigAll) ?></h1>
</div>
<div class="introduction">
<p><?cs var:html_escape(Lang.Introduction.ConfigAll) ?></p>
</div>
<fieldset class="form">
<legend><?cs var:html_escape(Lang.Legend.ConfigAll) ?> </legend>
<form method="post" action="<?cs var:ScriptName ?>" enctype="application/x-www-form-urlencoded">
<input type="hidden" name="config_subset" value="all" />
<ul>
<!-- public subsccription and archive -->
<li><?cs call:checkbox("p") ?></li>
<!-- do not require confirmation for subscription -->
<li><?cs call:checkbox("h") ?></li>
<!-- do not require confirmation for unsubscribe -->
<li><?cs call:checkbox("j") ?></li>
<!-- moderate subscription -->
<li><?cs call:checkbox("s") ?></li>
<!-- use deny list -->
<li><?cs call:checkbox("k") ?></li>
<!-- only subscribers may post -->
<li><?cs call:checkbox("u") ?></li>
<!-- require confirmation from poster -->
<li><?cs call:checkbox("y") ?></li>
<!-- posted messages are moderated -->
<li><?cs call:checkbox("m") ?></li>
<!-- only moderators may post -->
<li><?cs call:checkbox("o") ?></li>
<!-- process mailman-style requests -->
<li><?cs call:checkbox("q") ?></li>
<!-- remove ezmlm-warn -->
<li><?cs call:checkbox("w") ?></li>
<!-- archive messages -->
<li><?cs call:checkbox("a") ?></li>
<!-- only moderators may access the archive -->
<li><?cs call:checkbox("b") ?></li>
<!-- block unknown users from archive -->
<li><?cs call:checkbox("g") ?></li>
<!-- remove 'no-archive' header -->
<li><?cs call:checkbox("i") ?></li>
<!-- enable remote administration -->
<li><?cs call:checkbox("r") ?></li>
<!-- administrators may request subscribers list -->
<li><?cs call:checkbox("l") ?></li>
<!-- administrators may edit text files via mail -->
<li><?cs call:checkbox("n") ?></li>
<!-- from address -->
<li><?cs call:setting("3") ?></li>
<!-- list owner address -->
<li><?cs call:setting("5") ?></li>
<!-- mysql database -->
<?cs if:Data.Modules.mySQL ?>
<li><?cs call:setting("6") ?></li><?cs /if ?>
<!-- set main list name -->
<li><?cs call:setting("0") ?></li>
<!-- messsage moderator -->
<li><?cs call:setting("7") ?></li>
<!-- custom path to subscription moderators -->
<li><?cs call:setting("8") ?></li>
<!-- subject prefix -->
<li><?cs call:checkbox("f") ?>
<ul><li><input type="text" name="prefix" value="<?cs
var:html_escape(Data.List.Prefix) ?>" size="70" />
</li></ul></li>
<!-- trailing text -->
<li><?cs call:checkbox("t") ?>
<?cs if:(Data.List.Options.t == 1) ?>
<!-- turn off trailaer, if "-t" is not activated, as it will be
removed during the next config_update -->
<ul><li><textarea name="trailing_text" rows="3" cols="72"><?cs
var:html_escape(Data.List.TrailingText) ?></textarea></li>
</ul></li><?cs /if ?>
<!-- message size limit -->
<li><input type="checkbox" name="msgsize_max_state"
value="selected" id="msgsize_max_state" <?cs
if:Data.List.MsgSize.Max>0 ?>checked="checked"<?cs /if ?> />
<label for="msgsize_max_state"><?cs var:html_escape(Lang.Misc.MessageSize.Max) ?></label>
<ul><li><input type="text" name="msgsize_max_value" size="10"
style="text-align:right" value="<?cs
alt:Data.List.MsgSize.Max ?>30000<?cs /alt ?>" /> <?cs
var:html_escape(Lang.Misc.MessageSize.Unit) ?></li></ul></li>
<li><input type="checkbox" name="msgsize_min_state"
value="selected" id="msgsize_min_state" <?cs
if:Data.List.MsgSize.Min>0 ?>checked="checked"<?cs /if ?> />
<label for="msgsize_min_state"><?cs var:html_escape(Lang.Misc.MessageSize.Min) ?></label>
<ul><li><input type="text" name="msgsize_min_value" size="10"
style="text-align:right" value="<?cs
alt:Data.List.MsgSize.Min ?>2<?cs /alt ?>" /> <?cs
var:html_escape(Lang.Misc.MessageSize.Unit) ?></li></ul></li>
<!-- mimeremove and mimereject -->
<li><?cs call:checkbox("x") ?>
<?cs if:(Data.List.Options.x == 1) ?><ul>
<!-- turn off mimermove, if "-x" is not activated, as it will be
removed during the next config_update -->
<li><?cs var:html_escape(Lang.Misc.MimeReject) ?>:<br/>
<textarea name="mimereject" rows="4" cols="70"><?cs
var:html_escape(Data.List.MimeReject) ?></textarea></li>
<li><?cs var:html_escape(Lang.Misc.MimeRemove) ?>:<br/>
<textarea name="mimeremove" rows="4" cols="70"><?cs
var:html_escape(Data.List.MimeRemove) ?></textarea></li>
</ul><?cs /if ?></li>
<!-- headerremove -->
<li><?cs var:html_escape(Lang.Misc.HeaderRemove) ?>:<br/>
<ul><li><textarea name="headerremove" rows="5" cols="70"><?cs
var:html_escape(Data.List.HeaderRemove) ?></textarea></li></ul></li>
<!-- headeradd -->
<li><?cs var:html_escape(Lang.Misc.HeaderAdd) ?>:<br/>
<ul><li><textarea name="headeradd" rows="5" cols="70"><?cs
var:html_escape(Data.List.HeaderAdd) ?></textarea></li></ul></li>
<!-- ezmlm-web administators -->
<?cs if:Data.List.WebUsers ?>
<li><?cs var:html_escape(Lang.Misc.AllowedToEdit) ?>
<ul><li><input type="text"
name="webusers" value="<?cs var:html_escape(Data.List.WebUsers)
?>" size="40" /><br/>
</li></ul></li><?cs /if ?>
<li><!-- include default form values -->
<?cs include:TemplateDir + '/form_common.cs' ?>
<input type="hidden" name="action" value="config_do" />
<button type="submit" name="send" value="do"><?cs var:html_escape(Lang.Buttons.UpdateConfiguration) ?></button></li>
</ul>
</form>
</fieldset>

View file

@ -14,8 +14,11 @@
<ul> <ul>
<!-- public subscription and archive --> <!-- list owner address -->
<li><?cs call:checkbox("p") ?></li> <li><?cs call:setting("5") ?></li>
<!-- set main list name -->
<li><?cs call:setting("0") ?></li>
<!-- process mailman-style requests --> <!-- process mailman-style requests -->
<li><?cs call:checkbox("q") ?></li> <li><?cs call:checkbox("q") ?></li>
@ -23,19 +26,13 @@
<!-- remove ezmlm-warn --> <!-- remove ezmlm-warn -->
<li><?cs call:checkbox("w") ?></li> <li><?cs call:checkbox("w") ?></li>
<!-- list owner address -->
<li><?cs call:setting("5") ?></li>
<!-- set main list name -->
<li><?cs call:setting("0") ?></li>
<!-- mysql database --> <!-- mysql database -->
<?cs if:Data.Modules.mySQL ?> <?cs if:Data.Modules.mySQL ?>
<li><?cs call:setting("6") ?></li><?cs /if ?> <li><?cs call:setting("6") ?></li><?cs /if ?>
<!-- ezmlm-web administators --> <!-- ezmlm-web administators -->
<?cs if:Data.List.WebUsers ?> <?cs if:Data.List.WebUsers ?>
<li><?cs var:html_escape(Lang.Misc.AllowedToEdit) ?>: <li><?cs var:html_escape(Lang.Misc.AllowedToEdit) ?>
<ul><li><input type="text" <ul><li><input type="text"
name="webusers" value="<?cs var:html_escape(Data.List.WebUsers) name="webusers" value="<?cs var:html_escape(Data.List.WebUsers)
?>" size="40" /><br/> ?>" size="40" /><br/>

View file

@ -36,19 +36,19 @@
<!-- message size limit --> <!-- message size limit -->
<li><input type="checkbox" name="msgsize_max_state" <li><input type="checkbox" name="msgsize_max_state"
value="selected" id="msgsize_max_state" <?cs value="selected" id="msgsize_max_state" <?cs
if:Data.List.MsgSize.Max>0 ?>checked="checked"<?cs /if ?>> if:Data.List.MsgSize.Max>0 ?>checked="checked"<?cs /if ?> />
<label for="msgsize_max_state"><?cs var:html_escape(Lang.Misc.MessageSize.Max) ?></label> <label for="msgsize_max_state"><?cs var:html_escape(Lang.Misc.MessageSize.Max) ?></label>
<ul><li><input type="text" name="msgsize_max_value" size="10" <ul><li><input type="text" name="msgsize_max_value" size="10"
style="text-align:right" value="<?cs style="text-align:right" value="<?cs
alt:Data.List.MsgSize.Max ?>30000<?cs /alt ?>"> <?cs alt:Data.List.MsgSize.Max ?>30000<?cs /alt ?>" /> <?cs
var:html_escape(Lang.Misc.MessageSize.Unit) ?></li></ul></li> var:html_escape(Lang.Misc.MessageSize.Unit) ?></li></ul></li>
<li><input type="checkbox" name="msgsize_min_state" <li><input type="checkbox" name="msgsize_min_state"
value="selected" id="msgsize_min_state" <?cs value="selected" id="msgsize_min_state" <?cs
if:Data.List.MsgSize.Min>0 ?>checked="checked"<?cs /if ?>> if:Data.List.MsgSize.Min>0 ?>checked="checked"<?cs /if ?> />
<label for="msgsize_min_state"><?cs var:html_escape(Lang.Misc.MessageSize.Min) ?></label> <label for="msgsize_min_state"><?cs var:html_escape(Lang.Misc.MessageSize.Min) ?></label>
<ul><li><input type="text" name="msgsize_min_value" size="10" <ul><li><input type="text" name="msgsize_min_value" size="10"
style="text-align:right" value="<?cs style="text-align:right" value="<?cs
alt:Data.List.MsgSize.Min ?>2<?cs /alt ?>"> <?cs alt:Data.List.MsgSize.Min ?>2<?cs /alt ?>" /> <?cs
var:html_escape(Lang.Misc.MessageSize.Unit) ?></li></ul></li> var:html_escape(Lang.Misc.MessageSize.Unit) ?></li></ul></li>
<!-- mimeremove and mimereject --> <!-- mimeremove and mimereject -->

View file

@ -22,7 +22,7 @@
<!-- trailing text --> <!-- trailing text -->
<li><?cs call:checkbox("t") ?> <li><?cs call:checkbox("t") ?>
<?cs if:(Data.List.Options.t == 1) ?><ul> <?cs if:(Data.List.Options.t == 1) ?>
<!-- turn off mimermove, if "-x" is not activated, as it will be <!-- turn off mimermove, if "-x" is not activated, as it will be
removed during the next config_update --> removed during the next config_update -->
<ul><li><textarea name="trailing_text" rows="3" cols="72"><?cs <ul><li><textarea name="trailing_text" rows="3" cols="72"><?cs

View file

@ -22,7 +22,7 @@
<?cs if:Data.WebUser.show ?> <?cs if:Data.WebUser.show ?>
<li><label for="webusers"><?cs var:html_escape(Lang.Misc.AllowedToEdit) ?>:</label> <li><label for="webusers"><?cs var:html_escape(Lang.Misc.AllowedToEdit) ?></label>
<ul><li><input type="text" id="webusers" <ul><li><input type="text" id="webusers"
name="webusers" size="30" value="<?cs name="webusers" size="30" value="<?cs
var:html_escape(Data.WebUser.UserName) ?>"></li></ul></li> var:html_escape(Data.WebUser.UserName) ?>"></li></ul></li>

View file

@ -50,6 +50,8 @@
href="<?cs var:ScriptName ?>?list=<?cs var:url_escape(Data.List.Name) ?>&amp;action=config_ask&amp;config_subset=archive" title="<?cs var:html_escape(Lang.Menue.ConfigArchive) ?>"><?cs var:html_escape(Lang.Menue.ConfigArchive) ?></a></li> href="<?cs var:ScriptName ?>?list=<?cs var:url_escape(Data.List.Name) ?>&amp;action=config_ask&amp;config_subset=archive" title="<?cs var:html_escape(Lang.Menue.ConfigArchive) ?>"><?cs var:html_escape(Lang.Menue.ConfigArchive) ?></a></li>
<li><a <?cs if:(Data.Action == "config_admin") ?> class="nav_active"<?cs /if ?> <li><a <?cs if:(Data.Action == "config_admin") ?> class="nav_active"<?cs /if ?>
href="<?cs var:ScriptName ?>?list=<?cs var:url_escape(Data.List.Name) ?>&amp;action=config_ask&amp;config_subset=admin" title="<?cs var:html_escape(Lang.Menue.ConfigAdmin) ?>"><?cs var:html_escape(Lang.Menue.ConfigAdmin) ?></a></li> href="<?cs var:ScriptName ?>?list=<?cs var:url_escape(Data.List.Name) ?>&amp;action=config_ask&amp;config_subset=admin" title="<?cs var:html_escape(Lang.Menue.ConfigAdmin) ?>"><?cs var:html_escape(Lang.Menue.ConfigAdmin) ?></a></li>
<li><a <?cs if:(Data.Action == "config_all") ?> class="nav_active"<?cs /if ?>
href="<?cs var:ScriptName ?>?list=<?cs var:url_escape(Data.List.Name) ?>&amp;action=config_ask&amp;config_subset=all" title="<?cs var:html_escape(Lang.Menue.ConfigAll) ?>"><?cs var:html_escape(Lang.Menue.ConfigAll) ?></a></li>
</ul></li> </ul></li>
<li><a <?cs if:((Data.Action == "textfiles") || (Data.Action == "textfile_edit")) ?> class="nav_active"<?cs /if ?> <li><a <?cs if:((Data.Action == "textfiles") || (Data.Action == "textfile_edit")) ?> class="nav_active"<?cs /if ?>

View file

@ -49,6 +49,8 @@
<li><!-- include default form values --> <li><!-- include default form values -->
<?cs include:TemplateDir + '/form_common.cs' ?> <?cs include:TemplateDir + '/form_common.cs' ?>
<input type="hidden" name="config_subset" value="RESERVED-subscribers" />
<input type="hidden" name="list" value="<?cs var:Data.List.Name ?>" />
<input type="hidden" name="action" value="config_do" /> <input type="hidden" name="action" value="config_do" />
<button type="submit" name="send" value="do"><?cs var:html_escape(Lang.Buttons.UpdateConfiguration) ?></button></li> <button type="submit" name="send" value="do"><?cs var:html_escape(Lang.Buttons.UpdateConfiguration) ?></button></li>
</ul> </ul>
@ -93,7 +95,7 @@
<li><select name="mailaddress_del" <li><select name="mailaddress_del"
size="<?cs var:Data.ScrollSize ?>" multiple="multiple"> size="<?cs var:Data.ScrollSize ?>" multiple="multiple">
<?cs each:item = Data.List.Subscribers ?> <?cs each:item = Data.List.Subscribers ?>
<option><?cs var:item ?></option> <option value="<?cs var:item.address ?>"><?cs var:item.address ?><?cs if:item.name ?> (<?cs var:item.name ?>)<?cs /if ?></option>
<?cs /each ?> <?cs /each ?>
</select></li> </select></li>
<li><?cs var:subcount(Data.List.Subscribers) ?> <?cs var:html_escape(Lang.Misc.Subscribers) ?></li> <li><?cs var:subcount(Data.List.Subscribers) ?> <?cs var:html_escape(Lang.Misc.Subscribers) ?></li>