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:
parent
b7d01f0324
commit
d845390a9b
29 changed files with 656 additions and 268 deletions
9
TODO
9
TODO
|
@ -1,3 +1,8 @@
|
||||||
|
urgent:
|
||||||
|
- add basic/normal/expert to web interface
|
||||||
|
- export subscribers
|
||||||
|
- fix display of language name
|
||||||
|
|
||||||
clearsilver-Infos updaten
|
clearsilver-Infos updaten
|
||||||
|
|
||||||
die nicht-Abonnenten-Listen (allow/deny/mod) sagen trotzdem: "x AbonnentInnen"
|
die nicht-Abonnenten-Listen (allow/deny/mod) sagen trotzdem: "x AbonnentInnen"
|
||||||
|
@ -20,7 +25,3 @@ support for:
|
||||||
* show subscription log
|
* show subscription log
|
||||||
* 'mailinglist' (maybe)
|
* 'mailinglist' (maybe)
|
||||||
|
|
||||||
choose basic/normal/expert to disable questions
|
|
||||||
|
|
||||||
export subscribers
|
|
||||||
|
|
||||||
|
|
|
@ -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
|
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
|
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
|
3) install Mail::Ezmlm::Gpg if you want to handle encrypted mailing lists
|
||||||
(see README.gnupg for details)
|
(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
|
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
|
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
|
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.
|
distribution if you are unsure of how/where to put these.
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
Version 3.2 - 04/14/02006
|
Version 3.2 - 04/14/02006
|
||||||
* support for encrypted mailing lists
|
* support for encrypted mailing lists
|
||||||
(http://www.synacklabs.net/projects/crypt-ml/)
|
(https://systemausfall.org/toolforge/gpgpy-ezmlm/)
|
||||||
* detect preferred interface language
|
* detect preferred interface language
|
||||||
* user-specific interface language selection
|
* user-specific interface language selection
|
||||||
* handling of empty settings for ezmlm-idx 5.0 fixed (closes #21)
|
* 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
|
* bug in MySQL support fixed
|
||||||
* treatment of the special character "dot" in listname and list address fixed
|
* treatment of the special character "dot" in listname and list address fixed
|
||||||
* use gettext for translations (Locale::gettext is now required)
|
* use gettext for translations (Locale::gettext is now required)
|
||||||
|
* the formerly required module "Encode" is now optional
|
||||||
|
|
||||||
Version 3.1.4 - 03/26/02006
|
Version 3.1.4 - 03/26/02006
|
||||||
* new setting: DOTQMAIL_DIR (useful for multi domain vpopmail setups)
|
* new setting: DOTQMAIL_DIR (useful for multi domain vpopmail setups)
|
||||||
|
|
|
@ -69,3 +69,7 @@ $HTML_LANGUAGE = "en";
|
||||||
# example: LANGUAGE_LIST = ( "en", "de", "si", "jp" );
|
# example: LANGUAGE_LIST = ( "en", "de", "si", "jp" );
|
||||||
@LANGUAGE_LIST = ( "en", "de" );
|
@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;
|
||||||
|
|
||||||
|
|
|
@ -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;
|
|
||||||
|
|
531
ezmlm-web.cgi
531
ezmlm-web.cgi
|
@ -21,16 +21,45 @@ use DB_File;
|
||||||
use CGI;
|
use CGI;
|
||||||
use IO::File;
|
use IO::File;
|
||||||
use POSIX;
|
use POSIX;
|
||||||
use Encode;
|
|
||||||
use English;
|
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
|
# 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)
|
# drop privileges (necessary for calling gpg)
|
||||||
|
# this should not do any other harm
|
||||||
$UID = $EUID;
|
$UID = $EUID;
|
||||||
$GID = $EGID;
|
$GID = $EGID;
|
||||||
|
|
||||||
|
@ -48,29 +77,26 @@ $ENV{'PATH'} = '/bin';
|
||||||
# user. :( Don't alter this line unless you are _sure_ you have to.
|
# user. :( Don't alter this line unless you are _sure_ you have to.
|
||||||
my @tmp = getpwuid($>); use vars qw[$USER]; $USER=$tmp[0];
|
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 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[$DEFAULT_OPTIONS $UNSAFE_RM $ALIAS_USER $LIST_DIR];
|
||||||
use vars qw[$QMAIL_BASE $PRETTY_NAMES $DOTQMAIL_DIR];
|
use vars qw[$QMAIL_BASE $PRETTY_NAMES $DOTQMAIL_DIR];
|
||||||
use vars qw[$FILE_UPLOAD $WEBUSERS_FILE $MAIL_DOMAIN $HTML_TITLE];
|
use vars qw[$FILE_UPLOAD $WEBUSERS_FILE $MAIL_DOMAIN $HTML_TITLE];
|
||||||
use vars qw[$HTML_CSS_FILE $TEMPLATE_DIR $HTML_LANGUAGE];
|
use vars qw[$HTML_CSS_FILE $TEMPLATE_DIR $HTML_LANGUAGE];
|
||||||
use vars qw[$DEFAULT_HOST @LANGUAGE_LIST];
|
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
|
# some deprecated configuration settings - they have to be announced
|
||||||
# otherwise old configuration files would break
|
# otherwise old configuration files would break
|
||||||
use vars qw[$LANGUAGE_DIR]; # deprecated since v3.2
|
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
|
# "pagedata" contains the hdf tree for clearsilver
|
||||||
# "pagename" refers to the template file that should be used
|
# "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"
|
# "ui_template" is one of "basic", "normal" and "expert"
|
||||||
use vars qw[$pagedata $pagename $error $customError $warning $customWarning $success];
|
use vars qw[$pagedata $pagename $error $customError $warning $customWarning $success];
|
||||||
use vars qw[$ui_set $ui_template];
|
use vars qw[$ui_set $ui_template];
|
||||||
|
@ -85,38 +111,40 @@ if (defined($opt_C)) {
|
||||||
} elsif (-e "./ezmlmwebrc") {
|
} elsif (-e "./ezmlmwebrc") {
|
||||||
$config_file = "./ezmlmwebrc"; # Install
|
$config_file = "./ezmlmwebrc"; # Install
|
||||||
} elsif (-e "/etc/ezmlm-web/ezmlmwebrc") {
|
} 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") {
|
} 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 {
|
} else {
|
||||||
&fatal_error("Unable to find config file");
|
&fatal_error("Unable to find config file");
|
||||||
}
|
}
|
||||||
do $config_file;
|
do $config_file;
|
||||||
|
|
||||||
|
|
||||||
|
####### validate configuration and apply some default settings ##########
|
||||||
|
|
||||||
# do we support encrypted mailing lists?
|
# do we support encrypted mailing lists?
|
||||||
# see http://www.synacklabs.net/projects/crypt-ml/
|
# see https://systemausfall.org/toolforge/crypto-ezmlm
|
||||||
if (-e "$config_file" . ".gnupg") {
|
$GPG_SUPPORT = 0 unless defined($GPG_SUPPORT);
|
||||||
do "$config_file.gnupg";
|
if (defined($GPG_SUPPORT) && ($GPG_SUPPORT)) {
|
||||||
# the config file should include "use Mail::Ezmlm::Gpg" as the use-line may not
|
if (&safely_import_module("Mail::Ezmlm::Gpg")) {
|
||||||
# be used here
|
|
||||||
if (defined($GPG_SUPPORT) && ($GPG_SUPPORT)) {
|
|
||||||
$GPG_SUPPORT = 1;
|
$GPG_SUPPORT = 1;
|
||||||
} else {
|
} 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)) {
|
if (defined($opt_d)) {
|
||||||
$LIST_DIR = $1 if ($opt_d =~ /^([-\@\w.\/]+)$/);
|
$LIST_DIR = $1 if ($opt_d =~ /^([-\@\w.\/]+)$/);
|
||||||
}
|
}
|
||||||
|
|
||||||
# If WEBUSERS_FILE is not defined in ezmlmwebrc (as before version 2.2),
|
# If WEBUSERS_FILE is not defined in ezmlmwebrc (as before version 2.2),
|
||||||
# then use former default value for compatibility
|
# then use former default value for compatibility
|
||||||
if (!defined($WEBUSERS_FILE)) {
|
$WEBUSERS_FILE = $LIST_DIR . '/webusers' unless (defined($WEBUSERS_FILE));
|
||||||
$WEBUSERS_FILE = $LIST_DIR . '/webusers'
|
|
||||||
}
|
# set default value of supported languages
|
||||||
|
@LANGUAGE_LIST = ( 'en', 'de' ) unless (defined(@LANGUAGE_LIST));
|
||||||
|
|
||||||
|
|
||||||
# check for non-default dotqmail directory
|
# check for non-default dotqmail directory
|
||||||
$DOTQMAIL_DIR = $HOME_DIR unless defined($DOTQMAIL_DIR);
|
$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 form input ...
|
||||||
&untaint;
|
&untaint;
|
||||||
|
|
||||||
my $pagedata = load_hdf();
|
my $pagedata = &init_hdf();
|
||||||
my $action = $q->param('action');
|
my $action = $q->param('action');
|
||||||
|
|
||||||
# check permissions
|
# check permissions
|
||||||
|
@ -227,11 +257,7 @@ elsif ($action eq '' || $action eq 'list_select') {
|
||||||
$pagename = '';
|
$pagename = '';
|
||||||
}
|
}
|
||||||
if ($pagename ne '') {
|
if ($pagename ne '') {
|
||||||
if (&is_list_gnupg($q->param('list'))) {
|
$success = 'UpdateConfig' if (($action eq 'config_do') && &update_config());
|
||||||
$success = 'UpdateConfig' if (($action eq 'config_do') && &update_gnupg());
|
|
||||||
} else {
|
|
||||||
$success = 'UpdateConfig' if (($action eq 'config_do') && &update_config());
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
$error = 'UnknownConfigPage';
|
$error = 'UnknownConfigPage';
|
||||||
warn "missing config page: $subset";
|
warn "missing config page: $subset";
|
||||||
|
@ -243,25 +269,41 @@ elsif ($action eq '' || $action eq 'list_select') {
|
||||||
}
|
}
|
||||||
} elsif ($GPG_SUPPORT && ($action eq 'gnupg_convert_ask')) {
|
} elsif ($GPG_SUPPORT && ($action eq 'gnupg_convert_ask')) {
|
||||||
$pagename = 'gnupg_convert';
|
$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'));
|
my $tlist = new Mail::Ezmlm::Gpg("$LIST_DIR/" . $q->param('list'));
|
||||||
if ($tlist->is_gpg()) {
|
if ($tlist->is_encrypted()) {
|
||||||
if ($tlist->convert_to_plaintext()) {
|
$pagename = 'gnupg_convert';
|
||||||
$pagename = 'subscribers';
|
$warning = 'GnupgConvertAlreadyEnabled';
|
||||||
$success = 'GnupgConvert';
|
|
||||||
} else {
|
|
||||||
warn $tlist->errmsg();
|
|
||||||
$pagename = 'gnupg_convert';
|
|
||||||
$warning = 'GnupgConvert';
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
if ($tlist->convert_to_encrypted()) {
|
if ($tlist->enable_encryption()) {
|
||||||
$pagename = 'gnupg_generate_key';
|
# if the keyring already contains a secret key, then we do not
|
||||||
$success = 'GnupgConvert';
|
# 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 {
|
} else {
|
||||||
warn $tlist->errmsg();
|
warn $tlist->errmsg();
|
||||||
$pagename = 'gnupg_convert';
|
$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'))) {
|
} 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');
|
my $subset = $q->param('gnupg_subset');
|
||||||
if (defined($q->param('list')) && ($subset ne '')) {
|
if (defined($q->param('list')) && ($subset ne '')) {
|
||||||
if (($subset =~ /^[\w]*$/) && (-e "$TEMPLATE_DIR/gnupg_$subset" . ".cs")) {
|
if (($subset =~ /^[\w]*$/) && (-e "$TEMPLATE_DIR/gnupg_$subset" . ".cs")) {
|
||||||
$pagename = 'gnupg_' . $subset;
|
if ($action eq 'gnupg_do') {
|
||||||
} else {
|
$success = 'UpdateGnupg' if (&manage_gnupg_keys());
|
||||||
$pagename = '';
|
} else {
|
||||||
}
|
# warnings are defined in the respective subs
|
||||||
if ($pagename ne '') {
|
$pagename = 'gnupg_' . $subset;
|
||||||
$success = 'UpdateGnupg' if (($action eq 'gnupg_do') && &manage_gnupg_keys());
|
}
|
||||||
} else {
|
} else {
|
||||||
$error = 'UnknownGnupgPage';
|
$error = 'UnknownGnupgPage';
|
||||||
warn "missing gnupg page: $subset";
|
warn "missing gnupg page: $subset";
|
||||||
|
@ -291,7 +333,7 @@ elsif ($action eq '' || $action eq 'list_select') {
|
||||||
} else {
|
} else {
|
||||||
$warning = 'GnupgExportKey';
|
$warning = 'GnupgExportKey';
|
||||||
# TODO: pagename is quite random here ...
|
# TODO: pagename is quite random here ...
|
||||||
$pagename = 'gnupg_secret';
|
$pagename = 'gnupg_public';
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
$error = 'ParameterMissing';
|
$error = 'ParameterMissing';
|
||||||
|
@ -388,17 +430,16 @@ exit;
|
||||||
|
|
||||||
# =========================================================================
|
# =========================================================================
|
||||||
|
|
||||||
sub load_hdf {
|
sub init_hdf {
|
||||||
# initialize the data for clearsilver
|
# initialize the data for clearsilver
|
||||||
my $hdf = ClearSilver::HDF->new();
|
my $hdf = ClearSilver::HDF->new();
|
||||||
|
|
||||||
&fatal_error("Template dir ($TEMPLATE_DIR) not found!") unless (-e $TEMPLATE_DIR);
|
&fatal_error("Template dir ($TEMPLATE_DIR) not found!") unless (-e $TEMPLATE_DIR);
|
||||||
$hdf->setValue("TemplateDir", "$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
|
# TODO: should be selected via web interface
|
||||||
$ui_template = "normal";
|
$ui_template = "normal";
|
||||||
$ui_set = "default"; # may be overwritten later
|
|
||||||
$hdf->setValue("Config.UI.LinkAttrs.template", $ui_template);
|
$hdf->setValue("Config.UI.LinkAttrs.template", $ui_template);
|
||||||
|
|
||||||
# retrieve available languages and add them to the dataset
|
# retrieve available languages and add them to the dataset
|
||||||
|
@ -414,6 +455,9 @@ sub load_hdf {
|
||||||
$hdf->setValue("Stylesheet", "$HTML_CSS_FILE");
|
$hdf->setValue("Stylesheet", "$HTML_CSS_FILE");
|
||||||
$hdf->setValue("Config.PageTitle", "$HTML_TITLE");
|
$hdf->setValue("Config.PageTitle", "$HTML_TITLE");
|
||||||
|
|
||||||
|
# support for encrypted mailing lists?
|
||||||
|
$hdf->setValue("Config.Features.Crypto", 1) if ($GPG_SUPPORT);
|
||||||
|
|
||||||
return $hdf;
|
return $hdf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -422,7 +466,7 @@ sub load_hdf {
|
||||||
sub output_page {
|
sub output_page {
|
||||||
# Print the 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")
|
&fatal_error("UI template file ($ui_template_file) not found")
|
||||||
unless (-e $ui_template_file);
|
unless (-e $ui_template_file);
|
||||||
$pagedata->readFile($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 ($data) = @_;
|
||||||
my $config_language;
|
my $config_language;
|
||||||
|
|
||||||
|
@ -495,16 +539,24 @@ sub load_interface_language
|
||||||
|
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
|
|
||||||
sub translate_language_data
|
sub translate_language_data {
|
||||||
{
|
|
||||||
my ($hdf, $language) = @_;
|
my ($hdf, $language) = @_;
|
||||||
my $langdata;
|
my $langdata;
|
||||||
my %translation;
|
my %translation;
|
||||||
my $key;
|
my $key;
|
||||||
|
|
||||||
# create gettext object
|
# 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");
|
&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
|
# read language template
|
||||||
$langdata = ClearSilver::HDF->new();
|
$langdata = ClearSilver::HDF->new();
|
||||||
|
@ -519,8 +571,8 @@ sub translate_language_data
|
||||||
|
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
|
|
||||||
sub recurse_hdf
|
sub recurse_hdf {
|
||||||
{
|
|
||||||
my ($node, $prefix) = @_;
|
my ($node, $prefix) = @_;
|
||||||
my ($value, $child, $next, %result, %sub_result, $key);
|
my ($value, $child, $next, %result, %sub_result, $key);
|
||||||
$value = $node->objValue();
|
$value = $node->objValue();
|
||||||
|
@ -546,8 +598,8 @@ sub recurse_hdf
|
||||||
# this code was adapted from Per Cederberg
|
# this code was adapted from Per Cederberg
|
||||||
# http://www.percederberg.net/home/perl/select.perl
|
# http://www.percederberg.net/home/perl/select.perl
|
||||||
# it returns an empty string, if no supported language was found
|
# it returns an empty string, if no supported language was found
|
||||||
sub get_browser_language
|
sub get_browser_language {
|
||||||
{
|
|
||||||
my ($str, @langs, @res);
|
my ($str, @langs, @res);
|
||||||
|
|
||||||
# Use language preference settings
|
# 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);
|
my (@files, $i, $num);
|
||||||
|
|
||||||
# Read the list directory for mailing lists.
|
# 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);
|
my ($hostname, $username);
|
||||||
|
|
||||||
# read available list of lists
|
# read available list of lists
|
||||||
|
@ -645,9 +697,8 @@ sub set_pagedata()
|
||||||
# default username for webuser file
|
# default username for webuser file
|
||||||
$pagedata->setValue("Data.WebUser.UserName", $ENV{'REMOTE_USER'}||'ALL');
|
$pagedata->setValue("Data.WebUser.UserName", $ENV{'REMOTE_USER'}||'ALL');
|
||||||
|
|
||||||
# list specific configuration
|
# list specific configuration - use defaults if no list is selected
|
||||||
if ($q->param('list') ne '' )
|
if ($q->param('list') ne '' ) {
|
||||||
{
|
|
||||||
&set_pagedata4list(&get_list_part());
|
&set_pagedata4list(&get_list_part());
|
||||||
} else {
|
} else {
|
||||||
&set_pagedata4options($DEFAULT_OPTIONS);
|
&set_pagedata4options($DEFAULT_OPTIONS);
|
||||||
|
@ -656,32 +707,37 @@ sub set_pagedata()
|
||||||
|
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
|
|
||||||
sub set_pagedata4list
|
sub set_pagedata4list {
|
||||||
{
|
|
||||||
my $part_type = shift;
|
|
||||||
|
|
||||||
my $listname = $q->param('list');
|
my $part_type = shift;
|
||||||
|
my ($listname, $list);
|
||||||
|
|
||||||
|
$listname = $q->param('list');
|
||||||
|
|
||||||
if (! -e "$LIST_DIR/$listname/lock" ) {
|
if (! -e "$LIST_DIR/$listname/lock" ) {
|
||||||
$warning = 'ListDoesNotExist' if ($warning eq '');
|
$warning = 'ListDoesNotExist' if ($warning eq '');
|
||||||
return;
|
return (1==0);
|
||||||
}
|
}
|
||||||
|
|
||||||
# do the common configuration for all kind of lists
|
# Work out the address of this list ...
|
||||||
&set_pagedata4list_common($listname, $part_type);
|
$list = new Mail::Ezmlm("$LIST_DIR/$listname");
|
||||||
|
|
||||||
# is this list encrypted?
|
$pagedata->setValue("Data.List.Name", "$listname");
|
||||||
if (&is_list_gnupg($listname)) {
|
$pagedata->setValue("Data.List.Address", &this_listaddress);
|
||||||
# some encryption specific stuff
|
|
||||||
&set_pagedata4list_gnupg($listname);
|
# do we support encryption? Set some data if the list is encrypted ...
|
||||||
$pagedata->setValue("Data.List.Type","gnupg");
|
&set_pagedata_crypto($listname) if ($GPG_SUPPORT);
|
||||||
$ui_set = "gnupg";
|
|
||||||
} else {
|
# is this a moderation/administration list?
|
||||||
# do the non-encryption configuration
|
&set_pagedata4part_list($part_type) if ($part_type ne '');
|
||||||
&set_pagedata4list_normal($listname, $part_type);
|
|
||||||
$pagedata->setValue("Data.List.Type","default");
|
&set_pagedata_subscribers($list, $listname, $part_type);
|
||||||
$ui_set = "default";
|
&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);
|
return (0==0);
|
||||||
}
|
}
|
||||||
|
@ -689,13 +745,16 @@ sub set_pagedata4list
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
|
|
||||||
# extract hdf-data for encrypted lists
|
# extract hdf-data for encrypted lists
|
||||||
# non-encrypted lists should not use this function
|
sub set_pagedata_crypto {
|
||||||
sub set_pagedata4list_gnupg() {
|
|
||||||
my ($listname) = @_;
|
my ($listname) = @_;
|
||||||
my ($gpg_list, %config, $item, @gpg_keys, $gpg_key);
|
my ($gpg_list, %config, $item, @gpg_keys, $gpg_key);
|
||||||
|
|
||||||
$gpg_list = new Mail::Ezmlm::Gpg("$LIST_DIR/$listname");
|
$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
|
# read the configuration
|
||||||
%config = $gpg_list->getconfig();
|
%config = $gpg_list->getconfig();
|
||||||
foreach $item (keys %config) {
|
foreach $item (keys %config) {
|
||||||
|
@ -723,43 +782,10 @@ sub set_pagedata4list_gnupg() {
|
||||||
|
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
|
|
||||||
# extract hdf-data for "normal" (e.g. not encrypted) lists
|
sub set_pagedata_misc_configfiles {
|
||||||
# special kinds of lists should not use this function
|
|
||||||
sub set_pagedata4list_normal() {
|
|
||||||
my ($listname, $part_type) = @_;
|
|
||||||
|
|
||||||
my $list = new Mail::Ezmlm("$LIST_DIR/$listname");
|
my $list = shift;
|
||||||
&set_pagedata4options($list->getconfig);
|
my ($item);
|
||||||
}
|
|
||||||
|
|
||||||
# ---------------------------------------------------------------------------
|
|
||||||
|
|
||||||
# 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);
|
|
||||||
|
|
||||||
# Get the contents of some important files
|
# Get the contents of some important files
|
||||||
$item = $list->getpart('prefix');
|
$item = $list->getpart('prefix');
|
||||||
|
@ -779,56 +805,78 @@ sub set_pagedata4list_common() {
|
||||||
$list->getpart('msgsize') =~ m/^\s*(\d+)\s*:\s*(\d+)\s*$/;
|
$list->getpart('msgsize') =~ m/^\s*(\d+)\s*:\s*(\d+)\s*$/;
|
||||||
$pagedata->setValue("Data.List.MsgSize.Max", "$1");
|
$pagedata->setValue("Data.List.MsgSize.Max", "$1");
|
||||||
$pagedata->setValue("Data.List.MsgSize.Min", "$2");
|
$pagedata->setValue("Data.List.MsgSize.Min", "$2");
|
||||||
|
}
|
||||||
|
|
||||||
# TODO: this is definitely ugly - create a new sub!
|
# ---------------------------------------------------------------------------
|
||||||
if (open(WEBUSER, "<$WEBUSERS_FILE")) {
|
|
||||||
while(<WEBUSER>) {
|
sub set_pagedata_subscribers {
|
||||||
last if (($webusers) = m{^$listname\s*\:\s*(.+)$});
|
|
||||||
|
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
|
untie %pretty if ($PRETTY_NAMES);
|
||||||
$webusers ||= $ENV{'REMOTE_USER'} || 'ALL';
|
}
|
||||||
|
|
||||||
$pagedata->setValue("Data.List.WebUsers", "$webusers");
|
# ---------------------------------------------------------------------------
|
||||||
|
|
||||||
# get the names of the textfiles of this list
|
# set the names of the textfiles of this list
|
||||||
{
|
sub set_pagedata_textfiles {
|
||||||
@files = sort $list->get_available_text_files();
|
|
||||||
$i = 0;
|
|
||||||
|
|
||||||
foreach $item (@files) {
|
my $list = shift;
|
||||||
if ($list->is_text_default($item)) {
|
my ($i, @files, $item);
|
||||||
$pagedata->setValue('Data.List.DefaultFiles.' . $i , "$item");
|
|
||||||
} else {
|
@files = sort $list->get_available_text_files();
|
||||||
$pagedata->setValue('Data.List.CustomizedFiles.' . $i , "$item");
|
$i = 0;
|
||||||
}
|
|
||||||
$i++;
|
foreach $item (@files) {
|
||||||
}
|
if ($list->is_text_default($item)) {
|
||||||
|
$pagedata->setValue('Data.List.DefaultFiles.' . $i , "$item");
|
||||||
# text file specified?
|
} else {
|
||||||
if (($q->param('file') ne '') && ($q->param('file') =~ m/^[\w-]*$/)) {
|
$pagedata->setValue('Data.List.CustomizedFiles.' . $i , "$item");
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
|
$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
|
# get available languages for this list
|
||||||
# no result for ezmlm-idx < 5
|
# no result for ezmlm-idx < 5
|
||||||
$i = 0;
|
$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 {
|
sub set_pagedata4options {
|
||||||
|
|
||||||
my($options) = shift;
|
my($options) = shift;
|
||||||
my($i, $list, $key, $state, $value, $dir_of_list);
|
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) = @_;
|
my ($listname) = @_;
|
||||||
return (1==0) unless ($GPG_SUPPORT);
|
return (1==0) unless ($GPG_SUPPORT);
|
||||||
|
|
||||||
my $gpg_list = new Mail::Ezmlm::Gpg("$LIST_DIR/$listname");
|
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)
|
# get list of existing files (remove empty entries)
|
||||||
@files = grep {/./} map { (-e "$qmail_prefix$_")? "$qmail_prefix$_" : undef } (
|
@files = grep {/./} map { (-e "$qmail_prefix$_")? "$qmail_prefix$_" : undef } (
|
||||||
'',
|
'',
|
||||||
'.no-gpg',
|
|
||||||
'-default',
|
'-default',
|
||||||
'-default.no-gpg',
|
|
||||||
'-owner',
|
'-owner',
|
||||||
'-return-default',
|
'-return-default',
|
||||||
'-reject-default',
|
'-reject-default',
|
||||||
|
@ -1406,25 +1476,26 @@ sub extract_options_from_params()
|
||||||
sub manage_gnupg_keys()
|
sub manage_gnupg_keys()
|
||||||
# manage gnupg keys
|
# manage gnupg keys
|
||||||
{
|
{
|
||||||
return (1==0) unless ($GPG_SUPPORT);
|
|
||||||
|
|
||||||
my ($list, $listname, $upload_file);
|
my ($list, $listname, $upload_file);
|
||||||
|
|
||||||
$listname = $q->param('list');
|
$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");
|
$list = new Mail::Ezmlm::Gpg("$LIST_DIR/$listname");
|
||||||
|
|
||||||
my $subset = $q->param('gnupg_subset');
|
my $subset = $q->param('gnupg_subset');
|
||||||
if (defined($q->param('gnupg_key_file'))) {
|
if (defined($q->param('gnupg_key_file'))) {
|
||||||
|
$pagename = 'gnupg_public';
|
||||||
return &gnupg_import_key($list, $q->param('gnupg_key_file'));
|
return &gnupg_import_key($list, $q->param('gnupg_key_file'));
|
||||||
} elsif (($subset eq 'public') || ($subset eq 'secret')) {
|
} elsif (($subset eq 'public') || ($subset eq 'secret')) {
|
||||||
|
$pagename = "gnupg_$subset";
|
||||||
return &gnupg_remove_key($list);
|
return &gnupg_remove_key($list);
|
||||||
} elsif ($subset eq 'generate_key') {
|
} elsif ($subset eq 'generate_key') {
|
||||||
if (&gnupg_generate_key($list)) {
|
if (&gnupg_generate_key($list, $listname)) {
|
||||||
$pagename = 'gnupg_secret';
|
$pagename = 'gnupg_secret';
|
||||||
return (0==0);
|
return (0==0);
|
||||||
} else {
|
} else {
|
||||||
|
$pagename = 'gnupg_generate_key';
|
||||||
return (0==1);
|
return (0==1);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -1502,12 +1573,33 @@ sub gnupg_import_key()
|
||||||
# ------------------------------------------------------------------------
|
# ------------------------------------------------------------------------
|
||||||
|
|
||||||
sub gnupg_generate_key() {
|
sub gnupg_generate_key() {
|
||||||
my ($list) = @_;
|
|
||||||
|
my ($list, $listname) = @_;
|
||||||
my ($key_name, $key_comment, $key_size, $key_expires);
|
my ($key_name, $key_comment, $key_size, $key_expires);
|
||||||
$key_name = $q->param('gnupg_keyname');
|
|
||||||
$key_comment = $q->param('gnupg_keycomment');
|
if (defined($q->param('gnupg_keyname'))) {
|
||||||
$key_size = $q->param('gnupg_keysize');
|
$key_name = $q->param('gnupg_keyname');
|
||||||
$key_expires = $q->param('gnupg_keyexpires');
|
} 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) {
|
unless ($key_name) {
|
||||||
$warning = 'GnupgNoName';
|
$warning = 'GnupgNoName';
|
||||||
|
@ -1560,25 +1652,45 @@ sub gnupg_remove_key() {
|
||||||
|
|
||||||
# ------------------------------------------------------------------------
|
# ------------------------------------------------------------------------
|
||||||
|
|
||||||
sub update_gnupg {
|
sub update_config_crypto {
|
||||||
# save the new gnupg configuration
|
# save gpgpy-ezmlm settings
|
||||||
# TODO: add headeradd and so on ...
|
# call this function somewhere during "update_config" for encrypted lists
|
||||||
|
# only encryption-settings are used - the rest is ignored
|
||||||
|
|
||||||
my ($list, %switches);
|
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'));
|
$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 ($one_switch, $one_value, $key);
|
||||||
my @all_params = $q->param;
|
my @all_params = $q->param;
|
||||||
foreach $one_switch (@all_params) {
|
foreach $one_switch (@all_params) {
|
||||||
if ($one_switch =~ /^available_option_gnupg_(\w*)$/) {
|
if ($one_switch =~ /^available_option_gnupg_(\w*)$/) {
|
||||||
$key = $1;
|
$key = lc($1);
|
||||||
$switches{$key} = (defined($q->param('option_gnupg_' . $key))) ? 1 : 0;
|
# 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
|
# 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 (defined($q->param('list_language'))) {
|
||||||
if (&check_list_language($list, $q->param('list_language'))) {
|
if (&check_list_language($list, $q->param('list_language'))) {
|
||||||
$list->set_lang($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()) {
|
unless (&update_webusers()) {
|
||||||
$warning = 'WebUsersUpdate';
|
$warning = 'WebUsersUpdate';
|
||||||
return (1==0);
|
return (1==0);
|
||||||
|
@ -1766,7 +1883,8 @@ sub save_text {
|
||||||
eval { $content_encoded = Encode::encode($charset, $content); };
|
eval { $content_encoded = Encode::encode($charset, $content); };
|
||||||
if ($@) {
|
if ($@) {
|
||||||
$content_encoded = $content;
|
$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)) {
|
unless ($list->set_text_content($q->param('file'), $content_encoded)) {
|
||||||
$warning = 'SaveFile';
|
$warning = 'SaveFile';
|
||||||
|
@ -1850,8 +1968,11 @@ sub webauth_create_allowed {
|
||||||
sub get_available_interface_languages {
|
sub get_available_interface_languages {
|
||||||
my (%languages, $lang_id);
|
my (%languages, $lang_id);
|
||||||
foreach $lang_id (@LANGUAGE_LIST) {
|
foreach $lang_id (@LANGUAGE_LIST) {
|
||||||
# TODO: retrieve the local spelling of each language
|
if (defined($LANGUAGE_NAMES{$lang_id})) {
|
||||||
$languages{$lang_id} = $lang_id;
|
$languages{$lang_id} = $LANGUAGE_NAMES{$lang_id};
|
||||||
|
} else {
|
||||||
|
$languages{$lang_id} = $lang_id;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return %languages;
|
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() {
|
sub fatal_error() {
|
||||||
my $text = shift;
|
my $text = shift;
|
||||||
|
|
||||||
|
|
|
@ -14,6 +14,7 @@ Data.List.Address
|
||||||
Data.List.CharSet
|
Data.List.CharSet
|
||||||
Data.List.CustomizedFiles.*
|
Data.List.CustomizedFiles.*
|
||||||
Data.List.DefaultFiles.*
|
Data.List.DefaultFiles.*
|
||||||
|
Data.List.Features.Crypto
|
||||||
Data.List.File.Name
|
Data.List.File.Name
|
||||||
Data.List.File.Content
|
Data.List.File.Content
|
||||||
Data.List.File.isDefault
|
Data.List.File.isDefault
|
||||||
|
|
25
template/config_encryption.cs
Normal file
25
template/config_encryption.cs
Normal 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>
|
|
@ -1,3 +0,0 @@
|
||||||
<!-- REMOVE --><?cs include:TemplateDir + '/macros.cs' ?>
|
|
||||||
<!-- Gnupg: allow key submission -->
|
|
||||||
<?cs call:checkbox("gnupg_allowKeySubmission") ?>
|
|
|
@ -1,3 +0,0 @@
|
||||||
<!-- REMOVE --><?cs include:TemplateDir + '/macros.cs' ?>
|
|
||||||
<!-- Gnupg: encrypt to all -->
|
|
||||||
<?cs call:checkbox("gnupg_encryptToAll") ?>
|
|
|
@ -1,4 +1,8 @@
|
||||||
|
<?cs if:Data.List.Features.Crypto ?>
|
||||||
<!-- comment for the key (second part of the human readable key description) -->
|
<!-- comment for the key (second part of the human readable key description) -->
|
||||||
|
|
||||||
<label for="gnupg_keycomment"><?cs var:html_escape(Lang.Misc.GnupgKeyComment) ?>:</label>
|
<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 ?>
|
||||||
|
|
||||||
|
|
|
@ -1,11 +1,15 @@
|
||||||
|
<?cs if:Data.List.Features.Crypto ?>
|
||||||
<!-- expiration of the key (in years) -->
|
<!-- expiration of the key (in years) -->
|
||||||
|
|
||||||
<label for="gnupg_keyexpires"><?cs var:html_escape(Lang.Misc.GnupgKeyExpires) ?>:</label>
|
<label for="gnupg_keyexpires"><?cs var:html_escape(Lang.Misc.GnupgKeyExpires) ?>:</label>
|
||||||
<select name="gnupg_keyexpires" id="gnupg_keyexpires" size="0">
|
<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="1y">1</option>
|
||||||
<option value="2y">2</option>
|
<option value="2y">2</option>
|
||||||
<option value="3y">3</option>
|
<option value="3y">3</option>
|
||||||
<option value="5y">5</option>
|
<option value="5y">5</option>
|
||||||
<option value="10y">10</option>
|
<option value="10y">10</option>
|
||||||
</select>
|
</select>
|
||||||
|
<?cs /if ?>
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,8 @@
|
||||||
|
<?cs if:Data.List.Features.Crypto ?>
|
||||||
<!-- name of the key (first part of the human readable key description) -->
|
<!-- name of the key (first part of the human readable key description) -->
|
||||||
|
|
||||||
<label for="gnupg_keyname"><?cs var:html_escape(Lang.Misc.GnupgKeyName) ?>:</label>
|
<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 ?>
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
<?cs if:Data.List.Features.Crypto ?>
|
||||||
<!-- REMOVE --><?cs include:TemplateDir + '/macros.cs' ?>
|
<!-- REMOVE --><?cs include:TemplateDir + '/macros.cs' ?>
|
||||||
<!-- length of the key (bytes) -->
|
<!-- length of the key (bytes) -->
|
||||||
<label for="gnupg_keysize"><?cs var:html_escape(Lang.Misc.GnupgKeySize) ?>:</label>
|
<label for="gnupg_keysize"><?cs var:html_escape(Lang.Misc.GnupgKeySize) ?>:</label>
|
||||||
|
@ -6,4 +7,5 @@
|
||||||
<option selected="selected">2048</option>
|
<option selected="selected">2048</option>
|
||||||
<option>4096</option>
|
<option>4096</option>
|
||||||
</select>
|
</select>
|
||||||
|
<?cs /if ?>
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,6 @@
|
||||||
|
<?cs if:Data.List.Features.Crypto ?>
|
||||||
<!-- REMOVE --><?cs include:TemplateDir + '/macros.cs' ?>
|
<!-- REMOVE --><?cs include:TemplateDir + '/macros.cs' ?>
|
||||||
<!-- Gnupg: send plaintext if no key is available -->
|
<!-- Gnupg: send plaintext if no key is available -->
|
||||||
<?cs call:checkbox("gnupg_NokeyNocrypt") ?>
|
<?cs call:checkbox("gnupg_plain_without_key") ?>
|
||||||
|
<?cs /if ?>
|
||||||
|
|
|
@ -1,3 +0,0 @@
|
||||||
<!-- REMOVE --><?cs include:TemplateDir + '/macros.cs' ?>
|
|
||||||
<!-- Gnupg: require signed messages -->
|
|
||||||
<?cs call:checkbox("gnupg_requireSigs") ?>
|
|
|
@ -1,3 +0,0 @@
|
||||||
<!-- REMOVE --><?cs include:TemplateDir + '/macros.cs' ?>
|
|
||||||
<!-- Gnupg: require subscriber -->
|
|
||||||
<?cs call:checkbox("gnupg_RequireSub") ?>
|
|
|
@ -1,3 +1,6 @@
|
||||||
|
<?cs if:Data.List.Features.Crypto ?>
|
||||||
<!-- REMOVE --><?cs include:TemplateDir + '/macros.cs' ?>
|
<!-- REMOVE --><?cs include:TemplateDir + '/macros.cs' ?>
|
||||||
<!-- Gnupg: sign outgoing messages -->
|
<!-- Gnupg: sign outgoing messages -->
|
||||||
<?cs call:checkbox("gnupg_signMessages") ?>
|
<?cs call:checkbox("gnupg_sign_messages") ?>
|
||||||
|
<?cs /if ?>
|
||||||
|
|
||||||
|
|
|
@ -1,3 +0,0 @@
|
||||||
<!-- REMOVE --><?cs include:TemplateDir + '/macros.cs' ?>
|
|
||||||
<!-- Gnupg: require keys to be trusted -->
|
|
||||||
<?cs call:checkbox("gnupg_VerifiedKeyReq") ?>
|
|
|
@ -11,14 +11,15 @@
|
||||||
|
|
||||||
<form method="post" action="<?cs call:link("","","","","","") ?>" enctype="application/x-www-form-urlencoded">
|
<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="list" value="<?cs var:Data.List.Name ?>" />
|
||||||
|
<?cs if:Data.List.Features.Crypto
|
||||||
<input type="hidden" name="action" value="gnupg_convert_do" />
|
?><button type="submit" name="send" value="do"><?cs
|
||||||
<button type="submit" name="send" value="do"><?cs
|
var:html_escape(Lang.Buttons.GnupgConvertToPlain) ?></button>
|
||||||
if:Data.List.Type == "gnupg" ?><?cs
|
<input type="hidden" name="action" value="gnupg_convert_disable" /><?cs
|
||||||
var:html_escape(Lang.Buttons.GnupgConvertToNormal) ?><?cs
|
else
|
||||||
else ?><?cs
|
?><button type="submit" name="send" value="do"><?cs
|
||||||
var:html_escape(Lang.Buttons.GnupgConvertToEncrypted) ?><?cs
|
var:html_escape(Lang.Buttons.GnupgConvertToEncrypted) ?></button>
|
||||||
/if ?></button>
|
<input type="hidden" name="action" value="gnupg_convert_enable" /><?cs
|
||||||
|
/if ?>
|
||||||
</form>
|
</form>
|
||||||
|
|
||||||
</fieldset>
|
</fieldset>
|
||||||
|
|
|
@ -23,3 +23,4 @@
|
||||||
</form>
|
</form>
|
||||||
|
|
||||||
</fieldset>
|
</fieldset>
|
||||||
|
|
||||||
|
|
|
@ -31,4 +31,3 @@
|
||||||
|
|
||||||
</fieldset>
|
</fieldset>
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -26,7 +26,9 @@
|
||||||
<td><label for="gnupg_key_<?cs var:key.id ?>"><?cs
|
<td><label for="gnupg_key_<?cs var:key.id ?>"><?cs
|
||||||
var:html_escape(key.email) ?></label></td>
|
var:html_escape(key.email) ?></label></td>
|
||||||
<td><label for="gnupg_key_<?cs var:key.id ?>"><?cs
|
<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",
|
<td><a href="<?cs call:link("action", "gnupg_export",
|
||||||
"list", Data.List.Name,
|
"list", Data.List.Name,
|
||||||
"gnupg_keyid", key.id) ?>"
|
"gnupg_keyid", key.id) ?>"
|
||||||
|
|
|
@ -26,7 +26,9 @@
|
||||||
<td><label for="gnupg_key_<?cs var:key.id ?>"><?cs
|
<td><label for="gnupg_key_<?cs var:key.id ?>"><?cs
|
||||||
var:html_escape(key.email) ?></label></td>
|
var:html_escape(key.email) ?></label></td>
|
||||||
<td><label for="gnupg_key_<?cs var:key.id ?>"><?cs
|
<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",
|
<td><a href="<?cs call:link("action", "gnupg_export",
|
||||||
"list", Data.List.Name,
|
"list", Data.List.Name,
|
||||||
"gnupg_keyid", key.id) ?>"
|
"gnupg_keyid", key.id) ?>"
|
||||||
|
|
|
@ -1,9 +1,5 @@
|
||||||
Lang {
|
Lang {
|
||||||
|
|
||||||
ID = en
|
|
||||||
|
|
||||||
Name = English
|
|
||||||
|
|
||||||
Menue {
|
Menue {
|
||||||
ListCreate = Create new list
|
ListCreate = Create new list
|
||||||
ListDelete = Delete list
|
ListDelete = Delete list
|
||||||
|
@ -24,6 +20,7 @@ Lang {
|
||||||
GnupgSecretKeys = secret keys
|
GnupgSecretKeys = secret keys
|
||||||
GnupgGenerateKey = generate key
|
GnupgGenerateKey = generate key
|
||||||
GnupgConvert = Encryption
|
GnupgConvert = Encryption
|
||||||
|
GnupgOptions = encryption
|
||||||
TextFiles = Text files
|
TextFiles = Text files
|
||||||
ListSelect = Choose a list
|
ListSelect = Choose a list
|
||||||
Properties = Properties of
|
Properties = Properties of
|
||||||
|
@ -54,6 +51,7 @@ Lang {
|
||||||
GnupgPublic = Public keys
|
GnupgPublic = Public keys
|
||||||
GnupgSecret = Secret keys
|
GnupgSecret = Secret keys
|
||||||
GnupgGenerate = Generate a new keypair
|
GnupgGenerate = Generate a new keypair
|
||||||
|
GnupgOptions = Encryption settings
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -69,7 +67,7 @@ Lang {
|
||||||
ResetFile = Remove customized file
|
ResetFile = Remove customized file
|
||||||
LanguageSet = select
|
LanguageSet = select
|
||||||
GnupgConvertToEncrypted = Convert to an encrypted mailinglist
|
GnupgConvertToEncrypted = Convert to an encrypted mailinglist
|
||||||
GnupgConvertToNormal = Convert to a plaintext mainlinglist
|
GnupgConvertToPlain = Convert to a plaintext mainlinglist
|
||||||
DeletePublicKey = Delete public key(s)
|
DeletePublicKey = Delete public key(s)
|
||||||
DeleteSecretKey = Delete secret key(s)
|
DeleteSecretKey = Delete secret key(s)
|
||||||
GnupgImportKey = Import key
|
GnupgImportKey = Import key
|
||||||
|
@ -125,7 +123,10 @@ Lang {
|
||||||
GnupgInvalidExpiration = The expiration time is invalid!
|
GnupgInvalidExpiration = The expiration time is invalid!
|
||||||
GnupgInvalidKeySize = The length of the key is invalid!
|
GnupgInvalidKeySize = The length of the key is invalid!
|
||||||
GnupgExportKey = Export of key failed!
|
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.
|
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.
|
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.
|
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)
|
w = Remove the ezmlm-warn invocations from the list setup (rarely useful)
|
||||||
x = Remove or reject specific mime types in messages
|
x = Remove or reject specific mime types in messages
|
||||||
y = Request a confirmation mail for every posted message
|
y = Request a confirmation mail for every posted message
|
||||||
gnupg_allowKeySubmission = Allow key submission via mail
|
gnupg_plain_without_key = Send plaintext to the subscribers which have no key
|
||||||
gnupg_encryptToAll = Encrypt to all recipients at once (do not encrypt inividually)
|
gnupg_sign_messages = Sign outgoing messages with the list's key
|
||||||
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
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -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.
|
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.
|
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.
|
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 {
|
Legend {
|
||||||
|
@ -288,5 +286,6 @@ Lang {
|
||||||
GnupgSecretKeys = Secret keys of this list
|
GnupgSecretKeys = Secret keys of this list
|
||||||
GnupgKeyImport = Import a key
|
GnupgKeyImport = Import a key
|
||||||
GnupgGenerateKey = Generate the key for this list
|
GnupgGenerateKey = Generate the key for this list
|
||||||
|
GnupgOptions = Encryption settings
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -92,6 +92,14 @@
|
||||||
"config_subset","processing") ?>"
|
"config_subset","processing") ?>"
|
||||||
title="<?cs var:html_escape(Lang.Menue.ConfigProcess) ?>"><?cs
|
title="<?cs var:html_escape(Lang.Menue.ConfigProcess) ?>"><?cs
|
||||||
var:html_escape(Lang.Menue.ConfigProcess) ?></a></li><?cs /if ?>
|
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
|
<?cs if:UI.Navigation.Config.Archive == 1
|
||||||
?><li><a <?cs if:(Data.Action == "config_archive") ?>
|
?><li><a <?cs if:(Data.Action == "config_archive") ?>
|
||||||
class="nav_active"<?cs /if ?>
|
class="nav_active"<?cs /if ?>
|
||||||
|
@ -115,7 +123,7 @@
|
||||||
var:html_escape(Lang.Menue.ConfigAll) ?></a></li><?cs /if ?>
|
var:html_escape(Lang.Menue.ConfigAll) ?></a></li><?cs /if ?>
|
||||||
</ul></li>
|
</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)
|
?><li><font class="no_link"><?cs var:html_escape(Lang.Menue.Gnupg)
|
||||||
?></font>
|
?></font>
|
||||||
<ul>
|
<ul>
|
||||||
|
@ -149,7 +157,7 @@
|
||||||
title="<?cs var:html_escape(Lang.Menue.TextFiles) ?>"><?cs
|
title="<?cs var:html_escape(Lang.Menue.TextFiles) ?>"><?cs
|
||||||
var:html_escape(Lang.Menue.TextFiles) ?></a></li><?cs /if ?>
|
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") ||
|
?><li><a <?cs if:(Data.Action == "gnupg_convert_ask") ||
|
||||||
(Data.Action == "gnupg_convert_do") ?> class="nav_active"<?cs /if ?>
|
(Data.Action == "gnupg_convert_do") ?> class="nav_active"<?cs /if ?>
|
||||||
href="<?cs call:link("list",Data.List.Name,"action","gnupg_convert_ask","","") ?>"
|
href="<?cs call:link("list",Data.List.Name,"action","gnupg_convert_ask","","") ?>"
|
||||||
|
|
|
@ -21,6 +21,12 @@ UI {
|
||||||
All = 1
|
All = 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Gnupg {
|
||||||
|
PublicKeys = 1
|
||||||
|
SecretKeys = 1
|
||||||
|
GenerateKey = 1
|
||||||
|
}
|
||||||
|
|
||||||
TextEdit = 1
|
TextEdit = 1
|
||||||
ListDelete = 1
|
ListDelete = 1
|
||||||
GnupgConvert = 1
|
GnupgConvert = 1
|
||||||
|
|
|
@ -19,7 +19,6 @@ UI {
|
||||||
|
|
||||||
TextEdit = 1
|
TextEdit = 1
|
||||||
ListDelete = 1
|
ListDelete = 1
|
||||||
GnupgConvert = 1
|
|
||||||
Language = 1
|
Language = 1
|
||||||
Interface = 1
|
Interface = 1
|
||||||
Help = 1
|
Help = 1
|
||||||
|
|
209
template/ui/normal.hdf
Normal file
209
template/ui/normal.hdf
Normal 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
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue