updated UPGRADE file

new configuration setting: HTML_LINKS
changed layout of top div
fixed some IE rendering problems
improved visualization of subscriber's log
changed interface of 'form_header' macros
moved interface and language selection to the top of the page
reverse order of subscriber's log entries
set explicit default values for UNSAFE_RM, PRETTY_NAMES, ALIAS_USER, HTML_LINKS, HTML_LANGUAGE, FILE_UPLOAD and DEFAULT_OPTIONS
HTML_CSS_FILE replaced by HTML_CSS_URL - it defaults to '/ezmlm-web.css'
added manpages for 'webusers' and 'ezmlmwebrc' file formats
added check for required settings
ignore 'taintness' of 'send' input data due to non-ascii characters in buttons' values
This commit is contained in:
lars 2007-04-10 22:19:43 +00:00
parent 2318ec1a8b
commit 4c83771e11
43 changed files with 677 additions and 268 deletions

12
INSTALL
View File

@ -64,10 +64,12 @@ OVERVIEW:
Finally, copy the ezmlmwebrc file to one of
the following places:
1) the home directory of the user that runs ezmlm-web.cgi (~/.ezmlmwebrc)
2) the directory, that contains your cgi binary (index.cgi)
3) /etc/ezmlm-web/ezmlmwebrc
4) /etc/ezmlm/ezmlmwebrc [deprecated]
2) /etc/ezmlm-web/ezmlmwebrc
3) /etc/ezmlm/ezmlmwebrc [deprecated]
(ezmlm-web will look for it in these places in the given order)
See the manpage of ezmlmwebrc (5) for a complete description of all
configuration settings.
4. For every user/virtual host that needs to manage mailing lists, you
@ -86,6 +88,10 @@ OVERVIEW:
i: Execute CGI Scripts and
ii: Be access controlled (here I mean both web and user access) by
some method (eg .htaccess for Apache).
Alternatively you can also manage multiple domains/users/virtual hosts
with a single suid-wrapper. Take a look at examples/multidomain.conf for
details.
5. Install some method of securing access to the page. The following

25
README
View File

@ -75,7 +75,7 @@ This version of ezmlm-web requires the following;
+ File::Copy v2.02
+ File::Path v1.07
+ Text::ParseWords v3.24
+ Locale::gettext v1.01
+ Encode (optional)
The version number indicates the version of the module that ezmlm-web was
developed with. Earlier versions may work, but then they haven't been
@ -86,18 +86,17 @@ versions are expected to work as well.
To install perl modules you may use the cpan command line interface.
Just run "cpan" and type something like "install Mail::Ezmlm".
You can download clearsilver (a templating engine - it is required since
ezmlm-web v3.0) from http://clearsilver.net.
You can download clearsilver (a templating engine) from http://clearsilver.net.
III. Notes
==========
* There is a function to delete mailing lists, but I really don't like the
idea. The only reason I put it in is that bvi@rucus asked for it.
If you set $UNSAFE_RD = 0 (the default) in the config section, the
If you set $UNSAFE_RM = 0 (the default) in the config section, the
ezmlm-web won't actually delete the list. In this case it moves the <list>
and all the associated .qmail files to a sub-directory called
deleted.qmail/ (In the users home directory. This is by far a safer way
_deleted_lists/ (In the user's home directory. This is by far a safer way
(since you can restore lists) and therefore I recommend it.
* I suggest that you make use of custom ezmlmwebrc files rather than using
@ -150,6 +149,9 @@ option "-c" for ezmlm-web.cgi will still allow everyone to create lists. The
use of this option is deprecated, since the line "ALLOW_CREATE: ALL" provides
the same effect in a cleaner way.
You find the details of the format of webusers (5) file in the respective
manpage.
V. Language Portablity
======================
@ -160,14 +162,8 @@ translation.
The language can be selected in ezmlmwebrc with the "HTML_LANGUAGE" option.
If anyone gets round to writing full templates for languages I would
appreciate it if you would do two things:
Firstly, make them public and announce them on the ezmlm@lists.cr.yp.to
mailing list so that others may benefit.
Secondly, please mail me a copy (ezmlm-web@sumpfralle.de) so that I may use
them in any future releases of ezmlm-web.
Please visit the translation center at http://translate.systemausfall.org
to contribute some strings translated to yoru native language. Thanks!
VI. Encrypted mailing lists
@ -182,7 +178,7 @@ VII. Bugs && Bug Reports
I don't know of any bugs ...
Ezmlm-web has been tested reasonably well, but not exhaustively. I know it
works on FreeBSD 4.0-STABLE, FreeBSD 3.4-RELEASE, RedHat 5.1, Redhat 6.0 and
Debian 3.0 all using an Apache web server, but I would be interested to know
Debian 3.1 all using an Apache web server, but I would be interested to know
whether it works on other OSs and with other web servers.
Please mail bug reports and comments to
@ -216,6 +212,7 @@ VIII. Acknowledgements
* Reinin Ooyama (lenin@hasiru.net) - a japanese translation and bugixes for v2.3
* Henning Rieger (age@systemausfall.org) - he designed most of the new
interface for v3.0
* Clavdia Horvat - she designed the new color scheme of v3.2
IX. Availability

2
TODO
View File

@ -1,4 +1,4 @@
Reply-To-Option
check the content of the Log file for automatic subscription
Infos fuer Massen-Hosting:
http://www.fbis.ch/index-de.php?page=14&frameset=4

View File

@ -4,15 +4,31 @@ This file contains some useful hints for upgrading from a previous version of ez
UPGRADING ezmlm-web 3.1 to ezmlm-web 3.2
1) the following dependencies were added:
1) the following dependency was added:
- File::Path
- Locale::gettext
2) a new (optional) configuration setting is available: DOTQMAIL_DIR
It can be useful if you run a multi domain vpopmail setup.
2) design update
The css stylesheet file changed significantly. Please update your copy.
Additionally you should also copy the images of the directory www-data/
to the directory of your local stylesheet file.
3) install Mail::Ezmlm::Gpg if you want to handle encrypted mailing lists
(see README.gnupg for details)
(see README.gnupg for details)
4) possible locations of ezmlmwebrc
ezmlm-web does no longer search for a configuration file (ezmlmwebrc) in
the current directory, as this can be a security risk.
If you relied on this behavior (should be rare), then you have two options:
A) move your configuration file to one of the other possible locations
B) patch the source of ezmlm-web.cgi to include the deprecated
configuration file location. Do this on your own risk!
5) renamed configuration setting
The configuration setting 'HTML_CSS_FILE' is replaced by 'HTML_CSS_URL' for
clarity. 'HTML_CSS_URL' falls back to the value of 'HTML_CSS_FILE' if it is
undefined. Thus your setup should work as before. But you are encouraged to
replace the setting, as it might break your setup in a future version of
ezmlm-web.
------------------------------------------------------------------------------

View File

