lockdown 1.6.5 → 2.0.0
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.
- data/.gitignore +1 -0
- data/README.txt +8 -5
- data/Rakefile +43 -26
- data/lib/lockdown/access.rb +108 -0
- data/lib/lockdown/configuration.rb +201 -0
- data/lib/lockdown/database.rb +31 -36
- data/lib/lockdown/delivery.rb +26 -0
- data/lib/lockdown/errors.rb +3 -7
- data/lib/lockdown/frameworks/rails/controller.rb +21 -59
- data/lib/lockdown/frameworks/rails/view.rb +1 -1
- data/lib/lockdown/frameworks/rails.rb +7 -43
- data/lib/lockdown/helper.rb +14 -85
- data/lib/lockdown/orms/active_record.rb +7 -9
- data/lib/lockdown/permission.rb +37 -203
- data/lib/lockdown/resource.rb +54 -0
- data/lib/lockdown/session.rb +16 -25
- data/lib/lockdown/user_group.rb +16 -0
- data/lib/lockdown.rb +15 -60
- data/lockdown.gemspec +29 -69
- data/test/helper.rb +9 -0
- data/test/lockdown/test_access.rb +80 -0
- data/test/lockdown/test_configuration.rb +194 -0
- data/test/lockdown/test_delivery.rb +163 -0
- data/test/lockdown/test_helper.rb +33 -0
- data/test/lockdown/test_permission.rb +73 -0
- data/test/lockdown/test_resource.rb +47 -0
- data/test/lockdown/test_session.rb +31 -0
- data/test/lockdown/test_user_group.rb +17 -0
- data/test/test_lockdown.rb +11 -0
- metadata +41 -78
- data/lib/lockdown/context.rb +0 -41
- data/lib/lockdown/references.rb +0 -19
- data/lib/lockdown/rspec_helper.rb +0 -118
- data/lib/lockdown/rules.rb +0 -372
- data/lib/lockdown/system.rb +0 -58
- data/rails_generators/lockdown/lockdown_generator.rb +0 -274
- data/rails_generators/lockdown/templates/app/controllers/permissions_controller.rb +0 -22
- data/rails_generators/lockdown/templates/app/controllers/sessions_controller.rb +0 -39
- data/rails_generators/lockdown/templates/app/controllers/user_groups_controller.rb +0 -122
- data/rails_generators/lockdown/templates/app/controllers/users_controller.rb +0 -117
- data/rails_generators/lockdown/templates/app/helpers/permissions_helper.rb +0 -2
- data/rails_generators/lockdown/templates/app/helpers/user_groups_helper.rb +0 -2
- data/rails_generators/lockdown/templates/app/helpers/users_helper.rb +0 -2
- data/rails_generators/lockdown/templates/app/models/permission.rb +0 -13
- data/rails_generators/lockdown/templates/app/models/profile.rb +0 -10
- data/rails_generators/lockdown/templates/app/models/user.rb +0 -95
- data/rails_generators/lockdown/templates/app/models/user_group.rb +0 -15
- data/rails_generators/lockdown/templates/app/views/permissions/index.html.erb +0 -16
- data/rails_generators/lockdown/templates/app/views/permissions/show.html.erb +0 -26
- data/rails_generators/lockdown/templates/app/views/sessions/new.html.erb +0 -12
- data/rails_generators/lockdown/templates/app/views/user_groups/edit.html.erb +0 -33
- data/rails_generators/lockdown/templates/app/views/user_groups/index.html.erb +0 -20
- data/rails_generators/lockdown/templates/app/views/user_groups/new.html.erb +0 -31
- data/rails_generators/lockdown/templates/app/views/user_groups/show.html.erb +0 -29
- data/rails_generators/lockdown/templates/app/views/users/edit.html.erb +0 -51
- data/rails_generators/lockdown/templates/app/views/users/index.html.erb +0 -22
- data/rails_generators/lockdown/templates/app/views/users/new.html.erb +0 -50
- data/rails_generators/lockdown/templates/app/views/users/show.html.erb +0 -33
- data/rails_generators/lockdown/templates/config/initializers/lockit.rb +0 -1
- data/rails_generators/lockdown/templates/db/migrate/create_admin_user.rb +0 -17
- data/rails_generators/lockdown/templates/db/migrate/create_permissions.rb +0 -19
- data/rails_generators/lockdown/templates/db/migrate/create_profiles.rb +0 -26
- data/rails_generators/lockdown/templates/db/migrate/create_user_groups.rb +0 -19
- data/rails_generators/lockdown/templates/db/migrate/create_users.rb +0 -17
- data/rails_generators/lockdown/templates/lib/lockdown/README +0 -42
- data/rails_generators/lockdown/templates/lib/lockdown/init.rb +0 -131
- data/spec/lockdown/context_spec.rb +0 -191
- data/spec/lockdown/database_spec.rb +0 -162
- data/spec/lockdown/frameworks/rails/controller_spec.rb +0 -215
- data/spec/lockdown/frameworks/rails/view_spec.rb +0 -96
- data/spec/lockdown/frameworks/rails_spec.rb +0 -163
- data/spec/lockdown/permission_spec.rb +0 -156
- data/spec/lockdown/rspec_helper_spec.rb +0 -40
- data/spec/lockdown/rules_spec.rb +0 -245
- data/spec/lockdown/session_spec.rb +0 -112
- data/spec/lockdown/system_spec.rb +0 -51
- data/spec/lockdown_spec.rb +0 -19
- data/spec/rcov.opts +0 -5
- data/spec/spec.opts +0 -3
- data/spec/spec_helper.rb +0 -8
data/.gitignore
CHANGED
data/README.txt
CHANGED
@@ -1,10 +1,13 @@
|
|
1
|
-
lockdown
|
2
|
-
by Andrew Stone
|
3
|
-
http://stonean.com
|
4
|
-
|
5
1
|
== DESCRIPTION:
|
6
2
|
|
7
|
-
Lockdown is an authorization system for RubyOnRails (ver >=
|
3
|
+
Lockdown is an authorization system for RubyOnRails (ver >= 3.0).
|
4
|
+
|
5
|
+
|
6
|
+
Version 3.0 of Lockdown will be a Rails 3 compatible rewrite. I'm going to take some of the discoveries from Monty (my Rack based authorization project) and roll them into Lockdown.
|
7
|
+
|
8
|
+
The model level interaction will be redone completely. It sucks right now.
|
9
|
+
|
10
|
+
Follow me on Twitter (@stonean) to keep up to date.
|
8
11
|
|
9
12
|
== INSTALL:
|
10
13
|
|
data/Rakefile
CHANGED
@@ -1,38 +1,55 @@
|
|
1
1
|
require 'rubygems'
|
2
2
|
require 'rake'
|
3
|
-
require 'rcov'
|
4
|
-
require 'spec/rake/spectask'
|
5
3
|
|
6
|
-
require
|
7
|
-
task :default => 'rcov'
|
4
|
+
require File.join(File.dirname(__FILE__), "lib", "lockdown")
|
8
5
|
|
9
|
-
|
10
|
-
|
11
|
-
|
6
|
+
begin
|
7
|
+
require 'jeweler'
|
8
|
+
Jeweler::Tasks.new do |gem|
|
9
|
+
gem.name = "lockdown"
|
10
|
+
gem.version = Lockdown.version
|
11
|
+
gem.rubyforge_project = "lockdown"
|
12
|
+
gem.summary = "Authorization system for Rails 2.x"
|
13
|
+
gem.description = "Restrict access to your controller actions. Supports basic model level restrictions as well"
|
14
|
+
gem.email = "andy@stonean.com"
|
15
|
+
gem.homepage = "http://stonean.com/wiki/lockdown"
|
16
|
+
gem.authors = ["Andrew Stone"]
|
17
|
+
end
|
18
|
+
Jeweler::GemcutterTasks.new
|
19
|
+
rescue LoadError
|
20
|
+
puts "Jeweler not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
|
12
21
|
end
|
13
22
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
23
|
+
begin
|
24
|
+
require 'yard'
|
25
|
+
YARD::Rake::YardocTask.new do |t|
|
26
|
+
t.files = FileList['lib/**/*.rb']
|
27
|
+
t.options = ['-r'] # optional
|
28
|
+
end
|
29
|
+
rescue LoadError
|
30
|
+
task :yard do
|
31
|
+
abort "YARD is not available. In order to run yard, you must: sudo gem install yard"
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
require 'rake/testtask'
|
36
|
+
Rake::TestTask.new(:test) do |test|
|
37
|
+
test.libs << 'lib' << 'test'
|
38
|
+
test.pattern = 'test/**/test_*.rb'
|
39
|
+
test.verbose = true
|
20
40
|
end
|
21
41
|
|
22
42
|
begin
|
23
|
-
require '
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
gemspec.summary = "Authorization system for Rails 2.x"
|
29
|
-
gemspec.description = "Restrict access to your controller actions. Supports basic model level restrictions as well"
|
30
|
-
gemspec.email = "andy@stonean.com"
|
31
|
-
gemspec.homepage = "http://stonean.com/wiki/lockdown"
|
32
|
-
gemspec.authors = ["Andrew Stone"]
|
33
|
-
gemspec.add_development_dependency('rspec')
|
43
|
+
require 'rcov/rcovtask'
|
44
|
+
Rcov::RcovTask.new do |test|
|
45
|
+
test.libs << 'test'
|
46
|
+
test.pattern = 'test/**/test_*.rb'
|
47
|
+
test.verbose = true
|
34
48
|
end
|
35
|
-
Jeweler::GemcutterTasks.new
|
36
49
|
rescue LoadError
|
37
|
-
|
50
|
+
task :rcov do
|
51
|
+
abort "RCov is not available. In order to run rcov, you must: sudo gem install rcov"
|
52
|
+
end
|
38
53
|
end
|
54
|
+
|
55
|
+
task :default => 'test'
|
@@ -0,0 +1,108 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Lockdown
|
4
|
+
module Access
|
5
|
+
# Define permision that defines how your application is accessed.
|
6
|
+
# # All methods on the site resource will be open to users who have
|
7
|
+
# # this permission.
|
8
|
+
# permission :public_pages do
|
9
|
+
# resource :site
|
10
|
+
# end
|
11
|
+
#
|
12
|
+
# # Can use multiple resource statements
|
13
|
+
# permission :public_pages do
|
14
|
+
# resource :site
|
15
|
+
# resource :posts
|
16
|
+
# end
|
17
|
+
#
|
18
|
+
# # Only methods show, edit and update on the users resource will
|
19
|
+
# # be open to users who have this permission.
|
20
|
+
# permission :my_account_pages do
|
21
|
+
# resource :users do
|
22
|
+
# only :show, :edit, :update
|
23
|
+
# end
|
24
|
+
# end
|
25
|
+
#
|
26
|
+
# # All methods except destroy on the users resource will be
|
27
|
+
# # open to users who have this permission.
|
28
|
+
# permission :manage_users do
|
29
|
+
# resource :users do
|
30
|
+
# except :destroy
|
31
|
+
# end
|
32
|
+
# end
|
33
|
+
#
|
34
|
+
# @param [String,Symbol] name permission reference.
|
35
|
+
# @yield [Lockdown::Permission.new(name)] new permission object
|
36
|
+
def permission(name, &block)
|
37
|
+
permission = Lockdown::Permission.new(name)
|
38
|
+
if block_given?
|
39
|
+
permission.instance_eval(&block)
|
40
|
+
else
|
41
|
+
permission.resource(permission.name)
|
42
|
+
end
|
43
|
+
|
44
|
+
unless Lockdown::Configuration.has_permission?(permission)
|
45
|
+
Lockdown::Configuration.permissions << permission
|
46
|
+
end
|
47
|
+
|
48
|
+
permission
|
49
|
+
end
|
50
|
+
|
51
|
+
# Define which permissions are accessible to everyone
|
52
|
+
# public_access :site, :user_registration
|
53
|
+
#
|
54
|
+
# @param *[String,Symbol] permissions that are accessible to everyone
|
55
|
+
def public_access(*permissions)
|
56
|
+
permissions.each do |name|
|
57
|
+
Lockdown::Configuration.make_permission_public(name)
|
58
|
+
end
|
59
|
+
|
60
|
+
Lockdown::Configuration.public_access = regexes(permissions)
|
61
|
+
end
|
62
|
+
|
63
|
+
# Define which permissions are accessible to everyone
|
64
|
+
# protected_access :my_account, :site_administration
|
65
|
+
#
|
66
|
+
# @param *[String,Symbol] permissions that are accessbile to authenticated users
|
67
|
+
def protected_access(*permissions)
|
68
|
+
permissions.each do |name|
|
69
|
+
Lockdown::Configuration.make_permission_protected(name)
|
70
|
+
end
|
71
|
+
|
72
|
+
Lockdown::Configuration.protected_access = regexes(permissions)
|
73
|
+
end
|
74
|
+
|
75
|
+
# Create user group by giving it a name and a list of permission names.
|
76
|
+
# @param [String, Array] user group name, permission names
|
77
|
+
def user_group(name, *permissions)
|
78
|
+
return if permissions.empty?
|
79
|
+
name = name.to_s
|
80
|
+
ug = Lockdown::Configuration.find_or_create_user_group(name)
|
81
|
+
|
82
|
+
permissions.each do |name|
|
83
|
+
if (perm = Lockdown::Configuration.permission(name))
|
84
|
+
ug.permissions << perm unless ug.permissions.include?(perm)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
Lockdown::Configuration.maybe_add_user_group(ug)
|
89
|
+
end
|
90
|
+
|
91
|
+
# Method called by Lockdown::Delivery to trigger parsing of class methods
|
92
|
+
def configure
|
93
|
+
unless Lockdown::Configuration.configured
|
94
|
+
Lockdown::Database.sync_with_db unless Lockdown::Configuration.skip_sync?
|
95
|
+
Lockdown::Configuration.configured = true
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
private
|
100
|
+
|
101
|
+
def regexes(permissions)
|
102
|
+
permissions.collect!{|p| p.to_s}
|
103
|
+
perms = Lockdown::Configuration.permissions.select{|p| permissions.include?(p.name)}
|
104
|
+
perms.collect{|p| p.regex_pattern}.join("|")
|
105
|
+
end
|
106
|
+
|
107
|
+
end # Access
|
108
|
+
end # Lockdown
|
@@ -0,0 +1,201 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Lockdown
|
4
|
+
module Configuration
|
5
|
+
class << self
|
6
|
+
# Flag to determine if configuration method has been executed
|
7
|
+
# Default false
|
8
|
+
attr_accessor :configured
|
9
|
+
# Regex string of paths that are publicly accessible.
|
10
|
+
# Default "\/"
|
11
|
+
attr_accessor :public_access
|
12
|
+
# Array of paths that are restricted to an authenticated user.
|
13
|
+
# Default ""
|
14
|
+
attr_accessor :protected_access
|
15
|
+
# Array of permission objects that defines the access to the application.
|
16
|
+
# Default []
|
17
|
+
attr_accessor :permissions
|
18
|
+
# Array of user group objects
|
19
|
+
# Default []
|
20
|
+
attr_accessor :user_groups
|
21
|
+
# Method used to get the id of the user responsible for
|
22
|
+
# the current action.
|
23
|
+
# Default :current_user_id
|
24
|
+
attr_accessor :who_did_it
|
25
|
+
# User id to associate to system actions
|
26
|
+
# Default 1
|
27
|
+
attr_accessor :default_who_did_it
|
28
|
+
# Path to redirect to if access is denied.
|
29
|
+
# Default: '/'
|
30
|
+
attr_accessor :access_denied_path
|
31
|
+
# Redirect to path on successful login
|
32
|
+
# Default "/"
|
33
|
+
attr_accessor :successful_login_path
|
34
|
+
# Logout user if attempt to access restricted resource
|
35
|
+
# Default false
|
36
|
+
attr_accessor :logout_on_access_violation
|
37
|
+
# When using the links helper, this character will be
|
38
|
+
# used to separate the links.
|
39
|
+
# Default "|"
|
40
|
+
attr_accessor :link_separator
|
41
|
+
# The model used to represent the grouping of permisssion. Common
|
42
|
+
# choices are 'Role' and 'UserGroup'.
|
43
|
+
# Default "UserGroup"
|
44
|
+
attr_accessor :user_group_model
|
45
|
+
# The model used to represent the user. Common choices
|
46
|
+
# are 'User' and 'Person'.
|
47
|
+
# Default "User"
|
48
|
+
attr_accessor :user_model
|
49
|
+
# Which environments Lockdown should not sync with db
|
50
|
+
# Default ['test']
|
51
|
+
attr_accessor :skip_db_sync_in
|
52
|
+
# Set defaults.
|
53
|
+
def reset
|
54
|
+
@configured = false
|
55
|
+
@public_access = ""
|
56
|
+
@protected_access = ""
|
57
|
+
@permissions = []
|
58
|
+
@user_groups = []
|
59
|
+
|
60
|
+
@who_did_it = :current_user_id
|
61
|
+
@default_who_did_it = 1
|
62
|
+
|
63
|
+
@access_denied_path = "/"
|
64
|
+
@successful_login_path = "/"
|
65
|
+
@logout_on_access_violation = false
|
66
|
+
|
67
|
+
@link_separator = "|"
|
68
|
+
|
69
|
+
@user_group_model = "UserGroup"
|
70
|
+
@user_model = "User"
|
71
|
+
|
72
|
+
@skip_db_sync_in = ['test']
|
73
|
+
end
|
74
|
+
|
75
|
+
# @return [String] concatentation of public_access + "|" + protected_access
|
76
|
+
def authenticated_access
|
77
|
+
public_access + "|" + protected_access
|
78
|
+
end
|
79
|
+
|
80
|
+
# @param [String,Symbol] name permission name
|
81
|
+
# @return Lockdown::Permission object
|
82
|
+
def permission(name)
|
83
|
+
name = name.to_s
|
84
|
+
perm = permissions.detect{|perm| name == perm.name}
|
85
|
+
raise Lockdown::PermissionNotFound.new("Permission: #{name} not found") unless perm
|
86
|
+
perm
|
87
|
+
end
|
88
|
+
|
89
|
+
# Defines the permission as public
|
90
|
+
# @param [String,Symbol] name permission name
|
91
|
+
def make_permission_public(name)
|
92
|
+
permission(name).is_public
|
93
|
+
end
|
94
|
+
|
95
|
+
# Defines the permission as protected
|
96
|
+
# @param [String,Symbol] name permission name
|
97
|
+
def make_permission_protected(name)
|
98
|
+
permission(name).is_protected
|
99
|
+
end
|
100
|
+
|
101
|
+
# @return Array of permission names
|
102
|
+
def permission_names
|
103
|
+
permissions.collect{|p| p.name}
|
104
|
+
end
|
105
|
+
|
106
|
+
# @param [Lockdown::Permission] permission Lockdown::Permission object
|
107
|
+
# @return [true|false] true if object exists with same name
|
108
|
+
def has_permission?(permission)
|
109
|
+
permissions.any?{|p| permission.name == p.name}
|
110
|
+
end
|
111
|
+
|
112
|
+
# @param [String|Symbol] name permission name
|
113
|
+
# @return [true|false] true if permission is either public or protected
|
114
|
+
def permission_assigned_automatically?(name)
|
115
|
+
name = name.to_s
|
116
|
+
|
117
|
+
perm = permission(name)
|
118
|
+
|
119
|
+
perm.public? || perm.protected?
|
120
|
+
end
|
121
|
+
|
122
|
+
# @param [String,Symbol] name user group name
|
123
|
+
# @return [Lockdown::UserGroup] object
|
124
|
+
def user_group(name)
|
125
|
+
name = name.to_s
|
126
|
+
user_groups.detect{|ug| name == ug.name}
|
127
|
+
end
|
128
|
+
|
129
|
+
def maybe_add_user_group(group)
|
130
|
+
@user_groups << group unless user_group_names.include?(group.name)
|
131
|
+
end
|
132
|
+
|
133
|
+
# @return [Lockdown::UserGroup]
|
134
|
+
def find_or_create_user_group(name)
|
135
|
+
name = name.to_s
|
136
|
+
user_group(name) || Lockdown::UserGroup.new(name)
|
137
|
+
end
|
138
|
+
|
139
|
+
# @return [Array] names
|
140
|
+
def user_group_names
|
141
|
+
user_groups.collect{|ug| ug.name}
|
142
|
+
end
|
143
|
+
|
144
|
+
# @param [String] name user group name
|
145
|
+
# @return [Array] permissions names
|
146
|
+
def user_group_permissions_names(name)
|
147
|
+
user_group(name).permissions.collect{|p| p.name}
|
148
|
+
end
|
149
|
+
|
150
|
+
# @return [True|False] true if user has 'Administrators' group
|
151
|
+
def administrator?(user)
|
152
|
+
user_has_user_group?(user, Lockdown.administrator_group_name)
|
153
|
+
end
|
154
|
+
|
155
|
+
# @param [User] user User object you want to make an administrator
|
156
|
+
def make_user_administrator(user)
|
157
|
+
user_groups = user.send(Lockdown.user_groups_hbtm_reference)
|
158
|
+
user_groups << Lockdown.user_group_class.
|
159
|
+
find_or_create_by_name(Lockdown.administrator_group_name)
|
160
|
+
end
|
161
|
+
|
162
|
+
|
163
|
+
# @param [User, String] user,name user model, name of user group
|
164
|
+
# @return [True|False] true if user has user group with name
|
165
|
+
def user_has_user_group?(user, name)
|
166
|
+
user_groups = user.send(Lockdown.user_groups_hbtm_reference)
|
167
|
+
user_groups.any?{|ug| name == ug.name}
|
168
|
+
end
|
169
|
+
|
170
|
+
# @return [Regex]
|
171
|
+
def access_rights_for_user(user)
|
172
|
+
return unless user
|
173
|
+
return Lockdown::Resource.regex if administrator?(user)
|
174
|
+
|
175
|
+
user_groups = user.send(Lockdown.user_groups_hbtm_reference)
|
176
|
+
|
177
|
+
permission_names = []
|
178
|
+
|
179
|
+
user_groups.each do |ug|
|
180
|
+
ug.permissions.each do |p|
|
181
|
+
permission_names << p.name
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
185
|
+
authenticated_access + "|" + access_rights_for_permissions(*permission_names)
|
186
|
+
end
|
187
|
+
|
188
|
+
# @param [Array(String)] names permission names
|
189
|
+
# @return [String] combination of regex_patterns from permissions
|
190
|
+
def access_rights_for_permissions(*names)
|
191
|
+
names.collect{|name| "(#{permission(name).regex_pattern})"}.join('|')
|
192
|
+
end
|
193
|
+
|
194
|
+
def skip_sync?
|
195
|
+
true
|
196
|
+
end
|
197
|
+
end # class block
|
198
|
+
|
199
|
+
self.reset
|
200
|
+
end # Configuration
|
201
|
+
end # Lockdown
|
data/lib/lockdown/database.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
1
3
|
module Lockdown
|
2
4
|
class Database
|
3
5
|
class << self
|
@@ -6,32 +8,29 @@ module Lockdown
|
|
6
8
|
# an interface for each the different orm implementations.
|
7
9
|
# We'll see how it works...
|
8
10
|
def sync_with_db
|
9
|
-
|
10
|
-
@
|
11
|
-
@user_groups = Lockdown::System.get_user_groups
|
11
|
+
@permissions = Lockdown::Configuration.permission_names
|
12
|
+
@user_groups = Lockdown::Configuration.user_group_names
|
12
13
|
|
13
14
|
unless ::Permission.table_exists? && Lockdown.user_group_class.table_exists?
|
14
15
|
Lockdown.logger.info ">> Lockdown tables not found. Skipping database sync."
|
15
16
|
return
|
16
17
|
end
|
18
|
+
|
17
19
|
create_new_permissions
|
18
20
|
|
19
21
|
delete_extinct_permissions
|
20
22
|
|
21
23
|
maintain_user_groups
|
22
|
-
rescue Exception => e
|
23
|
-
Lockdown.logger.error ">> Lockdown sync failed: #{e.backtrace.join("\n")}"
|
24
24
|
end
|
25
25
|
|
26
26
|
# Create permissions not found in the database
|
27
27
|
def create_new_permissions
|
28
|
-
@permissions.each do |
|
29
|
-
next if Lockdown::
|
30
|
-
|
31
|
-
p = ::Permission.find(:first, :conditions => ["name = ?", str])
|
28
|
+
@permissions.each do |name|
|
29
|
+
next if Lockdown::Configuration.permission_assigned_automatically?(name)
|
30
|
+
p = ::Permission.find(:first, :conditions => ["name = ?", name])
|
32
31
|
unless p
|
33
|
-
Lockdown.logger.info ">> Lockdown: Permission not found in db: #{
|
34
|
-
::Permission.create(:name =>
|
32
|
+
Lockdown.logger.info ">> Lockdown: Permission not found in db: #{name}, creating."
|
33
|
+
::Permission.create(:name => name)
|
35
34
|
end
|
36
35
|
end
|
37
36
|
end
|
@@ -40,7 +39,7 @@ module Lockdown
|
|
40
39
|
def delete_extinct_permissions
|
41
40
|
db_perms = ::Permission.find(:all).dup
|
42
41
|
db_perms.each do |dbp|
|
43
|
-
unless @permissions.include?(
|
42
|
+
unless @permissions.include?(dbp.name)
|
44
43
|
Lockdown.logger.info ">> Lockdown: Permission no longer in init.rb: #{dbp.name}, deleting."
|
45
44
|
ug_table = Lockdown.user_groups_hbtm_reference.to_s
|
46
45
|
if "permissions" < ug_table
|
@@ -56,33 +55,32 @@ module Lockdown
|
|
56
55
|
|
57
56
|
def maintain_user_groups
|
58
57
|
# Create user groups not found in the database
|
59
|
-
@user_groups.each do |
|
60
|
-
|
61
|
-
|
62
|
-
create_user_group(str, key)
|
58
|
+
@user_groups.each do |name|
|
59
|
+
unless ug = Lockdown.user_group_class.find(:first, :conditions => ["name = ?", name])
|
60
|
+
create_user_group(name)
|
63
61
|
else
|
64
62
|
# Remove permissions from user group not found in init.rb
|
65
|
-
remove_invalid_permissions(ug
|
63
|
+
remove_invalid_permissions(ug)
|
66
64
|
|
67
65
|
# Add in permissions from init.rb not found in database
|
68
|
-
add_valid_permissions(ug
|
66
|
+
add_valid_permissions(ug)
|
69
67
|
end
|
70
68
|
end
|
71
69
|
end
|
72
70
|
|
73
|
-
def create_user_group(
|
74
|
-
Lockdown.logger.info ">> Lockdown: #{Lockdown::
|
75
|
-
ug = Lockdown.user_group_class.create(:name =>
|
71
|
+
def create_user_group(name)
|
72
|
+
Lockdown.logger.info ">> Lockdown: #{Lockdown::Configuration.user_group_model} not in the db: #{name}, creating."
|
73
|
+
ug = Lockdown.user_group_class.create(:name => name)
|
76
74
|
#Inefficient, definitely, but shouldn't have any issues across orms.
|
77
75
|
#
|
78
|
-
Lockdown::
|
76
|
+
Lockdown::Configuration.user_group_permissions_names(name).each do |perm|
|
79
77
|
|
80
|
-
if Lockdown::
|
81
|
-
Lockdown.logger.info ">> Permission #{perm} cannot be assigned to #{
|
78
|
+
if Lockdown::Configuration.permission_assigned_automatically?(perm)
|
79
|
+
Lockdown.logger.info ">> Permission #{perm} cannot be assigned to #{name}. Already belongs to built in user group (public or protected)."
|
82
80
|
raise InvalidPermissionAssignment, "Invalid permission assignment"
|
83
81
|
end
|
84
82
|
|
85
|
-
p = ::Permission.find(:first, :conditions => ["name = ?",
|
83
|
+
p = ::Permission.find(:first, :conditions => ["name = ?", perm])
|
86
84
|
|
87
85
|
ug_table = Lockdown.user_groups_hbtm_reference.to_s
|
88
86
|
if "permissions" < ug_table
|
@@ -94,29 +92,26 @@ module Lockdown
|
|
94
92
|
end
|
95
93
|
end
|
96
94
|
|
97
|
-
def remove_invalid_permissions(ug
|
95
|
+
def remove_invalid_permissions(ug)
|
98
96
|
ug.permissions.each do |perm|
|
99
|
-
|
100
|
-
|
101
|
-
unless Lockdown::System.permissions_for_user_group(key).include?(perm_sym)
|
102
|
-
Lockdown.logger.info ">> Lockdown: Permission: #{perm_string} no longer associated to User Group: #{ug.name}, deleting."
|
97
|
+
unless Lockdown::Configuration.user_group_permissions_names(ug.name).include?(perm.name)
|
98
|
+
Lockdown.logger.info ">> Lockdown: Permission: #{perm.name} no longer associated to User Group: #{ug.name}, deleting."
|
103
99
|
ug.permissions.delete(perm)
|
104
100
|
end
|
105
101
|
end
|
106
102
|
end
|
107
103
|
|
108
|
-
def add_valid_permissions(ug
|
109
|
-
Lockdown::
|
110
|
-
perm_string = Lockdown.get_string(perm)
|
104
|
+
def add_valid_permissions(ug)
|
105
|
+
Lockdown::Configuration.user_group_permissions_names(ug.name).each do |perm_name|
|
111
106
|
found = false
|
112
107
|
# see if permission exists
|
113
108
|
ug.permissions.each do |p|
|
114
|
-
found = true if
|
109
|
+
found = true if p.name == perm_name
|
115
110
|
end
|
116
111
|
# if not found, add it
|
117
112
|
unless found
|
118
|
-
Lockdown.logger.info ">> Lockdown: Permission: #{
|
119
|
-
p = ::Permission.find(:first, :conditions => ["name = ?",
|
113
|
+
Lockdown.logger.info ">> Lockdown: Permission: #{perm_name} not found for User Group: #{ug.name}, adding it."
|
114
|
+
p = ::Permission.find(:first, :conditions => ["name = ?", perm_name])
|
120
115
|
ug.permissions << p
|
121
116
|
end
|
122
117
|
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Lockdown
|
4
|
+
class Delivery
|
5
|
+
class << self
|
6
|
+
# @return [true|false] if the given path is allowed
|
7
|
+
def allowed?(path, access_rights = nil)
|
8
|
+
return true if path == '/'
|
9
|
+
|
10
|
+
begin
|
11
|
+
::Authorization.configure
|
12
|
+
rescue NameError
|
13
|
+
end
|
14
|
+
|
15
|
+
access_rights ||= Lockdown::Configuration.public_access
|
16
|
+
|
17
|
+
access_rights_regex = Lockdown.regex(access_rights)
|
18
|
+
|
19
|
+
path += "/" unless path =~ /\/$/
|
20
|
+
path = "/" + path unless path =~ /^\//
|
21
|
+
|
22
|
+
access_rights_regex =~ path ? true : false
|
23
|
+
end
|
24
|
+
end # class block
|
25
|
+
end # Delivery
|
26
|
+
end # Lockdown
|
data/lib/lockdown/errors.rb
CHANGED
@@ -1,11 +1,7 @@
|
|
1
|
-
|
2
|
-
class InvalidRuleAssignment < StandardError; end
|
3
|
-
|
4
|
-
class InvalidRuleContext < StandardError; end
|
1
|
+
# encoding: utf-8
|
5
2
|
|
6
|
-
|
3
|
+
module Lockdown
|
4
|
+
class PermissionNotFound < StandardError; end
|
7
5
|
|
8
6
|
class InvalidPermissionAssignment < StandardError; end
|
9
|
-
|
10
|
-
class GroupUndefinedError < StandardError; end
|
11
7
|
end
|