Here it is. Made a mistake while sending the last one, and ended up
going only to Jason.

Regards,
Sorin

On 7/5/05, Sorin Pop <[EMAIL PROTECTED]> wrote:
> Hello.
> 
> Here is a function for DK check. It is "work under way" so please
> conmtribute to it if you can.
> 
> For now it adds DK status check to the mail.
> It uses Mail::DomainKey and Email::Simple.
> 
> TODO:
>      remove Email::Simple
>      sign outgoing mail
> 
> Regards,
> Sorin
> 
> 
>
#DomainKey scanner module for qmail-scanner 1.25
#by Sorin Pop <[EMAIL PROTECTED]>

sub domainkey {
  #NOTE: We only check for a DK signature, we don't sign any mail (for now)!
  my ($start_domainkey_time)=[gettimeofday];

  #Only run DK if mail is from a "remote" SMTP client, or QS_DK_LOCAL
  #is defined via tcpserver...
  if (defined($ENV{'RELAYCLIENT'}) && !defined($ENV{'QS_DK_LOCAL'})) {
    &debug("domainkey: don't check as RELAYCLIENT implies this was sent by a local user");
    return;
  }

  use Mail::DomainKeys::Message;
  use Mail::DomainKeys::Policy;
  use Email::Simple;

  my $dk_status = 2;  
  my ($textmail,$newtextmail);

  open(DKIN,"<$scandir/$wmaildir/new/$file_id")||&error_condition("cannot open $scandir/$wmaildir/new/$file_id - $!");
  while (<DKIN>)
    { $textmail.=$_; }
  close(DKIN);

  my $mailx = Email::Simple->new($textmail);
  my @the_body=split(/\n|\r\n|\r/, $mailx->body);
  
  my $mess = load Mail::DomainKeys::Message(
    HeadString => $HEADERS,
    BodyReference => [EMAIL PROTECTED]) or &error_condition("domainkey: unable to parse message");

  # no sender domain means no verification
  if (!($mess->senderdomain)) { $dk_status = 0; }
  
  #Message is signed (Incomming mail for sure)
  if ($mess->signed)
    {
    #If DK is ok, add to the headers DomainKey Verified STATUS
    if ($mess->verify) { if($dk_status!=0) { $dk_status = 1; } }
    else { $dk_status = 0; }
		
    #Check for domain policy
    my $plcy = fetch Mail::DomainKeys::Policy(
	            Protocol => "dns",
	            Domain => $mess->senderdomain);
    
    # domain or key testing: add header and return
    if ($mess->testing or $plcy->testing)   { if($dk_status!=0) { $dk_status = 1; } }
    $mailx->header_set($mess->header->key,$mess->header->value);

    #Add DomainKey status check to headers //Here I should add a check to see if there is a forged DK status allready
    $newtextmail=$mailx->as_string;
    
    #Write the new mail with DK Status
    open(DKOUT,">$scandir/$wmaildir/new/$file_id.dk")||&error_condition("cannot open $scandir/$wmaildir/new/$file_id.dk - $!");
    print DKOUT $newtextmail;
    close DKOUT;
    rename ("$scandir/$wmaildir/new/$file_id.dk","$scandir/$wmaildir/new/$file_id");
    }
  #Outgoing mail from local user
  #elsif(defined($ENV{'RELAYCLIENT'})) {}
  my $stop_domainkey_time=[gettimeofday];
  my $domainkey_time = tv_interval ($start_domainkey_time, $stop_domainkey_time);
  &debug("domainkey: finished scan of dir \"$ENV{'TMPDIR'}\" in $domainkey_time secs");
  }

Reply via email to