heroku-bouncer 0.4.3 → 0.5.0

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
2
  SHA1:
3
- metadata.gz: 415f3f61030a94fb1e1eb0a4481be6fb8d60b5cd
4
- data.tar.gz: 7cc105448d3d48f17ac0271ce336bb355245631e
3
+ metadata.gz: 1c2e6354ce81c7a731c46a10e0edd91c685f13d3
4
+ data.tar.gz: 0300b9cf964ea44056ce82053d5bf02af00c15d6
5
5
  SHA512:
6
- metadata.gz: c977a0ea26bdac8fd14863a761a34492f9155b341171f707544bb9a816032f82bc29ba5414f0013168bcab71801a8ef0dcca56f20caea249a9b89eac9f577063
7
- data.tar.gz: aa0ce2396d42163f876f37c9f3ae01c7d831250f26e664411a8aa56782101d065582c3351b705256c5bd322d6c99b2cd5a14e0b5a3cb755a5155b98c227d7e20
6
+ metadata.gz: 5d51fd44281f27481049a5a0b960c0c24db85f7c0f699d4c41a7b39932f205bfbc1d7aa66f4f2dc8fc9e326e3607760ee99673ce87dbb0c52fe3ec1408eda816
7
+ data.tar.gz: 212d42f2bf85cac32982e732c23e7d310ed2def34d800f5486b8f64f8b9f7f5823c1a18333df2c64eec21df8479564e72c4baaf5a94ffa2215c518823bfcf4b4
data/CHANGELOG.md ADDED
@@ -0,0 +1,76 @@
1
+ # 0.5.0
2
+
3
+ Adds `allow_if` option, and deprecates `herokai_only` (#35). Thanks
4
+ @stillinbeta!
5
+
6
+ # 0.4.3
7
+
8
+ This release addresses options hash re-use (#34). Thanks @gregburek for
9
+ reporting!
10
+
11
+ # 0.4.2
12
+
13
+ This release limits the size of the URL stored in the session, which
14
+ could result in a cookie overflow condition
15
+
16
+ # 0.4.1
17
+
18
+ This release addresses an open redirect security vulernability
19
+ addressed in #31. Thanks @raul!
20
+
21
+ # 0.4.0
22
+
23
+ This is nearly 1.0 ready, but I would like to see some additional
24
+ changes in the following areas:
25
+
26
+ * Option refactoring. We have a huge number of options now.
27
+ * Extensibility. It should be easier to extend/inherit from
28
+ Heroku::Bouncer to tweak its behavior. This was possible under 0.3.x
29
+ but is no longer true in 0.4.0.
30
+ * Remove backwards compatibility support (i.e. ENV vars)
31
+
32
+ To those upgrading, please note that a great deal has changed. Backwards
33
+ compatibility with warnings has been maintained in this version, but not
34
+ throughly tested. Extensibility has not - you'll need to do some new
35
+ tricks if you have extended Heroku::Bouncer in your app.
36
+
37
+ # 0.4.0.pre\*
38
+
39
+ Pre-releases changes were not documented. See 0.4.0 for details.
40
+
41
+ # 0.3.4
42
+
43
+ Fix a redirect loop (#16).
44
+
45
+ # 0.3.3
46
+
47
+ Fix bug with `herokai_only` writing to session even if the user is not
48
+ Herokai.
49
+
50
+ # 0.3.2
51
+
52
+ Fix bug with creating an anonymous Module object for the `Heroku`
53
+ constant.
54
+
55
+ # 0.3.1
56
+
57
+ Fix a bug with session destruction.
58
+
59
+ # 0.3.0
60
+
61
+ Switch to using the encrypted cookie gem for session storage.
62
+
63
+ # 0.2.1
64
+
65
+ Don't store data in the session until after checking email address.
66
+
67
+ # 0.2.0
68
+
69
+ * Prefer `HEROKU_OAUTH_ID` and `HEROKU_OAUTH_SECRET` environment
70
+ variables.
71
+ * Check these variables for values, and disable middleware if they are
72
+ not present.
73
+
74
+ # 0.1.0
75
+
76
+ First "production" release.
data/README.md CHANGED
@@ -90,22 +90,35 @@ use Heroku::Bouncer,
90
90
  secret: ENV['HEROKU_BOUNCER_SECRET']
91
91
  ```
92
92
 
93
- There are 8 additional options you can pass to the middleware:
93
+ Here are the supported options you can pass to the middleware:
94
94
 
95
95
  * `oauth[:scope]`: The [OAuth scope][] to use when requesting the OAuth
96
96
  token. Default: `identity`.
97
- * `herokai_only`: Automatically redirects non-Heroku accounts to
98
- `www.heroku.com`. Alternatively, pass a valid URL and non-Herokai will
99
- be redirected there. Default: `false`
97
+ * `allow_if`: A lambda that takes an email address. If the lambda evaluates to
98
+ true, allow the user through. If false, redirects to `redirect_url`.
99
+ By default, all users are allowed through after authenticating.
100
+ * `redirect_url`: Where unauthorized users are redirected to. Defaults to
101
+ `www.heroku.com`.
100
102
  * `expose_token`: Expose the OAuth token in the session, allowing you to
101
103
  make API calls as the user. Default: `false`
102
104
  * `expose_email`: Expose the user's email address in the session.
103
105
  Default: `true`
104
106
  * `expose_user`: Expose the user attributes in the session. Default:
105
107
  `true`
106
- * `session_sync_nonce`: If present, determines the name of a cookie shared across properties under a same domain in order to keep their sessions synchronized. Default: `nil`
107
- * `allow_anonymous`: Accepts a lambda that gets called with each request. If the lambda evals to true, the request will not enforce authentication (e.g: `allow_anonymous: lambda { |req| !/\A\/admin/.match(req.fullpath) }` will allow anonymous requests except those with under the `/admin` path). Default: `nil`, which does not allow anonymous access to any URL.
108
- * `skip`: Accepts a lambda that gets called with each request's `env`. If the lambda gets evaluated to true, heroku-bouncer's middleware will be completely skipped. Default: 'false', which applies heroku-bouncer to all requests.
108
+ * `session_sync_nonce`: If present, determines the name of a cookie
109
+ shared across properties under a same domain in order to keep their
110
+ sessions synchronized. Default: `nil`
111
+ * `allow_anonymous`: Accepts a lambda that gets called with each
112
+ request. If the lambda evals to true, the request will not enforce
113
+ authentication (e.g:
114
+ `allow_anonymous: lambda { |req| !/\A\/admin/.match(req.fullpath) }`
115
+ will allow anonymous requests except those with under the `/admin`
116
+ path). Default: `nil`, which does not allow anonymous access to any
117
+ URL.
118
+ * `skip`: Accepts a lambda that gets called with each request's `env`.
119
+ If the lambda gets evaluated to true, heroku-bouncer's middleware will
120
+ be completely skipped. Default: 'false', which applies heroku-bouncer
121
+ to all requests.
109
122
 
110
123
  You use these by passing a hash to the `use` call, for example:
111
124
 
@@ -157,8 +170,8 @@ logging in again.
157
170
  > Alternatively, [use inheritance to extend the middleware to act any way
158
171
  > you like][inheritance].
159
172
 
160
- Due to changes in how the middleware stack is built, this is currently
161
- broken in the 0.4.0 prereleases.
173
+ Due to changes in how the middleware stack is built, this is not trivial
174
+ in the 0.4.x releases.
162
175
 
163
176
  ## Security Model: A Tale of Three Secrets
164
177
 
@@ -20,7 +20,20 @@ class Heroku::Bouncer::Middleware < Sinatra::Base
20
20
  else
21
21
  super(app)
22
22
  @cookie_secret = extract_option(options, :secret, SecureRandom.base64(32))
23
- @herokai_only = extract_option(options, :herokai_only, false)
23
+ @allow_if = extract_option(options, :allow_if, nil)
24
+ @redirect_url = extract_option(options, :redirect_url, 'https://www.heroku.com')
25
+
26
+ # backwards-compatibilty for `herokai_only`:
27
+ # * check email for ending with `@heroku.com`
28
+ # * The redirect URL can be passed as a string value to `herokai_only`
29
+ herokai_only = extract_deprecated_option("please use `allow_if` instead", options, :herokai_only, false)
30
+ if herokai_only
31
+ if herokai_only.is_a?(String) && !options[:redirect_url]
32
+ @redirect_url = herokai_only
33
+ end
34
+ @allow_if ||= lambda { |email| email.end_with?("@heroku.com") }
35
+ end
36
+
24
37
  @expose_token = extract_option(options, :expose_token, false)
25
38
  @expose_email = extract_option(options, :expose_email, true)
26
39
  @expose_user = extract_option(options, :expose_user, true)
@@ -64,11 +77,11 @@ class Heroku::Bouncer::Middleware < Sinatra::Base
64
77
  # callback when successful, time to save data
65
78
  get '/auth/heroku/callback' do
66
79
  token = request.env['omniauth.auth']['credentials']['token']
67
- if @expose_email || @expose_user || @herokai_only
80
+ if @expose_email || @expose_user || !@allow_if.nil?
68
81
  user = fetch_user(token)
69
- if @herokai_only && !user['email'].end_with?("@heroku.com")
70
- url = @herokai_only.is_a?(String) ? @herokai_only : 'https://www.heroku.com'
71
- redirect to(url) and return
82
+ # Wrapping lambda to prevent short-circut proc return
83
+ if @allow_if.respond_to?(:call) && !lambda{ @allow_if.call(user['email'])}.call
84
+ redirect to(@redirect_url) and return
72
85
  end
73
86
  @expose_user ? store_write(:user, user) : store_write(:user, true)
74
87
  store_write(:email, user['email']) if @expose_email
@@ -155,7 +168,12 @@ private
155
168
  end
156
169
 
157
170
  def extract_option(options, option, default = nil)
158
- options.has_key?(option) ? options[option] : default
171
+ options.fetch(option, default)
172
+ end
173
+
174
+ def extract_deprecated_option(warning, options, option, default = nil)
175
+ $stderr.puts "[warn] heroku-bouncer: `#{option}` option is deprecated: #{warning}"
176
+ extract_option(options, option, default)
159
177
  end
160
178
 
161
179
  def fetch_user(token)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: heroku-bouncer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.3
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jonathan Dance
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-05-27 00:00:00.000000000 Z
11
+ date: 2014-09-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: omniauth-heroku
@@ -157,7 +157,9 @@ executables: []
157
157
  extensions: []
158
158
  extra_rdoc_files:
159
159
  - README.md
160
+ - CHANGELOG.md
160
161
  files:
162
+ - CHANGELOG.md
161
163
  - Gemfile
162
164
  - README.md
163
165
  - Rakefile