zmalltalker-oauth 0.3.1.7

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.
Files changed (80) hide show
  1. data/History.txt +61 -0
  2. data/License.txt +20 -0
  3. data/Manifest.txt +79 -0
  4. data/README.rdoc +71 -0
  5. data/Rakefile +36 -0
  6. data/TODO +30 -0
  7. data/bin/oauth +5 -0
  8. data/examples/yql.rb +44 -0
  9. data/lib/oauth.rb +5 -0
  10. data/lib/oauth/cli.rb +231 -0
  11. data/lib/oauth/client.rb +4 -0
  12. data/lib/oauth/client/action_controller_request.rb +53 -0
  13. data/lib/oauth/client/helper.rb +71 -0
  14. data/lib/oauth/client/net_http.rb +80 -0
  15. data/lib/oauth/consumer.rb +253 -0
  16. data/lib/oauth/helper.rb +55 -0
  17. data/lib/oauth/oauth.rb +7 -0
  18. data/lib/oauth/oauth_test_helper.rb +25 -0
  19. data/lib/oauth/request_proxy.rb +24 -0
  20. data/lib/oauth/request_proxy/action_controller_request.rb +63 -0
  21. data/lib/oauth/request_proxy/base.rb +157 -0
  22. data/lib/oauth/request_proxy/jabber_request.rb +41 -0
  23. data/lib/oauth/request_proxy/mock_request.rb +44 -0
  24. data/lib/oauth/request_proxy/net_http.rb +65 -0
  25. data/lib/oauth/request_proxy/rack_request.rb +40 -0
  26. data/lib/oauth/server.rb +66 -0
  27. data/lib/oauth/signature.rb +28 -0
  28. data/lib/oauth/signature/base.rb +91 -0
  29. data/lib/oauth/signature/hmac/base.rb +16 -0
  30. data/lib/oauth/signature/hmac/md5.rb +9 -0
  31. data/lib/oauth/signature/hmac/rmd160.rb +9 -0
  32. data/lib/oauth/signature/hmac/sha1.rb +10 -0
  33. data/lib/oauth/signature/hmac/sha2.rb +9 -0
  34. data/lib/oauth/signature/md5.rb +13 -0
  35. data/lib/oauth/signature/plaintext.rb +23 -0
  36. data/lib/oauth/signature/rsa/sha1.rb +45 -0
  37. data/lib/oauth/signature/sha1.rb +13 -0
  38. data/lib/oauth/token.rb +7 -0
  39. data/lib/oauth/tokens/access_token.rb +68 -0
  40. data/lib/oauth/tokens/consumer_token.rb +32 -0
  41. data/lib/oauth/tokens/request_token.rb +28 -0
  42. data/lib/oauth/tokens/server_token.rb +9 -0
  43. data/lib/oauth/tokens/token.rb +17 -0
  44. data/lib/oauth/version.rb +3 -0
  45. data/oauth.gemspec +49 -0
  46. data/script/destroy +14 -0
  47. data/script/generate +14 -0
  48. data/script/txt2html +74 -0
  49. data/setup.rb +1585 -0
  50. data/tasks/deployment.rake +34 -0
  51. data/tasks/environment.rake +7 -0
  52. data/tasks/website.rake +17 -0
  53. data/test/cases/oauth_case.rb +19 -0
  54. data/test/cases/spec/1_0-final/test_construct_request_url.rb +62 -0
  55. data/test/cases/spec/1_0-final/test_normalize_request_parameters.rb +88 -0
  56. data/test/cases/spec/1_0-final/test_parameter_encodings.rb +86 -0
  57. data/test/cases/spec/1_0-final/test_signature_base_strings.rb +77 -0
  58. data/test/keys/rsa.cert +11 -0
  59. data/test/keys/rsa.pem +16 -0
  60. data/test/test_access_token.rb +28 -0
  61. data/test/test_action_controller_request_proxy.rb +45 -0
  62. data/test/test_consumer.rb +331 -0
  63. data/test/test_helper.rb +19 -0
  64. data/test/test_hmac_sha1.rb +21 -0
  65. data/test/test_net_http_client.rb +174 -0
  66. data/test/test_net_http_request_proxy.rb +38 -0
  67. data/test/test_rack_request_proxy.rb +40 -0
  68. data/test/test_request_token.rb +53 -0
  69. data/test/test_rsa_sha1.rb +59 -0
  70. data/test/test_server.rb +40 -0
  71. data/test/test_signature.rb +11 -0
  72. data/test/test_signature_base.rb +32 -0
  73. data/test/test_signature_plain_text.rb +31 -0
  74. data/test/test_token.rb +14 -0
  75. data/website/index.html +87 -0
  76. data/website/index.txt +73 -0
  77. data/website/javascripts/rounded_corners_lite.inc.js +285 -0
  78. data/website/stylesheets/screen.css +138 -0
  79. data/website/template.rhtml +48 -0
  80. metadata +209 -0
