acts_as_authoritah 1.0.5 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. data/.gitignore +15 -3
  2. data/.rspec +2 -0
  3. data/Gemfile +6 -0
  4. data/LICENSE +4 -2
  5. data/README.md +29 -0
  6. data/Rakefile +2 -56
  7. data/acts_as_authoritah.gemspec +15 -44
  8. data/lib/acts_as_authoritah.rb +15 -16
  9. data/lib/acts_as_authoritah/access_control_list.rb +32 -0
  10. data/lib/acts_as_authoritah/access_rule.rb +31 -0
  11. data/lib/acts_as_authoritah/core.rb +37 -0
  12. data/lib/acts_as_authoritah/identifier_parser.rb +28 -0
  13. data/lib/acts_as_authoritah/matchers/controller_matcher.rb +10 -0
  14. data/lib/acts_as_authoritah/matchers/direct_matcher.rb +9 -0
  15. data/lib/acts_as_authoritah/matchers/scope_matcher.rb +15 -0
  16. data/lib/acts_as_authoritah/spreadsheets/access_rights_mapper.rb +14 -0
  17. data/lib/acts_as_authoritah/spreadsheets/spreadsheet_header_parser.rb +9 -0
  18. data/lib/acts_as_authoritah/spreadsheets/spreadsheet_reader.rb +37 -0
  19. data/lib/acts_as_authoritah/spreadsheets/spreadsheet_row_parser.rb +23 -0
  20. data/lib/acts_as_authoritah/spreadsheets/spreadsheet_wrapper.rb +16 -0
  21. data/lib/acts_as_authoritah/version.rb +3 -0
  22. data/spec/acts_as_authoritah/access_control_list_spec.rb +78 -0
  23. data/spec/acts_as_authoritah/access_rule_spec.rb +39 -0
  24. data/spec/acts_as_authoritah/core_spec.rb +63 -0
  25. data/spec/acts_as_authoritah/identifier_parser_spec.rb +111 -0
  26. data/spec/acts_as_authoritah/matchers/controller_matcher_spec.rb +20 -0
  27. data/spec/acts_as_authoritah/matchers/direct_matcher_spec.rb +20 -0
  28. data/spec/acts_as_authoritah/matchers/scope_matcher_spec.rb +25 -0
  29. data/spec/acts_as_authoritah/spreadsheets/access_rights_mapper_spec.rb +13 -0
  30. data/spec/acts_as_authoritah/spreadsheets/spreadsheet_header_parser_spec.rb +8 -0
  31. data/spec/acts_as_authoritah/spreadsheets/spreadsheet_reader_spec.rb +29 -0
  32. data/spec/acts_as_authoritah/spreadsheets/spreadsheet_row_parser_spec.rb +24 -0
  33. data/spec/acts_as_authoritah/spreadsheets/spreadsheet_wrapper_spec.rb +15 -0
  34. data/spec/data/default.xls +0 -0
  35. data/spec/spec_helper.rb +5 -0
  36. metadata +91 -72
  37. data/.document +0 -5
  38. data/README.rdoc +0 -123
  39. data/VERSION +0 -1
  40. data/lib/access_control.rb +0 -30
  41. data/lib/access_rights.rb +0 -88
  42. data/lib/custom_exceptions.rb +0 -8
  43. data/lib/handler.rb +0 -38
  44. data/lib/loader.rb +0 -27
  45. data/test/acts_as_authoritah_test.rb +0 -23
  46. data/test/test_helper.rb +0 -22
