From 8dcea3092813e8c8a5d599c2f5da031aa1935830 Mon Sep 17 00:00:00 2001 From: lars Date: Tue, 11 Apr 2006 02:38:37 +0000 Subject: [PATCH] import, export, delete and generate keys --- css/default.css | 4 + ezmlm-web.cgi | 151 +++++++++++++++++- lang/de.hdf | 29 +++- lang/en.hdf | 31 +++- template/config_options/admin_path.cs | 2 +- template/config_options/gnupg_keysize.cs | 4 +- template/gnupg_generate_key.cs | 8 +- .../{gnupg_import_form.cs => gnupg_import.cs} | 14 +- template/gnupg_public.cs | 10 +- template/gnupg_secret.cs | 10 +- template/list_delete.cs | 2 +- template/nav.cs | 2 +- template/ui/gnupg/normal.hdf | 1 + 13 files changed, 232 insertions(+), 36 deletions(-) rename template/{gnupg_import_form.cs => gnupg_import.cs} (61%) diff --git a/css/default.css b/css/default.css index 7b8ceef..1def0a6 100644 --- a/css/default.css +++ b/css/default.css @@ -185,6 +185,10 @@ h1.oben { color: #ffcc00; } +table.gnupg_keys td { + padding-right: 10px; + } + table.subscribers { border-width: 0; margin: 0; diff --git a/ezmlm-web.cgi b/ezmlm-web.cgi index 44b16a1..16e2b0c 100755 --- a/ezmlm-web.cgi +++ b/ezmlm-web.cgi @@ -239,6 +239,19 @@ elsif ($action eq '' || $action eq 'list_select') { $error = 'ParameterMissing'; $pagename = 'list_select'; } +} elsif ($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; + } else { + $warning = 'GnupgExportKey'; + # TODO: pagename is quite random here ... + $pagename = 'gnupg_secret'; + } + } else { + $error = 'ParameterMissing'; + $pagename = 'list_select'; + } } elsif ($action eq 'textfiles') { # Edit DIR/text ... if (defined($q->param('list'))) { @@ -528,7 +541,7 @@ sub set_pagedata4list_gnupg() { # 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}); @@ -537,7 +550,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}); @@ -887,6 +900,7 @@ sub untaint { foreach $i (0 .. $#params) { my(@values); next if($params[$i] eq 'mailaddressfile'); + next if($params[$i] eq 'gnupg_key_file'); foreach $param ($q->param($params[$i])) { next if $param eq ''; if ($param =~ /^([#-\@\w\.\/\[\]\:\n\r\>\< _"']+)$/) { @@ -958,6 +972,7 @@ sub add_address { $fail_count++; } } + # TODO: is CLOSE necessary? } # User typed in an address @@ -1212,7 +1227,137 @@ sub manage_gnupg_keys() # manage gnupg keys { return (1==0) unless ($GPG_SUPPORT); - return (0==0); + + my ($list, $listname, $upload_file); + + $listname = $q->param('list'); + return (0==1) unless (&is_list_gnupg($listname)); + + $list = new Mail::Ezmlm::Gpg("$LIST_DIR/$listname"); + + my $subset = $q->param('gnupg_subset'); + if (defined($q->param('gnupg_key_file'))) { + return &gnupg_import_key($list, $q->param('gnupg_key_file')); + } elsif (($subset eq 'public') || ($subset eq 'secret')) { + return &gnupg_remove_key($list); + } elsif ($subset eq 'generate_key') { + if (&gnupg_generate_key($list)) { + $pagename = 'gnupg_secret'; + return (0==0); + } else { + return (0==1); + } + } else { + $error = 'UnknownAction'; + return (1==0); + } +} + +# ------------------------------------------------------------------------ + +sub gnupg_export_key() +{ + my ($listname, $keyid) = @_; + my $list = new Mail::Ezmlm::Gpg("$LIST_DIR/$listname"); + my $key_armor; + if ($key_armor = $list->export_key($keyid)) { + print "Content-Type: application/pgp\n\n"; + print $key_armor; + return (0==0); + } else { + return (0==1); + } +} + +# ------------------------------------------------------------------------ + +sub gnupg_import_key() +{ + my ($list, $upload_file) = @_; + + if ($upload_file) { + # Sanity check + my $fileinfo = $q->uploadInfo($upload_file); + my $filetype = $fileinfo->{'Content-Type'}; + unless($filetype =~ m{^text/}i) { + $warning = 'InvalidFileFormat'; + warn "[ezmlm-web] mime type of uploaded file rejected: $filetype"; + return (1==0); + } + + # Handle key upload + my @ascii_key = <$upload_file>; + # TODO: filter content? + if ($list->import_key(join ('',@ascii_key))) { + $success = 'GnupgKeyImport'; + return (0==0); + } else { + $error = 'GnupgKeyImport'; + return (0==1); + } + } else { + $warning = 'GnupgNoKeyFile'; + return (1==0); + } +} + +# ------------------------------------------------------------------------ + +sub gnupg_generate_key() { + my ($list) = @_; + my ($key_name, $key_comment, $key_size, $key_expires); + $key_name = $q->param('gnupg_keyname'); + $key_comment = $q->param('gnupg_keycomment'); + $key_size = $q->param('gnupg_keysize'); + $key_expires = $q->param('gnupg_keyexpires'); + + unless ($key_name) { + $warning = 'GnupgNoName'; + return (0==1); + } + + unless ($key_expires =~ m/^[0-9]+[wmy]?$/) { + $warning = 'GnupgInvalidExpiration'; + return (1==0); + } + + unless ($key_size =~ m/^[0-9]*$/) { + $warning = 'GnupgInvalidKeySize'; + return (1==0); + } + + if ($list->generate_private_key($key_name, $key_comment, + &this_listaddress(), $key_size, $key_expires)) { + $pagename = 'gnupg_secret'; + return (0==0); + } else { + return (0==1); + $error = 'GnupgGenerateKey'; + } +} + +# ------------------------------------------------------------------------ + +sub gnupg_remove_key() { + my ($list) = @_; + + my $removed = 0; + my $key_id; + my @all_keys = grep /^gnupg_key_[0-9A-F]*$/, $q->param; + foreach $key_id (@all_keys) { + $key_id =~ /^gnupg_key_([0-9A-F]*)$/; + $list->delete_key($1) && $removed++; + } + + if ($removed == 0) { + $error = 'GnupgDelKey'; + return (1==0); + } elsif ($#all_keys > $removed) { + $warning = 'GnupgDelKey'; + return (0==0); + } else { + return (0==0); + } } # ------------------------------------------------------------------------ diff --git a/lang/de.hdf b/lang/de.hdf index 0b90996..ef3773c 100644 --- a/lang/de.hdf +++ b/lang/de.hdf @@ -68,6 +68,7 @@ Lang { DeleteSecretKey = Private(n) Schlüssel lälschen GnupgImportKey = Schlüssel importieren GnupgGenerateKey = Schlüsselpaar erzeugen + GnupgExportKey = exportieren } @@ -78,6 +79,9 @@ Lang { InvalidFileName = Der Dateiname ist nicht zulässig. UnknownConfigPage = Diese Konfigurations-Seite existiert nicht! UnknownGnupgPage = Diese GnuPG-Seite existiert nicht! + GnupgKeyImport = Der Import des Schlüssels schlug fehl! + GnupgDelKey = Das Entfernen des Schlüssels schlug fehl! + GnupgGenerateKey = Das Erzeugen des Schlüssels schlug fehl! } @@ -108,18 +112,26 @@ Lang { RequiresIDX5 = Diese Aktion erfordert ezmlm-idx in der Version 5.0 oder höher. ResetFileIsDefault = Dieser Textbaustein ist keine angepasste Variante und kann somit nicht zurückgesetzt werden. ResetFile = Der angepasste Textbaustein konnte nicht entfernt werden. + GnupgNoKeyFile = Es wurde keine Datei zum Hochladen ausgewählt! + GnupgDelKey = Mindestens ein Schlüssel konnte nicht gelöscht werden! + GnupgNoKeySelected = Es wurde kein Schlüssel ausgewählt! + GnupgNoName = Der Name des Schlüssels darf nicht leer sein! + GnupgInvalidExpiration = Das Verfallsdatum is ungültig! + GnupgInvalidKeySize = Die Schlüssellänge ist ungültig! + GnupgExportKey = Fehler beim Exportieren des Schlüssels! } SuccessMessage { - AddAddress = Einschreibung erfolgreich + AddAddress = Einschreibung erfolgreich DeleteAddress = Austragung erfolgreich abgeschlossen - CreateList = Die neue Liste wurde erfolgreich angelegt. - DeleteList = Die Mailingliste wurde gelöscht. + CreateList = Die neue Liste wurde erfolgreich angelegt. + DeleteList = Die Mailingliste wurde gelöscht. UpdateConfig = Die neuen Einstellungen wurden erfolgreich gespeichert. - UpdateGnupg = Der Schlüsselring wurde erfolgreich geändert. - SaveFile = Die Datei wurde gespeichert. - ResetFile = Der angepasste Textbaustein wurde entfernt. Zukünftig wird stattdessen der systemweite Standard-Baustein verwendet. + UpdateGnupg = Der Schlüsselring wurde erfolgreich aktualisiert. + SaveFile = Die Datei wurde gespeichert. + ResetFile = Der angepasste Textbaustein wurde entfernt. Zukünftig wird stattdessen der systemweite Standard-Baustein verwendet. + GnupgKeyImport = Der Schlüssel wurde importiert. } @@ -215,7 +227,9 @@ Lang { GnupgImportKey = Schlüssel aus einer Datei importieren: GnupgKeyName = Die Bezeichung des Schlüssels GnupgKeyComment = Ein Kommentar (optional) - GnupgKeySize = Die Länge des Schlüssels + GnupgKeySize = Schlüssellänge (in Bytes) + GnupgKeyExpires = Verfallsdatum (in Jahren) + Never = nie } @@ -236,6 +250,7 @@ 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. } Legend { diff --git a/lang/en.hdf b/lang/en.hdf index e434a91..083135e 100644 --- a/lang/en.hdf +++ b/lang/en.hdf @@ -68,6 +68,7 @@ Lang { DeleteSecretKey = Delete secret key(s) GnupgImportKey = Import key GnupgGenerateKey = Generate key pair + GnupgExportKey = download } @@ -78,6 +79,9 @@ Lang { InvalidFileName = The name of the file is invalid! UnknownConfigPage = The chosen config page is invalid! UnknownGnupgPage = The chosen gnupg page is invalid! + GnupgKeyImport = Failed to import the uploaded key! + GnupgDelKey = Failed to remove the key(s)! + GnupgGenerateKey = Failed generate a new key! } @@ -107,19 +111,27 @@ Lang { InvalidLocalPart = The local part of the list address is not valid RequiresIDX5 = This action requires ezmlm-idx v5.0 or higher. ResetFileIsDefault = There is no customized text file, that can be removed. - ResetFile = Removal of custimized text file failed. + ResetFile = Removal of custimized text file failed. + GnupgNoKeyFile = There was no key file selected for upload! + GnupgDelKey = Removal of (at least) one key failed! + GnupgNoKeySelected = There was no key selected to be removed! + GnupgNoName = The name of the key may not be empty! + GnupgInvalidExpiration = The expiration time is invalid! + GnupgInvalidKeySize = The length of the key is invalid! + GnupgExportKey = Export of key failed! } SuccessMessage { - AddAddress = The address was added to the list. + AddAddress = The address was added to the list. DeleteAddress = The address was removed from the list. - CreateList = The new mailing list was successfully created. - DeleteList = The mailing list was successfully removed. + CreateList = The new mailing list was successfully created. + DeleteList = The mailing list was successfully removed. UpdateConfig = The mailing list's configuration was successfully changed. - UpdateGnupg = The keyring was successfully changed. - 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. + UpdateGnupg = The keyring has been changed successfully. + SaveFile = The file was saved. + ResetFile = The customized text file was successfully removed. From now on, the system-wide default text file will be used instead of it. + GnupgKeyImport = The key was successfully imported. } @@ -215,7 +227,9 @@ Lang { GnupgImportKey = Import a new key from a file: GnupgKeyName = Name of the key GnupgKeyComment = Comment (optional) - GnupgKeySize = Length of the key + GnupgKeySize = Length of the key (bytes) + GnupgKeyExpires = Expiration time (years) + Never = never } @@ -236,6 +250,7 @@ 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. } Legend { diff --git a/template/config_options/admin_path.cs b/template/config_options/admin_path.cs index f0b40f9..a87204d 100644 --- a/template/config_options/admin_path.cs +++ b/template/config_options/admin_path.cs @@ -3,5 +3,5 @@ () + ?>() diff --git a/template/config_options/gnupg_keysize.cs b/template/config_options/gnupg_keysize.cs index 14cbbe9..c1f1ab1 100644 --- a/template/config_options/gnupg_keysize.cs +++ b/template/config_options/gnupg_keysize.cs @@ -1,9 +1,9 @@ - - diff --git a/template/gnupg_generate_key.cs b/template/gnupg_generate_key.cs index 84bb63d..e36514a 100644 --- a/template/gnupg_generate_key.cs +++ b/template/gnupg_generate_key.cs @@ -2,17 +2,23 @@

+
+

+
+
" enctype="application/x-www-form-urlencoded"> + + - +
diff --git a/template/gnupg_import_form.cs b/template/gnupg_import.cs similarity index 61% rename from template/gnupg_import_form.cs rename to template/gnupg_import.cs index 73bb933..b9e9348 100644 --- a/template/gnupg_import_form.cs +++ b/template/gnupg_import.cs @@ -1,15 +1,13 @@
+
" - enctype="application/x-www-form-urlencoded"> + enctype="multipart/form-data"> - + - - - " - enctype="multipart/form-data"> -