All pastes #728921 Raw Edit

2fedd

public text v1 · immutable
·published 2007-10-07 14:22 UTC
rendered paste body
#!/usr/bin/perl -w                                                                                                                                                                                                
use File::Copy;                                                                                                                                                                                                   
use POSIX qw(strftime);                                                                                                                                                                                           
use Sys::Syslog qw(:DEFAULT setlogsock);                                                                                                                                                                          
                                                                                                                                                                                                                  
#$ENV{PGPPATH}='/root/.gnupg/';                                                                                                                                                                                   
$ENV{GNUPGHOME}='/usr/local/rshb/.gnupg';                                                                                                                                                                         
                                                                                                                                                                                                                  
%keyIDhomes=    (                                                                                                                                                                                                 
                '<pgp-fo@lyubino.rshb.com.ru>' => '/usr/local/rshb/fo/in/0901/',       
                );                                                                                                                                                                                                
                                                                                                                                                                                                                  
setlogsock 'unix';                                                                                                                                                                                                
openlog 'all.in.one', 'ndelay,pid,nowait', 'local3';                                                                                                                                                              
                                                                                                                                                                                                                  
syslog('debug', "Начало работы");                                                                                                                                                                                 
                                                                                                                                                                                                                  
&parse_header() || return 0;                                                                                                                                                                                      
                                                                                                                                                                                                                  
# syslog LOG_INFO, "%s", "Почта от $USERADDR";                                                                                                                                                                    
                                                                                                                                                                                                                  
#if ( defined $SUBJECT ) { $filename="$USERADDR_$SUBJECT" }                                                                                                                                                       
#else {                                                                                                                                                                                                           
#       $nowis= strftime "%Y-%m-%d %H-%M-%S", localtime;                                                                                                                                                          
#       $filename="$nowis $$"                                                                                                                                                                                     
#};                                                                                                                                                                                                               
$filename = "$SUBJECT";                                                                                                                                                                                           
$cryptedfile = "$SUBJECT.pgp";                                                                                                                                                                                    
                                                                                                                                                                                                                  
syslog('debug', "Получен файл от $USERADDR - $filename");                                                                                                                                                         
                                                                                                                                                                                                                  
chdir '/usr/local/rshb/fo/temp' or safe_die("Не могу перейти в каталог /usr/local/rshb/fo/temp");                                                                                                                 
open  TEMPFILE, ">$cryptedfile" or safe_die("Не могу открыть файл $cryptedfile для записи вложения в него. Ошибка $!");                                                                                           
print TEMPFILE <>;                                                                                                                                                                                                
close TEMPFILE;                                                                                                                                                                                                   
                                                                                                                                                                                                                  
syslog('debug', "Приступаю к расшифровке файла $cryptedfile");                                                                                                                                                    
                                                                                                                                                                                                                  
#$pgpres=`/usr/local/bin/pgp +batchmode -z Charlie $cryptedfile -o $filename`;                                                                                                                                    
#$pgpres=`/usr/local/bin/pgp -z Charlie $cryptedfile -o $filename`;                                                                                                                                               
$pgpres=`/usr/local/bin/gpg --outputfile $filename --decrypt $cryptedfile`;                                                                                                                                       
                                                                                                                                                                                                                  
if ( $? == 0 )                                                                                                                                                                                                    
{                                                                                                                                                                                                                 
    syslog('debug', "Расшифровывание завершилось удачно");                                                                                                                                                        
    `rm -f $cryptedfile`;                                                                                                                                                                                         
    if ( $pgpres =~ /Good\ signature\ from\ user\ \"(.*)\"\./m ) {                                                                                                                                                
        $keyID=$1;                                                                                                                                                                                                
        syslog('debug', "Найден ключ $keyID");                                                                                                                                                                    
        if ( exists $keyIDhomes{$keyID} ) {                                                                                                                                                                       
        $now_string = strftime "%Y-%m-%d %H-%M-%S ", localtime;                                                                                                                                                   
            chmod 0666, "$filename"  or safe_die("!!! Не могу изменить права доступа на файл $filename");                                                                                                         
            $archfilename = "/usr/local/rshb/fo/archive/" . $now_string . $filename;                                                                                                                              
            syslog('debug', "%s", "Имя файла в архиве - $archfilename");                                                                                                                                          
            copy($filename, $archfilename) or safe_die("Не удалось скопировать файл $filename в /usr/local/rshb/fo/archive/$now_string" . '_' . "$filename - ошибка: $!");                                        
            move($filename, "$keyIDhomes{$keyID}$filename") or safe_die("Расшифрованный файл не удалось переместить в каталог пользователя ($keyIDhomes{$keyID}) - ошибка $!");                                   
            if ($USERADDR =~ /bolsher/)                                                                                                                                                                           
            {                                                                                                                                                                                                     
              open MP, "| /usr/bin/mail -s 'Квитанция: $filename' oper\@bolsher.rshb.com.ru";                                                                                                                     
              print MP "Транспортной системой успешно принят файл $filename\n";                                                                                                                                   
              close MP;                                                                                                                                                                                           
            }                                                                                                                                                                                                     
        } 
        else {                                                                                                                                                                                                    
            safe_die("Для ключа $keyID не определён каталог")                                                                                                                                                     
        }                                                                                                                                                                                                         
    }                                                                                                                                                                                                             
    else {                                                                                                                                                                                                        
        safe_die("Странная ситуация: PGP завершила работу удачно, но KeyID найти не удалось - возможно шифрование сторонним ключом\n$pgpres\n")                                                                   
    }                                                                                                                                                                                                             
}                                                                                                                                                                                                                 
else                                                                                                                                                                                                              
{                                                                                                                                                                                                                 
    syslog('debug', "%s %d", "!!! Не расшифровывается $cryptedfile", length($cryptedfile));                                                                                                                       
    syslog('debug', $pgpres);                                                                                                                                                                                     
}                                                                                                                                                                                                                 
                                                                                                                                                                                                                  
syslog('debug', "Работа закончена");                                                                                                                                                                              
closelog;                                                                                                                                                                                                         
                                                                                                                                                                                                                  
sub parse_addr                                                                                                                                                                                                    
{                                                                                                                                                                                                                 
    local($line)=@_;                                                                                                                                                                                              
    return $1 if ($line=~/^[^<]*<(\S+@\S+)>/o);                                                                                                                                                                   
    return $1 if ($line=~/^(\S+@\S+)/o);                                                                                                                                                                          
}                                                                                                                                                                                                                 
                                                                                                                                                                                                                  
sub parse_header                                                                                                                                                                                                  
{                                                                                                                                                                                                                 
    undef $REPLYTO;                                                                                                                                                                                               
    undef $USERADDR;                                                                                                                                                                                              
    undef $SUBJECT;                                                                                                                                                                                               
    while(<>)                                                                                                                                                                                                     
    {                                                                                                                                                                                                             
        last if (/^\s*$/o);                                                                                                                                                                                       
        next unless (($headline,$value)=/([^:]+):\s*(.*)\s*$/o);                                                                                                                                                  
                                                                                                                                                                                                                  
        $SUBJECT=$value if ($headline=~/^Subject$/io);                                                                                                                                                            
        $USERADDR=&parse_addr($value) if ($headline=~/^From$/io);                                                                                                                                                 
        $REPLYTO=&parse_addr($value) if ($headline=~/^Reply-To$/io);                                                                                                                                              
    }                                                                                                                                                                                                             
    return 0 unless (defined($USERADDR) && defined($SUBJECT));                                                                                                                                                    
#    ($USERNAME,$USERHOST)=split("@",$USERADDR);                                                                                                                                                                  
    return 1;                                                                                                                                                                                                     
}                                                                                                                                                                                                                 
                                                                                                                                                                                                                  
sub safe_die {                                                                                                                                                                                                    
        my $reason = shift;                                                                                                                                                                                       
        syslog LOG_INFO, "!!! %s", $reason;                                                                                                                                                                       
        closelog;                                                                                                                                                                                                 
        die $reason                                                                                                                                                                                               
}