diff --git a/README b/README index 3202bfa..00bd7aa 100644 --- a/README +++ b/README @@ -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 diff --git a/UPGRADING b/UPGRADING index acf5989..beb07c6 100644 --- a/UPGRADING +++ b/UPGRADING @@ -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 diff --git a/changelog b/changelog index bbb7e91..325aaf3 100644 --- a/changelog +++ b/changelog @@ -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] diff --git a/css/default.css b/css/default.css index 1def0a6..2419284 100644 --- a/css/default.css +++ b/css/default.css @@ -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%; diff --git a/debian-related/DEBIAN/control b/debian-related/DEBIAN/control index 380d589..f9b706d 100644 --- a/debian-related/DEBIAN/control +++ b/debian-related/DEBIAN/control @@ -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 diff --git a/debian-related/changelog.Debian b/debian-related/changelog.Debian index 9178a39..245eefb 100644 --- a/debian-related/changelog.Debian +++ b/debian-related/changelog.Debian @@ -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 Sat, 07 Jan 2006 00:45:47 +0100 + -- Lars Kruse Fri, 14 Apr 2006 14:36:47 +0100 diff --git a/ezmlm-web.cgi b/ezmlm-web.cgi index fd1f78b..87018c7 100755 --- a/ezmlm-web.cgi +++ b/ezmlm-web.cgi @@ -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; diff --git a/ezmlmwebrc.gnupg b/ezmlmwebrc.gnupg new file mode 100644 index 0000000..1669f1e --- /dev/null +++ b/ezmlmwebrc.gnupg @@ -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; + + diff --git a/index.c b/index.c index 3dd93e0..058f854 100644 --- a/index.c +++ b/index.c @@ -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); diff --git a/lang/de.hdf b/lang/de.hdf index e523656..5f6ead9 100644 --- a/lang/de.hdf +++ b/lang/de.hdf @@ -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 diff --git a/lang/en.hdf b/lang/en.hdf index e81a523..db2715c 100644 --- a/lang/en.hdf +++ b/lang/en.hdf @@ -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 diff --git a/spec/hdf-spec.txt b/spec/hdf-spec.txt index ee6bbfc..5c89e01 100644 --- a/spec/hdf-spec.txt +++ b/spec/hdf-spec.txt @@ -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 diff --git a/template/footer.cs b/template/footer.cs index 89f8cb7..4ac4f36 100644 --- a/template/footer.cs +++ b/template/footer.cs @@ -1,6 +1,6 @@ diff --git a/template/gnupg_convert.cs b/template/gnupg_convert.cs new file mode 100644 index 0000000..16c8163 --- /dev/null +++ b/template/gnupg_convert.cs @@ -0,0 +1,24 @@ +
+

+
+ +
+

+
+ +
+ + +
" enctype="application/x-www-form-urlencoded"> + + + + +
+ +
diff --git a/template/language_select.cs b/template/language_select.cs new file mode 100644 index 0000000..fbda572 --- /dev/null +++ b/template/language_select.cs @@ -0,0 +1,23 @@ + + 0 ?> + +
" enctype="application/x-www-form-urlencoded"> + + + + + + :
+   +
+ + diff --git a/template/nav.cs b/template/nav.cs index e83d8ec..be57bfc 100644 --- a/template/nav.cs +++ b/template/nav.cs @@ -8,13 +8,18 @@ title=""> - +
  • class="nav_active" href="" title="">
  • + 0) && (UI.Navigation.ListSelect == 1)) + || (Data.Permissions.Create && (UI.Navigation.ListCreate == 1)) ?> +
    + + @@ -145,8 +150,9 @@ var:html_escape(Lang.Menue.TextFiles) ?>
  • class="nav_active" - href="" + ?>
  • class="nav_active" + href="" title="">
  • @@ -158,8 +164,16 @@ +
    +
  • + +
    + + +