mojodna-oauth 0.3.2.2 → 0.3.3
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +4 -1
- data/TODO +0 -1
- data/bin/oauth +1 -1
- data/lib/oauth/client/action_controller_request.rb +1 -0
- data/lib/oauth/client/helper.rb +9 -0
- data/lib/oauth/client/net_http.rb +16 -0
- data/lib/oauth/helper.rb +27 -7
- data/lib/oauth/request_proxy/action_controller_request.rb +2 -2
- data/lib/oauth/signature.rb +9 -0
- data/lib/oauth/tokens/request_token.rb +2 -2
- data/lib/oauth/version.rb +1 -1
- data/oauth.gemspec +3 -3
- data/test/test_net_http_client.rb +18 -0
- data/test/test_oauth_helper.rb +7 -0
- data/website/index.html +1 -1
- metadata +3 -2
data/History.txt
CHANGED
@@ -1,10 +1,13 @@
|
|
1
|
-
== 0.3.3
|
1
|
+
== 0.3.3 2009-05-04
|
2
2
|
|
3
3
|
* Corrected OAuth XMPP namespace (Seth)
|
4
4
|
* Improved error handling for invalid Authorization headers (Matt Sanford)
|
5
5
|
* Fixed signatures for non-ASCII under $KCODE other than 'u' (Matt Sanford)
|
6
6
|
* Fixed edge cases in ActionControllerRequestProxy where params were being
|
7
7
|
incorrectly signed (Marcos Wright Kuhns)
|
8
|
+
* Support for arguments in OAuth::Consumer#get_access_token (Matt Sanford)
|
9
|
+
* Add gem version to user-agent header (Matt Sanford)
|
10
|
+
* Handle input from aggressive form encoding libraries (Matt Wood)
|
8
11
|
|
9
12
|
== 0.3.2 2009-03-23
|
10
13
|
|
data/TODO
CHANGED
data/bin/oauth
CHANGED
@@ -34,6 +34,7 @@ module ActionController
|
|
34
34
|
return unless ActionController::TestRequest.use_oauth? && @oauth_options
|
35
35
|
|
36
36
|
@oauth_helper = OAuth::Client::Helper.new(self, @oauth_options.merge(:request_uri => request_uri))
|
37
|
+
@oauth_helper.amend_user_agent_header(env)
|
37
38
|
|
38
39
|
self.send("set_oauth_#{@oauth_options[:scheme]}")
|
39
40
|
end
|
data/lib/oauth/client/helper.rb
CHANGED
@@ -50,6 +50,15 @@ module OAuth::Client
|
|
50
50
|
:parameters => oauth_parameters}.merge(extra_options) )
|
51
51
|
end
|
52
52
|
|
53
|
+
def amend_user_agent_header(headers)
|
54
|
+
@oauth_ua_string ||= "OAuth gem v#{OAuth::VERSION}"
|
55
|
+
if headers['User-Agent']
|
56
|
+
headers['User-Agent'] += " (#{@oauth_ua_string})"
|
57
|
+
else
|
58
|
+
headers['User-Agent'] = @oauth_ua_string
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
53
62
|
def header
|
54
63
|
parameters = oauth_parameters
|
55
64
|
parameters.merge!('oauth_signature' => signature(options.merge(:parameters => parameters)))
|
@@ -7,6 +7,14 @@ class Net::HTTPRequest
|
|
7
7
|
|
8
8
|
attr_reader :oauth_helper
|
9
9
|
|
10
|
+
# Add the OAuth information to an HTTP request. Depending on the <tt>options[:scheme]</tt> setting
|
11
|
+
# this may add a header, additional query string parameters, or additional POST body parameters.
|
12
|
+
# The default scheme is +header+, in which the OAuth parameters as put into the +Authorization+
|
13
|
+
# header.
|
14
|
+
#
|
15
|
+
# This method also modifies the <tt>User-Agent</tt> header to add the OAuth gem version.
|
16
|
+
#
|
17
|
+
# See Also: {OAuth core spec version 1.0, section 5.4.1}[http://oauth.net/core/1.0#rfc.section.5.4.1]
|
10
18
|
def oauth!(http, consumer = nil, token = nil, options = {})
|
11
19
|
options = { :request_uri => oauth_full_request_uri(http),
|
12
20
|
:consumer => consumer,
|
@@ -17,9 +25,17 @@ class Net::HTTPRequest
|
|
17
25
|
:timestamp => nil }.merge(options)
|
18
26
|
|
19
27
|
@oauth_helper = OAuth::Client::Helper.new(self, options)
|
28
|
+
@oauth_helper.amend_user_agent_header(self)
|
20
29
|
self.send("set_oauth_#{options[:scheme]}")
|
21
30
|
end
|
22
31
|
|
32
|
+
# Create a string suitable for signing for an HTTP request. This process involves parameter
|
33
|
+
# normalization as specified in the OAuth specification. The exact normalization also depends
|
34
|
+
# on the <tt>options[:scheme]</tt> being used so this must match what will be used for the request
|
35
|
+
# itself. The default scheme is +header+, in which the OAuth parameters as put into the +Authorization+
|
36
|
+
# header.
|
37
|
+
#
|
38
|
+
# See Also: {OAuth core spec version 1.0, section 9.1.1}[http://oauth.net/core/1.0#rfc.section.9.1.1]
|
23
39
|
def signature_base_string(http, consumer = nil, token = nil, options = {})
|
24
40
|
options = { :request_uri => oauth_full_request_uri(http),
|
25
41
|
:consumer => consumer,
|
data/lib/oauth/helper.rb
CHANGED
@@ -5,20 +5,32 @@ module OAuth
|
|
5
5
|
module Helper
|
6
6
|
extend self
|
7
7
|
|
8
|
+
# Escape +value+ by URL encoding all non-reserved character.
|
9
|
+
#
|
10
|
+
# See Also: {OAuth core spec version 1.0, section 5.1}[http://oauth.net/core/1.0#rfc.section.5.1]
|
8
11
|
def escape(value)
|
9
12
|
URI::escape(value.to_s, OAuth::RESERVED_CHARACTERS)
|
10
13
|
end
|
11
14
|
|
15
|
+
# Generate a random key of up to +size+ bytes. The value returned is Base64 encoded with non-word
|
16
|
+
# characters removed.
|
12
17
|
def generate_key(size=32)
|
13
18
|
Base64.encode64(OpenSSL::Random.random_bytes(size)).gsub(/\W/, '')
|
14
19
|
end
|
15
20
|
|
16
21
|
alias_method :generate_nonce, :generate_key
|
17
22
|
|
18
|
-
def generate_timestamp
|
23
|
+
def generate_timestamp #:nodoc:
|
19
24
|
Time.now.to_i.to_s
|
20
25
|
end
|
21
26
|
|
27
|
+
# Normalize a +Hash+ of parameter values. Parameters are sorted by name, using lexicographical
|
28
|
+
# byte value ordering. If two or more parameters share the same name, they are sorted by their value.
|
29
|
+
# Parameters are concatenated in their sorted order into a single string. For each parameter, the name
|
30
|
+
# is separated from the corresponding value by an "=" character, even if the value is empty. Each
|
31
|
+
# name-value pair is separated by an "&" character.
|
32
|
+
#
|
33
|
+
# See Also: {OAuth core spec version 1.0, section 9.1.1}[http://oauth.net/core/1.0#rfc.section.9.1.1]
|
22
34
|
def normalize(params)
|
23
35
|
params.sort.map do |k, values|
|
24
36
|
|
@@ -33,7 +45,14 @@ module OAuth
|
|
33
45
|
end * "&"
|
34
46
|
end
|
35
47
|
|
36
|
-
# Parse an Authorization / WWW-Authenticate header into a hash
|
48
|
+
# Parse an Authorization / WWW-Authenticate header into a hash. Takes care of unescaping and
|
49
|
+
# removing surrounding quotes. Raises a OAuth::Problem if the header is not parsable into a
|
50
|
+
# valid hash. Does not validate the keys or values.
|
51
|
+
#
|
52
|
+
# hash = parse_header(headers['Authorization'] || headers['WWW-Authenticate'])
|
53
|
+
# hash['oauth_timestamp']
|
54
|
+
# #=>"1234567890"
|
55
|
+
#
|
37
56
|
def parse_header(header)
|
38
57
|
# decompose
|
39
58
|
params = header[6,header.length].split(/[,=]/)
|
@@ -41,11 +60,12 @@ module OAuth
|
|
41
60
|
# odd number of arguments - must be a malformed header.
|
42
61
|
raise OAuth::Problem.new("Invalid authorization header") if params.size % 2 != 0
|
43
62
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
63
|
+
params.map! do |v|
|
64
|
+
# strip and unescape
|
65
|
+
val = unescape(v.strip)
|
66
|
+
# strip quotes
|
67
|
+
val.sub(/^\"(.*)\"$/, '\1')
|
68
|
+
end
|
49
69
|
|
50
70
|
# convert into a Hash
|
51
71
|
Hash[*params.flatten]
|
@@ -42,9 +42,9 @@ module OAuth::RequestProxy
|
|
42
42
|
|
43
43
|
params.
|
44
44
|
join('&').split('&').
|
45
|
-
reject { |kv| kv =~ /^oauth_signature=.*/}.
|
46
45
|
reject(&:blank?).
|
47
|
-
map { |p| p.split('=').map{|esc| CGI.unescape(esc)} }
|
46
|
+
map { |p| p.split('=').map{|esc| CGI.unescape(esc)} }.
|
47
|
+
reject { |kv| kv =~ /^oauth_signature=.*/}
|
48
48
|
end
|
49
49
|
|
50
50
|
protected
|
data/lib/oauth/signature.rb
CHANGED
@@ -1,9 +1,13 @@
|
|
1
1
|
module OAuth
|
2
2
|
module Signature
|
3
|
+
# Returns a list of available signature methods
|
3
4
|
def self.available_methods
|
4
5
|
@available_methods ||= {}
|
5
6
|
end
|
6
7
|
|
8
|
+
# Build a signature from a +request+.
|
9
|
+
#
|
10
|
+
# Raises UnknownSignatureMethod exception if the signature method is unknown.
|
7
11
|
def self.build(request, options = {}, &block)
|
8
12
|
request = OAuth::RequestProxy.proxy(request, options)
|
9
13
|
klass = available_methods[(request.signature_method || "").downcase]
|
@@ -11,14 +15,19 @@ module OAuth
|
|
11
15
|
klass.new(request, options, &block)
|
12
16
|
end
|
13
17
|
|
18
|
+
# Sign a +request+
|
14
19
|
def self.sign(request, options = {}, &block)
|
15
20
|
self.build(request, options, &block).signature
|
16
21
|
end
|
17
22
|
|
23
|
+
# Verify the signature of +request+
|
18
24
|
def self.verify(request, options = {}, &block)
|
19
25
|
self.build(request, options, &block).verify
|
20
26
|
end
|
21
27
|
|
28
|
+
# Create the signature base string for +request+. This string is the normalized parameter information.
|
29
|
+
#
|
30
|
+
# See Also: {OAuth core spec version 1.0, section 9.1.1}[http://oauth.net/core/1.0#rfc.section.9.1.1]
|
22
31
|
def self.signature_base_string(request, options = {}, &block)
|
23
32
|
self.build(request, options, &block).signature_base_string
|
24
33
|
end
|
@@ -10,8 +10,8 @@ module OAuth
|
|
10
10
|
end
|
11
11
|
|
12
12
|
# exchange for AccessToken on server
|
13
|
-
def get_access_token(options = {})
|
14
|
-
response = consumer.token_request(consumer.http_method, (consumer.access_token_url? ? consumer.access_token_url : consumer.access_token_path), self, options)
|
13
|
+
def get_access_token(options = {}, *arguments)
|
14
|
+
response = consumer.token_request(consumer.http_method, (consumer.access_token_url? ? consumer.access_token_url : consumer.access_token_path), self, options, *arguments)
|
15
15
|
OAuth::AccessToken.from_hash(consumer, response)
|
16
16
|
end
|
17
17
|
|
data/lib/oauth/version.rb
CHANGED
data/oauth.gemspec
CHANGED
@@ -2,11 +2,11 @@
|
|
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.3"
|
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-05-04}
|
10
10
|
s.default_executable = %q{oauth}
|
11
11
|
s.description = %q{OAuth Core Ruby implementation}
|
12
12
|
s.email = %q{oauth-ruby@googlegroups.com}
|
@@ -1,5 +1,6 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/test_helper.rb'
|
2
2
|
require 'oauth/client/net_http'
|
3
|
+
require 'oauth/version'
|
3
4
|
|
4
5
|
class NetHTTPClientTest < Test::Unit::TestCase
|
5
6
|
|
@@ -33,6 +34,23 @@ class NetHTTPClientTest < Test::Unit::TestCase
|
|
33
34
|
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
|
34
35
|
end
|
35
36
|
|
37
|
+
def test_that_version_is_added_to_existing_user_agent
|
38
|
+
request = Net::HTTP::Post.new(@request_uri.path)
|
39
|
+
request['User-Agent'] = "MyApp"
|
40
|
+
request.set_form_data( @request_parameters )
|
41
|
+
request.oauth!(@http, @consumer, @token, {:nonce => @nonce, :timestamp => @timestamp})
|
42
|
+
|
43
|
+
assert_equal "MyApp (OAuth gem v#{OAuth::VERSION})", request['User-Agent']
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_that_version_is_set_when_no_user_agent
|
47
|
+
request = Net::HTTP::Post.new(@request_uri.path)
|
48
|
+
request.set_form_data( @request_parameters )
|
49
|
+
request.oauth!(@http, @consumer, @token, {:nonce => @nonce, :timestamp => @timestamp})
|
50
|
+
|
51
|
+
assert_equal "OAuth gem v#{OAuth::VERSION}", request['User-Agent']
|
52
|
+
end
|
53
|
+
|
36
54
|
def test_that_using_get_params_works
|
37
55
|
request = Net::HTTP::Get.new(@request_uri.path + "?" + request_parameters_to_s)
|
38
56
|
request.oauth!(@http, @consumer, @token, {:scheme => 'query_string', :nonce => @nonce, :timestamp => @timestamp})
|
data/test/test_oauth_helper.rb
CHANGED
@@ -16,6 +16,13 @@ class TestOAuthHelper < Test::Unit::TestCase
|
|
16
16
|
params = OAuth::Helper.parse_header(header)
|
17
17
|
|
18
18
|
assert_equal "http://example.com/method", params['realm']
|
19
|
+
assert_equal "vince_clortho", params['oauth_consumer_key']
|
20
|
+
assert_equal "token_value", params['oauth_token']
|
21
|
+
assert_equal "HMAC-SHA1", params['oauth_signature_method']
|
22
|
+
assert_equal "signature_here", params['oauth_signature']
|
23
|
+
assert_equal "1240004133", params['oauth_timestamp']
|
24
|
+
assert_equal "nonce", params['oauth_nonce']
|
25
|
+
assert_equal "1.0", params['oauth_version']
|
19
26
|
end
|
20
27
|
|
21
28
|
def test_parse_header_ill_formed
|
data/website/index.html
CHANGED
@@ -33,7 +33,7 @@
|
|
33
33
|
<h1>Ruby OAuth GEM</h1>
|
34
34
|
<div id="version" class="clickable" onclick='document.location = "http://rubyforge.org/projects/oauth"; return false'>
|
35
35
|
<p>Get Version</p>
|
36
|
-
<a href="http://rubyforge.org/projects/oauth" class="numbers">0.3.
|
36
|
+
<a href="http://rubyforge.org/projects/oauth" class="numbers">0.3.3</a>
|
37
37
|
</div>
|
38
38
|
<h2>What</h2>
|
39
39
|
<p>This is a RubyGem for implementing both OAuth clients and servers in Ruby applications.</p>
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mojodna-oauth
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Pelle Braendgaard
|
@@ -10,11 +10,12 @@ authors:
|
|
10
10
|
- Jesse Clark
|
11
11
|
- Jon Crosby
|
12
12
|
- Seth Fitzsimmons
|
13
|
+
- Matt Sanford
|
13
14
|
autorequire:
|
14
15
|
bindir: bin
|
15
16
|
cert_chain: []
|
16
17
|
|
17
|
-
date: 2009-
|
18
|
+
date: 2009-05-04 00:00:00 -07:00
|
18
19
|
default_executable: oauth
|
19
20
|
dependencies:
|
20
21
|
- !ruby/object:Gem::Dependency
|