omniauth 1.9.0 → 2.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 14d58248b0e3ba4fa2a473a41eb741165f3a5845
4
- data.tar.gz: 8e0bf6159783ad5389739779cd857042758e1cd6
2
+ SHA256:
3
+ metadata.gz: 0fdf824504c682674830ea2d69b88977ca4be10f49f79130b3f75d324c7806d6
4
+ data.tar.gz: 2dc858d06ff250e7e4bef4d581bf64fb70d3a2baccbebcb53f81ff24e1023797
5
5
  SHA512:
6
- metadata.gz: 2d92df2609fbc42f208c36016e7a5ee9751ff3afb7995a1005e630cb1a616dca17396b785814a46b093f5f19c71cf7e5d33fedc64a9bd4ba7a02aa1c155f2b6a
7
- data.tar.gz: '01491bfb6bf5978b4cb93bf03ed22c287b726d8aeaf2d6b6b1fa417c5e9d7be35a09feeda639133823e6ee7870466a22a92c8c8ddeba9bb5fa19181c620dbd3f'
6
+ metadata.gz: 655b84ed20ad9b5c6a402e84c2333eab3e2a681d9aa4ba67f754448d02031a260fb7868b2dfa25016ed941a123aa4b991d0affbffa5170ee440d389c650b4316
7
+ data.tar.gz: 64a646106221782aff31af2bcab225b79314d8d90c0072a24488633e01d049721a1231959d424135f59d052add7bc47780e7f2affac44acd46e1eb9b0a1f5847
@@ -0,0 +1,2 @@
1
+ github: bobbymcwho
2
+ tidelift: rubygems/omniauth
@@ -0,0 +1,89 @@
1
+ # This workflow uses actions that are not certified by GitHub.
2
+ # They are provided by a third-party and are governed by
3
+ # separate terms of service, privacy policy, and support
4
+ # documentation.
5
+ # This workflow will download a prebuilt Ruby version, install dependencies and run tests with Rake
6
+ # For more information see: https://github.com/marketplace/actions/setup-ruby-jruby-and-truffleruby
7
+
8
+ name: Ruby
9
+
10
+ on:
11
+ push:
12
+ branches: [ master ]
13
+ pull_request:
14
+ branches: [ master ]
15
+
16
+ jobs:
17
+ test:
18
+ runs-on: ubuntu-18.04
19
+ strategy:
20
+ fail-fast: false
21
+ matrix:
22
+ os: [ubuntu, macos]
23
+ ruby: [2.5, 2.6, 2.7, head, debug, truffleruby, truffleruby-head]
24
+ steps:
25
+ - uses: actions/checkout@v2
26
+ - name: Set up Ruby
27
+ uses: ruby/setup-ruby@v1
28
+ with:
29
+ ruby-version: ${{ matrix.ruby }}
30
+ bundler-cache: true
31
+ - name: Install dependencies
32
+ run: bundle install
33
+ - name: Run tests
34
+ run: bundle exec rake
35
+ test-jruby:
36
+ runs-on: ubuntu-18.04
37
+ strategy:
38
+ fail-fast: false
39
+ matrix:
40
+ os: [ubuntu, macos]
41
+ jruby: [jruby, jruby-head]
42
+ steps:
43
+ - uses: actions/checkout@v2
44
+ - name: Set up Ruby
45
+ uses: ruby/setup-ruby@v1
46
+ with:
47
+ ruby-version: ${{ matrix.jruby }}
48
+ bundler-cache: true
49
+ - name: Install dependencies
50
+ env:
51
+ JRUBY_OPTS: --debug
52
+ run: bundle install
53
+ - name: Run tests
54
+ env:
55
+ JRUBY_OPTS: --debug
56
+ run: bundle exec rake
57
+ frozen-string-compat:
58
+ runs-on: ubuntu-18.04
59
+ steps:
60
+ - uses: actions/checkout@v2
61
+ - name: Set up Ruby
62
+ uses: ruby/setup-ruby@v1
63
+ with:
64
+ ruby-version: 2.6
65
+ bundler-cache: true
66
+ - name: Install dependencies
67
+ run: bundle install
68
+ - name: Run tests
69
+ env:
70
+ RUBYOPT: "--enable-frozen-string-literal"
71
+ run: bundle exec rake
72
+ coveralls:
73
+ runs-on: ubuntu-18.04
74
+ steps:
75
+ - uses: actions/checkout@v2
76
+ - name: Set up Ruby
77
+ uses: ruby/setup-ruby@v1
78
+ with:
79
+ ruby-version: 2.6
80
+ bundler-cache: true
81
+ - name: Install dependencies
82
+ run: bundle install
83
+ - name: Run tests
84
+ run: bundle exec rake
85
+ - name: Coveralls GitHub Action
86
+ uses: coverallsapp/github-action@v1.1.2
87
+ with:
88
+ github-token: ${{ secrets.github_token }}
89
+ path-to-lcov: './coverage/lcov/omniauth.lcov'
data/.gitignore CHANGED
@@ -10,3 +10,4 @@ doc/*
10
10
  log/*
11
11
  measurement/*
12
12
  pkg/*
13
+ .DS_Store
data/Gemfile CHANGED
@@ -1,6 +1,6 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
- gem 'jruby-openssl', '~> 0.9.19', :platforms => :jruby
3
+ gem 'jruby-openssl', '~> 0.10.5', :platforms => :jruby
4
4
  gem 'rake', '>= 12.0'
5
5
  gem 'yard', '>= 0.9.11'
6
6
 
@@ -12,16 +12,18 @@ group :development do
12
12
  end
13
13
 
14
14
  group :test do
15
- gem 'coveralls', :require => false
16
- gem 'hashie', '>= 3.4.6', '< 3.7.0', :platforms => [:jruby_18]
17
- gem 'json', '~> 2.0.3', :platforms => %i[jruby_18 jruby_19 ruby_19]
15
+ gem 'coveralls_reborn', '~> 0.19.0', require: false
16
+ gem 'hashie', '>= 3.4.6', '~> 4.0.0', :platforms => [:jruby_18]
17
+ gem 'json', '~> 2.3.0', :platforms => %i[jruby_18 jruby_19 ruby_19]
18
18
  gem 'mime-types', '~> 3.1', :platforms => [:jruby_18]
19
19
  gem 'rack', '>= 2.0.6', :platforms => %i[jruby_18 jruby_19 ruby_19 ruby_20 ruby_21]
20
20
  gem 'rack-test'
21
21
  gem 'rest-client', '~> 2.0.0', :platforms => [:jruby_18]
22
- gem 'rspec', '~> 3.5.0'
23
- gem 'rubocop', '>= 0.58.2', :platforms => %i[ruby_20 ruby_21 ruby_22 ruby_23 ruby_24]
24
- gem 'tins', '~> 1.13.0', :platforms => %i[jruby_18 jruby_19 ruby_19]
22
+ gem 'rspec', '~> 3.5'
23
+ gem 'rack-freeze'
24
+ gem 'rubocop', '>= 0.58.2', '< 0.69.0', :platforms => %i[ruby_20 ruby_21 ruby_22 ruby_23 ruby_24]
25
+ gem 'simplecov-lcov'
26
+ gem 'tins', '~> 1.13', :platforms => %i[jruby_18 jruby_19 ruby_19]
25
27
  end
26
28
 
27
29
  gemspec
data/README.md CHANGED
@@ -2,17 +2,16 @@
2
2
 
3
3
  [![Gem Version](http://img.shields.io/gem/v/omniauth.svg)][gem]
4
4
  [![Build Status](http://img.shields.io/travis/omniauth/omniauth.svg)][travis]
5
- [![Dependency Status](http://img.shields.io/gemnasium/omniauth/omniauth.svg)][gemnasium]
6
- [![Code Climate](http://img.shields.io/codeclimate/github/omniauth/omniauth.svg)][codeclimate]
5
+ [![Code Climate](https://api.codeclimate.com/v1/badges/ffd33970723587806744/maintainability)][codeclimate]
7
6
  [![Coverage Status](http://img.shields.io/coveralls/omniauth/omniauth.svg)][coveralls]
8
- [![Security](https://hakiri.io/github/omniauth/omniauth/master.svg)](https://hakiri.io/github/omniauth/omniauth/master)
9
7
 
10
8
  [gem]: https://rubygems.org/gems/omniauth
11
9
  [travis]: http://travis-ci.org/omniauth/omniauth
12
- [gemnasium]: https://gemnasium.com/omniauth/omniauth
13
10
  [codeclimate]: https://codeclimate.com/github/omniauth/omniauth
14
11
  [coveralls]: https://coveralls.io/r/omniauth/omniauth
15
12
 
13
+ This is the documentation for OmniAuth v2.0.2.
14
+
16
15
  ## An Introduction
17
16
  OmniAuth is a library that standardizes multi-provider authentication for
18
17
  web applications. It was created to be powerful, flexible, and do as
@@ -34,8 +33,8 @@ development and easily swap in other strategies later.
34
33
  ## Getting Started
35
34
  Each OmniAuth strategy is a Rack Middleware. That means that you can use
36
35
  it the same way that you use any other Rack middleware. For example, to
37
- use the built-in Developer strategy in a Sinatra application I might do
38
- this:
36
+ use the built-in Developer strategy in a Sinatra application you might
37
+ do this:
39
38
 
40
39
  ```ruby
41
40
  require 'sinatra'
@@ -47,7 +46,7 @@ class MyApplication < Sinatra::Base
47
46
  end
48
47
  ```
49
48
 
50
- Because OmniAuth is built for *multi-provider* authentication, I may
49
+ Because OmniAuth is built for *multi-provider* authentication, you may
51
50
  want to leave room to run multiple strategies. For this, the built-in
52
51
  `OmniAuth::Builder` class gives you an easy way to specify multiple
53
52
  strategies. Note that there is **no difference** between the following
@@ -84,18 +83,21 @@ environment of a request to `/auth/:provider/callback`. This hash
84
83
  contains as much information about the user as OmniAuth was able to
85
84
  glean from the utilized strategy. You should set up an endpoint in your
86
85
  application that matches to the callback URL and then performs whatever
87
- steps are necessary for your application. For example, in a Rails app I
88
- would add a line in my `routes.rb` file like this:
86
+ steps are necessary for your application. For example, in a Rails app
87
+ you would add a line in your `routes.rb` file like this:
89
88
 
90
89
  ```ruby
91
- get '/auth/:provider/callback', to: 'sessions#create'
90
+ post '/auth/:provider/callback', to: 'sessions#create'
92
91
  ```
93
92
 
94
- And I might then have a `SessionsController` with code that looks
93
+ And you might then have a `SessionsController` with code that looks
95
94
  something like this:
96
95
 
97
96
  ```ruby
98
97
  class SessionsController < ApplicationController
98
+ # If you're using a strategy that POSTs during callback, you'll need to skip the authenticity token check for the callback action only.
99
+ skip_before_action :verify_authenticity_token, only: :create
100
+
99
101
  def create
100
102
  @user = User.find_or_create_from_auth_hash(auth_hash)
101
103
  self.current_user = @user
@@ -110,7 +112,7 @@ class SessionsController < ApplicationController
110
112
  end
111
113
  ```
112
114
 
113
- The `omniauth.auth` key in the environment hash gives me my
115
+ The `omniauth.auth` key in the environment hash provides an
114
116
  Authentication Hash which will contain information about the just
115
117
  authenticated user including a unique id, the strategy they just used
116
118
  for authentication, and personal details such as name and email address
@@ -122,6 +124,8 @@ environment information on the callback request. It is entirely up to
122
124
  you how you want to implement the particulars of your application's
123
125
  authentication flow.
124
126
 
127
+ **Please note:** there is currently a CSRF vulnerability which affects OmniAuth (designated [CVE-2015-9284](https://nvd.nist.gov/vuln/detail/CVE-2015-9284)) that requires mitigation at the application level. More details on how to do this can be found on the [Wiki](https://github.com/omniauth/omniauth/wiki/Resolving-CVE-2015-9284).
128
+
125
129
  ## Configuring The `origin` Param
126
130
  The `origin` url parameter is typically used to inform where a user came from and where, should you choose to use it, they'd want to return to.
127
131
 
@@ -163,7 +167,7 @@ a `session_store.rb` initializer, add `use ActionDispatch::Session::CookieStore`
163
167
  and have sessions functioning as normal.
164
168
 
165
169
  To be clear: sessions may work, but your session options will be ignored
166
- (i.e the session key will default to `_session_id`). Instead of the
170
+ (i.e. the session key will default to `_session_id`). Instead of the
167
171
  initializer, you'll have to set the relevant options somewhere
168
172
  before your middleware is built (like `application.rb`) and pass them to your
169
173
  preferred middleware, like this:
@@ -193,8 +197,14 @@ actively maintained in-depth documentation for OmniAuth. It should be
193
197
  your first stop if you are wondering about a more in-depth look at
194
198
  OmniAuth, how it works, and how to use it.
195
199
 
200
+ ## OmniAuth for Enterprise
201
+
202
+ Available as part of the Tidelift Subscription.
203
+
204
+ The maintainers of OmniAuth and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source packages you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact packages you use. [Learn more.](https://tidelift.com/subscription/pkg/rubygems-omniauth?utm_source=undefined&utm_medium=referral&utm_campaign=enterprise&utm_term=repo)
205
+
196
206
  ## Supported Ruby Versions
197
- OmniAuth is tested under 2.1.10, 2.2.6, 2.3.3, 2.4.0, 2.5.0, and JRuby.
207
+ OmniAuth is tested under 2.5, 2.6, 2.7, truffleruby, and JRuby.
198
208
 
199
209
  ## Versioning
200
210
  This library aims to adhere to [Semantic Versioning 2.0.0][semver]. Violations
data/SECURITY.md ADDED
@@ -0,0 +1,17 @@
1
+ # Security Policy
2
+
3
+ ## Supported Versions
4
+
5
+ Use this section to tell people about which versions of your project are
6
+ currently being supported with security updates.
7
+
8
+ | Version | Supported |
9
+ | ------- | ------------------ |
10
+ | 2.0.x | :white_check_mark: |
11
+ | <= 1.9.1 | :x: |
12
+
13
+ ## Security contact information
14
+
15
+ To report a security vulnerability, please use the
16
+ [Tidelift security contact](https://tidelift.com/security).
17
+ Tidelift will coordinate the fix and disclosure.
data/lib/omniauth.rb CHANGED
@@ -15,6 +15,7 @@ module OmniAuth
15
15
  autoload :Form, 'omniauth/form'
16
16
  autoload :AuthHash, 'omniauth/auth_hash'
17
17
  autoload :FailureEndpoint, 'omniauth/failure_endpoint'
18
+ autoload :AuthenticityTokenProtection, 'omniauth/authenticity_token_protection'
18
19
 
19
20
  def self.strategies
20
21
  @strategies ||= []
@@ -29,20 +30,22 @@ module OmniAuth
29
30
  logger
30
31
  end
31
32
 
32
- def self.defaults
33
+ def self.defaults # rubocop:disable MethodLength
33
34
  @defaults ||= {
34
35
  :camelizations => {},
35
36
  :path_prefix => '/auth',
36
37
  :on_failure => OmniAuth::FailureEndpoint,
37
38
  :failure_raise_out_environments => ['development'],
39
+ :request_validation_phase => OmniAuth::AuthenticityTokenProtection,
38
40
  :before_request_phase => nil,
39
41
  :before_callback_phase => nil,
40
42
  :before_options_phase => nil,
41
43
  :form_css => Form::DEFAULT_CSS,
42
44
  :test_mode => false,
43
45
  :logger => default_logger,
44
- :allowed_request_methods => %i[get post],
45
- :mock_auth => {:default => AuthHash.new('provider' => 'default', 'uid' => '1234', 'info' => {'name' => 'Example User'})}
46
+ :allowed_request_methods => %i[post],
47
+ :mock_auth => {:default => AuthHash.new('provider' => 'default', 'uid' => '1234', 'info' => {'name' => 'Example User'})},
48
+ :silence_get_warning => false
46
49
  }
47
50
  end
48
51
 
@@ -74,6 +77,14 @@ module OmniAuth
74
77
  end
75
78
  end
76
79
 
80
+ def request_validation_phase(&block)
81
+ if block_given?
82
+ @request_validation_phase = block
83
+ else
84
+ @request_validation_phase
85
+ end
86
+ end
87
+
77
88
  def before_request_phase(&block)
78
89
  if block_given?
79
90
  @before_request_phase = block
@@ -111,8 +122,9 @@ module OmniAuth
111
122
  camelizations[name.to_s] = camelized.to_s
112
123
  end
113
124
 
114
- attr_writer :on_failure, :before_callback_phase, :before_options_phase, :before_request_phase
115
- attr_accessor :failure_raise_out_environments, :path_prefix, :allowed_request_methods, :form_css, :test_mode, :mock_auth, :full_host, :camelizations, :logger
125
+ attr_writer :on_failure, :before_callback_phase, :before_options_phase, :before_request_phase, :request_validation_phase
126
+ attr_accessor :failure_raise_out_environments, :path_prefix, :allowed_request_methods, :form_css,
127
+ :test_mode, :mock_auth, :full_host, :camelizations, :logger, :silence_get_warning
116
128
  end
117
129
 
118
130
  def self.config
@@ -132,7 +144,7 @@ module OmniAuth
132
144
  end
133
145
 
134
146
  module Utils
135
- module_function
147
+ module_function # rubocop:disable Layout/IndentationWidth
136
148
 
137
149
  def form_css
138
150
  "<style type='text/css'>#{OmniAuth.config.form_css}</style>"
@@ -159,7 +171,7 @@ module OmniAuth
159
171
  if first_letter_in_uppercase
160
172
  word.to_s.gsub(%r{/(.?)}) { '::' + Regexp.last_match[1].upcase }.gsub(/(^|_)(.)/) { Regexp.last_match[2].upcase }
161
173
  else
162
- word.first + camelize(word)[1..-1]
174
+ camelize(word).tap { |w| w[0] = w[0].downcase }
163
175
  end
164
176
  end
165
177
  end
@@ -0,0 +1,32 @@
1
+ require 'rack-protection'
2
+
3
+ module OmniAuth
4
+ class AuthenticityError < StandardError; end
5
+ class AuthenticityTokenProtection < Rack::Protection::AuthenticityToken
6
+ def initialize(options = {})
7
+ @options = default_options.merge(options)
8
+ end
9
+
10
+ def self.call(env)
11
+ new.call!(env)
12
+ end
13
+
14
+ def call!(env)
15
+ return if accepts?(env)
16
+
17
+ instrument env
18
+ react env
19
+ end
20
+
21
+ alias_method :call, :call!
22
+
23
+ private
24
+
25
+ def deny(_env)
26
+ OmniAuth.logger.send(:warn, "Attack prevented by #{self.class}")
27
+ raise AuthenticityError.new(options[:message])
28
+ end
29
+
30
+ alias default_reaction deny
31
+ end
32
+ end
@@ -1,24 +1,5 @@
1
1
  module OmniAuth
2
2
  class Builder < ::Rack::Builder
3
- def initialize(app, &block)
4
- @options = nil
5
- if rack14? || rack2?
6
- super
7
- else
8
- @app = app
9
- super(&block)
10
- @ins << @app
11
- end
12
- end
13
-
14
- def rack14?
15
- Rack.release.start_with?('1.') && (Rack.release.split('.')[1].to_i >= 4)
16
- end
17
-
18
- def rack2?
19
- Rack.release.start_with? '2.'
20
- end
21
-
22
3
  def on_failure(&block)
23
4
  OmniAuth.config.on_failure = block
24
5
  end
@@ -40,7 +21,7 @@ module OmniAuth
40
21
  end
41
22
 
42
23
  def options(options = false)
43
- return @options || {} if options == false
24
+ return @options ||= {} if options == false
44
25
 
45
26
  @options = options
46
27
  end
@@ -50,7 +31,7 @@ module OmniAuth
50
31
  middleware = klass
51
32
  else
52
33
  begin
53
- middleware = OmniAuth::Strategies.const_get(OmniAuth::Utils.camelize(klass.to_s).to_s)
34
+ middleware = OmniAuth::Strategies.const_get(OmniAuth::Utils.camelize(klass.to_s).to_s, false)
54
35
  rescue NameError
55
36
  raise(LoadError.new("Could not find matching strategy for #{klass.inspect}. You may need to install an additional gem (such as omniauth-#{klass})."))
56
37
  end
@@ -27,10 +27,19 @@ module OmniAuth
27
27
 
28
28
  def redirect_to_failure
29
29
  message_key = env['omniauth.error.type']
30
- new_path = "#{env['SCRIPT_NAME']}#{OmniAuth.config.path_prefix}/failure?message=#{message_key}#{origin_query_param}#{strategy_name_query_param}"
30
+
31
+ new_path = "#{env['SCRIPT_NAME']}#{strategy_path_prefix}/failure?message=#{Rack::Utils.escape(message_key)}#{origin_query_param}#{strategy_name_query_param}"
31
32
  Rack::Response.new(['302 Moved'], 302, 'Location' => new_path).finish
32
33
  end
33
34
 
35
+ def strategy_path_prefix
36
+ if env['omniauth.error.strategy']
37
+ env['omniauth.error.strategy'].path_prefix
38
+ else
39
+ OmniAuth.config.path_prefix
40
+ end
41
+ end
42
+
34
43
  def strategy_name_query_param
35
44
  return '' unless env['omniauth.error.strategy']
36
45
 
data/lib/omniauth/form.rb CHANGED
@@ -9,7 +9,7 @@ module OmniAuth
9
9
  options[:header_info] ||= ''
10
10
  self.options = options
11
11
 
12
- @html = ''
12
+ @html = +'' # unary + string allows it to be mutable if strings are frozen
13
13
  @with_custom_button = false
14
14
  @footer = nil
15
15
  header(options[:title], options[:header_info])
@@ -180,18 +180,44 @@ module OmniAuth
180
180
  raise(error)
181
181
  end
182
182
 
183
+ warn_if_using_get
184
+
183
185
  @env = env
184
186
  @env['omniauth.strategy'] = self if on_auth_path?
185
187
 
186
188
  return mock_call!(env) if OmniAuth.config.test_mode
187
- return options_call if on_auth_path? && options_request?
188
- return request_call if on_request_path? && OmniAuth.config.allowed_request_methods.include?(request.request_method.downcase.to_sym)
189
- return callback_call if on_callback_path?
190
- return other_phase if respond_to?(:other_phase)
189
+
190
+ begin
191
+ return options_call if on_auth_path? && options_request?
192
+ return request_call if on_request_path? && OmniAuth.config.allowed_request_methods.include?(request.request_method.downcase.to_sym)
193
+ return callback_call if on_callback_path?
194
+ return other_phase if respond_to?(:other_phase)
195
+ rescue StandardError => e
196
+ return fail!(e.message, e)
197
+ end
191
198
 
192
199
  @app.call(env)
193
200
  end
194
201
 
202
+ def warn_if_using_get
203
+ return unless OmniAuth.config.allowed_request_methods.include?(:get)
204
+ return if OmniAuth.config.silence_get_warning
205
+
206
+ log :warn, <<-WARN
207
+ You are using GET as an allowed request method for OmniAuth. This may leave
208
+ you open to CSRF attacks. As of v2.0.0, OmniAuth by default allows only POST
209
+ to its own routes. You should review the following resources to guide your
210
+ mitigation:
211
+ https://github.com/omniauth/omniauth/wiki/Resolving-CVE-2015-9284
212
+ https://github.com/omniauth/omniauth/issues/960
213
+ https://nvd.nist.gov/vuln/detail/CVE-2015-9284
214
+ https://github.com/omniauth/omniauth/pull/809
215
+
216
+ You can ignore this warning by setting:
217
+ OmniAuth.config.silence_get_warning = true
218
+ WARN
219
+ end
220
+
195
221
  # Responds to an OPTIONS request.
196
222
  def options_call
197
223
  OmniAuth.config.before_options_phase.call(env) if OmniAuth.config.before_options_phase
@@ -202,17 +228,19 @@ module OmniAuth
202
228
  # Performs the steps necessary to run the request phase of a strategy.
203
229
  def request_call # rubocop:disable CyclomaticComplexity, MethodLength, PerceivedComplexity
204
230
  setup_phase
205
- log :info, 'Request phase initiated.'
231
+ log :debug, 'Request phase initiated.'
206
232
 
207
233
  # store query params from the request url, extracted in the callback_phase
208
234
  session['omniauth.params'] = request.GET
235
+
236
+ OmniAuth.config.request_validation_phase.call(env) if OmniAuth.config.request_validation_phase
209
237
  OmniAuth.config.before_request_phase.call(env) if OmniAuth.config.before_request_phase
210
238
 
211
239
  if options.form.respond_to?(:call)
212
- log :info, 'Rendering form from supplied Rack endpoint.'
240
+ log :debug, 'Rendering form from supplied Rack endpoint.'
213
241
  options.form.call(env)
214
242
  elsif options.form
215
- log :info, 'Rendering form from underlying application.'
243
+ log :debug, 'Rendering form from underlying application.'
216
244
  call_app!
217
245
  elsif !options.origin_param
218
246
  request_phase
@@ -225,12 +253,14 @@ module OmniAuth
225
253
 
226
254
  request_phase
227
255
  end
256
+ rescue OmniAuth::AuthenticityError => e
257
+ fail!(:authenticity_error, e)
228
258
  end
229
259
 
230
260
  # Performs the steps necessary to run the callback phase of a strategy.
231
261
  def callback_call
232
262
  setup_phase
233
- log :info, 'Callback phase initiated.'
263
+ log :debug, 'Callback phase initiated.'
234
264
  @env['omniauth.origin'] = session.delete('omniauth.origin')
235
265
  @env['omniauth.origin'] = nil if env['omniauth.origin'] == ''
236
266
  @env['omniauth.params'] = session.delete('omniauth.params') || {}
@@ -268,8 +298,12 @@ module OmniAuth
268
298
  # in the event that OmniAuth has been configured to be
269
299
  # in test mode.
270
300
  def mock_call!(*)
271
- return mock_request_call if on_request_path? && OmniAuth.config.allowed_request_methods.include?(request.request_method.downcase.to_sym)
272
- return mock_callback_call if on_callback_path?
301
+ begin
302
+ return mock_request_call if on_request_path? && OmniAuth.config.allowed_request_methods.include?(request.request_method.downcase.to_sym)
303
+ return mock_callback_call if on_callback_path?
304
+ rescue StandardError => e
305
+ return fail!(e.message, e)
306
+ end
273
307
 
274
308
  call_app!
275
309
  end
@@ -278,7 +312,10 @@ module OmniAuth
278
312
  setup_phase
279
313
 
280
314
  session['omniauth.params'] = request.GET
315
+
316
+ OmniAuth.config.request_validation_phase.call(env) if OmniAuth.config.request_validation_phase
281
317
  OmniAuth.config.before_request_phase.call(env) if OmniAuth.config.before_request_phase
318
+
282
319
  if options.origin_param
283
320
  if request.params[options.origin_param]
284
321
  session['omniauth.origin'] = request.params[options.origin_param]
@@ -312,10 +349,10 @@ module OmniAuth
312
349
  # underlying application. This will default to `/auth/:provider/setup`.
313
350
  def setup_phase
314
351
  if options[:setup].respond_to?(:call)
315
- log :info, 'Setup endpoint detected, running now.'
352
+ log :debug, 'Setup endpoint detected, running now.'
316
353
  options[:setup].call(env)
317
354
  elsif options[:setup]
318
- log :info, 'Calling through to underlying application for setup.'
355
+ log :debug, 'Calling through to underlying application for setup.'
319
356
  setup_env = env.merge('PATH_INFO' => setup_path, 'REQUEST_METHOD' => 'GET')
320
357
  call_app!(setup_env)
321
358
  end
@@ -345,11 +382,13 @@ module OmniAuth
345
382
  end
346
383
 
347
384
  def auth_hash
348
- hash = AuthHash.new(:provider => name, :uid => uid)
349
- hash.info = info unless skip_info?
350
- hash.credentials = credentials if credentials
351
- hash.extra = extra if extra
352
- hash
385
+ credentials_data = credentials
386
+ extra_data = extra
387
+ AuthHash.new(:provider => name, :uid => uid).tap do |auth|
388
+ auth.info = info unless skip_info?
389
+ auth.credentials = credentials_data if credentials_data
390
+ auth.extra = extra_data if extra_data
391
+ end
353
392
  end
354
393
 
355
394
  # Determines whether or not user info should be retrieved. This
@@ -389,7 +428,12 @@ module OmniAuth
389
428
  end
390
429
 
391
430
  def request_path
392
- @request_path ||= options[:request_path].is_a?(String) ? options[:request_path] : "#{path_prefix}/#{name}"
431
+ @request_path ||=
432
+ if options[:request_path].is_a?(String)
433
+ options[:request_path]
434
+ else
435
+ "#{script_name}#{path_prefix}/#{name}"
436
+ end
393
437
  end
394
438
 
395
439
  def callback_path
@@ -397,7 +441,7 @@ module OmniAuth
397
441
  path = options[:callback_path] if options[:callback_path].is_a?(String)
398
442
  path ||= current_path if options[:callback_path].respond_to?(:call) && options[:callback_path].call(env)
399
443
  path ||= custom_path(:request_path)
400
- path ||= "#{path_prefix}/#{name}/callback"
444
+ path ||= "#{script_name}#{path_prefix}/#{name}/callback"
401
445
  path
402
446
  end
403
447
  end
@@ -409,7 +453,7 @@ module OmniAuth
409
453
  CURRENT_PATH_REGEX = %r{/$}.freeze
410
454
  EMPTY_STRING = ''.freeze
411
455
  def current_path
412
- @current_path ||= request.path_info.downcase.sub(CURRENT_PATH_REGEX, EMPTY_STRING)
456
+ @current_path ||= request.path.downcase.sub(CURRENT_PATH_REGEX, EMPTY_STRING)
413
457
  end
414
458
 
415
459
  def query_string
@@ -441,7 +485,7 @@ module OmniAuth
441
485
  end
442
486
 
443
487
  def callback_url
444
- full_host + script_name + callback_path + query_string
488
+ full_host + callback_path + query_string
445
489
  end
446
490
 
447
491
  def script_name
@@ -491,16 +535,15 @@ module OmniAuth
491
535
  OmniAuth.config.on_failure.call(env)
492
536
  end
493
537
 
494
- def dup
495
- super.tap do
496
- @options = @options.dup
497
- end
498
- end
499
-
500
538
  class Options < OmniAuth::KeyStore; end
501
539
 
502
540
  protected
503
541
 
542
+ def initialize_copy(*args)
543
+ super
544
+ @options = @options.dup
545
+ end
546
+
504
547
  def merge_stack(stack)
505
548
  stack.inject({}) do |a, e|
506
549
  a.merge!(e)
@@ -1,3 +1,3 @@
1
1
  module OmniAuth
2
- VERSION = '1.9.0'.freeze
2
+ VERSION = '2.0.2'.freeze
3
3
  end
data/omniauth.gemspec CHANGED
@@ -5,9 +5,10 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
5
  require 'omniauth/version'
6
6
 
7
7
  Gem::Specification.new do |spec|
8
- spec.add_dependency 'hashie', ['>= 3.4.6', '< 3.7.0']
8
+ spec.add_dependency 'hashie', ['>= 3.4.6']
9
9
  spec.add_dependency 'rack', ['>= 1.6.2', '< 3']
10
- spec.add_development_dependency 'bundler', '~> 1.14'
10
+ spec.add_development_dependency 'bundler', '~> 2.0'
11
+ spec.add_dependency 'rack-protection'
11
12
  spec.add_development_dependency 'rake', '~> 12.0'
12
13
  spec.authors = ['Michael Bleigh', 'Erik Michaels-Ober', 'Tom Milewski']
13
14
  spec.description = 'A generalized Rack framework for multiple-provider authentication.'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: omniauth
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.9.0
4
+ version: 2.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael Bleigh
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2018-12-14 00:00:00.000000000 Z
13
+ date: 2021-02-02 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: hashie
@@ -19,9 +19,6 @@ dependencies:
19
19
  - - ">="
20
20
  - !ruby/object:Gem::Version
21
21
  version: 3.4.6
22
- - - "<"
23
- - !ruby/object:Gem::Version
24
- version: 3.7.0
25
22
  type: :runtime
26
23
  prerelease: false
27
24
  version_requirements: !ruby/object:Gem::Requirement
@@ -29,9 +26,6 @@ dependencies:
29
26
  - - ">="
30
27
  - !ruby/object:Gem::Version
31
28
  version: 3.4.6
32
- - - "<"
33
- - !ruby/object:Gem::Version
34
- version: 3.7.0
35
29
  - !ruby/object:Gem::Dependency
36
30
  name: rack
37
31
  requirement: !ruby/object:Gem::Requirement
@@ -58,14 +52,28 @@ dependencies:
58
52
  requirements:
59
53
  - - "~>"
60
54
  - !ruby/object:Gem::Version
61
- version: '1.14'
55
+ version: '2.0'
62
56
  type: :development
63
57
  prerelease: false
64
58
  version_requirements: !ruby/object:Gem::Requirement
65
59
  requirements:
66
60
  - - "~>"
67
61
  - !ruby/object:Gem::Version
68
- version: '1.14'
62
+ version: '2.0'
63
+ - !ruby/object:Gem::Dependency
64
+ name: rack-protection
65
+ requirement: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ type: :runtime
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
69
77
  - !ruby/object:Gem::Dependency
70
78
  name: rake
71
79
  requirement: !ruby/object:Gem::Requirement
@@ -89,18 +97,21 @@ executables: []
89
97
  extensions: []
90
98
  extra_rdoc_files: []
91
99
  files:
100
+ - ".github/FUNDING.yml"
92
101
  - ".github/ISSUE_TEMPLATE.md"
102
+ - ".github/workflows/main.yml"
93
103
  - ".gitignore"
94
104
  - ".rspec"
95
105
  - ".rubocop.yml"
96
- - ".travis.yml"
97
106
  - ".yardopts"
98
107
  - Gemfile
99
108
  - LICENSE.md
100
109
  - README.md
101
110
  - Rakefile
111
+ - SECURITY.md
102
112
  - lib/omniauth.rb
103
113
  - lib/omniauth/auth_hash.rb
114
+ - lib/omniauth/authenticity_token_protection.rb
104
115
  - lib/omniauth/builder.rb
105
116
  - lib/omniauth/failure_endpoint.rb
106
117
  - lib/omniauth/form.css
@@ -133,8 +144,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
133
144
  - !ruby/object:Gem::Version
134
145
  version: 1.3.5
135
146
  requirements: []
136
- rubyforge_project:
137
- rubygems_version: 2.6.11
147
+ rubygems_version: 3.0.0
138
148
  signing_key:
139
149
  specification_version: 4
140
150
  summary: A generalized Rack framework for multiple-provider authentication.
data/.travis.yml DELETED
@@ -1,23 +0,0 @@
1
- bundler_args: --without development
2
- before_install:
3
- - gem update --system
4
- - gem update bundler
5
- cache: bundler
6
- env:
7
- global:
8
- - JRUBY_OPTS="$JRUBY_OPTS --debug"
9
- language: ruby
10
- rvm:
11
- - jruby-9000
12
- - 2.2.9
13
- - 2.3.5
14
- - 2.4.4
15
- - 2.5.3
16
- - jruby-head
17
- - ruby-head
18
- matrix:
19
- allow_failures:
20
- - rvm: jruby-head
21
- - rvm: ruby-head
22
- fast_finish: true
23
- sudo: false