@ -9,6 +9,7 @@ Version 3.2 - 04/14/02006
* user-specific interface selection (easy/default/expert)
* simplified rules for subscribing, posting and archive access
* support for more ezmlm-idx: 'headerkeep', 'mimekeep' and 'copylines'
* added configuration setting for site-specific links
* script for creating binary suid wrappers added
* handling of empty settings for ezmlm-idx 5.0 fixed (closes #21)
* bug in MySQL support fixed

View File

@ -1,3 +1,5 @@
man/ezmlm-web-make-suid.1
man/ezmlm-web.wrapper.1
blib/man1/ezmlm-web.cgi.1p
man/ezmlmwebrc.5
man/webusers.5

View File

@ -1,10 +1,13 @@
# Configuration file for ezmlm-web 2.3
# Configuration file for ezmlm-web 3.2
# ===========================================================================
# This file is not just an ordinary configuration file - it contains valid
# perl statements that are executed just like any other perl script. When
# editing this file, be careful that it is still valid perl when you have
# finished (perl -w ezmlmwebrc ;-)
#
# See the manpage of ezmlmwebrc(5) for a list of all available configuration
# settings.
# ---------------------------------------------------------------------------
@ -21,7 +24,7 @@ $LIST_DIR = "$HOME_DIR/lists";
# 1) copy examples/multidomain.conf.dist to /etc/ezmlm-web/multidomain.conf
# 2) adjust /etc/ezmlm-web/multidomain.conf to your setup
# 3) uncomment the following line
# 4) make sure that your multi domain settings are not overriden below
# 4) make sure that your multi domain settings are not overriden by settings below
#warn "multidomain.conf failed" unless (defined do "/etc/ezmlm-web/multidomain.conf");
# Where do we store the dotqmail files of this user?
@ -76,11 +79,19 @@ $FILE_UPLOAD = 1;
$DEFAULT_OPTIONS = "aBDFGHiJkLMNOpQRSTUWx";
# What is the title of this document?
$HTML_TITLE = "ezmlm-web - a mailinglists' administration interface";
$HTML_TITLE = "ezmlm-web - a mailinglist administration interface";
# Optional: use a cascading style sheet (css)
# Optional: some permanent links (visible in the top right corner)
#@HTML_LINKS = (
# { name => 'ezmlm-web homepage',
# url => 'https://systemausfall.org/toolforge/ezmlm-web' },
# { name => 'domain\'s root',
# url => '/'},
# );
# use a cascading style sheet (css)
# this is a URL - you have to copy the css file to the right location before
$HTML_CSS_FILE = "/ezmlm-web.css";
$HTML_CSS_URL = "/ezmlm-web.css";
# the default interface language
# can only be changed via the web interface if gettext support is available

View File

@ -0,0 +1,26 @@
# Configuration file for ezmlm-web 3.2
# ===========================================================================
# This file is not just an ordinary configuration file - it contains valid
# perl statements that are executed just like any other perl script. When
# editing this file, be careful that it is still valid perl when you have
# finished (perl -w ezmlmwebrc ;-)
#
# See the manpage of ezmlmwebrc(5) for a list of all available configuration
# settings.
# ---------------------------------------------------------------------------
# Where do we store lists on this server ... Try "$HOME_DIR/lists".
# This directory will automatically be created if needed.
# BEWARE: the (resulting) path MUST be absolute (starting with a slash)!
$LIST_DIR = "$HOME_DIR/lists";
# Where are the language files
# usually something like /usr/local/share/ezmlm-web/lang
$LANGUAGE_DIR = "/usr/local/share/ezmlm-web/lang";
# Where are the template files
# usually something like /usr/local/share/ezmlm-web/template
$TEMPLATE_DIR = "/usr/local/share/ezmlm-web/template";

View File

@ -22,14 +22,11 @@ use CGI;
use IO::File;
use POSIX;
use English;
use Time::localtime ();
# gettext support is optional
my $GETTEXT_SUPPORT = 1;
unless (&safely_import_module("Locale::gettext")) {
$GETTEXT_SUPPORT = 0;
warn "Gettext support is not available - the multilingual web interface is not available!";
}
# optional modules - they will be loaded later if they are available
#Encode
#Mail::Ezmlm::Gpg
# the Encode module is optional - we do not break if it is absent
my $ENCODE_SUPPORT = 1;
@ -39,11 +36,6 @@ unless (&safely_import_module("Encode")) {
}
# do not forget: we depend on Mail::Ezmlm::Gpg if the corresponding configuration
# setting is enabled
################## some preparations at the beginning ##################
@ -75,13 +67,16 @@ use vars qw[$HOME_DIR]; $HOME_DIR=$tmp[7];
use vars qw[$DEFAULT_OPTIONS $UNSAFE_RM $ALIAS_USER $LIST_DIR];
use vars qw[$QMAIL_BASE $PRETTY_NAMES $DOTQMAIL_DIR];
use vars qw[$FILE_UPLOAD $WEBUSERS_FILE $MAIL_DOMAIN $HTML_TITLE];
use vars qw[$HTML_CSS_FILE $TEMPLATE_DIR $LANGUAGE_DIR $HTML_LANGUAGE];
use vars qw[$MAIL_ADDRESS_PREFIX];
use vars qw[$HTML_CSS_URL $TEMPLATE_DIR $LANGUAGE_DIR $HTML_LANGUAGE];
use vars qw[$MAIL_ADDRESS_PREFIX @HTML_LINKS];
# some settings for encrypted mailing lists
use vars qw[$GPG_SUPPORT];
# settings for multi-domain setups
use vars qw[%DOMAINS $CURRENT_DOMAIN];
# deprecated settings
use vars qw[$HTML_CSS_FILE]; # replaced by HTML_CSS_URL since v3.2
# some deprecated configuration settings - they have to be announced
# otherwise old configuration files would break
# for now there are no deprecated settings
@ -99,8 +94,6 @@ if (defined($opt_C)) {
$config_file = $1; # Command Line
} elsif (-e "$HOME_DIR/.ezmlmwebrc") {
$config_file = "$HOME_DIR/.ezmlmwebrc"; # User
} elsif (-e "./ezmlmwebrc") {
$config_file = "./ezmlmwebrc"; # Install
} elsif (-e "/etc/ezmlm-web/ezmlmwebrc") {
$config_file = "/etc/ezmlm-web/ezmlmwebrc"; # System (new style - since v2.2)
} elsif (-e "/etc/ezmlm/ezmlmwebrc") {
@ -138,6 +131,14 @@ if (defined($opt_d)) {
$LIST_DIR = $1 if ($opt_d =~ /^([-\@\w.\/]+)$/);
}
# check required configuration settings
&fatal_error("Configuration setting 'LIST_DIR' not specified!")
unless (defined($LIST_DIR));
&fatal_error("Configuration setting 'LANGUAGE_DIR' not specified!")
unless (defined($LANGUAGE_DIR));
&fatal_error("Configuration setting 'TEMPLATE_DIR' not specified!")
unless (defined($TEMPLATE_DIR));
# If WEBUSERS_FILE is not defined in ezmlmwebrc (as before version 2.2),
# then use former default value for compatibility
$WEBUSERS_FILE = $LIST_DIR . '/webusers' unless (defined($WEBUSERS_FILE));
@ -145,8 +146,24 @@ $WEBUSERS_FILE = $LIST_DIR . '/webusers' unless (defined($WEBUSERS_FILE));
# check for non-default dotqmail directory
$DOTQMAIL_DIR = $HOME_DIR unless defined($DOTQMAIL_DIR);
# check optional stylesheet
$HTML_CSS_FILE = '' unless defined($HTML_CSS_FILE);
# check default options for new mailing lists
$DEFAULT_OPTIONS = 'aBDFGHiJkLMNOpQRSTUWx' unless defined($DEFAULT_OPTIONS);
# check default language
$HTML_LANGUAGE = 'en' unless defined($HTML_LANGUAGE);
# check stylesheet
# HTML_CSS_FILE was replaced by HTML_CSS_URL in v3.2
unless (defined($HTML_CSS_URL)) {
# HTML_CSS_URL is undefined - we will check the deprecated setting first
if (defined($HTML_CSS_FILE)) {
# ok - we fall back to the deprecated setting
$HTML_CSS_URL = $HTML_CSS_FILE;
} else {
# nothing is defined - we use the default value
$HTML_CSS_URL = '/ezmlm-web.css';
}
}
# check template directory
$TEMPLATE_DIR = 'template' unless defined($TEMPLATE_DIR);
@ -154,6 +171,24 @@ $TEMPLATE_DIR = 'template' unless defined($TEMPLATE_DIR);
# check QMAIL_BASE
$QMAIL_BASE = '/var/qmail/control' unless defined($QMAIL_BASE);
# check UNSAFE_RM
$UNSAFE_RM = 0 unless defined($UNSAFE_RM);
# check PRETTY_NAMES
$PRETTY_NAMES = 0 unless defined($PRETTY_NAMES);
# check FILE_UPLOAD
$FILE_UPLOAD = 1 unless defined($FILE_UPLOAD);
# check ALIAS_USER
$ALIAS_USER = 'alias' unless defined($ALIAS_USER);
# check HTML_TITLE
$HTML_TITLE = '' unless defined($HTML_TITLE);
# check HTML_LINKS
@HTML_LINKS = () unless defined(@HTML_LINKS);
# determine MAIL_DOMAIN
unless (defined($MAIL_DOMAIN) && ($MAIL_DOMAIN ne '')) {
if ((-e "$QMAIL_BASE/virtualdomains") && open(VD, "<$QMAIL_BASE/virtualdomains")) {
@ -199,7 +234,7 @@ my $action = $q->param('action');
# This is where we decide what to do, depending on the form state and the
# users chosen course of action ...
# TODO: unify all these "is list param set?" checks ...
if ($action eq 'show_mime_examples') {
if (defined($action) && ($action eq 'show_mime_examples')) {
&output_mime_examples();
exit 0;
} elsif (%DOMAINS && (!defined($CURRENT_DOMAIN) || ($CURRENT_DOMAIN eq '')
@ -526,9 +561,16 @@ sub init_hdf {
$hdf = &load_interface_language($hdf);
$hdf->setValue("ScriptName", $ENV{SCRIPT_NAME}) if (defined($ENV{SCRIPT_NAME}));
$hdf->setValue("Stylesheet", "$HTML_CSS_FILE");
$hdf->setValue("Stylesheet", "$HTML_CSS_URL");
$hdf->setValue("Config.PageTitle", "$HTML_TITLE");
my $i;
for $i (0 .. $#HTML_LINKS) {
$hdf->setValue("Config.PageLinks.$i.name", $HTML_LINKS[$i]{name});
$hdf->setValue("Config.PageLinks.$i.url", $HTML_LINKS[$i]{url});
$i++;
}
# support for encrypted mailing lists?
$hdf->setValue("Config.Features.Crypto", 1) if ($GPG_SUPPORT);
@ -1206,7 +1248,7 @@ sub set_pagedata_subscription_log {
my ($listname) = @_;
my ($log_file, @event, $i, $epoch_seconds, $note, $address);
my ($log_file, @event, $i, $datetext, $epoch_seconds, $note, $address);
$log_file = "$LIST_DIR/" . $q->param('list') . "/Log";
# break if there is no log_file
@ -1219,18 +1261,20 @@ sub set_pagedata_subscription_log {
}
$i = 0;
while (<LOG_FILE>) {
chomp;
split;
@event = @_;
@event = split;
if ($#event eq 2) {
$epoch_seconds = $event[0];
my $datetext = ctime($epoch_seconds);
$datetext = localtime($epoch_seconds);
$note = $event[1];
$address = $event[2];
# the date in gmt format - this should be sufficient
$pagedata->setValue("Data.List.SubscribeLog.$i.date", $datetext);
$pagedata->setValue("Data.List.SubscribeLog.$i.text", $note);
# the first letter of 'note' should be +/-
$pagedata->setValue("Data.List.SubscribeLog.$i.action", substr($note,0,1));
# manual/auto/mod - TODO: verify "auto"
$pagedata->setValue("Data.List.SubscribeLog.$i.details", substr($note,1));
$pagedata->setValue("Data.List.SubscribeLog.$i.address", $address);
$i++;
}
@ -1328,6 +1372,8 @@ sub untaint {
next if ($params[$i] eq 'mailaddressfile');
next if ($params[$i] eq 'gnupg_key_file');
next if ($params[$i] eq 'content');
# the button description may contain non-ascii characters - skip check
next if ($params[$i] eq 'send');
foreach $param ($q->param($params[$i])) {
next if $param eq '';
if ($param =~ /^([#-\@\w\.\/\[\]\:\n\r\>\< _"']+)$/) {

View File

@ -282,6 +282,18 @@ Lang {
normal = default
expert = expert
}
MailAddress = Mail address
SubscribeAction = Event
SubscribeActionDetails = Details
SubscribeActions {
remove = removed
add = added
mod = moderated
manual = manual
auto = automatical
unknown = unknown
}
Date = Date
}

122
man/ezmlmwebrc.5 Normal file
View File

@ -0,0 +1,122 @@
.TH ezmlmwebrc 5 "April 02007" "ezmlm-web" "configuration file"
.SH NAME
ezmlmwebrc \- configuration file for ezmlm-web
.SH DESCRIPTION
.PP
\fBezmlmwebrc\fR contains the configuration settings necessary for ezmlm-web.
.PP
The file is required for ezmlm-web and must exist in one of the following
locations:
.IP \fB~/.ezmlmwebrc\fR
user-specific configuration file
.IP \fB/etc/ezmlm-web/ezmlmwebrc\fR
system-wide default configuration file
.IP \fB/etc/ezmlm/ezmlmwebrc\fR
system-wide default configuration file (deprecated since v2.2)
.PP
Additionally the location of the configuration file may be overriden by the
command line switch \fB\-C\fR of \fIezmlm-web.cgi (1p)\fR.
.SH FILE FORMAT
.PP
The file itself is sourced by the perl script \fIezmlm-web.cgi\fR, so it is
required that the file conforms to the syntax of perl scripts. See the
manpage of perl (1) for details.
.PP
You should avoid to declare other variables than the settings described below.
Otherwise you may run into namespace conflicts. Just don't do it.
.PP
You may rely on the existence (and meaningful content) of the following
variables:
.IP \fI$USER\fR
the name of the owner of the current process
.IP \fI$HOME\fR
the home directory of the owner of the current process
.SH REQUIRED SETTINGS
.IP \fB$LIST_DIR\fR
This is the directory containing the lists, that you want to manage via
ezmlm-web. It will be created automatically if it does not exist yet.
The value \fI$HOME/lists\fR should be quite reasonable.
.IP \fB$LANGUAGE_DIR\fR
This directory contains the language files of ezmlm-web (e.g. \fIen.hdf\fR).
Usually this should be something like \fI/usr/local/share/ezmlm-web/lang\fR.
.IP \fB$TEMPLATE_DIR\fR
This directory contains the template files of ezmlm-web (e.g. \fImain.cs\fR).
Usually this should be something like
\fI/usr/local/share/ezmlm-web/template\fR.
.SH OPTIONAL SETTINGS
.IP \fB$DEFAULT_OPTIONS\fR
Specify the default options used for ezmlm-make (1) when creating a new list.
The default value is: \fIaBDFGHiJkLMNOpQRSTUWx\fR. See the manpage of
ezmlm-make (1) for details.
.IP \fB$ALIAS_USER\fR
The alias user of a qmail installation manages all mail addresses that are
not handled by specific dotqmail files or other definitions. It defaults to
\fIalias\fR.
.IP \fB$QMAIL_BASE\fR
This is the control directory of your qmail setup. It defaults to
\fI/var/qmail/control\fR.
.IP \fB$DOTQMAIL_DIR\fR
The directory of the dotqmail (5) files of the lists managed by ezmlm-web.
It defaults to the home directory of the owner of the current process
(\fI$HOME\fR).
.IP \fB$WEBUSERS_FILE\fR
This file contains the access rules for the lists managed by ezmlm-web.
Read the README file of ezmlm-web for details. This setting defaults to
\fI$LISTS/webusers\fR.
.IP \fB$MAIL_DOMAIN\fR
Specify the default domain name of new mailing lists. Leave it empty if you
want ezmlm-web to try to detect this value automatically.
.IP \fB$MAIL_ADDRESS_PREFIX\fR
Specify the default prefix for the local part of the addresses of new mailing
lists. By default it is empty ('').
.IP \fB$PRETTY_NAMES\fR
Do you want to store connections between real names and mail addresses if both
were provided when adding a new subscriber? This results in a file called
\fIwebnames\fR being created in every mailing list directory when necessary.
.IP \fB$FILE_UPLOAD\fR
Should the upload of subscriber files be possible? The default is \fI1\fR.
If you consider this as a security risk, then you should set it to \fI0\fR.
.IP \fB$UNSAFE_RM\fR
This setting defines, if list removal requested via the web interface should
be recoverable or not. The value \fI1\fR will make ezmlm-web remove the list
directory completely without any chance of recovery. The default value \fI0\fR
will just move deleted lists to a safe place. Thus deletion is recoverable.
.IP \fB$HTML_TITLE\fR
Print a reasonable name of the web interface to the left upper corner of every
page. By default this string is empty.
.IP \fB$HTML_CSS_URL\fR
This is the URL of the stylesheet file to be used by ezmlm-web. Make sure it is
actually available, as the design of the web interface will suffer a lot
without it.
.IP \fB@HTML_LINKS\fR
This array may contain hashes with the elements \fIname\fR and \fIurl\fR.
These links will be visible in the upper right corner of every page.
Please pay attention to the syntax of perl and use the example configuration
file distributed with ezmlm-web as a template. By default, this array is
empty.
.IP \fB$HTML_LANGUAGE\fR
Specify the defaut language of the web interface. This value will be overriden
when the browser requests an available language or when the user explicitly
selects a different language. The default value is \fIen\fR.
.IP \fB$GPG_SUPPORT\fR
Enable support for encrypted mailing lists. Currently this feature is still
considered as beta quality. User reports are warmly welcome!
.IP \fB%DOMAINS\fR
This hash of hashes (\fIname\fR associated with a hash of domain specific
information) can be used to define a multi-domain setup. See the example
configuration file (\fImultidomain.conf\fR) as distributed with ezmlm-web for
more details.
.SH EXAMPLES
.IP "A minimal example configuration file:"
.sp
.nf
$LIST_DIR = "$HOME_DIR/lists";
$LANGUAGE_DIR = "/usr/local/share/ezmlm-web/lang";
$TEMPLATE_DIR = "/usr/local/share/ezmlm-web/template";
.SH AUTHOR
Written by Lars Kruse
.SH "REPORTING BUGS"
Report bugs to <devel@sumpfralle.de>
.SH COPYRIGHT
Copyright \(co 02007 Lars Kruse

60
man/webusers.5 Normal file
View File

@ -0,0 +1,60 @@
.TH webusers 5 "April 02007" "ezmlm-web" "access configuration file"
.SH NAME
webusers \- define the access permissions for a directory of lists
.SH DESCRIPTION
.PP
\fBwebusers\fR contains the access definitions for the lists below a certain
directory.
.PP
This file is optional. The actions of users are unrestricted, if the
\fBwebusers\fR file does not exist. Be careful when using this setting.
.PP
A webusers file is only useful if you can request some kind of authentication
from the user. Usually this should be done via http-authentication. See
the INSTALL file for more details.
.SH LOCATION
By default the \fBwebusers\fR file is located in the same directory as the
mailing lists. This can be adjusted with the setting \fIWEBUSERS_FILE\fR in
the configuration file ezmlmwebrc (5). Read its manpage for details.
.SH FILE FORMAT
.IP "The file consists of lines of the following form:"
.sp
.nf
LISTNAME: USER1 USER2
.PP
Empty lines and lines starting with a '#' are ignored. The same goes for
invalid configuration lines.
.PP
If \fILISTNAME\fR equals the string \fIALL\fR, then the following users are
allowed to manage all existing mailing lists.
.PP
If \fILISTNAME\fR equals the string \fIALLOW_CREATE\fR, then the following
users are allowed to create new lists.
.PP
Otherwise the named users are allowed to manage only list \fILISTNAME\fR.
.PP
If one of the usernames equals the string \fIALL\fR, then every authenticated
user is allowed to perform the action specified by \fILISTNAME\fR.
.SH EXAMPLES
.IP "A minimal example access configuration file:"
.sp
.nf
comm: guy arb
users: arb
members: ALL
ALL: root
ALLOW_CREATE: root guy
.PP
In the example above, the users \fIroot\fR and \fIguy\fR are allowed to create
new lists.
.PP
Every authenticated user may configure the list \fImembers\fR.
.PP
The user \fIroot\fR can manage all mailing lists.
.SH AUTHOR
Written by Lars Kruse
.SH "REPORTING BUGS"
Report bugs to <devel@sumpfralle.de>
.SH COPYRIGHT
Copyright \(co 02007 Lars Kruse

View File

@ -9,13 +9,14 @@
<fieldset>
<legend><?cs var:html_escape(Lang.Legend.ConfigAdmin) ?> </legend>
<?cs call:form_header("config_admin", "") ?>
<?cs call:form_header("config_admin") ?>
<input type="hidden" name="config_subset" value="admin" />
<?cs call:show_options(UI.Options.Config.Admin) ?>
<ul><li>
<input type="hidden" name="action" value="config_do" />
<button type="submit" name="send" value="do"><?cs var:html_escape(Lang.Buttons.UpdateConfiguration) ?></button>
<button type="submit" name="send" value="do"><?cs var:html_escape(Lang.Buttons.UpdateConfiguration) ?></button></li></ul>
</form>
</fieldset>

View File

@ -9,13 +9,14 @@
<fieldset>
<legend><?cs var:html_escape(Lang.Legend.ConfigAll) ?> </legend>
<?cs call:form_header("config_all", "") ?>
<?cs call:form_header("config_all") ?>
<input type="hidden" name="config_subset" value="all" />
<?cs call:show_options(UI.Options.Config.Overview) ?>
<ul><li>
<input type="hidden" name="action" value="config_do" />
<button type="submit" name="send" value="do"><?cs var:html_escape(Lang.Buttons.UpdateConfiguration) ?></button>
<button type="submit" name="send" value="do"><?cs var:html_escape(Lang.Buttons.UpdateConfiguration) ?></button></li></ul>
</form>
</fieldset>

View File

@ -9,14 +9,15 @@
<fieldset>
<legend><?cs var:html_escape(Lang.Legend.ConfigArchive) ?> </legend>
<?cs call:form_header("config_archive", "") ?>
<?cs call:form_header("config_archive") ?>
<input type="hidden" name="config_subset" value="archive" />
<?cs call:show_options(UI.Options.Config.Archive) ?>
<ul><li>
<input type="hidden" name="action" value="config_do" />
<button type="submit" name="send" value="do"><?cs var:html_escape(Lang.Buttons.UpdateConfiguration) ?></button>
<button type="submit" name="send" value="do"><?cs var:html_escape(Lang.Buttons.UpdateConfiguration) ?></button></li></ul>
</form>
</fieldset>
</fieldset>

View File

@ -9,13 +9,14 @@
<fieldset>
<legend><?cs var:html_escape(Lang.Legend.GnupgOptions) ?> </legend>
<?cs call:form_header("config_encryption", "") ?>
<?cs call:form_header("config_encryption") ?>
<input type="hidden" name="config_subset" value="encryption" />
<?cs call:show_options(UI.Options.Config.GnupgOptions) ?>
<ul><li>
<input type="hidden" name="action" value="config_do" />
<button type="submit" name="send" value="do"><?cs var:html_escape(Lang.Buttons.UpdateConfiguration) ?></button>
<button type="submit" name="send" value="do"><?cs var:html_escape(Lang.Buttons.UpdateConfiguration) ?></button></li></ul>
</form>

View File

@ -9,13 +9,14 @@
<fieldset>
<legend><?cs var:html_escape(Lang.Legend.ConfigMain) ?> </legend>
<?cs call:form_header("config_main", "") ?>
<?cs call:form_header("config_main") ?>
<input type="hidden" name="config_subset" value="main" />
<?cs call:show_options(UI.Options.Config.Main) ?>
<ul><li>
<input type="hidden" name="action" value="config_do" />
<button type="submit" name="send" value="do"><?cs var:html_escape(Lang.Buttons.UpdateConfiguration) ?></button>
<button type="submit" name="send" value="do"><?cs var:html_escape(Lang.Buttons.UpdateConfiguration) ?></button></li></ul>
</form>

View File

@ -9,13 +9,14 @@
<fieldset>
<legend><?cs var:html_escape(Lang.Legend.ConfigPosting) ?> </legend>
<?cs call:form_header("config_posting", "") ?>
<?cs call:form_header("config_posting") ?>
<input type="hidden" name="config_subset" value="posting" />
<?cs call:show_options(UI.Options.Config.Posting) ?>
<ul><li>
<input type="hidden" name="action" value="config_do" />
<button type="submit" name="send" value="do"><?cs var:html_escape(Lang.Buttons.UpdateConfiguration) ?></button>
<button type="submit" name="send" value="do"><?cs var:html_escape(Lang.Buttons.UpdateConfiguration) ?></button></li></ul>
</form>

View File

@ -9,15 +9,17 @@
<fieldset>
<legend><?cs var:html_escape(Lang.Legend.ConfigProcess) ?> </legend>
<?cs call:form_header("config_processing", "") ?>
<?cs call:form_header("config_processing") ?>
<input type="hidden" name="config_subset" value="processing" />
<?cs call:show_options(UI.Options.Config.Processing) ?>
<ul><li>
<input type="hidden" name="action" value="config_do" />
<button type="submit" name="send" value="do"><?cs var:html_escape(Lang.Buttons.UpdateConfiguration) ?></button>
<button type="submit" name="send" value="do"><?cs var:html_escape(Lang.Buttons.UpdateConfiguration) ?></button></li></ul>
</form>
</fieldset>
<?cs include:TemplateDir + '/help_tag_susbtitution.cs' ?>

View File

@ -9,13 +9,14 @@
<fieldset>
<legend><?cs var:html_escape(Lang.Legend.ConfigSub) ?> </legend>
<?cs call:form_header("config_subscription", "") ?>
<?cs call:form_header("config_subscription") ?>
<input type="hidden" name="config_subset" value="subscription" />
<?cs call:show_options(UI.Options.Config.Subscription) ?>
<ul><li>
<input type="hidden" name="action" value="config_do" />
<button type="submit" name="send" value="do"><?cs var:html_escape(Lang.Buttons.UpdateConfiguration) ?></button>
<button type="submit" name="send" value="do"><?cs var:html_escape(Lang.Buttons.UpdateConfiguration) ?></button></li></ul>
</form>

View File

@ -9,7 +9,8 @@
<fieldset>
<legend><?cs var:html_escape(Lang.Legend.GnupgConvert) ?> </legend>
<?cs call:form_header("gnupg_convert", "") ?>
<?cs call:form_header("gnupg_convert") ?>
<ul><li>
<?cs if:Data.List.Features.Crypto
?><button type="submit" name="send" value="do"><?cs
var:html_escape(Lang.Buttons.GnupgConvertToPlain) ?></button>
@ -19,6 +20,7 @@
var:html_escape(Lang.Buttons.GnupgConvertToEncrypted) ?></button>
<input type="hidden" name="action" value="gnupg_convert_enable" /><?cs
/if ?>
</li></ul>
</form>
</fieldset>

View File

@ -9,14 +9,15 @@
<fieldset>
<legend><?cs var:html_escape(Lang.Legend.GnupgGenerateKey) ?> </legend>
<?cs call:form_header("gnupg_generate_key", "") ?>
<?cs call:form_header("gnupg_generate_key") ?>
<input type="hidden" name="gnupg_subset" value="generate_key" />
<?cs call:show_options(UI.Options.GenerateKey) ?>
<ul><li>
<input type="hidden" name="action" value="gnupg_do" />
<button type="submit" name="send" value="do"><?cs var:html_escape(Lang.Buttons.GnupgGenerateKey) ?></button>
<button type="submit" name="send" value="do"><?cs var:html_escape(Lang.Buttons.GnupgGenerateKey) ?></button></li></ul>
</form>
</fieldset>

View File

@ -1,6 +1,6 @@
<fieldset>
<legend><?cs var:html_escape(Lang.Legend.GnupgKeyImport) ?> </legend>
<?cs call:form_header_upload("gnupg_key_upload", "") ?>
<?cs call:form_header_upload("gnupg_key_upload") ?>
<input type="hidden" name="gnupg_subset" value="<?cs
if:Data.Action == 'gnupg_public' ?>public<?cs

View File

@ -13,10 +13,10 @@
<?cs if:subcount(Data.List.gnupg_keys.public) > 0 ?>
<?cs call:form_header("gnupg_public_keys", "") ?>
<input type="hidden" name="gnupg_subset" value="public" />
<table class="gnupg_keys">
<?cs call:form_header("gnupg_public_keys") ?>
<ul>
<li><table class="gnupg_keys">
<?cs each:key = Data.List.gnupg_keys.public
?><tr><td><input type="checkbox" name="gnupg_key_<?cs var:key.id ?>"
id="gnupg_key_<?cs var:key.id ?>" /></td>
@ -36,10 +36,13 @@
?></a></td>
</tr>
<?cs /each ?>
</table>
</table></li>
<input type="hidden" name="action" value="gnupg_do" />
<button type="submit" name="send" value="do"><?cs var:html_escape(Lang.Buttons.DeletePublicKey) ?></button>
<li><input type="hidden" name="action" value="gnupg_do" />
<input type="hidden" name="gnupg_subset" value="public" />
<button type="submit" name="send" value="do"><?cs
var:html_escape(Lang.Buttons.DeletePublicKey) ?></button></li>
</ul>
</form>
<?cs else ?>

View File

@ -13,10 +13,10 @@
<?cs if:subcount(Data.List.gnupg_keys.secret) > 0 ?>
<?cs call:form_header("gnupg_secret_keys", "") ?>
<input type="hidden" name="gnupg_subset" value="secret" />
<?cs call:form_header("gnupg_secret_keys") ?>
<table class="gnupg_keys">
<ul>
<li><table class="gnupg_keys">
<?cs each:key = Data.List.gnupg_keys.secret
?><tr><td><input type="checkbox" name="gnupg_key_<?cs var:key.id ?>"
id="gnupg_key_<?cs var:key.id ?>" /></td>
@ -36,10 +36,14 @@
?></a></td>
</tr>
<?cs /each ?>
</table>
</table></li>
<input type="hidden" name="action" value="gnupg_do" />
<button type="submit" name="send" value="do"><?cs var:html_escape(Lang.Buttons.DeleteSecretKey) ?></button>
<li>
<input type="hidden" name="gnupg_subset" value="secret" />
<input type="hidden" name="action" value="gnupg_do" />
<button type="submit" name="send" value="do"><?cs
var:html_escape(Lang.Buttons.DeleteSecretKey) ?></button></li>
</ul>
</form>
<?cs else ?>

View File

@ -16,10 +16,23 @@
</head>
<body>
<div id="top">
<div id="perm_nav">
<?cs var:Config.PageTitle ?>
</div>
<h1>ezmlm-web</h1>
</div>
<table id="top"><tr>
<td id="title">
<h1>ezmlm-web</h1>
<?cs if:Config.PageTitle
?><p><?cs var:Config.PageTitle ?></p><?cs /if ?>
</td>
<td id="perm_nav">
<?cs if:subcount(Config.PageLinks) > 0 ?><p><?cs
loop: x = #0, subcount(Config.PageLinks)-1, #1
?><?cs if:x > #0 ?> | <?cs /if
?><a href="<?cs var:html_escape(Config.PageLinks[x].url)
?>"><?cs var:html_escape(Config.PageLinks[x].name)
?></a>
<?cs /loop ?></p><?cs /if ?>
<?cs if:UI.Top.Language || UI.Top.Interface ?>
<?cs include: TemplateDir + '/interface_select.cs' ?>
<?cs /if ?>
</td>
</tr></table>

View File

@ -1,21 +1,39 @@
<!-- allows the user to change the interface style -->
<?cs if:subcount(Config.UI.Interfaces) > 0 ?>
<?cs call:form_header("select_interface", "template") ?>
<?cs if:Data.List.Name ?><input type="hidden" name="action"
value="subscribers" /><?cs /if ?>
<!-- allows the user to change the interface style and the language-->
<?cs if:((subcount(Config.UI.Interfaces) > 0) && UI.Top.Interface)
|| ((subcount(Config.UI.Languages) > 0) && UI.Top.Language) ?>
<?cs call:form_header_ignore("select_interface", "template", "web_lang", "")
?><?cs if:Data.List.Name ?><input type="hidden" name="action"
value="subscribers" /><?cs /if
?><?cs if:subcount(Config.UI.Interfaces) > 0 ?>
<font class="no_link"><?cs
var:html_escape(Lang.Menue.Interface) ?>:</font><br/>
var:html_escape(Lang.Menue.Language) ?>:</font>
<select name="web_lang" size="0">
<?cs each: tlang = Config.UI.Languages
?><option value="<?cs var:name(tlang) ?>"<?cs
if:name(tlang) == Config.UI.LinkAttrs.web_lang
?> selected="selected"<?cs /if?>><?cs
var:html_escape(tlang) ?></option>
<?cs /each ?></select><?cs
else ?>
<input type="hidden" name="web_lang" value="<?cs
var:Config.UI.LinkAttrs.web_lang ?>" /><?cs /if
?><?cs if:subcount(Config.UI.Interfaces) > 0 ?>
<font class="no_link"><?cs
var:html_escape(Lang.Menue.Interface) ?>:</font>
<select name="template" size="0">
<?cs each: ttemp = Config.UI.Interfaces
?><option value="<?cs var:name(ttemp) ?>"<?cs
if:name(ttemp) == Config.UI.LinkAttrs.template
?> selected="selected"<?cs /if?>><?cs
var:html_escape(Lang.Misc.Interfaces[ttemp]) ?></option>
<?cs /each ?>
</select>&nbsp;<button type="submit" name="send" value="do"><?cs var:html_escape(Lang.Buttons.InterfaceSet) ?></button>
<?cs /each ?></select><?cs
else ?>
<input type="hidden" name="template" value="<?cs
var:Config.UI.LinkAttrs.template ?>" /><?cs /if
?><button type="submit" name="send" value="do"><?cs var:html_escape(Lang.Buttons.InterfaceSet) ?></button>
</form>
<?cs /if ?>

View File

@ -1,7 +1,7 @@
<!-- allows the user to change the interface language (not of the list!) -->
<?cs if:subcount(Config.UI.Languages) > 0 ?>
<?cs call:form_header("select_language", "web_lang") ?>
<?cs call:form_header("select_language") ?>
<?cs if:Data.List.Name ?><input type="hidden" name="action"
value="subscribers" /><?cs /if ?>

View File

@ -5,12 +5,14 @@
<fieldset>
<legend><?cs var:html_escape(Lang.Legend.ListCreate) ?> </legend>
<?cs call:form_header("list_create", "") ?>
<?cs call:form_header("list_create") ?>
<?cs call:show_options(UI.Options.Create) ?>
<ul><li>
<input type="hidden" name="action" value="list_create_do" />
<button type="submit" name="send" value="do"><?cs var:html_escape(Lang.Buttons.Create) ?></button>
<button type="submit" name="send" value="do"><?cs
var:html_escape(Lang.Buttons.Create) ?></button></li></ul>
</form>
</fieldset>

View File

@ -9,10 +9,14 @@
<fieldset>
<legend><?cs var:html_escape(Lang.Legend.ListDelete) ?> </legend>
<p><?cs var:html_escape(Lang.Misc.ConfirmDelete) ?></p>
<?cs call:form_header("delete_list_confirm", "") ?>
<input type="hidden" name="action" value="list_delete_do" />
<button type="submit" name="send" value="do"><?cs var:html_escape(Lang.Buttons.ConfirmDeletion) ?></button>
<?cs call:form_header("delete_list_confirm") ?>
<ul>
<li><?cs var:html_escape(Lang.Misc.ConfirmDelete) ?></li>
<li><input type="hidden" name="action" value="list_delete_do" />
<button type="submit" name="send" value="do"><?cs
var:html_escape(Lang.Buttons.ConfirmDeletion) ?></button>
</li>
</ul>
</form>
</fieldset>

View File

@ -101,14 +101,15 @@ def:link(attr1, value1, attr2, value2, attr3, value3)
/def ?><?cs
def:form_header_generic(form_name, ignore_attr, enctype)
def:form_header_generic(form_name, enctype, ignore1, ignore2, ignore3)
?><?cs # somehow perl's CGI has problems to evaluate the querystring of a
form action - thus we have to use hidden input fields instead
?><form accept-charset="utf-8" name="<?cs var:html_escape(form_name)
?>" method="post" action="<?cs var:ScriptName
?>" enctype="<?cs var:enctype ?>">
<?cs each:attr = Config.UI.LinkAttrs ?><?cs
if:name(attr) != ignore_attr ?><input type="hidden" name="<?cs
if:(name(attr) != ignore1) && (name(attr) != ignore2)
&& (name(attr) != ignore3) ?><input type="hidden" name="<?cs
var:html_escape(name(attr)) ?>" value="<?cs
var:html_escape(attr) ?>" /><?cs /if ?>
<?cs /each ?><?cs
@ -117,15 +118,21 @@ def:form_header_generic(form_name, ignore_attr, enctype)
/def ?><?cs
def:form_header(form_name, ignore_attr)
?><?cs call:form_header_generic(form_name, ignore_attr,
"application/x-www-form-urlencoded") ?><?cs
def:form_header(form_name)
?><?cs call:form_header_generic(form_name,
"application/x-www-form-urlencoded", '', '', '') ?><?cs
/def ?><?cs
def:form_header_upload(form_name, ignore_attr)
?><?cs call:form_header_generic(form_name, ignore_attr,
"multipart/form-data") ?><?cs
def:form_header_ignore(form_name, ignore1, ignore2, ignore3)
?><?cs call:form_header_generic(form_name,
"application/x-www-form-urlencoded", ignore1, ignore2, ignore3)
?><?cs /def ?><?cs
def:form_header_upload(form_name)
?><?cs call:form_header_generic(form_name, "multipart/form-data",
'', '', '') ?><?cs
/def ?><?cs

View File

@ -24,7 +24,8 @@
<?cs /if ?>
<?cs if:((subcount(Data.Lists) > 0) && (UI.Navigation.ListSelect == 1))
|| (Data.Permissions.Create && (UI.Navigation.ListCreate == 1)) ?>
|| (Data.Permissions.Create && (UI.Navigation.ListCreate == 1))
|| ((subcount(Data.Domains) > 0) && (UI.Navigation.DomainSelect == 1)) ?>
<li><hr/></li>
<?cs /if ?>
@ -189,18 +190,6 @@
<li><hr/></li>
<?cs /if ?>
<?cs if:UI.Navigation.Language || UI.Navigation.Interface ?>
<?cs if:UI.Navigation.Language ?>
<li><?cs include:TemplateDir + '/language_select.cs' ?></li>
<?cs /if ?>
<?cs if:UI.Navigation.Interface ?>
<li><?cs include:TemplateDir + '/interface_select.cs' ?></li>
<?cs /if ?>
<li><hr/></li>
<?cs /if ?>
<?cs if:UI.Navigation.Help
?><li><a href="http://www.ezmlm.org/ezman/index.html#toc1" target="_blank"
title="<?cs var:html_escape(Lang.Misc.HelpLink) ?>"><?cs

View File

@ -6,17 +6,37 @@
<legend><?cs var:html_escape(Lang.Legend.SubscribeLog) ?> </legend>
<?cs if:subcount(Data.List.SubscribeLog) > 0 ?>
<table>
<?cs each:x = Data.List.SubscribeLog ?>
<table class="subscribe_log">
<tr>
<td><?cs var:html_escape(x.address) ?></td>
<td><?cs var:html_escape(x.text) ?></td>
<td><?cs var:html_escape(x.date) ?></td>
<th><?cs var:html_escape(Lang.Misc.MailAddress) ?></th>
<th><?cs var:html_escape(Lang.Misc.SubscribeAction) ?></th>
<th><?cs var:html_escape(Lang.Misc.SubscribeActionDetails) ?></th>
<th><?cs var:html_escape(Lang.Misc.Date) ?></th>
</tr>
<?cs /each ?>
<?cs loop:x = subcount(Data.List.SubscribeLog)-1, #0, -1 ?><?cs
# we print the lines backward ?>
<tr>
<td><?cs var:html_escape(Data.List.SubscribeLog[x].address) ?></td>
<td><?cs if:Data.List.SubscribeLog[x].action == '+' ?><?cs
var:html_escape(Lang.Misc.SubscribeActions.add) ?><?cs
elif:Data.List.SubscribeLog[x].action == '-' ?><?cs
var:html_escape(Lang.Misc.SubscribeActions.remove) ?><?cs
else ?><?cs var:html_escape(Lang.Misc.SubscribeActions.unknown)
?><?cs /if ?></td>
<td><?cs if:Data.List.SubscribeLog[x].details == 'manual' ?><?cs
var:html_escape(Lang.Misc.SubscribeActions.manual) ?><?cs
elif:Data.List.SubscribeLog[x].details == 'mod' ?><?cs
var:html_escape(Lang.Misc.SubscribeActions.mod) ?><?cs
elif:Data.List.SubscribeLog[x].details == 'auto' ?><?cs
var:html_escape(Lang.Misc.SubscribeActions.auto) ?><?cs
else ?><?cs var:html_escape(Lang.Misc.SubscribeActions.unknown)
?><?cs /if ?></td>
<td><?cs var:html_escape(Data.List.SubscribeLog[x].date) ?></td>
</tr>
<?cs /loop ?>
</table>
<?cs else ?>
<?cs var:html_escape(Lang.WarningMessage.EmptyList) ?>
<p><?cs var:html_escape(Lang.WarningMessage.EmptyList) ?></p>
<?cs /if ?>
</fieldset>

View File

@ -36,7 +36,7 @@
<fieldset>
<legend><?cs var:html_escape(Lang.Legend.RelevantOptions) ?> </legend>
<?cs call:form_header("config_subscription", "") ?>
<?cs call:form_header("config_subscription") ?>
<input type="hidden" name="part" value="<?cs var:Data.List.PartType ?>" />
@ -75,7 +75,7 @@
<table class="subscribers"><tr>
<?cs if:subcount(Data.List.Subscribers) > 0 ?>
<td><?cs call:form_header("remove_subscriber", "") ?>
<td><?cs call:form_header("remove_subscriber") ?>
<?cs if:Data.List.PartType ?>
<input type="hidden" name="part" value="<?cs var:Data.List.PartType ?>" />
<?cs /if ?>
@ -98,19 +98,20 @@
<li><input type="hidden" name="action" value="address_del" />
<button type="submit" name="send" value="do"><?cs var:html_escape(Lang.Buttons.DeleteAddress) ?></button></li>
</ul></form>
<ul>
<li><?cs call:form_header("download_subscribers", "") ?>
<?cs call:form_header("download_subscribers") ?>
<ul><li>
<input type="hidden" name="action" value="download_subscribers" />
<?cs if:Data.List.PartType ?>
<input type="hidden" name="part" value="<?cs
var:Data.List.PartType ?>" /><?cs /if ?>
<button type="submit" name="send" value="do"><?cs
var:html_escape(Lang.Buttons.DownloadSubscribersList)
?></button></form></li>
</ul></td>
?></button></li>
</ul></form>
</td>
<?cs /if ?>
<td><?cs call:form_header_upload("upload_subscribers", "") ?>
<td><?cs call:form_header_upload("upload_subscribers") ?>
<?cs if:Data.List.PartType ?>
<input type="hidden" name="part" value="<?cs var:Data.List.PartType ?>" />
<?cs /if ?>

View File

@ -16,7 +16,7 @@
<?cs var:html_escape(Lang.Introduction.ResetTextFile) ?>
</div>
<?cs call:form_header("textfile_reset", "") ?>
<?cs call:form_header("textfile_reset") ?>
<input type="hidden" name="file" value="<?cs var:Data.List.File.Name ?>">
<input type="hidden" name="action" value="textfile_reset" />
<button type="submit" name="send" value="do"><?cs var:html_escape(Lang.Buttons.ResetFile) ?></button>
@ -28,7 +28,7 @@
<fieldset>
<legend><?cs var:html_escape(Lang.Legend.TextFileEdit) ?> </legend>
<?cs call:form_header("textfile_reset", "") ?>
<?cs call:form_header("textfile_reset") ?>
<input type="hidden" name="file" value="<?cs var:Data.List.File.Name ?>">
<p><textarea name="content" rows="13"

View File

@ -9,7 +9,7 @@
<fieldset>
<legend><?cs var:html_escape(Lang.Legend.TextFiles) ?> </legend>
<?cs call:form_header("select_textfile", "") ?>
<?cs call:form_header("select_textfile") ?>
<ul>
<?cs if:subcount(Data.List.CustomizedFiles) +
subcount(Data.List.DefaultFiles) > 0 ?>

View File

@ -1,5 +1,10 @@
UI {
Top {
Language = 1
Interface = 1
}
Navigation {
DomainSelect = 1
ListSelect = 1
@ -25,8 +30,6 @@ UI {
ListDelete = 1
SubscribeLog = 1
GnupgConvert = 1
Language = 1
Interface = 1
Help = 1
}

View File

@ -1,5 +1,10 @@
UI {
Top {
Language = 1
Interface = 1
}
Navigation {
DomainSelect = 1
ListSelect = 1
@ -33,8 +38,6 @@ UI {
ListDelete = 1
SubscribeLog = 1
GnupgConvert = 1
Language = 1
Interface = 1
Help = 1
}

View File

@ -1,5 +1,10 @@
UI {
Top {
Language = 1
Interface = 1
}
Navigation {
DomainSelect = 1
ListSelect = 1
@ -32,8 +37,6 @@ UI {
ListDelete = 1
SubscribeLog = 1
GnupgConvert = 1
Language = 1
Interface = 1
Help = 1
}

View File

@ -8,13 +8,15 @@ body {
a { text-decoration: none; }
button, select { cursor: pointer; }
/***************** navbar *************************/
/***************** navgation bar *************************/
#nav_bar {
clear: left;
float: left;
width: 20%;
color: inherit;
color: black;
background-color: #3465a4;
background-image: url(horiz_grad_blue.png);
margin: 1%;
@ -27,6 +29,7 @@ a { text-decoration: none; }
#nav_bar hr {
margin: 10px 30px 10px 10px;
font-size: 0%; /* otherwise IE6 adds a huge gap above */
}
#nav_bar ul {
@ -63,7 +66,7 @@ a { text-decoration: none; }
}
#nav_bar a {
color: inherit;
color: black; /* necessary: IE6 ignores 'inherit' */
background-color: inherit;
}
@ -72,35 +75,6 @@ a { text-decoration: none; }
background-color: inherit;
}
#nav_bar form select {
color: inherit;
background-color: #729fcf;
border-width: 1px;
border-style: solid;
border-color: #557353;
}
#nav_bar form button {
color: inherit;
background-color: #babdb6;
border-width: 1px;
border-style: solid;
border-color: #557353;
}
#nav_bar form button:hover {
color: #555753;
background-color: #d3d7cf;
border-width: 1px;
border-style: solid;
border-color: #557353;
cursor: pointer;
}
#nav_bar form {
margin: 7px 0px 7px 0px;
}
/***************************** header **************************/
@ -109,39 +83,80 @@ a { text-decoration: none; }
background-color: #cc0000;
background-image: url(vert_grad_red.png);
background-position: top;
width: 100%;
margin: 0;
padding: 2px 3px 2px 3px;
}
#top * {
background-color: transparent;
}
#top h1 {
#title {
text-align: left;
border-bottom: solid 2px #ffffff;
padding: 5px;
font-weight: bold;
letter-spacing: -1px;
}
#title * {
padding: 0;
margin: 0;
}
#top #perm_nav {
float: right;
padding-right: 5px;
font-size: 100%;
}
#top #perm_nav a {
#title h1 {
font-weight: bold;
padding-left: 2px;
padding-right: 2px;
text-decoration: none;
letter-spacing: -1px;
}
#top #perm_nav a:hover {
color: #e9b96e;
#perm_nav {
padding: 0;
margin: 0;
text-align: right;
}
#perm_nav * {
padding: 0;
margin: 0;
}
#perm_nav p {
padding: 1px 0 2px 0;
}
#perm_nav a {
font-weight: bold;
color: #eeeeec;
background-color: inherit;
}
#perm_nav a:hover {
color: #fce94f;
background-color: inherit;
}
#top form {
font-size: 85%;
margin: 2px 0 2px 0;
}
#top form select {
background-color: #d3d7c4;
margin-right: 4px;
}
#top form select:hover {
background-color: #eeeeec;
}
#top form button {
border-color: #ef2929;
border-style: groove;
background-color: #f57900;
margin-left: 3px;
}
#top form button:hover {
background-color: #fcaf3e;
}
/******************************* content ************************/
@ -171,6 +186,7 @@ a { text-decoration: none; }
#main_content ul {
line-height: 1.8em;
list-style: none;
margin-left: 5px;
}
#main_content ul li {
@ -185,11 +201,12 @@ a { text-decoration: none; }
padding-bottom: 0px;
}
#main_content fieldset {
margin-top: 0.5%;
margin-bottom: 1%;
padding-top: 1%;
padding-bottom: 1.5%;
#main_content > fieldset { /* sub-fieldsets do not need margin/padding */
padding: 5px 5px 10px 5px; /* IE6 acts weird for %-values */
}
#main_content fieldset p {
margin-left: 10px;
}
#main_content fieldset form ul { padding-left: 10px; }
@ -202,16 +219,26 @@ a { text-decoration: none; }
text-align: left;
line-height: 1.2em;
border-width: 0;
/* padding-left: 2%; */
padding-right: 0;
}
#main_content table.list_select td {
padding-left: 5px;
}
#main_content table.subscribe_log {
border-collapse: separate;
border-spacing: 10px 3px;
}
#main_content div.introduction {
font-size: 80%;
}
#main_content div.warning, div.error, div.success {
margin-left: 10%;
#main_content div.warning,
#main_content div.error,
#main_content div.success {
margin-left: 30%; /* we have to include the width of the nav-bar */
margin-right: 10%;
margin-top: 2%;
margin-bottom: 3%;
@ -225,14 +252,14 @@ a { text-decoration: none; }
#main_content div.warning,
#main_content div.error {
color: #2e3436;
background-color: inherit;
background-color: inherit; /* just to avaid css syntax warnings */
}
#main_content div.warning { background-color: #40d070; }
#main_content div.success { background-color: #40d070; }
#main_content div.warning { background-color: #e0a0a0; }
#main_content div.warning { background-color: #ef2929; }
#main_content div.error { background-color: #cc0000; }
#main_content div.error { background-color: #a40000; }
#main_content table.gnupg_keys td {
padding-right: 10px;
@ -255,7 +282,6 @@ a { text-decoration: none; }
background-color: #d3d7cf;
border: 1px dotted #555753;
font-size: 90%;
cursor: pointer;
}
#main_content button:hover {
@ -263,7 +289,6 @@ a { text-decoration: none; }
background-color: #d3d7cf;
border: 1px dotted #ace149;
font-size: 90%;
cursor: pointer;
}
/************************** footer ******************************/
@ -276,7 +301,7 @@ a { text-decoration: none; }
clear: left; /* do not overlap with left navigation bar */
text-align: center;
font-size: 90%;
margin: 0px;
margin: 10px 0 0 0;
padding: 3px;
}

View File

@ -41,7 +41,7 @@
id="stop3683" />
<stop
id="stop5459"
offset="0.5"
offset="0.25"
style="stop-color:#ef2929;stop-opacity:1;" />
<stop
style="stop-color:#ef2929;stop-opacity:1;"
@ -56,7 +56,7 @@
style="stop-color:#3465a4;stop-opacity:1;" />
<stop
style="stop-color:#729fcf;stop-opacity:1;"
offset="0.5"
offset="0.25"
id="stop2794" />
<stop
id="stop2792"
@ -72,23 +72,23 @@
x2="450.08337"
y2="624.87115"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(0,-213.9658)" />
gradientTransform="matrix(2,0,0,1,-65.36665,-117.8995)" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3681"
id="linearGradient3687"
x1="47.064362"
y1="119.26222"
x2="147.06436"
y2="119.26222"
x1="47.053432"
y1="123.98675"
x2="147.06433"
y2="123.98675"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1,0,0,1.25,22.19786,-256.1422)" />
gradientTransform="matrix(4,0,0,1.25,270.9353,58.25642)" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3680"
id="linearGradient2793"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(2,0,0,1,-60.99997,50.21641)"
gradientTransform="matrix(2,0,0,1,-65.36662,159.3826)"
x1="50.083374"
y1="624.87115"
x2="450.08337"
@ -104,9 +104,9 @@
objecttolerance="10"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.45801722"
inkscape:cx="372.04724"
inkscape:cy="526.18109"
inkscape:zoom="0.84666115"
inkscape:cx="287.3556"
inkscape:cy="378.57053"
inkscape:document-units="px"
inkscape:current-layer="layer1"
inkscape:window-width="1014"
@ -174,16 +174,19 @@
<rect
style="opacity:1;fill:url(#linearGradient3687);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect1890"
width="100"
height="100"
x="69.262222"
y="-157.06436"
transform="matrix(0,1,-1,0,0,0)" />
<rect
y="370.9054"
x="50.083374"
height="80"
width="400"
height="100"
x="459.19263"
y="157.3343"
transform="matrix(0,1,-1,0,0,0)"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90"
inkscape:export-filename="/home/lars/subversion/ezmlm-web/trunk/www-data/vert_grad_red.png" />
<rect
y="466.97165"
x="34.800106"
height="80"
width="800"
id="rect1892"
style="opacity:1;fill:url(#linearGradient2786);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
inkscape:export-filename="/home/lars/subversion/ezmlm-web/trunk/www-data/horiz_grad_blue.png"
@ -192,38 +195,38 @@
<text
xml:space="preserve"
style="font-size:32px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
x="52.399776"
y="218.3324"
x="-255.44891"
y="901.71283"
id="text6346"><tspan
sodipodi:role="line"
id="tspan6348"
x="52.399776"
y="218.3324">1x100px</tspan><tspan
x="-255.44891"
y="901.71283">1x400px</tspan><tspan
sodipodi:role="line"
x="52.399776"
y="258.3324"
x="-255.44891"
y="941.71283"
id="tspan6360">90dpi</tspan><tspan
sodipodi:role="line"
x="52.399776"
y="298.3324"
x="-255.44891"
y="981.71283"
id="tspan6350">vert_grad_red.png</tspan></text>
<text
id="text6352"
y="508.71448"
x="53.849804"
y="604.78076"
x="38.566536"
style="font-size:32px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
xml:space="preserve"><tspan
y="508.71448"
x="53.849804"
y="604.78076"
x="38.566536"
id="tspan6354"
sodipodi:role="line">400x1px</tspan><tspan
y="548.71448"
x="53.849804"
sodipodi:role="line">800x1px</tspan><tspan
y="644.78076"
x="38.566536"
sodipodi:role="line"
id="tspan6358">90dpi</tspan><tspan
id="tspan6356"
y="588.71448"
x="53.849804"
y="684.78076"
x="38.566536"
sodipodi:role="line">horiz_grad_blue.png</tspan></text>
<rect
inkscape:export-ydpi="90"
@ -233,25 +236,25 @@
id="rect2783"
width="800"
height="80"
x="39.166756"
y="635.08759" />
x="34.800106"
y="744.25378" />
<text
xml:space="preserve"
style="font-size:32px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Charter"
x="42.933186"
y="772.89667"
x="38.566536"
y="882.06287"
id="text2785"><tspan
sodipodi:role="line"
id="tspan2787"
x="42.933186"
y="772.89667">800x1px</tspan><tspan
x="38.566536"
y="882.06287">800x1px</tspan><tspan
id="tspan2789"
sodipodi:role="line"
x="42.933186"
y="812.89667">90dpi</tspan><tspan
x="38.566536"
y="922.06287">90dpi</tspan><tspan
sodipodi:role="line"
x="42.933186"
y="852.89667"
x="38.566536"
y="962.06287"
id="tspan2791">horiz_grad_blue_long.png</tspan></text>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 8.9 KiB

After

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 257 B

After

Width:  |  Height:  |  Size: 705 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 184 B

After

Width:  |  Height:  |  Size: 1.1 KiB