@@ -0,0 +1,40 @@
1
+ require 'oauth/request_proxy/base'
2
+ require 'uri'
3
+ require 'rack'
4
+
5
+ module OAuth::RequestProxy
6
+ class RackRequest < OAuth::RequestProxy::Base
7
+ proxies Rack::Request
8
+
9
+ def method
10
+ request.request_method
11
+ end
12
+
13
+ def uri
14
+ request.url
15
+ end
16
+
17
+ def parameters
18
+ if options[:clobber_request]
19
+ options[:parameters] || {}
20
+ else
21
+ params = request_params.merge(query_params).merge(header_params)
22
+ params.merge(options[:parameters] || {})
23
+ end
24
+ end
25
+
26
+ def signature
27
+ parameters['oauth_signature']
28
+ end
29
+
30
+ protected
31
+
32
+ def query_params
33
+ request.GET
34
+ end
35
+
36
+ def request_params
37
+ request.params
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,66 @@
1
+ require 'oauth/helper'
2
+ require 'oauth/consumer'
3
+
4
+ module OAuth
5
+ # This is mainly used to create consumer credentials and can pretty much be ignored if you want to create your own
6
+ class Server
7
+ include OAuth::Helper
8
+ attr_accessor :base_url
9
+
10
+ @@server_paths = {
11
+ :request_token_path => "/oauth/request_token",
12
+ :authorize_path => "/oauth/authorize",
13
+ :access_token_path => "/oauth/access_token"
14
+ }
15
+
16
+ # Create a new server instance
17
+ def initialize(base_url, paths = {})
18
+ @base_url = base_url
19
+ @paths = @@server_paths.merge(paths)
20
+ end
21
+
22
+ def generate_credentials
23
+ [generate_key(16), generate_key]
24
+ end
25
+
26
+ def generate_consumer_credentials(params = {})
27
+ Consumer.new(*generate_credentials)
28
+ end
29
+
30
+ # mainly for testing purposes
31
+ def create_consumer
32
+ creds = generate_credentials
33
+ Consumer.new(creds[0], creds[1],
34
+ {
35
+ :site => base_url,
36
+ :request_token_path => request_token_path,
37
+ :authorize_path => authorize_path,
38
+ :access_token_path => access_token_path
39
+ })
40
+ end
41
+
42
+ def request_token_path
43
+ @paths[:request_token_path]
44
+ end
45
+
46
+ def request_token_url
47
+ base_url + request_token_path
48
+ end
49
+
50
+ def authorize_path
51
+ @paths[:authorize_path]
52
+ end
53
+
54
+ def authorize_url
55
+ base_url + authorize_path
56
+ end
57
+
58
+ def access_token_path
59
+ @paths[:access_token_path]
60
+ end
61
+
62
+ def access_token_url
63
+ base_url + access_token_path
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,28 @@
1
+ module OAuth
2
+ module Signature
3
+ def self.available_methods
4
+ @available_methods ||= {}
5
+ end
6
+
7
+ def self.build(request, options = {}, &block)
8
+ request = OAuth::RequestProxy.proxy(request, options)
9
+ klass = available_methods[(request.signature_method || "").downcase]
10
+ raise UnknownSignatureMethod, request.signature_method unless klass
11
+ klass.new(request, options, &block)
12
+ end
13
+
14
+ def self.sign(request, options = {}, &block)
15
+ self.build(request, options, &block).signature
16
+ end
17
+
18
+ def self.verify(request, options = {}, &block)
19
+ self.build(request, options, &block).verify
20
+ end
21
+
22
+ def self.signature_base_string(request, options = {}, &block)
23
+ self.build(request, options, &block).signature_base_string
24
+ end
25
+
26
+ class UnknownSignatureMethod < Exception; end
27
+ end
28
+ end
@@ -0,0 +1,91 @@
1
+ require 'oauth/signature'
2
+ require 'oauth/helper'
3
+ require 'oauth/request_proxy/base'
4
+ require 'base64'
5
+
6
+ module OAuth::Signature
7
+ class Base
8
+ include OAuth::Helper
9
+
10
+ attr_accessor :options
11
+ attr_reader :token_secret, :consumer_secret, :request
12
+
13
+ def self.implements(signature_method)
14
+ OAuth::Signature.available_methods[signature_method] = self
15
+ end
16
+
17
+ def self.digest_class(digest_class = nil)
18
+ return @digest_class if digest_class.nil?
19
+ @digest_class = digest_class
20
+ end
21
+
22
+ def initialize(request, options = {}, &block)
23
+ raise TypeError unless request.kind_of?(OAuth::RequestProxy::Base)
24
+ @request = request
25
+ @options = options
26
+
27
+ ## consumer secret was determined beforehand
28
+
29
+ @consumer_secret = options[:consumer].secret if options[:consumer]
30
+
31
+ # presence of :consumer_secret option will override any Consumer that's provided
32
+ @consumer_secret = options[:consumer_secret] if options[:consumer_secret]
33
+
34
+ ## token secret was determined beforehand
35
+
36
+ @token_secret = options[:token].secret if options[:token]
37
+
38
+ # presence of :token_secret option will override any Token that's provided
39
+ @token_secret = options[:token_secret] if options[:token_secret]
40
+
41
+
42
+ # override secrets based on the values returned from the block (if any)
43
+ if block_given?
44
+ # consumer secret and token secret need to be looked up based on pieces of the request
45
+ secrets = yield block.arity == 1 ? request : [token, consumer_key, nonce, request.timestamp]
46
+ if secrets.is_a?(Array) && secrets.size == 2
47
+ @token_secret = secrets[0]
48
+ @consumer_secret = secrets[1]
49
+ end
50
+ end
51
+ end
52
+
53
+ def signature
54
+ Base64.encode64(digest).chomp.gsub(/\n/,'')
55
+ end
56
+
57
+ def ==(cmp_signature)
58
+ Base64.decode64(signature) == Base64.decode64(cmp_signature)
59
+ end
60
+
61
+ def verify
62
+ self == self.request.signature
63
+ end
64
+
65
+ def signature_base_string
66
+ request.signature_base_string
67
+ end
68
+
69
+ private
70
+
71
+ def token
72
+ request.token
73
+ end
74
+
75
+ def consumer_key
76
+ request.consumer_key
77
+ end
78
+
79
+ def nonce
80
+ request.nonce
81
+ end
82
+
83
+ def secret
84
+ "#{escape(consumer_secret)}&#{escape(token_secret)}"
85
+ end
86
+
87
+ def digest
88
+ self.class.digest_class.digest(signature_base_string)
89
+ end
90
+ end
91
+ end
@@ -0,0 +1,16 @@
1
+ require 'oauth/signature/base'
2
+
3
+ module OAuth::Signature::HMAC
4
+ class Base < OAuth::Signature::Base
5
+
6
+ private
7
+
8
+ def digest
9
+ if RUBY_VERSION > '1.9'
10
+ Digest::HMAC.new(secret, self.class.digest_class).digest(signature_base_string)
11
+ else
12
+ self.class.digest_class.digest(secret, signature_base_string)
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,9 @@
1
+ require 'oauth/signature/hmac/base'
2
+ require 'hmac-md5'
3
+
4
+ module OAuth::Signature::HMAC
5
+ class MD5 < Base
6
+ implements 'hmac-md5'
7
+ digest_class RUBY_VERSION > '1.9' ? Digest::MD5 : ::HMAC::MD5
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ require 'oauth/signature/hmac/base'
2
+ require 'hmac-rmd160'
3
+
4
+ module OAuth::Signature::HMAC
5
+ class RMD160 < Base
6
+ implements 'hmac-rmd160'
7
+ digest_class RUBY_VERSION > '1.9' ? Digest::RMD160 : ::HMAC::RMD160
8
+ end
9
+ end
@@ -0,0 +1,10 @@
1
+ require 'oauth/signature/hmac/base'
2
+ require 'rubygems'
3
+ require 'hmac-sha1'
4
+
5
+ module OAuth::Signature::HMAC
6
+ class SHA1 < Base
7
+ implements 'hmac-sha1'
8
+ digest_class RUBY_VERSION > '1.9' ? Digest::SHA1 : ::HMAC::SHA1
9
+ end
10
+ end
@@ -0,0 +1,9 @@
1
+ require 'oauth/signature/hmac/base'
2
+ require 'hmac-sha2'
3
+
4
+ module OAuth::Signature::HMAC
5
+ class SHA2 < Base
6
+ implements 'hmac-sha2'
7
+ digest_class RUBY_VERSION > '1.9' ? Digest::SHA2 : ::HMAC::SHA2
8
+ end
9
+ end
@@ -0,0 +1,13 @@
1
+ require 'oauth/signature/base'
2
+ require 'digest/md5'
3
+
4
+ module OAuth::Signature
5
+ class MD5 < Base
6
+ implements 'md5'
7
+ digest_class Digest::MD5
8
+
9
+ def signature_base_string
10
+ secret + super
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,23 @@
1
+ require 'oauth/signature/base'
2
+
3
+ module OAuth::Signature
4
+ class PLAINTEXT < Base
5
+ implements 'plaintext'
6
+
7
+ def signature
8
+ signature_base_string
9
+ end
10
+
11
+ def ==(cmp_signature)
12
+ signature == escape(cmp_signature)
13
+ end
14
+
15
+ def signature_base_string
16
+ secret
17
+ end
18
+
19
+ def secret
20
+ escape(super)
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,45 @@
1
+ require 'oauth/signature/base'
2
+ require 'openssl'
3
+
4
+ module OAuth::Signature::RSA
5
+ class SHA1 < OAuth::Signature::Base
6
+ implements 'rsa-sha1'
7
+
8
+ def ==(cmp_signature)
9
+ public_key.verify(OpenSSL::Digest::SHA1.new, Base64.decode64(cmp_signature.is_a?(Array) ? cmp_signature.first : cmp_signature), signature_base_string)
10
+ end
11
+
12
+ def public_key
13
+ if consumer_secret.is_a?(String)
14
+ decode_public_key
15
+ elsif consumer_secret.is_a?(OpenSSL::X509::Certificate)
16
+ consumer_secret.public_key
17
+ else
18
+ consumer_secret
19
+ end
20
+ end
21
+
22
+ private
23
+
24
+ def decode_public_key
25
+ case consumer_secret
26
+ when /-----BEGIN CERTIFICATE-----/
27
+ OpenSSL::X509::Certificate.new( consumer_secret).public_key
28
+ else
29
+ OpenSSL::PKey::RSA.new( consumer_secret)
30
+ end
31
+ end
32
+
33
+ def digest
34
+ private_key = OpenSSL::PKey::RSA.new(
35
+ if options[:private_key_file]
36
+ IO.read(options[:private_key_file])
37
+ else
38
+ consumer_secret
39
+ end
40
+ )
41
+
42
+ private_key.sign(OpenSSL::Digest::SHA1.new, signature_base_string)
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,13 @@
1
+ require 'oauth/signature/base'
2
+ require 'digest/sha1'
3
+
4
+ module OAuth::Signature
5
+ class SHA1 < Base
6
+ implements 'sha1'
7
+ digest_class Digest::SHA1
8
+
9
+ def signature_base_string
10
+ secret + super
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,7 @@
1
+ # this exists for backwards-compatibility
2
+
3
+ require 'oauth/tokens/token'
4
+ require 'oauth/tokens/server_token'
5
+ require 'oauth/tokens/consumer_token'
6
+ require 'oauth/tokens/request_token'
7
+ require 'oauth/tokens/access_token'
@@ -0,0 +1,68 @@
1
+ module OAuth
2
+ # The Access Token is used for the actual "real" web service calls that you perform against the server
3
+ class AccessToken < ConsumerToken
4
+ # The less intrusive way. Otherwise, if we are to do it correctly inside consumer,
5
+ # we need to restructure and touch more methods: request(), sign!(), etc.
6
+ def request(http_method, path, *arguments)
7
+ request_uri = URI.parse(path)
8
+ site_uri = consumer.uri
9
+ is_service_uri_different = (request_uri.absolute? && request_uri != site_uri)
10
+ consumer.uri(request_uri) if is_service_uri_different
11
+ @response = super(http_method, path, *arguments)
12
+ # NOTE: reset for wholesomeness? meaning that we admit only AccessToken service calls may use different URIs?
13
+ # so reset in case consumer is still used for other token-management tasks subsequently?
14
+ consumer.uri(site_uri) if is_service_uri_different
15
+ @response
16
+ end
17
+
18
+ # Make a regular GET request using AccessToken
19
+ #
20
+ # @response = @token.get('/people')
21
+ # @response = @token.get('/people', { 'Accept'=>'application/xml' })
22
+ #
23
+ def get(path, headers = {})
24
+ request(:get, path, headers)
25
+ end
26
+
27
+ # Make a regular HEAD request using AccessToken
28
+ #
29
+ # @response = @token.head('/people')
30
+ #
31
+ def head(path, headers = {})
32
+ request(:head, path, headers)
33
+ end
34
+
35
+ # Make a regular POST request using AccessToken
36
+ #
37
+ # @response = @token.post('/people')
38
+ # @response = @token.post('/people', { :name => 'Bob', :email => 'bob@mailinator.com' })
39
+ # @response = @token.post('/people', { :name => 'Bob', :email => 'bob@mailinator.com' }, { 'Accept' => 'application/xml' })
40
+ # @response = @token.post('/people', nil, {'Accept' => 'application/xml' })
41
+ # @response = @token.post('/people', @person.to_xml, { 'Accept'=>'application/xml', 'Content-Type' => 'application/xml' })
42
+ #
43
+ def post(path, body = '', headers = {})
44
+ request(:post, path, body, headers)
45
+ end
46
+
47
+ # Make a regular PUT request using AccessToken
48
+ #
49
+ # @response = @token.put('/people/123')
50
+ # @response = @token.put('/people/123', { :name => 'Bob', :email => 'bob@mailinator.com' })
51
+ # @response = @token.put('/people/123', { :name => 'Bob', :email => 'bob@mailinator.com' }, { 'Accept' => 'application/xml' })
52
+ # @response = @token.put('/people/123', nil, { 'Accept' => 'application/xml' })
53
+ # @response = @token.put('/people/123', @person.to_xml, { 'Accept' => 'application/xml', 'Content-Type' => 'application/xml' })
54
+ #
55
+ def put(path, body = '', headers = {})
56
+ request(:put, path, body, headers)
57
+ end
58
+
59
+ # Make a regular DELETE request using AccessToken
60
+ #
61
+ # @response = @token.delete('/people/123')
62
+ # @response = @token.delete('/people/123', { 'Accept' => 'application/xml' })
63
+ #
64
+ def delete(path, headers = {})
65
+ request(:delete, path, headers)
66
+ end
67
+ end
68
+ end