removed ezmlmwebrc.gnupg file - setting moved to ezmlmwebrc

removed implementation of 'ui_set'
fixed gnupg support
improved gettext support (still needs some testing)
Encode module is now optional (instead of being required)
This commit is contained in:
lars 2007-03-26 19:06:45 +00:00
parent b7d01f0324
commit d845390a9b
29 changed files with 656 additions and 268 deletions

9
TODO
View file

@ -1,3 +1,8 @@
urgent:
- add basic/normal/expert to web interface
- export subscribers
- fix display of language name
clearsilver-Infos updaten
die nicht-Abonnenten-Listen (allow/deny/mod) sagen trotzdem: "x AbonnentInnen"
@ -20,7 +25,3 @@ support for:
* show subscription log
* 'mailinglist' (maybe)
choose basic/normal/expert to disable questions
export subscribers

View file

@ -4,10 +4,12 @@ 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) install the perl module File::Path
1) the following dependencies were added:
- File::Path
- Locale::gettext
2) a new (optional) configuration setting is available: DOTQMAIL_DIR
Use it, if you run a multi domain vpopmail setup.
It can be useful if you run a multi domain vpopmail setup.
3) install Mail::Ezmlm::Gpg if you want to handle encrypted mailing lists
(see README.gnupg for details)
@ -28,7 +30,7 @@ UPGRADING ezmlm-web 2.3 to ezmlm-web 3.0
3) set "TEMPLATE_DIR" in your ezmlmwebrc file to this directory
4) copy the languga directory somewehre and adjust the "LANGUAGE_DIR" setting
4) copy the languge directory somewhere and adjust the "LANGUAGE_DIR" setting
4) maybe you want to define "MAIL_DOMAIN" in your ezmlmwebrc
@ -81,3 +83,4 @@ addaddressfile => 'or you may enter the filename of a plain text file containi
Have a look for these two lines in the new ezmlmwebrc included in this
distribution if you are unsure of how/where to put these.

View file

