| 1 | #!/usr/bin/perl | 
|---|
| 2 |  | 
|---|
| 3 | use Sendmail::Milter; | 
|---|
| 4 |  | 
|---|
| 5 | my %my_milter_callbacks = ( | 
|---|
| 6 |                            'eom' =>        \&my_eom_callback, | 
|---|
| 7 |                           ); | 
|---|
| 8 |  | 
|---|
| 9 | sub find_uid { | 
|---|
| 10 |   my ($addr, $port) = @_; | 
|---|
| 11 |   my $file; | 
|---|
| 12 |   my $search; | 
|---|
| 13 |   # TODO(quentin): These search strings are probably arch-specific. | 
|---|
| 14 |   if ($addr eq "::1") { | 
|---|
| 15 |     $file = "/proc/net/tcp6"; | 
|---|
| 16 |     $search = sprintf("00000000000000000000000001000000:%04X", $port); | 
|---|
| 17 |   } elsif ($addr eq "127.0.0.1") { | 
|---|
| 18 |     $file = "/proc/net/tcp"; | 
|---|
| 19 |     $search = sprintf("0100007F:%04X", $port); | 
|---|
| 20 |   } else { | 
|---|
| 21 |     return undef; | 
|---|
| 22 |   } | 
|---|
| 23 |   my $fh = IO::File->new($file, "r") or die "Cannot read $file: $!"; | 
|---|
| 24 |   <$fh>;  # Eat header | 
|---|
| 25 |   while (my $line = <$fh>) { | 
|---|
| 26 |     my @parts = split(" ", $line); | 
|---|
| 27 |     if ($parts[1] eq $search) { | 
|---|
| 28 |       return $parts[7]; | 
|---|
| 29 |     } | 
|---|
| 30 |   } | 
|---|
| 31 |   return undef;  # Not found. | 
|---|
| 32 | } | 
|---|
| 33 |  | 
|---|
| 34 | sub my_eom_callback { | 
|---|
| 35 |   my ($ctx) = @_; | 
|---|
| 36 |  | 
|---|
| 37 |   my $queueid = $ctx->getsymval('i'); | 
|---|
| 38 |  | 
|---|
| 39 |   my $addr = $ctx->getsymval('{client_addr}'); | 
|---|
| 40 |   my $port = $ctx->getsymval('{client_port}'); | 
|---|
| 41 |  | 
|---|
| 42 |   my $uid = find_uid($addr, $port); | 
|---|
| 43 |  | 
|---|
| 44 |   printf STDERR "Received message from %s:%s (uid %d) (queue ID %s)\n", $addr, $port, $uid, $queueid; | 
|---|
| 45 |  | 
|---|
| 46 |   return SMFIS_ACCEPT; | 
|---|
| 47 | } | 
|---|
| 48 |  | 
|---|
| 49 | Sendmail::Milter::setconn("local:/var/run/scripts-milter.sock"); | 
|---|
| 50 | Sendmail::Milter::register("scripts", | 
|---|
| 51 |                            \%my_milter_callbacks, SMFI_CURR_ACTS); | 
|---|
| 52 |  | 
|---|
| 53 | Sendmail::Milter::main(); | 
|---|