-
Notifications
You must be signed in to change notification settings - Fork 2
/
decrypt.pl
executable file
·122 lines (87 loc) · 2.33 KB
/
decrypt.pl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#!/usr/bin/perl -w
use Mail::GPG;
use MIME::Parser;
use strict;
my $passphrase = '';
my @lines;
my $tmpdir = '/tmp';
########
# Main #
########
my $stdin = &stdin();
my $unencrypted_body = &parse_email($stdin);
if ($unencrypted_body) {
foreach ($$unencrypted_body) {
chomp $_;
push( @lines, $_ );
print "$_\n"; ## Debugging
}
}
###############
# Subroutines #
###############
sub stdin {
#Process stdin
my $stdin = '';
while(<ARGV>){
$stdin .= $_;
}
if ($stdin eq '') {
die ("Error: stdin appears to have no content.");
}
return $stdin;
}
sub parse_email {
my $stdin = shift @_;
my $decoded_body_sref;
my $entity;
#Create new MIME Parser obj
my $parser = MIME::Parser->new;
#Configure MIME Parser
$parser->decode_bodies(0);
$parser->output_under($tmpdir);
#Parse the email from stdin
eval { $entity = $parser->parse_data($stdin) };
# See Mail::GPG for reasoning
# http://search.cpan.org/~jred/Mail-GPG-1.0.7/lib/Mail/GPG.pm#METHODS_FOR_PARSING,_DECRYPTION_AND_VERIFICATION
if ( $entity->effective_type ne 'multipart/signed' and
$entity->effective_type ne 'multipart/encrypted' ) {
#delete tmp files
$parser->filer->purge;
#enable docode_bodies
$parser->decode_bodies(1);
#Parse the email from stdin
eval { $entity = $parser->parse_data($stdin) };
#decrypt
eval { $decoded_body_sref = &decode($entity) };
if ($@) {
warn ("Error: $@");
}
#delete tmp files
$parser->filer->purge;
}
else {
#decrypt
eval { $decoded_body_sref = &decode($entity) };
if ($@) {
warn ("Error $@");
}
#delete tmp files
$parser->filer->purge;
}
return $decoded_body_sref;
}
sub decode {
my $entity = shift @_;
#Create new Mail GPG obj
my $mg = Mail::GPG->new;
#Decrypt the email from stdin
my ($decrypted_entity, $result) = $mg->decrypt (
entity => $entity,
passphrase => $passphrase
);
#Get a reference to the decoded message body
my $decoded_body_sref = $result->get_gpg_stdout;
return $decoded_body_sref;
}
exit;