httpmail (httpmail.sourceforge.net) needs this patch.  hotmail.com
reauthenticates with the same user/pass but a different uri (going to
passport).  The code in LWP::Authen::Digest assumed a re-auth failure
only if the user/pass matched.  This code adds the uri to the mix.

Rob
----------------------------------------------------------------
Index: Digest.pm
===================================================================
*** Digest.pm   2002/09/04 17:25:21     1.1
--- Digest.pm   2002/10/01 21:33:57     1.2
***************
*** 66,76 ****
      my $auth_header = $proxy ? "Proxy-Authorization" : "Authorization";
      my $auth_value  = "Digest " . join(", ", @pairs);
  
!     # Need to check this isn't a repeated fail!
      my $r = $response;
      while ($r) {
        my $u = $r->request->{digest_user_pass};
!       if ($u && $u->[0] eq $user && $u->[1] eq $pass) {
            # here we know this failed before
            $response->header("Client-Warning" =>
                              "Credentials for '$user' failed before");
--- 66,78 ----
      my $auth_header = $proxy ? "Proxy-Authorization" : "Authorization";
      my $auth_value  = "Digest " . join(", ", @pairs);
  
!     # Need to check this isn't a repeated fail for this [user, pass, uri]
      my $r = $response;
+     my $failed_uri = $r->request->url->as_string;
      while ($r) {
        my $u = $r->request->{digest_user_pass};
!       if ($u && $u->[0] eq $user && $u->[1] eq $pass
!           && $u->[2] eq $failed_uri) {
            # here we know this failed before
            $response->header("Client-Warning" =>
                              "Credentials for '$user' failed before");
***************
*** 82,88 ****
      my $referral = $request->clone;
      $referral->header($auth_header => $auth_value);
      # we shouldn't really do this, but...
!     $referral->{digest_user_pass} = [$user, $pass];
  
      return $ua->request($referral, $arg, $size, $response);
  }
--- 84,90 ----
      my $referral = $request->clone;
      $referral->header($auth_header => $auth_value);
      # we shouldn't really do this, but...
!     $referral->{digest_user_pass} = [$user, $pass, $failed_uri];
  
      return $ua->request($referral, $arg, $size, $response);
  }



Reply via email to