simple_oauth 0.1.2 → 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -1,3 +1,5 @@
1
+ *.rbc
2
+ .DS_Store
1
3
  .bundle
2
4
  coverage
3
5
  pkg
data/Gemfile.lock CHANGED
@@ -1,12 +1,12 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- simple_oauth (0.1.2)
4
+ simple_oauth (0.1.3)
5
5
 
6
6
  GEM
7
7
  remote: http://rubygems.org/
8
8
  specs:
9
- mocha (0.9.9)
9
+ mocha (0.9.10)
10
10
  rake
11
11
  rake (0.8.7)
12
12
 
data/Rakefile CHANGED
@@ -14,6 +14,7 @@ end
14
14
  task :default => :test
15
15
 
16
16
  Rake::RDocTask.new do |rdoc|
17
+ require File.expand_path('../lib/simple_oauth/version', __FILE__)
17
18
  version = SimpleOAuth::Version::STRING
18
19
  rdoc.rdoc_dir = 'rdoc'
19
20
  rdoc.title = "simple_oauth #{version}"
data/lib/simple_oauth.rb CHANGED
@@ -2,120 +2,5 @@ require 'base64'
2
2
  require 'cgi'
3
3
  require 'openssl'
4
4
  require 'uri'
5
-
6
- module SimpleOAuth
7
- module Version
8
- MAJOR = 0
9
- MINOR = 1
10
- PATCH = 2
11
- STRING = [MAJOR, MINOR, PATCH].join('.')
12
- end
13
-
14
- class Header
15
- ATTRIBUTE_KEYS = [:consumer_key, :nonce, :signature_method, :timestamp, :token, :version]
16
-
17
- def self.default_options
18
- {
19
- :nonce => OpenSSL::Random.random_bytes(16).unpack('H*')[0],
20
- :signature_method => 'HMAC-SHA1',
21
- :timestamp => Time.now.to_i.to_s,
22
- :version => '1.0'
23
- }
24
- end
25
-
26
- def self.encode(value)
27
- URI.encode(value.to_s, /[^a-z0-9\-\.\_\~]/i)
28
- end
29
-
30
- def self.decode(value)
31
- URI.decode(value.to_s)
32
- end
33
-
34
- def self.parse(header)
35
- header.to_s.sub(/^OAuth\s/, '').split(', ').inject({}) do |attributes, pair|
36
- match = pair.match(/^(\w+)\=\"([^\"]*)\"$/)
37
- attributes.merge(match[1].sub(/^oauth_/, '').to_sym => decode(match[2]))
38
- end
39
- end
40
-
41
- attr_reader :method, :params, :options
42
-
43
- def initialize(method, url, params, oauth = {})
44
- @method = method.to_s.upcase
45
- @uri = URI.parse(url).tap do |uri|
46
- uri.scheme = uri.scheme.downcase
47
- uri.normalize!
48
- uri.fragment = nil
49
- end
50
- @params = params
51
- @options = oauth.is_a?(Hash) ? self.class.default_options.merge(oauth) : self.class.parse(oauth)
52
- end
53
-
54
- def url
55
- @uri.dup.tap{|u| u.query = nil }.to_s
56
- end
57
-
58
- def to_s
59
- "OAuth #{normalized_attributes}"
60
- end
61
-
62
- def valid?(secrets = {})
63
- original_options = options.dup
64
- options.merge!(secrets)
65
- valid = options[:signature] == signature
66
- options.replace(original_options)
67
- valid
68
- end
69
-
70
- def signed_attributes
71
- attributes.merge(:oauth_signature => signature)
72
- end
73
-
74
- private
75
- def normalized_attributes
76
- signed_attributes.sort_by{|k,v| k.to_s }.map{|k,v| %(#{k}="#{self.class.encode(v)}") }.join(', ')
77
- end
78
-
79
- def attributes
80
- ATTRIBUTE_KEYS.inject({}){|a,k| options.key?(k) ? a.merge(:"oauth_#{k}" => options[k]) : a }
81
- end
82
-
83
- def signature
84
- send(options[:signature_method].downcase.tr('-', '_') + '_signature')
85
- end
86
-
87
- def hmac_sha1_signature
88
- Base64.encode64(OpenSSL::HMAC.digest(OpenSSL::Digest::SHA1.new, secret, signature_base)).chomp.gsub(/\n/, '')
89
- end
90
-
91
- def secret
92
- options.values_at(:consumer_secret, :token_secret).map{|v| self.class.encode(v) }.join('&')
93
- end
94
-
95
- def signature_base
96
- [method, url, normalized_params].map{|v| self.class.encode(v) }.join('&')
97
- end
98
-
99
- def normalized_params
100
- signature_params.map{|p| p.map{|v| self.class.encode(v) } }.sort.map{|p| p.join('=') }.join('&')
101
- end
102
-
103
- def signature_params
104
- attributes.to_a + params.to_a + url_params
105
- end
106
-
107
- def url_params
108
- CGI.parse(@uri.query || '').inject([]){|p,(k,vs)| p + vs.map{|v| [k, v] } }
109
- end
110
-
111
- def rsa_sha1_signature
112
- Base64.encode64(private_key.sign(OpenSSL::Digest::SHA1.new, signature_base)).chomp.gsub(/\n/, '')
113
- end
114
-
115
- def private_key
116
- OpenSSL::PKey::RSA.new(options[:consumer_secret])
117
- end
118
-
119
- alias_method :plaintext_signature, :secret
120
- end
121
- end
5
+ require File.expand_path('../simple_oauth/core_ext/object', __FILE__)
6
+ require File.expand_path('../simple_oauth/header', __FILE__)
@@ -0,0 +1,10 @@
1
+ major, minor, patch = RUBY_VERSION.split('.')
2
+
3
+ if major.to_i == 1 && minor.to_i < 9
4
+ class Object
5
+ def tap
6
+ yield self
7
+ self
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,110 @@
1
+ module SimpleOAuth
2
+ class Header
3
+ ATTRIBUTE_KEYS = [:consumer_key, :nonce, :signature_method, :timestamp, :token, :version] unless defined? ::SimpleOAuth::Header::ATTRIBUTE_KEYS
4
+
5
+ def self.default_options
6
+ {
7
+ :nonce => OpenSSL::Random.random_bytes(16).unpack('H*')[0],
8
+ :signature_method => 'HMAC-SHA1',
9
+ :timestamp => Time.now.to_i.to_s,
10
+ :version => '1.0'
11
+ }
12
+ end
13
+
14
+ def self.encode(value)
15
+ URI.encode(value.to_s, /[^a-z0-9\-\.\_\~]/i)
16
+ end
17
+
18
+ def self.decode(value)
19
+ URI.decode(value.to_s)
20
+ end
21
+
22
+ def self.parse(header)
23
+ header.to_s.sub(/^OAuth\s/, '').split(', ').inject({}) do |attributes, pair|
24
+ match = pair.match(/^(\w+)\=\"([^\"]*)\"$/)
25
+ attributes.merge(match[1].sub(/^oauth_/, '').to_sym => decode(match[2]))
26
+ end
27
+ end
28
+
29
+ attr_reader :method, :params, :options
30
+
31
+ def initialize(method, url, params, oauth = {})
32
+ @method = method.to_s.upcase
33
+ @uri = URI.parse(url).tap do |uri|
34
+ uri.scheme = uri.scheme.downcase
35
+ uri.normalize!
36
+ uri.fragment = nil
37
+ end
38
+ @params = params
39
+ @options = oauth.is_a?(Hash) ? self.class.default_options.merge(oauth) : self.class.parse(oauth)
40
+ end
41
+
42
+ def url
43
+ @uri.dup.tap{|u| u.query = nil }.to_s
44
+ end
45
+
46
+ def to_s
47
+ "OAuth #{normalized_attributes}"
48
+ end
49
+
50
+ def valid?(secrets = {})
51
+ original_options = options.dup
52
+ options.merge!(secrets)
53
+ valid = options[:signature] == signature
54
+ options.replace(original_options)
55
+ valid
56
+ end
57
+
58
+ def signed_attributes
59
+ attributes.merge(:oauth_signature => signature)
60
+ end
61
+
62
+ private
63
+
64
+ def normalized_attributes
65
+ signed_attributes.sort_by{|k,v| k.to_s }.map{|k,v| %(#{k}="#{self.class.encode(v)}") }.join(', ')
66
+ end
67
+
68
+ def attributes
69
+ ATTRIBUTE_KEYS.inject({}){|a,k| options.key?(k) ? a.merge(:"oauth_#{k}" => options[k]) : a }
70
+ end
71
+
72
+ def signature
73
+ send(options[:signature_method].downcase.tr('-', '_') + '_signature')
74
+ end
75
+
76
+ def hmac_sha1_signature
77
+ Base64.encode64(OpenSSL::HMAC.digest(OpenSSL::Digest::SHA1.new, secret, signature_base)).chomp.gsub(/\n/, '')
78
+ end
79
+
80
+ def secret
81
+ options.values_at(:consumer_secret, :token_secret).map{|v| self.class.encode(v) }.join('&')
82
+ end
83
+ alias_method :plaintext_signature, :secret
84
+
85
+ def signature_base
86
+ [method, url, normalized_params].map{|v| self.class.encode(v) }.join('&')
87
+ end
88
+
89
+ def normalized_params
90
+ signature_params.map{|p| p.map{|v| self.class.encode(v) } }.sort.map{|p| p.join('=') }.join('&')
91
+ end
92
+
93
+ def signature_params
94
+ attributes.to_a + params.to_a + url_params
95
+ end
96
+
97
+ def url_params
98
+ CGI.parse(@uri.query || '').inject([]){|p,(k,vs)| p + vs.map{|v| [k, v] } }
99
+ end
100
+
101
+ def rsa_sha1_signature
102
+ Base64.encode64(private_key.sign(OpenSSL::Digest::SHA1.new, signature_base)).chomp.gsub(/\n/, '')
103
+ end
104
+
105
+ def private_key
106
+ OpenSSL::PKey::RSA.new(options[:consumer_secret])
107
+ end
108
+
109
+ end
110
+ end
@@ -0,0 +1,8 @@
1
+ module SimpleOAuth
2
+ module Version
3
+ MAJOR = 0 unless defined? ::SimpleOAuth::Version::MAJOR
4
+ MINOR = 1 unless defined? ::SimpleOAuth::Version::MINOR
5
+ PATCH = 3 unless defined? ::SimpleOAuth::Version::PATCH
6
+ STRING = [MAJOR, MINOR, PATCH].join('.') unless defined? ::SimpleOAuth::Version::STRING
7
+ end
8
+ end
data/simple_oauth.gemspec CHANGED
@@ -1,5 +1,5 @@
1
1
  # -*- encoding: utf-8 -*-
2
- require File.expand_path('../lib/simple_oauth', __FILE__)
2
+ require File.expand_path('../lib/simple_oauth/version', __FILE__)
3
3
 
4
4
  Gem::Specification.new do |spec|
5
5
  spec.add_development_dependency('mocha', '>= 0')
@@ -11,9 +11,8 @@ Gem::Specification.new do |spec|
11
11
  spec.homepage = 'http://github.com/laserlemon/simple_oauth'
12
12
  spec.name = 'simple_oauth'
13
13
  spec.rdoc_options = ['--charset=UTF-8']
14
- spec.required_ruby_version = '>= 1.8.7'
15
- spec.required_rubygems_version = '>= 1.2.0'
16
- spec.summary = 'Simply builds and verifies OAuth headers'
14
+ spec.required_rubygems_version = Gem::Requirement.new('>= 1.3.6') if spec.respond_to? :required_rubygems_version=
15
+ spec.summary = spec.description
17
16
  spec.test_files = `git ls-files -- test/**/*_test.rb`.split("\n")
18
17
  spec.version = SimpleOAuth::Version::STRING
19
18
  end
@@ -1,3 +1,4 @@
1
+ # -*- encoding: utf-8 -*-
1
2
  require 'helper'
2
3
 
3
4
  class SimpleOAuthTest < Test::Unit::TestCase
@@ -236,7 +237,7 @@ class SimpleOAuthTest < Test::Unit::TestCase
236
237
 
237
238
  # The signature parameters should be sorted and the keys/values URL encoded
238
239
  # first.
239
- assert_equal signature_params.sort_by(&:to_s), pairs.map{|k,v| [URI.decode(k), URI.decode(v)] }
240
+ assert_equal signature_params.sort_by{|p| p.to_s}, pairs.map{|k, v| [URI.decode(k), URI.decode(v)]}
240
241
  end
241
242
 
242
243
  def test_signature_params
@@ -249,8 +250,8 @@ class SimpleOAuthTest < Test::Unit::TestCase
249
250
  # parameters into an array of key value pairs.
250
251
  signature_params = header.send(:signature_params)
251
252
  assert_kind_of Array, signature_params
252
- assert_equal [:attribute, 'param', 'url_param', 'url_param'], signature_params.map(&:first)
253
- assert_equal ['ATTRIBUTE', 'PARAM', '1', '2'], signature_params.map(&:last)
253
+ assert_equal [:attribute, 'param', 'url_param', 'url_param'], signature_params.map{|p| p.first}
254
+ assert_equal ['ATTRIBUTE', 'PARAM', '1', '2'], signature_params.map{|p| p.last}
254
255
  end
255
256
 
256
257
  def test_url_params
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: simple_oauth
3
3
  version: !ruby/object:Gem::Version
4
- hash: 31
4
+ hash: 29
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 1
9
- - 2
10
- version: 0.1.2
9
+ - 3
10
+ version: 0.1.3
11
11
  platform: ruby
12
12
  authors:
13
13
  - Steve Richert
@@ -15,12 +15,10 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-11-15 00:00:00 -08:00
18
+ date: 2010-11-30 00:00:00 -08:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
22
- name: mocha
23
- prerelease: false
24
22
  requirement: &id001 !ruby/object:Gem::Requirement
25
23
  none: false
26
24
  requirements:
@@ -31,6 +29,8 @@ dependencies:
31
29
  - 0
32
30
  version: "0"
33
31
  type: :development
32
+ name: mocha
33
+ prerelease: false
34
34
  version_requirements: *id001
35
35
  description: Simply builds and verifies OAuth headers
36
36
  email: steve.richert@gmail.com
@@ -50,6 +50,9 @@ files:
50
50
  - VERSION
51
51
  - init.rb
52
52
  - lib/simple_oauth.rb
53
+ - lib/simple_oauth/core_ext/object.rb
54
+ - lib/simple_oauth/header.rb
55
+ - lib/simple_oauth/version.rb
53
56
  - simple_oauth.gemspec
54
57
  - test/helper.rb
55
58
  - test/rsa_private_key
@@ -68,23 +71,21 @@ required_ruby_version: !ruby/object:Gem::Requirement
68
71
  requirements:
69
72
  - - ">="
70
73
  - !ruby/object:Gem::Version
71
- hash: 57
74
+ hash: 3
72
75
  segments:
73
- - 1
74
- - 8
75
- - 7
76
- version: 1.8.7
76
+ - 0
77
+ version: "0"
77
78
  required_rubygems_version: !ruby/object:Gem::Requirement
78
79
  none: false
79
80
  requirements:
80
81
  - - ">="
81
82
  - !ruby/object:Gem::Version
82
- hash: 31
83
+ hash: 23
83
84
  segments:
84
85
  - 1
85
- - 2
86
- - 0
87
- version: 1.2.0
86
+ - 3
87
+ - 6
88
+ version: 1.3.6
88
89
  requirements: []
89
90
 
90
91
  rubyforge_project: