# WEBrick::HTTPAuth::DigestAuth (Class)

In: | webrick/httpauth/digestauth.rb
Parent: | Object

## Methods

authenticate challenge make_passwd new

## Constants

AuthScheme | = | "Digest"
OpaqueInfo | = | Struct.new(:time, :nonce, :nc)
MustParams | = | ['username','realm','nonce','uri','response']
MustParamsAuth | = | ['cnonce','nc']

## Attributes

algorithm | [R] |
qop | [R] |

## Included Modules

Authenticator

## Public Class methods

make_passwd(realm, user, pass)

[Source]

    # File webrick/httpauth/digestauth.rb, line 30
          def self.make_passwd(realm, user, pass)
            pass ||= ""
            Digest::MD5::hexdigest([user, realm, pass].join(":"))
          end

new(config, default=Config::DigestAuth)

[Source]

    # File webrick/httpauth/digestauth.rb, line 35
          def initialize(config, default=Config::DigestAuth)
            check_init(config)
            @config                 = default.dup.update(config)
            @algorithm              = @config[:Algorithm]
            @domain                 = @config[:Domain]
            @qop                    = @config[:Qop]
            @use_opaque             = @config[:UseOpaque]
            @use_next_nonce         = @config[:UseNextNonce]
            @check_nc               = @config[:CheckNc]
            @use_auth_info_header   = @config[:UseAuthenticationInfoHeader]
            @nonce_expire_period    = @config[:NonceExpirePeriod]
            @nonce_expire_delta     = @config[:NonceExpireDelta]
            @internet_explorer_hack = @config[:InternetExplorerHack]
            @opera_hack             = @config[:OperaHack]

            case @algorithm
            when 'MD5','MD5-sess'
              @h = Digest::MD5
            when 'SHA1','SHA1-sess'  # it is a bonus feature :-)

              @h = Digest::SHA1
            else
              msg = format('Alogrithm "%s" is not supported.', @algorithm)
              raise ArgumentError.new(msg)
            end

            @instance_key = hexdigest(self.__id__, Time.now.to_i, Process.pid)
            @opaques = {}
            @last_nonce_expire = Time.now
            @mutex = Mutex.new
          end

## Public Instance methods

authenticate(req, res)

[Source]

    # File webrick/httpauth/digestauth.rb, line 66
          def authenticate(req, res)
            unless result = @mutex.synchronize{ _authenticate(req, res) }
              challenge(req, res)
            end
            if result == :nonce_is_stale
              challenge(req, res, true)
            end
            return true
          end

challenge(req, res, stale=false)

[Source]

    # File webrick/httpauth/digestauth.rb, line 76
          def challenge(req, res, stale=false)
            nonce = generate_next_nonce(req)
            if @use_opaque
              opaque = generate_opaque(req)
              @opaques[opaque].nonce = nonce
            end

            param = Hash.new
            param["realm"]  = HTTPUtils::quote(@realm)
            param["domain"] = HTTPUtils::quote(@domain.to_a.join(" ")) if @domain
            param["nonce"]  = HTTPUtils::quote(nonce)
            param["opaque"] = HTTPUtils::quote(opaque) if opaque
            param["stale"]  = stale.to_s
            param["algorithm"] = @algorithm
            param["qop"]    = HTTPUtils::quote(@qop.to_a.join(",")) if @qop

            res[@response_field] =
              "#{@auth_scheme} " + param.map{|k,v| "#{k}=#{v}" }.join(", ")
            info("%s: %s", @response_field, res[@response_field]) if $DEBUG
            raise @auth_exception
          end

[Validate]