ixtlan-guard 0.7.0 → 0.7.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 (39) hide show
  1. data/features/generators.feature +0 -10
  2. data/features/step_definitions/simple_steps.rb +1 -82
  3. data/lib/ixtlan/guard/guard_ng.rb +77 -76
  4. data/lib/ixtlan/guard/guard_rails.rb +8 -8
  5. data/lib/ixtlan/guard/railtie.rb +1 -1
  6. data/spec/guard_cache_spec.rb +1 -1
  7. data/spec/guard_export_spec.rb +118 -90
  8. data/spec/guard_spec.rb +1 -16
  9. data/spec/guard_with_associations_spec.rb +114 -0
  10. data/spec/guard_with_associations_spec.rb~ +106 -0
  11. data/spec/guards/allow_all_defaults_guard.yml +1 -1
  12. data/spec/guards/defaults_guard.yml +1 -1
  13. data/spec/guards/no_defaults_guard.yml +1 -1
  14. data/spec/guards/only_defaults_guard.yml +1 -1
  15. data/spec/guards/regions_guard.yml +8 -0
  16. data/spec/guards/regions_guard.yml~ +2 -0
  17. data/spec/guards/users_guard.yml +1 -1
  18. metadata +8 -24
  19. data/lib/generators/active_record/templates/flavor_migration.rb +0 -13
  20. data/lib/generators/active_record/templates/flavor_model.rb +0 -8
  21. data/lib/generators/active_record/templates/group_model.rb +0 -43
  22. data/lib/generators/active_record/templates/group_user_migration.rb +0 -13
  23. data/lib/generators/active_record/templates/user_model.rb +0 -124
  24. data/lib/generators/active_record/user_management_models_generator.rb +0 -202
  25. data/lib/generators/erb/user_management_controller_generator.rb +0 -10
  26. data/lib/generators/ixtlan/maintenance_scaffold/USAGE +0 -8
  27. data/lib/generators/ixtlan/maintenance_scaffold/maintenance_scaffold_generator.rb +0 -40
  28. data/lib/generators/ixtlan/permissions_scaffold/USAGE +0 -8
  29. data/lib/generators/ixtlan/permissions_scaffold/permissions_scaffold_generator.rb +0 -33
  30. data/lib/generators/ixtlan/user_management_controller/USAGE +0 -8
  31. data/lib/generators/ixtlan/user_management_controller/user_management_controller_generator.rb +0 -23
  32. data/lib/generators/ixtlan/user_management_models/USAGE +0 -8
  33. data/lib/generators/ixtlan/user_management_models/user_management_models_generator.rb +0 -19
  34. data/lib/generators/ixtlan/user_management_scaffold/user_management_scaffold_generator.rb +0 -13
  35. data/lib/ixtlan/guard/controllers/maintenance_controller.rb +0 -45
  36. data/lib/ixtlan/guard/controllers/permissions_controller.rb +0 -41
  37. data/lib/ixtlan/guard/models/maintenance.rb +0 -55
  38. data/lib/ixtlan/guard/models/user_update_manager.rb +0 -95
  39. data/lib/ixtlan/guard/spec/user_management_models_spec.rb +0 -193
@@ -6,13 +6,3 @@ Feature: Generators for ixtlan-guard
6
6
  And I execute "rails generate scaffold account name:string --skip"
7
7
  And I execute "rake db:migrate test"
8
8
  Then the output should contain "7 tests, 10 assertions, 0 failures, 0 errors"
