stas        2004/08/08 10:56:53

  Added:       t/hooks  authen_digest.t
               t/hooks/TestHooks authen_digest.pm
  Log:
  digest auth test
  
  Revision  Changes    Path
  1.1                  modperl-2.0/t/hooks/authen_digest.t
  
  Index: authen_digest.t
  ===================================================================
  use strict;
  use warnings FATAL => 'all';
  
  use Apache::Test;
  use Apache::TestRequest;
  
  plan tests => 4, need need_lwp, need_auth, need_module('Digest::MD5');
  
  my $location = "/TestHooks__authen_digest";
  
  sok {
      ! GET_OK $location;
  };
  
  sok {
      my $rc = GET_RC $location;
      $rc == 401;
  };
  
  sok {
      GET_OK $location, username => 'Joe', password => 'Smith';
  };
  
  sok {
      ! GET_OK $location, username => 'Joe', password => 'SMITH';
  };
  
  
  
  
  1.1                  modperl-2.0/t/hooks/TestHooks/authen_digest.pm
  
  Index: authen_digest.pm
  ===================================================================
  package TestHooks::authen_digest;
  
  use strict;
  use warnings FATAL => 'all';
  
  use Apache::Access ();
  use Apache::RequestRec ();
  use APR::Table ();
  
  use Digest::MD5 ();
  
  use Apache::Const -compile => qw(OK HTTP_UNAUTHORIZED);
  
  # a simple database
  my %passwd = (Joe => "Smith");
  
  sub handler {
      my $r = shift;
  
      my($rc, $res) = get_digest_auth_data($r);
      return $rc if $rc != Apache::OK;
  
      my $passwd = $passwd{ $res->{username} } || '';
      my $digest = calc_digest($res, $passwd, $r->method);
  
      unless ($digest eq $res->{response}) {
          $r->note_digest_auth_failure;
          return Apache::HTTP_UNAUTHORIZED;
      }
  
      return Apache::OK;
  }
  
  sub get_digest_auth_data {
      my($r) = @_;
  
      # adopted from the modperl cookbook example
  
      my $auth_header = $r->headers_in->get('Authorization') || '';
      unless ($auth_header =~ m/^Digest/) {
          $r->note_digest_auth_failure;
          return Apache::HTTP_UNAUTHORIZED;
      }
  
      # Parse the response header into a hash.
      $auth_header =~ s/^Digest\s+//;
      $auth_header =~ s/"//g;
  
      my %res = map { split /=/, $_ } split /,\s*/, $auth_header;
  
      # Make sure that the response contained all the right info.
      for my $key (qw(username realm nonce uri response)) {
          next if $res{$key};
          $r->note_digest_auth_failure;
          return Apache::HTTP_UNAUTHORIZED;
      }
  
      return (Apache::OK, \%res);
  }
  
  sub calc_digest {
      my($res, $passwd, $method) = @_;
  
      # adopted from LWP/Authen/Digest.pm
  
      my $md5 = Digest::MD5->new;
  
      my(@digest);
      $md5->add(join ":", $res->{username}, $res->{realm}, $passwd);
      push @digest, $md5->hexdigest;
      $md5->reset;
  
      push @digest, $res->{nonce};
  
      $md5->add(join ":", $method, $res->{uri});
      push @digest, $md5->hexdigest;
      $md5->reset;
  
      $md5->add(join ":", @digest);
      my $digest = $md5->hexdigest;
      $md5->reset;
  
      return $digest;
  }
  
  1;
  __DATA__
  <NoAutoConfig>
  <Location /TestHooks__authen_digest>
      require valid-user
      AuthType Digest
      AuthName "Simple Digest"
      PerlAuthenHandler TestHooks::authen_digest
      PerlResponseHandler Apache::TestHandler::ok1
      SetHandler modperl
  </Location>
  </NoAutoConfig>
  
  
  

Reply via email to