[interchange-cvs] interchange - ramoore modified code/Filter/decrypt.filter

interchange-core@icdevgroup.org interchange-core@icdevgroup.org
Sat Apr 5 00:46:01 2003


User:      ramoore
Date:      2003-04-05 05:45:11 GMT
Added:     code/Filter decrypt.filter
Log:
Add new decrypt filter to compliment encrypt filter.

       Decrypts the value against the standard GPG/PGP key
           using the standard EncryptProgram.

                  [filter op=decrypt] String [/filter]

       You can decrypt against other keys by passing the ID as an argument:

                  [filter op=decrypt.23883AEE]
                        String, to decrypt against different key.
                  [/filter]

       You can even specify a different EncryptProgram decrypt by passing an ID
	    and the program to use as arguments:

                  [filter op=decrypt.23883AEE.pgp]
                        String, to decrypt against different key using pgp
			rather than the default
                  [/filter]

Revision  Changes    Path
1.1                  interchange/code/Filter/decrypt.filter


rev 1.1, prev_rev 1.0
Index: decrypt.filter
===================================================================
CodeDef decrypt Filter
CodeDef decrypt Routine <<EOR
sub {
	my ($body, $tag, $key, $cmd) = @_;
#::logDebug("called filter decrypt key=$key cmd=$cmd");

        $cmd = $Vend::Cfg->{EncryptProgram} unless $cmd;
        $key = $Vend::Cfg->{EncryptKey}     unless $key;

        if("\L$cmd" eq 'none') {
                return ::errmsg("NEED ENCRYPTION ENABLED.");
        }
        elsif($cmd =~ m{^(?:/\S+/)?\bgpg$}) {
                $cmd .= " -q --batch --always-trust -d  -r '%s'";
        }
        elsif($cmd =~ m{^(?:/\S+/)?pgpe$}) {
                $cmd .= " -fat -r '%s'";
        }
        elsif($cmd =~ m{^(?:/\S+/)?\bpgp$}) {
                $cmd .= " -fat - '%s'";
        }

        if($cmd =~ /[;|]/) {
                die ::errmsg("Illegal character in encryption command: %s", $cmd);
        }

        if($key) {
                $cmd =~ s/%%/:~PERCENT~:/g;
                $key =~ s/'/\\'/g;
                $cmd =~ s/%s/$key/g;
                $cmd =~ s/:~PERCENT~:/%/g;
        }

#::logDebug("filter decrypt after key=$key cmd=$cmd");

	my $fpre = $Vend::Cfg->{ScratchDir} . "/pgp.$Vend::Session->{id}.$$";

        open(ENC, "> $fpre.in");
        print ENC $body;
        close(ENC);

        $cmd .= "<$fpre.in";
        $cmd .= " 2>$fpre.err" unless $cmd =~ /2>/;
        open(PGP, "$cmd |")
                        or die "Couldn't fork: $!";
        my @results = <PGP>;
        close PGP;

        if($?) {
                my $errno = $?;
                my $status = $errno;
                if($status > 255) {
                        $status = $status >> 8;
                        $! = $status;
                }
                logError("PGP failed with error level %s, status %s: $!", $?, $status);
                if($status) {
                        logError("PGP hard failure, command that failed: %s", $cmd);
                        return;
                } 
        }
        $body = join "\n", @results;
        unlink "$fpre.in";
        unlink "$fpre.err";
        return $body;
}
EOR