From 5f9454f970d1c93c19b2db5a19713ac36df7751a Mon Sep 17 00:00:00 2001 From: lars Date: Thu, 2 Oct 2008 23:25:52 +0000 Subject: [PATCH] module Mail::Ezmlm::GpgEzmlm: * fix syntax problems * fix regex for detecting settings * fix handling of GnuPG setting * allow string settings (GnuPG and keyDir) --- Ezmlm/trunk/Ezmlm/GpgEzmlm.pm | 49 +++++++++++++++++++++++------------ 1 file changed, 33 insertions(+), 16 deletions(-) diff --git a/Ezmlm/trunk/Ezmlm/GpgEzmlm.pm b/Ezmlm/trunk/Ezmlm/GpgEzmlm.pm index 1105fa7..9f99ff7 100644 --- a/Ezmlm/trunk/Ezmlm/GpgEzmlm.pm +++ b/Ezmlm/trunk/Ezmlm/GpgEzmlm.pm @@ -28,7 +28,7 @@ package Mail::Ezmlm::GpgEzmlm; use strict; use warnings; use diagnostics; -use vars qw($GPG_EZMLM_BASE $VERSION @ISA @EXPORT @EXPORT_OK); +use vars qw($GPG_EZMLM_BASE $GPG_BIN $VERSION @ISA @EXPORT @EXPORT_OK); use File::Copy; use Carp; @@ -65,7 +65,7 @@ The Mail::Ezmlm::GpgEzmlm class is inherited from the Mail::Ezmlm class. # == Begin site dependant variables == $GPG_EZMLM_BASE = '/usr/bin'; # Autoinserted by Makefile.PL -$GPG_BIN = '/usr/bin/gpg' # Autoinserted by Makefile.PL +$GPG_BIN = '/usr/bin/gpg'; # Autoinserted by Makefile.PL # == clean up the path for taint checking == local $ENV{PATH}; @@ -102,7 +102,7 @@ sub new { bless $self, ref $class || $class || 'Mail::Ezmlm::GpgEzmlm'; # define the available (supported) options for gpg-ezmlm == @{$self->{SUPPORTED_OPTIONS}} = ( - "GnupG", + "GnuPG", "KeyDir", "RequireSub", "RequireSigs", @@ -332,7 +332,7 @@ sub update { # "repair" the dotqmail files (use "gpg-ezmlm-send" instead of "ezmlm-send") &_cleanup_dotqmail_files($self->thislist()); - return the result of the ezmlm-make run + # return the result of the ezmlm-make run return $result; } @@ -356,11 +356,6 @@ sub update_special { return undef; } - # always set the default value for the "gpg" setting explicitely - otherwise - # gpg-ezmlm breaks on most systems (its default location is - # /usr/local/bin/gpg) - $ok_switches{GnuPG} = $GPG_BIN; - @delete_switches = (); # check if all supplied settings are supported # btw we change the case (upper/lower) of the setting to the default one @@ -391,19 +386,19 @@ sub update_special { my $errorstring; my $config_file_old = $self->thislist() . "/config"; my $config_file_new = $self->thislist() . "/config.new"; + my $gnupg_setting_found = (0==1); if (open(CONFIG_OLD, "<$config_file_old")) { if (open(CONFIG_NEW, ">$config_file_new")) { my ($in_line, $one_opt, $one_val, $new_setting); while () { $in_line = $_; + $gnupg_setting_found = (0==0) if ($in_line =~ m/^\s*GnuPG\s+/i); if (%ok_switches) { my $found = 0; while (($one_opt, $one_val) = each(%ok_switches)) { # is this the right line (maybe commented out)? - if ($in_line =~ m/^#?\w*$one_opt/i) { - print CONFIG_NEW "$one_opt "; - print CONFIG_NEW ($one_val)? "yes" : "no"; - print CONFIG_NEW "\n"; + if ($in_line =~ m/^#?\s*$one_opt\s+/i) { + print CONFIG_NEW _get_config_line($one_opt, $one_val); delete $ok_switches{$one_opt}; $found = 1; } @@ -416,9 +411,13 @@ sub update_special { } # write the remaining settings to the end of the file while (($one_opt, $one_val) = each(%ok_switches)) { - print CONFIG_NEW "\n$one_opt "; - print CONFIG_NEW ($one_val)? "yes" : "no"; - print CONFIG_NEW "\n"; + print CONFIG_NEW _get_config_line($one_opt, $one_val); + } + # always set the default value for the "gpg" setting explicitely, + # if it was not overriden - otherwise gpg-ezmlm breaks on most + # systems (its default location is /usr/local/bin/gpg) + unless ($gnupg_setting_found) { + print CONFIG_NEW _get_config_line("GnuPG", $GPG_BIN); } } else { $errorstring = "failed to write to temporary config file: $config_file_new"; @@ -447,6 +446,24 @@ sub update_special { } +# return the configuration file string for a key/value combination +sub _get_config_line { + my $key = shift; + my $value = shift; + + my $result = "$key "; + if (($key eq "GnuPG") || ($key eq "keyDir")) { + # these are the only settings with string values + # escape special characters + $value =~ s/[^\w\.\/\-]/_/g; + $result .= $value; + } else { + $result .= ($value)? "yes" : "no"; + } + $result .= "\n"; + return $result; +} + # == Get a list of options for the current list == =head2 Getting the current configuration of the current list: