
sub register_tests {
    my $self = shift;
    $self->register_test( "test_nosig_nopolicy",      3 );
    $self->register_test( "test_nosig_policy",        3 );
    $self->register_test( "test_mail_body_altered",   3 );
    $self->register_test( "test_mail_header_altered", 3 );
    $self->register_test( "test_good_mail",           3 );
    $self->register_test( "test_bad_from",            3 );
    $self->register_test( "test_partial_nosig",       3 );
    $self->register_test( "test_partial_sig",         3 );
    $self->register_test( "test_sig_nokey",           3 );
}


sub load_mail
{
  my ($transaction, @data) = @_;
  my $in_header = 1;
  my $header = new Mail::Header;
  $header->extract( \@data );
  $transaction->header( $header );
  $transaction->body_write( "\r\n" );
  foreach my $line (@data)
  {
    $transaction->body_write( $line );
  }
}


sub test_nosig_nopolicy
{
  my $self = shift;
  my @data = (
             "From: me\@nobody.messiah.edu\r\n",
             "To: you\@nobody.messiah.edu\r\n",
             "Subject: Test nosig nokey\r\n",
             "\r\n",
             "Since we have no sig and no policy this should be accepted.\r\n",
             );
  my $transaction = $self->{transaction} = new Qpsmtpd::Transaction;
  load_mail( $transaction, @data );
  my $header = $transaction->header;
  is( $header->get( "From" ), "me\@nobody.messiah.edu\r\n", "Check From: Header" );
  is( $header->get( "To" ), "you\@nobody.messiah.edu\r\n", "Check To: Header" );
  my ($ret, $note) = $self->hook_data_post( $transaction );
  is( $ret, DECLINED, "Check we got a DECLINED - $note" );
}


sub test_nosig_policy
{
  my $self = shift;
  my @data = (
             "From: me\@summersoft.fay.ar.us\r\n",
             "To: you\@summersoft.fay.ar.us\r\n",
             "Subject: Test nosig key\r\n",
             "\r\n",
             "Since we have no sig but do have a policy, this mail should\r\n",
             "be rejected.",,
             );
  my $transaction = $self->{transaction} = new Qpsmtpd::Transaction;
  load_mail( $transaction, @data );
  my $header = $transaction->header;
  is( $header->get( "From" ), "me\@summersoft.fay.ar.us\r\n", "Check From: Header" );
  is( $header->get( "To" ), "you\@summersoft.fay.ar.us\r\n", "Check To: Header" );
  my ($ret, $note) = $self->hook_data_post( $transaction );
  is( $ret, DENY, "Check we got a DENY - $note" );
}


sub test_mail_body_altered
{
  my $self = shift;
  my @data = (
    "From dsummers\@aegistg.com Wed Apr 23 16:50:50 2008 -0500\r\n",
    "Return-Path: <david\@summersoft.fay.ar.us>\r\n",
    "Delivered-To: dsummers\@digital-realms.com\r\n",
    "Received: (qmail 20027 invoked by uid 104); 23 Apr 2008 21:50:49 -0000\r\n",
    "Received-SPF: pass (wormhole.digital-realms.com: domain of david\@summersoft.fay.ar.us designates 24.248.212.140 as permitted sender)\r\n",
    "Received: from summersoft.fay.ar.us (HELO summersoft.fay.ar.us) (24.248.212.140)\r\n",
    "    by wormhole.digital-realms.com (qpsmtpd/0.40) with (AES256-SHA encrypted) ESMTPS; Wed, 23 Apr 2008 16:50:49 -0500\r\n",
    "DKIM-Signature: v=1; a=rsa-sha256; c=simple; d=summersoft.fay.ar.us; h=\r\n",
    "	date:from:to:subject:message-id:mime-version:content-type; q=\r\n",
    "	dns/txt; s=beta; bh=QxMVW4F1rEvEtGDuCdWJ/gU04U0FMyZk2n2olKVJ0eM=; b=\r\n",
    "	PdHydb6ITcEg0LCkZblahNbxyRXhN93YbUJEZeiQRP6+VRu+IfN+JWgnxIXyWVe3\r\n",
    "	biKoTH0s+7vlWxLOlzT86EmrhF3sxw9aVYv0LTrG+zz86PGN26EinX3rTJzr+2c3\r\n",
    "	R6jO1UwSkZ1nj7fqVawKSL7Z1cHyLjfUbrmoFjAJFrk=\r\n",
    "Received: (qmail 16235 invoked by uid 500); 23 Apr 2008 21:50:46 -0000\r\n",
    "Received: from localhost (sendmail-bs\@127.0.0.1)\r\n",
    "  by localhost with SMTP; 23 Apr 2008 21:50:46 -0000\r\n",
    "Received-SPF: pass (localhost: domain of david\@summersoft.fay.ar.us designates 127.0.0.1 as permitted sender) receiver=localhost; client_ip=127.0.0.1; envelope-from=david\@summersoft.fay.ar.us;\r\n",
    "Date: Wed, 23 Apr 2008 16:50:46 -0500 (CDT)\r\n",
    "From: David Summers <david\@summersoft.fay.ar.us>\r\n",
    "To: dsummers\@digital-realms.com\r\n",
    "Subject: Test Altered\r\n",
    "Message-ID: <Pine.LNX.4.64.0804231650030.13314\@summersoft.fay.ar.us>\r\n",
    "MIME-Version: 1.0\r\n",
    "Content-Type: TEXT/PLAIN; charset=US-ASCII; format=flowed\r\n",
    "\r\n",
    "Here is the alteration.\r\n",
    "Since this mail was altered, it should be denied.\r\n",
    "\r\n",
             );

  my $transaction = $self->{transaction} = new Qpsmtpd::Transaction;
  load_mail( $transaction, @data );
  my $header = $transaction->header;
  is( $header->get( "From" ), "David Summers <david\@summersoft.fay.ar.us>\r\n", "Check From: Header" );
  is( $header->get( "To" ), "dsummers\@digital-realms.com\r\n", "Check To: Header" );
  my ($ret, $note) = $self->hook_data_post( $transaction );
  is( $ret, DENY, "Mail has been altered, check we got a DENY - $note" );
}


sub test_mail_header_altered
{
  my $self = shift;
  my @data = (
    "From dsummers\@aegistg.com Wed Apr 23 16:50:50 2008 -0500\r\n",
    "Return-Path: <david\@summersoft.fay.ar.us>\r\n",
    "Delivered-To: dsummers\@digital-realms.com\r\n",
    "Received: (qmail 20027 invoked by uid 104); 23 Apr 2008 21:50:49 -0000\r\n",
    "Received-SPF: pass (wormhole.digital-realms.com: domain of david\@summersoft.fay.ar.us designates 24.248.212.140 as permitted sender)\r\n",
    "Received: from summersoft.fay.ar.us (HELO summersoft.fay.ar.us) (24.248.212.140)\r\n",
    "    by wormhole.digital-realms.com (qpsmtpd/0.40) with (AES256-SHA encrypted) ESMTPS; Wed, 23 Apr 2008 16:50:49 -0500\r\n",
    "DKIM-Signature: v=1; a=rsa-sha256; c=simple; d=summersoft.fay.ar.us; h=\r\n",
    "	date:from:to:subject:message-id:mime-version:content-type; q=\r\n",
    "	dns/txt; s=beta; bh=QxMVW4F1rEvEtGDuCdWJ/gU04U0FMyZk2n2olKVJ0eM=; b=\r\n",
    "	PdHydb6ITcEg0LCkZblahNbxyRXhN93YbUJEZeiQRP6+VRu+IfN+JWgnxIXyWVe3\r\n",
    "	biKoTH0s+7vlWxLOlzT86EmrhF3sxw9aVYv0LTrG+zz86PGN26EinX3rTJzr+2c3\r\n",
    "	R6jO1UwSkZ1nj7fqVawKSL7Z1cHyLjfUbrmoFjAJFrk=\r\n",
    "Received: (qmail 16235 invoked by uid 500); 23 Apr 2008 21:50:46 -0000\r\n",
    "Received: from localhost (sendmail-bs\@127.0.0.1)\r\n",
    "  by localhost with SMTP; 23 Apr 2008 21:50:46 -0000\r\n",
    "Received-SPF: pass (localhost: domain of david\@summersoft.fay.ar.us designates 127.0.0.1 as permitted sender) receiver=localhost; client_ip=127.0.0.1; envelope-from=david\@summersoft.fay.ar.us;\r\n",
    "Date: Wed, 23 Apr 2008 16:50:46 -0500 (CDT)\r\n",
    "From: David Altered Summers <david\@summersoft.fay.ar.us>\r\n",
    "To: dsummers\@digital-realms.com\r\n",
    "Subject: Test Altered\r\n",
    "Message-ID: <Pine.LNX.4.64.0804231650030.13314\@summersoft.fay.ar.us>\r\n",
    "MIME-Version: 1.0\r\n",
    "Content-Type: TEXT/PLAIN; charset=US-ASCII; format=flowed\r\n",
    "\r\n",
    "\r\n",
    "Since this mail was altered, it should be denied.\r\n",
    "\r\n",
             );

  my $transaction = $self->{transaction} = new Qpsmtpd::Transaction;
  load_mail( $transaction, @data );
  my $header = $transaction->header;
  is( $header->get( "From" ), "David Altered Summers <david\@summersoft.fay.ar.us>\r\n", "Check From: Header" );
  is( $header->get( "To" ), "dsummers\@digital-realms.com\r\n", "Check To: Header" );
  my ($ret, $note) = $self->hook_data_post( $transaction );
  is( $ret, DENY, "Mail has been altered, check we got a DENY - $note" );
}


