Class: WEBrick::HTTPAuth::DigestAuth
- Inherits:
-
Object
- Object
- WEBrick::HTTPAuth::DigestAuth
- Includes:
- Authenticator
- Defined in:
- lib/webrick/httpauth/digestauth.rb
Direct Known Subclasses
Defined Under Namespace
Classes: OpaqueInfo
Constant Summary collapse
- AuthScheme =
"Digest"
- MustParams =
['username','realm','nonce','uri','response']
- MustParamsAuth =
['cnonce','nc']
Constants included from Authenticator
Authenticator::AuthException, Authenticator::RequestField, Authenticator::ResponseField, Authenticator::ResponseInfoField
Instance Attribute Summary collapse
-
#algorithm ⇒ Object
readonly
Returns the value of attribute algorithm.
-
#qop ⇒ Object
readonly
Returns the value of attribute qop.
Attributes included from Authenticator
Class Method Summary collapse
Instance Method Summary collapse
- #authenticate(req, res) ⇒ Object
- #challenge(req, res, stale = false) ⇒ Object
-
#initialize(config, default = Config::DigestAuth) ⇒ DigestAuth
constructor
A new instance of DigestAuth.
Constructor Details
#initialize(config, default = Config::DigestAuth) ⇒ DigestAuth
Returns a new instance of DigestAuth.
34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
# File 'lib/webrick/httpauth/digestauth.rb', line 34 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 |
Instance Attribute Details
#algorithm ⇒ Object (readonly)
Returns the value of attribute algorithm
27 28 29 |
# File 'lib/webrick/httpauth/digestauth.rb', line 27 def algorithm @algorithm end |
#qop ⇒ Object (readonly)
Returns the value of attribute qop
27 28 29 |
# File 'lib/webrick/httpauth/digestauth.rb', line 27 def qop @qop end |
Class Method Details
.make_passwd(realm, user, pass) ⇒ Object
29 30 31 32 |
# File 'lib/webrick/httpauth/digestauth.rb', line 29 def self.make_passwd(realm, user, pass) pass ||= "" Digest::MD5::hexdigest([user, realm, pass].join(":")) end |
Instance Method Details
#authenticate(req, res) ⇒ Object
65 66 67 68 69 70 71 72 73 |
# File 'lib/webrick/httpauth/digestauth.rb', line 65 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) ⇒ Object
75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 |
# File 'lib/webrick/httpauth/digestauth.rb', line 75 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 |