Version 0.3.3
This commit is contained in:
parent
561cfd3f85
commit
976b3f3ccc
8 changed files with 239 additions and 56 deletions
18
Changes
18
Changes
|
@ -23,3 +23,21 @@ Revision history for Perl extension gpg-ezmlm.
|
||||||
- Fixed a bug in runcmd that caused the gpg-ezmlm to sometimes
|
- Fixed a bug in runcmd that caused the gpg-ezmlm to sometimes
|
||||||
truncate some of the data sent in large messages. Cleaned
|
truncate some of the data sent in large messages. Cleaned
|
||||||
the manifest.
|
the manifest.
|
||||||
|
|
||||||
|
0.3.2 March 26, 2005
|
||||||
|
- Added the Delivered-To line and any lines in the headeradd file
|
||||||
|
to outgoing mail. This more closely conforms with ezmlm
|
||||||
|
behavior. Thanks to Lars Kruse for the catch on the behavior
|
||||||
|
mismatch.
|
||||||
|
|
||||||
|
0.3.3 April 20, 2005
|
||||||
|
- Modified the copy routine to allow blank lines in the
|
||||||
|
headeradd file. Applied fixes from Elan Ruusamae to the
|
||||||
|
gpg-ezmlm-convert.pl program fixing typos and providing
|
||||||
|
helpful messages in case of incorrect usage. Added functionality
|
||||||
|
that I'd accidentally wiped from gpg-ezmlm-convert.pl before
|
||||||
|
I started using a sane version control system. Added additional
|
||||||
|
config parameters to the default config file. Fixed a bug
|
||||||
|
that would occur if gpg-ezmlm was installed before the
|
||||||
|
mailing list was used normally.
|
||||||
|
|
47
GpgEzmlm.pm
47
GpgEzmlm.pm
|
@ -13,6 +13,7 @@ require Exporter;
|
||||||
|
|
||||||
@EXPORT = qw(
|
@EXPORT = qw(
|
||||||
mydie
|
mydie
|
||||||
|
copy
|
||||||
mail
|
mail
|
||||||
runcmd
|
runcmd
|
||||||
readConfig
|
readConfig
|
||||||
|
@ -24,7 +25,7 @@ require Exporter;
|
||||||
reject
|
reject
|
||||||
);
|
);
|
||||||
|
|
||||||
$VERSION = '0.3.1';
|
$VERSION = '0.3.3';
|
||||||
|
|
||||||
=head1 NAME
|
=head1 NAME
|
||||||
|
|
||||||
|
@ -210,6 +211,41 @@ sub readConfig {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#copy takes a filename and a buffer, and appends the contents of that
|
||||||
|
#file to the buffer. These files are the messages that the mailing list
|
||||||
|
#sends back. If a line consists of a !R or !A, or contains the
|
||||||
|
#tags <#l#>, <#n#>, or <#h#>, then the contents of that line are replaced.
|
||||||
|
|
||||||
|
|
||||||
|
sub copy {
|
||||||
|
my $file = shift;
|
||||||
|
my $buffer = shift;
|
||||||
|
my $isHeader = shift;
|
||||||
|
my $configRef = shift;
|
||||||
|
my $confirm = shift;
|
||||||
|
my $target = shift;
|
||||||
|
my $outmsgnum = shift;
|
||||||
|
|
||||||
|
open FILE, "<$file" or mydie(111, "unable to open $file: $!\n");
|
||||||
|
|
||||||
|
while (my $line = <FILE>) {
|
||||||
|
$line =~ s/^\!R/$confirm/;
|
||||||
|
$line =~ s/^\!A/$target/;
|
||||||
|
$line =~ s/<\#l\#>/$$configRef{outlocal}/;
|
||||||
|
$line =~ s/<\#h\#>/$$configRef{outhost}/;
|
||||||
|
$line =~ s/<\#n\#>/$outmsgnum/;
|
||||||
|
if($isHeader > 0) {
|
||||||
|
if($line =~ /\S+/) {
|
||||||
|
$$buffer .= $line;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$$buffer .= $line;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
close(FILE);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#runcmd - Runs a command, pushes all the input through it, and writes
|
#runcmd - Runs a command, pushes all the input through it, and writes
|
||||||
#to output and err. Select()s across reading and writing, for those
|
#to output and err. Select()s across reading and writing, for those
|
||||||
#processes that can't hold all your input before they need to be read from
|
#processes that can't hold all your input before they need to be read from
|
||||||
|
@ -303,7 +339,7 @@ sub runcmd {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
# I know the below looks like an error, it should be
|
# I know the below looks like an error, that it should be
|
||||||
# ($errDone and $readDone and $writeDone), but I've been testing this,
|
# ($errDone and $readDone and $writeDone), but I've been testing this,
|
||||||
# and the select never lets me through to pick the EOF off the READ
|
# and the select never lets me through to pick the EOF off the READ
|
||||||
# filehandle on gpg encrypts. If you know why, please enlighten me.
|
# filehandle on gpg encrypts. If you know why, please enlighten me.
|
||||||
|
@ -623,6 +659,13 @@ sub prepare {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
my $mail;
|
my $mail;
|
||||||
|
|
||||||
|
$mail .= $mydtline. "\n";
|
||||||
|
|
||||||
|
if (-r "headeradd") {
|
||||||
|
copy("headeradd", \$mail, 1, $configref);
|
||||||
|
}
|
||||||
|
|
||||||
foreach my $hline (@header) {
|
foreach my $hline (@header) {
|
||||||
$mail .= $hline;
|
$mail .= $hline;
|
||||||
}
|
}
|
||||||
|
|
1
MANIFEST
1
MANIFEST
|
@ -10,3 +10,4 @@ gpg-ezmlm-convert.pl
|
||||||
gpg-ezmlm-manage.pl
|
gpg-ezmlm-manage.pl
|
||||||
gpg-ezmlm-send.pl
|
gpg-ezmlm-send.pl
|
||||||
|
|
||||||
|
META.yml Module meta-data (added by MakeMaker)
|
||||||
|
|
10
META.yml
Normal file
10
META.yml
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
# http://module-build.sourceforge.net/META-spec.html
|
||||||
|
#XXXXXXX This is a prototype!!! It will change in the future!!! XXXXX#
|
||||||
|
name: gpg-ezmlm
|
||||||
|
version: 0.3.3
|
||||||
|
version_from: GpgEzmlm.pm
|
||||||
|
installdirs: site
|
||||||
|
requires:
|
||||||
|
|
||||||
|
distribution_type: module
|
||||||
|
generated_by: ExtUtils::MakeMaker version 6.17
|
40
README
Normal file
40
README
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
GpgEzmlm version 0.3.3
|
||||||
|
======================
|
||||||
|
|
||||||
|
INSTALLATION
|
||||||
|
|
||||||
|
To install this module type the following:
|
||||||
|
|
||||||
|
perl Makefile.PL
|
||||||
|
make
|
||||||
|
make install
|
||||||
|
|
||||||
|
To convert an existing ezmlm mailing list to a gpg-ezmlm mailing list,
|
||||||
|
run:
|
||||||
|
|
||||||
|
gpg-ezmlm-convert.pl <dir> <dot>
|
||||||
|
|
||||||
|
Where <dir> is the directory the current ezmlm list lives in, and
|
||||||
|
<dot> is in the form of ~/.qmail-mlname, for a mailing list named
|
||||||
|
mlname. Same as the dot that you used in ezmlm-make(1). Edit the
|
||||||
|
config file created in the directory to your preferences.
|
||||||
|
|
||||||
|
To convert an existing gpg-ezmlm list to this version, just point the
|
||||||
|
dotfiles (.qmail-<list> and .qmail-<list>-default) to the new
|
||||||
|
gpg-ezmlm-send.pl and gpg-ezmlm-manage.pl. If you want to change the
|
||||||
|
default configuration settings, a sample config file has been included,
|
||||||
|
edit to taste.
|
||||||
|
|
||||||
|
DEPENDENCIES
|
||||||
|
|
||||||
|
This suite requires these other modules, libraries, and tools:
|
||||||
|
|
||||||
|
GnuPG ( http://www.gnupg.org )
|
||||||
|
ezmlm ( http://cr.yp.to/ezmlm.html )
|
||||||
|
qmail ( http://cr.yp.to/qmail.html )
|
||||||
|
perl ( http://www.cpan.org )
|
||||||
|
Digest::MD5 ( http://search.cpan.org/search?module=Digest::MD5 )
|
||||||
|
File::Sync ( http://search.cpan.org/search?module=File::Sync )
|
||||||
|
|
||||||
|
Sorry about all the requirements. I did try to avoid Gnome syndrome...
|
||||||
|
|
|
@ -1,28 +1,69 @@
|
||||||
#/usr/bin/perl -w
|
#!/usr/bin/perl -w
|
||||||
|
|
||||||
#gpg-ezmlm-convert is a tool to convert a currently existing ezmlm
|
#gpg-ezmlm-convert is a tool to convert a currently existing ezmlm
|
||||||
#list into a gpg-ezmlm list, by replacing the appropriate lines,
|
#list into a gpg-ezmlm list, by replacing the appropriate lines,
|
||||||
#creating the appropriate subdirs, and generating a list key for you.
|
#creating the appropriate subdirs, and generating a list key for you.
|
||||||
|
|
||||||
|
use Config;
|
||||||
use strict;
|
use strict;
|
||||||
|
|
||||||
my $dir = shift;
|
my $usage = "Usage: $0 <dir> <dot>
|
||||||
my $dot = shift;
|
Where <dir> is the directory the current ezmlm list lives in, and <dot> is in
|
||||||
|
the form of ~/.qmail-mlname, for a mailing list named mlname. Same as the dot
|
||||||
|
that you used in ezmlm-make(1). Edit the config file created in the directory
|
||||||
|
to your preferences.
|
||||||
|
|
||||||
|
To convert an existing gpg-ezmlm list to this version, just point the dotfiles
|
||||||
|
(.qmail-<list> and .qmail-<list>-default) to the new gpg-ezmlm-send.pl and
|
||||||
|
gpg-ezmlm-manage.pl. If you want to change the default configuration settings,
|
||||||
|
a sample config file has been included, edit to taste.
|
||||||
|
|
||||||
|
";
|
||||||
|
|
||||||
|
my $installbin = "$Config{installbin}";
|
||||||
|
|
||||||
|
my $dir = shift or die $usage;
|
||||||
|
my $dot = shift or die $usage;
|
||||||
|
|
||||||
if (!(-d $dir)) {
|
if (!(-d $dir)) {
|
||||||
die "No such directory $maildirlist\n";
|
die "No such directory $dir\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
mkdir "$dir/.gnupg", 0700 or
|
mkdir "$dir/.gnupg", 0700 or
|
||||||
die "Cannot make $maildirlist/.gnupg: $!\n";
|
die "Cannot make $dir/.gnupg: $!\n";
|
||||||
|
|
||||||
mkdir "$dir/tmp", 0700 or
|
mkdir "$dir/tmp", 0700 or
|
||||||
die "Cannot make $maildirlist/tmp: $!\n";
|
die "Cannot make $dir/tmp: $!\n";
|
||||||
|
|
||||||
open NEWSEND, ">$dot.n" or die "Cannot make temporary file $dot.n: $!\n";
|
open NEWDOT, ">$dot.n" or die "Cannot make temporary file $dot.n: $!\n";
|
||||||
open NEWDEFAULT, ">$dot-default.n" or
|
open NEWDEFAULT, ">$dot-default.n" or
|
||||||
die 'Cannot make temporary file $dot-default.n: $!\n";
|
die "Cannot make temporary file $dot-default.n: $!\n";
|
||||||
|
open DOT, "<$dot" or die "Cannot open $dot: $!\n";
|
||||||
|
open DEFAULT, "<$dot-default" or die "Cannot open $dot-default: $!\n";
|
||||||
|
|
||||||
|
while (<DOT>) {
|
||||||
|
my $line = $_;
|
||||||
|
if ($line =~ /ezmlm-send\s+(\S+)/) {
|
||||||
|
print NEWDOT "\|$installbin/gpg-ezmlm-send.pl $1\n";
|
||||||
|
} else {
|
||||||
|
print NEWDOT $line;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
close (DOT);
|
||||||
|
close (NEWDOT);
|
||||||
|
rename "$dot.n", "$dot" or die "Cannot move $dot.n to $dot: $!\n";
|
||||||
|
while (<DEFAULT>) {
|
||||||
|
my $line = $_;
|
||||||
|
if ($line =~ /ezmlm-manage\s+(\S+)/) {
|
||||||
|
print NEWDEFAULT "\|$installbin/gpg-ezmlm-manage.pl $1\n";
|
||||||
|
} else {
|
||||||
|
print NEWDEFAULT $line;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
close (DEFAULT);
|
||||||
|
close (NEWDEFAULT);
|
||||||
|
rename "$dot-default.n", "$dot-default"
|
||||||
|
or die "Cannot move $dot-default.n to $dot-default: $!\n";
|
||||||
|
|
||||||
open CONFIG, ">$dir/config" or
|
open CONFIG, ">$dir/config" or
|
||||||
die "Cannot open $dir/config: $!\n";
|
die "Cannot open $dir/config: $!\n";
|
||||||
|
@ -73,7 +114,25 @@ print CONFIG << ENDCONFIG;
|
||||||
#
|
#
|
||||||
# NokeyNocrypt no
|
# NokeyNocrypt no
|
||||||
|
|
||||||
#VerifiedKeyReq requies that all keys that are used be trusted keys.
|
#setting allowKeySubmission to yes permits users to automatically
|
||||||
|
#submit keys during the subscription confirmation email. Only
|
||||||
|
#keys corresponding to the email address that is being subscribed
|
||||||
|
#will be accepted. Setting this to no effectively requires the list
|
||||||
|
#admin to manage all keys themselves.
|
||||||
|
#
|
||||||
|
# allowKeySubmission yes
|
||||||
|
|
||||||
|
#encryptToAll controls whether gpg-ezmlm will encrypt a message
|
||||||
|
#once, to all subscriber keys, and send that message to all users,
|
||||||
|
#or encrypt each subscriber's message to them individually. The
|
||||||
|
#default is to individually encrypt. This means that subscribers
|
||||||
|
#on the list cannot see who else is on the list by looking at
|
||||||
|
#the keyIDs the message is encrypted to, but it takes more CPU
|
||||||
|
#time.
|
||||||
|
#
|
||||||
|
# encryptToAll no
|
||||||
|
|
||||||
|
#VerifiedKeyReq requires that all keys that are used be trusted keys.
|
||||||
#An untrusted key is treated the same as no key at all.
|
#An untrusted key is treated the same as no key at all.
|
||||||
#
|
#
|
||||||
# VerifiedKeyReq no
|
# VerifiedKeyReq no
|
||||||
|
@ -86,3 +145,37 @@ print CONFIG << ENDCONFIG;
|
||||||
# RequireSub no
|
# RequireSub no
|
||||||
ENDCONFIG
|
ENDCONFIG
|
||||||
close(CONFIG);
|
close(CONFIG);
|
||||||
|
|
||||||
|
print "It is recommended that you generate a mailing list key.\n";
|
||||||
|
print "YOU MUST LEAVE THE PASSPHRASE BLANK!\n";
|
||||||
|
print "Would you like to generate this key now? [y/n]\n";
|
||||||
|
my $input = <>;
|
||||||
|
if ($input =~ /y/i) {
|
||||||
|
system("gpg --homedir $dir/.gnupg --gen-key");
|
||||||
|
} else {
|
||||||
|
print "OK, skipping key generation for now. Generate later with\n";
|
||||||
|
print "gpg --homedir $dir/.gnupg --gen-key\n";
|
||||||
|
exit();
|
||||||
|
}
|
||||||
|
|
||||||
|
open CONFIRM, "<$dir/text/sub-confirm" or
|
||||||
|
die "Cannot open $dir/text/sub-confirm: $!\n";
|
||||||
|
open NEWCONFIRM, ">$dir/text/sub-confirm.n" or
|
||||||
|
die "Cannot open $dir/text/sub-confirm.n: $!\n";
|
||||||
|
|
||||||
|
my $line;
|
||||||
|
while(defined($line = <CONFIRM>)) {
|
||||||
|
if($line =~ /an empty reply/) {
|
||||||
|
$line =~ s/an empty reply/a reply with your\npublic key in the body/;
|
||||||
|
}
|
||||||
|
print NEWCONFIRM $line;
|
||||||
|
}
|
||||||
|
close(CONFIRM);
|
||||||
|
print NEWCONFIRM "The public key for this mailing list is contained below:\n";
|
||||||
|
my $key = `gpg --homedir $dir/.gnupg --export -a`;
|
||||||
|
print NEWCONFIRM $key;
|
||||||
|
close(NEWCONFIRM);
|
||||||
|
rename "$dir/text/sub-confirm.n", "$dir/text/sub-confirm"
|
||||||
|
or die "Cannot move $dir/text/sub-confirm.n to $dir/text/sub-confirm: $!\n";
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -16,31 +16,6 @@ my %config = ();
|
||||||
$ENV{PATH} = "/bin:/usr/bin";
|
$ENV{PATH} = "/bin:/usr/bin";
|
||||||
$ENV{ENV} = "";
|
$ENV{ENV} = "";
|
||||||
|
|
||||||
#copy takes a filename and a buffer, and appends the contents of that
|
|
||||||
#file to the buffer. These files are the messages that the mailing list
|
|
||||||
#sends back. If a line consists of a !R or !A, then the contents of
|
|
||||||
#that line are replaced.
|
|
||||||
|
|
||||||
sub copy {
|
|
||||||
my $file = shift;
|
|
||||||
my $buffer = shift;
|
|
||||||
my $confirm = shift;
|
|
||||||
my $target = shift;
|
|
||||||
|
|
||||||
open FILE, "<$file" or mydie(111, "unable to open $file: $!\n");
|
|
||||||
|
|
||||||
while (my $line = <FILE>) {
|
|
||||||
if($line =~ /\!R/) {
|
|
||||||
$$buffer .= $confirm;
|
|
||||||
} elsif ($line =~ /\!A/) {
|
|
||||||
$$buffer .= $target;
|
|
||||||
} else {
|
|
||||||
$$buffer .= $line;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
close(FILE);
|
|
||||||
}
|
|
||||||
|
|
||||||
#cookie generates a hash given a timestamp, a secret, etc. This infomation
|
#cookie generates a hash given a timestamp, a secret, etc. This infomation
|
||||||
#is used to generate and check confirmation strings. This is _not_ the
|
#is used to generate and check confirmation strings. This is _not_ the
|
||||||
#same hash algorithm used by ezmlm, but since the strings are ephemeral,
|
#same hash algorithm used by ezmlm, but since the strings are ephemeral,
|
||||||
|
@ -387,11 +362,11 @@ while (<STDIN>) {
|
||||||
$message .= $line;
|
$message .= $line;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
copy("text/top", \$message, $confirm, $target);
|
copy("text/top", \$message, 0, \%config, $confirm, $target);
|
||||||
if ($action =~ /^-subscribe$/) {
|
if ($action =~ /^-subscribe$/) {
|
||||||
copy("text/sub-confirm", \$message, $confirm, $target);
|
copy("text/sub-confirm", \$message, 0, \%config, $confirm, $target);
|
||||||
} elsif ($action =~ /^-unsubscribe$/) {
|
} elsif ($action =~ /^-unsubscribe$/) {
|
||||||
copy("text/unsub-confirm", \$message, $confirm, $target);
|
copy("text/unsub-confirm", \$message, 0, \%config, $confirm, $target);
|
||||||
} elsif ($action =~ /^-sc\./) {
|
} elsif ($action =~ /^-sc\./) {
|
||||||
if($flaghashok) {
|
if($flaghashok) {
|
||||||
if($config{allowKeySubmission}) {
|
if($config{allowKeySubmission}) {
|
||||||
|
@ -399,28 +374,28 @@ if ($action =~ /^-subscribe$/) {
|
||||||
}
|
}
|
||||||
if (subscribe($target, 1) > 0) {
|
if (subscribe($target, 1) > 0) {
|
||||||
maillog("+",$target);
|
maillog("+",$target);
|
||||||
copy("text/sub-ok", \$message, $confirm, $target);
|
copy("text/sub-ok", \$message, 0, \%config, $confirm, $target);
|
||||||
} else {
|
} else {
|
||||||
copy("text/sub-nop", \$message, $confirm, $target);
|
copy("text/sub-nop", \$message, 0, \%config, $confirm, $target);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
copy("text/sub-bad", \$message, $confirm, $target);
|
copy("text/sub-bad", \$message, 0, \%config, $confirm, $target);
|
||||||
}
|
}
|
||||||
} elsif ($action =~ /^-uc\./) {
|
} elsif ($action =~ /^-uc\./) {
|
||||||
if($flaghashok) {
|
if($flaghashok) {
|
||||||
if (subscribe($target, 0) > 0) {
|
if (subscribe($target, 0) > 0) {
|
||||||
maillog("-", $target);
|
maillog("-", $target);
|
||||||
copy("text/unsub-ok", \$message, $confirm, $target);
|
copy("text/unsub-ok", \$message, 0, \%config, $confirm, $target);
|
||||||
} else {
|
} else {
|
||||||
copy("text/unsub-nop", \$message, $confirm, $target);
|
copy("text/unsub-nop", \$message, 0, \%config, $confirm, $target);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
copy("text/unsub-bad", \$message, $confirm, $target);
|
copy("text/unsub-bad", \$message, 0, \%config, $confirm, $target);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
copy("text/help", \$message, $confirm, $target);
|
copy("text/help", \$message, 0, \%config, $confirm, $target);
|
||||||
}
|
}
|
||||||
copy("text/bottom", \$message, $confirm, $target);
|
copy("text/bottom", \$message, 0, \%config, $confirm, $target);
|
||||||
|
|
||||||
$message .= "Return-Path: <$sender>\n";
|
$message .= "Return-Path: <$sender>\n";
|
||||||
$message .= $messagecp;
|
$message .= $messagecp;
|
||||||
|
|
|
@ -60,13 +60,16 @@ if($config{requireSub}) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
open NUM, "<num" or mydie(111, "unable to open $dir/num: $!\n");
|
if(open NUM, "<num") {
|
||||||
my $taintnum = <NUM>;
|
my $taintnum = <NUM>;
|
||||||
if($taintnum =~ /(\d+)/) {
|
if($taintnum =~ /(\d+)/) {
|
||||||
$num = $1;
|
$num = $1;
|
||||||
}
|
}
|
||||||
close(NUM);
|
close(NUM);
|
||||||
$num++;
|
$num++;
|
||||||
|
} else {
|
||||||
|
$num = 1;
|
||||||
|
}
|
||||||
|
|
||||||
if($config{archived}) {
|
if($config{archived}) {
|
||||||
use integer;
|
use integer;
|
||||||
|
|
Loading…
Reference in a new issue