sub test_good_mail
{
  my $self = shift;
  my @data = (
    "From dsummers\@aegistg.com Wed Apr 23 16:32:44 2008 -0500\r\n",
    "Return-Path: <david\@summersoft.fay.ar.us>\r\n",
    "Delivered-To: dsummers\@digital-realms.com\r\n",
    "Received: (qmail 19263 invoked by uid 104); 23 Apr 2008 21:32:43 -0000\r\n",
    "Received-SPF: pass (wormhole.digital-realms.com: domain of david\@summersoft.fay.ar.us designates 24.248.212.140 as permitted sender)\r\n",
    "Received: from summersoft.fay.ar.us (HELO summersoft.fay.ar.us) (24.248.212.140)\r\n",
    "    by wormhole.digital-realms.com (qpsmtpd/0.40) with (AES256-SHA encrypted) ESMTPS; Wed, 23 Apr 2008 16:32:43 -0500\r\n",
    "DKIM-Signature: v=1; a=rsa-sha256; c=simple; d=summersoft.fay.ar.us; h=\r\n",
    "	date:from:to:subject:message-id:mime-version:content-type; q=\r\n",
    "	dns/txt; s=beta; bh=0PlX2Uory6PtmwXt1e2e6D6vY23CoD44Prj/xj8kjX8=; b=\r\n",
    "	QHLm8+GeYIP7HmIW6D/YO76sSj1hBOW5vGwmCigPgS6ccEIjhBqw5phJrJ2H4u7k\r\n",
    "	RXjWvdLm3d5VIKVSqOsm11ENJCQMnxVzh5uv10/sKrZMepVMJ8iMw4N4hEjEkYCk\r\n",
    "	JbUVyVDJYTinJk/h7lzZJnMiF30x5zzep25+RAMQP4g=\r\n",
    "Received: (qmail 15778 invoked by uid 500); 23 Apr 2008 21:32:41 -0000\r\n",
    "Received: from localhost (sendmail-bs\@127.0.0.1)\r\n",
    "  by localhost with SMTP; 23 Apr 2008 21:32:41 -0000\r\n",
    "Received-SPF: pass (localhost: domain of david\@summersoft.fay.ar.us designates 127.0.0.1 as permitted sender) receiver=localhost; client_ip=127.0.0.1; envelope-from=david\@summersoft.fay.ar.us;\r\n",
    "Date: Wed, 23 Apr 2008 16:32:41 -0500 (CDT)\r\n",
    "From: David Summers <david\@summersoft.fay.ar.us>\r\n",
    "To: dsummers\@digital-realms.com\r\n",
    "Subject: Test sig policy\r\n",
    "Message-ID: <Pine.LNX.4.64.0804231631500.13314\@summersoft.fay.ar.us>\r\n",
    "MIME-Version: 1.0\r\n",
    "Content-Type: TEXT/PLAIN; charset=US-ASCII; format=flowed\r\n",
    "\r\n",
    "\r\n",
    "Since we have a signature and a policy, this mail should be accepted.\r\n",
    "\r\n",
    "\r\n",
             );

  my $transaction = $self->{transaction} = new Qpsmtpd::Transaction;
  load_mail( $transaction, @data );
  my $header = $transaction->header;
  is( $header->get( "From" ), "David Summers <david\@summersoft.fay.ar.us>\r\n", "Check From: Header" );
  is( $header->get( "To" ), "dsummers\@digital-realms.com\r\n", "Check To: Header" );
  my ($ret, $note) = $self->hook_data_post( $transaction );
  is( $ret, DECLINED, "Good Mail, check we got a DECLINED - $note" );
}


