net-http-digest_auth 1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data.tar.gz.sig ADDED
@@ -0,0 +1,4 @@
1
+ az������"�9vӾ ?����!���9�"1hPs�'�;�0�jrX
2
+ _�h�{
3
+ (2IR��v�n+I2���FH!̯�r�4(�vd�pGR(kRu�D�!��t8J��0�5&�x×�� ~�� @�)v����'�m���ӥ�j�u S�І;yy���)����3�� +P���
4
+ �k9�bu�Ŧ�dW����
data/.autotest ADDED
@@ -0,0 +1,8 @@
1
+ # -*- ruby -*-
2
+
3
+ require 'autotest/restart'
4
+
5
+ Autotest.add_hook :initialize do |at|
6
+ at.testlib = 'minitest/unit'
7
+ end
8
+
data/History.txt ADDED
@@ -0,0 +1,5 @@
1
+ === 1.0 / 2010-09-10
2
+
3
+ * Major enhancements
4
+ * Birthday!
5
+
data/Manifest.txt ADDED
@@ -0,0 +1,7 @@
1
+ .autotest
2
+ History.txt
3
+ Manifest.txt
4
+ README.txt
5
+ Rakefile
6
+ lib/net/http/digest_auth.rb
7
+ test/test_net_http_digest_auth.rb
data/README.txt ADDED
@@ -0,0 +1,49 @@
1
+ = net-http-digest_auth
2
+
3
+ * http://github.com/drbrain/net-http-digest_auth
4
+ * http://seattlerb.rubyforge.org/net-http-digest_auth
5
+ * http://www.rfc-editor.org/rfc/rfc2617.txt
6
+
7
+ == DESCRIPTION:
8
+
9
+ An implementation of RFC 2617 - Digest Access Authentication. At this time
10
+ the gem does not fully integrate with Net::HTTP and can be used for with other
11
+ HTTP clients.
12
+
13
+ == FEATURES/PROBLEMS:
14
+
15
+ * Implements RFC 2617 for digest authentication
16
+ * Does not fully integrate with Net::HTTP
17
+
18
+ == SYNOPSIS:
19
+
20
+ See Net::HTTP::DigestAuth
21
+
22
+ == INSTALL:
23
+
24
+ gem install net-http-digest_auth
25
+
26
+ == LICENSE:
27
+
28
+ (The MIT License)
29
+
30
+ Copyright (c) 2010 Eric Hodel
31
+
32
+ Permission is hereby granted, free of charge, to any person obtaining
33
+ a copy of this software and associated documentation files (the
34
+ 'Software'), to deal in the Software without restriction, including
35
+ without limitation the rights to use, copy, modify, merge, publish,
36
+ distribute, sublicense, and/or sell copies of the Software, and to
37
+ permit persons to whom the Software is furnished to do so, subject to
38
+ the following conditions:
39
+
40
+ The above copyright notice and this permission notice shall be
41
+ included in all copies or substantial portions of the Software.
42
+
43
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
44
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
45
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
46
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
47
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
48
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
49
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/Rakefile ADDED
@@ -0,0 +1,16 @@
1
+ # -*- ruby -*-
2
+
3
+ require 'rubygems'
4
+ require 'hoe'
5
+
6
+ Hoe.spec 'net-http-digest_auth' do
7
+ self.rubyforge_name = 'seattlerb'
8
+ developer 'Eric Hodel', 'drbrain@segment7.net'
9
+
10
+ self.testlib = :minitest
11
+
12
+ spec_extras['homepage'] =
13
+ 'http://seattlerb.rubyforge.org/net-http-digest_auth'
14
+ end
15
+
16
+ # vim: syntax=Ruby
@@ -0,0 +1,116 @@
1
+ require 'net/http'
2
+ require 'digest'
3
+ require 'cgi'
4
+
5
+ ##
6
+ # An implementation of RFC 2617 Digest Access Authentication.
7
+ #
8
+ # http://www.rfc-editor.org/rfc/rfc2617.txt
9
+ #
10
+ # Here is a sample usage of DigestAuth on Net::HTTP:
11
+ #
12
+ # require 'uri'
13
+ # require 'net/http'
14
+ # require 'net/http/digest_auth'
15
+ #
16
+ # uri = URI.parse 'http://localhost:8000/'
17
+ # uri.user = 'username'
18
+ # uri.password = 'password'
19
+ #
20
+ # h = Net::HTTP.new uri.host, uri.port
21
+ #
22
+ # req = Net::HTTP::Get.new uri.request_uri
23
+ #
24
+ # res = h.request req
25
+ #
26
+ # digest_auth = Net::HTTP::DigestAuth.new
27
+ # auth = digest_auth.auth_header uri, res['www-authenticate'], 'GET'
28
+ #
29
+ # req = Net::HTTP::Get.new uri.request_uri
30
+ # req.add_field 'Authorization', auth
31
+ #
32
+ # res = h.request req
33
+
34
+ class Net::HTTP::DigestAuth
35
+
36
+ ##
37
+ # Version of Net::HTTP::DigestAuth you are using
38
+
39
+ VERSION = '1.0'
40
+
41
+ ##
42
+ # Creates a new DigestAuth header creator.
43
+ #
44
+ # +cnonce+ is the client nonce value. This should be an MD5 hexdigest of a
45
+ # secret value.
46
+
47
+ def initialize cnonce = make_cnonce
48
+ @nonce_count = -1
49
+ @cnonce = cnonce
50
+ end
51
+
52
+ ##
53
+ # Creates a digest auth header for +uri+ from the +www_authenticate+ header
54
+ # for HTTP method +method+.
55
+ #
56
+ # The result of this method should be sent along with the HTTP request as
57
+ # the "Authorization" header. In Net::HTTP this will look like:
58
+ #
59
+ # request.add_field 'Authorization', digest_auth.auth_header # ...
60
+ #
61
+ # See Net::HTTP::DigestAuth for a complete example.
62
+ #
63
+ # IIS servers handle the "qop" parameter of digest authentication
64
+ # differently so you may need to set +iis+ to true for such servers.
65
+
66
+ def auth_header uri, www_authenticate, method, iis = false
67
+ @nonce_count += 1
68
+
69
+ user = CGI.unescape uri.user
70
+ password = CGI.unescape uri.password
71
+
72
+ www_authenticate =~ /^(\w+) (.*)/
73
+
74
+ params = {}
75
+ $2.gsub(/(\w+)="(.*?)"/) { params[$1] = $2 }
76
+
77
+ a_1 = Digest::MD5.hexdigest "#{user}:#{params['realm']}:#{password}"
78
+ a_2 = Digest::MD5.hexdigest "#{method}:#{uri.request_uri}"
79
+
80
+ request_digest = [
81
+ a_1,
82
+ params['nonce'],
83
+ ('%08x' % @nonce_count),
84
+ @cnonce,
85
+ params['qop'],
86
+ a_2
87
+ ].join ':'
88
+
89
+ header = [
90
+ "Digest username=\"#{user}\"",
91
+ "realm=\"#{params['realm']}\"",
92
+ if iis then
93
+ "qop=\"#{params['qop']}\""
94
+ else
95
+ "qop=#{params['qop']}"
96
+ end,
97
+ "uri=\"#{uri.request_uri}\"",
98
+ "nonce=\"#{params['nonce']}\"",
99
+ "nc=#{'%08x' % @nonce_count}",
100
+ "cnonce=\"#{@cnonce}\"",
101
+ "response=\"#{Digest::MD5.hexdigest request_digest}\""
102
+ ]
103
+
104
+ header.join ', '
105
+ end
106
+
107
+ ##
108
+ # Creates a client nonce value that is used across all requests based on the
109
+ # current time.
110
+
111
+ def make_cnonce
112
+ Digest::MD5.hexdigest "%x" % (Time.now.to_i + rand(65535))
113
+ end
114
+
115
+ end
116
+
@@ -0,0 +1,72 @@
1
+ require 'minitest/autorun'
2
+ require 'net/http/digest_auth'
3
+
4
+ class TestNetHttpDigestAuth < MiniTest::Unit::TestCase
5
+
6
+ def setup
7
+ @uri = URI.parse "http://www.example.com/"
8
+ @uri.user = 'user'
9
+ @uri.password = 'password'
10
+
11
+ @cnonce = '9ea5ff3bd34554a4165bbdc1df91dcff'
12
+
13
+ @header = [
14
+ 'Digest qop="auth"',
15
+ 'realm="www.example.com"',
16
+ 'nonce="4107baa081a592a6021660200000cd6c5686ff5f579324402b374d83e2c9"'
17
+ ].join ', '
18
+
19
+ @da = Net::HTTP::DigestAuth.new @cnonce
20
+ end
21
+
22
+ def test_auth_header
23
+ expected = [
24
+ 'Digest username="user"',
25
+ 'realm="www.example.com"',
26
+ 'qop=auth',
27
+ 'uri="/"',
28
+ 'nonce="4107baa081a592a6021660200000cd6c5686ff5f579324402b374d83e2c9"',
29
+ 'nc=00000000',
30
+ 'cnonce="9ea5ff3bd34554a4165bbdc1df91dcff"',
31
+ 'response="67be92a5e7b38d08679957db04f5da04"'
32
+ ].join ', '
33
+
34
+ assert_equal expected, @da.auth_header(@uri, @header, 'GET')
35
+ end
36
+
37
+ def test_auth_header_iis
38
+ expected = [
39
+ 'Digest username="user"',
40
+ 'realm="www.example.com"',
41
+ 'qop="auth"',
42
+ 'uri="/"',
43
+ 'nonce="4107baa081a592a6021660200000cd6c5686ff5f579324402b374d83e2c9"',
44
+ 'nc=00000000',
45
+ 'cnonce="9ea5ff3bd34554a4165bbdc1df91dcff"',
46
+ 'response="67be92a5e7b38d08679957db04f5da04"'
47
+ ].join ', '
48
+
49
+ assert_equal expected, @da.auth_header(@uri, @header, 'GET', true)
50
+ end
51
+
52
+ def test_auth_header_post
53
+ expected = [
54
+ 'Digest username="user"',
55
+ 'realm="www.example.com"',
56
+ 'qop=auth',
57
+ 'uri="/"',
58
+ 'nonce="4107baa081a592a6021660200000cd6c5686ff5f579324402b374d83e2c9"',
59
+ 'nc=00000000',
60
+ 'cnonce="9ea5ff3bd34554a4165bbdc1df91dcff"',
61
+ 'response="d82219e1e5430b136bbae1670fa51d48"'
62
+ ].join ', '
63
+
64
+ assert_equal expected, @da.auth_header(@uri, @header, 'POST')
65
+ end
66
+
67
+ def test_make_cnonce
68
+ assert_match %r%\A[a-f\d]{32}\z%, @da.make_cnonce
69
+ end
70
+
71
+ end
72
+
metadata ADDED
@@ -0,0 +1,131 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: net-http-digest_auth
3
+ version: !ruby/object:Gem::Version
4
+ hash: 15
5
+ prerelease: false
6
+ segments:
7
+ - 1
8
+ - 0
9
+ version: "1.0"
10
+ platform: ruby
11
+ authors:
12
+ - Eric Hodel
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain:
16
+ - |
17
+ -----BEGIN CERTIFICATE-----
18
+ MIIDNjCCAh6gAwIBAgIBADANBgkqhkiG9w0BAQUFADBBMRAwDgYDVQQDDAdkcmJy
19
+ YWluMRgwFgYKCZImiZPyLGQBGRYIc2VnbWVudDcxEzARBgoJkiaJk/IsZAEZFgNu
20
+ ZXQwHhcNMDcxMjIxMDIwNDE0WhcNMDgxMjIwMDIwNDE0WjBBMRAwDgYDVQQDDAdk
21
+ cmJyYWluMRgwFgYKCZImiZPyLGQBGRYIc2VnbWVudDcxEzARBgoJkiaJk/IsZAEZ
22
+ FgNuZXQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCbbgLrGLGIDE76
23
+ LV/cvxdEzCuYuS3oG9PrSZnuDweySUfdp/so0cDq+j8bqy6OzZSw07gdjwFMSd6J
24
+ U5ddZCVywn5nnAQ+Ui7jMW54CYt5/H6f2US6U0hQOjJR6cpfiymgxGdfyTiVcvTm
25
+ Gj/okWrQl0NjYOYBpDi+9PPmaH2RmLJu0dB/NylsDnW5j6yN1BEI8MfJRR+HRKZY
26
+ mUtgzBwF1V4KIZQ8EuL6I/nHVu07i6IkrpAgxpXUfdJQJi0oZAqXurAV3yTxkFwd
27
+ g62YrrW26mDe+pZBzR6bpLE+PmXCzz7UxUq3AE0gPHbiMXie3EFE0oxnsU3lIduh
28
+ sCANiQ8BAgMBAAGjOTA3MAkGA1UdEwQCMAAwCwYDVR0PBAQDAgSwMB0GA1UdDgQW
29
+ BBS5k4Z75VSpdM0AclG2UvzFA/VW5DANBgkqhkiG9w0BAQUFAAOCAQEAHagT4lfX
30
+ kP/hDaiwGct7XPuVGbrOsKRVD59FF5kETBxEc9UQ1clKWngf8JoVuEoKD774dW19
31
+ bU0GOVWO+J6FMmT/Cp7nuFJ79egMf/gy4gfUfQMuvfcr6DvZUPIs9P/TlK59iMYF
32
+ DIOQ3DxdF3rMzztNUCizN4taVscEsjCcgW6WkUJnGdqlu3OHWpQxZBJkBTjPCoc6
33
+ UW6on70SFPmAy/5Cq0OJNGEWBfgD9q7rrs/X8GGwUWqXb85RXnUVi/P8Up75E0ag
34
+ 14jEc90kN+C7oI/AGCBN0j6JnEtYIEJZibjjDJTSMWlUKKkj30kq7hlUC2CepJ4v
35
+ x52qPcexcYZR7w==
36
+ -----END CERTIFICATE-----
37
+
38
+ date: 2010-09-10 00:00:00 -07:00
39
+ default_executable:
40
+ dependencies:
41
+ - !ruby/object:Gem::Dependency
42
+ name: rubyforge
43
+ prerelease: false
44
+ requirement: &id001 !ruby/object:Gem::Requirement
45
+ none: false
46
+ requirements:
47
+ - - ">="
48
+ - !ruby/object:Gem::Version
49
+ hash: 7
50
+ segments:
51
+ - 2
52
+ - 0
53
+ - 4
54
+ version: 2.0.4
55
+ type: :development
56
+ version_requirements: *id001
57
+ - !ruby/object:Gem::Dependency
58
+ name: hoe
59
+ prerelease: false
60
+ requirement: &id002 !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
63
+ - - ">="
64
+ - !ruby/object:Gem::Version
65
+ hash: 21
66
+ segments:
67
+ - 2
68
+ - 6
69
+ - 1
70
+ version: 2.6.1
71
+ type: :development
72
+ version_requirements: *id002
73
+ description: |-
74
+ An implementation of RFC 2617 - Digest Access Authentication. At this time
75
+ the gem does not fully integrate with Net::HTTP and can be used for with other
76
+ HTTP clients.
77
+ email:
78
+ - drbrain@segment7.net
79
+ executables: []
80
+
81
+ extensions: []
82
+
83
+ extra_rdoc_files:
84
+ - History.txt
85
+ - Manifest.txt
86
+ - README.txt
87
+ files:
88
+ - .autotest
89
+ - History.txt
90
+ - Manifest.txt
91
+ - README.txt
92
+ - Rakefile
93
+ - lib/net/http/digest_auth.rb
94
+ - test/test_net_http_digest_auth.rb
95
+ has_rdoc: true
96
+ homepage: http://seattlerb.rubyforge.org/net-http-digest_auth
97
+ licenses: []
98
+
99
+ post_install_message:
100
+ rdoc_options:
101
+ - --main
102
+ - README.txt
103
+ require_paths:
104
+ - lib
105
+ required_ruby_version: !ruby/object:Gem::Requirement
106
+ none: false
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ hash: 3
111
+ segments:
112
+ - 0
113
+ version: "0"
114
+ required_rubygems_version: !ruby/object:Gem::Requirement
115
+ none: false
116
+ requirements:
117
+ - - ">="
118
+ - !ruby/object:Gem::Version
119
+ hash: 3
120
+ segments:
121
+ - 0
122
+ version: "0"
123
+ requirements: []
124
+
125
+ rubyforge_project: seattlerb
126
+ rubygems_version: 1.3.7
127
+ signing_key:
128
+ specification_version: 3
129
+ summary: An implementation of RFC 2617 - Digest Access Authentication
130
+ test_files:
131
+ - test/test_net_http_digest_auth.rb
metadata.gz.sig ADDED
@@ -0,0 +1 @@
1
+ &��a����>�E]F��'�ؕ�A�Z��֗p��%#3�$ײ�����+�(��д~� ��B�_�i�p����]O@Z�h��_�?�~��P�����h���8��6���hڐ~H���s6�~3Ub