validator/httpd/cgi-bin check,1.305.2.144,1.305.2.145

Update of /sources/public/validator/httpd/cgi-bin
In directory hutz:/tmp/cvs-serv27848

Modified Files:
      Tag: validator-0_6_0-branch
	check 
Log Message:
Add support for multiple WWW-Authenticate headers.  This is largely untested,
but the usual cases still work for me as they did before the change.
Hopefully fixes bug 805.


Index: check
===================================================================
RCS file: /sources/public/validator/httpd/cgi-bin/check,v
retrieving revision 1.305.2.144
retrieving revision 1.305.2.145
diff -u -d -r1.305.2.144 -r1.305.2.145
--- check	20 Jun 2004 16:48:38 -0000	1.305.2.144
+++ check	20 Jun 2004 19:33:45 -0000	1.305.2.145
@@ -47,6 +47,7 @@
 use File::Spec           qw();
 use HTML::Parser    3.25 qw(); # Need 3.25 for $p->ignore_elements.
 use HTTP::Request        qw();
+use HTTP::Headers::Auth  qw(); # Needs to be imported after other HTTP::*.
 use IO::File             qw();
 use LWP::UserAgent  1.90 qw(); # Need 1.90 for protocols_(allowed|forbidden)
 use Net::hostent         qw(gethostbyname);
@@ -1203,20 +1204,30 @@
 
 #
 # Proxy authentication requests.
+# Note: expects the third argument to be a hash ref (see HTTP::Headers::Auth).
 sub authenticate {
   my $File       = shift;
   my $resource   = shift;
-  my $authHeader = shift;
+  my $authHeader = shift || {};
+
   my $realm = $resource;
   $realm =~ s([^\w\d.-]*){}g;
-  $authHeader =~ s( realm=([\'\"])?([^\1]+)\1){ realm="$realm-$2"};
   $resource = &ent($resource);
 
-    print <<"EOF";
+  for my $scheme (keys(%$authHeader)) {
+    my $origrealm = $authHeader->{$scheme}->{realm};
+    next unless defined($origrealm);
+    $authHeader->{$scheme}->{realm} = "$realm-$origrealm";
+  }
+
+  my $headers = HTTP::Headers->new(Connection => 'close');
+  $headers->content_type('text/html; charset=utf-8');
+  $headers->www_authenticate(%$authHeader);
+  $headers = $headers->as_string();
+
+  print <<"EOF";
 Status: 401 Authorization Required
-WWW-Authenticate: $authHeader
-Connection: close
-Content-Type: text/html; charset=utf-8
+$headers
 
 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">
@@ -1379,7 +1390,8 @@
 
   unless ($res->code == 200 || $File->{Opt}->{'No200'}) {
     if ($res->code == 401) {
-      &authenticate($File, $res->request->url, $res->www_authenticate);
+      my %auth = $res->www_authenticate(); # HTTP::Headers::Auth
+      &authenticate($File, $res->request->url, \%auth);
     } else {
       print $File->{Results};
       &http_error($uri->as_string, $res->code, $res->message);

Received on Sunday, 20 June 2004 15:33:47 UTC