sub test_bad_from
{
  my $self = shift;
  my @data = (
             "From: me\@\r\n",
             "To: you\@\r\n",
             "Subject: Test nosig nokey\r\n",
             "\r\n",
             "Since we have no sig and no policy this should be accepted.\r\n",
             );
  my $transaction = $self->{transaction} = new Qpsmtpd::Transaction;
  load_mail( $transaction, @data );
  my $header = $transaction->header;
  is( $header->get( "From" ), "me\@\r\n", "Check From: Header" );
  is( $header->get( "To" ), "you\@\r\n", "Check To: Header" );
  my ($ret, $note) = ( DECLINED, "Test Died" );
  eval {  $self->hook_data_post( $transaction ); };
  is( $ret, DECLINED, "Check we got a DECLINED - $note" );
}


sub test_partial_nosig
{
  my $self = shift;
  my @data = (
    "From dsummers\@aegistg.com Wed Apr 23 16:32:44 2008 -0500\r\n",
    "Return-Path: <david\@summersoft.fay.ar.us>\r\n",
    "Delivered-To: dsummers\@digital-realms.com\r\n",
    "Received: (qmail 19263 invoked by uid 104); 23 Apr 2008 21:32:43 -0000\r\n",
    "Received-SPF: pass (wormhole.digital-realms.com: domain of david\@summersoft.fay.ar.us designates 24.248.212.140 as permitted sender)\r\n",
    "Received: from summersoft.fay.ar.us (HELO summersoft.fay.ar.us) (24.248.212.140)\r\n",
    "    by wormhole.digital-realms.com (qpsmtpd/0.40) with (AES256-SHA encrypted) ESMTPS; Wed, 23 Apr 2008 16:32:43 -0500\r\n",
    "Received: (qmail 15778 invoked by uid 500); 23 Apr 2008 21:32:41 -0000\r\n",
    "Received: from localhost (sendmail-bs\@127.0.0.1)\r\n",
    "  by localhost with SMTP; 23 Apr 2008 21:32:41 -0000\r\n",
    "Received-SPF: pass (localhost: domain of david\@summersoft.fay.ar.us designates 127.0.0.1 as permitted sender) receiver=localhost; client_ip=127.0.0.1; envelope-from=david\@summersoft.fay.ar.us;\r\n",
    "Date: Wed, 23 Apr 2008 16:32:41 -0500 (CDT)\r\n",
    "From: David Summers <david\@testpartial.summersoft.fay.ar.us>\r\n",
    "To: dsummers\@digital-realms.com\r\n",
    "Subject: Test parial policy with no sig\r\n",
    "Message-ID: <Pine.LNX.4.64.0804231631500.13314\@summersoft.fay.ar.us>\r\n",
    "MIME-Version: 1.0\r\n",
    "Content-Type: TEXT/PLAIN; charset=US-ASCII; format=flowed\r\n",
    "\r\n",
    "\r\n",
    "Since we have a partial policy and no signature, this mail should be accepted.\r\n",
    "\r\n",
    "\r\n",
             );

  my $transaction = $self->{transaction} = new Qpsmtpd::Transaction;
  load_mail( $transaction, @data );
  my $header = $transaction->header;
  is( $header->get( "From" ), "David Summers <david\@testpartial.summersoft.fay.ar.us>\r\n", "Check From: Header" );
  is( $header->get( "To" ), "dsummers\@digital-realms.com\r\n", "Check To: Header" );
  my ($ret, $note) = $self->hook_data_post( $transaction );
  is( $ret, DECLINED, "Partial policy with no sig, check we got a DECLINED - $note" );
}


