consul 1.0.2 → 1.0.3

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: 354c035304ffa8887ff031f0cc898aaab38da8b2
4
- data.tar.gz: c9ec6a1775deb257c429277a66c254a7c2796ca8
2
+ SHA256:
3
+ metadata.gz: 49583154c64138e64a0fa47a0e85be855a0a54b05e906ca5ca0da4e6fa39ee16
4
+ data.tar.gz: 149f14959bc7e8ef2a3dc90a9d446f4840229d1f022f164534f23b099275ac6a
5
5
  SHA512:
6
- metadata.gz: '07596f0e3957b6e3bca2881c9eedf940514ec25b45a2390a9583ff85a2807824bd389d25e8893ed2b53855ffc27bb27ea7faf776293fecbc9bc0b47abb792b5d'
7
- data.tar.gz: 48f3fcab23fa832628c8b6a34f55446cd97e6b4852c093bdd6fdd700eb52248ed91911877a80ec02118596c4c7243dfa4d6d8e3a7e29be96f930ca2c44759c4f
6
+ metadata.gz: 3877afeee641f47702f2951e9b1609220b96c85df245d2a0a0f91c301823fce9e878a8b7e39d8b90f34a7104dd4ce8c3027afa41c76731003ae0ab137fbbb991
7
+ data.tar.gz: d96bf2a79ef26bf7e8567b02bb306d76f8d1314fd1ba0179ad85f1a0fd51cbaecb573365dd645815d4b82445a92ea030fd29786c2eff67c33238e8c770510284
data/.gitignore CHANGED
@@ -6,4 +6,4 @@ pkg
6
6
  *.log
7
7
  .bundle
8
8
  spec/support/database.yml
9
-
9
+ .byebug_history
@@ -1,5 +1,7 @@
1
1
  language: ruby
2
2
 
3
+ dist: trusty
4
+
3
5
  sudo: false
4
6
 
5
7
  cache: bundler
@@ -35,6 +37,3 @@ install:
35
37
 
36
38
  script: bundle exec rake current_rspec
37
39
 
38
- notifications:
39
- email:
40
- - fail@makandra.de
@@ -13,6 +13,45 @@ This project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html
13
13
 
14
14
  -
15
15
 
16
+
17
+ ## 1.0.3 - 2019-09-23
18
+
19
+ ### Security fix
20
+
21
+ This releases fix a security issue where in a controller with multiple `power` directives, the `:only` and `:except` options of the last directive was applied to all directives.
22
+
23
+ Affected code looks like this:
24
+
25
+ ```ruby
26
+ class UsersController < ApplicationController
27
+ power :foo
28
+ power :bar, only: :index
29
+
30
+ ...
31
+ end
32
+ ```
33
+
34
+ In this example both the powers `:foo` and `:bar` were only checked for the `#index` action. Other actions were left unprotected by powers checks.
35
+
36
+ Controllers with a single `power` directive are unaffected.
37
+ Contollers where neither `power` uses `:only` or `:except` options are unaffected.
38
+
39
+ This vulnerability has been assigned the CVE identifier CVE-2019-16377.
40
+
41
+
42
+ ### Compatible changes
43
+
44
+ - The RSpec matcher `check_power` now also sees powers inherited by a parent controller.
45
+
46
+
47
+ ## 1.0.2 - 2019-05-22
48
+
49
+ ### Compatible changes
50
+
51
+ - The `#arity` of power methods with optional arguments is now preserved.
52
+
53
+
54
+
16
55
  ## 1.0.1 - 2019-02-27
17
56
 
18
57
  ### Compatible changes
data/Gemfile CHANGED
@@ -1 +1 @@
1
- Gemfile.5-2
1
+ ./Gemfile.5-2
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- consul (1.0.1)
4
+ consul (1.0.3)
5
5
  edge_rider (>= 0.3.0)
6
6
  memoized (>= 1.0.2)
7
7
  rails (>= 3.2)
