support for encrypted mailing lists finished

small stylesheet improvements
language detection
language selection implemented
(prepared for release 3.2)
This commit is contained in:
lars 2006-04-14 15:54:18 +00:00
parent 9eb084e460
commit 88072eec38
18 changed files with 345 additions and 59 deletions

9
README
View file

@ -1,6 +1,6 @@
=================== =================
| ezmlm-web-3.1.1 | | ezmlm-web-3.2 |
=================== =================
If you only want to know how to install ezmlm-web, then you should If you only want to know how to install ezmlm-web, then you should
read INSTALL. read INSTALL.
@ -21,9 +21,10 @@ VIII. Bugs && Bug Reports
I. Copyright Stuff - essentially the FreeBSD licence ... I. Copyright Stuff - essentially the FreeBSD licence ...
================== ==================
ezmlm-web - version 3.1.1 - 01/19/02006 ezmlm-web - version 3.2 - 04/14/02006
Copyright (C) 1998, Guy Antony Halse, All Rights Reserved. Copyright (C) 1998, Guy Antony Halse, All Rights Reserved.
Copyright (C) 02005-02006, Lars Kruse, All Rights Reserved.
Please send bug reports and comments to ezmlm-web@sumpfralle.de Please send bug reports and comments to ezmlm-web@sumpfralle.de

View file

@ -2,13 +2,16 @@ This file contains some useful hints for upgrading from a previous version of ez
############################################################################## ##############################################################################
UPGRADING ezmlm-web 3.1 to ezmlm-web 3.1.4 UPGRADING ezmlm-web 3.1 to ezmlm-web 3.2
1) install the perl module File::Path 1) install the perl module File::Path
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. Use it, 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)
------------------------------------------------------------------------------ ------------------------------------------------------------------------------
UPGRADING ezmlm-web 3.0 to ezmlm-web 3.1 UPGRADING ezmlm-web 3.0 to ezmlm-web 3.1

View file

@ -1,3 +1,10 @@
Version 3.2 - 04/14/02006
* support for encrypted mailing lists
(http://www.synacklabs.net/projects/crypt-ml/)
* detect preferred interface language
* user-specific interface language selection
* handling of empty settings for ezmlm-idx 5.0 fixed (closes #21)
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)
[suggested by Maurits Lamers] [suggested by Maurits Lamers]

View file

@ -30,8 +30,19 @@ font.feature {
padding-top: 1.5%; padding-top: 1.5%;
padding-bottom: 1.5%; padding-bottom: 1.5%;
background-color: #c0c0b0; background-color: #c0c0b0;
border-style: solid;
border-width: 2px 2px 1px 1px;
border-color: white;
} }
#nav_bar hr {
color: #707770;
background-color: #707770;
margin: 10px 30px 10px 10px;
align: center;
}
.nav_group { .nav_group {
margin-top: 1%; margin-top: 1%;
padding-bottom: 1%; padding-bottom: 1%;
@ -50,6 +61,12 @@ font.feature {
margin-bottom: 5px; margin-bottom: 5px;
} }
v_bar ul li ul {
/* small space between middle level entries */
margin-bottom: 4px;
}
#nav_bar ul li ul li { #nav_bar ul li ul li {
/* no space between lower level entries */ /* no space between lower level entries */
margin-bottom: 0; margin-bottom: 0;
@ -74,6 +91,28 @@ font.feature {
color: #2f4860; color: #2f4860;
} }
#nav_bar form.select select {
background-color: #c8c8b8;
border-width: 1px;
border-style: dotted;
border-color: #b0b0a0;
color: #2f4860;
}
#nav_bar form.select button {
background-color: #c4c4b4;
border-width: 0px;
}
#nav_bar form.select button:hover {
background-color: #d8d8d8;
color: #2f4860;
}
#nav_bar form.select {
margin: 7px 0px 7px 0px;
}
#main_content { #main_content {
margin-left: 22%; margin-left: 22%;
padding-left: 3%; padding-left: 3%;

View file

@ -1,5 +1,5 @@
Package: ezmlm-web Package: ezmlm-web
Version: 3.1.1-1 Version: 3.2-1
Section: admin Section: admin
Priority: extra Priority: extra
Architecture: all Architecture: all
@ -17,5 +17,5 @@ Description: Web interface for ezmlm-idx mailing list administration
* ezmlm-idx - http://ezmlm.org/ * ezmlm-idx - http://ezmlm.org/
* clearsilver for perl (>= 0.10.2) - http://www.clearsilver.net/downloads/ * clearsilver for perl (>= 0.10.2) - http://www.clearsilver.net/downloads/
* Mail::Ezmlm perl module via cpan or as debian package from * Mail::Ezmlm perl module via cpan or as debian package from
https://systemausfall.org/toolforge/debian https://systemausfall.org/toolforge/debian