sub test_partial_sig
{
  my $self = shift;
  my @data = (
    "DKIM-Signature: v=1; a=rsa-sha256; c=simple; d=\r\n",
    "	testpartial.summersoft.fay.ar.us; h=from:to:subject; s=beta; bh=\r\n",
    "	xGtolWUIvLUDO4EGGIa8z4WHbjXwUDu34pcjy6RC/Q4=; b=ZI7oILAFK8EdIdiU\r\n",
    "	hzDNAbwGtsinNmE2gDWC4RjWMJC2kE/nbpOI7Ej++CG+fJ3I6xS9Ep3daqtzJUS6\r\n",
    "	WjZkoBWDL7Wls4+TtcBZ4HlZ/IgGVfUZwU4U1QNHXtGGig5vHSeMva51hbiCuPES\r\n",
    "	vY0EYncebSiLXqX/CC9/LDoWJ9M=\r\n",
    "From: david\@testpartial.summersoft.fay.ar.us\r\n",
    "To: dsummers\@digital-realms.com\r\n",
    "Subject: Test partial with sig\r\n",
    "\r\n",
    "Since we have a partial policy with a good sig, this mail should be accepted.\r\n",
    "\r\n",
    "\r\n",
             );

  my $transaction = $self->{transaction} = new Qpsmtpd::Transaction;
  load_mail( $transaction, @data );
  my $header = $transaction->header;
  is( $header->get( "From" ), "david\@testpartial.summersoft.fay.ar.us\r\n", "Check From: Header" );
  is( $header->get( "To" ), "dsummers\@digital-realms.com\r\n", "Check To: Header" );
  my ($ret, $note) = $self->hook_data_post( $transaction );
  is( $ret, DECLINED, "Partial policy with no sig, check we got a DECLINED - $note" );
}


sub test_sig_nokey
{
  my $self = shift;
  my @data = (
    "From: me\@testnosig.summersoft.fay.ar.us\r\n",
    "To: you\@testnosig.summersoft.fay.ar.us\r\n",
    "DKIM-Signature: v=1; a=rsa-sha256; c=simple; d=\r\n",
    "	testnosig.summersoft.fay.ar.us; h=from:to:subject; s=beta; bh=\r\n",
    "	xGtolWUIvLUDO4EGGIa8z4WHbjXwUDu34pcjy6RC/Q4=; b=ZI7oILAFK8EdIdiU\r\n",
    "	hzDNAbwGtsinNmE2gDWC4RjWMJC2kE/nbpOI7Ej++CG+fJ3I6xS9Ep3daqtzJUS6\r\n",
    "	WjZkoBWDL7Wls4+TtcBZ4HlZ/IgGVfUZwU4U1QNHXtGGig5vHSeMva51hbiCuPES\r\n",
    "	vY0EYncebSiLXqX/CC9/LDoWJ9M=\r\n",
    "Subject: Test sig nokey\r\n",
    "\r\n",
    "Since we have a sig but no key and no policy this should be accepted.\r\n",
             );
  my $transaction = $self->{transaction} = new Qpsmtpd::Transaction;
  load_mail( $transaction, @data );
  my $header = $transaction->header;
  is( $header->get( "From" ), "me\@testnosig.summersoft.fay.ar.us\r\n", "Check From: Header" );
  is( $header->get( "To" ), "you\@testnosig.summersoft.fay.ar.us\r\n", "Check To: Header" );
  my ($ret, $note) = $self->hook_data_post( $transaction );
  is( $ret, DECLINED, "Check we got a DECLINED - $note" );
}