@@ -45,7 +45,7 @@ GEM
45
45
  concurrent-ruby (1.1.4)
46
46
  database_cleaner (1.4.1)
47
47
  diff-lcs (1.3)
48
- edge_rider (0.3.3)
48
+ edge_rider (1.0.0)
49
49
  activerecord
50
50
  erubis (2.7.0)
51
51
  gemika (0.3.4)
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- consul (1.0.1)
4
+ consul (1.0.3)
5
5
  edge_rider (>= 0.3.0)
6
6
  memoized (>= 1.0.2)
7
7
  rails (>= 3.2)
@@ -51,7 +51,7 @@ GEM
51
51
  crass (1.0.4)
52
52
  database_cleaner (1.7.0)
53
53
  diff-lcs (1.2.5)
54
- edge_rider (0.3.3)
54
+ edge_rider (1.0.0)
55
55
  activerecord
56
56
  erubis (2.7.0)
57
57
  gemika (0.3.4)
@@ -12,6 +12,7 @@ gem 'shoulda-matchers'
12
12
  gem 'sqlite3'
13
13
  gem 'database_cleaner'
14
14
  gem 'gemika'
15
+ gem 'byebug'
15
16
 
16
17
  # Gem under test
17
18
  gem 'consul', :path => '.'
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- consul (1.0.1)
4
+ consul (1.0.3)
5
5
  edge_rider (>= 0.3.0)
6
6
  memoized (>= 1.0.2)
7
7
  rails (>= 3.2)
@@ -54,6 +54,7 @@ GEM
54
54
  assignable_values (0.12.1)
55
55
  activerecord (>= 2.3)
56
56
  builder (3.2.3)
57
+ byebug (11.0.1)
57
58
  concurrent-ruby (1.1.4)
58
59
  crass (1.0.4)
59
60
  database_cleaner (1.7.0)
@@ -159,6 +160,7 @@ PLATFORMS
159
160
 
160
161
  DEPENDENCIES
161
162
  assignable_values
163
+ byebug
162
164
  consul!
163
165
  database_cleaner
164
166
  gemika
@@ -1,7 +1,7 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
3
  # Runtime dependencies
4
- gem 'rails', '~> 6.0.0beta'
4
+ gem 'rails', '~> 6.0.0'
5
5
  gem 'assignable_values'
6
6
 
7
7
  # Development dependencies
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- consul (1.0.1)
4
+ consul (1.0.2)
5
5
  edge_rider (>= 0.3.0)
6
6
  memoized (>= 1.0.2)
7
7
  rails (>= 3.2)
@@ -9,68 +9,69 @@ PATH
9
9
  GEM
10
10
  remote: https://rubygems.org/
11
11
  specs:
12
- actioncable (6.0.0.beta3)
13
- actionpack (= 6.0.0.beta3)
12
+ actioncable (6.0.0)
13
+ actionpack (= 6.0.0)
14
14
  nio4r (~> 2.0)
15
15
  websocket-driver (>= 0.6.1)
16
- actionmailbox (6.0.0.beta3)
17
- actionpack (= 6.0.0.beta3)
18
- activejob (= 6.0.0.beta3)
19
- activerecord (= 6.0.0.beta3)
20
- activestorage (= 6.0.0.beta3)
21
- activesupport (= 6.0.0.beta3)
16
+ actionmailbox (6.0.0)
17
+ actionpack (= 6.0.0)
18
+ activejob (= 6.0.0)
19
+ activerecord (= 6.0.0)
20
+ activestorage (= 6.0.0)
21
+ activesupport (= 6.0.0)
22
22
  mail (>= 2.7.1)
23
- actionmailer (6.0.0.beta3)
24
- actionpack (= 6.0.0.beta3)
25
- actionview (= 6.0.0.beta3)
26
- activejob (= 6.0.0.beta3)
23
+ actionmailer (6.0.0)
24
+ actionpack (= 6.0.0)
25
+ actionview (= 6.0.0)
26
+ activejob (= 6.0.0)
27
27
  mail (~> 2.5, >= 2.5.4)
