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
read INSTALL.
@ -21,9 +21,10 @@ VIII. Bugs && Bug Reports
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) 02005-02006, Lars Kruse, All Rights Reserved.
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
2) a new (optional) configuration setting is available: DOTQMAIL_DIR
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

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
* new setting: DOTQMAIL_DIR (useful for multi domain vpopmail setups)
[suggested by Maurits Lamers]

View file

@ -30,8 +30,19 @@ font.feature {
padding-top: 1.5%;
padding-bottom: 1.5%;
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 {
margin-top: 1%;
padding-bottom: 1%;
@ -50,6 +61,12 @@ font.feature {
margin-bottom: 5px;
}
v_bar ul li ul {
/* small space between middle level entries */
margin-bottom: 4px;
}
#nav_bar ul li ul li {
/* no space between lower level entries */
margin-bottom: 0;
@ -74,6 +91,28 @@ font.feature {
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 {
margin-left: 22%;
padding-left: 3%;

View file

@ -1,5 +1,5 @@
Package: ezmlm-web
Version: 3.1.1-1
Version: 3.2-1
Section: admin
Priority: extra
Architecture: all
@ -17,5 +17,5 @@ Description: Web interface for ezmlm-idx mailing list administration
* ezmlm-idx - http://ezmlm.org/
* clearsilver for perl (>= 0.10.2) - http://www.clearsilver.net/downloads/
* 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
-- 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
#===========================================================================
# ezmlm-web.cgi - version 3.1.1
# ezmlm-web.cgi - version 3.2
# ==========================================================================
# All user configuration happens in the config file ``ezmlmwebrc''
# POD documentation is at the end of this file
@ -21,11 +21,16 @@ use CGI;
use IO::File;
use POSIX qw(tmpnam);
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
# setting is turned on
# drop privileges (necessary for calling gpg)
$UID = $EUID;
$GID = $EGID;
my $q = new CGI;
$q->import_names('Q');
use vars qw[$opt_c $opt_d $opt_C];
@ -80,8 +85,8 @@ do $config_file;
# do we support encrypted mailing lists?
# see http://www.synacklabs.net/projects/crypt-ml/
if (-e "$config_file" . ".encrypted") {
do "$config_file.encrypted";
if (-e "$config_file" . ".gnupg") {
do "$config_file.gnupg";
# the config file should include "use Mail::Ezmlm::Gpg" as the use-line may not
# be used here
if (defined($GPG_SUPPORT) && ($GPG_SUPPORT)) {
@ -138,6 +143,12 @@ unless (&check_permission_for_action) {
elsif ($action eq '' || $action eq 'list_select') {
# Default action. Present a list of available lists to the user ...
$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') {
# display list (or part list) subscribers
if (defined($q->param('list'))) {
@ -219,16 +230,30 @@ elsif ($action eq '' || $action eq 'list_select') {
$error = 'ParameterMissing';
$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'));
if ($tlist->convert()) {
$pagename = 'subscribers';
$success = 'GnupgConvert';
if ($tlist->is_gpg()) {
if ($tlist->convert_to_plaintext()) {
$pagename = 'subscribers';
$success = 'GnupgConvert';
} else {
warn $tlist->errmsg();
$pagename = 'gnupg_convert';
$warning = 'GnupgConvert';
}
} else {
$pagename = 'subscribers';
$warning = 'GnupgConvert';
if ($tlist->convert_to_encrypted()) {
$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)
my $subset = $q->param('gnupg_subset');
if (defined($q->param('list')) && ($subset ne '')) {
@ -248,7 +273,7 @@ elsif ($action eq '' || $action eq 'list_select') {
$error = 'ParameterMissing';
$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 (&gnupg_export_key($q->param('list'), $q->param('gnupg_keyid'))) {
exit 0;
@ -362,16 +387,21 @@ sub load_hdf {
&fatal_error("Template dir ($TEMPLATE_DIR) not found!") unless (-e $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
# TODO: should be selected via web interface
$ui_template = "normal";
$ui_set = "default"; # may be overwritten later
$hdf->setValue("Config.UI.LinkAttrs.web_lang", $HTML_LANGUAGE);
$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("Stylesheet", "$HTML_CSS_FILE");
$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()
{
my (@files, $i, $num);
@ -521,10 +620,12 @@ sub set_pagedata4list
if (&is_list_gnupg($listname)) {
# some encryption specific stuff
&set_pagedata4list_gnupg($listname);
$pagedata->setValue("Data.List.Type","gnupg");
$ui_set = "gnupg";
} else {
# do the non-encryption configuration
&set_pagedata4list_normal($listname, $part_type);
$pagedata->setValue("Data.List.Type","default");
$ui_set = "default";
}
@ -542,15 +643,14 @@ sub set_pagedata4list_gnupg() {
$gpg_list = new Mail::Ezmlm::Gpg("$LIST_DIR/$listname");
# read the configuration
my %config = $gpg_list->getconfig();
my $item;
%config = $gpg_list->getconfig();
foreach $item (keys %config) {
$pagedata->setValue("Data.List.Options.gnupg_$item", $config{$item});
}
# retrieve the currently available 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.email" , $gpg_keys[$i]{email});
$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
@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.email" , $gpg_keys[$i]{email});
$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)
@files = grep {/./} map { (-e "$qmail_prefix$_")? "$qmail_prefix$_" : undef } (
'',
'.no-gpg',
'-default',
'-default.no-gpg',
'-owner',
'-return-default',
'-reject-default',
@ -1144,7 +1246,7 @@ sub create_list {
}
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'));
} else {
$warning = 'InvalidListLanguage';
@ -1268,9 +1370,29 @@ sub gnupg_export_key()
{
my ($listname, $keyid) = @_;
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;
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;
return (0==0);
} else {
@ -1485,7 +1607,7 @@ sub update_config {
# update language
# this _must_ happen after set_charset to avaoid accidently overriding default charset
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'));
} else {
$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 $found = 0;
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) {
/* 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 */
execv("/usr/local/bin/ezmlm-web.cgi", NULL);

View file

@ -1,9 +1,10 @@
LanguageID = de
LanguageName = Deutsch
Lang {
ID = de
Name = Deutsch
Menue {
ListCreate = Neue Liste anlegen
ListDelete = Liste löschen
@ -23,10 +24,11 @@ Lang {
GnupgPublicKeys = öffentliche Schlüssel
GnupgSecretKeys = private Schlüssel
GnupgGenerateKey = Schlüssel anlegen
GnupgConvert = Verschlüsselung aktivieren
GnupgConvert = Verschlüsselung
TextFiles = Texte
ListSelect = Auswahl einer Liste
Properties = Eigenschaften von
Language = Sprache
Help = Hilfe (extern)
}
@ -49,6 +51,7 @@ Lang {
ListDelete = Löschung von
FileSelect = Auswählen eines Textbausteins
FileEdit = Bearbeitung des Textbausteins
GnupgConvert = Verschlüsselung
GnupgPublic = Öffentliche Schlüssel
GnupgSecret = Private Schlüssel
GnupgGenerate = Erzeugen eines Schlüssels
@ -65,8 +68,11 @@ Lang {
EditFile = Datei bearbeiten
SaveFile = Datei speichern
ResetFile = Angepassten Textbaustein verwerfen
DeletePublicKey = Öffentliche(n) Schlüssel lälschen
DeleteSecretKey = Private(n) Schlüssel lälschen
LanguageSet = wählen
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
GnupgGenerateKey = Schlüsselpaar erzeugen
GnupgExportKey = exportieren
@ -120,7 +126,7 @@ Lang {
GnupgInvalidExpiration = Das Verfallsdatum is ungültig!
GnupgInvalidKeySize = Die Schlüssellänge ist ungültig!
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.
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.
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 {
@ -277,6 +284,7 @@ Lang {
TextFileReset = Auf die Vorgabe zurücksetzen
TextFileInfo = Nützliche Platzhalter
AvailableLists = Verfügbare Listen
GnupgConvert = Verschlüsselungsunterstützung
GnupgPublicKeys = öffentliche Schlüssel dieser Liste
GnupgSecretKeys = Private Schlüssel dieser Liste
GnupgKeyImport = Schlüssel importieren

View file

@ -1,9 +1,9 @@
LanguageID = en
LanguageName = English
Lang {
ID = en
Name = English
Menue {
ListCreate = Create new list
ListDelete = Delete list
@ -23,10 +23,11 @@ Lang {
GnupgPublicKeys = public keys
GnupgSecretKeys = secret keys
GnupgGenerateKey = generate key
GnupgConvert = Enable encryption
GnupgConvert = Encryption
TextFiles = Text files
ListSelect = Choose a list
Properties = Properties of
Language = Language
Help = Help (external)
}
@ -49,6 +50,7 @@ Lang {
ListDelete = Delete list
FileSelect = Choose a file for editing
FileEdit = Editing file
GnupgConvert = Encryption
GnupgPublic = Public keys
GnupgSecret = Secret keys
GnupgGenerate = Generate a new keypair
@ -65,6 +67,9 @@ Lang {
EditFile = Edit file
SaveFile = Save file
ResetFile = Remove customized file
LanguageSet = select
GnupgConvertToEncrypted = Convert to an encrypted mailinglist
GnupgConvertToNormal = Convert to a plaintext mainlinglist
DeletePublicKey = Delete public key(s)
DeleteSecretKey = Delete secret key(s)
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.
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.
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 {
@ -277,6 +283,7 @@ Lang {
TextFileReset = Discard customized text
TextFileInfo = Useful placeholders
AvailableLists = Available lists
GnupgConvert = Encryption support
GnupgPublicKeys = Public keys of this list
GnupgSecretKeys = Secret keys of this list
GnupgKeyImport = Import a key

View file

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

View file

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

View file

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

View file

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