ixtlan-guard 0.7.0 → 0.7.2

Sign up to get free protection for your applications and to get access to all the features.
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