stas        2004/08/08 14:30:07

  Added:       t/api    access2.t
               t/response/TestAPI access2.pm
  Log:
  extensive $r->requires tests
  
  Revision  Changes    Path
  1.1                  modperl-2.0/t/api/access2.t
  
  Index: access2.t
  ===================================================================
  use strict;
  use warnings FATAL => 'all';
  
  use Apache::Test;
  use Apache::TestUtil;
  use Apache::TestRequest;
  
  plan tests => 6, need need_lwp, need_auth;
  
  my $location = "/TestAPI__access2";
  
  ok !GET_OK $location;
  
  my $rc = GET_RC $location;
  ok t_cmp $rc, 401, "no credentials passed";
  
  # bad user
  ok !GET_OK $location, username => 'root', password => '1234';
  
  # good user/bad pass
  ok !GET_OK $location, username => 'goo', password => 'foo';
  
  # good user/good pass
  ok GET_OK $location, username => 'goo', password => 'goopass';
  
  # any user/any pass POST works
  ok POST_OK $location, username => 'bar', password => 'goopass1',
      content => "a";
  
  
  
  
  
  1.1                  modperl-2.0/t/response/TestAPI/access2.pm
  
  Index: access2.pm
  ===================================================================
  package TestAPI::access2;
  
  # testing $r->requires
  # in the POST test it returns:
  #
  #  [
  #    {
  #      'method_mask' => -1,
  #      'requirement' => 'user goo bar'
  #    },
  #    {
  #      'method_mask' => -1,
  #      'requirement' => 'group bar tar'
  #    }
  #    {
  #      'method_mask' => 4,
  #      'requirement' => 'valid-user'
  #    }
  #  ];
  #
  # otherwise it returns the same, sans the 'valid-user' entry
  #
  
  use strict;
  use warnings FATAL => 'all';
  
  use Apache::Access ();
  
  use Apache::TestTrace;
  
  use Apache::Const -compile => qw(OK HTTP_UNAUTHORIZED SERVER_ERROR
                                   M_POST);
  
  my $users  = "goo bar";
  my $groups = "bar tar";
  my %users = (
      goo => "goopass",
      bar => "barpass",
  );
  
  sub handler {
      my $r = shift;
  
      my($rc, $sent_pw) = $r->get_basic_auth_pw;
      return $rc if $rc != Apache::OK;
  
      # extract just the requirement entries
      my %require = 
          map { my($k, $v) = split /\s+/, $_->{requirement}, 2; ($k, $v||'') }
          @{ $r->requires };
      debug \%require;
  
      # silly (we don't check user/pass here), just checking when
      # the Limit options are getting through
      if ($r->method_number == Apache::M_POST) {
          if (exists $require{"valid-user"}) {
              return Apache::OK;
          }
          else {
              return Apache::SERVER_ERROR;
          }
      }
      else {
          # non-POST requests shouldn't see the Limit enclosed entry
          return Apache::SERVER_ERROR if exists $require{"valid-user"};
      }
  
      return Apache::SERVER_ERROR unless $require{user}  eq $users;
      return Apache::SERVER_ERROR unless $require{group} eq $groups;
  
      my $user = $r->user;
      my $pass = $users{$user} || '';
      unless (defined $pass and $sent_pw eq $pass) {
          $r->note_basic_auth_failure;
          return Apache::HTTP_UNAUTHORIZED;
      }
  
      Apache::OK;
  }
  
  1;
  __DATA__
  <NoAutoConfig>
  <Location /TestAPI__access2>
      PerlAuthenHandler TestAPI::access2
      PerlResponseHandler Apache::TestHandler::ok1
      SetHandler modperl
  
      AuthType Basic
      AuthName "Access"
      Require user goo bar
      Require group bar tar
      <Limit POST>
         Require valid-user
      </Limit>
  
      # htpasswd -mbc auth-users goo foo
      # htpasswd -mb auth-users bar mar
      # using md5 password so it'll work on win32 too
      AuthUserFile @DocumentRoot@/api/auth-users
      # group: user1 user2 ...
      AuthGroupFile @DocumentRoot@/api/auth-groups
  </Location>
  </NoAutoConfig>
  
  
  

Reply via email to