-#-------- sub getpgpcommand
-# getpgpcommand generates the command to sign the message and returns it.
-#
-# Receives:
-# - $PGPVersion: A scalar holding the PGPVersion
-sub getpgpcommand {
- my ($PGPVersion) = @_;
- my $PGPCommand;
-
- if ($PGPVersion eq '2') {
- if ($Config{'PathtoPGPPass'} && !$Config{'PGPPass'}) {
- open (PGPPW, $Config{'PathtoPGPPass'}) or die "$0: E: Can't open $Config{'PathtoPGPPass'}: $!";
- Config{'$PGPPass'} = <PGPPW>;
- close PGPPW;
- }
-
- if (Config{'$PGPPass'}) {
- $PGPCommand = "PGPPASS=\"".$Config{'PGPPass'}."\" ".$Config{'pgp'}." -u \"".$Config{'PGPSigner'}."\" +verbose=0 language='en' -saft <".$Config{'pgptmpf'}.".txt >".$Config{'pgptmpf'}.".txt.asc";
- } else {
- die "$0: E: PGP-Passphrase is unknown!\n";
- }
- } elsif ($PGPVersion eq '5') {
- if ($Config{'PathtoPGPPass'}) {
- $PGPCommand = "PGPPASSFD=2 ".$Config{'pgp'}."s -u \"".$Config{'PGPSigner'}."\" -t --armor -o ".$Config{'pgptmpf'}.".txt.asc -z -f < ".$Config{'pgptmpf'}.".txt 2<".$Config{'PathtoPGPPass'};
- } else {
- die "$0: E: PGP-Passphrase is unknown!\n";
- }
- } elsif ($PGPVersion =~ m/GPG/io) {
- if (Config{'$PathtoPGPPass'}) {
- $PGPCommand = $Config{'pgp'}." --digest-algo MD5 -a -u \"".$Config{'PGPSigner'}."\" -o ".$Config{'pgptmpf'}.".txt.asc --no-tty --batch --passphrase-fd 2 2<".$Config{'PathtoPGPPass'}." --clearsign ".$Config{'pgptmpf'}.".txt";
- } else {
- die "$0: E: Passphrase is unknown!\n";
- }
- } else {
- die "$0: E: Unknown PGP-Version $PGPVersion!";
- }
- return $PGPCommand;
-}
-
-
-#-------- sub signarticle
-# signarticle signs an articel and returns a reference to an array
-# containing the whole signed Message.
-#
-# Receives:
-# - $HeaderAR: A reference to a array containing the articles headers.
-# - $BodyR: A reference to an array containing the body.
-#
-# Returns:
-# - $MessageRef: A reference to an array containing the whole message.
-sub signpgp {
- my ($HeaderAR, $BodyR) = @_;
- my (@pgphead, @pgpbody, $pgphead, $pgpbody, $header, $signheaders, @signheaders, $currentheader, $HeaderR, $line);
-
- foreach my $line (@$HeaderAR) {
- if ($line =~ /^(\S+):\s+(.*)$/s) {
- $currentheader = $1;
- $$HeaderR{lc($currentheader)} = "$1: $2";
- } else {
- $$HeaderR{lc($currentheader)} .= $line;
- }
- }
-
- foreach (@PGPSignHeaders) {
- if (defined($$HeaderR{lc($_)}) && $$HeaderR{lc($_)} =~ m/^[^\s:]+: .+/o) {
- push @signheaders, $_;
- }
- }
-
- $pgpbody = join ("", @$BodyR);
-
- # Delete and create the temporary pgp-Files
- unlink "$Config{'pgptmpf'}.txt";
- unlink "$Config{'pgptmpf'}.txt.asc";
- $signheaders = join(",", @signheaders);
-
- $pgphead = "X-Signed-Headers: $signheaders\n";
- foreach $header (@signheaders) {
- if ($$HeaderR{lc($header)} =~ m/^[^\s:]+: (.+?)\n?$/so) {
- $pgphead .= $header.": ".$1."\n";
- }
- }
-
- open(FH, ">" . $Config{'pgptmpf'} . ".txt") or die "$0: E: can't open $Config{'pgptmpf'}: $!\n";
- print FH $pgphead, "\n", $pgpbody;
- print FH "\n" if ($Config{'PGPVersion'} =~ m/GPG/io); # workaround a pgp/gpg incompatibility - should IMHO be fixed in pgpverify
- close(FH) or warn "$0: W: Couldn't close TMP: $!\n";
-
- # Start PGP, then read the signature;
- my $PGPCommand = getpgpcommand($Config{'PGPVersion'});
- `$PGPCommand`;
-
- open (FH, "<" . $Config{'pgptmpf'} . ".txt.asc") or die "$0: E: can't open ".$Config{'pgptmpf'}.".txt.asc: $!\n";
- $/ = "$Config{'pgpbegin'}\n";
- $_ = <FH>;
- unless (m/\Q$Config{'pgpbegin'}\E$/o) {
-# unlink $Config{'pgptmpf'} . ".txt";
-# unlink $Config{'pgptmpf'} . ".txt.asc";
- die "$0: E: $Config{'pgpbegin'} not found in ".$Config{'pgptmpf'}.".txt.asc\n"
- }
- unlink($Config{'pgptmpf'} . ".txt") or warn "$0: W: Couldn't unlink $Config{'pgptmpf'}.txt: $!\n";
-
- $/ = "\n";
- $_ = <FH>;
- unless (m/^Version: (\S+)(?:\s(\S+))?/o) {
- unlink $Config{'pgptmpf'} . ".txt";
- unlink $Config{'pgptmpf'} . ".txt.asc";
- die "$0: E: didn't find PGP Version line where expected.\n";
- }
-
- if (defined($2)) {
- $$HeaderR{$Config{'pgpheader'}} = $1."-".$2." ".$signheaders;
- } else {
- $$HeaderR{$Config{'pgpheader'}} = $1." ".$signheaders;
- }
-
- do { # skip other pgp headers like
- $_ = <FH>; # "charset:"||"comment:" until empty line
- } while ! /^$/;
-
- while (<FH>) {
- chomp;
- last if /^\Q$Config{'pgpend'}\E$/;
- $$HeaderR{$Config{'pgpheader'}} .= "\n\t$_";
- }
-
- $$HeaderR{$Config{'pgpheader'}} .= "\n" unless ($$HeaderR{$Config{'pgpheader'}} =~ /\n$/s);
-
- $_ = <FH>;
- unless (eof(FH)) {
- unlink $Config{'pgptmpf'} . ".txt";
- unlink $Config{'pgptmpf'} . ".txt.asc";
- die "$0: E: unexpected data following $Config{'pgpend'}\n";
- }
- close(FH);
- unlink "$Config{'pgptmpf'}.txt.asc";
-
- my $tmppgpheader = $Config{'pgpheader'} . ": " . $$HeaderR{$Config{'pgpheader'}};
- delete $$HeaderR{$Config{'pgpheader'}};
-
- @pgphead = ();
- foreach $header (@PGPorderheaders) {
- if ($$HeaderR{$header} && $$HeaderR{$header} ne "\n") {
- push(@pgphead, "$$HeaderR{$header}");
- delete $$HeaderR{$header};
- }
- }
-
- foreach $header (keys %$HeaderR) {
- if ($$HeaderR{$header} && $$HeaderR{$header} ne "\n") {
- push(@pgphead, "$$HeaderR{$header}");
- delete $$HeaderR{$header};
- }
- }
-
- push @pgphead, ("X-PGP-Key: " . $Config{'PGPSigner'} . "\n"), $tmppgpheader;
- undef $tmppgpheader;
-
- @pgpbody = split /$/m, $pgpbody;
- my @pgpmessage = (@pgphead, "\n", @pgpbody);
- return \@pgpmessage;
-}
-