View file

@ -1,3 +1,3 @@
ezmlm-web (0.3.1-1) unstable; urgency=low ezmlm-web (0.3.2-1) unstable; urgency=low
* Initial release * Initial release
-- Lars Kruse <devel@sumpfralle.de> Sat, 07 Jan 2006 00:45:47 +0100 -- Lars Kruse <devel@sumpfralle.de> Fri, 14 Apr 2006 14:36:47 +0100

View file

@ -1,6 +1,6 @@
#!/usr/bin/perl #!/usr/bin/perl
#=========================================================================== #===========================================================================
# ezmlm-web.cgi - version 3.1.1 # ezmlm-web.cgi - version 3.2
# ========================================================================== # ==========================================================================
# All user configuration happens in the config file ``ezmlmwebrc'' # All user configuration happens in the config file ``ezmlmwebrc''
# POD documentation is at the end of this file # POD documentation is at the end of this file
@ -21,11 +21,16 @@ use CGI;
use IO::File; use IO::File;
use POSIX qw(tmpnam); use POSIX qw(tmpnam);
use Encode qw/ from_to /; # add by ooyama for char convert use Encode qw/ from_to /; # add by ooyama for char convert
use English; # for dropping privileges
# 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 turned on
# drop privileges (necessary for calling gpg)
$UID = $EUID;
$GID = $EGID;
my $q = new CGI; my $q = new CGI;
$q->import_names('Q'); $q->import_names('Q');
use vars qw[$opt_c $opt_d $opt_C]; use vars qw[$opt_c $opt_d $opt_C];
@ -80,8 +85,8 @@ do $config_file;
# do we support encrypted mailing lists? # do we support encrypted mailing lists?
# see http://www.synacklabs.net/projects/crypt-ml/ # see http://www.synacklabs.net/projects/crypt-ml/
if (-e "$config_file" . ".encrypted") { if (-e "$config_file" . ".gnupg") {
do "$config_file.encrypted"; do "$config_file.gnupg";
# the config file should include "use Mail::Ezmlm::Gpg" as the use-line may not # the config file should include "use Mail::Ezmlm::Gpg" as the use-line may not
# be used here # be used here
if (defined($GPG_SUPPORT) && ($GPG_SUPPORT)) { if (defined($GPG_SUPPORT) && ($GPG_SUPPORT)) {
@ -138,6 +143,12 @@ unless (&check_permission_for_action) {
elsif ($action eq '' || $action eq 'list_select') { elsif ($action eq '' || $action eq 'list_select') {
# Default action. Present a list of available lists to the user ... # Default action. Present a list of available lists to the user ...
$pagename = 'list_select'; $pagename = 'list_select';
} elsif ($action eq 'show_page') {
$pagename = $q->param('pagename');
unless (-e "$TEMPLATE_DIR/$pagename.cs") {
$pagename = 'list_select';
$error = 'UnknownAction';
}
} elsif ($action eq 'subscribers') { } elsif ($action eq 'subscribers') {
# display list (or part list) subscribers # display list (or part list) subscribers
if (defined($q->param('list'))) { if (defined($q->param('list'))) {
@ -219,16 +230,30 @@ elsif ($action eq '' || $action eq 'list_select') {
$error = 'ParameterMissing'; $error = 'ParameterMissing';
$pagename = 'list_select'; $pagename = 'list_select';
} }
} elsif ($action eq 'gnupg_convert') { } elsif ($GPG_SUPPORT && ($action eq 'gnupg_convert_ask')) {
$pagename = 'gnupg_convert';
} elsif ($GPG_SUPPORT && ($action eq 'gnupg_convert_do')) {
my $tlist = new Mail::Ezmlm::Gpg("$LIST_DIR/" . $q->param('list')); my $tlist = new Mail::Ezmlm::Gpg("$LIST_DIR/" . $q->param('list'));
if ($tlist->convert()) { if ($tlist->is_gpg()) {
$pagename = 'subscribers'; if ($tlist->convert_to_plaintext()) {
$success = 'GnupgConvert'; $pagename = 'subscribers';
$success = 'GnupgConvert';
} else {
warn $tlist->errmsg();
$pagename = 'gnupg_convert';
$warning = 'GnupgConvert';
}
} else { } else {
$pagename = 'subscribers'; if ($tlist->convert_to_encrypted()) {
$warning = 'GnupgConvert'; $pagename = 'gnupg_generate_key';
$success = 'GnupgConvert';
} else {
warn $tlist->errmsg();
$pagename = 'gnupg_convert';
$warning = 'GnupgConvert';
}
} }
} elsif (($action eq 'gnupg_ask') || ($action eq 'gnupg_do')) { } elsif ($GPG_SUPPORT && (($action eq 'gnupg_ask') || ($action eq 'gnupg_do'))) {
# User wants to manage keys (only for encrypted mailing lists) # User wants to manage keys (only for encrypted mailing lists)
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 '')) {
@ -248,7 +273,7 @@ elsif ($action eq '' || $action eq 'list_select') {
$error = 'ParameterMissing'; $error = 'ParameterMissing';
$pagename = 'list_select'; $pagename = 'list_select';
} }
} elsif ($action eq 'gnupg_export') { } elsif ($GPG_SUPPORT && ($action eq 'gnupg_export')) {
if (defined($q->param('list')) && defined($q->param('gnupg_keyid'))) { if (defined($q->param('list')) && defined($q->param('gnupg_keyid'))) {
if (&gnupg_export_key($q->param('list'), $q->param('gnupg_keyid'))) { if (&gnupg_export_key($q->param('list'), $q->param('gnupg_keyid'))) {
exit 0; exit 0;
@ -362,16 +387,21 @@ sub load_hdf {
&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/");
# TODO: put some language detection and "web_lang" handling here
$hdf->readFile($LANGUAGE_DIR . '/' . $HTML_LANGUAGE . '.hdf');
# "normal", "basic" and "expert" should be supported # "normal", "basic" and "expert" should be supported
# 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 $ui_set = "default"; # may be overwritten later
$hdf->setValue("Config.UI.LinkAttrs.web_lang", $HTML_LANGUAGE);
$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
my %languages = &get_available_interface_languages();
my $lang;
foreach $lang (keys %languages) {
$hdf->setValue("Config.UI.Languages.$lang", $languages{$lang});
}
$hdf = &load_interface_language($hdf);
$hdf->setValue("ScriptName", $ENV{'SCRIPT_NAME'}); $hdf->setValue("ScriptName", $ENV{'SCRIPT_NAME'});
$hdf->setValue("Stylesheet", "$HTML_CSS_FILE"); $hdf->setValue("Stylesheet", "$HTML_CSS_FILE");
$hdf->setValue("Config.PageTitle", "$HTML_TITLE"); $hdf->setValue("Config.PageTitle", "$HTML_TITLE");
@ -417,6 +447,75 @@ sub output_page {
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
sub load_interface_language
{
my ($data) = @_;
my $config_language;
# load $HTML_LANGUAGE - this is necessary, if a translation is incomplete
$data->readFile("$LANGUAGE_DIR/$HTML_LANGUAGE" . ".hdf");
# set default language
$config_language = 'en';
$config_language = $HTML_LANGUAGE
unless (&check_interface_language($HTML_LANGUAGE));
# check for preferred browser language, if the box was not initialized yet
my $prefLang = &get_browser_language();
# take it, if a supported browser language was found
$config_language = $prefLang unless ($prefLang eq '');
######### temporary language setting? ############
# the default language can be overriden by the language selection form
if ($q->param('web_lang')) {
my $weblang = $q->param('web_lang');
if (&check_interface_language($weblang)) {
# load the data
$config_language = "$weblang";
} else {
# no valid language was selected - so you may ignore it
$warning = 'InvalidLanguage';
}
}
# add the setting to every link
$data->setValue('Config.UI.LinkAttrs.web_lang', "$config_language");
# import the configured resp. the temporarily selected language
$data->readFile("$LANGUAGE_DIR/$config_language" . ".hdf");
return $data;
}
# ---------------------------------------------------------------------------
# look for preferred browser language setting
# 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
{
my ($str, @langs, @res);
# Use language preference settings
if ($ENV{'HTTP_ACCEPT_LANGUAGE'} ne '')
{
@langs = split(/,/, $ENV{'HTTP_ACCEPT_LANGUAGE'});
foreach (@langs)
{
# get the first part of the language setting
($str) = ($_ =~ m/([a-z]+)/);
# check, if it is available
$res[$#res+1] = $str if check_interface_language($str);
}
}
# if everything fails - return empty string
$res[0] = "" if ($#res lt 0);
return $res[0];
}
# ---------------------------------------------------------------------------
sub set_pagedata_list_of_lists() sub set_pagedata_list_of_lists()
{ {
my (@files, $i, $num); my (@files, $i, $num);
@ -521,10 +620,12 @@ sub set_pagedata4list
if (&is_list_gnupg($listname)) { if (&is_list_gnupg($listname)) {
# some encryption specific stuff # some encryption specific stuff
&set_pagedata4list_gnupg($listname); &set_pagedata4list_gnupg($listname);
$pagedata->setValue("Data.List.Type","gnupg");
$ui_set = "gnupg"; $ui_set = "gnupg";
} else { } else {
# do the non-encryption configuration # do the non-encryption configuration
&set_pagedata4list_normal($listname, $part_type); &set_pagedata4list_normal($listname, $part_type);
$pagedata->setValue("Data.List.Type","default");
$ui_set = "default"; $ui_set = "default";
} }
@ -542,15 +643,14 @@ sub set_pagedata4list_gnupg() {
$gpg_list = new Mail::Ezmlm::Gpg("$LIST_DIR/$listname"); $gpg_list = new Mail::Ezmlm::Gpg("$LIST_DIR/$listname");
# read the configuration # read the configuration
my %config = $gpg_list->getconfig(); %config = $gpg_list->getconfig();
my $item;
foreach $item (keys %config) { foreach $item (keys %config) {
$pagedata->setValue("Data.List.Options.gnupg_$item", $config{$item}); $pagedata->setValue("Data.List.Options.gnupg_$item", $config{$item});
} }
# retrieve the currently available public keys # retrieve the currently available public keys
@gpg_keys = $gpg_list->get_public_keys(); @gpg_keys = $gpg_list->get_public_keys();
for (my $i = 0; $i <= $#gpg_keys; $i++) { for (my $i = 0; $i < @gpg_keys; $i++) {
$pagedata->setValue("Data.List.gnupg_keys.public.$i.id" , $gpg_keys[$i]{id}); $pagedata->setValue("Data.List.gnupg_keys.public.$i.id" , $gpg_keys[$i]{id});
$pagedata->setValue("Data.List.gnupg_keys.public.$i.email" , $gpg_keys[$i]{email}); $pagedata->setValue("Data.List.gnupg_keys.public.$i.email" , $gpg_keys[$i]{email});
$pagedata->setValue("Data.List.gnupg_keys.public.$i.name" , $gpg_keys[$i]{name}); $pagedata->setValue("Data.List.gnupg_keys.public.$i.name" , $gpg_keys[$i]{name});
@ -559,7 +659,7 @@ sub set_pagedata4list_gnupg() {
# retrieve the currently available secret keys # retrieve the currently available secret keys
@gpg_keys = $gpg_list->get_secret_keys(); @gpg_keys = $gpg_list->get_secret_keys();
for (my $i = 0; $i <= $#gpg_keys; $i++) { for (my $i = 0; $i < @gpg_keys; $i++) {
$pagedata->setValue("Data.List.gnupg_keys.secret.$i.id" , $gpg_keys[$i]{id}); $pagedata->setValue("Data.List.gnupg_keys.secret.$i.id" , $gpg_keys[$i]{id});
$pagedata->setValue("Data.List.gnupg_keys.secret.$i.email" , $gpg_keys[$i]{email}); $pagedata->setValue("Data.List.gnupg_keys.secret.$i.email" , $gpg_keys[$i]{email});
$pagedata->setValue("Data.List.gnupg_keys.secret.$i.name" , $gpg_keys[$i]{name}); $pagedata->setValue("Data.List.gnupg_keys.secret.$i.name" , $gpg_keys[$i]{name});
@ -810,7 +910,9 @@ 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',
@ -1144,7 +1246,7 @@ sub create_list {
} }
if (defined($q->param('list_language')) && ($q->param('list_language') ne 'default')) { if (defined($q->param('list_language')) && ($q->param('list_language') ne 'default')) {
if (&check_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'));
} else { } else {
$warning = 'InvalidListLanguage'; $warning = 'InvalidListLanguage';
@ -1268,9 +1370,29 @@ sub gnupg_export_key()
{ {
my ($listname, $keyid) = @_; my ($listname, $keyid) = @_;
my $list = new Mail::Ezmlm::Gpg("$LIST_DIR/$listname"); my $list = new Mail::Ezmlm::Gpg("$LIST_DIR/$listname");
# get the name of the key (for the download filename)
my @all_keys = $list->get_public_keys();
my ($i, $key, $name);
for ($i = 0; $i < @all_keys; $i++) {
$name = $all_keys[$i]{name} if ($keyid == $all_keys[$i]{id});
}
warn "vorher: $name";
if ($name) {
$name =~ s/\W+/_/g;
$name .= '.asc';
} else {
$name = "public_key.asc";
}
warn "nachher: $name";
my $key_armor; my $key_armor;
if ($key_armor = $list->export_key($keyid)) { if ($key_armor = $list->export_key($keyid)) {
print "Content-Type: application/pgp\n\n"; print "Content-Type: application/pgp\n";
# suggest a download filename
# (taken from http://www.bewley.net/perl/download.pl)
print "Content-Disposition: attachment; filename=$name\n";
print "Content-Description: exported key";
print $key_armor; print $key_armor;
return (0==0); return (0==0);
} else { } else {
@ -1485,7 +1607,7 @@ 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 avaoid accidently overriding default charset
if (defined($q->param('list_language'))) { if (defined($q->param('list_language'))) {
if (&check_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'));
} else { } else {
$warning = 'InvalidListLanguage'; $warning = 'InvalidListLanguage';
@ -1647,7 +1769,34 @@ sub webauth_create_allowed {
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
sub check_language { sub get_available_interface_languages {
my (%languages, @files, $file);
opendir(DIR, $LANGUAGE_DIR)
or &fatal_error ("Language directory ($LANGUAGE_DIR) not accessible!");
@files = sort grep { /.*\.hdf$/ } readdir(DIR);
close(DIR);
foreach $file (@files) {
my $hdf = ClearSilver::HDF->new();
$hdf->readFile("$LANGUAGE_DIR/$file");
substr($file, -4) = "";
my $lang_name = $hdf->getValue("Lang.Name", "$file");
$languages{$file} = $lang_name;
}
return %languages;
}
# ---------------------------------------------------------------------------
sub check_interface_language {
my ($language) = @_;
my %languages = &get_available_interface_languages();
return defined($languages{$language});
}
# ---------------------------------------------------------------------------
sub check_list_language {
my ($list, $lang) = @_; my ($list, $lang) = @_;
my $found = 0; my $found = 0;
my $item; my $item;

12
ezmlmwebrc.gnupg Normal file
View file

@ -0,0 +1,12 @@
# sample configuration file for encrypted mailing list support
# 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 turn on the gpg support
$GPG_SUPPORT = 0;

View file

@ -10,12 +10,6 @@
int main(void) { int main(void) {
/* Set the (real) uid to the same value, as the effective uid.
This is necesary, as (the suid) gpg tries to run on behalf of www-data
instead of the presumed user.
I hope, that this will not break on non-linux systems ... */
setreuid(getuid(), -1);
/* Change this path to wherever you decided to put ezmlm-web.cgi */ /* Change this path to wherever you decided to put ezmlm-web.cgi */
execv("/usr/local/bin/ezmlm-web.cgi", NULL); execv("/usr/local/bin/ezmlm-web.cgi", NULL);

View file

@ -1,9 +1,10 @@
LanguageID = de
LanguageName = Deutsch
Lang { Lang {
ID = de
Name = Deutsch
Menue { Menue {
ListCreate = Neue Liste anlegen ListCreate = Neue Liste anlegen
ListDelete = Liste löschen ListDelete = Liste löschen
@ -23,10 +24,11 @@ Lang {
GnupgPublicKeys = öffentliche Schlüssel GnupgPublicKeys = öffentliche Schlüssel
GnupgSecretKeys = private Schlüssel GnupgSecretKeys = private Schlüssel
GnupgGenerateKey = Schlüssel anlegen GnupgGenerateKey = Schlüssel anlegen
GnupgConvert = Verschlüsselung aktivieren GnupgConvert = Verschlüsselung
TextFiles = Texte TextFiles = Texte
ListSelect = Auswahl einer Liste ListSelect = Auswahl einer Liste
Properties = Eigenschaften von Properties = Eigenschaften von
Language = Sprache
Help = Hilfe (extern) Help = Hilfe (extern)
} }
@ -49,6 +51,7 @@ Lang {
ListDelete = Löschung von ListDelete = Löschung von
FileSelect = Auswählen eines Textbausteins FileSelect = Auswählen eines Textbausteins
FileEdit = Bearbeitung des Textbausteins FileEdit = Bearbeitung des Textbausteins
GnupgConvert = Verschlüsselung
GnupgPublic = Öffentliche Schlüssel GnupgPublic = Öffentliche Schlüssel
GnupgSecret = Private Schlüssel GnupgSecret = Private Schlüssel
GnupgGenerate = Erzeugen eines Schlüssels GnupgGenerate = Erzeugen eines Schlüssels
@ -65,8 +68,11 @@ Lang {
EditFile = Datei bearbeiten EditFile = Datei bearbeiten
SaveFile = Datei speichern SaveFile = Datei speichern
ResetFile = Angepassten Textbaustein verwerfen ResetFile = Angepassten Textbaustein verwerfen
DeletePublicKey = Öffentliche(n) Schlüssel lälschen LanguageSet = wählen
DeleteSecretKey = Private(n) Schlüssel lälschen DeletePublicKey = Öffentliche(n) Schlüssel löschen
DeleteSecretKey = Private(n) Schlüssel löschen
GnupgConvertToEncrypted = Wandle in eine verschlüsselte Liste um
GnupgConvertToNormal = Wandle in eine unverschlüsselte Liste um
GnupgImportKey = Schlüssel importieren GnupgImportKey = Schlüssel importieren
GnupgGenerateKey = Schlüsselpaar erzeugen GnupgGenerateKey = Schlüsselpaar erzeugen
GnupgExportKey = exportieren GnupgExportKey = exportieren
@ -120,7 +126,7 @@ Lang {
GnupgInvalidExpiration = Das Verfallsdatum is ungültig! GnupgInvalidExpiration = Das Verfallsdatum is ungültig!
GnupgInvalidKeySize = Die Schlüssellänge ist ungültig! GnupgInvalidKeySize = Die Schlüssellänge ist ungültig!
GnupgExportKey = Fehler beim Exportieren des Schlüssels! GnupgExportKey = Fehler beim Exportieren des Schlüssels!
GnupgConvert = Beim umwandeln in eine verschlüsselte Mailingliste trat ein Fehler auf! GnupgConvert = Beim Umwandeln trat ein Fehler auf!
} }
@ -253,7 +259,8 @@ Lang {
TextFiles = Das Auswahlfeld beinhaltet die Liste aller verfügbaren Textbausteine im Texte-Verzeichnis der Liste. Diese Textbausteine werden zur Erstellung der automatischen Antworten der Mailingliste benutzt. TextFiles = Das Auswahlfeld beinhaltet die Liste aller verfügbaren Textbausteine im Texte-Verzeichnis der Liste. Diese Textbausteine werden zur Erstellung der automatischen Antworten der Mailingliste benutzt.
EditTextFile = Passe den Textbaustein an die Erfordernisse der Liste an. Eventuell möchtest du dafür auch einige der reservierten Platzhalter verwenden, die am Ende dieser Seite aufgeführt sind. EditTextFile = Passe den Textbaustein an die Erfordernisse der Liste an. Eventuell möchtest du dafür auch einige der reservierten Platzhalter verwenden, die am Ende dieser Seite aufgeführt sind.
ResetTextFile = Der Textbaustein wurde spezifisch an diese Liste angepasst. Um stattdessen den vorgegebenen Baustein der eingestellten Sprache zu verwenden, kannst du diesen listenspezifischen Baustein entfernen. ResetTextFile = Der Textbaustein wurde spezifisch an diese Liste angepasst. Um stattdessen den vorgegebenen Baustein der eingestellten Sprache zu verwenden, kannst du diesen listenspezifischen Baustein entfernen.
GnupgGenerateKey = Um eine verschlüsselte Mailingliste verwenden zu können, ist es erforderlich, einen Schlüssel für die Liste zu erzeugen (oder zu importieren). Nachdem du das folgende Formular ausgefüllt und abgeschickt hast, wird es (abhängig von der Schlüssellänge) eine Weile dauern, bis der Schlüssel fertig ist. Sei also bitte geduldig. GnupgConvert = Du kannst eine normale Mailingliste in eine verschlüsselte umwandeln und umgekehrt.
GnupgGenerateKey = Um eine verschlüsselte Mailingliste verwenden zu können, ist es erforderlich, einen Schlüssel für die Liste zu erzeugen (oder zu importieren). Nachdem du das folgende Formular ausgefüllt und abgeschickt hast, wird es eine Weile (bis zu mehreren Minuten) dauern, bis der Schlüssel fertig ist. Sei also bitte geduldig.
} }
Legend { Legend {
@ -277,6 +284,7 @@ Lang {
TextFileReset = Auf die Vorgabe zurücksetzen TextFileReset = Auf die Vorgabe zurücksetzen
TextFileInfo = Nützliche Platzhalter TextFileInfo = Nützliche Platzhalter
AvailableLists = Verfügbare Listen AvailableLists = Verfügbare Listen
GnupgConvert = Verschlüsselungsunterstützung
GnupgPublicKeys = öffentliche Schlüssel dieser Liste GnupgPublicKeys = öffentliche Schlüssel dieser Liste
GnupgSecretKeys = Private Schlüssel dieser Liste GnupgSecretKeys = Private Schlüssel dieser Liste
GnupgKeyImport = Schlüssel importieren GnupgKeyImport = Schlüssel importieren

View file

@ -1,9 +1,9 @@
LanguageID = en
LanguageName = English
Lang { Lang {
ID = en
Name = English
Menue { Menue {
ListCreate = Create new list ListCreate = Create new list
ListDelete = Delete list ListDelete = Delete list
@ -23,10 +23,11 @@ Lang {
GnupgPublicKeys = public keys GnupgPublicKeys = public keys
GnupgSecretKeys = secret keys GnupgSecretKeys = secret keys
GnupgGenerateKey = generate key GnupgGenerateKey = generate key
GnupgConvert = Enable encryption GnupgConvert = Encryption
TextFiles = Text files TextFiles = Text files
ListSelect = Choose a list ListSelect = Choose a list
Properties = Properties of Properties = Properties of
Language = Language
Help = Help (external) Help = Help (external)
} }
@ -49,6 +50,7 @@ Lang {
ListDelete = Delete list ListDelete = Delete list
FileSelect = Choose a file for editing FileSelect = Choose a file for editing
FileEdit = Editing file FileEdit = Editing file
GnupgConvert = Encryption
GnupgPublic = Public keys GnupgPublic = Public keys
GnupgSecret = Secret keys GnupgSecret = Secret keys
GnupgGenerate = Generate a new keypair GnupgGenerate = Generate a new keypair
@ -65,6 +67,9 @@ Lang {
EditFile = Edit file EditFile = Edit file
SaveFile = Save file SaveFile = Save file
ResetFile = Remove customized file ResetFile = Remove customized file
LanguageSet = select
GnupgConvertToEncrypted = Convert to an encrypted mailinglist
GnupgConvertToNormal = 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
@ -253,7 +258,8 @@ Lang {
TextFiles = The selection box contains a list of files available in the DIR/text directory. These files are sent out in response to specfic user requests or as part of all outgoing messages. Edit them as necessary. TextFiles = The selection box contains a list of files available in the DIR/text directory. These files are sent out in response to specfic user requests or as part of all outgoing messages. Edit them as necessary.
EditTextFile = Change this text according to your needs. Maybe you would like to use some of the reserved tags, that are described at the bottom of this page. EditTextFile = Change this text according to your needs. Maybe you would like to use some of the reserved tags, that are described at the bottom of this page.
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.
GnupgGenerateKey = Every encrypted mailing list needs a secret key. You can import this key or create it with the form below. After submitting the form, you have to be patient, as it takes some time to create a key. 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.
} }
Legend { Legend {
@ -277,6 +283,7 @@ Lang {
TextFileReset = Discard customized text TextFileReset = Discard customized text
TextFileInfo = Useful placeholders TextFileInfo = Useful placeholders
AvailableLists = Available lists AvailableLists = Available lists
GnupgConvert = Encryption support
GnupgPublicKeys = Public keys of this list GnupgPublicKeys = Public keys of this list
GnupgSecretKeys = Secret keys of this list GnupgSecretKeys = Secret keys of this list
GnupgKeyImport = Import a key GnupgKeyImport = Import a key

View file

@ -4,6 +4,7 @@ LanguageDir
Stylesheet Stylesheet
HelpIconURL HelpIconURL
Config.Title Config.Title
Config.UI.Languages.[names]
Config.UI.LinkAttrs.web_lang Config.UI.LinkAttrs.web_lang
Config.UI.LinkAttrs.template Config.UI.LinkAttrs.template
@ -38,6 +39,7 @@ Data.List.Settings.[0-9].state
Data.List.SubModPath Data.List.SubModPath
Data.List.Subscribers.* Data.List.Subscribers.*
Data.List.TrailingText Data.List.TrailingText
Data.List.Type ("default" or "gnupg")
Data.List.WebUsers Data.List.WebUsers
Data.Lists.[0-9]+ Data.Lists.[0-9]+
Data.ListsCount Data.ListsCount

View file

@ -1,6 +1,6 @@
<div id="footer"> <div id="footer">
<a href="https://systemausfall.org/toolforge/ezmlm-web">ezmlm-web</a> (v3.1.1) - <?cs var:html_escape(Lang.Misc.FooterText) ?> <a href="http://www.ezmlm.org/" target="_blank">ezmlm</a> <a href="https://systemausfall.org/toolforge/ezmlm-web">ezmlm-web</a> (v3.2) - <?cs var:html_escape(Lang.Misc.FooterText) ?> <a href="http://www.ezmlm.org/" target="_blank">ezmlm</a>
<br /> <br />
</div> </div>

24
template/gnupg_convert.cs Normal file
View file

@ -0,0 +1,24 @@
<div class="title">
<h1><?cs var:html_escape(Lang.Title.GnupgConvert) ?></h1>
</div>
<div class="introduction">
<p><?cs var:html_escape(Lang.Introduction.GnupgConvert) ?></p>
</div>
<fieldset class="form">
<legend><?cs var:html_escape(Lang.Legend.GnupgConvert) ?> </legend>
<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>
</form>
</fieldset>

View file

@ -0,0 +1,23 @@
<!-- allows the user to change the interface language (not of the list!) -->
<?cs if:subcount(Config.UI.Languages) > 0 ?>
<form class="select" method="post" action="<?cs call:link("","","","","","") ?>" enctype="application/x-www-form-urlencoded">
<?cs if:Data.List.Name ?><input type="hidden" name="list" value="<?cs
var:Data.List.Name ?>" /><?cs /if ?>
<input type="hidden" name="action" value="show_page" />
<input type="hidden" name="pagename" value="<?cs var:Data.Action ?>" />
<font class="no_link"><?cs
var:html_escape(Lang.Menue.Language) ?>:</font><br/>
<select name="web_lang" size="0">
<?cs each: tlang = Config.UI.Languages
?><option value="<?cs var:name(tlang) ?>"<?cs
if:name(tlang) == Config.UI.LinkAttrs.web_lang
?> selected="selected"<?cs /if?>><?cs
var:html_escape(tlang) ?></option>
<?cs /each ?>
</select>&nbsp;<button type="submit" name="send" value="do"><?cs var:html_escape(Lang.Buttons.LanguageSet) ?></button>
</form>
<?cs /if ?>

View file

@ -8,13 +8,18 @@
title="<?cs var:html_escape(Lang.Menue.ListSelect) ?>"><?cs var:html_escape(Lang.Menue.ListSelect) ?></a> title="<?cs var:html_escape(Lang.Menue.ListSelect) ?>"><?cs var:html_escape(Lang.Menue.ListSelect) ?></a>
</li> </li>
<?cs /if ?> <?cs /if ?>
<?cs if:Data.Permissions.Create && (UI.Navigation.ListCreate == 1) ?> <?cs if:Data.Permissions.Create && (UI.Navigation.ListCreate == 1) ?>
<li><a <?cs if:(Data.Action == "list_create") ?> class="nav_active"<?cs /if ?> <li><a <?cs if:(Data.Action == "list_create") ?> class="nav_active"<?cs /if ?>
href="<?cs call:link("action","list_create_ask","","","","") ?>" href="<?cs call:link("action","list_create_ask","","","","") ?>"
title="<?cs var:html_escape(Lang.Menue.ListCreate) ?>"><?cs var:html_escape(Lang.Menue.ListCreate) ?></a> title="<?cs var:html_escape(Lang.Menue.ListCreate) ?>"><?cs var:html_escape(Lang.Menue.ListCreate) ?></a>
</li> </li>
<?cs /if ?> <?cs /if ?>
<?cs if:((subcount(Data.Lists) > 0) && (UI.Navigation.ListSelect == 1))
|| (Data.Permissions.Create && (UI.Navigation.ListCreate == 1)) ?>
<hr/>
<?cs /if ?>
<?cs if:Data.List.Name ?> <?cs if:Data.List.Name ?>
@ -145,8 +150,9 @@
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
?><li><a <?cs if:Data.Action == "gnupg_convert" ?> class="nav_active"<?cs /if ?> ?><li><a <?cs if:(Data.Action == "gnupg_convert_ask") ||
href="<?cs call:link("list",Data.List.Name,"action","gnupg_convert","","") ?>" (Data.Action == "gnupg_convert_do") ?> class="nav_active"<?cs /if ?>
href="<?cs call:link("list",Data.List.Name,"action","gnupg_convert_ask","","") ?>"
title="<?cs var:html_escape(Lang.Menue.GnupgConvert) ?>"><?cs title="<?cs var:html_escape(Lang.Menue.GnupgConvert) ?>"><?cs
var:html_escape(Lang.Menue.GnupgConvert) ?></a></li><?cs /if ?> var:html_escape(Lang.Menue.GnupgConvert) ?></a></li><?cs /if ?>
@ -158,8 +164,16 @@
</ul></li> </ul></li>
<hr/>
<?cs /if ?> <?cs /if ?>
<?cs if:UI.Navigation.Language
?><li><?cs include:TemplateDir + '/language_select.cs' ?></li>
<hr/>
<?cs /if ?>
<?cs if:UI.Navigation.Help <?cs if:UI.Navigation.Help
?><li><a href="http://www.ezmlm.org/ezman/index.html#toc1" target="_blank" ?><li><a href="http://www.ezmlm.org/ezman/index.html#toc1" target="_blank"
title="<?cs var:html_escape(Lang.Misc.HelpLink) ?>"><?cs title="<?cs var:html_escape(Lang.Misc.HelpLink) ?>"><?cs

View file

@ -24,7 +24,8 @@ UI {
TextEdit = 1 TextEdit = 1
ListDelete = 1 ListDelete = 1
GnupgConvert = 1 GnupgConvert = 1
Language = 1
Interface = 1
Help = 1 Help = 1
} }

View file

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