monkeyhelper-oauth 0.3.1 → 0.3.5
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/History.txt +62 -17
- data/Manifest.txt +14 -1
- data/README.rdoc +7 -9
- data/Rakefile +7 -5
- data/TODO +17 -0
- data/bin/oauth +2 -2
- data/examples/yql.rb +44 -0
- data/lib/oauth/cli.rb +267 -31
- data/lib/oauth/client/action_controller_request.rb +14 -12
- data/lib/oauth/client/helper.rb +22 -14
- data/lib/oauth/client/net_http.rb +53 -22
- data/lib/oauth/consumer.rb +217 -111
- data/lib/oauth/errors/error.rb +4 -0
- data/lib/oauth/errors/problem.rb +14 -0
- data/lib/oauth/errors/unauthorized.rb +12 -0
- data/lib/oauth/errors.rb +3 -0
- data/lib/oauth/helper.rb +67 -6
- data/lib/oauth/oauth.rb +11 -0
- data/lib/oauth/oauth_test_helper.rb +12 -13
- data/lib/oauth/request_proxy/action_controller_request.rb +8 -8
- data/lib/oauth/request_proxy/base.rb +102 -44
- data/lib/oauth/request_proxy/jabber_request.rb +1 -2
- data/lib/oauth/request_proxy/mock_request.rb +8 -0
- data/lib/oauth/request_proxy/net_http.rb +2 -2
- data/lib/oauth/request_proxy/rack_request.rb +7 -7
- data/lib/oauth/server.rb +31 -33
- data/lib/oauth/signature/base.rb +23 -21
- data/lib/oauth/signature/hmac/base.rb +1 -1
- data/lib/oauth/signature/hmac/sha1.rb +0 -1
- data/lib/oauth/signature/plaintext.rb +2 -2
- data/lib/oauth/signature/rsa/sha1.rb +5 -4
- data/lib/oauth/signature.rb +9 -0
- data/lib/oauth/token.rb +6 -136
- data/lib/oauth/tokens/access_token.rb +68 -0
- data/lib/oauth/tokens/consumer_token.rb +33 -0
- data/lib/oauth/tokens/request_token.rb +32 -0
- data/lib/oauth/tokens/server_token.rb +9 -0
- data/lib/oauth/tokens/token.rb +17 -0
- data/lib/oauth/version.rb +1 -1
- data/lib/oauth.rb +1 -0
- data/oauth.gemspec +12 -6
- data/test/cases/spec/1_0-final/test_construct_request_url.rb +1 -1
- data/test/test_access_token.rb +28 -0
- data/test/test_action_controller_request_proxy.rb +105 -6
- data/test/test_consumer.rb +41 -5
- data/test/test_helper.rb +0 -5
- data/test/test_net_http_client.rb +38 -20
- data/test/test_net_http_request_proxy.rb +43 -8
- data/test/test_oauth_helper.rb +50 -0
- data/test/test_request_token.rb +53 -0
- data/test/test_server.rb +1 -1
- data/test/test_signature.rb +19 -11
- data/website/index.html +2 -2
- metadata +41 -3
data/lib/oauth/token.rb
CHANGED
@@ -1,137 +1,7 @@
|
|
1
|
-
|
2
|
-
module OAuth
|
3
|
-
|
4
|
-
# Superclass for the various tokens used by OAuth
|
5
|
-
|
6
|
-
class Token
|
7
|
-
include OAuth::Helper
|
8
|
-
|
9
|
-
attr_accessor :token, :secret
|
1
|
+
# this exists for backwards-compatibility
|
10
2
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
def to_query
|
17
|
-
"oauth_token=#{escape(token)}&oauth_secret=#{escape(secret)}"
|
18
|
-
end
|
19
|
-
|
20
|
-
end
|
21
|
-
|
22
|
-
# Used on the server for generating tokens
|
23
|
-
class ServerToken<Token
|
24
|
-
|
25
|
-
def initialize
|
26
|
-
super generate_key(16),generate_key
|
27
|
-
end
|
28
|
-
end
|
29
|
-
# Superclass for tokens used by OAuth Clients
|
30
|
-
class ConsumerToken<Token
|
31
|
-
attr_accessor :consumer
|
32
|
-
|
33
|
-
def initialize(consumer,token="",secret="")
|
34
|
-
super token,secret
|
35
|
-
@consumer=consumer
|
36
|
-
end
|
37
|
-
|
38
|
-
# Make a signed request using given http_method to the path
|
39
|
-
#
|
40
|
-
# @token.request(:get,'/people')
|
41
|
-
# @token.request(:post,'/people',@person.to_xml,{ 'Content-Type' => 'application/xml' })
|
42
|
-
#
|
43
|
-
def request(http_method,path,*arguments)
|
44
|
-
response=consumer.request(http_method,path,self,{},*arguments)
|
45
|
-
end
|
46
|
-
|
47
|
-
# Sign a request generated elsewhere using Net:HTTP::Post.new or friends
|
48
|
-
def sign!(request,options = {})
|
49
|
-
consumer.sign!(request,self,options)
|
50
|
-
end
|
51
|
-
|
52
|
-
end
|
53
|
-
|
54
|
-
# The RequestToken is used for the initial Request.
|
55
|
-
# This is normally created by the Consumer object.
|
56
|
-
class RequestToken<ConsumerToken
|
57
|
-
|
58
|
-
# Returns the authorization url that you need to use for redirecting the user
|
59
|
-
def authorize_url
|
60
|
-
consumer.authorize_url+"?oauth_token="+CGI.escape(token)
|
61
|
-
end
|
62
|
-
|
63
|
-
# exchange for AccessToken on server
|
64
|
-
def get_access_token(options={})
|
65
|
-
response=consumer.token_request(consumer.http_method,(consumer.access_token_url? ? consumer.access_token_url : consumer.access_token_path),self,options)
|
66
|
-
OAuth::AccessToken.new(consumer,response[:oauth_token],response[:oauth_token_secret])
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
# The Access Token is used for the actual "real" web service calls thatyou perform against the server
|
71
|
-
class AccessToken<ConsumerToken
|
72
|
-
|
73
|
-
# The less intrusive way. Otherwise, if we are to do it correctly inside consumer,
|
74
|
-
# we need to restructure and touch more methods: request(), sign!(), etc.
|
75
|
-
def request(http_method, path, *arguments)
|
76
|
-
request_uri = URI.parse(path)
|
77
|
-
site_uri = consumer.uri
|
78
|
-
is_service_uri_different = (request_uri.absolute? && request_uri != site_uri)
|
79
|
-
consumer.uri(request_uri) if is_service_uri_different
|
80
|
-
resp = super(http_method, path, *arguments)
|
81
|
-
# NOTE: reset for wholesomeness? meaning that we admit only AccessToken service calls may use different URIs?
|
82
|
-
# so reset in case consumer is still used for other token-management tasks subsequently?
|
83
|
-
consumer.uri(site_uri) if is_service_uri_different
|
84
|
-
resp
|
85
|
-
end
|
86
|
-
|
87
|
-
# Make a regular get request using AccessToken
|
88
|
-
#
|
89
|
-
# @response=@token.get('/people')
|
90
|
-
# @response=@token.get('/people',{'Accept'=>'application/xml'})
|
91
|
-
#
|
92
|
-
def get(path,headers={})
|
93
|
-
request(:get,path,headers)
|
94
|
-
end
|
95
|
-
|
96
|
-
# Make a regular head request using AccessToken
|
97
|
-
#
|
98
|
-
# @response=@token.head('/people')
|
99
|
-
#
|
100
|
-
def head(path,headers={})
|
101
|
-
request(:head,path,headers)
|
102
|
-
end
|
103
|
-
|
104
|
-
# Make a regular post request using AccessToken
|
105
|
-
#
|
106
|
-
# @response=@token.post('/people')
|
107
|
-
# @response=@token.post('/people',{:name=>'Bob',:email=>'bob@mailinator.com'})
|
108
|
-
# @response=@token.post('/people',{:name=>'Bob',:email=>'bob@mailinator.com'},{'Accept'=>'application/xml'})
|
109
|
-
# @response=@token.post('/people',nil,{'Accept'=>'application/xml'})
|
110
|
-
# @response=@token.post('/people',@person.to_xml,{'Accept'=>'application/xml','Content-Type' => 'application/xml'})
|
111
|
-
#
|
112
|
-
def post(path, body = '',headers={})
|
113
|
-
request(:post,path,body,headers)
|
114
|
-
end
|
115
|
-
|
116
|
-
# Make a regular put request using AccessToken
|
117
|
-
#
|
118
|
-
# @response=@token.put('/people/123')
|
119
|
-
# @response=@token.put('/people/123',{:name=>'Bob',:email=>'bob@mailinator.com'})
|
120
|
-
# @response=@token.put('/people/123',{:name=>'Bob',:email=>'bob@mailinator.com'},{'Accept'=>'application/xml'})
|
121
|
-
# @response=@token.put('/people/123',nil,{'Accept'=>'application/xml'})
|
122
|
-
# @response=@token.put('/people/123',@person.to_xml,{'Accept'=>'application/xml','Content-Type' => 'application/xml'})
|
123
|
-
#
|
124
|
-
def put(path, body = '', headers={})
|
125
|
-
request(:put,path,body,headers)
|
126
|
-
end
|
127
|
-
|
128
|
-
# Make a regular delete request using AccessToken
|
129
|
-
#
|
130
|
-
# @response=@token.delete('/people/123')
|
131
|
-
# @response=@token.delete('/people/123',{'Accept'=>'application/xml'})
|
132
|
-
#
|
133
|
-
def delete(path,headers={})
|
134
|
-
request(:delete,path,headers)
|
135
|
-
end
|
136
|
-
end
|
137
|
-
end
|
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
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module OAuth
|
2
|
+
# Superclass for tokens used by OAuth Clients
|
3
|
+
class ConsumerToken < Token
|
4
|
+
attr_accessor :consumer, :params
|
5
|
+
attr_reader :response
|
6
|
+
|
7
|
+
def self.from_hash(consumer, hash)
|
8
|
+
token = self.new(consumer, hash[:oauth_token], hash[:oauth_token_secret])
|
9
|
+
token.params = hash
|
10
|
+
token
|
11
|
+
end
|
12
|
+
|
13
|
+
def initialize(consumer, token="", secret="")
|
14
|
+
super(token, secret)
|
15
|
+
@consumer = consumer
|
16
|
+
@params = {}
|
17
|
+
end
|
18
|
+
|
19
|
+
# Make a signed request using given http_method to the path
|
20
|
+
#
|
21
|
+
# @token.request(:get, '/people')
|
22
|
+
# @token.request(:post, '/people', @person.to_xml, { 'Content-Type' => 'application/xml' })
|
23
|
+
#
|
24
|
+
def request(http_method, path, *arguments)
|
25
|
+
@response = consumer.request(http_method, path, self, {}, *arguments)
|
26
|
+
end
|
27
|
+
|
28
|
+
# Sign a request generated elsewhere using Net:HTTP::Post.new or friends
|
29
|
+
def sign!(request, options = {})
|
30
|
+
consumer.sign!(request, self, options)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module OAuth
|
2
|
+
# The RequestToken is used for the initial Request.
|
3
|
+
# This is normally created by the Consumer object.
|
4
|
+
class RequestToken < ConsumerToken
|
5
|
+
|
6
|
+
# Generate an authorization URL for user authorization
|
7
|
+
def authorize_url(params = nil)
|
8
|
+
params = (params || {}).merge(:oauth_token => self.token)
|
9
|
+
build_authorize_url(consumer.authorize_url, params)
|
10
|
+
end
|
11
|
+
|
12
|
+
def callback_confirmed?
|
13
|
+
params[:oauth_callback_confirmed] == "true"
|
14
|
+
end
|
15
|
+
|
16
|
+
# exchange for AccessToken on server
|
17
|
+
def get_access_token(options = {}, *arguments)
|
18
|
+
response = consumer.token_request(consumer.http_method, (consumer.access_token_url? ? consumer.access_token_url : consumer.access_token_path), self, options, *arguments)
|
19
|
+
OAuth::AccessToken.from_hash(consumer, response)
|
20
|
+
end
|
21
|
+
|
22
|
+
protected
|
23
|
+
|
24
|
+
# construct an authorization url
|
25
|
+
def build_authorize_url(base_url, params)
|
26
|
+
uri = URI.parse(base_url.to_s)
|
27
|
+
# TODO doesn't handle array values correctly
|
28
|
+
uri.query = params.map { |k,v| [k, CGI.escape(v)] * "=" } * "&"
|
29
|
+
uri.to_s
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module OAuth
|
2
|
+
# Superclass for the various tokens used by OAuth
|
3
|
+
class Token
|
4
|
+
include OAuth::Helper
|
5
|
+
|
6
|
+
attr_accessor :token, :secret
|
7
|
+
|
8
|
+
def initialize(token, secret)
|
9
|
+
@token = token
|
10
|
+
@secret = secret
|
11
|
+
end
|
12
|
+
|
13
|
+
def to_query
|
14
|
+
"oauth_token=#{escape(token)}&oauth_secret=#{escape(secret)}"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
data/lib/oauth/version.rb
CHANGED
data/lib/oauth.rb
CHANGED
data/oauth.gemspec
CHANGED
@@ -2,17 +2,17 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = %q{oauth}
|
5
|
-
s.version = "0.3.
|
5
|
+
s.version = "0.3.5"
|
6
6
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
8
|
-
s.authors = ["Pelle Braendgaard", "Blaine Cook", "Larry Halff", "Jesse Clark", "Jon Crosby", "Seth Fitzsimmons"]
|
9
|
-
s.date = %q{2009-
|
8
|
+
s.authors = ["Pelle Braendgaard", "Blaine Cook", "Larry Halff", "Jesse Clark", "Jon Crosby", "Seth Fitzsimmons", "Matt Sanford"]
|
9
|
+
s.date = %q{2009-06-03}
|
10
10
|
s.default_executable = %q{oauth}
|
11
11
|
s.description = %q{OAuth Core Ruby implementation}
|
12
|
-
s.email = %q{
|
12
|
+
s.email = %q{oauth-ruby@googlegroups.com}
|
13
13
|
s.executables = ["oauth"]
|
14
14
|
s.extra_rdoc_files = ["History.txt", "License.txt", "Manifest.txt", "README.rdoc", "website/index.txt"]
|
15
|
-
s.files = ["History.txt", "License.txt", "Manifest.txt", "README.rdoc", "Rakefile", "TODO", "bin/oauth", "lib/oauth.rb", "lib/oauth/cli.rb", "lib/oauth/client.rb", "lib/oauth/client/action_controller_request.rb", "lib/oauth/client/helper.rb", "lib/oauth/client/net_http.rb", "lib/oauth/consumer.rb", "lib/oauth/helper.rb", "lib/oauth/oauth_test_helper.rb", "lib/oauth/request_proxy.rb", "lib/oauth/request_proxy/action_controller_request.rb", "lib/oauth/request_proxy/base.rb", "lib/oauth/request_proxy/jabber_request.rb", "lib/oauth/request_proxy/mock_request.rb", "lib/oauth/request_proxy/net_http.rb", "lib/oauth/request_proxy/rack_request.rb", "lib/oauth/server.rb", "lib/oauth/signature.rb", "lib/oauth/signature/base.rb", "lib/oauth/signature/hmac/base.rb", "lib/oauth/signature/hmac/md5.rb", "lib/oauth/signature/hmac/rmd160.rb", "lib/oauth/signature/hmac/sha1.rb", "lib/oauth/signature/hmac/sha2.rb", "lib/oauth/signature/md5.rb", "lib/oauth/signature/plaintext.rb", "lib/oauth/signature/rsa/sha1.rb", "lib/oauth/signature/sha1.rb", "lib/oauth/token.rb", "lib/oauth/version.rb", "oauth.gemspec", "script/destroy", "script/generate", "script/txt2html", "setup.rb", "tasks/deployment.rake", "tasks/environment.rake", "tasks/website.rake", "test/cases/oauth_case.rb", "test/cases/spec/1_0-final/test_construct_request_url.rb", "test/cases/spec/1_0-final/test_normalize_request_parameters.rb", "test/cases/spec/1_0-final/test_parameter_encodings.rb", "test/cases/spec/1_0-final/test_signature_base_strings.rb", "test/keys/rsa.cert", "test/keys/rsa.pem", "test/test_action_controller_request_proxy.rb", "test/test_consumer.rb", "test/test_helper.rb", "test/test_hmac_sha1.rb", "test/test_net_http_client.rb", "test/test_net_http_request_proxy.rb", "test/test_rack_request_proxy.rb", "test/test_rsa_sha1.rb", "test/test_server.rb", "test/test_signature.rb", "test/test_signature_base.rb", "test/test_signature_plain_text.rb", "test/test_token.rb", "website/index.html", "website/index.txt", "website/javascripts/rounded_corners_lite.inc.js", "website/stylesheets/screen.css", "website/template.rhtml"]
|
15
|
+
s.files = ["History.txt", "License.txt", "Manifest.txt", "README.rdoc", "Rakefile", "TODO", "bin/oauth", "examples/yql.rb", "lib/oauth.rb", "lib/oauth/oauth.rb", "lib/oauth/cli.rb", "lib/oauth/client.rb", "lib/oauth/client/action_controller_request.rb", "lib/oauth/client/helper.rb", "lib/oauth/client/net_http.rb", "lib/oauth/consumer.rb", "lib/oauth/errors.rb", "lib/oauth/errors/error.rb", "lib/oauth/errors/problem.rb", "lib/oauth/errors/unauthorized.rb", "lib/oauth/helper.rb", "lib/oauth/oauth_test_helper.rb", "lib/oauth/request_proxy.rb", "lib/oauth/request_proxy/action_controller_request.rb", "lib/oauth/request_proxy/base.rb", "lib/oauth/request_proxy/jabber_request.rb", "lib/oauth/request_proxy/mock_request.rb", "lib/oauth/request_proxy/net_http.rb", "lib/oauth/request_proxy/rack_request.rb", "lib/oauth/server.rb", "lib/oauth/signature.rb", "lib/oauth/signature/base.rb", "lib/oauth/signature/hmac/base.rb", "lib/oauth/signature/hmac/md5.rb", "lib/oauth/signature/hmac/rmd160.rb", "lib/oauth/signature/hmac/sha1.rb", "lib/oauth/signature/hmac/sha2.rb", "lib/oauth/signature/md5.rb", "lib/oauth/signature/plaintext.rb", "lib/oauth/signature/rsa/sha1.rb", "lib/oauth/signature/sha1.rb", "lib/oauth/token.rb", "lib/oauth/tokens/access_token.rb", "lib/oauth/tokens/consumer_token.rb", "lib/oauth/tokens/request_token.rb", "lib/oauth/tokens/server_token.rb", "lib/oauth/tokens/token.rb", "lib/oauth/version.rb", "oauth.gemspec", "script/destroy", "script/generate", "script/txt2html", "setup.rb", "tasks/deployment.rake", "tasks/environment.rake", "tasks/website.rake", "test/cases/oauth_case.rb", "test/cases/spec/1_0-final/test_construct_request_url.rb", "test/cases/spec/1_0-final/test_normalize_request_parameters.rb", "test/cases/spec/1_0-final/test_parameter_encodings.rb", "test/cases/spec/1_0-final/test_signature_base_strings.rb", "test/keys/rsa.cert", "test/keys/rsa.pem", "test/test_access_token.rb", "test/test_action_controller_request_proxy.rb", "test/test_consumer.rb", "test/test_helper.rb", "test/test_hmac_sha1.rb", "test/test_net_http_client.rb", "test/test_net_http_request_proxy.rb", "test/test_oauth_helper.rb", "test/test_rack_request_proxy.rb", "test/test_request_token.rb", "test/test_rsa_sha1.rb", "test/test_server.rb", "test/test_signature.rb", "test/test_signature_base.rb", "test/test_signature_plain_text.rb", "test/test_token.rb", "website/index.html", "website/index.txt", "website/javascripts/rounded_corners_lite.inc.js", "website/stylesheets/screen.css", "website/template.rhtml"]
|
16
16
|
s.has_rdoc = true
|
17
17
|
s.homepage = %q{http://oauth.rubyforge.org}
|
18
18
|
s.rdoc_options = ["--main", "README.rdoc"]
|
@@ -20,7 +20,7 @@ Gem::Specification.new do |s|
|
|
20
20
|
s.rubyforge_project = %q{oauth}
|
21
21
|
s.rubygems_version = %q{1.3.1}
|
22
22
|
s.summary = %q{OAuth Core Ruby implementation}
|
23
|
-
s.test_files = ["test/cases/spec/1_0-final/test_construct_request_url.rb", "test/cases/spec/1_0-final/test_normalize_request_parameters.rb", "test/cases/spec/1_0-final/test_parameter_encodings.rb", "test/cases/spec/1_0-final/test_signature_base_strings.rb", "test/test_action_controller_request_proxy.rb", "test/test_consumer.rb", "test/test_helper.rb", "test/test_hmac_sha1.rb", "test/test_net_http_client.rb", "test/test_net_http_request_proxy.rb", "test/test_rack_request_proxy.rb", "test/test_rsa_sha1.rb", "test/test_server.rb", "test/test_signature.rb", "test/test_signature_base.rb", "test/test_signature_plain_text.rb", "test/test_token.rb"]
|
23
|
+
s.test_files = ["test/cases/spec/1_0-final/test_construct_request_url.rb", "test/cases/spec/1_0-final/test_normalize_request_parameters.rb", "test/cases/spec/1_0-final/test_parameter_encodings.rb", "test/cases/spec/1_0-final/test_signature_base_strings.rb", "test/test_access_token.rb", "test/test_action_controller_request_proxy.rb", "test/test_consumer.rb", "test/test_helper.rb", "test/test_hmac_sha1.rb", "test/test_net_http_client.rb", "test/test_net_http_request_proxy.rb", "test/test_oauth_helper.rb", "test/test_rack_request_proxy.rb", "test/test_request_token.rb", "test/test_rsa_sha1.rb", "test/test_server.rb", "test/test_signature.rb", "test/test_signature_base.rb", "test/test_signature_plain_text.rb", "test/test_token.rb"]
|
24
24
|
|
25
25
|
if s.respond_to? :specification_version then
|
26
26
|
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
@@ -29,15 +29,21 @@ Gem::Specification.new do |s|
|
|
29
29
|
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
30
30
|
s.add_runtime_dependency(%q<ruby-hmac>, [">= 0.3.1"])
|
31
31
|
s.add_development_dependency(%q<newgem>, [">= 1.2.3"])
|
32
|
+
s.add_development_dependency(%q<actionpack>, [">= 0"])
|
33
|
+
s.add_development_dependency(%q<rack>, [">= 0"])
|
32
34
|
s.add_development_dependency(%q<hoe>, [">= 1.8.0"])
|
33
35
|
else
|
34
36
|
s.add_dependency(%q<ruby-hmac>, [">= 0.3.1"])
|
35
37
|
s.add_dependency(%q<newgem>, [">= 1.2.3"])
|
38
|
+
s.add_dependency(%q<actionpack>, [">= 0"])
|
39
|
+
s.add_dependency(%q<rack>, [">= 0"])
|
36
40
|
s.add_dependency(%q<hoe>, [">= 1.8.0"])
|
37
41
|
end
|
38
42
|
else
|
39
43
|
s.add_dependency(%q<ruby-hmac>, [">= 0.3.1"])
|
40
44
|
s.add_dependency(%q<newgem>, [">= 1.2.3"])
|
45
|
+
s.add_dependency(%q<actionpack>, [">= 0"])
|
46
|
+
s.add_dependency(%q<rack>, [">= 0"])
|
41
47
|
s.add_dependency(%q<hoe>, [">= 1.8.0"])
|
42
48
|
end
|
43
49
|
end
|
@@ -40,7 +40,7 @@ class ConstructRequestUrlTest < OAuthCase
|
|
40
40
|
assert_request_url("https://example.com/resource","HTTPS://Example.com:443/resource?id=123")
|
41
41
|
end
|
42
42
|
|
43
|
-
def
|
43
|
+
def test_of_normalized_https
|
44
44
|
assert_request_url("https://example.com/resource","https://example.com/resource")
|
45
45
|
end
|
46
46
|
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/test_helper.rb'
|
2
|
+
require 'oauth/token'
|
3
|
+
require 'oauth/consumer'
|
4
|
+
|
5
|
+
class TestAccessToken < Test::Unit::TestCase
|
6
|
+
def setup
|
7
|
+
@fake_response = {
|
8
|
+
:user_id => 5734758743895,
|
9
|
+
:oauth_token => "key",
|
10
|
+
:oauth_token_secret => "secret"
|
11
|
+
}
|
12
|
+
# setup a fake req. token. mocking Consumer would be more appropriate...
|
13
|
+
@access_token = OAuth::AccessToken.from_hash(
|
14
|
+
OAuth::Consumer.new("key", "secret", {}),
|
15
|
+
@fake_response
|
16
|
+
)
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_provides_response_parameters
|
20
|
+
assert @access_token
|
21
|
+
assert_respond_to @access_token, :params
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_access_token_makes_non_oauth_response_params_available
|
25
|
+
assert_not_nil @access_token.params[:user_id]
|
26
|
+
assert_equal 5734758743895, @access_token.params[:user_id]
|
27
|
+
end
|
28
|
+
end
|
@@ -5,24 +5,123 @@ require 'action_controller/test_process'
|
|
5
5
|
|
6
6
|
class ActionControllerRequestProxyTest < Test::Unit::TestCase
|
7
7
|
|
8
|
-
def request_proxy(
|
9
|
-
request = ActionController::TestRequest.new
|
8
|
+
def request_proxy(request_method = :get, uri_params = {}, body_params = {})
|
9
|
+
request = ActionController::TestRequest.new
|
10
|
+
|
11
|
+
case request_method
|
12
|
+
when :post
|
13
|
+
request.env['REQUEST_METHOD'] = 'POST'
|
14
|
+
when :put
|
15
|
+
request.env['REQUEST_METHOD'] = 'PUT'
|
16
|
+
end
|
17
|
+
|
18
|
+
request.env['RAW_POST_DATA'] = body_params.to_query
|
10
19
|
request.env['CONTENT_TYPE'] = 'application/x-www-form-urlencoded'
|
20
|
+
|
11
21
|
yield request if block_given?
|
12
|
-
OAuth::RequestProxy.proxy(request)
|
22
|
+
OAuth::RequestProxy.proxy(request, :parameters=>uri_params)
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_that_proxy_simple_get_request_works_with_query_params
|
26
|
+
request_proxy = request_proxy(:get, {'key'=>'value'})
|
27
|
+
|
28
|
+
expected_parameters = [["key", "value"]]
|
29
|
+
assert_equal expected_parameters, request_proxy.parameters_for_signature
|
30
|
+
assert_equal 'GET', request_proxy.method
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_that_proxy_simple_post_request_works_with_query_params
|
34
|
+
request_proxy = request_proxy(:post, {'key'=>'value'})
|
35
|
+
|
36
|
+
expected_parameters = [["key", "value"]]
|
37
|
+
assert_equal expected_parameters, request_proxy.parameters_for_signature
|
38
|
+
assert_equal 'POST', request_proxy.method
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_that_proxy_simple_put_request_works_with_query_params
|
42
|
+
request_proxy = request_proxy(:put, {'key'=>'value'})
|
43
|
+
|
44
|
+
expected_parameters = [["key", "value"]]
|
45
|
+
assert_equal expected_parameters, request_proxy.parameters_for_signature
|
46
|
+
assert_equal 'PUT', request_proxy.method
|
47
|
+
end
|
48
|
+
|
49
|
+
def test_that_proxy_simple_put_request_works_with_post_params
|
50
|
+
request_proxy = request_proxy(:get, {}, {'key'=>'value'})
|
51
|
+
|
52
|
+
expected_parameters = []
|
53
|
+
assert_equal expected_parameters, request_proxy.parameters_for_signature
|
54
|
+
assert_equal 'GET', request_proxy.method
|
13
55
|
end
|
14
|
-
|
56
|
+
|
57
|
+
def test_that_proxy_simple_post_request_works_with_post_params
|
58
|
+
request_proxy = request_proxy(:post, {}, {'key'=>'value'})
|
59
|
+
|
60
|
+
expected_parameters = [["key", "value"]]
|
61
|
+
assert_equal expected_parameters, request_proxy.parameters_for_signature
|
62
|
+
assert_equal 'POST', request_proxy.method
|
63
|
+
end
|
64
|
+
|
65
|
+
def test_that_proxy_simple_put_request_works_with_post_params
|
66
|
+
request_proxy = request_proxy(:put, {}, {'key'=>'value'})
|
67
|
+
|
68
|
+
expected_parameters = []
|
69
|
+
assert_equal expected_parameters, request_proxy.parameters_for_signature
|
70
|
+
assert_equal 'PUT', request_proxy.method
|
71
|
+
end
|
72
|
+
|
73
|
+
def test_that_proxy_simple_put_request_works_with_mixed_params
|
74
|
+
request_proxy = request_proxy(:get, {'key'=>'value'}, {'key2'=>'value2'})
|
75
|
+
|
76
|
+
expected_parameters = [["key", "value"]]
|
77
|
+
assert_equal expected_parameters, request_proxy.parameters_for_signature
|
78
|
+
assert_equal 'GET', request_proxy.method
|
79
|
+
end
|
80
|
+
|
81
|
+
def test_that_proxy_simple_post_request_works_with_mixed_params
|
82
|
+
request_proxy = request_proxy(:post, {'key'=>'value'}, {'key2'=>'value2'})
|
83
|
+
|
84
|
+
expected_parameters = [["key", "value"],["key2", "value2"]]
|
85
|
+
assert_equal expected_parameters, request_proxy.parameters_for_signature
|
86
|
+
assert_equal 'POST', request_proxy.method
|
87
|
+
end
|
88
|
+
|
89
|
+
def test_that_proxy_simple_put_request_works_with_mixed_params
|
90
|
+
request_proxy = request_proxy(:put, {'key'=>'value'}, {'key2'=>'value2'})
|
91
|
+
|
92
|
+
expected_parameters = [["key", "value"]]
|
93
|
+
assert_equal expected_parameters, request_proxy.parameters_for_signature
|
94
|
+
assert_equal 'PUT', request_proxy.method
|
95
|
+
end
|
96
|
+
|
15
97
|
def test_parameter_keys_should_preserve_brackets_from_hash
|
16
98
|
assert_equal(
|
17
99
|
[["message[body]", "This is a test"]],
|
18
|
-
request_proxy({ :message => { :body => 'This is a test' }}).parameters_for_signature
|
100
|
+
request_proxy(:post, { :message => { :body => 'This is a test' }}).parameters_for_signature
|
101
|
+
)
|
102
|
+
end
|
103
|
+
|
104
|
+
def test_parameter_values_with_amps_should_not_break_parameter_parsing
|
105
|
+
assert_equal(
|
106
|
+
[['message[body]', 'http://foo.com/?a=b&c=d']],
|
107
|
+
request_proxy(:post, { :message => { :body => 'http://foo.com/?a=b&c=d'}}).parameters_for_signature
|
19
108
|
)
|
20
109
|
end
|
21
110
|
|
22
111
|
def test_parameter_keys_should_preserve_brackets_from_array
|
23
112
|
assert_equal(
|
24
113
|
[["foo[]", "123"], ["foo[]", "456"]],
|
25
|
-
request_proxy({ :foo => [123, 456] }).parameters_for_signature.sort
|
114
|
+
request_proxy(:post, { :foo => [123, 456] }).parameters_for_signature.sort
|
115
|
+
)
|
116
|
+
end
|
117
|
+
|
118
|
+
def test_query_string_parameter_values_should_be_cgi_unescaped
|
119
|
+
request = request_proxy do |r|
|
120
|
+
r.env['QUERY_STRING'] = 'url=http%3A%2F%2Ffoo.com%2F%3Fa%3Db%26c%3Dd'
|
121
|
+
end
|
122
|
+
assert_equal(
|
123
|
+
[['url', 'http://foo.com/?a=b&c=d']],
|
124
|
+
request.parameters_for_signature.sort
|
26
125
|
)
|
27
126
|
end
|
28
127
|
end
|
data/test/test_consumer.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
|
-
require '
|
2
|
-
require 'test/unit'
|
1
|
+
require File.dirname(__FILE__) + '/test_helper'
|
3
2
|
require 'oauth/consumer'
|
4
3
|
require 'oauth/signature/rsa/sha1'
|
4
|
+
require 'stringio'
|
5
5
|
|
6
6
|
|
7
7
|
# This performs testing against Andy Smith's test server http://term.ie/oauth/example/
|
@@ -13,6 +13,7 @@ class ConsumerTest < Test::Unit::TestCase
|
|
13
13
|
'consumer_key_86cad9', '5888bf0345e5d237',
|
14
14
|
{
|
15
15
|
:site=>"http://blabla.bla",
|
16
|
+
:proxy=>"http://user:password@proxy.bla:8080",
|
16
17
|
:request_token_path=>"/oauth/example/request_token.php",
|
17
18
|
:access_token_path=>"/oauth/example/access_token.php",
|
18
19
|
:authorize_path=>"/oauth/example/authorize.php",
|
@@ -31,6 +32,7 @@ class ConsumerTest < Test::Unit::TestCase
|
|
31
32
|
assert_equal "consumer_key_86cad9",@consumer.key
|
32
33
|
assert_equal "5888bf0345e5d237",@consumer.secret
|
33
34
|
assert_equal "http://blabla.bla",@consumer.site
|
35
|
+
assert_equal "http://user:password@proxy.bla:8080",@consumer.proxy
|
34
36
|
assert_equal "/oauth/example/request_token.php",@consumer.request_token_path
|
35
37
|
assert_equal "/oauth/example/access_token.php",@consumer.access_token_path
|
36
38
|
assert_equal "http://blabla.bla/oauth/example/request_token.php",@consumer.request_token_url
|
@@ -50,6 +52,7 @@ class ConsumerTest < Test::Unit::TestCase
|
|
50
52
|
assert_equal "key",@consumer.key
|
51
53
|
assert_equal "secret",@consumer.secret
|
52
54
|
assert_equal "http://twitter.com",@consumer.site
|
55
|
+
assert_nil @consumer.proxy
|
53
56
|
assert_equal "/oauth/request_token",@consumer.request_token_path
|
54
57
|
assert_equal "/oauth/access_token",@consumer.access_token_path
|
55
58
|
assert_equal "http://twitter.com/oauth/request_token",@consumer.request_token_url
|
@@ -144,7 +147,7 @@ class ConsumerTest < Test::Unit::TestCase
|
|
144
147
|
|
145
148
|
assert_equal 'POST', request.method
|
146
149
|
assert_equal '/test', request.path
|
147
|
-
assert_equal "key=value&oauth_consumer_key=consumer_key_86cad9&oauth_nonce=225579211881198842005988698334675835446&oauth_signature=
|
150
|
+
assert_equal "key=value&oauth_consumer_key=consumer_key_86cad9&oauth_nonce=225579211881198842005988698334675835446&oauth_signature=26g7wHTtNO6ZWJaLltcueppHYiI%3d&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1199645624&oauth_token=token_411a7f&oauth_version=1.0", request.body.split("&").sort.join("&")
|
148
151
|
assert_equal nil, request['authorization']
|
149
152
|
end
|
150
153
|
|
@@ -164,7 +167,7 @@ class ConsumerTest < Test::Unit::TestCase
|
|
164
167
|
assert_equal "OAuth oauth_nonce=\"225579211881198842005988698334675835446\", oauth_signature_method=\"HMAC-SHA1\", oauth_token=\"token_411a7f\", oauth_timestamp=\"1199645624\", oauth_consumer_key=\"consumer_key_86cad9\", oauth_signature=\"26g7wHTtNO6ZWJaLltcueppHYiI%3D\", oauth_version=\"1.0\"".split(', ').sort, request['authorization'].split(', ').sort
|
165
168
|
end
|
166
169
|
|
167
|
-
def
|
170
|
+
def test_that_signing_post_params_works_2
|
168
171
|
request=@consumer.create_signed_request(:post,@request_uri.path,@token,{:scheme => 'body', :nonce => @nonce, :timestamp => @timestamp},@request_parameters,{})
|
169
172
|
|
170
173
|
assert_equal 'POST', request.method
|
@@ -319,10 +322,43 @@ class ConsumerTest < Test::Unit::TestCase
|
|
319
322
|
debug)
|
320
323
|
end
|
321
324
|
|
325
|
+
def test_post_with_body_stream
|
326
|
+
@consumer=OAuth::Consumer.new(
|
327
|
+
"key",
|
328
|
+
"secret",
|
329
|
+
{
|
330
|
+
:site=>"http://term.ie",
|
331
|
+
:request_token_path=>"/oauth/example/request_token.php",
|
332
|
+
:access_token_path=>"/oauth/example/access_token.php",
|
333
|
+
:authorize_path=>"/oauth/example/authorize.php"
|
334
|
+
})
|
335
|
+
|
336
|
+
|
337
|
+
@request_token=@consumer.get_request_token
|
338
|
+
@access_token=@request_token.get_access_token
|
339
|
+
|
340
|
+
request_body_string = "Hello, hello, hello"
|
341
|
+
request_body_stream = StringIO.new( request_body_string )
|
342
|
+
|
343
|
+
@response=@access_token.post("/oauth/example/echo_api.php",request_body_stream)
|
344
|
+
assert_not_nil @response
|
345
|
+
assert_equal "200",@response.code
|
346
|
+
|
347
|
+
request_body_file = File.open(__FILE__)
|
348
|
+
|
349
|
+
@response=@access_token.post("/oauth/example/echo_api.php",request_body_file)
|
350
|
+
assert_not_nil @response
|
351
|
+
assert_equal "200",@response.code
|
352
|
+
|
353
|
+
# unfortunately I don't know of a way to test that the body data was received correctly since the test server at http://term.ie
|
354
|
+
# echos back any non-oauth parameters but not the body. However, this does test that the request is still correctly signed
|
355
|
+
# (including the Content-Length header) and that the server received Content-Length bytes of body since it won't process the
|
356
|
+
# request & respond until the full body length is received.
|
357
|
+
end
|
358
|
+
|
322
359
|
protected
|
323
360
|
|
324
361
|
def request_parameters_to_s
|
325
362
|
@request_parameters.map { |k,v| "#{k}=#{v}" }.join("&")
|
326
363
|
end
|
327
|
-
|
328
364
|
end
|