oauth-ap 0.4.8

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 (91) hide show
  1. checksums.yaml +7 -0
  2. data/.gemtest +0 -0
  3. data/Gemfile +17 -0
  4. data/Gemfile.lock +50 -0
  5. data/HISTORY +173 -0
  6. data/LICENSE +20 -0
  7. data/README.rdoc +75 -0
  8. data/Rakefile +37 -0
  9. data/TODO +32 -0
  10. data/bin/oauth +5 -0
  11. data/examples/yql.rb +44 -0
  12. data/lib/digest/hmac.rb +104 -0
  13. data/lib/oauth.rb +13 -0
  14. data/lib/oauth/cli.rb +378 -0
  15. data/lib/oauth/client.rb +4 -0
  16. data/lib/oauth/client/action_controller_request.rb +65 -0
  17. data/lib/oauth/client/em_http.rb +120 -0
  18. data/lib/oauth/client/helper.rb +91 -0
  19. data/lib/oauth/client/net_http.rb +120 -0
  20. data/lib/oauth/consumer.rb +389 -0
  21. data/lib/oauth/core_ext.rb +31 -0
  22. data/lib/oauth/errors.rb +3 -0
  23. data/lib/oauth/errors/error.rb +4 -0
  24. data/lib/oauth/errors/problem.rb +14 -0
  25. data/lib/oauth/errors/unauthorized.rb +12 -0
  26. data/lib/oauth/helper.rb +109 -0
  27. data/lib/oauth/oauth.rb +13 -0
  28. data/lib/oauth/oauth_test_helper.rb +25 -0
  29. data/lib/oauth/request_proxy.rb +24 -0
  30. data/lib/oauth/request_proxy/action_controller_request.rb +62 -0
  31. data/lib/oauth/request_proxy/base.rb +174 -0
  32. data/lib/oauth/request_proxy/curb_request.rb +55 -0
  33. data/lib/oauth/request_proxy/em_http_request.rb +66 -0
  34. data/lib/oauth/request_proxy/jabber_request.rb +41 -0
  35. data/lib/oauth/request_proxy/mock_request.rb +44 -0
  36. data/lib/oauth/request_proxy/net_http.rb +73 -0
  37. data/lib/oauth/request_proxy/rack_request.rb +44 -0
  38. data/lib/oauth/request_proxy/rest_client_request.rb +67 -0
  39. data/lib/oauth/request_proxy/typhoeus_request.rb +53 -0
  40. data/lib/oauth/server.rb +66 -0
  41. data/lib/oauth/signature.rb +45 -0
  42. data/lib/oauth/signature/base.rb +110 -0
  43. data/lib/oauth/signature/hmac/base.rb +15 -0
  44. data/lib/oauth/signature/hmac/md5.rb +8 -0
  45. data/lib/oauth/signature/hmac/rmd160.rb +8 -0
  46. data/lib/oauth/signature/hmac/sha1.rb +9 -0
  47. data/lib/oauth/signature/hmac/sha2.rb +8 -0
  48. data/lib/oauth/signature/md5.rb +13 -0
  49. data/lib/oauth/signature/plaintext.rb +23 -0
  50. data/lib/oauth/signature/rsa/sha1.rb +46 -0
  51. data/lib/oauth/signature/sha1.rb +13 -0
  52. data/lib/oauth/token.rb +7 -0
  53. data/lib/oauth/tokens/access_token.rb +71 -0
  54. data/lib/oauth/tokens/consumer_token.rb +33 -0
  55. data/lib/oauth/tokens/request_token.rb +32 -0
  56. data/lib/oauth/tokens/server_token.rb +9 -0
  57. data/lib/oauth/tokens/token.rb +17 -0
  58. data/oauth.gemspec +153 -0
  59. data/tasks/deployment.rake +34 -0
  60. data/tasks/environment.rake +7 -0
  61. data/tasks/website.rake +17 -0
  62. data/test/cases/oauth_case.rb +19 -0
  63. data/test/cases/spec/1_0-final/test_construct_request_url.rb +62 -0
  64. data/test/cases/spec/1_0-final/test_normalize_request_parameters.rb +88 -0
  65. data/test/cases/spec/1_0-final/test_parameter_encodings.rb +86 -0
  66. data/test/cases/spec/1_0-final/test_signature_base_strings.rb +77 -0
  67. data/test/integration/consumer_test.rb +307 -0
  68. data/test/keys/rsa.cert +11 -0
  69. data/test/keys/rsa.pem +16 -0
  70. data/test/test_access_token.rb +26 -0
  71. data/test/test_action_controller_request_proxy.rb +133 -0
  72. data/test/test_consumer.rb +220 -0
  73. data/test/test_curb_request_proxy.rb +77 -0
  74. data/test/test_em_http_client.rb +80 -0
  75. data/test/test_em_http_request_proxy.rb +115 -0
  76. data/test/test_helper.rb +28 -0
  77. data/test/test_hmac_sha1.rb +20 -0
  78. data/test/test_net_http_client.rb +292 -0
  79. data/test/test_net_http_request_proxy.rb +72 -0
  80. data/test/test_oauth_helper.rb +94 -0
  81. data/test/test_rack_request_proxy.rb +40 -0
  82. data/test/test_request_token.rb +51 -0
  83. data/test/test_rest_client_request_proxy.rb +88 -0
  84. data/test/test_rsa_sha1.rb +59 -0
  85. data/test/test_server.rb +40 -0
  86. data/test/test_signature.rb +22 -0
  87. data/test/test_signature_base.rb +32 -0
  88. data/test/test_signature_plain_text.rb +31 -0
  89. data/test/test_token.rb +14 -0
  90. data/test/test_typhoeus_request_proxy.rb +80 -0
  91. metadata +268 -0
@@ -0,0 +1,55 @@
1
+ require 'oauth/request_proxy/base'
2
+ require 'curb'
3
+ require 'uri'
4
+ require 'cgi'
5
+
6
+ module OAuth::RequestProxy::Curl
7
+ class Easy < OAuth::RequestProxy::Base
8
+ # Proxy for signing Curl::Easy requests
9
+ # Usage example:
10
+ # oauth_params = {:consumer => oauth_consumer, :token => access_token}
11
+ # req = Curl::Easy.new(uri)
12
+ # oauth_helper = OAuth::Client::Helper.new(req, oauth_params.merge(:request_uri => uri))
13
+ # req.headers.merge!({"Authorization" => oauth_helper.header})
14
+ # req.http_get
15
+ # response = req.body_str
16
+ proxies ::Curl::Easy
17
+
18
+ def method
19
+ nil
20
+ end
21
+
22
+ def uri
23
+ options[:uri].to_s
24
+ end
25
+
26
+ def parameters
27
+ if options[:clobber_request]
28
+ options[:parameters]
29
+ else
30
+ post_parameters.merge(query_parameters).merge(options[:parameters] || {})
31
+ end
32
+ end
33
+
34
+ private
35
+
36
+ def query_parameters
37
+ query = URI.parse(request.url).query
38
+ return(query ? CGI.parse(query) : {})
39
+ end
40
+
41
+ def post_parameters
42
+ post_body = {}
43
+
44
+ # Post params are only used if posting form data
45
+ if (request.headers['Content-Type'] && request.headers['Content-Type'].to_s.downcase.start_with?("application/x-www-form-urlencoded"))
46
+
47
+ request.post_body.split("&").each do |str|
48
+ param = str.split("=")
49
+ post_body[param[0]] = param[1]
50
+ end
51
+ end
52
+ post_body
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,66 @@
1
+ require 'oauth/request_proxy/base'
2
+ # em-http also uses adddressable so there is no need to require uri.
3
+ require 'em-http'
4
+ require 'cgi'
5
+
6
+ module OAuth::RequestProxy::EventMachine
7
+ class HttpRequest < OAuth::RequestProxy::Base
8
+
9
+ # A Proxy for use when you need to sign EventMachine::HttpClient instances.
10
+ # It needs to be called once the client is construct but before data is sent.
11
+ # Also see oauth/client/em-http
12
+ proxies ::EventMachine::HttpClient
13
+
14
+ # Request in this con
15
+
16
+ def method
17
+ request.method
18
+ end
19
+
20
+ def uri
21
+ request.normalize_uri.to_s
22
+ end
23
+
24
+ def parameters
25
+ if options[:clobber_request]
26
+ options[:parameters]
27
+ else
28
+ all_parameters
29
+ end
30
+ end
31
+
32
+ protected
33
+
34
+ def all_parameters
35
+ merged_parameters({}, post_parameters, query_parameters, options[:parameters])
36
+ end
37
+
38
+ def query_parameters
39
+ CGI.parse(request.normalize_uri.query.to_s)
40
+ end
41
+
42
+ def post_parameters
43
+ headers = request.options[:head] || {}
44
+ form_encoded = headers['Content-Type'].to_s.downcase.start_with?("application/x-www-form-urlencoded")
45
+ if ['POST', 'PUT'].include?(method) && form_encoded
46
+ CGI.parse(request.normalize_body.to_s)
47
+ else
48
+ {}
49
+ end
50
+ end
51
+
52
+ def merged_parameters(params, *extra_params)
53
+ extra_params.compact.each do |params_pairs|
54
+ params_pairs.each_pair do |key, value|
55
+ if params.has_key?(key)
56
+ params[key] += value
57
+ else
58
+ params[key] = [value].flatten
59
+ end
60
+ end
61
+ end
62
+ params
63
+ end
64
+
65
+ end
66
+ end
@@ -0,0 +1,41 @@
1
+ require 'xmpp4r'
2
+ require 'oauth/request_proxy/base'
3
+
4
+ module OAuth
5
+ module RequestProxy
6
+ class JabberRequest < OAuth::RequestProxy::Base
7
+ proxies Jabber::Iq
8
+ proxies Jabber::Presence
9
+ proxies Jabber::Message
10
+
11
+ def parameters
12
+ return @params if @params
13
+
14
+ @params = {}
15
+
16
+ oauth = @request.get_elements('//oauth').first
17
+ return @params unless oauth
18
+
19
+ %w( oauth_token oauth_consumer_key oauth_signature_method oauth_signature
20
+ oauth_timestamp oauth_nonce oauth_version ).each do |param|
21
+ next unless element = oauth.first_element(param)
22
+ @params[param] = element.text
23
+ end
24
+
25
+ @params
26
+ end
27
+
28
+ def method
29
+ @request.name
30
+ end
31
+
32
+ def uri
33
+ [@request.from.strip.to_s, @request.to.strip.to_s].join("&")
34
+ end
35
+
36
+ def normalized_uri
37
+ uri
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,44 @@
1
+ require 'oauth/request_proxy/base'
2
+
3
+ module OAuth
4
+ module RequestProxy
5
+ # RequestProxy for Hashes to facilitate simpler signature creation.
6
+ # Usage:
7
+ # request = OAuth::RequestProxy.proxy \
8
+ # "method" => "iq",
9
+ # "uri" => [from, to] * "&",
10
+ # "parameters" => {
11
+ # "oauth_consumer_key" => oauth_consumer_key,
12
+ # "oauth_token" => oauth_token,
13
+ # "oauth_signature_method" => "HMAC-SHA1"
14
+ # }
15
+ #
16
+ # signature = OAuth::Signature.sign \
17
+ # request,
18
+ # :consumer_secret => oauth_consumer_secret,
19
+ # :token_secret => oauth_token_secret,
20
+ class MockRequest < OAuth::RequestProxy::Base
21
+ proxies Hash
22
+
23
+ def parameters
24
+ @request["parameters"]
25
+ end
26
+
27
+ def method
28
+ @request["method"]
29
+ end
30
+
31
+ def normalized_uri
32
+ super
33
+ rescue
34
+ # if this is a non-standard URI, it may not parse properly
35
+ # in that case, assume that it's already been normalized
36
+ uri
37
+ end
38
+
39
+ def uri
40
+ @request["uri"]
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,73 @@
1
+ require 'oauth/request_proxy/base'
2
+ require 'net/http'
3
+ require 'uri'
4
+ require 'cgi'
5
+
6
+ module OAuth::RequestProxy::Net
7
+ module HTTP
8
+ class HTTPRequest < OAuth::RequestProxy::Base
9
+ proxies ::Net::HTTPGenericRequest
10
+
11
+ def method
12
+ request.method
13
+ end
14
+
15
+ def uri
16
+ options[:uri].to_s
17
+ end
18
+
19
+ def parameters
20
+ if options[:clobber_request]
21
+ options[:parameters]
22
+ else
23
+ all_parameters
24
+ end
25
+ end
26
+
27
+ def body
28
+ request.body
29
+ end
30
+
31
+ private
32
+
33
+ def all_parameters
34
+ request_params = CGI.parse(query_string)
35
+ # request_params.each{|k,v| request_params[k] = [nil] if v == []}
36
+
37
+ if options[:parameters]
38
+ options[:parameters].each do |k,v|
39
+ if request_params.has_key?(k) && v
40
+ request_params[k] << v
41
+ else
42
+ request_params[k] = [v]
43
+ end
44
+ end
45
+ end
46
+ request_params
47
+ end
48
+
49
+ def query_string
50
+ params = [ query_params, auth_header_params ]
51
+ params << post_params if (method.to_s.upcase == 'POST' || method.to_s.upcase == 'PUT') && form_url_encoded?
52
+ params.compact.join('&')
53
+ end
54
+
55
+ def form_url_encoded?
56
+ request['Content-Type'] != nil && request['Content-Type'].to_s.downcase.start_with?('application/x-www-form-urlencoded')
57
+ end
58
+
59
+ def query_params
60
+ URI.parse(request.path).query
61
+ end
62
+
63
+ def post_params
64
+ request.body
65
+ end
66
+
67
+ def auth_header_params
68
+ return nil unless request['Authorization'] && request['Authorization'][0,5] == 'OAuth'
69
+ auth_params = request['Authorization']
70
+ end
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,44 @@
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.env["rack.methodoverride.original_method"] || 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
+ if request.content_type and request.content_type.to_s.downcase.start_with?("application/x-www-form-urlencoded")
38
+ request.POST
39
+ else
40
+ {}
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,67 @@
1
+ require 'oauth/request_proxy/base'
2
+ require 'rest-client'
3
+ require 'restclient/request'
4
+ require 'uri'
5
+ require 'cgi'
6
+
7
+ module OAuth::RequestProxy::RestClient
8
+ class Request < OAuth::RequestProxy::Base
9
+ proxies RestClient::Request
10
+
11
+ def method
12
+ request.method.to_s.upcase
13
+ end
14
+
15
+ def uri
16
+ request.url
17
+ end
18
+
19
+ def parameters
20
+ if options[:clobber_request]
21
+ options[:parameters] || {}
22
+ else
23
+ post_parameters.merge(query_params).merge(options[:parameters] || {})
24
+ end
25
+ end
26
+
27
+ def body
28
+ request.payload.to_s
29
+ end
30
+
31
+ protected
32
+
33
+ def query_params
34
+ query = URI.parse(request.url).query
35
+ query ? CGI.parse(query) : {}
36
+ end
37
+
38
+ def request_params
39
+ end
40
+
41
+ def post_parameters
42
+ # Post params are only used if posting form data
43
+ if method == 'POST' || method == 'PUT'
44
+ OAuth::Helper.stringify_keys(query_string_to_hash(request.payload.to_s) || {})
45
+ else
46
+ {}
47
+ end
48
+ end
49
+
50
+ private
51
+
52
+ def query_string_to_hash(query)
53
+ keyvals = query.split('&').inject({}) do |result, q|
54
+ k,v = q.split('=')
55
+ if !v.nil?
56
+ result.merge({k => v})
57
+ elsif !result.key?(k)
58
+ result.merge({k => true})
59
+ else
60
+ result
61
+ end
62
+ end
63
+ keyvals
64
+ end
65
+
66
+ end
67
+ end
@@ -0,0 +1,53 @@
1
+ require 'oauth/request_proxy/base'
2
+ require 'typhoeus'
3
+ require 'typhoeus/request'
4
+ require 'uri'
5
+ require 'cgi'
6
+
7
+ module OAuth::RequestProxy::Typhoeus
8
+ class Request < OAuth::RequestProxy::Base
9
+ # Proxy for signing Typhoeus::Request requests
10
+ # Usage example:
11
+ # oauth_params = {:consumer => oauth_consumer, :token => access_token}
12
+ # req = Typhoeus::Request.new(uri, options)
13
+ # oauth_helper = OAuth::Client::Helper.new(req, oauth_params.merge(:request_uri => uri))
14
+ # req.headers.merge!({"Authorization" => oauth_helper.header})
15
+ # hydra = Typhoeus::Hydra.new()
16
+ # hydra.queue(req)
17
+ # hydra.run
18
+ # response = req.response
19
+ proxies Typhoeus::Request
20
+
21
+ def method
22
+ request.method.to_s.upcase
23
+ end
24
+
25
+ def uri
26
+ options[:uri].to_s
27
+ end
28
+
29
+ def parameters
30
+ if options[:clobber_request]
31
+ options[:parameters]
32
+ else
33
+ post_parameters.merge(query_parameters).merge(options[:parameters] || {})
34
+ end
35
+ end
36
+
37
+ private
38
+
39
+ def query_parameters
40
+ query = URI.parse(request.url).query
41
+ query ? CGI.parse(query) : {}
42
+ end
43
+
44
+ def post_parameters
45
+ # Post params are only used if posting form data
46
+ if method == 'POST'
47
+ OAuth::Helper.stringify_keys(request.params || {})
48
+ else
49
+ {}
50
+ end
51
+ end
52
+ end
53
+ end