rack-oauth 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. data/README.rdoc +49 -0
  2. data/Rakefile +68 -0
  3. data/VERSION +1 -0
  4. data/examples/rails-example/README +243 -0
  5. data/examples/rails-example/Rakefile +10 -0
  6. data/examples/rails-example/app/controllers/application_controller.rb +12 -0
  7. data/examples/rails-example/app/controllers/welcome_controller.rb +26 -0
  8. data/examples/rails-example/app/helpers/application_helper.rb +3 -0
  9. data/examples/rails-example/app/helpers/welcome_helper.rb +2 -0
  10. data/examples/rails-example/app/views/welcome/index.html.erb +2 -0
  11. data/examples/rails-example/config/boot.rb +110 -0
  12. data/examples/rails-example/config/database.yml +22 -0
  13. data/examples/rails-example/config/environment.rb +14 -0
  14. data/examples/rails-example/config/environments/development.rb +17 -0
  15. data/examples/rails-example/config/environments/production.rb +28 -0
  16. data/examples/rails-example/config/environments/test.rb +32 -0
  17. data/examples/rails-example/config/initializers/backtrace_silencers.rb +7 -0
  18. data/examples/rails-example/config/initializers/inflections.rb +10 -0
  19. data/examples/rails-example/config/initializers/mime_types.rb +5 -0
  20. data/examples/rails-example/config/initializers/new_rails_defaults.rb +21 -0
  21. data/examples/rails-example/config/initializers/session_store.rb +15 -0
  22. data/examples/rails-example/config/locales/en.yml +5 -0
  23. data/examples/rails-example/config/routes.rb +6 -0
  24. data/examples/rails-example/db/development.sqlite3 +1 -0
  25. data/examples/rails-example/db/seeds.rb +7 -0
  26. data/examples/rails-example/db/test.sqlite3 +1 -0
  27. data/examples/rails-example/doc/README_FOR_APP +2 -0
  28. data/examples/rails-example/lib/tasks/rspec.rake +182 -0
  29. data/examples/rails-example/log/development.log +165 -0
  30. data/examples/rails-example/log/production.log +0 -0
  31. data/examples/rails-example/log/server.log +0 -0
  32. data/examples/rails-example/log/test.log +1591 -0
  33. data/examples/rails-example/public/404.html +30 -0
  34. data/examples/rails-example/public/422.html +30 -0
  35. data/examples/rails-example/public/500.html +30 -0
  36. data/examples/rails-example/public/favicon.ico +0 -0
  37. data/examples/rails-example/public/images/rails.png +0 -0
  38. data/examples/rails-example/public/javascripts/application.js +2 -0
  39. data/examples/rails-example/public/javascripts/controls.js +963 -0
  40. data/examples/rails-example/public/javascripts/dragdrop.js +973 -0
  41. data/examples/rails-example/public/javascripts/effects.js +1128 -0
  42. data/examples/rails-example/public/javascripts/prototype.js +4320 -0
  43. data/examples/rails-example/public/robots.txt +5 -0
  44. data/examples/rails-example/script/about +4 -0
  45. data/examples/rails-example/script/autospec +6 -0
  46. data/examples/rails-example/script/console +3 -0
  47. data/examples/rails-example/script/dbconsole +3 -0
  48. data/examples/rails-example/script/destroy +3 -0
  49. data/examples/rails-example/script/generate +3 -0
  50. data/examples/rails-example/script/performance/benchmarker +3 -0
  51. data/examples/rails-example/script/performance/profiler +3 -0
  52. data/examples/rails-example/script/plugin +3 -0
  53. data/examples/rails-example/script/runner +3 -0
  54. data/examples/rails-example/script/server +3 -0
  55. data/examples/rails-example/script/spec +10 -0
  56. data/examples/rails-example/script/spec_server +9 -0
  57. data/examples/rails-example/spec/integration/login_spec.rb +27 -0
  58. data/examples/rails-example/spec/rcov.opts +2 -0
  59. data/examples/rails-example/spec/spec.opts +4 -0
  60. data/examples/rails-example/spec/spec_helper.rb +12 -0
  61. data/examples/rails-example/tmp/webrat-1257205170.html +202 -0
  62. data/examples/rails-example/tmp/webrat-1257205276.html +31 -0
  63. data/examples/rails-example/tmp/webrat-1257205315.html +211 -0
  64. data/examples/rails-example/tmp/webrat-1257205333.html +31 -0
  65. data/examples/rails-example/tmp/webrat-1257205380.html +211 -0
  66. data/examples/rails-example/tmp/webrat-1257205757.html +211 -0
  67. data/examples/rails-example/tmp/webrat-1257210107.html +32 -0
  68. data/examples/rails-example/tmp/webrat-1257210160.html +32 -0
  69. data/examples/rails-example/tmp/webrat-1257210488.html +32 -0
  70. data/examples/rails-example/tmp/webrat-1257210501.html +32 -0
  71. data/examples/rails-example/tmp/webrat-1257210545.html +32 -0
  72. data/examples/rails-example/tmp/webrat-1257210564.html +32 -0
  73. data/examples/rails-example/tmp/webrat-1257210581.html +32 -0
  74. data/examples/rails-example/tmp/webrat-1257210600.html +32 -0
  75. data/examples/rails-example/tmp/webrat-1257210608.html +32 -0
  76. data/examples/sinatra-twitter.rb +47 -0
  77. data/examples/sinatra-twitter.ru +2 -0
  78. data/lib/rack/oauth.rb +1 -0
  79. data/lib/rack-oauth.rb +378 -0
  80. data/spec/data/authorized_access_token.yml +58 -0
  81. data/spec/data/authorized_oauth_verifier.yml +1 -0
  82. data/spec/data/authorized_request_secret.yml +1 -0
  83. data/spec/data/authorized_request_token.yml +1 -0
  84. data/spec/data/unauthorized_request_token.yml +56 -0
  85. data/spec/rack_oauth_middleware_spec.rb +156 -0
  86. data/spec/sample_sinatra_app_spec.rb +105 -0
  87. data/spec/spec_helper.rb +24 -0
  88. metadata +162 -0
