Thread Perl Script PGP Email entschlüsseln und weiterleiten (18 answers)
Opened by Chris at 2017-02-17 21:26

Chris_1
 2017-02-18 15:29
#186123 #186123
User since
2017-02-18
6 Artikel
BenutzerIn
[default_avatar]
Ah habs...THX @GwenDragon Du hast mich darauf gebracht mit deiner Frage.

Procmail startet das Programm mit den Rechten des entsprechenden Mail-Users (also der Empfänger der Mail).
Code: (dl )
cannot chdir to /root from /tmp/msg-1487427712-24006-0: Keine Berechtigung, aborting. at /usr/share/perl5/MIME/Parser/Filer.pm line 715.

Also den User in die sudo Gruppe gepackt und die /etc/sudoers entsprechend angepasst, dass auch Befehle ohne PW Eingabe ausgeführt werden können.
Code: (dl )
%sudo   ALL = NOPASSWD: ALL

Dann noch in die /etc/procmailrc den Programmaufruf um ein sudo erweitert
Code: (dl )
1
2
3
4
    # Example procmailrc rule
:0
* ^To: <username>@<domain>.<tld>
| sudo /home/<username>/bin/decrypt.pl


Der Vollständigkeit halber hier noch das fertige decrypt.pl
Code (perl): (dl )
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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
#!/usr/bin/perl -w

use Mail::GPG;
use MIME::Parser;
use Email::Sender::Simple qw(sendmail);
use Email::Simple;
use Email::Simple::Creator;
use strict;
#no strict 'refs';
my $passphrase = 'XXX';
my @lines;
my $tmpdir = '/tmp';

########
# Main #
########

my $stdin = &stdin();
my $unencrypted_body = &parse_email($stdin);
mail_it( $$unencrypted_body );
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;
}
# ***NEW*** own subroutine for mail sending
sub mail_it {
    my $mailtext = shift;
    my $to      = 'chris@localhost';
    my $from    = 'root@localhost';
    my $subject = 'Test Email from decrypt.pl';

my $email = Email::Simple->create(
  header => [
    To      => $to,
    From    => $from,
    Subject => $subject,
  ],
  body => $mailtext,
);
sendmail($email);
}

Last edited: 2017-02-18 15:40:09 +0100 (CET)

View full thread Perl Script PGP Email entschlüsseln und weiterleiten