28
28
  rails-dom-testing (~> 2.0)
29
- actionpack (6.0.0.beta3)
30
- actionview (= 6.0.0.beta3)
31
- activesupport (= 6.0.0.beta3)
29
+ actionpack (6.0.0)
30
+ actionview (= 6.0.0)
31
+ activesupport (= 6.0.0)
32
32
  rack (~> 2.0)
33
33
  rack-test (>= 0.6.3)
34
34
  rails-dom-testing (~> 2.0)
35
- rails-html-sanitizer (~> 1.0, >= 1.0.2)
36
- actiontext (6.0.0.beta3)
37
- actionpack (= 6.0.0.beta3)
38
- activerecord (= 6.0.0.beta3)
39
- activestorage (= 6.0.0.beta3)
40
- activesupport (= 6.0.0.beta3)
35
+ rails-html-sanitizer (~> 1.0, >= 1.2.0)
36
+ actiontext (6.0.0)
37
+ actionpack (= 6.0.0)
38
+ activerecord (= 6.0.0)
39
+ activestorage (= 6.0.0)
40
+ activesupport (= 6.0.0)
41
41
  nokogiri (>= 1.8.5)
42
- actionview (6.0.0.beta3)
43
- activesupport (= 6.0.0.beta3)
42
+ actionview (6.0.0)
43
+ activesupport (= 6.0.0)
44
44
  builder (~> 3.1)
45
45
  erubi (~> 1.4)
46
46
  rails-dom-testing (~> 2.0)
47
- rails-html-sanitizer (~> 1.0, >= 1.0.3)
48
- activejob (6.0.0.beta3)
49
- activesupport (= 6.0.0.beta3)
47
+ rails-html-sanitizer (~> 1.1, >= 1.2.0)
48
+ activejob (6.0.0)
49
+ activesupport (= 6.0.0)
50
50
  globalid (>= 0.3.6)
51
- activemodel (6.0.0.beta3)
52
- activesupport (= 6.0.0.beta3)
53
- activerecord (6.0.0.beta3)
54
- activemodel (= 6.0.0.beta3)
55
- activesupport (= 6.0.0.beta3)
56
- activestorage (6.0.0.beta3)
57
- actionpack (= 6.0.0.beta3)
58
- activerecord (= 6.0.0.beta3)
51
+ activemodel (6.0.0)
52
+ activesupport (= 6.0.0)
53
+ activerecord (6.0.0)
54
+ activemodel (= 6.0.0)
55
+ activesupport (= 6.0.0)
56
+ activestorage (6.0.0)
57
+ actionpack (= 6.0.0)
58
+ activejob (= 6.0.0)
59
+ activerecord (= 6.0.0)
59
60
  marcel (~> 0.3.1)
60
- activesupport (6.0.0.beta3)
61
+ activesupport (6.0.0)
61
62
  concurrent-ruby (~> 1.0, >= 1.0.2)
62
63
  i18n (>= 0.7, < 2)
63
64
  minitest (~> 5.1)
64
65
  tzinfo (~> 1.1)
65
- zeitwerk (~> 1.3, >= 1.3.1)
66
- assignable_values (0.12.1)
66
+ zeitwerk (~> 2.1, >= 2.1.8)
67
+ assignable_values (0.16.1)
67
68
  activerecord (>= 2.3)
68
69
  builder (3.2.3)
69
70
  concurrent-ruby (1.1.5)
70
71
  crass (1.0.4)
71
72
  database_cleaner (1.7.0)
72
73
  diff-lcs (1.3)
73
- edge_rider (0.3.3)
74
+ edge_rider (1.0.0)
74
75
  activerecord
75
76
  erubi (1.8.0)
76
77
  gemika (0.3.4)
@@ -88,42 +89,42 @@ GEM
88
89
  memoized (1.0.2)
89
90
  method_source (0.9.2)
90
91
  mimemagic (0.3.3)
91
- mini_mime (1.0.1)
92
+ mini_mime (1.0.2)
92
93
  mini_portile2 (2.4.0)
93
94
  minitest (5.11.3)
94
- nio4r (2.3.1)
95
- nokogiri (1.10.2)
95
+ nio4r (2.5.1)
96
+ nokogiri (1.10.4)
96
97
  mini_portile2 (~> 2.4.0)
97
98
  rack (2.0.7)
98
99
  rack-test (1.1.0)
99
100
  rack (>= 1.0, < 3)
100
- rails (6.0.0.beta3)
101
- actioncable (= 6.0.0.beta3)
102
- actionmailbox (= 6.0.0.beta3)
103
- actionmailer (= 6.0.0.beta3)
104
- actionpack (= 6.0.0.beta3)
105
- actiontext (= 6.0.0.beta3)
106
- actionview (= 6.0.0.beta3)
107
- activejob (= 6.0.0.beta3)
108
- activemodel (= 6.0.0.beta3)
109
- activerecord (= 6.0.0.beta3)
110
- activestorage (= 6.0.0.beta3)
111
- activesupport (= 6.0.0.beta3)
101
+ rails (6.0.0)
102
+ actioncable (= 6.0.0)
103
+ actionmailbox (= 6.0.0)
104
+ actionmailer (= 6.0.0)
105
+ actionpack (= 6.0.0)
106
+ actiontext (= 6.0.0)
107
+ actionview (= 6.0.0)
108
+ activejob (= 6.0.0)
109
+ activemodel (= 6.0.0)
110
+ activerecord (= 6.0.0)
111
+ activestorage (= 6.0.0)
112
+ activesupport (= 6.0.0)
112
113
  bundler (>= 1.3.0)
113
- railties (= 6.0.0.beta3)
114
+ railties (= 6.0.0)
114
115
  sprockets-rails (>= 2.0.0)
115
116
  rails-dom-testing (2.0.3)
116
117
  activesupport (>= 4.2.0)
117
118
  nokogiri (>= 1.6)
118
- rails-html-sanitizer (1.0.4)
119
+ rails-html-sanitizer (1.2.0)
119
120
  loofah (~> 2.2, >= 2.2.2)
120
- railties (6.0.0.beta3)
121
- actionpack (= 6.0.0.beta3)
122
- activesupport (= 6.0.0.beta3)
121
+ railties (6.0.0)
122
+ actionpack (= 6.0.0)
123
+ activesupport (= 6.0.0)
123
124
  method_source
124
125
  rake (>= 0.8.7)
125
126
  thor (>= 0.20.3, < 2.0)
126
- rake (12.3.2)
127
+ rake (12.3.3)
127
128
  rspec (3.6.0)
128
129
  rspec-core (~> 3.6.0)
129
130
  rspec-expectations (~> 3.6.0)
@@ -159,15 +160,15 @@ GEM
159
160
  actionpack (>= 4.0)
160
161
  activesupport (>= 4.0)
161
162
  sprockets (>= 3.0.0)
162
- sqlite3 (1.3.13)
163
+ sqlite3 (1.4.1)
163
164
  thor (0.20.3)
164
165
  thread_safe (0.3.6)
165
166
  tzinfo (1.2.5)
166
167
  thread_safe (~> 0.1)
167
- websocket-driver (0.7.0)
168
+ websocket-driver (0.7.1)
168
169
  websocket-extensions (>= 0.1.0)
169
- websocket-extensions (0.1.3)
170
- zeitwerk (1.4.3)
170
+ websocket-extensions (0.1.4)
171
+ zeitwerk (2.1.9)
171
172
 
172
173
  PLATFORMS
173
174
  ruby
@@ -177,7 +178,7 @@ DEPENDENCIES
177
178
  consul!
178
179
  database_cleaner
179
180
  gemika
