| Class | Mechanize::Chain::AuthHeaders |
| In: |
lib/mechanize/chain/auth_headers.rb
|
| Parent: | Object |
| CNONCE | = | Digest::MD5.hexdigest("%x" % (Time.now.to_i + rand(65535))) |
# File lib/mechanize/chain/auth_headers.rb, line 9
9: def initialize(auth_hash, user, password, digest)
10: @auth_hash = auth_hash
11: @user = user
12: @password = password
13: @digest = digest
14: end
# File lib/mechanize/chain/auth_headers.rb, line 37
37: def gen_auth_header(uri, request, auth_header, is_IIS = false)
38: auth_header =~ /^(\w+) (.*)/
39:
40: params = {}
41: $2.gsub(/(\w+)=("[^"]*"|[^,]*)/) {
42: params[$1] = $2.gsub(/^"/, '').gsub(/"$/, '')
43: }
44:
45: @@nonce_count[params['nonce']] += 1
46:
47: a_1 = "#{@user}:#{params['realm']}:#{@password}"
48: a_2 = "#{request.method}:#{uri.path}"
49: request_digest = ''
50: request_digest << Digest::MD5.hexdigest(a_1)
51: request_digest << ':' << params['nonce']
52: request_digest << ':' << ('%08x' % @@nonce_count[params['nonce']])
53: request_digest << ':' << CNONCE
54: request_digest << ':' << params['qop']
55: request_digest << ':' << Digest::MD5.hexdigest(a_2)
56:
57: header = ''
58: header << "Digest username=\"#{@user}\", "
59: if is_IIS then
60: header << "qop=\"#{params['qop']}\", "
61: else
62: header << "qop=#{params['qop']}, "
63: end
64: header << "uri=\"#{uri.path}\", "
65: header << %w{ algorithm opaque nonce realm }.map { |field|
66: next unless params[field]
67: "#{field}=\"#{params[field]}\""
68: }.compact.join(', ')
69:
70: header << ", nc=#{'%08x' % @@nonce_count[params['nonce']]}, "
71: header << "cnonce=\"#{CNONCE}\", "
72: header << "response=\"#{Digest::MD5.hexdigest(request_digest)}\""
73:
74: return header
75: end
# File lib/mechanize/chain/auth_headers.rb, line 16
16: def handle(ctx, params)
17: uri = params[:uri]
18: request = params[:request]
19:
20: if( @auth_hash[uri.host] )
21: case @auth_hash[uri.host]
22: when :basic
23: request.basic_auth(@user, @password)
24: when :iis_digest
25: digest_response = self.gen_auth_header(uri,request, @digest, true)
26: request['Authorization'] = digest_response
27: when :digest
28: if @digest
29: digest_response = self.gen_auth_header(uri,request, @digest)
30: request['Authorization'] = digest_response
31: end
32: end
33: end
34: super
35: end