oauth-simple 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Binary file
@@ -0,0 +1,3 @@
1
+ === 0.0.1 / 2009-04-23:
2
+
3
+ * First Gem build
@@ -0,0 +1,14 @@
1
+ History.txt
2
+ README.txt
3
+ Manifest.txt
4
+ Rakefile
5
+ TODO
6
+ lib/oauth-simple.rb
7
+ lib/oauth-simple/consumer.rb
8
+ lib/oauth-simple/http_client.rb
9
+ lib/oauth-simple/request.rb
10
+ lib/oauth-simple/signature_method.rb
11
+ lib/oauth-simple/signature_method_hmac_sha1.rb
12
+ lib/oauth-simple/signature_method_plaintext.rb
13
+ lib/oauth-simple/token.rb
14
+ lib/oauth-simple/version.rb
@@ -0,0 +1,48 @@
1
+ = oauth-simple
2
+
3
+ * FIX (url)
4
+
5
+ == DESCRIPTION:
6
+
7
+ oauth-simple is a simpler OAuth implementation for Ruby, based on the Python version (http://oauth.googlecode.com/svn/code/python/oauth/)
8
+
9
+ == FEATURES/PROBLEMS:
10
+
11
+ * Only consumers are supported
12
+
13
+ == SYNOPSIS:
14
+
15
+ FIX (code sample of usage)
16
+
17
+ == REQUIREMENTS:
18
+
19
+ * ruby-hmac if on before 1.9
20
+
21
+ == INSTALL:
22
+
23
+ * sudo gem install oauth-simple
24
+
25
+ == LICENSE:
26
+
27
+ (The MIT License)
28
+
29
+ Copyright (c) 2009 FIX
30
+
31
+ Permission is hereby granted, free of charge, to any person obtaining
32
+ a copy of this software and associated documentation files (the
33
+ 'Software'), to deal in the Software without restriction, including
34
+ without limitation the rights to use, copy, modify, merge, publish,
35
+ distribute, sublicense, and/or sell copies of the Software, and to
36
+ permit persons to whom the Software is furnished to do so, subject to
37
+ the following conditions:
38
+
39
+ The above copyright notice and this permission notice shall be
40
+ included in all copies or substantial portions of the Software.
41
+
42
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
43
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
44
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
45
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
46
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
47
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
48
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,28 @@
1
+ require 'rake/testtask'
2
+ require 'hoe'
3
+ require 'lib/oauth-simple'
4
+ Rake::TestTask.new do |t|
5
+ t.libs << "test"
6
+ t.test_files = FileList['test/test*.rb']
7
+ t.verbose = true
8
+ end
9
+
10
+ task :clobber_package do
11
+ `rm -fr pkg/*`
12
+ end
13
+
14
+ Hoe.new('oauth-simple', OAuthSimple::VERSION) do |h|
15
+ h.author = ['Marius Mathiesen']
16
+ h.email = 'marius.mathiesen@gmail.com'
17
+ h.description = 'Simple OAuth implementation'
18
+ h.summary = h.description
19
+ h.rubyforge_name = h.name
20
+ h.url = 'http://oauth-simple.rubyforge.org/'
21
+ if RUBY_VERSION < '1.9'
22
+ h.extra_deps << [
23
+ ['ruby-hmac', '>= 0.3.1']
24
+ ]
25
+ end
26
+ end
27
+
28
+ task :default => [:test]
data/TODO ADDED
@@ -0,0 +1,24 @@
1
+ Reality check:
2
+ ✓ hente ut access token
3
+ ✓ hente url fra denne
4
+ ✓ besøke urlen
5
+ ✓ hente access key
6
+
7
+
8
+ Next step:
9
+ ✓ teste signature base string sammenlignet online suites
10
+ ✓ Move into namespace
11
+ ✓ Teste med forskjellige siter:
12
+ ✓ agree2.com
13
+ ✓ plone
14
+ ✓ twitter
15
+ ✓ Finne ut av hvordan å støtte porter
16
+ ✓ Ruby 1.8
17
+ ✓ Move CGI.escape into module method
18
+ ✓ støtte for andre signeringsalgoritmer
19
+ - støtte for schemes
20
+ - flytte http-stash inn på riktig sted, respektere scheme
21
+ - samme API som for oauth-gemmen
22
+ ✓ registrere prosjekt på Rubyforge
23
+ - sjekke ut støtte for asynk http (hvordan skal vi i det hele tatt gjøre dette?)
24
+ - Legge ut på Rubyforge
@@ -0,0 +1,43 @@
1
+ # The MIT License
2
+ #
3
+ # Copyright (c) 2009 Marius Mathiesen <marius.mathiesen@gmail.com>
4
+ #
5
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ # of this software and associated documentation files (the "Software"), to deal
7
+ # in the Software without restriction, including without limitation the rights
8
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ # copies of the Software, and to permit persons to whom the Software is
10
+ # furnished to do so, subject to the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be included in
13
+ # all copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ # THE SOFTWARE.
22
+ require 'cgi'
23
+ require 'uri'
24
+ require 'openssl'
25
+ $:.unshift(File.dirname(__FILE__))
26
+ if RUBY_VERSION <= "1.9"
27
+ require 'rubygems'
28
+ require 'hmac'
29
+ require 'hmac-sha1'
30
+ else
31
+ require 'digest/hmac'
32
+ end
33
+
34
+ require 'oauth-simple/version'
35
+ require 'oauth-simple/consumer'
36
+ require 'oauth-simple/request'
37
+ require 'oauth-simple/http_client'
38
+ require 'oauth-simple/token'
39
+ require 'oauth-simple/signature_method'
40
+ require 'oauth-simple/signature_method_hmac_sha1'
41
+ require 'oauth-simple/signature_method_plaintext'
42
+
43
+
@@ -0,0 +1,91 @@
1
+ # The MIT License
2
+ #
3
+ # Copyright (c) 2009 Marius Mathiesen <marius.mathiesen@gmail.com>
4
+ #
5
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ # of this software and associated documentation files (the "Software"), to deal
7
+ # in the Software without restriction, including without limitation the rights
8
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ # copies of the Software, and to permit persons to whom the Software is
10
+ # furnished to do so, subject to the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be included in
13
+ # all copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ # THE SOFTWARE.
22
+ module OAuthSimple
23
+ class Consumer
24
+ attr_reader :key, :secret
25
+ def initialize(key, secret, options = {})
26
+ @key = key
27
+ @secret = secret
28
+ @options = self.class.default_options.merge(options)
29
+ end
30
+
31
+ # Default options, can be overridden in the initializer's options hash
32
+ def self.default_options
33
+ {
34
+ :scheme => :header,
35
+ :authorize_path => '/oauth/authorize',
36
+ :access_token_path => '/oauth/access_token',
37
+ :request_token_path => '/oauth/request_token',
38
+ :signature_method => 'HMAC-SHA1'
39
+ }
40
+ end
41
+
42
+ def site
43
+ @options[:site]
44
+ end
45
+
46
+ def scheme
47
+ @options[:scheme]
48
+ end
49
+
50
+ def authorize_path
51
+ @options[:authorize_path]
52
+ end
53
+
54
+ def access_token_path
55
+ @options[:access_token_path]
56
+ end
57
+
58
+ def request_token_path
59
+ @options[:request_token_path]
60
+ end
61
+
62
+ def http
63
+ HttpClient.new
64
+ end
65
+
66
+ def signature_method
67
+ SignatureMethod.by_name(@options[:signature_method])
68
+ end
69
+
70
+ def get_request_token
71
+ r = Request.from_consumer_and_token(self, nil, request_token_url)
72
+ r.sign_request(signature_method)
73
+ response = http.get(request_token_url, r.to_header)
74
+ result = Token.from_string(response)
75
+ result.consumer = self
76
+ return result
77
+ end
78
+
79
+ def request_token_url
80
+ @options[:request_token_url] || File.join(site, request_token_path)
81
+ end
82
+
83
+ def access_token_url
84
+ @options[:access_token_url] || File.join(site, access_token_path)
85
+ end
86
+
87
+ def authorize_url
88
+ @options[:authorize_url] || File.join(site, authorize_path)
89
+ end
90
+ end
91
+ end
@@ -0,0 +1,31 @@
1
+ # The MIT License
2
+ #
3
+ # Copyright (c) 2009 Marius Mathiesen <marius.mathiesen@gmail.com>
4
+ #
5
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ # of this software and associated documentation files (the "Software"), to deal
7
+ # in the Software without restriction, including without limitation the rights
8
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ # copies of the Software, and to permit persons to whom the Software is
10
+ # furnished to do so, subject to the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be included in
13
+ # all copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ # THE SOFTWARE.
22
+
23
+ # A simplistic client that performs HTTP operations
24
+ require 'open-uri'
25
+ module OAuthSimple
26
+ class HttpClient
27
+ def get(url, headers)
28
+ open(url, 'r', headers).read
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,138 @@
1
+ # The MIT License
2
+ #
3
+ # Copyright (c) 2009 Marius Mathiesen <marius.mathiesen@gmail.com>
4
+ #
5
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ # of this software and associated documentation files (the "Software"), to deal
7
+ # in the Software without restriction, including without limitation the rights
8
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ # copies of the Software, and to permit persons to whom the Software is
10
+ # furnished to do so, subject to the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be included in
13
+ # all copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ # THE SOFTWARE.
22
+ module OAuthSimple
23
+ class Request
24
+ VERSION = "1.0"
25
+ attr_accessor :consumer
26
+ def initialize(options={})
27
+ @http_method = options[:http_method] || :GET
28
+ @http_url = options[:http_url]
29
+ @parameters = options[:parameters] || {}
30
+ end
31
+
32
+ # Builds a request from a consumer and (optionally) a token
33
+ def self.from_consumer_and_token(consumer, token, url, options = {})
34
+ defaults = {
35
+ 'oauth_consumer_key' => consumer.key,
36
+ 'oauth_timestamp' => generate_timestamp,
37
+ 'oauth_nonce' => generate_nonce,
38
+ 'oauth_version' => VERSION
39
+ }
40
+ options.merge!(defaults)
41
+ instance = new(:http_url => url, :parameters => options)
42
+ instance.set_parameter('oauth_token', token.key) if token
43
+ instance.consumer = consumer
44
+ return instance
45
+ end
46
+
47
+
48
+ def set_parameter(k, v)
49
+ @parameters[k] = v
50
+ end
51
+
52
+ def get_parameter(k)
53
+ @parameters[k]
54
+ end
55
+
56
+ def get_nonoauth_parameters
57
+ @parameters.reject{|k,v| k =~ /^oauth_.*/}
58
+ end
59
+
60
+ def to_header(realm=nil)
61
+ auth_header = "OAuth "
62
+ pairs = []
63
+ pairs << "realm=#{realm}"
64
+ @parameters.sort.each do |k, v|
65
+ if k =~ /^oauth_/
66
+ pairs << "#{k}=#{CGI.escape(v)}"
67
+ end
68
+ end
69
+ auth_header << pairs.join(", ")
70
+ return {"Authorization" => auth_header}
71
+ end
72
+
73
+ def postdata_hash
74
+ result = {}
75
+ @parameters.sort.each do |k,v|
76
+ result[k] = v
77
+ end
78
+ result
79
+ end
80
+
81
+ def to_postdata
82
+ result = []
83
+ @parameters.sort.each do |key, value|
84
+ result << "#{CGI.escape(key)}=#{CGI.escape(value)}"
85
+ end
86
+ return result.join("&")
87
+ end
88
+
89
+ def to_url
90
+ return "#{get_normalized_http_url}?#{to_postdata}"
91
+ end
92
+
93
+ def get_normalized_http_url
94
+ parts = URI.parse(@http_url)
95
+ if parts.port == 80
96
+ return "#{parts.scheme}://#{parts.host}#{parts.path}"
97
+ else
98
+ return "#{parts.scheme}://#{parts.host}:#{parts.port}#{parts.path}"
99
+ end
100
+ end
101
+
102
+ def get_normalized_http_method
103
+ return @http_method.to_s.upcase
104
+ end
105
+
106
+ def get_normalized_parameters
107
+ @parameters.sort.map do |k, values|
108
+ if values.is_a?(Array)
109
+ # multiple values were provided for a single key
110
+ values.sort.collect do |v|
111
+ [CGI.escape(k),CGI.escape(v)] * "="
112
+ end
113
+ else
114
+ [CGI.escape(k),CGI.escape(values)] * "="
115
+ end
116
+ end * "&"
117
+ end
118
+
119
+ def self.generate_timestamp
120
+ return Time.now.to_i.to_s
121
+ end
122
+
123
+ def self.generate_nonce(size=32)
124
+ bytes = OpenSSL::Random.random_bytes(size)
125
+ [bytes].pack('m').gsub(/\W/,'')
126
+ end
127
+
128
+ def sign_request(signature_klass, token=nil)
129
+ raise "Consumer is nothing" if @consumer.nil?
130
+ set_parameter('oauth_signature_method', signature_klass.oauth_name)
131
+ set_parameter('oauth_signature', build_signature(signature_klass, token))
132
+ end
133
+
134
+ def build_signature(signature_klass, token=nil)
135
+ return signature_klass.build_signature(self, consumer, token)
136
+ end
137
+ end
138
+ end
@@ -0,0 +1,31 @@
1
+ # The MIT License
2
+ #
3
+ # Copyright (c) 2009 Marius Mathiesen <marius.mathiesen@gmail.com>
4
+ #
5
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ # of this software and associated documentation files (the "Software"), to deal
7
+ # in the Software without restriction, including without limitation the rights
8
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ # copies of the Software, and to permit persons to whom the Software is
10
+ # furnished to do so, subject to the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be included in
13
+ # all copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ # THE SOFTWARE.
22
+ module OAuthSimple
23
+ class SignatureMethod
24
+ def self.by_name(name)
25
+ {
26
+ 'HMAC-SHA1' => SignatureMethodHMACSHA1,
27
+ 'PLAINTEXT' => SignatureMethodPlaintext
28
+ }[name.to_s]
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,54 @@
1
+ # The MIT License
2
+ #
3
+ # Copyright (c) 2009 Marius Mathiesen <marius.mathiesen@gmail.com>
4
+ #
5
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ # of this software and associated documentation files (the "Software"), to deal
7
+ # in the Software without restriction, including without limitation the rights
8
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ # copies of the Software, and to permit persons to whom the Software is
10
+ # furnished to do so, subject to the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be included in
13
+ # all copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ # THE SOFTWARE.
22
+ module OAuthSimple
23
+ class SignatureMethodHMACSHA1 < SignatureMethod
24
+ def self.oauth_name
25
+ "HMAC-SHA1"
26
+ end
27
+
28
+ def self.build_signature_base_string(request, consumer, token)
29
+ sig = [
30
+ CGI.escape(request.get_normalized_http_method),
31
+ CGI.escape(request.get_normalized_http_url),
32
+ CGI.escape(request.get_normalized_parameters)
33
+ ]
34
+ key = "#{CGI.escape(consumer.secret)}&"
35
+ key << CGI.escape(token.secret) if token
36
+ raw = sig.join("&")
37
+ return [key, raw]
38
+ end
39
+
40
+ def self.build_signature(request, consumer, token)
41
+ key, raw = build_signature_base_string(request, consumer, token)
42
+ hashed = calculate_digest(key, raw)
43
+ return [hashed].pack('m').chomp.gsub(/\n/, '')
44
+ end
45
+
46
+ def self.calculate_digest(key, data)
47
+ if RUBY_VERSION >= "1.9"
48
+ Digest::HMAC.new(key, Digest::SHA1).digest(data)
49
+ else
50
+ ::HMAC::SHA1.digest(key, data)
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,41 @@
1
+ # The MIT License
2
+ #
3
+ # Copyright (c) 2009 Marius Mathiesen <marius.mathiesen@gmail.com>
4
+ #
5
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ # of this software and associated documentation files (the "Software"), to deal
7
+ # in the Software without restriction, including without limitation the rights
8
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ # copies of the Software, and to permit persons to whom the Software is
10
+ # furnished to do so, subject to the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be included in
13
+ # all copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ # THE SOFTWARE.
22
+ module OAuthSimple
23
+ class SignatureMethodPlaintext < SignatureMethod
24
+
25
+ def self.oauth_name
26
+ "PLAINTEXT"
27
+ end
28
+
29
+ def self.build_signature_base_string(request, consumer, token)
30
+ sig = "#{CGI.escape(consumer.secret)}&"
31
+ sig << CGI.escape(token.secret) if token
32
+ [sig, sig]
33
+ end
34
+
35
+ def self.build_signature(request, consumer, token)
36
+ key, raw = build_signature_base_string(request, consumer, token)
37
+ return key
38
+ end
39
+
40
+ end
41
+ end
@@ -0,0 +1,58 @@
1
+ # The MIT License
2
+ #
3
+ # Copyright (c) 2009 Marius Mathiesen <marius.mathiesen@gmail.com>
4
+ #
5
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ # of this software and associated documentation files (the "Software"), to deal
7
+ # in the Software without restriction, including without limitation the rights
8
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ # copies of the Software, and to permit persons to whom the Software is
10
+ # furnished to do so, subject to the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be included in
13
+ # all copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ # THE SOFTWARE.
22
+ module OAuthSimple
23
+ class Token
24
+ attr_reader :key, :secret
25
+ def initialize(key, secret)
26
+ @key = key
27
+ @secret = secret
28
+ end
29
+
30
+ def to_s
31
+ "oauth_token=#{CGI.escape(@key)}&oauth_token_secret=#{CGI.escape(@secret)}"
32
+ end
33
+
34
+ def self.from_string(str)
35
+ params = CGI.parse(str)
36
+ return new(params['oauth_token'].first, params['oauth_token_secret'].first)
37
+ end
38
+
39
+ # In order to have a token generate a URL, it needs to know of its consumer.
40
+ # Doesn't look quite right to have it here, but the way the API works...
41
+ def consumer=(c)
42
+ @consumer = c
43
+ end
44
+
45
+ def authorize_url
46
+ req = Request.from_consumer_and_token(@consumer, self, @consumer.authorize_url, {})
47
+ return req.to_url
48
+ end
49
+
50
+ def get_access_token
51
+ request = Request.from_consumer_and_token(@consumer, self, @consumer.access_token_url)
52
+ request.consumer = @consumer
53
+ request.sign_request(@consumer.signature_method, self)
54
+ response = open(request.get_normalized_http_url, 'r', request.to_header).read
55
+ return Token.from_string(response)
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,24 @@
1
+ # The MIT License
2
+ #
3
+ # Copyright (c) 2009 Marius Mathiesen <marius.mathiesen@gmail.com>
4
+ #
5
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ # of this software and associated documentation files (the "Software"), to deal
7
+ # in the Software without restriction, including without limitation the rights
8
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ # copies of the Software, and to permit persons to whom the Software is
10
+ # furnished to do so, subject to the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be included in
13
+ # all copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ # THE SOFTWARE.
22
+ module OAuthSimple
23
+ VERSION = '0.0.1'
24
+ end
@@ -0,0 +1,105 @@
1
+ require File.join(File.dirname(__FILE__), 'test_helper')
2
+ class CompatRegressionTest < Test::Unit::TestCase
3
+ def setup
4
+ OAuthSimple::Request.stubs(:generate_nonce).returns("225579211881198842005988698334675835446")
5
+ OAuthSimple::Request.stubs(:generate_timestamp).returns("1199645624")
6
+ @consumer = OAuthSimple::Consumer.new('consumer_key_86cad9', '5888bf0345e5d237',
7
+ :site => 'http://blabla.bla',
8
+ :scheme => :header,
9
+ :request_token_path => '/oauth/example/request_token.php',
10
+ :access_token_path => '/oauth/example/access_token.php',
11
+ :authorize_path => '/oauth/example/authorize.php'
12
+ )
13
+ @request = OAuthSimple::Request.new(
14
+ :http_method => :GET,
15
+ :parameters => {})
16
+ @token = OAuthSimple::Token.new('token_411a7f', '3196ffd991c8ebdb')
17
+ @request_uri = URI.parse('http://example.com/test?key=value')
18
+ end
19
+
20
+ def test_initializer
21
+ assert_equal 'consumer_key_86cad9', @consumer.key
22
+ assert_equal '5888bf0345e5d237', @consumer.secret
23
+ assert_equal 'http://blabla.bla', @consumer.site
24
+ assert_equal "/oauth/example/request_token.php",@consumer.request_token_path
25
+ assert_equal "/oauth/example/access_token.php",@consumer.access_token_path
26
+ assert_equal "http://blabla.bla/oauth/example/request_token.php",@consumer.request_token_url
27
+ assert_equal "http://blabla.bla/oauth/example/access_token.php",@consumer.access_token_url
28
+ assert_equal "http://blabla.bla/oauth/example/authorize.php",@consumer.authorize_url
29
+ assert_equal :header,@consumer.scheme
30
+ end
31
+
32
+ def test_defaults
33
+ @consumer=OAuthSimple::Consumer.new(
34
+ "key",
35
+ "secret",
36
+ {
37
+ :site=>"http://twitter.com"
38
+ })
39
+ assert_equal "key",@consumer.key
40
+ assert_equal "secret",@consumer.secret
41
+ assert_equal "http://twitter.com",@consumer.site
42
+ assert_equal "/oauth/request_token",@consumer.request_token_path
43
+ assert_equal "/oauth/access_token",@consumer.access_token_path
44
+ assert_equal "http://twitter.com/oauth/request_token",@consumer.request_token_url
45
+ assert_equal "http://twitter.com/oauth/access_token",@consumer.access_token_url
46
+ assert_equal "http://twitter.com/oauth/authorize",@consumer.authorize_url
47
+ assert_equal :header,@consumer.scheme
48
+ end
49
+
50
+ def test_override_paths
51
+ @consumer=OAuthSimple::Consumer.new(
52
+ "key",
53
+ "secret",
54
+ {
55
+ :site=>"http://twitter.com",
56
+ :request_token_url=>"http://oauth.twitter.com/request_token",
57
+ :access_token_url=>"http://oauth.twitter.com/access_token",
58
+ :authorize_url=>"http://site.twitter.com/authorize"
59
+ })
60
+ assert_equal "key",@consumer.key
61
+ assert_equal "secret",@consumer.secret
62
+ assert_equal "http://twitter.com",@consumer.site
63
+ assert_equal "/oauth/request_token",@consumer.request_token_path
64
+ assert_equal "/oauth/access_token",@consumer.access_token_path
65
+ assert_equal "http://oauth.twitter.com/request_token",@consumer.request_token_url
66
+ assert_equal "http://oauth.twitter.com/access_token",@consumer.access_token_url
67
+ assert_equal "http://site.twitter.com/authorize",@consumer.authorize_url
68
+ assert_equal :header,@consumer.scheme
69
+ end
70
+
71
+ # http://developer.netflix.com/resources/OAuthTest
72
+ def test_google_regressions_without_parameters
73
+ OAuthSimple::Request.stubs(:generate_nonce).returns("nonce")
74
+ OAuthSimple::Request.stubs(:generate_timestamp).returns("12345")
75
+ @consumer = OAuthSimple::Consumer.new('key', 'secret')
76
+ @token = OAuthSimple::Token.new('foo', 'bar')
77
+ @request = OAuthSimple::Request.from_consumer_and_token(@consumer, @token, 'http://oauth.example.com/do_oauth')
78
+ @request.sign_request(@consumer.signature_method, @token)
79
+ assert_equal 'http://oauth.example.com/do_oauth?oauth_consumer_key=key&oauth_nonce=nonce&oauth_signature=WZIO8HdSZy%2B6PKEkgrB8ZyqykT8%3D&oauth_signature_method=HMAC-SHA1&oauth_timestamp=12345&oauth_token=foo&oauth_version=1.0', @request.to_url
80
+ end
81
+
82
+ # http://developer.netflix.com/resources/OAuthTest
83
+ def test_google_regressions_with_parameters
84
+ OAuthSimple::Request.stubs(:generate_nonce).returns("nonce")
85
+ OAuthSimple::Request.stubs(:generate_timestamp).returns("12345")
86
+ @consumer = OAuthSimple::Consumer.new('key', 'secret')
87
+ @token = OAuthSimple::Token.new('foo', 'bar')
88
+ @request = OAuthSimple::Request.from_consumer_and_token(@consumer, @token, 'http://oauth.example.com/do_oauth', {'foo' => 'bar'})
89
+ @request.sign_request(@consumer.signature_method, @token)
90
+ assert_equal 'http://oauth.example.com/do_oauth?foo=bar&oauth_consumer_key=key&oauth_nonce=nonce&oauth_signature=xNxW8DDE4TXvTg9cXul7mSfDKeQ%3D&oauth_signature_method=HMAC-SHA1&oauth_timestamp=12345&oauth_token=foo&oauth_version=1.0', @request.to_url
91
+ end
92
+
93
+ # http://developer.netflix.com/resources/OAuthTest
94
+ def test_signature_generation_plaintext
95
+ OAuthSimple::Request.stubs(:generate_nonce).returns("nonce")
96
+ OAuthSimple::Request.stubs(:generate_timestamp).returns("12345")
97
+ @consumer = OAuthSimple::Consumer.new('key', 'secret', :signature_method => 'PLAINTEXT')
98
+ @token = OAuthSimple::Token.new('foo', 'bar')
99
+ @request = OAuthSimple::Request.from_consumer_and_token(@consumer, @token, 'http://oauth.example.com/do_oauth', {'foo' => 'bar'})
100
+ @request.sign_request(@consumer.signature_method, @token)
101
+ assert_equal 'secret&bar', @request.get_parameter('oauth_signature')
102
+ end
103
+
104
+
105
+ end
@@ -0,0 +1,44 @@
1
+ require File.join(File.dirname(__FILE__), 'test_helper')
2
+ class ConsumerTest < Test::Unit::TestCase
3
+ def setup
4
+ OAuthSimple::Request.stubs(:generate_nonce).returns("nonce")
5
+ OAuthSimple::Request.stubs(:generate_timestamp).returns("12345")
6
+ @consumer = OAuthSimple::Consumer.new('key', 'secret', :site => 'http://localhost:3001/', :scheme => :header)
7
+ end
8
+
9
+ def test_basic_setup
10
+ consumer = OAuthSimple::Consumer.new('key', 'secret')
11
+ assert_equal 'key', consumer.key
12
+ assert_equal 'secret', consumer.secret
13
+ end
14
+
15
+ def test_default_signature_method
16
+ @consumer = OAuthSimple::Consumer.new('key', 'secret')
17
+ assert_equal OAuthSimple::SignatureMethodHMACSHA1, @consumer.signature_method
18
+ end
19
+
20
+ def test_setup_with_options
21
+ assert_equal 'http://localhost:3001/', @consumer.site
22
+ assert_equal :header, @consumer.scheme
23
+ end
24
+
25
+ def test_customizable_paths
26
+ consumer = OAuthSimple::Consumer.new('key', 'secret',
27
+ :site => 'http://oauth.example',
28
+ :request_token_path => '/oauth/example/req.php',
29
+ :access_token_path => '/oauth/example/token.php',
30
+ :authorize_path => '/oauth/example/auth.php')
31
+ assert_equal '/oauth/example/req.php', consumer.request_token_path
32
+ assert_equal '/oauth/example/token.php', consumer.access_token_path
33
+ assert_equal '/oauth/example/auth.php', consumer.authorize_path
34
+ assert_equal 'http://oauth.example/oauth/example/req.php', consumer.request_token_url
35
+ end
36
+
37
+ def test_aquire_request_token
38
+ http_request = mock('HTTP request')
39
+ http_request.expects(:get).with('http://localhost:3001/oauth/request_token', {'Authorization' => 'OAuth realm=, oauth_consumer_key=key, oauth_nonce=nonce, oauth_signature=eff4QrcF%2BzToX7GI4eHYsdc7wfo%3D, oauth_signature_method=HMAC-SHA1, oauth_timestamp=12345, oauth_version=1.0'}).returns('oauth_token=token&oauth_token_secret=top_secret')
40
+ @consumer.stubs(:http).returns(http_request)
41
+ token = @consumer.get_request_token
42
+ assert_kind_of OAuthSimple::Token, token
43
+ end
44
+ end
@@ -0,0 +1,10 @@
1
+ require File.join(File.dirname(__FILE__), '../lib/oauth-simple')
2
+ require 'test/unit'
3
+ require 'mocha'
4
+ module Test
5
+ module Unit
6
+ class TestCase
7
+ PASSTHROUGH_EXCEPTIONS = [] unless defined?(PASSTHROUGH_EXCEPTIONS)
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,46 @@
1
+ require File.join(File.dirname(__FILE__), 'test_helper')
2
+
3
+ class RequestTest < Test::Unit::TestCase
4
+ def setup
5
+ @request = OAuthSimple::Request.new(:parameters => {'foo' => 'bar', 'oauth_bar' => 'baz', 'oauth_auth' => 'auth'},
6
+ :http_url => 'http://oauth.example.com/do_oauth')
7
+ @consumer = OAuthSimple::Consumer.new "key", "secret"
8
+ OAuthSimple::Request.stubs(:generate_nonce).returns("nonce")
9
+ OAuthSimple::Request.stubs(:generate_timestamp).returns("12345")
10
+ end
11
+
12
+ def test_non_oauth_parameters
13
+ assert_equal({'foo' => 'bar'}, @request.get_nonoauth_parameters)
14
+ end
15
+
16
+ def test_oauth_headers
17
+ assert_equal({'Authorization' => "OAuth realm=, oauth_auth=auth, oauth_bar=baz"}, @request.to_header)
18
+ end
19
+
20
+ def test_postdata
21
+ assert_equal("foo=bar&oauth_auth=auth&oauth_bar=baz", @request.to_postdata)
22
+ end
23
+
24
+ def test_normalized_http_url
25
+ assert_equal("http://oauth.example.com/do_oauth", @request.get_normalized_http_url)
26
+ end
27
+
28
+ def test_normalized_parameters
29
+ assert_equal("foo=bar&oauth_auth=auth&oauth_bar=baz", @request.get_normalized_parameters)
30
+ end
31
+
32
+ def test_sign_request_without_token
33
+ @request = OAuthSimple::Request.from_consumer_and_token(@consumer, nil, 'http://oauth.example.com/do_oauth',
34
+ 'foo' => 'bar')
35
+ @request.sign_request(OAuthSimple::SignatureMethodHMACSHA1, nil)
36
+ assert_equal "w3FuykT3EmdgHZcSXINi8OhlG40=", @request.get_parameter("oauth_signature")
37
+ end
38
+
39
+ def test_generate_and_sign_access_token
40
+ access_token = OAuthSimple::Token.from_string("oauth_token=foo&oauth_token_secret=bar")
41
+ @request = OAuthSimple::Request.from_consumer_and_token(@consumer, nil, 'http://oauth.example.com/do_oauth')
42
+ @request.sign_request(OAuthSimple::SignatureMethodHMACSHA1, access_token)
43
+ assert_equal 'http://oauth.example.com/do_oauth?oauth_consumer_key=key&oauth_nonce=nonce&oauth_signature=loiAqloHcoLZAuvhxlt2nrOgXrM%3D&oauth_signature_method=HMAC-SHA1&oauth_timestamp=12345&oauth_version=1.0', @request.to_url
44
+ end
45
+
46
+ end
@@ -0,0 +1,28 @@
1
+ # The MIT License
2
+ #
3
+ # Copyright (c) 2009 Marius Mathiesen <marius.mathiesen@gmail.com>
4
+ #
5
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ # of this software and associated documentation files (the "Software"), to deal
7
+ # in the Software without restriction, including without limitation the rights
8
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ # copies of the Software, and to permit persons to whom the Software is
10
+ # furnished to do so, subject to the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be included in
13
+ # all copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ # THE SOFTWARE.
22
+ require File.join(File.dirname(__FILE__), 'test_helper')
23
+ class SignatureMethodTest < Test::Unit::TestCase
24
+ def test_class_methods
25
+ assert_equal OAuthSimple::SignatureMethodHMACSHA1, OAuthSimple::SignatureMethod.by_name('HMAC-SHA1')
26
+ assert_equal OAuthSimple::SignatureMethodPlaintext, OAuthSimple::SignatureMethod.by_name('PLAINTEXT')
27
+ end
28
+ end
@@ -0,0 +1,24 @@
1
+ require File.join(File.dirname(__FILE__), 'test_helper')
2
+
3
+ class TokenTest < Test::Unit::TestCase
4
+ def test_to_s
5
+ t = OAuthSimple::Token.new("key", "secret")
6
+ assert_equal("oauth_token=key&oauth_token_secret=secret", t.to_s)
7
+ end
8
+
9
+ def test_parse_from_string
10
+ t = OAuthSimple::Token.from_string("oauth_token=key&oauth_token_secret=secret")
11
+ assert_equal("key", t.key)
12
+ assert_equal("secret", t.secret)
13
+ end
14
+
15
+ def test_authorize_url
16
+ OAuthSimple::Request.stubs(:generate_nonce).returns("nonce")
17
+ OAuthSimple::Request.stubs(:generate_timestamp).returns("12345")
18
+ consumer = OAuthSimple::Consumer.new('key', 'secret', :site => 'http://oauth.local/')
19
+ request_token = OAuthSimple::Token.from_string('oauth_token=key&oauth_token_secret=secret')
20
+ request_token.consumer = consumer
21
+ result = request_token.authorize_url
22
+ assert_equal 'http://oauth.local/oauth/authorize?oauth_consumer_key=key&oauth_nonce=nonce&oauth_timestamp=12345&oauth_token=key&oauth_version=1.0', result
23
+ end
24
+ end
metadata ADDED
@@ -0,0 +1,104 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: oauth-simple
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Marius Mathiesen
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain:
11
+ - |
12
+ -----BEGIN CERTIFICATE-----
13
+ MIIDQjCCAiqgAwIBAgIBADANBgkqhkiG9w0BAQUFADBHMRkwFwYDVQQDDBBtYXJp
14
+ dXMubWF0aGllc2VuMRUwEwYKCZImiZPyLGQBGRYFZ21haWwxEzARBgoJkiaJk/Is
15
+ ZAEZFgNjb20wHhcNMDkwNDIzMTIyNTQ5WhcNMTAwNDIzMTIyNTQ5WjBHMRkwFwYD
16
+ VQQDDBBtYXJpdXMubWF0aGllc2VuMRUwEwYKCZImiZPyLGQBGRYFZ21haWwxEzAR
17
+ BgoJkiaJk/IsZAEZFgNjb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
18
+ AQCnTW1Sh+0Wef0+Ga4SOmFfVoCgDP9oBxuhA6FMr5tyt8a0Eh8U7aUOeFAYKdUV
19
+ hPz45QX8JG2qK9JKJCpS6Vw4+++3AelfYQjblN8DjKLQY6GUe8tJm67W4ZUBJpWQ
20
+ D6EQyNy3x9tOHqoV838J/nJcfajUobwiVktnJf160IsYko3sUAjMIqukX10BcbcY
21
+ V4vIWGBtBTpmLLzZIetIydvt2RgcDOxsdNEm75t8lszEmckpy0wvhq4MMlxqUUSO
22
+ uMUn9dOWIGWJyT3Y2aPoUV0h6phTt4dlUUQm05O8i1OkGUDzLJ6Y8Tb7czgR4zkG
23
+ RIhrMQFP5BA7joX1wmJQTrCfAgMBAAGjOTA3MAkGA1UdEwQCMAAwHQYDVR0OBBYE
24
+ FF0jJG1hKeH0OVGEzgbMWFgkq5PPMAsGA1UdDwQEAwIEsDANBgkqhkiG9w0BAQUF
25
+ AAOCAQEATd6h9TSGQehTVQmmguwbZAm19uMZnt4w6IJtV2MftRCUhBmOEiJ0Hqny
26
+ d3OxrfcUBtnCbnswvmYKyxhHkqUZnxT1cqRPg0OKDUuSTytZcUEcvm4Mvfwyqt/p
27
+ zlofbaegc0Or9HWT3Kg4C5lryrlEJe0D996bTObUHP/UAzBpAU6YRscQV9tk4MfF
28
+ 6cG+4dZJ5GyqXY4cOQWmfLGJjotYRfy+3Ta4r0gOcM8iiOIHazvF+F+C1DN5AZfi
29
+ zNjcov+cRcmblc29PrBBZFAh2cnWKBwi5TFyGFq8b5fbjAEGS7NabyRybcppdrJo
30
+ 2KP0QmP6AAwoAYED2ogaYVLyeyKh/A==
31
+ -----END CERTIFICATE-----
32
+
33
+ date: 2009-04-23 00:00:00 +02:00
34
+ default_executable:
35
+ dependencies:
36
+ - !ruby/object:Gem::Dependency
37
+ name: hoe
38
+ type: :development
39
+ version_requirement:
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ requirements:
42
+ - - ">="
43
+ - !ruby/object:Gem::Version
44
+ version: 1.12.2
45
+ version:
46
+ description: Simple OAuth implementation
47
+ email: marius.mathiesen@gmail.com
48
+ executables: []
49
+
50
+ extensions: []
51
+
52
+ extra_rdoc_files:
53
+ - History.txt
54
+ - README.txt
55
+ - Manifest.txt
56
+ files:
57
+ - History.txt
58
+ - README.txt
59
+ - Manifest.txt
60
+ - Rakefile
61
+ - TODO
62
+ - lib/oauth-simple.rb
63
+ - lib/oauth-simple/consumer.rb
64
+ - lib/oauth-simple/http_client.rb
65
+ - lib/oauth-simple/request.rb
66
+ - lib/oauth-simple/signature_method.rb
67
+ - lib/oauth-simple/signature_method_hmac_sha1.rb
68
+ - lib/oauth-simple/signature_method_plaintext.rb
69
+ - lib/oauth-simple/token.rb
70
+ - lib/oauth-simple/version.rb
71
+ has_rdoc: true
72
+ homepage: http://oauth-simple.rubyforge.org/
73
+ post_install_message:
74
+ rdoc_options:
75
+ - --main
76
+ - README.txt
77
+ require_paths:
78
+ - lib
79
+ required_ruby_version: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - ">="
82
+ - !ruby/object:Gem::Version
83
+ version: "0"
84
+ version:
85
+ required_rubygems_version: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: "0"
90
+ version:
91
+ requirements: []
92
+
93
+ rubyforge_project: oauth-simple
94
+ rubygems_version: 1.3.1
95
+ signing_key:
96
+ specification_version: 2
97
+ summary: Simple OAuth implementation
98
+ test_files:
99
+ - test/test_compat_regression.rb
100
+ - test/test_consumer.rb
101
+ - test/test_helper.rb
102
+ - test/test_request.rb
103
+ - test/test_signature_methods.rb
104
+ - test/test_token.rb
@@ -0,0 +1 @@
1
+ a�Į�y#qF��@