180
- rails (~> 6.0.0beta)
181
+ rails (~> 6.0.0)
181
182
  rspec
182
183
  rspec-rails
183
184
  rspec_candy
@@ -1 +1 @@
1
- Gemfile.5-2.lock
1
+ ./Gemfile.5-2.lock
data/README.md CHANGED
@@ -547,7 +547,9 @@ class ApplicationController < ActionController::Base
547
547
  end
548
548
  ```
549
549
 
550
- Should you for some obscure reason want to forego the power check:
550
+ Note that this check is satisfied by *any* `.power` directive in the controller class or its ancestors, even if that `.power` directive has `:only` or `:except` options that do not apply to the current action.
551
+
552
+ Should you want to forego the power check (e.g. to remove authorization checks from an entirely public controller):
551
553
 
552
554
  ```rb
553
555
  class ApiController < ApplicationController
@@ -5,11 +5,7 @@ module Consul
5
5
  base.send :include, InstanceMethods
6
6
  base.send :extend, ClassMethods
7
7
  if ensure_power_initializer_present?
8
- if Rails.version.to_i < 4
9
- base.before_filter :ensure_power_initializer_present
10
- else
11
- base.before_action :ensure_power_initializer_present
12
- end
8
+ Util.before_action(base, :ensure_power_initializer_present)
13
9
  end
14
10
  end
15
11
 
@@ -32,68 +28,35 @@ module Consul
32
28
  private
33
29
 
34
30
  def require_power_check(options = {})
35
- if Rails.version.to_i < 4
36
- before_filter :unchecked_power, options
37
- else
38
- before_action :unchecked_power, options
39
- end
31
+ Util.before_action(self, :unchecked_power, options)
40
32
  end
41
33
 
42
34
  # This is badly named, since it doesn't actually skip the :check_power filter
43
35
  def skip_power_check(options = {})
44
- if Rails.version.to_i < 4
45
- skip_before_filter :unchecked_power, options
46
- elsif Rails.version.to_i < 5
47
- skip_before_action :unchecked_power, options
48
- else
49
- # Every `power` in a controller will skip the power check filter. After the 1st time, Rails 5+ will raise
50
- # an error because there is no `unchecked_power` action to skip any more.
51
- # To avoid this, we add the following extra option. Note that it must not be added in Rails 4 to avoid errors.
52
- # See http://api.rubyonrails.org/classes/ActiveSupport/Callbacks/ClassMethods.html#method-i-skip_callback
53
- skip_before_action :unchecked_power, { :raise => false }.merge!(options)
54
- end
36
+ Util.skip_before_action(self, :unchecked_power, options)
55
37
  end
56
38
 
57
39
  def current_power(&initializer)
58
40
  self.current_power_initializer = initializer
59
- if Rails.version.to_i < 4
60
- around_filter :with_current_power
61
- else
62
- around_action :with_current_power
63
- end
41
+ Util.around_action(self, :with_current_power)
64
42
 
65
43
  if respond_to?(:helper_method)
66
44
  helper_method :current_power
67
45
  end
68
46
  end
69
47
 
70
- attr_writer :consul_guards
71
-
72
- def consul_guards
73
- unless @consul_guards_initialized
74
- if superclass && superclass.respond_to?(:consul_guards, true)
75
- @consul_guards = superclass.send(:consul_guards).dup
76
- else
77
- @consul_guards = []
78
- end
79
- @consul_guards_initialized = true
80
- end
81
- @consul_guards
82
- end
83
-
84
48
  def power(*args)
85
-
86
49
  guard = Consul::Guard.new(*args)
87
- consul_guards << guard
88
- skip_power_check guard.filter_options
50
+
51
+ # One .power directive will skip the check for all actions, even
52
+ # if that .power directive has :only or :except options.
53
+ skip_power_check
89
54
 
90
55
  # Store arguments for testing
91
- (@consul_power_args ||= []) << args
56
+ consul_power_args << args
92
57
 