@@ -0,0 +1,24 @@
1
+ require 'spec_helper'
2
+
3
+ describe ActsAsAuthoritah::SpreadsheetRowParser do
4
+ before :each do
5
+ @valid_row = ["scope1::scope2", "Dummy", "edit", "test", "x", "X", nil]
6
+ end
7
+
8
+ it "should take a valid row and return the scope" do
9
+ ActsAsAuthoritah::SpreadsheetRowParser.new(@valid_row).scope.should eq "scope1::scope2"
10
+ end
11
+
12
+ it "should take a valid row and return the controller" do
13
+ ActsAsAuthoritah::SpreadsheetRowParser.new(@valid_row).controller.should eq "Dummy"
14
+ end
15
+
16
+ it "should take a valid row and return the action" do
17
+ ActsAsAuthoritah::SpreadsheetRowParser.new(@valid_row).action.should eq "edit"
18
+ end
19
+
20
+ it "should take a valid row and return the access rights" do
21
+ ActsAsAuthoritah::SpreadsheetRowParser.new(@valid_row).access_rights.should eq [true, true, false]
22
+ end
23
+
24
+ end
@@ -0,0 +1,15 @@
1
+ require 'spec_helper'
2
+
3
+ describe ActsAsAuthoritah::SpreadsheetWrapper do
4
+ it "should be able to open a spreadsheet and convert to an array of AccessRules" do
5
+ ActsAsAuthoritah::SpreadsheetWrapper.new("spec/data/default.xls").to_access_rules.first.class.should eq ActsAsAuthoritah::AccessRule
6
+ end
7
+
8
+ it "ssadf" do
9
+ access_rules = ActsAsAuthoritah::SpreadsheetWrapper.new("spec/data/default.xls").to_access_rules
10
+ ActsAsAuthoritah::AccessControlList.new(access_rules).store.should eq({
11
+ "scope1::scope2::DummyController#edit"=>{"admin"=>true, "anonymous"=>false, "super_admin"=>true},
12
+ "scope3::scope4::AnotherController#update"=>{"admin"=>false, "anonymous"=>true, "super_admin"=>true}
13
+ })
14
+ end
15
+ end
Binary file
@@ -0,0 +1,5 @@
1
+ $LOAD_PATH.unshift File.join(File.dirname(__FILE__), '..', 'lib')
2
+ require 'acts_as_authoritah'
3
+
4
+ RSpec.configure do |config|
5
+ end
metadata CHANGED
@@ -1,97 +1,116 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: acts_as_authoritah
3
- version: !ruby/object:Gem::Version
4
- hash: 29
3
+ version: !ruby/object:Gem::Version
4
+ version: 2.0.0
5
5
  prerelease:
6
- segments:
7
- - 1
8
- - 0
9
- - 5
10
- version: 1.0.5
11
6
  platform: ruby
12
- authors:
13
- - BangTheTable
7
+ authors:
14
8
  - Unnikrishnan KP
15
9
  autorequire:
16
10
  bindir: bin
17
11
  cert_chain: []
18
-
19
- date: 2010-08-10 00:00:00 +05:30
20
- default_executable:
21
- dependencies:
22
- - !ruby/object:Gem::Dependency
23
- name: spreadsheet
12
+ date: 2012-04-04 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rspec
16
+ requirement: &2151808300 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :development
24
23
  prerelease: false
25
- requirement: &id001 !ruby/object:Gem::Requirement
24
+ version_requirements: *2151808300
25
+ - !ruby/object:Gem::Dependency
26
+ name: rake
27
+ requirement: &2151807780 !ruby/object:Gem::Requirement
26
28
  none: false
27
- requirements:
28
- - - ">="
29
- - !ruby/object:Gem::Version
30
- hash: 3
31
- segments:
32
- - 0
33
- version: "0"
34
- type: :runtime
35
- version_requirements: *id001
36
- description: role based access rights for a user specified via spreadsheet
37
- email: devteam@bangthetable.com, unni.tallman@gmail.com
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :development
34
+ prerelease: false
35
+ version_requirements: *2151807780
36
+ description: Define user capabilities in your app
37
+ email:
38
+ - unni.tallman@gmail.com
38
39
  executables: []
39
-
40
40
  extensions: []
41
-
42
- extra_rdoc_files:
43
- - LICENSE
44
- - README.rdoc
45
- files:
46
- - .document
41
+ extra_rdoc_files: []
42
+ files:
47
43
  - .gitignore
44
+ - .rspec
45
+ - Gemfile
48
46
  - LICENSE
49
- - README.rdoc
47
+ - README.md
50
48
  - Rakefile
51
- - VERSION
52
49
  - acts_as_authoritah.gemspec
53
50
  - lib/acts_as_authoritah.rb