9
-
10
- Scenario: The user-management-model generator creates user/group models, etc
11
- Given I create new rails application with template "user_management.template" and "user-management" specs
12
- And I execute "rails generate rspec:install"
13
- And I execute "rails generate ixtlan:user_management_models user group name:string domain name:string locale code:string"
14
- # this tes env is needed since we execute the specs directly
15
- And I execute "rails rake db:migrate -- -Drails.env=test"
16
- # needed due to bug in rspec-maven-plugin with emtpy gem-path
17
- And I execute "gem exec ../rubygems/bin/rspec spec/user_management_models_spec.rb"
18
- Then the output should contain "14 examples, 0 failures"
@@ -1,82 +1 @@
1
- require 'fileutils'
2
- require File.join(File.dirname(__FILE__), 'ruby_maven')
3
-
4
- def rmvn
5
- @rmvn ||= Maven::RubyMaven.new
6
- end
7
-
8
- def copy_tests(tests)
9
- FileUtils.mkdir_p(@app_directory)
10
- FileUtils.cp_r(File.join('templates', "tests-#{tests}", "."),
11
- File.join(@app_directory, 'test'))
12
- end
13
-
14
- def copy_specs(specs)
15
- FileUtils.mkdir_p(@app_directory)
16
- FileUtils.cp_r(File.join('templates', "specs-#{specs}", "."),
17
- File.join(@app_directory, 'spec'))
18
- end
19
-
20
- def create_rails_application(template)
21
- name = template.sub(/.template$/, '')
22
- @app_directory = File.join('target', name)
23
-
24
- # rails version from gemspec
25
- gemspec = File.read(Dir.glob("*.gemspec")[0])
26
- rails_version = gemspec.split("\n").detect { |l| l =~ /development_dep.*rails/ }.sub(/'$/, '').sub(/.*'/, '')
27
-
28
- rmvn.options['-Dplugin.version'] = '0.28.4-SNAPSHOT'
29
- rmvn.options['-Drails.version'] = rails_version
30
- rmvn.options['-Dgem.home'] = ENV['GEM_HOME']
31
- rmvn.options['-Dgem.path'] = ENV['GEM_PATH']
32
- rmvn.options['-o'] = nil
33
-
34
- FileUtils.rm_rf(@app_directory)
35
-
36
- rmvn.exec("rails", "new", @app_directory, "-f")
37
-
38
- # TODO that should be done via the rails new task !!!
39
- rmvn.exec_in(@app_directory, "rails", "rake", "rails:template LOCATION=" + File.expand_path("templates/#{template}"))
40
- end
41
-
42
- Given /^I create new rails application with template "(.*)"$/ do |template|
43
- create_rails_application(template)
44
- end
45
-
46
- Given /^I create new rails application with template "(.*)" and "(.*)" tests$/ do |template, tests|
47
- create_rails_application(template)
48
- copy_tests(tests)
49
- end
50
-
51
- Given /^I create new rails application with template "(.*)" and "(.*)" specs$/ do |template, specs|
52
- create_rails_application(template)
53
- copy_specs(specs)
54
- end
55
-
56
- Given /^me an existing rails application "(.*)"$/ do |name|
57
- @app_directory = File.join('target', name)
58
- end
59
-
60
- Given /^me an existing rails application "(.*)" and "(.*)" tests$/ do |name, tests|
61
- @app_directory = File.join('target', name)
62
- copy_tests(tests)
63
- end
64
-
65
- Given /^me an existing rails application "(.*)" and "(.*)" specs$/ do |name, specs|
66
- @app_directory = File.join('target', name)
67
- copy_specs(specs)
68
- end
69
-
70
- And /^I execute \"(.*)\"$/ do |args|
71
- rmvn.options['-l'] = "output.log"
72
- rmvn.exec_in(@app_directory, args)
73
- end
74
-
75
- Then /^the output should contain \"(.*)\"$/ do |expected|
76
- result = File.read(File.join(@app_directory, "output.log"))
77
- expected.split(/\"?\s+and\s+\"?/).each do |exp|
78
- puts exp
79
- (result =~ /.*#{exp}.*/).should_not be_nil
80
- end
81
- end
82
-
1
+ require 'maven/cucumber_steps'
@@ -4,6 +4,8 @@ module Ixtlan
4
4
  module Guard
5
5
  class GuardNG
6
6
 
7
+ attr_reader :superuser
8
+
7
9
  def initialize(options = {})
8
10
  options[:guards_dir] ||= File.expand_path(".")
9
11
  @superuser = [(options[:superuser] || "root").to_s]
@@ -31,45 +33,67 @@ module Ixtlan
31
33
  end
32
34
  end
33
35
 
34
- def allowed_groups(resource, action, current_groups)
35
- allowed = @config.allowed_groups(resource, action) - blocked_groups + @superuser
36
+ def allowed_groups(resource_name, action, current_group_names)
37
+ allowed = @config.allowed_groups(resource_name, action) - blocked_groups + @superuser
36
38
  if allowed.member?('*')
37
- current_groups - (blocked_groups - @superuser)
39
+ # keep superuser in current_groups if in there
40
+ current_group_names - (blocked_groups - @superuser)
38
41
  else
39
- intersect(allowed, current_groups)
42
+ allowed & current_group_names
40
43
  end
41
44
  end
42
45
 
43
- def allowed?(resource, action, current_groups, flavor = nil, &block)
44
- current_groups = current_groups.collect { |g| g.to_s }
45
- allowed_groups = self.allowed_groups(resource, action, current_groups)
46
- logger.debug { "guard #{resource}##{action}: #{allowed_groups.size > 0}" }
47
- if allowed_groups.size > 0
48
- if block
49
- g = allowed_groups.detect do |group|
50
- block.call(group).member?(flavor)
51
- end
52
- logger.debug do
53
- if g
54
- "found group #{g} for #{flavor}"
55
- else
56
- "no group found for #{flavor}"
57
- end
58
- end
59
- g != nil
46
+ def group_map(current_groups)
47
+ names = current_groups.collect do |g|
48
+ key = case g
49
+ when String
50
+ g
51
+ when Symbol
52
+ g.to_s
53
+ else
54
+ g.name.to_s
55
+ end
56
+ [key, g]
57
+ end
58
+ Hash[*(names.flatten)]
59
+ end
60
+ private :group_map
61
+
62
+ def allowed?(resource_name, action, current_groups, association = nil, &block)
63
+ group_map = group_map(current_groups)
64
+ allowed_group_names = allowed_groups(resource_name, action, group_map.keys)
65
+ logger.debug { "guard #{resource_name}##{action}: #{allowed_group_names.size > 0}" }
66
+ if allowed_group_names.size > 0
67
+ if block || association
68
+ group_allowed?(group_map, allowed_group_names, association, &block)
60
69
  else
61
70
  true
62
71
  end
63
72
  else
64
- unless @config.has_guard?(resource)
65
- raise ::Ixtlan::Guard::GuardException.new("no guard config for '#{resource}'")
73
+ unless @config.has_guard?(resource_name)
74
+ raise ::Ixtlan::Guard::GuardException.new("no guard config for '#{resource_name}'")
66
75
  else
67
76
  false
68
77
  end
69
78
  end
70
79
  end
71
80
 
72
- def permissions(current_groups, flavors = {})
81
+ def group_allowed?(group_map, allowed_group_names, association, &block)
82
+ g = allowed_group_names.detect do |group_name|
83
+ block.call(group_map[group_name], association)
84
+ end if association && block
85
+ logger.debug do
86
+ if g
87
+ "found group #{g} for #{association}"
88
+ else
89
+ "no group found for #{association}"
90
+ end
91
+ end
92
+ g != nil
93
+ end
94
+
95
+ def permissions(current_groups, &block)
96
+ group_map = group_map(current_groups)
73
97
  perms = []
74
98
  m = @config.map_of_all
75
99
  m.each do |resource, actions|
@@ -77,79 +101,56 @@ module Ixtlan
77
101
  perm = Node.new(:permission)
78
102
  perm[:resource] = resource
79
103
  perm[:actions] = nodes
80
- defaults = actions.delete('defaults') || []
81
- defaults = intersect(current_groups, defaults + @superuser) unless defaults.member?('*')
82
- # no actions
83
- # deny = false: !defaults.member?('*')
84
- # deny = true: defaults.member?('*') || current_groups.member?(@superuser[0])
104
+ default_actions = actions.delete('defaults') || []
105
+ default_actions = group_map.keys & (default_actions + @superuser) unless default_actions.member?('*')
85
106
  deny = if actions.size == 0
86
- defaults.member?('*') || current_groups.member?(@superuser[0])
107
+ # no actions
108
+ # deny = false: !default_actions.member?('*')
109
+ # deny = true: default_actions.member?('*') || current_group_names.member?(@superuser[0])
110
+ default_actions.member?('*') || group_map.keys.member?(@superuser[0]) || !group_map.keys.detect {|g| default_actions.member? g }.nil?
87
111
  else
88
112
  # actions
89
- # deny = false : defaults == []
90
- # deny = true : defaults.member?('*')
91
- defaults.size != 0 || defaults.member?('*')
113
+ # deny = false : default_actions == []
114
+ # deny = true : default_actions.member?('*')
115
+ default_actions.size != 0 || default_actions.member?('*')
92
116
  end
93
117
  perm[:deny] = deny
94
118
  actions.each do |action, groups|
119
+ group_names = groups.collect { |g| g.is_a?(Hash) ? g.keys : g }.flatten if groups
95
120
  node = Node.new(:action)
96
121
  allowed_groups =
97
- if groups && groups.member?('*')
98
- current_groups
122
+ if groups && group_names.member?('*')
123
+ group_map.values
99
124
  else
100
- intersect(current_groups, (groups || []) + @superuser)
125
+ names = group_map.keys & ((group_names || []) + @superuser)
126
+ names.collect { |name| group_map[name] }
101
127
  end
102
128
  if (deny && allowed_groups.size == 0) || (!deny && allowed_groups.size > 0)
103
129
  node[:name] = action
104
- # f = {}
105
- # flavors.each do |fl, block|
106
- # f[fl] = block.call(allowed_groups)
107
- # end
108
- # node[:flavors] = f if f.size > 0
109
- nodes << node
110
- end
111
- end
112
- perms << perm
113
- end
114
- perms
115
- end
116
-
117
- def permission_map(current_groups, flavors = {})
118
- # TODO fix it - think first !!
119
- perms = {}
120
- m = @config.map_of_all
121
- m.each do |resource, actions|
122
- nodes = {}
123
- actions.each do |action, groups|
124
- if action == 'defaults'
125
- nodes[action] = {}
126
- else
127
- allowed_groups = intersect(current_groups, (groups || []) + @superuser)
128
- if allowed_groups.size > 0
129
- f = {}
130
- flavors.each do |fl, block|
131
- flav = block.call(allowed_groups)
132
- f[fl] = flav if flav.size > 0
130
+ if block
131
+ if allowed_groups.size > 0
132
+ node.content.merge!(block.call(resource, action, allowed_groups) || {})
133
+ else
134
+ perm.content.merge!(block.call(resource, action, group_map.values) || {})
133
135
  end
134
- nodes[action] = f
135
- else
136
- nodes[action] = nil # indicates not default action
137
136
  end
137
+ nodes << node
138
138
  end
139
139
  end
140
- perms[resource] = nodes if nodes.size > 0
140
+ # TODO is that right like this ?
141
+ # only default_actions, i.e. no actions !!!
142
+ if block && actions.size == 0 && deny
143
+ perm.content.merge!(block.call(resource, nil, group_map.values) || {})
144
+ end
145
+ perms << perm
141
146
  end
142
147
  perms
143
148
  end
144
-
145
- private
146
-
147
- def intersect(set1, set2)
148
- set1 - (set1 - set2)
149
- end
150
149
  end
151
150
  class Node < Hash
152
-
151
+
152
+ attr_reader :content
153
+
153
154
  def initialize(name)
154
155
  map = super
155
156
  @content = {}
@@ -12,9 +12,7 @@ module Ixtlan
12
12
 
13
13
  def groups_for_current_user
14
14
  if respond_to?(:current_user) && current_user
15
- current_user.groups.collect do |group|
16
- group.name
17
- end
15
+ current_user.groups
18
16
  else
19
17
  []
20
18
  end
@@ -37,23 +35,25 @@ module Ixtlan
37
35
  Rails.application.config.guard
38
36
  end
39
37
 
40
- def check(flavor = nil, &block)
41
- group_method = respond_to?(:current_user_group_names) ? :current_user_group_names : :groups_for_current_user
38
+ def check(association = nil, &block)
39
+ group_method = respond_to?(:current_user_groups) ? :current_user_groups : :groups_for_current_user
42
40
  unless guard.allowed?(params[:controller],
43
41
  params[:action],
44
42
  send(group_method),
45
- flavor,
43
+ association,
46
44
  &block)
47
- if flavor
48
- raise ::Ixtlan::Guard::PermissionDenied.new("permission denied for '#{params[:controller]}##{params[:action]}##{flavor}'")
45
+ if association
46
+ raise ::Ixtlan::Guard::PermissionDenied.new("permission denied for '#{params[:controller]}##{params[:action]}##{association.class}(#{association.id})'")
49
47
  else
50
48
  raise ::Ixtlan::Guard::PermissionDenied.new("permission denied for '#{params[:controller]}##{params[:action]}'")
51
49
  end
52
50
  end
53
51
  true
54
52
  end
53
+ alias :authorize :check
55
54
 
56
55
  def authorization
56
+ warn "DEPRECATED: use 'authorize' instead"
57
57
  check
58
58
  end
59
59
  end
@@ -23,7 +23,7 @@ module Ixtlan
23
23
  app.config.guard = Ixtlan::Guard::GuardNG.new(options)
24
24
 
25
25
  ::ActionController::Base.send(:include, Ixtlan::ActionController::Guard)
26
- ::ActionController::Base.send(:before_filter, :authorization)
26
+ ::ActionController::Base.send(:before_filter, :authorize)
27
27
  ::ActionView::Base.send(:include, Ixtlan::Allowed)
28
28
  end
29
29
 
@@ -9,7 +9,7 @@ $source1 = File.join(File.dirname(__FILE__), "guards", "users1_guard.yml")
9
9
  $source2 = File.join(File.dirname(__FILE__), "guards", "users2_guard.yml")
10
10
  $logger = Logger.new(STDOUT)
11
11
  def $logger.debug(&block)
12
- info("\n\t[debug] " + block.call)
12
+ # info("\n\t[debug] " + block.call)
13
13
  end
14
14
 
15
15
  describe Ixtlan::Guard::GuardNG do
@@ -7,7 +7,7 @@ describe Ixtlan::Guard::GuardNG do
7
7
  subject do
8
8
  logger = Logger.new(STDOUT)
9
9
  def logger.debug(&block)
10
- info("\n\t[debug] " + block.call)
10
+ # info("\n\t[debug] " + block.call)
11
11
  end
12
12
  Ixtlan::Guard::GuardNG.new(:guards_dir => File.join(File.dirname(__FILE__), "guards"), :logger => logger )
13
13
  end
@@ -15,37 +15,46 @@ describe Ixtlan::Guard::GuardNG do
15
15
  context '#permissions' do
16
16
 
17
17
  it 'should deny all without defaults but wildcard "*" actions' do
18
- subject.permissions(['unknown_group']).should == [
18
+ subject.permissions(['unknown_group']).sort { |n,m| n[:resource] <=> m[:resource] }.should == [
19
19
  #allow nothing
20
- {:permission=>{:resource=>"users", :actions=>[], :deny=>false}},
21
- {:permission=>{:resource=>"only_defaults", :actions=>[], :deny=>true}},
20
+ {:permission=>{:resource=>"accounts", :actions=>[], :deny=>false}},
21
+ # allow anything but index
22
+ {:permission=>{:resource=>"allow_all_defaults", :actions=>[{:action=>{:name=>"index"}}], :deny=>true}},
22
23
  {:permission=>
23
24
  {
24
- :resource=>"no_defaults",
25
+ :resource=>"defaults",
25
26
  :actions=>[{:action=>{:name=>"index"}}],
26
27
  :deny=>false #allow
27
28
  }
28
29
  },
29
- {
30
- :permission=>
30
+ {:permission=>
31
31
  {
32
- :resource=>"defaults",
32
+ :resource=>"no_defaults",
33
33
  :actions=>[{:action=>{:name=>"index"}}],
34
34
  :deny=>false #allow
35
35
  }
36
36
  },
37
+ {:permission=>{:resource=>"only_defaults", :actions=>[], :deny=>true}},
37
38
  #allow nothing
38
39
  {:permission=>{:resource=>"person", :actions=>[], :deny=>false}},
39
40
  #allow nothing
40
- {:permission=>{:resource=>"accounts", :actions=>[], :deny=>false}},
41
- # allow anything but index
42
- {:permission=>{:resource=>"allow_all_defaults", :actions=>[{:action=>{:name=>"index"}}], :deny=>true}}]
41
+ {:permission=>{:resource=>"regions", :actions=>[], :deny=>false}},
42
+ #allow nothing
43
+ {:permission=>{:resource=>"users", :actions=>[], :deny=>false}}]
43
44
  end
44
45
  it 'should deny some without defaults but wildcard "*" actions' do
45
- subject.permissions(['no_admin']).should == [
46
+ subject.permissions(['no_admin']).sort { |n,m| n[:resource] <=> m[:resource] }.should == [
46
47
  #allow nothing
47
- {:permission=>{:resource=>"users", :actions=>[], :deny=>false}},
48
- {:permission=>{:resource=>"only_defaults", :actions=>[], :deny=>true}},
48
+ {:permission=>{:resource=>"accounts", :actions=>[], :deny=>false}},
49
+ # allow anything but index
50
+ {:permission=>{:resource=>"allow_all_defaults", :actions=>[{:action=>{:name=>"index"}}], :deny=>true}},
51
+ {:permission=>
52
+ {
53
+ :resource=>"defaults",
54
+ :actions=>[{:action=>{:name=>"index"}}],
55
+ :deny=>false #allow
56
+ }
57
+ },
49
58
  {:permission=>
50
59
  {
51
60
  :resource=>"no_defaults",
@@ -56,36 +65,39 @@ describe Ixtlan::Guard::GuardNG do
56
65
  :deny=>false #allow
57
66
  }
58
67
  },
59
- {
60
- :permission=>
61
- {
62
- :resource=>"defaults",
63
- :actions=>[{:action=>{:name=>"index"}}],
64
- :deny=>false #allow
65
- }
66
- },
68
+ {:permission=>{:resource=>"only_defaults", :actions=>[], :deny=>true}},
67
69
  #allow nothing
68
70
  {:permission=>{:resource=>"person", :actions=>[], :deny=>false}},
69
71
  #allow nothing
70
- {:permission=>{:resource=>"accounts", :actions=>[], :deny=>false}},
71
- # allow anything but index
72
- {:permission=>{:resource=>"allow_all_defaults", :actions=>[{:action=>{:name=>"index"}}], :deny=>true}}]
72
+ {:permission=>{:resource=>"regions", :actions=>[], :deny=>false}},
73
+ #allow nothing
74
+ {:permission=>{:resource=>"users", :actions=>[], :deny=>false}}]
73
75
  end
74
76
  it 'should allow "root"' do
75
- subject.permissions(['root']).should == [
76
- {:permission=>{:resource=>"users", :actions=>[], :deny=>true}},
77
- {:permission=>{:resource=>"only_defaults", :actions=>[], :deny=>true}},
78
- {:permission=>{:resource=>"no_defaults", :actions=>[], :deny=>true}},
77
+ subject.permissions(['root']).sort { |n,m| n[:resource] <=> m[:resource] }.should == [
78
+ {:permission=>{:resource=>"accounts", :actions=>[], :deny=>true}},
79
+ {:permission=>{:resource=>"allow_all_defaults", :actions=>[], :deny=>true}},
79
80
  {:permission=>{:resource=>"defaults", :actions=>[], :deny=>true}},
81
+ {:permission=>{:resource=>"no_defaults", :actions=>[], :deny=>true}},
82
+ {:permission=>{:resource=>"only_defaults", :actions=>[], :deny=>true}},
80
83
  {:permission=>{:resource=>"person", :actions=>[], :deny=>true}},
81
- {:permission=>{:resource=>"accounts", :actions=>[], :deny=>true}},
82
- {:permission=>{:resource=>"allow_all_defaults", :actions=>[], :deny=>true}}]
84
+ {:permission=>{:resource=>"regions", :actions=>[], :deny=>true}},
85
+ {:permission=>{:resource=>"users", :actions=>[], :deny=>true}}]
83
86
  end
84
87
  it 'should allow with default group' do
85
- subject.permissions(['_master']).should == [
88
+ subject.permissions(['_master']).sort { |n,m| n[:resource] <=> m[:resource] }.should == [
86
89
  #allow nothing
87
- {:permission=>{:resource=>"users", :actions=>[], :deny=>false}},
88
- {:permission=>{:resource=>"only_defaults", :actions=>[], :deny=>true}},
90
+ {:permission=>{:resource=>"accounts", :actions=>[], :deny=>false}},
91
+ # allow anything but index
92
+ {:permission=>{:resource=>"allow_all_defaults", :actions=>[{:action=>{:name=>"index"}}], :deny=>true}},
93
+ {:permission=>
94
+ {
95
+ :resource=>"defaults",
96
+ :actions=>[{:action=>{:name=>"show"}},
97
+ {:action=>{:name=>"destroy"}}],
98
+ :deny=>true
99
+ }
100
+ },
89
101
  {:permission=>
90
102
  {
91
103
  :resource=>"no_defaults",
@@ -93,83 +105,99 @@ describe Ixtlan::Guard::GuardNG do
93
105
  :deny=>false #allow
94
106
  }
95
107
  },
96
- {
97
- :permission=>
108
+ {:permission=>{:resource=>"only_defaults", :actions=>[], :deny=>true}},
109
+ #allow nothing
110
+ {:permission=>{:resource=>"person", :actions=>[], :deny=>false}},
111
+ #allow nothing
112
+ {:permission=>{:resource=>"regions", :actions=>[], :deny=>false}},
113
+ #allow nothing
114
+ {:permission=>{:resource=>"users", :actions=>[], :deny=>false}}]
115
+ end
116
+
117
+ it 'should allow with non-default group' do
118
+ subject.permissions(['_admin']).sort { |n,m| n[:resource] <=> m[:resource] }.should == [
119
+ #allow nothing
120
+ {:permission=>{:resource=>"accounts", :actions=>[], :deny=>false}},
121
+ # allow anything but index
122
+ {:permission=>{:resource=>"allow_all_defaults", :actions=>[], :deny=>true}},
123
+ {:permission=>
98
124
  {
99
125
  :resource=>"defaults",
100
- :actions=>[{:action=>{:name=>"show"}},
101
- {:action=>{:name=>"destroy"}}],
102
- :deny=>true
126
+ :actions=>[{:action=>{:name=>"edit"}},
127
+ {:action=>{:name=>"index"}},
128
+ {:action=>{:name=>"show"}}],
129
+ :deny=>false # allow
103
130
  }
104
131
  },
132
+ {:permission=>
133
+ {
134
+ :resource=>"no_defaults",
135
+ :actions=>[{:action=>{:name=>"index"}}],
136
+ :deny=>false #allow
137
+ }
138
+ },
139
+ {:permission=>{:resource=>"only_defaults", :actions=>[], :deny=>true}},
105
140
  #allow nothing
106
141
  {:permission=>{:resource=>"person", :actions=>[], :deny=>false}},
142
+ #allow nothing
143
+ {:permission=>{:resource=>"regions", :actions=>[], :deny=>false}},
144
+ #allow nothing
145
+ {:permission=>{:resource=>"users", :actions=>[], :deny=>false}}]
146
+ end
147
+
148
+ it 'should allow with association' do
149
+ group = Object.new
150
+ def group.name
151
+ "region"
152
+ end
153
+ subject.permissions([group])do |resource, action, groups|
154
+ if resource == 'regions'
155
+ case action
156
+ when 'show'
157
+ {:associations => [:europe, :asia]}
158
+ else
159
+ {}
160
+ end
161
+ else
162
+ {}
163
+ end
164
+ end.sort { |n,m| n[:resource] <=> m[:resource] }.should == [
107
165
  #allow nothing
108
166
  {:permission=>{:resource=>"accounts", :actions=>[], :deny=>false}},
109
167
  # allow anything but index
110
- {:permission=>{:resource=>"allow_all_defaults", :actions=>[{:action=>{:name=>"index"}}], :deny=>true}}]
111
- end
112
- it 'should allow with non-default group' do
113
- subject.permissions(['_admin']).should == [
114
- #allow nothing
115
- {:permission=>{:resource=>"users", :actions=>[], :deny=>false}},
116
- {:permission=>{:resource=>"only_defaults", :actions=>[], :deny=>true}},
117
168
  {:permission=>
118
169
  {
119
- :resource=>"no_defaults",
120
- :actions=>[{:action=>{:name=>"index"}}],
121
- :deny=>false #allow
170
+ :resource=>"allow_all_defaults",
171
+ :actions=>[{:action=>{:name=>"index"}}],
172
+ :deny=>true
122
173
  }
123
174
  },
124
- {
125
- :permission=>
175
+ {:permission=>
126
176
  {
127
177
  :resource=>"defaults",
128
- :actions=>[{:action=>{:name=>"edit"}},
129
- {:action=>{:name=>"index"}},
130
- {:action=>{:name=>"show"}}],
178
+ :actions=>[{:action=>{:name=>"index"}}],
131
179
  :deny=>false # allow
132
180
  }
133
181
  },
182
+ {:permission=>
183
+ {
184
+ :resource=>"no_defaults",
185
+ :actions=>[{:action=>{:name=>"index"}}],
186
+ :deny=>false #allow
187
+ }
188
+ },
189
+ {:permission=>{:resource=>"only_defaults", :actions=>[], :deny=>true}},
134
190
  #allow nothing
135
191
  {:permission=>{:resource=>"person", :actions=>[], :deny=>false}},
136
- #allow nothing
137
- {:permission=>{:resource=>"accounts", :actions=>[], :deny=>false}},
138
- # allow anything but index
139
- {:permission=>{:resource=>"allow_all_defaults", :actions=>[], :deny=>true}}]
140
- end
141
- end
142
192
 
143
- context '#permission_map' do
144
- it 'should export' do
145
- pending "check expectations before implementing specs"
146
- subject.permission_map(['admin']).should == {"users"=>{"defaults"=>nil}, "person"=>{"defaults"=>nil, "destroy"=>{}, "index"=>{}}, "accounts"=>{"defaults"=>nil, "destroy"=>{}, "show"=>nil}}
147
-
148
- subject.permission_map(['manager']).should == {"users"=>{"defaults"=>nil}, "person"=>{"defaults"=>nil, "destroy"=>nil, "index"=>{}}, "accounts"=>{"defaults"=>nil, "destroy"=>nil, "show"=>{}}}
149
-
150
- subject.permission_map(['manager', 'admin']).should == {"users"=>{"defaults"=>nil}, "person"=>{"defaults"=>nil, "destroy"=>{}, "index"=>{}}, "accounts"=>{"defaults"=>nil, "destroy"=>{}, "show"=>{}}}
151
-
152
- subject.permission_map(['users']).should == {"users"=>{"defaults"=>{}}, "person"=>{"defaults"=>nil, "destroy"=>nil, "index"=>nil}, "accounts"=>{"defaults"=>nil, "destroy"=>nil, "show"=>nil}}
153
- end
154
-
155
- it 'should export with flavor' do
156
- pending "check expectations before implementing specs"
157
-
158
- flavors = { 'admin' => ['example', 'dummy'], 'manager' => ['example', 'master'] }
159
-
160
- domains = Proc.new do |groups|
161
- groups.collect do |g|
162
- flavors[g] || []
163
- end.flatten.uniq
164
- end
165
-
166
- subject.permission_map(['admin'], 'domains' => domains).should == {"users"=>{"defaults"=>nil}, "person"=>{"defaults"=>nil, "destroy"=>{'domains'=>["example", "dummy"]}, "index"=>{'domains'=>["example", "dummy"]}}, "accounts"=>{"defaults"=>nil, "destroy"=>{'domains'=>["example", "dummy"]}, "show"=>nil}}
167
-
168
- subject.permission_map(['manager'], 'domains' => domains).should == {"users"=>{"defaults"=>nil}, "person"=>{"defaults"=>nil, "destroy"=>nil, "index"=>{"domains"=>["example", "master"]}}, "accounts"=>{"defaults"=>nil, "destroy"=>nil, "show"=>{"domains"=>["example", "master"]}}}
169
-
170
- subject.permission_map(['manager', 'admin'], 'domains' => domains).should == {"users"=>{"defaults"=>nil}, "person"=>{"defaults"=>nil, "destroy"=>{"domains"=>["example", "dummy"]}, "index"=>{"domains"=>["example", "master", "dummy"]}}, "accounts"=>{"defaults"=>nil, "destroy"=>{"domains"=>["example", "dummy"]}, "show"=>{"domains"=>["example", "master"]}}}
171
-
172
- subject.permission_map(['users'], 'domains' => domains).should == {"users"=>{"defaults"=>{}}, "person"=>{"defaults"=>nil, "destroy"=>nil, "index"=>nil}, "accounts"=>{"defaults"=>nil, "destroy"=>nil, "show"=>nil}}
193
+ {:permission=>
194
+ {:resource=>"regions",
195
+ :actions=>
196
+ [{:action=>{:name=>"show", :associations=>[:europe, :asia]}},
197
+ {:action=>{:name=>"create"}}],
198
+ :deny=>false}},
199
+ #allow nothing
200
+ {:permission=>{:resource=>"users", :actions=>[], :deny=>false}}]
173
201
  end
174
202
  end
175
203
  end