@ -1,6 +1,6 @@
Version 3.2 - 04/14/02006
* support for encrypted mailing lists
(http://www.synacklabs.net/projects/crypt-ml/)
(https://systemausfall.org/toolforge/gpgpy-ezmlm/)
* detect preferred interface language
* user-specific interface language selection
* handling of empty settings for ezmlm-idx 5.0 fixed (closes #21)
@ -8,6 +8,7 @@ Version 3.2 - 04/14/02006
* bug in MySQL support fixed
* treatment of the special character "dot" in listname and list address fixed
* use gettext for translations (Locale::gettext is now required)
* the formerly required module "Encode" is now optional
Version 3.1.4 - 03/26/02006
* new setting: DOTQMAIL_DIR (useful for multi domain vpopmail setups)

View file

@ -69,3 +69,7 @@ $HTML_LANGUAGE = "en";
# example: LANGUAGE_LIST = ( "en", "de", "si", "jp" );
@LANGUAGE_LIST = ( "en", "de" );
# turn support for encrypted mailing lists on or off - defaults to 0 (off)
# see https://systemausfall.org/toolforge/gpgpy-ezmlm for details
$GPG_SUPPORT = 0;

View file

@ -1,15 +0,0 @@
# sample configuration file for encrypted mailing list support
# You do not need to change anything, if you do not want to
# manage encrypted mailing lists. See README.gnupg for details.
# Put this file besides ezmlmwebrc (just suffixed with ".gnupg").
# BEWARE: enable the following line ONLY if you installed the
# Mail::Ezmlm::Gpg module - otherwise ezmlm-web will not work!
#use Mail::Ezmlm::Gpg;
# turn support for encrypted mailing lists on or off
# defaults to 0 (off)
# you MUST enable the "use" line above, if you want to turn on gnupg support
$GPG_SUPPORT = 0;

View file

@ -21,16 +21,45 @@ use DB_File;
use CGI;
use IO::File;
use POSIX;
use Encode;
use English;
use Locale::gettext;
# the Encode module is optional - we do not break if it is absent
my $ENCODE_SUPPORT = 1;
unless (&safely_import_module("Encode")) {
$ENCODE_SUPPORT = 0;
warn "Encoding module is not available - charset conversion will fail!";
}
# do not forget: we depend on Mail::Ezmlm::Gpg if the corresponding configuration
# setting is turned on
# setting is enabled
# the local names of all available (and some other) languages
my %LANGUAGE_NAMES = (
"cs" => 'Český',
"da" => 'Dansk',
"de" => 'Deutsch',
"en" => 'English',
"es" => 'Español',
"fi" => 'Suomi',
"fr" => 'Français',
"hu" => 'Magyar',
"it" => 'Italiano',
"ja" => '日本語',
"nl" => 'Nederlands',
"pl" => 'Polski',
"pt" => 'Português',
"ru" => 'Русский',
"sl" => 'Slovensko',
"sv" => 'Svenska',
);
################## some preparations at the beginning ##################
# drop privileges (necessary for calling gpg)
# this should not do any other harm
$UID = $EUID;
$GID = $EGID;
@ -48,29 +77,26 @@ $ENV{'PATH'} = '/bin';
# user. :( Don't alter this line unless you are _sure_ you have to.
my @tmp = getpwuid($>); use vars qw[$USER]; $USER=$tmp[0];
# defined by our environment - see above
use vars qw[$HOME_DIR]; $HOME_DIR=$tmp[7];
# use strict is a good thing++
use vars qw[$HOME_DIR]; $HOME_DIR=$tmp[7];
# some configuration settings
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 $HTML_LANGUAGE];
use vars qw[$DEFAULT_HOST @LANGUAGE_LIST];
# some settings for encrypted mailing lists
use vars qw[$GPG_SUPPORT];
# some deprecated configuration settings - they have to be announced
# otherwise old configuration files would break
use vars qw[$LANGUAGE_DIR]; # deprecated since v3.2
# some settings for encrypted mailing lists
use vars qw[$GPG_SUPPORT];
# set default TEXT_ENCODE
use vars qw[$TEXT_ENCODE]; $TEXT_ENCODE='us-ascii'; # by ooyama for multibyte convert support
# "pagedata" contains the hdf tree for clearsilver
# "pagename" refers to the template file that should be used
# "ui_set" is the selected kind of interface ("default", "gnupg", ...)
# "ui_template" is one of "basic", "normal" and "expert"
use vars qw[$pagedata $pagename $error $customError $warning $customWarning $success];
use vars qw[$ui_set $ui_template];
@ -85,38 +111,40 @@ if (defined($opt_C)) {
} elsif (-e "./ezmlmwebrc") {
$config_file = "./ezmlmwebrc"; # Install
} elsif (-e "/etc/ezmlm-web/ezmlmwebrc") {
$config_file = "/etc/ezmlm-web/ezmlmwebrc"; # System (new style)
$config_file = "/etc/ezmlm-web/ezmlmwebrc"; # System (new style - since v2.2)
} elsif (-e "/etc/ezmlm/ezmlmwebrc") {
$config_file = "/etc/ezmlm/ezmlmwebrc"; # System (old style)
$config_file = "/etc/ezmlm/ezmlmwebrc"; # System (old style - up to v2.1)
} else {
&fatal_error("Unable to find config file");
}
do $config_file;
####### validate configuration and apply some default settings ##########
# do we support encrypted mailing lists?
# see http://www.synacklabs.net/projects/crypt-ml/
if (-e "$config_file" . ".gnupg") {
do "$config_file.gnupg";
# the config file should include "use Mail::Ezmlm::Gpg" as the use-line may not
# be used here
if (defined($GPG_SUPPORT) && ($GPG_SUPPORT)) {
# see https://systemausfall.org/toolforge/crypto-ezmlm
$GPG_SUPPORT = 0 unless defined($GPG_SUPPORT);
if (defined($GPG_SUPPORT) && ($GPG_SUPPORT)) {
if (&safely_import_module("Mail::Ezmlm::Gpg")) {
$GPG_SUPPORT = 1;
} else {
$GPG_SUPPORT = 0;
warn "WARNING: Support for encrypted mailinglists is disabled, as the module Mail::Ezmlm::Gpg failed to load!";
}
}
$GPG_SUPPORT = 0 if (!defined($GPG_SUPPORT));
# Allow suid wrapper to over-ride default list directory ...
# Allow suid wrapper to override default list directory ...
if (defined($opt_d)) {
$LIST_DIR = $1 if ($opt_d =~ /^([-\@\w.\/]+)$/);
}
# If WEBUSERS_FILE is not defined in ezmlmwebrc (as before version 2.2),
# then use former default value for compatibility
if (!defined($WEBUSERS_FILE)) {
$WEBUSERS_FILE = $LIST_DIR . '/webusers'
}
$WEBUSERS_FILE = $LIST_DIR . '/webusers' unless (defined($WEBUSERS_FILE));
# set default value of supported languages
@LANGUAGE_LIST = ( 'en', 'de' ) unless (defined(@LANGUAGE_LIST));
# check for non-default dotqmail directory
$DOTQMAIL_DIR = $HOME_DIR unless defined($DOTQMAIL_DIR);
@ -137,10 +165,12 @@ if (defined($MAIL_DOMAIN) && ($MAIL_DOMAIN ne '')) {
}
###################### process a request ########################
# Untaint form input ...
&untaint;
my $pagedata = load_hdf();
my $pagedata = &init_hdf();
my $action = $q->param('action');
# check permissions
@ -227,11 +257,7 @@ elsif ($action eq '' || $action eq 'list_select') {
$pagename = '';
}
if ($pagename ne '') {
if (&is_list_gnupg($q->param('list'))) {
$success = 'UpdateConfig' if (($action eq 'config_do') && &update_gnupg());
} else {
$success = 'UpdateConfig' if (($action eq 'config_do') && &update_config());
}
$success = 'UpdateConfig' if (($action eq 'config_do') && &update_config());
} else {
$error = 'UnknownConfigPage';
warn "missing config page: $subset";
@ -243,25 +269,41 @@ elsif ($action eq '' || $action eq 'list_select') {
}
} elsif ($GPG_SUPPORT && ($action eq 'gnupg_convert_ask')) {
$pagename = 'gnupg_convert';
} elsif ($GPG_SUPPORT && ($action eq 'gnupg_convert_do')) {
} elsif ($GPG_SUPPORT && ($action eq 'gnupg_convert_enable')) {
my $tlist = new Mail::Ezmlm::Gpg("$LIST_DIR/" . $q->param('list'));
if ($tlist->is_gpg()) {
if ($tlist->convert_to_plaintext()) {
$pagename = 'subscribers';
$success = 'GnupgConvert';
} else {
warn $tlist->errmsg();
$pagename = 'gnupg_convert';
$warning = 'GnupgConvert';
}
if ($tlist->is_encrypted()) {
$pagename = 'gnupg_convert';
$warning = 'GnupgConvertAlreadyEnabled';
} else {
if ($tlist->convert_to_encrypted()) {
$pagename = 'gnupg_generate_key';
$success = 'GnupgConvert';
if ($tlist->enable_encryption()) {
# if the keyring already contains a secret key, then we do not
# need to generate a new one
my @secret_keys = $tlist->get_secret_keys();
if ($#secret_keys >= 0) {
$pagename = 'gnupg_secret';
} else {
$pagename = 'gnupg_generate_key';
}
$success = 'GnupgConvertEnable';
} else {
warn $tlist->errmsg();
$pagename = 'gnupg_convert';
$warning = 'GnupgConvert';
$warning = 'GnupgConvertEnable';
}
}
} elsif ($GPG_SUPPORT && ($action eq 'gnupg_convert_disable')) {
my $tlist = new Mail::Ezmlm::Gpg("$LIST_DIR/" . $q->param('list'));
unless ($tlist->is_encrypted()) {
$pagename = 'gnupg_convert';
$warning = 'GnupgConvertAlreadyDisabled';
} else {
if ($tlist->disable_encryption()) {
$pagename = 'gnupg_convert';
$success = 'GnupgConvertDisable';
} else {
warn $tlist->errmsg();
$pagename = 'gnupg_convert';
$warning = 'GnupgConvertDisable';
}
}
} elsif ($GPG_SUPPORT && (($action eq 'gnupg_ask') || ($action eq 'gnupg_do'))) {
@ -269,12 +311,12 @@ elsif ($action eq '' || $action eq 'list_select') {
my $subset = $q->param('gnupg_subset');
if (defined($q->param('list')) && ($subset ne '')) {
if (($subset =~ /^[\w]*$/) && (-e "$TEMPLATE_DIR/gnupg_$subset" . ".cs")) {
$pagename = 'gnupg_' . $subset;
} else {
$pagename = '';
}
if ($pagename ne '') {
$success = 'UpdateGnupg' if (($action eq 'gnupg_do') && &manage_gnupg_keys());
if ($action eq 'gnupg_do') {
$success = 'UpdateGnupg' if (&manage_gnupg_keys());
} else {
# warnings are defined in the respective subs
$pagename = 'gnupg_' . $subset;
}
} else {
$error = 'UnknownGnupgPage';
warn "missing gnupg page: $subset";
@ -291,7 +333,7 @@ elsif ($action eq '' || $action eq 'list_select') {
} else {
$warning = 'GnupgExportKey';
# TODO: pagename is quite random here ...
$pagename = 'gnupg_secret';
$pagename = 'gnupg_public';
}
} else {
$error = 'ParameterMissing';
@ -388,17 +430,16 @@ exit;
# =========================================================================
sub load_hdf {
sub init_hdf {
# initialize the data for clearsilver
my $hdf = ClearSilver::HDF->new();
&fatal_error("Template dir ($TEMPLATE_DIR) not found!") unless (-e $TEMPLATE_DIR);
$hdf->setValue("TemplateDir", "$TEMPLATE_DIR/");
# "normal", "basic" and "expert" should be supported
# "normal", "basic" and "expert" should be supported soon
# TODO: should be selected via web interface
$ui_template = "normal";
$ui_set = "default"; # may be overwritten later
$hdf->setValue("Config.UI.LinkAttrs.template", $ui_template);
# retrieve available languages and add them to the dataset
@ -414,6 +455,9 @@ sub load_hdf {
$hdf->setValue("Stylesheet", "$HTML_CSS_FILE");
$hdf->setValue("Config.PageTitle", "$HTML_TITLE");
# support for encrypted mailing lists?
$hdf->setValue("Config.Features.Crypto", 1) if ($GPG_SUPPORT);
return $hdf;
}
@ -422,7 +466,7 @@ sub load_hdf {
sub output_page {
# Print the page
my $ui_template_file = "$TEMPLATE_DIR/ui/$ui_set/${ui_template}.hdf";
my $ui_template_file = "$TEMPLATE_DIR/ui/${ui_template}.hdf";
&fatal_error("UI template file ($ui_template_file) not found")
unless (-e $ui_template_file);
$pagedata->readFile($ui_template_file);
@ -456,8 +500,8 @@ sub output_page {
# ---------------------------------------------------------------------------
sub load_interface_language
{
sub load_interface_language {
my ($data) = @_;
my $config_language;
@ -495,16 +539,24 @@ sub load_interface_language
# ---------------------------------------------------------------------------
sub translate_language_data
{
sub translate_language_data {
my ($hdf, $language) = @_;
my $langdata;
my %translation;
my $key;
# create gettext object
&setlocale(POSIX::LC_MESSAGES, $language);
# TODO: getttext support seems to be broken???
# TODO: provide an alternative, if no gettext is available
#&setlocale(POSIX::LC_MESSAGES, $language);
&textdomain("ezmlm-web");
warn "failed to set locale: $@" unless (&setlocale(LC_ALL, ''));
# "setlocale" seems to need "de_DE" instead of just "de" - so we will
# use the environment setting instead
# see http://lists.debian.org/debian-perl/2000/01/msg00016.html
# beware that no other programs are called afterwards: their output may suffer :)
$ENV{LC_ALL} = "$language";
# read language template
$langdata = ClearSilver::HDF->new();
@ -519,8 +571,8 @@ sub translate_language_data
# ---------------------------------------------------------------------------
sub recurse_hdf
{
sub recurse_hdf {
my ($node, $prefix) = @_;
my ($value, $child, $next, %result, %sub_result, $key);
$value = $node->objValue();
@ -546,8 +598,8 @@ sub recurse_hdf
# this code was adapted from Per Cederberg
# http://www.percederberg.net/home/perl/select.perl
# it returns an empty string, if no supported language was found
sub get_browser_language
{
sub get_browser_language {
my ($str, @langs, @res);
# Use language preference settings
@ -570,8 +622,8 @@ sub get_browser_language
# ---------------------------------------------------------------------------
sub set_pagedata_list_of_lists()
{
sub set_pagedata_list_of_lists {
my (@files, $i, $num);
# Read the list directory for mailing lists.
@ -592,8 +644,8 @@ sub set_pagedata_list_of_lists()
# ---------------------------------------------------------------------------
sub set_pagedata()
{
sub set_pagedata {
my ($hostname, $username);
# read available list of lists
@ -645,9 +697,8 @@ sub set_pagedata()
# default username for webuser file
$pagedata->setValue("Data.WebUser.UserName", $ENV{'REMOTE_USER'}||'ALL');
# list specific configuration
if ($q->param('list') ne '' )
{
# list specific configuration - use defaults if no list is selected
if ($q->param('list') ne '' ) {
&set_pagedata4list(&get_list_part());
} else {
&set_pagedata4options($DEFAULT_OPTIONS);
@ -656,32 +707,37 @@ sub set_pagedata()
# ---------------------------------------------------------------------------
sub set_pagedata4list
{
my $part_type = shift;
sub set_pagedata4list {
my $listname = $q->param('list');
my $part_type = shift;
my ($listname, $list);
$listname = $q->param('list');
if (! -e "$LIST_DIR/$listname/lock" ) {
$warning = 'ListDoesNotExist' if ($warning eq '');
return;
return (1==0);
}
# do the common configuration for all kind of lists
&set_pagedata4list_common($listname, $part_type);
# is this list encrypted?
if (&is_list_gnupg($listname)) {
# some encryption specific stuff
&set_pagedata4list_gnupg($listname);
$pagedata->setValue("Data.List.Type","gnupg");
$ui_set = "gnupg";
} else {
# do the non-encryption configuration
&set_pagedata4list_normal($listname, $part_type);
$pagedata->setValue("Data.List.Type","default");
$ui_set = "default";
}
# Work out the address of this list ...
$list = new Mail::Ezmlm("$LIST_DIR/$listname");
$pagedata->setValue("Data.List.Name", "$listname");
$pagedata->setValue("Data.List.Address", &this_listaddress);
# do we support encryption? Set some data if the list is encrypted ...
&set_pagedata_crypto($listname) if ($GPG_SUPPORT);
# is this a moderation/administration list?
&set_pagedata4part_list($part_type) if ($part_type ne '');
&set_pagedata_subscribers($list, $listname, $part_type);
&set_pagedata_misc_configfiles($list);
&set_pagedata_textfiles($list);
&set_pagedata_webusers($list, $listname);
&set_pagedata_localization($list);
&set_pagedata4options($list->getconfig);
return (0==0);
}
@ -689,13 +745,16 @@ sub set_pagedata4list
# ---------------------------------------------------------------------------
# extract hdf-data for encrypted lists
# non-encrypted lists should not use this function
sub set_pagedata4list_gnupg() {
sub set_pagedata_crypto {
my ($listname) = @_;
my ($gpg_list, %config, $item, @gpg_keys, $gpg_key);
$gpg_list = new Mail::Ezmlm::Gpg("$LIST_DIR/$listname");
return unless ($gpg_list->is_encrypted());
$pagedata->setValue("Data.List.Features.Crypto", 1);
# read the configuration
%config = $gpg_list->getconfig();
foreach $item (keys %config) {
@ -723,43 +782,10 @@ sub set_pagedata4list_gnupg() {
# ---------------------------------------------------------------------------
# extract hdf-data for "normal" (e.g. not encrypted) lists
# special kinds of lists should not use this function
sub set_pagedata4list_normal() {
my ($listname, $part_type) = @_;
sub set_pagedata_misc_configfiles {
my $list = new Mail::Ezmlm("$LIST_DIR/$listname");
&set_pagedata4options($list->getconfig);
}
# ---------------------------------------------------------------------------
# extract hdf-data for all kinds of lists (both encrypted and non-encrypted)
sub set_pagedata4list_common() {
my ($listname, $part_type) = @_;
my ($list, $webusers);
my ($i, $item, @files);
my ($address, $addr_name, %pretty);
# Work out the address of this list ...
$list = new Mail::Ezmlm("$LIST_DIR/$listname");
$pagedata->setValue("Data.List.Name", "$listname");
$pagedata->setValue("Data.List.Address", &this_listaddress);
&set_pagedata4part_list($part_type) if ($part_type ne '');
$i = 0;
tie %pretty, "DB_File", "$LIST_DIR/$listname/webnames" if ($PRETTY_NAMES);
foreach $address (sort $list->subscribers($part_type)) {
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++;
}
untie %pretty if ($PRETTY_NAMES);
my $list = shift;
my ($item);
# Get the contents of some important files
$item = $list->getpart('prefix');
@ -779,56 +805,78 @@ sub set_pagedata4list_common() {
$list->getpart('msgsize') =~ m/^\s*(\d+)\s*:\s*(\d+)\s*$/;
$pagedata->setValue("Data.List.MsgSize.Max", "$1");
$pagedata->setValue("Data.List.MsgSize.Min", "$2");
}
# TODO: this is definitely ugly - create a new sub!
if (open(WEBUSER, "<$WEBUSERS_FILE")) {
while(<WEBUSER>) {
last if (($webusers) = m{^$listname\s*\:\s*(.+)$});
# ---------------------------------------------------------------------------
sub set_pagedata_subscribers {
my ($list, $listname, $part_type) = @_;
my ($i, $address, $addr_name, %pretty);
$i = 0;
tie %pretty, "DB_File", "$LIST_DIR/$listname/webnames" if ($PRETTY_NAMES);
foreach $address (sort $list->subscribers($part_type)) {
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);
}
close WEBUSER;
$i++;
}
# set default if there was no list definition
$webusers ||= $ENV{'REMOTE_USER'} || 'ALL';
untie %pretty if ($PRETTY_NAMES);
}
$pagedata->setValue("Data.List.WebUsers", "$webusers");
# ---------------------------------------------------------------------------
# get the names of the textfiles of this list
{
@files = sort $list->get_available_text_files();
$i = 0;
# set the names of the textfiles of this list
sub set_pagedata_textfiles {
foreach $item (@files) {
if ($list->is_text_default($item)) {
$pagedata->setValue('Data.List.DefaultFiles.' . $i , "$item");
} else {
$pagedata->setValue('Data.List.CustomizedFiles.' . $i , "$item");
}
$i++;
}
# text file specified?
if (($q->param('file') ne '') && ($q->param('file') =~ m/^[\w-]*$/)) {
my ($content);
$content = $list->get_text_content($q->param('file'));
# get character set of current list (ignore ":Q" prefix)
my ($charset) = split(':',$list->get_charset());
# use default for ezmlm-idx<5.0
$charset = 'us-ascii' if ($charset eq '');
warn "Charset: $charset";
my $content_utf8;
eval { $content_utf8 = Encode::decode($charset, $content); };
# use $content if conversion failed somehow
if ($@) {
$content_utf8 = $content;
warn "Conversion failed for charset '$charset'";
}
$pagedata->setValue("Data.List.File.Name", $q->param('file'));
$pagedata->setValue("Data.List.File.Content", "$content_utf8");
$pagedata->setValue("Data.List.File.isDefault",
$list->is_text_default($q->param('file')) ? 1 : 0);
my $list = shift;
my ($i, @files, $item);
@files = sort $list->get_available_text_files();
$i = 0;
foreach $item (@files) {
if ($list->is_text_default($item)) {
$pagedata->setValue('Data.List.DefaultFiles.' . $i , "$item");
} else {
$pagedata->setValue('Data.List.CustomizedFiles.' . $i , "$item");
}
$i++;
}
# text file specified?
if (($q->param('file') ne '') && ($q->param('file') =~ m/^[\w-]*$/)) {
my ($content);
$content = $list->get_text_content($q->param('file'));
# get character set of current list (ignore ":Q" prefix)
my ($charset) = split(':',$list->get_charset());
# use default for ezmlm-idx<5.0
$charset = 'us-ascii' if ($charset eq '');
my $content_utf8;
eval { $content_utf8 = Encode::decode($charset, $content); };
# use $content if conversion failed somehow
if ($@) {
$content_utf8 = $content;
# no warning, if the encoding support is not available
warn "Conversion failed for charset '$charset'" if ($ENCODE_SUPPORT);
}
$pagedata->setValue("Data.List.File.Name", $q->param('file'));
$pagedata->setValue("Data.List.File.Content", "$content_utf8");
$pagedata->setValue("Data.List.File.isDefault",
$list->is_text_default($q->param('file')) ? 1 : 0);
}
}
# ---------------------------------------------------------------------------
sub set_pagedata_localization {
my $list = shift;
my ($i, $item);
# get available languages for this list
# no result for ezmlm-idx < 5
$i = 0;
@ -849,7 +897,31 @@ sub set_pagedata4list_common() {
# ---------------------------------------------------------------------------
sub set_pagedata_webusers {
my ($list, $listname) = @_;
my ($webusers);
# retrieve the users of the list by reading the webusers file
if (open(WEBUSER, "<$WEBUSERS_FILE")) {
while(<WEBUSER>) {
# ok - this is very short:
# $webusers becomes the matched group as soon as we find the
# line of the list - and: no, we do not need "=~" instead of "="
last if (($webusers) = m{^$listname\s*\:\s*(.+)$});
}
close WEBUSER;
}
# set default if there was no list definition
$webusers ||= $ENV{'REMOTE_USER'} || 'ALL';
$pagedata->setValue("Data.List.WebUsers", "$webusers");
}
# ---------------------------------------------------------------------------
sub set_pagedata4options {
my($options) = shift;
my($i, $list, $key, $state, $value, $dir_of_list);
@ -935,12 +1007,12 @@ sub get_list_part
# ---------------------------------------------------------------------------
sub is_list_gnupg {
sub is_list_encrypted {
my ($listname) = @_;
return (1==0) unless ($GPG_SUPPORT);
my $gpg_list = new Mail::Ezmlm::Gpg("$LIST_DIR/$listname");
return $gpg_list->is_gpg();
return $gpg_list->is_encrypted();
}
# ---------------------------------------------------------------------------
@ -975,9 +1047,7 @@ sub get_dotqmail_files {
# get list of existing files (remove empty entries)
@files = grep {/./} map { (-e "$qmail_prefix$_")? "$qmail_prefix$_" : undef } (
'',
'.no-gpg',
'-default',
'-default.no-gpg',
'-owner',
'-return-default',
'-reject-default',
@ -1406,25 +1476,26 @@ sub extract_options_from_params()
sub manage_gnupg_keys()
# manage gnupg keys
{
return (1==0) unless ($GPG_SUPPORT);
my ($list, $listname, $upload_file);
$listname = $q->param('list');
return (0==1) unless (&is_list_gnupg($listname));
return (0==1) unless (&is_list_encrypted($listname));
$list = new Mail::Ezmlm::Gpg("$LIST_DIR/$listname");
my $subset = $q->param('gnupg_subset');
if (defined($q->param('gnupg_key_file'))) {
$pagename = 'gnupg_public';
return &gnupg_import_key($list, $q->param('gnupg_key_file'));
} elsif (($subset eq 'public') || ($subset eq 'secret')) {
$pagename = "gnupg_$subset";
return &gnupg_remove_key($list);
} elsif ($subset eq 'generate_key') {
if (&gnupg_generate_key($list)) {
if (&gnupg_generate_key($list, $listname)) {
$pagename = 'gnupg_secret';
return (0==0);
} else {
$pagename = 'gnupg_generate_key';
return (0==1);
}
} else {
@ -1502,12 +1573,33 @@ sub gnupg_import_key()
# ------------------------------------------------------------------------
sub gnupg_generate_key() {
my ($list) = @_;
my ($list, $listname) = @_;
my ($key_name, $key_comment, $key_size, $key_expires);
$key_name = $q->param('gnupg_keyname');
$key_comment = $q->param('gnupg_keycomment');
$key_size = $q->param('gnupg_keysize');
$key_expires = $q->param('gnupg_keyexpires');
if (defined($q->param('gnupg_keyname'))) {
$key_name = $q->param('gnupg_keyname');
} else {
$key_name = $listname;
}
if (defined($q->param('gnupg_keycomment'))) {
$key_comment = $q->param('gnupg_keycomment');
} else {
$key_comment = "Mailing list";
}
if (defined($q->param('gnupg_keysize'))) {
$key_size = $q->param('gnupg_keysize');
} else {
$key_size = 2048;
}
if (defined($q->param('gnupg_keyexpires'))) {
$key_expires = $q->param('gnupg_keyexpires');
} else {
$key_expires = 0;
}
unless ($key_name) {
$warning = 'GnupgNoName';
@ -1560,25 +1652,45 @@ sub gnupg_remove_key() {
# ------------------------------------------------------------------------
sub update_gnupg {
# save the new gnupg configuration
# TODO: add headeradd and so on ...
sub update_config_crypto {
# save gpgpy-ezmlm settings
# call this function somewhere during "update_config" for encrypted lists
# only encryption-settings are used - the rest is ignored
my ($list, %switches);
return (1==0) unless ($GPG_SUPPORT);
my @ALLOWED_GNUPG_SWITCHES = ( 'sign_messages', 'plain_without_key' );
$list = new Mail::Ezmlm::Gpg("$LIST_DIR/" . $q->param('list'));
return (0==0) unless ($list->is_encrypted());
# retrieve the configuration settings from the CGI input
my ($one_switch, $one_value, $key);
my @all_params = $q->param;
foreach $one_switch (@all_params) {
if ($one_switch =~ /^available_option_gnupg_(\w*)$/) {
$key = $1;
$switches{$key} = (defined($q->param('option_gnupg_' . $key))) ? 1 : 0;
$key = lc($1);
# the gnupg directory setting may not be accessible via the web
# interface, as this would expose the private keys of other lists
# this would be VERY, VERY ugly!
# Result: we use the whitelist above
my $avail_switch;
foreach $avail_switch (@ALLOWED_GNUPG_SWITCHES) {
next if ($key ne $avail_switch);
$switches{$key} = (defined($q->param('option_gnupg_' . $key))) ? 1 : 0;
}
}
}
$list->update(%switches) && return (0==0);
return (1==0);
# Any changes? Otherwise just return.
# beware: the length function returns "1" for empty hashes
return (0==0) if (length(%switches) <= 1);
# update the configuration file
if ($list->update(%switches)) {
return (0==0);
} else {
return (1==0);
}
}
# ------------------------------------------------------------------------
@ -1672,7 +1784,8 @@ sub update_config {
}
# update language
# this _must_ happen after set_charset to avaoid accidently overriding default charset
# this _must_ happen after set_charset to avoid accidently overriding
# the default charset
if (defined($q->param('list_language'))) {
if (&check_list_language($list, $q->param('list_language'))) {
$list->set_lang($q->param('list_language'));
@ -1681,6 +1794,10 @@ sub update_config {
}
}
# gnupg options?
&update_config_crypto() if ($GPG_SUPPORT);
# change webuser setting
unless (&update_webusers()) {
$warning = 'WebUsersUpdate';
return (1==0);
@ -1766,7 +1883,8 @@ sub save_text {
eval { $content_encoded = Encode::encode($charset, $content); };
if ($@) {
$content_encoded = $content;
warn "Conversion failed for charset '$charset'";
# no warning, if the encoding support is not available
warn "Conversion failed for charset '$charset'" if ($ENCODE_SUPPORT);
}
unless ($list->set_text_content($q->param('file'), $content_encoded)) {
$warning = 'SaveFile';
@ -1850,8 +1968,11 @@ sub webauth_create_allowed {
sub get_available_interface_languages {
my (%languages, $lang_id);
foreach $lang_id (@LANGUAGE_LIST) {
# TODO: retrieve the local spelling of each language
$languages{$lang_id} = $lang_id;
if (defined($LANGUAGE_NAMES{$lang_id})) {
$languages{$lang_id} = $LANGUAGE_NAMES{$lang_id};
} else {
$languages{$lang_id} = $lang_id;
}
}
return %languages;
}
@ -1878,6 +1999,22 @@ sub check_list_language {
# ---------------------------------------------------------------------------
sub safely_import_module {
# import a module if it exists
# otherwise False is returned
my ($mod_name) = @_;
eval "use $mod_name";
if ($@) {
warn "Failed to load module '$mod_name': $@";
return (1==0);
} else {
return (0==0);
}
}
# ---------------------------------------------------------------------------
sub fatal_error() {
my $text = shift;

View file

@ -14,6 +14,7 @@ Data.List.Address
Data.List.CharSet
Data.List.CustomizedFiles.*
Data.List.DefaultFiles.*
Data.List.Features.Crypto
Data.List.File.Name
Data.List.File.Content
Data.List.File.isDefault

View file

@ -0,0 +1,25 @@
<div class="title">
<h1><?cs var:html_escape(Lang.Title.GnupgOptions) ?></h1>
</div>
<div class="introduction">
<p><?cs var:html_escape(Lang.Introduction.GnupgOptions) ?></p>
</div>
<fieldset class="form">
<legend><?cs var:html_escape(Lang.Legend.GnupgOptions) ?> </legend>
<form method="post" action="<?cs call:link("","","","","","") ?>" enctype="application/x-www-form-urlencoded">
<input type="hidden" name="config_subset" value="encryption" />
<?cs call:show_options(UI.Options.Config.GnupgOptions) ?>
<!-- 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>
</form>
</fieldset>

View file

@ -1,3 +0,0 @@
<!-- REMOVE --><?cs include:TemplateDir + '/macros.cs' ?>
<!-- Gnupg: allow key submission -->
<?cs call:checkbox("gnupg_allowKeySubmission") ?>

View file

@ -1,3 +0,0 @@
<!-- REMOVE --><?cs include:TemplateDir + '/macros.cs' ?>
<!-- Gnupg: encrypt to all -->
<?cs call:checkbox("gnupg_encryptToAll") ?>

View file

@ -1,4 +1,8 @@
<?cs if:Data.List.Features.Crypto ?>
<!-- comment for the key (second part of the human readable key description) -->
<label for="gnupg_keycomment"><?cs var:html_escape(Lang.Misc.GnupgKeyComment) ?>:</label>
<input type="text" name="gnupg_keycomment" id="gnupg_keycomment" size="25">
<input type="text" name="gnupg_keycomment" id="gnupg_keycomment" size="25"
value="Mailing list" />
<?cs /if ?>

View file

@ -1,11 +1,15 @@
<?cs if:Data.List.Features.Crypto ?>
<!-- expiration of the key (in years) -->
<label for="gnupg_keyexpires"><?cs var:html_escape(Lang.Misc.GnupgKeyExpires) ?>:</label>
<select name="gnupg_keyexpires" id="gnupg_keyexpires" size="0">
<option value="0"><?cs var:html_escape(Lang.Misc.Never) ?></option>
<option value="0" selected="selected"><?cs
var:html_escape(Lang.Misc.Never) ?></option>
<option value="1y">1</option>
<option value="2y">2</option>
<option value="3y">3</option>
<option value="5y">5</option>
<option value="10y">10</option>
</select>
<?cs /if ?>

View file

@ -1,4 +1,8 @@
<?cs if:Data.List.Features.Crypto ?>
<!-- name of the key (first part of the human readable key description) -->
<label for="gnupg_keyname"><?cs var:html_escape(Lang.Misc.GnupgKeyName) ?>:</label>
<input type="text" name="gnupg_keyname" id="gnupg_keyname" size="25">
<input type="text" name="gnupg_keyname" id="gnupg_keyname" size="25"
value="<?cs var:html_escape(Data.List.Name) ?>" />
<?cs /if ?>

View file

@ -1,3 +1,4 @@
<?cs if:Data.List.Features.Crypto ?>
<!-- REMOVE --><?cs include:TemplateDir + '/macros.cs' ?>
<!-- length of the key (bytes) -->
<label for="gnupg_keysize"><?cs var:html_escape(Lang.Misc.GnupgKeySize) ?>:</label>
@ -6,4 +7,5 @@
<option selected="selected">2048</option>
<option>4096</option>
</select>
<?cs /if ?>

View file

@ -1,3 +1,6 @@
<?cs if:Data.List.Features.Crypto ?>
<!-- REMOVE --><?cs include:TemplateDir + '/macros.cs' ?>
<!-- Gnupg: send plaintext if no key is available -->
<?cs call:checkbox("gnupg_NokeyNocrypt") ?>
<?cs call:checkbox("gnupg_plain_without_key") ?>
<?cs /if ?>

View file

@ -1,3 +0,0 @@
<!-- REMOVE --><?cs include:TemplateDir + '/macros.cs' ?>
<!-- Gnupg: require signed messages -->
<?cs call:checkbox("gnupg_requireSigs") ?>

View file

@ -1,3 +0,0 @@
<!-- REMOVE --><?cs include:TemplateDir + '/macros.cs' ?>
<!-- Gnupg: require subscriber -->
<?cs call:checkbox("gnupg_RequireSub") ?>

View file

@ -1,3 +1,6 @@
<?cs if:Data.List.Features.Crypto ?>
<!-- REMOVE --><?cs include:TemplateDir + '/macros.cs' ?>
<!-- Gnupg: sign outgoing messages -->
<?cs call:checkbox("gnupg_signMessages") ?>
<?cs call:checkbox("gnupg_sign_messages") ?>
<?cs /if ?>

View file

@ -1,3 +0,0 @@
<!-- REMOVE --><?cs include:TemplateDir + '/macros.cs' ?>
<!-- Gnupg: require keys to be trusted -->
<?cs call:checkbox("gnupg_VerifiedKeyReq") ?>

View file

@ -11,14 +11,15 @@
<form method="post" action="<?cs call:link("","","","","","") ?>" enctype="application/x-www-form-urlencoded">
<input type="hidden" name="list" value="<?cs var:Data.List.Name ?>" />
<input type="hidden" name="action" value="gnupg_convert_do" />
<button type="submit" name="send" value="do"><?cs
if:Data.List.Type == "gnupg" ?><?cs
var:html_escape(Lang.Buttons.GnupgConvertToNormal) ?><?cs
else ?><?cs
var:html_escape(Lang.Buttons.GnupgConvertToEncrypted) ?><?cs
/if ?></button>
<?cs if:Data.List.Features.Crypto
?><button type="submit" name="send" value="do"><?cs
var:html_escape(Lang.Buttons.GnupgConvertToPlain) ?></button>
<input type="hidden" name="action" value="gnupg_convert_disable" /><?cs
else
?><button type="submit" name="send" value="do"><?cs
var:html_escape(Lang.Buttons.GnupgConvertToEncrypted) ?></button>
<input type="hidden" name="action" value="gnupg_convert_enable" /><?cs
/if ?>
</form>
</fieldset>

View file

@ -23,3 +23,4 @@
</form>
</fieldset>

View file

@ -31,4 +31,3 @@
</fieldset>

View file

@ -26,7 +26,9 @@
<td><label for="gnupg_key_<?cs var:key.id ?>"><?cs
var:html_escape(key.email) ?></label></td>
<td><label for="gnupg_key_<?cs var:key.id ?>"><?cs
var:html_escape(key.expires) ?></label></td>
if:key.expires ?><?cs var:html_escape(key.expires) ?><?cs
else ?><?cs var:html_escape(Lang.Misc.Never) ?><?cs /if
?></label></td>
<td><a href="<?cs call:link("action", "gnupg_export",
"list", Data.List.Name,
"gnupg_keyid", key.id) ?>"

View file

@ -26,7 +26,9 @@
<td><label for="gnupg_key_<?cs var:key.id ?>"><?cs
var:html_escape(key.email) ?></label></td>
<td><label for="gnupg_key_<?cs var:key.id ?>"><?cs
var:html_escape(key.expires) ?></label></td>
if:key.expires ?><?cs var:html_escape(key.expires) ?><?cs
else ?><?cs var:html_escape(Lang.Misc.Never) ?><?cs /if
?></label></td>
<td><a href="<?cs call:link("action", "gnupg_export",
"list", Data.List.Name,
"gnupg_keyid", key.id) ?>"

View file

@ -1,9 +1,5 @@
Lang {
ID = en
Name = English
Menue {
ListCreate = Create new list
ListDelete = Delete list
@ -24,6 +20,7 @@ Lang {
GnupgSecretKeys = secret keys
GnupgGenerateKey = generate key
GnupgConvert = Encryption
GnupgOptions = encryption
TextFiles = Text files
ListSelect = Choose a list
Properties = Properties of
@ -54,6 +51,7 @@ Lang {
GnupgPublic = Public keys
GnupgSecret = Secret keys
GnupgGenerate = Generate a new keypair
GnupgOptions = Encryption settings
}
@ -69,7 +67,7 @@ Lang {
ResetFile = Remove customized file
LanguageSet = select
GnupgConvertToEncrypted = Convert to an encrypted mailinglist
GnupgConvertToNormal = Convert to a plaintext mainlinglist
GnupgConvertToPlain = Convert to a plaintext mainlinglist
DeletePublicKey = Delete public key(s)
DeleteSecretKey = Delete secret key(s)
GnupgImportKey = Import key
@ -125,7 +123,10 @@ Lang {
GnupgInvalidExpiration = The expiration time is invalid!
GnupgInvalidKeySize = The length of the key is invalid!
GnupgExportKey = Export of key failed!
GnupgConvert = Conversion to encrypted mailing list failed!
GnupgConvertEnable = Conversion to encrypted mailing list failed!
GnupgConvertDisable = Conversion to plaintext mailing list failed!
GnupgConvertAlreadyEnabled = Encryption was already enabled for this mailing list.
GnupgConvertAlreadyDisabled = Encryption was already disabled for this mailing list.
}
@ -139,7 +140,8 @@ Lang {
SaveFile = The file was saved.
ResetFile = The customized text file was successfully removed. From now on, the system-wide default text file will be used instead of it.
GnupgKeyImport = The key was successfully imported.
GnupgConvert = Encryption is now enabled for this list.
GnupgConvertEnable = Encryption is now enabled for this list.
GnupgConvertDisable = Encryption is now disabled for this list.
}
@ -166,13 +168,8 @@ Lang {
w = Remove the ezmlm-warn invocations from the list setup (rarely useful)
x = Remove or reject specific mime types in messages
y = Request a confirmation mail for every posted message
gnupg_allowKeySubmission = Allow key submission via mail
gnupg_encryptToAll = Encrypt to all recipients at once (do not encrypt inividually)
gnupg_NokeyNocrypt = Send plaintext to the subscribers which have no key
gnupg_RequireSub = Only subscribers may post messages
gnupg_signMessages = Sign outgoing messages with the list's key
gnupg_VerifiedKeyReq = Use only verified keys
gnupg_requireSigs = Only verifiably signed messages are accepted
gnupg_plain_without_key = Send plaintext to the subscribers which have no key
gnupg_sign_messages = Sign outgoing messages with the list's key
}
@ -260,6 +257,7 @@ Lang {
ResetTextFile = This text file was customized for this list. If you want to use the system-wide default text file of the choosen language instead, you may remove this customized file.
GnupgConvert = You can convert a normal mailinglist to an encrypted list and vice versa.
GnupgGenerateKey = Every encrypted mailing list needs a secret key. You can import this key or create it using the form below. After submitting the form, you have to be patient, as it takes some time (up to several minutes) to create a key.
GnupgOptions = Configure some useful settings of the encrypted mailing list.
}
Legend {
@ -288,5 +286,6 @@ Lang {
GnupgSecretKeys = Secret keys of this list
GnupgKeyImport = Import a key
GnupgGenerateKey = Generate the key for this list
GnupgOptions = Encryption settings
}
}

View file

@ -92,6 +92,14 @@
"config_subset","processing") ?>"
title="<?cs var:html_escape(Lang.Menue.ConfigProcess) ?>"><?cs
var:html_escape(Lang.Menue.ConfigProcess) ?></a></li><?cs /if ?>
<?cs if:(UI.Navigation.Config.GnupgOptions == 1) &&
Data.List.Features.Crypto
?><li><a <?cs if:(Data.Action == "config_encryption")
?> class="nav_active"<?cs /if ?>
href="<?cs call:link("list",Data.List.Name,"action","config_ask",
"config_subset","encryption") ?>"
title="<?cs var:html_escape(Lang.Menue.GnupgOptions) ?>"><?cs
var:html_escape(Lang.Menue.GnupgOptions) ?></a></li><?cs /if ?>
<?cs if:UI.Navigation.Config.Archive == 1
?><li><a <?cs if:(Data.Action == "config_archive") ?>
class="nav_active"<?cs /if ?>
@ -115,7 +123,7 @@
var:html_escape(Lang.Menue.ConfigAll) ?></a></li><?cs /if ?>
</ul></li>
<?cs if:subcount(UI.Navigation.Gnupg) > 0
<?cs if:(subcount(UI.Navigation.Gnupg) > 0) && (Data.List.Features.Crypto)
?><li><font class="no_link"><?cs var:html_escape(Lang.Menue.Gnupg)
?></font>
<ul>
@ -149,7 +157,7 @@
title="<?cs var:html_escape(Lang.Menue.TextFiles) ?>"><?cs
var:html_escape(Lang.Menue.TextFiles) ?></a></li><?cs /if ?>
<?cs if:UI.Navigation.GnupgConvert == 1
<?cs if:(UI.Navigation.GnupgConvert == 1) && Config.Features.Crypto
?><li><a <?cs if:(Data.Action == "gnupg_convert_ask") ||
(Data.Action == "gnupg_convert_do") ?> class="nav_active"<?cs /if ?>
href="<?cs call:link("list",Data.List.Name,"action","gnupg_convert_ask","","") ?>"

View file

@ -21,6 +21,12 @@ UI {
All = 1
}
Gnupg {
PublicKeys = 1
SecretKeys = 1
GenerateKey = 1
}
TextEdit = 1
ListDelete = 1
GnupgConvert = 1

View file

@ -19,7 +19,6 @@ UI {
TextEdit = 1
ListDelete = 1
GnupgConvert = 1
Language = 1
Interface = 1
Help = 1

209
template/ui/normal.hdf Normal file
View file

@ -0,0 +1,209 @@
UI {
Navigation {
ListSelect = 1
ListCreate = 1
Subscribers {
Subscribers = 1
Digest = 1
Allow = 1
Deny = 1
Moderators = 1
}
Config {
Main = 1
Subscription = 1
Posting = 1
Processing = 1
GnupgOptions = 1
Archive = 1
Admin = 1
All = 1
}
Gnupg {
PublicKeys = 1
SecretKeys = 1
GenerateKey = 1
}
TextEdit = 1
ListDelete = 1
GnupgConvert = 1
Language = 1
Interface = 1
Help = 1
}
Options {
Create {
Listname = create_listname
Listaddress = create_listaddress
Listlanguage = lang_select
Mysql = mysql
Webuser = webusers
}
Subscribers {
Subscribers = {}
Digest {
Enabled = digest_enabled
Settings = digest_settings
}
Deny {
Enabled = block_deny
}
Moderators {
Posting {
Self = mod_post
Path = mod_post_path
}
Subscription {
Self = mod_sub
Path = mod_sub_path
}
Administration {
Self = admin_enabled
Path = admin_path
}
}
}
GenerateKey {
KeyName = gnupg_keyname
KeyComment = gnupg_keycomment
KeySize = gnupg_keysize
KeyExpiration = gnupg_keyexpires
}
Config {
Main {
Language = lang_select
Charset = charset_select
Owner = owner_address
MainList = mainlist
MailmanRequests = mailman_requests
RemoveWarn = warn_remove
SQL = mysql
WebUsers = webusers
}
Archive {
Enabled {
Self = archive_enabled
Public = public
ModOnly = archive_mod_only
Guard = archive_deny_unknown
}
RemovePrivateHeader = archive_remove_private_header
}
Subscription {
Public = public
ConfirmSub = confirm_sub
ConfirmUnsub = confirm_unsub
ModSub {
Self = mod_sub
Path = mod_sub_path
}
}
Admin {
Enabled {
Self = admin_enabled
RequestSubscribers = admin_get_subscribers
EditText = admin_edit_text
Path = admin_path
}
}
Posting {
UseDeny = block_deny
BlockOthers = block_others_post
Confirm = confirm_post
Moderate {
Self = mod_post
NonMod = block_nonmod_post
Path = mod_post_path
}
SizeMax = msgsize_max
SizeMin = msgsize_min
MimeCheck {
Self = mimecheck
MimeReject = mimereject
}
}
GnupgOptions {
SignMessages = gnupg_sign_messages
PlainWithoutKey = gnupg_plain_without_key
}
Processing {
Prefix = prefix
Trailer = trailer
From = from_address
MimeCheck {
Self = mimecheck
MimeRemove = mimeremove
}
HeaderRemove = headerremove
HeaderAdd = headeradd
}
Overview {
Public = public
ConfirmSub = confirm_sub
ConfirmUnsub = confirm_unsub
ModSubEnable = mod_sub
UseDeny = block_deny
BlockOthers = block_others_post
ConfirmPosting = confirm_post
ModPosting = mod_post
NonModPosting = block_nonmod_post
MailmanRequests = mailman_requests
RemoveWarn = warn_remove
DigestEnabled = digest_enabled
DigestSettings = digest_settings
ArchiveEnabled = archive_enabled
ArchiveModOnly = archive_mod_only
ArchiveGuard = archive_deny_unknown
RemovePrivateHeader = archive_remove_private_header
AdminEnabled = admin_enabled
AdminRequestSubscribers = admin_get_subscribers
AdminEditText = admin_edit_text
FromAddress = from_address
Owner = owner_address
SQL = mysql
MainList = mainlist
ModPostPath = mod_post_path
ModSubPath = mod_sub_path
AdminPath = admin_path
Prefix = prefix
Trailer = trailer
SizeMax = msgsize_max
SizeMin = msgsize_min
MimeCheck {
Self = mimecheck
MimeRemove = mimeremove
MimeReject = mimereject
}
HeaderRemove = headerremove
HeaderAdd = headeradd
Language = lang_select
Charset = charset_select
WebUsers = webusers
}
}
}
}