54
- - lib/loader.rb
55
- - lib/handler.rb
56
- - lib/access_rights.rb
57
- - lib/access_control.rb
58
- - lib/custom_exceptions.rb
59
- - test/acts_as_authoritah_test.rb
60
- - test/test_helper.rb
61
- has_rdoc: true
62
- homepage: https://github.com/bangthetable/acts_as_authoritah/
51
+ - lib/acts_as_authoritah/access_control_list.rb
52
+ - lib/acts_as_authoritah/access_rule.rb
53
+ - lib/acts_as_authoritah/core.rb
54
+ - lib/acts_as_authoritah/identifier_parser.rb
55
+ - lib/acts_as_authoritah/matchers/controller_matcher.rb
56
+ - lib/acts_as_authoritah/matchers/direct_matcher.rb
57
+ - lib/acts_as_authoritah/matchers/scope_matcher.rb
58
+ - lib/acts_as_authoritah/spreadsheets/access_rights_mapper.rb
59
+ - lib/acts_as_authoritah/spreadsheets/spreadsheet_header_parser.rb
60
+ - lib/acts_as_authoritah/spreadsheets/spreadsheet_reader.rb
61
+ - lib/acts_as_authoritah/spreadsheets/spreadsheet_row_parser.rb
62
+ - lib/acts_as_authoritah/spreadsheets/spreadsheet_wrapper.rb
63
+ - lib/acts_as_authoritah/version.rb
64
+ - spec/acts_as_authoritah/access_control_list_spec.rb
65
+ - spec/acts_as_authoritah/access_rule_spec.rb
66
+ - spec/acts_as_authoritah/core_spec.rb
67
+ - spec/acts_as_authoritah/identifier_parser_spec.rb
68
+ - spec/acts_as_authoritah/matchers/controller_matcher_spec.rb
69
+ - spec/acts_as_authoritah/matchers/direct_matcher_spec.rb
70
+ - spec/acts_as_authoritah/matchers/scope_matcher_spec.rb
71
+ - spec/acts_as_authoritah/spreadsheets/access_rights_mapper_spec.rb
72
+ - spec/acts_as_authoritah/spreadsheets/spreadsheet_header_parser_spec.rb
73
+ - spec/acts_as_authoritah/spreadsheets/spreadsheet_reader_spec.rb
74
+ - spec/acts_as_authoritah/spreadsheets/spreadsheet_row_parser_spec.rb
75
+ - spec/acts_as_authoritah/spreadsheets/spreadsheet_wrapper_spec.rb
76
+ - spec/data/default.xls
77
+ - spec/spec_helper.rb
78
+ homepage: ''
63
79
  licenses: []
64
-
65
80
  post_install_message:
66
- rdoc_options:
67
- - --charset=UTF-8
68
- require_paths:
81
+ rdoc_options: []
82
+ require_paths:
69
83
  - lib
70
- required_ruby_version: !ruby/object:Gem::Requirement
84
+ required_ruby_version: !ruby/object:Gem::Requirement
71
85
  none: false
72
- requirements:
73
- - - ">="
74
- - !ruby/object:Gem::Version
75
- hash: 3
76
- segments:
77
- - 0
78
- version: "0"
79
- required_rubygems_version: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ! '>='
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ required_rubygems_version: !ruby/object:Gem::Requirement
80
91
  none: false
81
- requirements:
82
- - - ">="
83
- - !ruby/object:Gem::Version
84
- hash: 3
85
- segments:
86
- - 0
87
- version: "0"
92
+ requirements:
93
+ - - ! '>='
94
+ - !ruby/object:Gem::Version
95
+ version: '0'
88
96
  requirements: []
89
-
90
97
  rubyforge_project:
91
- rubygems_version: 1.4.2
98
+ rubygems_version: 1.8.17
92
99
  signing_key:
93
100
  specification_version: 3