@@ -0,0 +1,32 @@
1
+ <html xmlns="http://www.w3.org/1999/xhtml">
2
+ <head>
3
+ <title>Action Controller: Exception caught</title>
4
+ <style>
5
+ body { background-color: #fff; color: #333; }
6
+
7
+ body, p, ol, ul, td {
8
+ font-family: verdana, arial, helvetica, sans-serif;
9
+ font-size: 13px;
10
+ line-height: 18px;
11
+ }
12
+
13
+ pre {
14
+ background-color: #eee;
15
+ padding: 10px;
16
+ font-size: 11px;
17
+ }
18
+
19
+ a { color: #000; }
20
+ a:visited { color: #666; }
21
+ a:hover { color: #fff; background-color:#000; }
22
+ </style>
23
+ </head>
24
+ <body>
25
+
26
+ <h1>Routing Error</h1>
27
+ <p><pre>No route matches &quot;/foo/bar&quot; with {:method=&gt;:get}</pre></p>
28
+
29
+
30
+
31
+ </body>
32
+ </html>
@@ -0,0 +1,32 @@
1
+ <html xmlns="http://www.w3.org/1999/xhtml">
2
+ <head>
3
+ <title>Action Controller: Exception caught</title>
4
+ <style>
5
+ body { background-color: #fff; color: #333; }
6
+
7
+ body, p, ol, ul, td {
8
+ font-family: verdana, arial, helvetica, sans-serif;
9
+ font-size: 13px;
10
+ line-height: 18px;
11
+ }
12
+
13
+ pre {
14
+ background-color: #eee;
15
+ padding: 10px;
16
+ font-size: 11px;
17
+ }
18
+
19
+ a { color: #000; }
20
+ a:visited { color: #666; }
21
+ a:hover { color: #fff; background-color:#000; }
22
+ </style>
23
+ </head>
24
+ <body>
25
+
26
+ <h1>Routing Error</h1>
27
+ <p><pre>No route matches &quot;/foo/bar&quot; with {:method=&gt;:get}</pre></p>
28
+
29
+
30
+
31
+ </body>
32
+ </html>
@@ -0,0 +1,32 @@
1
+ <html xmlns="http://www.w3.org/1999/xhtml">
2
+ <head>
3
+ <title>Action Controller: Exception caught</title>
4
+ <style>
5
+ body { background-color: #fff; color: #333; }
6
+
7
+ body, p, ol, ul, td {
8
+ font-family: verdana, arial, helvetica, sans-serif;
9
+ font-size: 13px;
10
+ line-height: 18px;
11
+ }
12
+
13
+ pre {
14
+ background-color: #eee;
15
+ padding: 10px;
16
+ font-size: 11px;
17
+ }
18
+
19
+ a { color: #000; }
20
+ a:visited { color: #666; }
21
+ a:hover { color: #fff; background-color:#000; }
22
+ </style>
23
+ </head>
24
+ <body>
25
+
26
+ <h1>Routing Error</h1>
27
+ <p><pre>No route matches &quot;/foo/bar&quot; with {:method=&gt;:get}</pre></p>
28
+
29
+
30
+
31
+ </body>
32
+ </html>
@@ -0,0 +1,32 @@
1
+ <html xmlns="http://www.w3.org/1999/xhtml">
2
+ <head>
3
+ <title>Action Controller: Exception caught</title>
4
+ <style>
5
+ body { background-color: #fff; color: #333; }
6
+
7
+ body, p, ol, ul, td {
8
+ font-family: verdana, arial, helvetica, sans-serif;
9
+ font-size: 13px;
10
+ line-height: 18px;
11
+ }
12
+
13
+ pre {
14
+ background-color: #eee;
15
+ padding: 10px;
16
+ font-size: 11px;
17
+ }
18
+
19
+ a { color: #000; }
20
+ a:visited { color: #666; }
21
+ a:hover { color: #fff; background-color:#000; }
22
+ </style>
23
+ </head>
24
+ <body>
25
+
26
+ <h1>Routing Error</h1>
27
+ <p><pre>No route matches &quot;/foo/bar&quot; with {:method=&gt;:get}</pre></p>
28
+
29
+
30
+
31
+ </body>
32
+ </html>
@@ -0,0 +1,47 @@
1
+ #! /usr/bin/env ruby
2
+ %w( rubygems sinatra haml ).each {|lib| require lib }
3
+ require File.dirname(__FILE__) + '/../lib/rack-oauth'
4
+
5
+ use Rack::Session::Cookie
6
+
7
+ use Rack::OAuth, :site => 'http://twitter.com', :key => '4JjFmhjfZyQ6rdbiql5A',
8
+ :secret => 'rv4ZaCgvxVPVjxHIDbMxTGFbIMxUa4KkIdPqL7HmaQo'
9
+
10
+ helpers do
11
+
12
+ # todo ... make wrapper that handles ENV?
13
+ def oauth
14
+ Rack::OAuth.get(env)
15
+ end
16
+
17
+ end
18
+
19
+ get '/' do
20
+ haml :index
21
+ end
22
+
23
+ get '/creds' do
24
+ @user = oauth.request(env, '/account/verify_credentials.json') if oauth.verified?(env)
25
+ haml :index
26
+ end
27
+
28
+ get '/oauth_complete' do
29
+ redirect '/'
30
+ end
31
+
32
+ get '/logout' do
33
+ session.clear
34
+ redirect '/'
35
+ end
36
+
37
+ __END__
38
+
39
+ @@ index
40
+
41
+ %h1 Twitter OAuth Example
42
+
43
+ - if @user
44
+ %p User:
45
+ %pre~ @user.to_yaml
46
+
47
+ %pre~ session.to_yaml
@@ -0,0 +1,2 @@
1
+ require 'sinatra-twitter'
2
+ run Sinatra::Application
data/lib/rack/oauth.rb ADDED
@@ -0,0 +1 @@
1
+ require 'rack-oauth'
data/lib/rack-oauth.rb ADDED
@@ -0,0 +1,378 @@
1
+ require 'rubygems'
2
+ require 'rack'
3
+ require 'oauth'
4
+
5
+ # For some reason, getting the location our of a HeaderHash doesn't always work!
6
+ #
7
+ # sometimes you can see the header key/value in the HeaderHash, but you can't get it out!
8
+ class Rack::Utils::HeaderHash
9
+ def [] key
10
+ if not has_key?(key)
11
+ hash = to_hash
12
+ hash.keys.each do |hash_key|
13
+ if hash_key.downcase == key.downcase
14
+ return hash[hash_key]
15
+ end
16
+ end
17
+ end
18
+ super
19
+ end
20
+ end
21
+
22
+ module Rack #:nodoc:
23
+
24
+ # Rack Middleware for integrating OAuth into your application
25
+ #
26
+ # Note: this *requires* that a Rack::Session middleware be enabled
27
+ #
28
+ class OAuth
29
+
30
+ # Helper methods intended to be included in your Rails controller or
31
+ # in your Sinatra helpers block
32
+ module Methods
33
+
34
+ # [Internal] this method returns the Rack 'env' for the current request.
35
+ #
36
+ # This looks for #env or #request.env by default. If these don't return
37
+ # something, then we raise an exception and you should override this method
38
+ # so it returns the Rack env that we need.
39
+ def oauth_request_env
40
+ if respond_to?(:env)
41
+ env
42
+ elsif respond_to?(:request) and request.respond_to?(:env)
43
+ request.env
44
+ else
45
+ raise "Couldn't find 'env' ... please override #oauth_request_env"
46
+ end
47
+ end
48
+
49
+ # Returns the instance of Rack::OAuth given a name (defaults to the default Rack::OAuth name)
50
+ def oauth name = nil
51
+ oauth = Rack::OAuth.get(oauth_request_env, nil)
52
+ raise "Couldn't find Rack::OAuth instance with name #{ name }" unless oauth
53
+ oauth
54
+ end
55
+
56
+ # Makes a request using the stored access token for the current session.
57
+ #
58
+ # Without a user logged in to an OAuth provider in the current session, this won't work.
59
+ #
60
+ # This is *not* the method to use to fire off requests for saved access tokens.
61
+ def oauth_request *args
62
+ oauth.request oauth_request_env, *args
63
+ end
64
+
65
+ def oauth_request_with_access_token token, *args
66
+ oauth.request_with_access_token token, *args
67
+ end
68
+
69
+ # Get the access token object for the currently authorized session
70
+ def oauth_access_token name = nil
71
+ oauth(name).get_access_token(oauth_request_env)
72
+ end
73
+
74
+ # If Rack::OAuth#get_access_token is nil given the #oauth_request_env available
75
+ # (inotherwords, it's nil in our user's current session), then we didn't
76
+ # log in. If we have an access token for this particular session, then
77
+ # we are logged in.
78
+ def logged_in? name = nil
79
+ !! oauth_access_token(name)
80
+ end
81
+
82
+ # Returns the path to rediret to for logging in via OAuth
83
+ def oauth_login_path name = nil
84
+ oauth(name).login_path
85
+ end
86
+
87
+ end
88
+
89
+ class << self
90
+
91
+ # The name we use for Rack::OAuth instances when a name is not given.
92
+ #
93
+ # This is 'default' by default
94
+ attr_accessor :default_instance_name
95
+
96
+ # Set this equal to true to enable 'test mode'
97
+ attr_accessor :test_mode_enabled
98
+ def enable_test_mode() self.test_mode_enabled = true end
99
+ def disable_test_mode() self.test_mode_enabled = false end
100
+ def test_mode?() test_mode_enabled == true end
101
+ end
102
+
103
+ @default_instance_name = 'default'
104
+
105
+ # Returns all of the Rack::OAuth instances found in this Rack 'env' Hash
106
+ def self.all env
107
+ env['rack.oauth']
108
+ end
109
+
110
+ # Simple helper to get an instance of Rack::OAuth by name found in this Rack 'env' Hash
111
+ def self.get env, name = nil
112
+ name = Rack::OAuth.default_instance_name if name.nil?
113
+ all(env)[name.to_s]
114
+ end
115
+
116
+ DEFAULT_OPTIONS = {
117
+ :login_path => '/oauth_login',
118
+ :callback_path => '/oauth_callback',
119
+ :redirect_to => '/oauth_complete',
120
+ :rack_session => 'rack.session',
121
+ :json_parser => lambda {|json_string| require 'json'; JSON.parse(json_string); },
122
+ :access_token_getter => lambda {|key, oauth| oauth.get_access_token_via_instance_variable(key) },
123
+ :access_token_setter => lambda {|key, token, oauth| oauth.set_access_token_via_instance_variable(key, token) }
124
+ }
125
+
126
+ # A proc that accepts an argument for the KEY we're using to get an access token
127
+ # that should return the actual access token object.
128
+ #
129
+ # A second parameter is passed to your block with the Rack::OAuth instance
130
+ #
131
+ # This allows you to override how access tokens are persisted
132
+ attr_accessor :access_token_getter
133
+ alias get access_token_getter
134
+ alias get= access_token_getter=
135
+
136
+ # A proc that accepts an argument for the KEY we're using to set an access token
137
+ # and a second argument with the actual access token object.
138
+ #
139
+ # A third parameter is passed to your block with the Rack::OAuth instance
140
+ #
141
+ # This allows you to override how access tokens are persisted
142
+ attr_accessor :access_token_setter
143
+ alias set access_token_setter
144
+ alias set= access_token_setter=
145
+
146
+ # the URL that should initiate OAuth and redirect to the OAuth provider's login page
147
+ def login_path
148
+ ::File.join *[@login_path.to_s, name_unless_default].compact
149
+ end
150
+ attr_writer :login_path
151
+ alias login login_path
152
+ alias login= login_path=
153
+
154
+ # the URL that the OAuth provider should callback to after OAuth login is complete
155
+ def callback_path
156
+ ::File.join *[@callback_path.to_s, name_unless_default].compact
157
+ end
158
+ attr_writer :callback_path
159
+ alias callback callback_path
160
+ alias callback= callback_path=
161
+
162
+ # the URL that Rack::OAuth should redirect to after the OAuth has been completed (part of your app)
163
+ attr_accessor :redirect_to
164
+ alias redirect redirect_to
165
+ alias redirect= redirect_to=
166
+
167
+ # the name of the Rack env variable used for the session
168
+ attr_accessor :rack_session
169
+
170
+ # [required] Your OAuth consumer key
171
+ attr_accessor :consumer_key
172
+ alias key consumer_key
173
+ alias key= consumer_key=
174
+
175
+ # [required] Your OAuth consumer secret
176
+ attr_accessor :consumer_secret
177
+ alias secret consumer_secret
178
+ alias secret= consumer_secret=
179
+
180
+ # [required] The site you want to request OAuth for, eg. 'http://twitter.com'
181
+ attr_accessor :consumer_site
182
+ alias site consumer_site
183
+ alias site= consumer_site=
184
+
185
+ # a Proc that accepts a JSON string and returns a Ruby object. Defaults to using the 'json' gem, if available.
186
+ attr_accessor :json_parser
187
+
188
+ # an arbitrary name for this instance of Rack::OAuth
189
+ def name
190
+ @name.to_s
191
+ end
192
+ attr_writer :name
193
+
194
+ def initialize app, *args
195
+ @app = app
196
+
197
+ options = args.pop
198
+ @name = args.first || Rack::OAuth.default_instance_name
199
+
200
+ DEFAULT_OPTIONS.each {|name, value| send "#{name}=", value }
201
+ options.each {|name, value| send "#{name}=", value } if options
202
+
203
+ raise_validation_exception unless valid?
204
+ end
205
+
206
+ def call env
207
+ env['rack.oauth'] ||= {}
208
+ env['rack.oauth'][name] = self
209
+
210
+ case env['PATH_INFO']
211
+ when login_path; do_login env
212
+ when callback_path; do_callback env
213
+ else; @app.call env
214
+ end
215
+ end
216
+
217
+ def do_login env
218
+
219
+ if Rack::OAuth.test_mode?
220
+ session(env)[:token] = "Token"
221
+ session(env)[:secret] = "Secret"
222
+ set_access_token env, "AccessToken"
223
+ return [ 302, { 'Content-Type' => 'text/html', 'Location' => redirect_to }, [] ]
224
+ end
225
+
226
+ request = consumer.get_request_token :oauth_callback => ::File.join("http://#{ env['HTTP_HOST'] }", callback_path)
227
+ session(env)[:token] = request.token
228
+ session(env)[:secret] = request.secret
229
+ [ 302, { 'Content-Type' => 'text/html', 'Location' => request.authorize_url }, [] ]
230
+ end
231
+
232
+ def do_callback env
233
+ session(env)[:verifier] = Rack::Request.new(env).params['oauth_verifier']
234
+ request = ::OAuth::RequestToken.new consumer, session(env)[:token], session(env)[:secret]
235
+ access = request.get_access_token :oauth_verifier => session(env)[:verifier]
236
+
237
+ # hold onto the access token
238
+ set_access_token env, access
239
+
240
+ [ 302, { 'Content-Type' => 'text/html', 'Location' => redirect_to }, [] ]
241
+ end
242
+
243
+ # Default implementation of access_token_getter
244
+ #
245
+ # Keeps tokens in an instance variable
246
+ def get_access_token_via_instance_variable key
247
+ @tokens[key] if @tokens
248
+ end
249
+
250
+ # Default implementation of access_token_setter
251
+ #
252
+ # Keeps tokens in an instance variable
253
+ def set_access_token_via_instance_variable key, token
254
+ @tokens ||= {}
255
+ @tokens[key] = token
256
+ end
257
+
258
+ # Returns the key to use (for this particular session) to get or set an
259
+ # access token for this Rack env
260
+ #
261
+ # TODO this will very likely change as we want to be able to get or set
262
+ # access tokens using useful data like a user's name in the future
263
+ def key_for_env env
264
+ val = session(env)[:token] + session(env)[:secret] if session(env)[:token] and session(env)[:secret]
265
+ session(env)[:token] + session(env)[:secret] if session(env)[:token] and session(env)[:secret]
266
+ end
267
+
268
+ # Gets an Access Token by key using access_token_getter (for this specific ENV)
269
+ def get_access_token env
270
+ access_token_getter.call key_for_env(env), self
271
+ end
272
+
273
+ # Sets an Access Token by key and value using access_token_setter (for this specific ENV)
274
+ def set_access_token env, token
275
+ access_token_setter.call key_for_env(env), token, self
276
+ end
277
+
278
+ # Usage:
279
+ #
280
+ # request '/account/verify_credentials.json'
281
+ # request 'GET', '/account/verify_credentials.json'
282
+ # request :post, '/statuses/update.json', :status => params[:tweet]
283
+ #
284
+ def request env, method, path = nil, *args
285
+ if method.to_s.start_with?('/')
286
+ path = method
287
+ method = :get
288
+ end
289
+
290
+ return Rack::OAuth.mock_response_for(method, path) if Rack::OAuth.test_mode?
291
+
292
+ consumer.request method.to_s.downcase.to_sym, path, get_access_token(env), *args
293
+ end
294
+
295
+ # Same as #request but you can manually pass your own request token
296
+ def request_with_access_token token, method, path = nil, *args
297
+ if method.to_s.start_with?('/')
298
+ path = method
299
+ method = :get
300
+ end
301
+
302
+ return Rack::OAuth.mock_response_for(method, path) if Rack::OAuth.test_mode?
303
+
304
+ consumer.request method.to_s.downcase.to_sym, path, token, *args
305
+ end
306
+
307
+ # Returns the mock response, if one has been set via #mock_request, for a method and path.
308
+ #
309
+ # Raises an exception if the response doesn't exist because we never want the test environment
310
+ # to *actually* make real requests!
311
+ def self.mock_response_for method, path
312
+ unless @mock_responses and @mock_responses[path] and @mock_responses[path][method]
313
+ raise "No mock response created for #{ method.inspect } #{ path.inspect }"
314
+ else
315
+ return @mock_responses[path][method]
316
+ end
317
+ end
318
+
319
+ # Set the response that should be returned when a particular method and path are called.
320
+ #
321
+ # This is used when Rack::OAuth::test_mode? is true
322
+ def self.mock_request method, path, response = nil
323
+ if method.to_s.start_with?('/')
324
+ response = path
325
+ path = method
326
+ method = :get
327
+ end
328
+
329
+ @mock_responses ||= {}
330
+ @mock_responses[path] ||= {}
331
+ @mock_responses[path][method] = response
332
+ end
333
+
334
+ def verified? env
335
+ [ :token, :secret, :verifier ].all? { |required_session_key| session(env)[required_session_key] }
336
+ end
337
+
338
+ def consumer
339
+ @consumer ||= ::OAuth::Consumer.new consumer_key, consumer_secret, :site => consumer_site
340
+ end
341
+
342
+ def valid?
343
+ @errors = []
344
+ @errors << ":consumer_key option is required" unless consumer_key
345
+ @errors << ":consumer_secret option is required" unless consumer_secret
346
+ @errors << ":consumer_site option is required" unless consumer_site
347
+ @errors.empty?
348
+ end
349
+
350
+ def raise_validation_exception
351
+ raise @errors.join(', ')
352
+ end
353
+
354
+ # Returns a hash of session variables, specific to this instance of Rack::OAuth and the end-user
355
+ #
356
+ # All user-specific variables are stored in the session.
357
+ #
358
+ # The variables we currently keep track of are:
359
+ # - token
360
+ # - secret
361
+ # - verifier
362
+ #
363
+ # With all three of these, we can make arbitrary requests to our OAuth provider for this user.
364
+ def session env
365
+ raise "Rack env['rack.session'] is nil ... has a Rack::Session middleware be enabled? " +
366
+ "use :rack_session for custom key" if env[rack_session].nil?
367
+ env[rack_session]['rack.oauth'] ||= {}
368
+ env[rack_session]['rack.oauth'][name] ||= {}
369
+ end
370
+
371
+ # Returns the #name of this Rack::OAuth unless the name is 'default', in which case it returns nil
372
+ def name_unless_default
373
+ name == Rack::OAuth.default_instance_name ? nil : name
374
+ end
375
+
376
+ end
377
+
378
+ end
@@ -0,0 +1,58 @@
1
+ --- !ruby/object:OAuth::AccessToken
2
+ consumer: !ruby/object:OAuth::Consumer
3
+ http: !ruby/object:Net::HTTP
4
+ address: twitter.com
5
+ close_on_empty_response: false
6
+ curr_http_version: "1.1"
7
+ debug_output:
8
+ newimpl: true
9
+ open_timeout:
10
+ port: 80
11
+ read_timeout: 60
12
+ seems_1_0_server: false
13
+ socket:
14
+ ssl_context: !ruby/object:OpenSSL::SSL::SSLContext
15
+ ca_file: /etc/ssl/certs/ca-certificates.crt
16
+ ca_path:
17
+ cert:
18
+ cert_store:
19
+ client_ca:
20
+ client_cert_cb:
21
+ extra_chain_cert:
22
+ key:
23
+ options:
24
+ session_get_cb:
25
+ session_id_context:
26
+ session_new_cb:
27
+ session_remove_cb:
28
+ timeout:
29
+ tmp_dh_callback:
30
+ verify_callback:
31
+ verify_depth: 5
32
+ verify_mode: 1
33
+ started: false
34
+ use_ssl: false
35
+ http_method: :post
36
+ key: 4JjFmhjfZyQ6rdbiql5A
37
+ options:
38
+ :http_method: :post
39
+ :scheme: :header
40
+ :oauth_version: "1.0"
41
+ :proxy:
42
+ :request_token_path: /oauth/request_token
43
+ :authorize_path: /oauth/authorize
44
+ :site: http://twitter.com
45
+ :signature_method: HMAC-SHA1
46
+ :access_token_path: /oauth/access_token
47
+ secret: rv4ZaCgvxVPVjxHIDbMxTGFbIMxUa4KkIdPqL7HmaQo
48
+ params:
49
+ oauth_token_secret: K7Z5LHyweHKd3rPaaiHMUCaYQyAC0suWQcOPGfM
50
+ :user_id: "11043342"
51
+ user_id: "11043342"
52
+ :oauth_token_secret: K7Z5LHyweHKd3rPaaiHMUCaYQyAC0suWQcOPGfM
53
+ :screen_name: remitaylor
54
+ oauth_token: 11043342-rH2Rdn9AcLzVBIL3cnQqCJ96mb0Zp2XC56Qx4bsMB
55
+ :oauth_token: 11043342-rH2Rdn9AcLzVBIL3cnQqCJ96mb0Zp2XC56Qx4bsMB
56
+ screen_name: remitaylor
57
+ secret: K7Z5LHyweHKd3rPaaiHMUCaYQyAC0suWQcOPGfM
58
+ token: 11043342-rH2Rdn9AcLzVBIL3cnQqCJ96mb0Zp2XC56Qx4bsMB
@@ -0,0 +1 @@
1
+ --- sCJz6SHIaQAUtAj4FOmTwwwpruV3fsGAWsrH3ynqQ
@@ -0,0 +1 @@
1
+ --- XnS8UEe2l4iKAYqPBFhQ0wfI0s3i2nLE1RjnC1CbA
@@ -0,0 +1 @@
1
+ --- 6dhuchM6Wzh9PpNv0KGB0h3AxzHLZ2Vy9erSJsOAv4
@@ -0,0 +1,56 @@
1
+ --- !ruby/object:OAuth::RequestToken
2
+ consumer: !ruby/object:OAuth::Consumer
3
+ http: !ruby/object:Net::HTTP
4
+ address: twitter.com
5
+ close_on_empty_response: false
6
+ curr_http_version: "1.1"
7
+ debug_output:
8
+ newimpl: true
9
+ open_timeout:
10
+ port: 80
11
+ read_timeout: 60
12
+ seems_1_0_server: false
13
+ socket:
14
+ ssl_context: !ruby/object:OpenSSL::SSL::SSLContext
15
+ ca_file: /etc/ssl/certs/ca-certificates.crt
16
+ ca_path:
17
+ cert:
18
+ cert_store:
19
+ client_ca:
20
+ client_cert_cb:
21
+ extra_chain_cert:
22
+ key:
23
+ options:
24
+ session_get_cb:
25
+ session_id_context:
26
+ session_new_cb:
27
+ session_remove_cb:
28
+ timeout:
29
+ tmp_dh_callback:
30
+ verify_callback:
31
+ verify_depth: 5
32
+ verify_mode: 1
33
+ started: false
34
+ use_ssl: false
35
+ http_method: :post
36
+ key: 4JjFmhjfZyQ6rdbiql5A
37
+ options:
38
+ :http_method: :post
39
+ :scheme: :header
40
+ :oauth_version: "1.0"
41
+ :proxy:
42
+ :request_token_path: /oauth/request_token
43
+ :authorize_path: AUTH_PATH
44
+ :site: http://twitter.com
45
+ :signature_method: HMAC-SHA1
46
+ :access_token_path: /oauth/access_token
47
+ secret: rv4ZaCgvxVPVjxHIDbMxTGFbIMxUa4KkIdPqL7HmaQo
48
+ params:
49
+ oauth_callback_confirmed: "true"
50
+ oauth_token_secret: XnS8UEe2l4iKAYqPBFhQ0wfI0s3i2nLE1RjnC1CbA
51
+ :oauth_callback_confirmed: "true"
52
+ :oauth_token_secret: XnS8UEe2l4iKAYqPBFhQ0wfI0s3i2nLE1RjnC1CbA
53
+ oauth_token: 6dhuchM6Wzh9PpNv0KGB0h3AxzHLZ2Vy9erSJsOAv4
54
+ :oauth_token: 6dhuchM6Wzh9PpNv0KGB0h3AxzHLZ2Vy9erSJsOAv4
55
+ secret: XnS8UEe2l4iKAYqPBFhQ0wfI0s3i2nLE1RjnC1CbA
56
+ token: 6dhuchM6Wzh9PpNv0KGB0h3AxzHLZ2Vy9erSJsOAv4