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,55 @@
1
+ require 'openssl'
2
+ require 'base64'
3
+
4
+ module OAuth
5
+ module Helper
6
+ extend self
7
+
8
+ def escape(value)
9
+ URI::escape(value.to_s, OAuth::RESERVED_CHARACTERS)
10
+ end
11
+
12
+ def generate_key(size=32)
13
+ Base64.encode64(OpenSSL::Random.random_bytes(size)).gsub(/\W/, '')
14
+ end
15
+
16
+ alias_method :generate_nonce, :generate_key
17
+
18
+ def generate_timestamp
19
+ Time.now.to_i.to_s
20
+ end
21
+
22
+ def normalize(params)
23
+ params.sort.map do |k, values|
24
+
25
+ if values.is_a?(Array)
26
+ # multiple values were provided for a single key
27
+ values.sort.collect do |v|
28
+ [escape(k),escape(v)] * "="
29
+ end
30
+ else
31
+ [escape(k),escape(values)] * "="
32
+ end
33
+ end * "&"
34
+ end
35
+
36
+ # Parse an Authorization / WWW-Authenticate header into a hash
37
+ def parse_header(header)
38
+ # decompose
39
+ params = header[6,header.length].split(/[,=]/)
40
+
41
+ # strip and unescape
42
+ params.map! { |v| unescape(v.strip) }
43
+
44
+ # strip quotes
45
+ params.map! { |v| v =~ /^\".*\"$/ ? v[1..-2] : v }
46
+
47
+ # convert into a Hash
48
+ Hash[*params.flatten]
49
+ end
50
+
51
+ def unescape(value)
52
+ URI.unescape(value.gsub('+', '%2B'))
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,7 @@
1
+ module OAuth
2
+ # required parameters, per sections 6.1.1, 6.3.1, and 7
3
+ PARAMETERS = %w(oauth_consumer_key oauth_token oauth_signature_method oauth_timestamp oauth_nonce oauth_version oauth_signature)
4
+
5
+ # reserved character regexp, per section 5.1
6
+ RESERVED_CHARACTERS = /[^\w\d\-\.\_\~]/
7
+ end
@@ -0,0 +1,25 @@
1
+ require 'action_controller'
2
+ require 'action_controller/test_process'
3
+
4
+ module OAuth
5
+ module OAuthTestHelper
6
+ def mock_incoming_request_with_query(request)
7
+ incoming = ActionController::TestRequest.new(request.to_hash)
8
+ incoming.request_uri = request.path
9
+ incoming.host = request.uri.host
10
+ incoming.env["SERVER_PORT"] = request.uri.port
11
+ incoming.env['REQUEST_METHOD'] = request.http_method
12
+ incoming
13
+ end
14
+
15
+ def mock_incoming_request_with_authorize_header(request)
16
+ incoming = ActionController::TestRequest.new
17
+ incoming.request_uri = request.path
18
+ incoming.host = request.uri.host
19
+ incoming.env["HTTP_AUTHORIZATION"] = request.to_auth_string
20
+ incoming.env["SERVER_PORT"] = request.uri.port
21
+ incoming.env['REQUEST_METHOD'] = request.http_method
22
+ incoming
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,24 @@
1
+ module OAuth
2
+ module RequestProxy
3
+ def self.available_proxies #:nodoc:
4
+ @available_proxies ||= {}
5
+ end
6
+
7
+ def self.proxy(request, options = {})
8
+ return request if request.kind_of?(OAuth::RequestProxy::Base)
9
+
10
+ klass = available_proxies[request.class]
11
+
12
+ # Search for possible superclass matches.
13
+ if klass.nil?
14
+ request_parent = available_proxies.keys.find { |rc| request.kind_of?(rc) }
15
+ klass = available_proxies[request_parent]
16
+ end
17
+
18
+ raise UnknownRequestType, request.class.to_s unless klass
19
+ klass.new(request, options)
20
+ end
21
+
22
+ class UnknownRequestType < Exception; end
23
+ end
24
+ end
@@ -0,0 +1,63 @@
1
+ require 'rubygems'
2
+ require 'active_support'
3
+ require 'rack/request'
4
+ require 'action_controller/request'
5
+ require 'oauth/request_proxy/base'
6
+ require 'uri'
7
+
8
+ module OAuth::RequestProxy
9
+ class ActionControllerRequest < OAuth::RequestProxy::Base
10
+ proxies(defined?(ActionController::AbstractRequest) ? ActionController::AbstractRequest : ActionController::Request)
11
+
12
+ def method
13
+ request.method.to_s.upcase
14
+ end
15
+
16
+ def uri
17
+ request.url
18
+ end
19
+
20
+ def parameters
21
+ if options[:clobber_request]
22
+ options[:parameters] || {}
23
+ else
24
+ params = request_params.merge(query_params).merge(header_params)
25
+ params.stringify_keys! if params.respond_to?(:stringify_keys!)
26
+ params.merge(options[:parameters] || {})
27
+ end
28
+ end
29
+
30
+ # Override from OAuth::RequestProxy::Base to avoid roundtrip
31
+ # conversion to Hash or Array and thus preserve the original
32
+ # parameter names
33
+ def parameters_for_signature
34
+ params = []
35
+ params << options[:parameters].to_query if options[:parameters]
36
+
37
+ unless options[:clobber_request]
38
+ params << header_params.to_query
39
+ params << request.query_string unless request.query_string.blank?
40
+ if request.content_type == Mime::Type.lookup("application/x-www-form-urlencoded")
41
+ params << request.raw_post
42
+ end
43
+ end
44
+
45
+ params.
46
+ join('&').split('&').
47
+ reject { |kv| kv =~ /^oauth_signature=.*/}.
48
+ reject(&:blank?).
49
+ map { |p| p.split('=').map{|esc| CGI.unescape(esc)} }
50
+ end
51
+
52
+ protected
53
+
54
+ def query_params
55
+ request.query_parameters
56
+ end
57
+
58
+ def request_params
59
+ request.request_parameters
60
+ end
61
+
62
+ end
63
+ end
@@ -0,0 +1,157 @@
1
+ require 'oauth/request_proxy'
2
+ require 'oauth/helper'
3
+
4
+ module OAuth::RequestProxy
5
+ class Base
6
+ include OAuth::Helper
7
+
8
+ def self.proxies(klass)
9
+ OAuth::RequestProxy.available_proxies[klass] = self
10
+ end
11
+
12
+ attr_accessor :request, :options
13
+
14
+ def initialize(request, options = {})
15
+ @request = request
16
+ @options = options
17
+ end
18
+
19
+ ## OAuth parameters
20
+
21
+ def oauth_consumer_key
22
+ parameters['oauth_consumer_key']
23
+ end
24
+
25
+ def oauth_nonce
26
+ parameters['oauth_nonce']
27
+ end
28
+
29
+ def oauth_signature
30
+ # TODO can this be nil?
31
+ parameters['oauth_signature'] || ""
32
+ end
33
+
34
+ def oauth_signature_method
35
+ case parameters['oauth_signature_method']
36
+ when Array
37
+ parameters['oauth_signature_method'].first
38
+ else
39
+ parameters['oauth_signature_method']
40
+ end
41
+ end
42
+
43
+ def oauth_timestamp
44
+ parameters['oauth_timestamp']
45
+ end
46
+
47
+ def oauth_token
48
+ parameters['oauth_token']
49
+ end
50
+
51
+ def oauth_version
52
+ parameters["oauth_version"]
53
+ end
54
+
55
+ # TODO deprecate these
56
+ alias_method :consumer_key, :oauth_consumer_key
57
+ alias_method :token, :oauth_token
58
+ alias_method :nonce, :oauth_nonce
59
+ alias_method :timestamp, :oauth_timestamp
60
+ alias_method :signature, :oauth_signature
61
+ alias_method :signature_method, :oauth_signature_method
62
+
63
+ ## Parameter accessors
64
+
65
+ def parameters
66
+ raise NotImplementedError, "Must be implemented by subclasses"
67
+ end
68
+
69
+ def parameters_for_signature
70
+ parameters.reject { |k,v| k == "oauth_signature" }
71
+ end
72
+
73
+ def oauth_parameters
74
+ parameters.select { |k,v| OAuth::PARAMETERS.include?(k) }.reject { |k,v| v == "" }
75
+ end
76
+
77
+ def non_oauth_parameters
78
+ parameters.reject { |k,v| OAuth::PARAMETERS.include?(k) }
79
+ end
80
+
81
+ # See 9.1.2 in specs
82
+ def normalized_uri
83
+ u = URI.parse(uri)
84
+ "#{u.scheme.downcase}://#{u.host.downcase}#{(u.scheme.downcase == 'http' && u.port != 80) || (u.scheme.downcase == 'https' && u.port != 443) ? ":#{u.port}" : ""}#{(u.path && u.path != '') ? u.path : '/'}"
85
+ end
86
+
87
+ # See 9.1.1. in specs Normalize Request Parameters
88
+ def normalized_parameters
89
+ normalize(parameters_for_signature)
90
+ end
91
+
92
+ def sign(options = {})
93
+ OAuth::Signature.sign(self, options)
94
+ end
95
+
96
+ def sign!(options = {})
97
+ parameters["oauth_signature"] = sign(options)
98
+ @signed = true
99
+ signature
100
+ end
101
+
102
+ # See 9.1 in specs
103
+ def signature_base_string
104
+ base = [method, normalized_uri, normalized_parameters]
105
+ base.map { |v| escape(v) }.join("&")
106
+ end
107
+
108
+ # Has this request been signed yet?
109
+ def signed?
110
+ @signed
111
+ end
112
+
113
+ # URI, including OAuth parameters
114
+ def signed_uri(with_oauth = true)
115
+ if signed?
116
+ if with_oauth
117
+ params = parameters
118
+ else
119
+ params = non_oauth_parameters
120
+ end
121
+
122
+ [uri, normalize(params)] * "?"
123
+ else
124
+ STDERR.puts "This request has not yet been signed!"
125
+ end
126
+ end
127
+
128
+ # Authorization header for OAuth
129
+ def oauth_header(options = {})
130
+ header_params_str = oauth_parameters.map { |k,v| "#{k}=\"#{escape(v)}\"" }.join(', ')
131
+
132
+ realm = "realm=\"#{options[:realm]}\", " if options[:realm]
133
+ "OAuth #{realm}#{header_params_str}"
134
+ end
135
+
136
+ protected
137
+
138
+ def header_params
139
+ %w( X-HTTP_AUTHORIZATION Authorization HTTP_AUTHORIZATION ).each do |header|
140
+ next unless request.env.include?(header)
141
+
142
+ header = request.env[header]
143
+ next unless header[0,6] == 'OAuth '
144
+
145
+ # parse the header into a Hash
146
+ oauth_params = OAuth::Helper.parse_header(header)
147
+
148
+ # remove non-OAuth parameters
149
+ oauth_params.reject! { |k,v| k !~ /^oauth_/ }
150
+
151
+ return oauth_params
152
+ end
153
+
154
+ return {}
155
+ end
156
+ end
157
+ 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,65 @@
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::HTTPRequest
10
+
11
+ def method
12
+ request.method
13
+ end
14
+
15
+ def uri
16
+ uri = options[:uri]
17
+ uri.to_s
18
+ end
19
+
20
+ def parameters
21
+ if options[:clobber_request]
22
+ options[:parameters]
23
+ else
24
+ all_parameters
25
+ end
26
+ end
27
+
28
+ private
29
+
30
+ def all_parameters
31
+ request_params = CGI.parse(query_string)
32
+ if options[:parameters]
33
+ options[:parameters].each do |k,v|
34
+ if request_params.has_key?(k)
35
+ request_params[k] << v
36
+ else
37
+ request_params[k] = [v].flatten
38
+ end
39
+ end
40
+ end
41
+ request_params
42
+ end
43
+
44
+ def query_string
45
+ params = [ query_params, auth_header_params ]
46
+ is_form_urlencoded = request['Content-Type'] != nil && request['Content-Type'].downcase == 'application/x-www-form-urlencoded'
47
+ params << post_params if method.to_s.upcase == 'POST' && is_form_urlencoded
48
+ params.compact.join('&')
49
+ end
50
+
51
+ def query_params
52
+ URI.parse(request.path).query
53
+ end
54
+
55
+ def post_params
56
+ request.body
57
+ end
58
+
59
+ def auth_header_params
60
+ return nil unless request['Authorization'] && request['Authorization'][0,5] == 'OAuth'
61
+ auth_params = request['Authorization']
62
+ end
63
+ end
64
+ end
65
+ end