94
- summary: role based access rights for a user specified via spreadsheet
95
- test_files:
96
- - test/acts_as_authoritah_test.rb
97
- - test/test_helper.rb
101
+ summary: Define user capabilities in your app
102
+ test_files:
103
+ - spec/acts_as_authoritah/access_control_list_spec.rb
104
+ - spec/acts_as_authoritah/access_rule_spec.rb
105
+ - spec/acts_as_authoritah/core_spec.rb
106
+ - spec/acts_as_authoritah/identifier_parser_spec.rb
107
+ - spec/acts_as_authoritah/matchers/controller_matcher_spec.rb
108
+ - spec/acts_as_authoritah/matchers/direct_matcher_spec.rb
109
+ - spec/acts_as_authoritah/matchers/scope_matcher_spec.rb
110
+ - spec/acts_as_authoritah/spreadsheets/access_rights_mapper_spec.rb
111
+ - spec/acts_as_authoritah/spreadsheets/spreadsheet_header_parser_spec.rb
112
+ - spec/acts_as_authoritah/spreadsheets/spreadsheet_reader_spec.rb
113
+ - spec/acts_as_authoritah/spreadsheets/spreadsheet_row_parser_spec.rb
114
+ - spec/acts_as_authoritah/spreadsheets/spreadsheet_wrapper_spec.rb
115
+ - spec/data/default.xls
116
+ - spec/spec_helper.rb
data/.document DELETED
@@ -1,5 +0,0 @@
1
- README.rdoc
2
- lib/**/*.rb
3
- bin/*
4
- features/**/*.feature
5
- LICENSE
data/README.rdoc DELETED
@@ -1,123 +0,0 @@
1
- = acts_as_authoritah
2
-
3
- INSTALLATION
4
-
5
- gem install acts_as_authoritah
6
-
7
- Rails 2.*
8
- Add in environemnt.rb
9
- config.gem 'acts_as_authoritah'
10
-
11
- Rails 3.*
12
- Add in Gemfile
13
- gem 'acts_as_authoritah'
14
-
15
- = A sample blogging app.
16
-
17
- - Creating blog posts.
18
- - Editing blog posts.
19
- - Commenting on blog posts.
20
-
21
- A blog post when first created will be in unpublished state. The post can be published later.
22
-
23
- User Roles and capabilities.
24
-
25
- - Author
26
- He can create blog posts
27
- He can edit posts
28
- He can view blog posts
29
- He cannot add comments
30
- - Registered user (who has signed up and logged-in)
31
- He can view blog posts
32
- He can comment on blog posts
33
- He cannot create blog posts
34
- He cannot edit blog posts
35
- - anonymous user
36
- He can view blog posts
37
- He cannot add comments
38
- He cannot create blog posts
39
- He cannot edit blog posts
40
- - admin
41
- unrestricted access to everything.
42
-
43
-
44
- When post is unpublished
45
-
46
- - Logged-in user (who has signed up)
47
- He cannot comment on blog posts
48
- He cannot view blog posts.
49
-
50
-
51
- = Getting this done with ActsAsAuthoritah
52
-
53
- 1. Create an excel sheet (or download a sample https://github.com/bangthetable/acts_as_authoritah/blob/master/sample/default.xls)
54
- and save it at config/acl/default.xls. When the post is unpublished, there are two rules which are different from the default set of rules.
55
- We need to add these two rules alone in config/acl/unpublished.xls https://github.com/bangthetable/acts_as_authoritah/blob/master/sample/unpublished.xls
56
-
57
- 2. Add the following line to your User model (or to whichever is your equivalent of User model)
58
-
59
- acts_as_authoritah :acl_folder => File.join(RAILS_ROOT,"config","acl")
60
-
61
- 3. Add 'include ActsAsAuthoritah' in ApplicationController
62
-
63
- 4. ActsAsAuthoritah needs a wrapper around your 'current_user' method (name may differ based on the authentication system you use), to make it return an empty User object when
64
- user is not logged in.
65
-
66
- A sample -
67
-
68
- def present_user
69
- current_user.to_s == "false" ? User.new : current_user
70
- end
71
-
72
- 5. In your User model, you need to define a 'usertype' method which should return the role of that user (same as in the first row of the spreadsheet).
73
-
74
- A sample -
75
-
76
- def usertype(args={})
77
- return role.name if role
78
- return "anonymous" if new_record?
79
- return "registered"
80
- end
81
-
82
- Implementation of usertype method can vary, based on the role-system you are following. Just make sure it always returns role of the user (string), which should match with the roles
83
- specified in the first row of the spreadsheet.
84
-
85
-
86
- 6. in Post model
87
-
88
- def status
89
- published? ? nil : 'unpublished'
90
- end
91
-
92
- This will be used to let authoritah know when a post in in unpublished state, so that authoritah can override the default rules with those in unpublished.xls
93
-
94
- 7. For access control of methods in PostController and CommentController, put these two files in lib/access_control/
95
- https://github.com/bangthetable/acts_as_authoritah/blob/master/sample/comment_controller_access.rb
96
- https://github.com/bangthetable/acts_as_authoritah/blob/master/sample/post_controller_access.rb
97
-
98
- 8. To make sure that links are shown only to appropriate users, add lines like these in in the views.
99
-
100
- <% if present_user.can_post_a_comment?(:context => @post.status) %>
101
- <%= link_to 'Add a comment', {:controller => 'comment', :action => 'new', :post_id => @post.id} %>
102
- <% end%>
103
-
104
- 9. Thats all - your application is access controlled by ActsAsAuthoritah now.
105
-
106
- - You can grant/revoke access to different features to different roles just by editing the spreadsheets.
107
- - You can add a new user-role by adding a column in the spreadsheets.
108
- - If your application needs to have one more context (say, archived posts), you can do that by adding one more spreadsheet called archived.xls.
109
-
110
- == Note on Patches/Pull Requests
111
-
112
- * Fork the project.
113
- * Make your feature addition or bug fix.
114
- * Add tests for it. This is important so I don't break it in a
115
- future version unintentionally.
116
- * Commit, do not mess with rakefile, version, or history.
117
- (if you want to have your own version, that is fine but
118
- bump version in a commit by itself I can ignore when I pull)
119
- * Send me a pull request. Bonus points for topic branches.
120
-
121
- == Copyright
122
-
123
- Copyright (c) 2010 Bang The Table. See LICENSE for details.
data/VERSION DELETED
@@ -1 +0,0 @@
1
- 1.0.1
@@ -1,30 +0,0 @@
1
- Dir[File.join(Dir.pwd,'lib','access_control','*.rb')].each {|f| require f}
2
-
3
- module AccessControls
4
- def self.access_control(controller)
5
- params = controller.params
6
- access_control_method = params[:action]
7
- begin
8
- access_module = (controller.class.to_s + "Access").constantize
9
- rescue => e
10
- if e.to_s =~ /uninitialized constant/
11
- Rails.logger.info "\nAccess control module for #{controller.class.to_s} is not defined yet\n"
12
- return true
13
- else
14
- raise
15
- end
16
- end
17
-
18
- begin
19
- return access_module.send(access_control_method,controller)
20
- rescue => e
21
- if e.to_s =~ /undefined method/
22
- Rails.logger.info "#{e.to_s}\nAccess control method '#{access_control_method}' is not defined yet in " +
23
- controller.class.to_s + "Access" + "module\n"
24
- return true
25
- else
26
- raise
27
- end
28
- end
29
- end
30
- end
data/lib/access_rights.rb DELETED
@@ -1,88 +0,0 @@
1
- module ActsAsAuthoritah
2
- def deny_unauthorized_access
3
- if File.exists?("#{Rails.public_path}/401.html") and !request.xhr?
4
- render :file => "#{Rails.public_path}/401.html", :status => :unauthorized and return
5
- else
6
- render :text => "access denied", :status => :unauthorized and return
7
- end
8
- end
9
-
10
- module AccessRights
11
- ACL = Hash.new
12
- Default = Hash.new
13
- Urls = {}
14
-
15
- def self.feature_list
16
- Default.keys.collect(&:downcase)
17
- end
18
-
19
- def self.urls(context)
20
- h = {}
21
- ACL[context].keys.collect(&:downcase).each do |feature|
22
- h[feature] = access_url(feature)
23
- end
24
- h
25
- end
26
-
27
- def self.access_url(feature)
28
- Urls[feature.downcase]
29
- end
30
-
31
- def self.contexts
32
- ACL.keys.collect(&:downcase)
33
- end
34
-
35
- def self.load_all_files(dir,default_file="default.xls")
36
- Dir.xls_files(dir).each do |file|
37
- acl_type = file.split(".").first
38
- ACL[acl_type] = load(File.join(dir,file))
39
- end
40
-
41
- (ACL[default_file.split(".").first] || {}).each_pair do |key,value|
42
- Default[key] = value
43
- end
44
- end
45
-
46
- def self.load(file)
47
- hash = {}
48
- book = Spreadsheet.open file
49
- sheet = book.worksheets.first
50
-
51
- urls_column_index = -1
52
-
53
- usertypes = []
54
-
55
- sheet.each do |row|
56
- if row[0] == 'name'
57
- k = 2
58
- while true
59
- usertype = row[k]
60
- break unless usertype
61
-
62
- usertypes << usertype unless usertype.downcase == "url"
63
- urls_column_index = k if usertype.downcase == "url"
64
-
65
- k += 1
66
- end
67
- usertypes = usertypes.collect(&:downcase)
68
- next
69
- end
70
-
71
- h = Hash.new
72
- feature_name = row[0]
73
-
74
- next unless feature_name
75
- feature_name.strip!
76
-
77
- Urls[feature_name] = row[urls_column_index] unless urls_column_index == -1
78
-
79
- usertypes.each_with_index do |key,i|
80
- value = (row[i+2] and row[i+2].include?('x')) ? true : false
81
- h[key]=value
82
- end
83
- hash[feature_name] = h
84
- end
85
- return hash
86
- end
87
- end
88
- end