93
- if Rails.version.to_i < 4
94
- before_filter :check_power, guard.filter_options
95
- else
96
- before_action :check_power, guard.filter_options
58
+ Util.before_action(self, guard.filter_options) do |controller|
59
+ guard.ensure!(controller, controller.action_name)
97
60
  end
98
61
 
99
62
  if guard.direct_access_method
@@ -105,18 +68,26 @@ module Consul
105
68
 
106
69
  end
107
70
 
71
+ # On first access we inherit .consul_power_args from our ancestor classes.
72
+ # We also copy inherited args so we don't change our parent's .consul_power_args
73
+ def consul_power_args
74
+ unless @consul_power_args_initialized
75
+ if superclass && superclass.respond_to?(:consul_power_args, true)
76
+ @consul_power_args = superclass.send(:consul_power_args).dup
77
+ else
78
+ @consul_power_args = []
79
+ end
80
+ @consul_power_args_initialized = true
81
+ end
82
+ @consul_power_args
83
+ end
84
+
108
85
  end
109
86
 
110
87
  module InstanceMethods
111
88
 
112
89
  private
113
90
 
114
- define_method :check_power do
115
- self.class.send(:consul_guards).each do |guard|
116
- guard.ensure!(self, action_name)
117
- end
118
- end
119
-
120
91
  def unchecked_power
121
92
  raise Consul::UncheckedPower, "This controller does not check against a power"
122
93
  end
@@ -10,7 +10,7 @@ module Consul
10
10
 
11
11
  def matches?(controller)
12
12
  @controller_class = controller.class
13
- @actual_args = @controller_class.instance_variable_get('@consul_power_args')
13
+ @actual_args = @controller_class.send(:consul_power_args)
14
14
  @actual_args.present? && @actual_args.include?(@expected_args)
15
15
  end
16
16
 
@@ -57,6 +57,36 @@ module Consul
57
57
  [adjective, record]
58
58
  end
59
59
 
60
+ def skip_before_action(controller_class, name, options)
61
+ if Rails.version.to_i < 4
62
+ controller_class.skip_before_filter name, options
63
+ elsif Rails.version.to_i < 5
64
+ controller_class.skip_before_action name, options
65
+ else
66
+ # Every `power` in a controller will skip the power check filter. After the 1st time, Rails 5+ will raise
67
+ # an error because there is no `unchecked_power` action to skip any more.
68
+ # To avoid this, we add the following extra option. Note that it must not be added in Rails 4 to avoid errors.
69
+ # See http://api.rubyonrails.org/classes/ActiveSupport/Callbacks/ClassMethods.html#method-i-skip_callback
70
+ controller_class.skip_before_action name, { :raise => false }.merge!(options)
71
+ end
72
+ end
73
+
74
+ def before_action(controller_class, *args, &block)
75
+ if Rails.version.to_i < 4
76
+ controller_class.before_filter *args, &block
77
+ else
78
+ controller_class.before_action *args, &block
79
+ end
80
+ end
81
+
82
+ def around_action(controller_class, *args, &block)
83
+ if Rails.version.to_i < 4
84
+ controller_class.around_filter *args, &block
85
+ else
86
+ controller_class.around_action *args, &block
87
+ end
88
+ end
89
+
60
90
  end
61
91
  end
62
92
 
@@ -1,3 +1,3 @@
1
1
  module Consul
2
- VERSION = '1.0.2'
2
+ VERSION = '1.0.3'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: consul
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.2
4
+ version: 1.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Henning Koch
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-05-22 00:00:00.000000000 Z
11
+ date: 2019-09-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: memoized
@@ -108,7 +108,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
108
108
  version: '0'
109
109
  requirements: []
110
110
  rubyforge_project:
111
- rubygems_version: 2.5.2.3
111
+ rubygems_version: 2.7.8
112
112
  signing_key:
113
113
  specification_version: 4
114
114
  summary: A scope-based authorization solution for Ruby on Rails.