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
@@ -2,31 +2,19 @@ module Lockdown
|
|
2
2
|
module Frameworks
|
3
3
|
module Rails
|
4
4
|
module Controller
|
5
|
-
|
6
|
-
def available_actions(klass)
|
7
|
-
klass.action_methods
|
8
|
-
end
|
9
|
-
|
10
|
-
def controller_name(klass)
|
11
|
-
klass.controller_name
|
12
|
-
end
|
13
|
-
|
14
5
|
# Locking methods
|
15
6
|
module Lock
|
16
7
|
|
17
8
|
def configure_lockdown
|
18
|
-
Lockdown.maybe_parse_init
|
19
|
-
check_session_expiry
|
20
9
|
store_location
|
21
10
|
end
|
22
11
|
|
23
12
|
# Basic auth functionality needs to be reworked as
|
24
13
|
# Lockdown doesn't provide authentication functionality.
|
25
14
|
def set_current_user
|
26
|
-
#login_from_basic_auth? unless logged_in?
|
27
15
|
if logged_in?
|
28
|
-
|
29
|
-
|
16
|
+
whodat = send(Lockdown::Configuration.who_did_it)
|
17
|
+
Thread.current[:who_did_it] = whodat
|
30
18
|
end
|
31
19
|
end
|
32
20
|
|
@@ -39,19 +27,6 @@ module Lockdown
|
|
39
27
|
|
40
28
|
protected
|
41
29
|
|
42
|
-
def path_allowed?(url)
|
43
|
-
session[:access_rights] ||= Lockdown::System.public_access
|
44
|
-
session[:access_rights].include?(url)
|
45
|
-
end
|
46
|
-
|
47
|
-
def check_session_expiry
|
48
|
-
if session[:expiry_time] && session[:expiry_time] < Time.now
|
49
|
-
nil_lockdown_values
|
50
|
-
Lockdown::System.call(self, :session_timeout_method)
|
51
|
-
end
|
52
|
-
session[:expiry_time] = Time.now + Lockdown::System.fetch(:session_timeout)
|
53
|
-
end
|
54
|
-
|
55
30
|
def store_location
|
56
31
|
if (request.method == :get) && (session[:thispage] != sent_from_uri)
|
57
32
|
session[:prevpage] = session[:thispage] || ''
|
@@ -69,25 +44,30 @@ module Lockdown
|
|
69
44
|
|
70
45
|
return false unless url
|
71
46
|
|
72
|
-
return true if current_user_is_admin?
|
73
|
-
|
74
47
|
method ||= (params[:method] || request.method)
|
75
48
|
|
76
49
|
url_parts = URI::split(url.strip)
|
77
50
|
|
78
51
|
path = url_parts[5]
|
79
52
|
|
80
|
-
|
81
|
-
|
82
|
-
path = path[(subdir.length+1)..-1]
|
53
|
+
if Lockdown::Delivery.allowed?(path, session[:access_rights])
|
54
|
+
return true
|
83
55
|
end
|
84
56
|
|
85
|
-
return true if path_allowed?(path)
|
86
|
-
|
87
57
|
begin
|
88
|
-
|
89
|
-
|
90
|
-
|
58
|
+
if ::Rails.respond_to?(:application)
|
59
|
+
router = ::Rails.application.routes
|
60
|
+
else
|
61
|
+
router = ActionController::Routing::Routes
|
62
|
+
end
|
63
|
+
|
64
|
+
hash = router.recognize_path(path, :method => method)
|
65
|
+
|
66
|
+
if hash
|
67
|
+
return Lockdown::Delivery.allowed?(path_from_hash(hash),
|
68
|
+
session[:access_rights])
|
69
|
+
end
|
70
|
+
rescue ActionController::RoutingError
|
91
71
|
# continue on
|
92
72
|
end
|
93
73
|
|
@@ -95,7 +75,7 @@ module Lockdown
|
|
95
75
|
return true if url =~ /^mailto:/
|
96
76
|
|
97
77
|
# Public file
|
98
|
-
file = File.join(
|
78
|
+
file = File.join(::Rails.root, 'public', url)
|
99
79
|
return true if File.exists?(file)
|
100
80
|
|
101
81
|
# Passing in different domain
|
@@ -106,13 +86,13 @@ module Lockdown
|
|
106
86
|
|
107
87
|
Lockdown.logger.info "Access denied: #{e}"
|
108
88
|
|
109
|
-
if Lockdown::
|
89
|
+
if Lockdown::Configuration.logout_on_access_violation
|
110
90
|
reset_session
|
111
91
|
end
|
112
92
|
respond_to do |format|
|
113
93
|
format.html do
|
114
94
|
store_location
|
115
|
-
redirect_to Lockdown::
|
95
|
+
redirect_to Lockdown::Configuration.access_denied_path
|
116
96
|
return
|
117
97
|
end
|
118
98
|
format.xml do
|
@@ -125,8 +105,7 @@ module Lockdown
|
|
125
105
|
end
|
126
106
|
|
127
107
|
def path_from_hash(hash)
|
128
|
-
|
129
|
-
(subdir ? subdir + "/" : "") + hash[:controller].to_s + "/" + hash[:action].to_s
|
108
|
+
hash[:controller].to_s + "/" + hash[:action].to_s
|
130
109
|
end
|
131
110
|
|
132
111
|
def remote_url?(domain = nil)
|
@@ -141,23 +120,6 @@ module Lockdown
|
|
141
120
|
redirect_to(session[:prevpage])
|
142
121
|
end
|
143
122
|
end
|
144
|
-
|
145
|
-
# Called from current_user. Now, attempt to login by
|
146
|
-
# basic authentication information.
|
147
|
-
def login_from_basic_auth?
|
148
|
-
username, passwd = get_auth_data
|
149
|
-
if username && passwd
|
150
|
-
set_session_user ::User.authenticate(username, passwd)
|
151
|
-
end
|
152
|
-
end
|
153
|
-
|
154
|
-
@@http_auth_headers = %w(X-HTTP_AUTHORIZATION HTTP_AUTHORIZATION Authorization)
|
155
|
-
# gets BASIC auth info
|
156
|
-
def get_auth_data
|
157
|
-
auth_key = @@http_auth_headers.detect { |h| request.env.has_key?(h) }
|
158
|
-
auth_data = request.env[auth_key].to_s.split unless auth_key.blank?
|
159
|
-
return auth_data && auth_data[0] == 'Basic' ? Base64.decode64(auth_data[1]).split(':')[0..1] : [nil, nil]
|
160
|
-
end
|
161
123
|
end # Lock
|
162
124
|
end # Controller
|
163
125
|
end # Rails
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
1
3
|
require File.join(File.dirname(__FILE__), "rails", "controller")
|
2
4
|
require File.join(File.dirname(__FILE__), "rails", "view")
|
3
5
|
|
@@ -5,10 +7,6 @@ module Lockdown
|
|
5
7
|
module Frameworks
|
6
8
|
module Rails
|
7
9
|
class << self
|
8
|
-
def use_me?
|
9
|
-
Object.const_defined?("ActionController") && ActionController.const_defined?("Base")
|
10
|
-
end
|
11
|
-
|
12
10
|
def included(mod)
|
13
11
|
mod.extend Lockdown::Frameworks::Rails::Environment
|
14
12
|
mixin
|
@@ -21,8 +19,10 @@ module Lockdown
|
|
21
19
|
include Lockdown::Frameworks::Rails::View
|
22
20
|
end
|
23
21
|
|
24
|
-
Lockdown.
|
25
|
-
|
22
|
+
Lockdown::Configuration.class_eval do
|
23
|
+
def self.skip_sync?
|
24
|
+
skip_db_sync_in.include?(::Rails.env)
|
25
|
+
end
|
26
26
|
end
|
27
27
|
end
|
28
28
|
|
@@ -34,13 +34,12 @@ module Lockdown
|
|
34
34
|
|
35
35
|
klass.helper_method :authorized?
|
36
36
|
|
37
|
-
klass.hide_action(:set_current_user, :configure_lockdown, :check_request_authorization
|
37
|
+
klass.hide_action(:set_current_user, :configure_lockdown, :check_request_authorization)
|
38
38
|
|
39
39
|
klass.before_filter do |c|
|
40
40
|
c.set_current_user
|
41
41
|
c.configure_lockdown
|
42
42
|
c.check_request_authorization
|
43
|
-
c.check_model_authorization
|
44
43
|
end
|
45
44
|
|
46
45
|
klass.filter_parameter_logging :password, :password_confirmation
|
@@ -55,10 +54,6 @@ module Lockdown
|
|
55
54
|
::RAILS_ROOT
|
56
55
|
end
|
57
56
|
|
58
|
-
def init_file
|
59
|
-
"#{project_root}/lib/lockdown/init.rb"
|
60
|
-
end
|
61
|
-
|
62
57
|
def view_helper
|
63
58
|
::ActionView::Base
|
64
59
|
end
|
@@ -76,38 +71,7 @@ module Lockdown
|
|
76
71
|
def caching?
|
77
72
|
::Rails.configuration.cache_classes
|
78
73
|
end
|
79
|
-
|
80
|
-
# cache_classes is true in production and testing, need to
|
81
|
-
# do an instance eval instead
|
82
|
-
def add_controller_method(code)
|
83
|
-
Lockdown.controller_parent.class_eval code, __FILE__,__LINE__ +1
|
84
|
-
end
|
85
|
-
|
86
|
-
def controller_class_name(str)
|
87
|
-
str = "#{str}Controller"
|
88
|
-
if str.include?("__")
|
89
|
-
str.split("__").collect{|p| Lockdown.camelize(p)}.join("::")
|
90
|
-
else
|
91
|
-
Lockdown.camelize(str)
|
92
|
-
end
|
93
|
-
end
|
94
|
-
|
95
|
-
def fetch_controller_class(str)
|
96
|
-
eval("::#{controller_class_name(str)}")
|
97
|
-
end
|
98
74
|
end
|
99
|
-
|
100
|
-
module System
|
101
|
-
include Lockdown::Frameworks::Rails::Controller
|
102
|
-
|
103
|
-
def skip_sync?
|
104
|
-
Lockdown.system.fetch(:skip_db_sync_in).include?(framework_environment)
|
105
|
-
end
|
106
|
-
|
107
|
-
def framework_environment
|
108
|
-
::Rails.env
|
109
|
-
end
|
110
|
-
end # System
|
111
75
|
end # Rails
|
112
76
|
end # Frameworks
|
113
77
|
end # Lockdown
|
data/lib/lockdown/helper.rb
CHANGED
@@ -1,111 +1,40 @@
|
|
1
|
-
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'active_support/core_ext'
|
2
4
|
|
3
5
|
module Lockdown
|
4
6
|
module Helper
|
5
|
-
|
6
|
-
|
7
|
+
# @return [Regexp] with \A \z boundaries
|
8
|
+
def regex(string)
|
9
|
+
Regexp.new(/\A#{string}\z/)
|
7
10
|
end
|
8
11
|
|
9
|
-
|
10
|
-
|
11
|
-
def convert_reference_name(str_sym)
|
12
|
-
if str_sym.is_a?(Symbol)
|
13
|
-
titleize(str_sym)
|
14
|
-
else
|
15
|
-
str_sym.underscore.tr(' ','_').to_sym
|
16
|
-
end
|
12
|
+
def administrator_group_name
|
13
|
+
'Administrators'
|
17
14
|
end
|
18
15
|
|
19
16
|
def user_group_class
|
20
|
-
eval(
|
17
|
+
eval("::#{Lockdown::Configuration.user_group_model}")
|
21
18
|
end
|
22
19
|
|
23
20
|
def user_groups_hbtm_reference
|
24
|
-
|
21
|
+
Lockdown::Configuration.user_group_model.underscore.pluralize.to_sym
|
25
22
|
end
|
26
23
|
|
27
24
|
def user_group_id_reference
|
28
|
-
|
25
|
+
Lockdown::Configuration.user_group_model.underscore + "_id"
|
29
26
|
end
|
30
27
|
|
31
28
|
def user_class
|
32
|
-
eval(
|
29
|
+
eval("::#{Lockdown::Configuration.user_model}")
|
33
30
|
end
|
34
31
|
|
35
32
|
def users_hbtm_reference
|
36
|
-
|
33
|
+
Lockdown::Configuration.user_model.underscore.pluralize.to_sym
|
37
34
|
end
|
38
35
|
|
39
36
|
def user_id_reference
|
40
|
-
|
41
|
-
end
|
42
|
-
|
43
|
-
def user_group_model_string
|
44
|
-
Lockdown.system.fetch(:user_group_model) || "UserGroup"
|
45
|
-
end
|
46
|
-
|
47
|
-
def user_model_string
|
48
|
-
Lockdown.system.fetch(:user_model) || "User"
|
49
|
-
end
|
50
|
-
|
51
|
-
def get_string(value)
|
52
|
-
if value.respond_to?(:name)
|
53
|
-
string_name(value.name)
|
54
|
-
else
|
55
|
-
string_name(value)
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
def get_symbol(value)
|
60
|
-
if value.respond_to?(:name)
|
61
|
-
symbol_name(value.name)
|
62
|
-
elsif value.is_a?(String)
|
63
|
-
symbol_name(value)
|
64
|
-
else
|
65
|
-
value
|
66
|
-
end
|
67
|
-
end
|
68
|
-
|
69
|
-
def camelize(str)
|
70
|
-
str.to_s.gsub(/\/(.?)/) { "::" + $1.upcase }.gsub(/(^|_)(.)/) { $2.upcase }
|
71
|
-
end
|
72
|
-
|
73
|
-
def random_string(len = 10)
|
74
|
-
chars = ("a".."z").to_a + ("A".."Z").to_a + ("0".."9").to_a
|
75
|
-
Array.new(len){||chars[rand(chars.size)]}.join
|
76
|
-
end
|
77
|
-
|
78
|
-
def administrator_group_string
|
79
|
-
string_name(administrator_group_symbol)
|
80
|
-
end
|
81
|
-
|
82
|
-
def administrator_group_symbol
|
83
|
-
:administrators
|
84
|
-
end
|
85
|
-
|
86
|
-
private
|
87
|
-
|
88
|
-
def string_name(str_sym)
|
89
|
-
str_sym.is_a?(Symbol) ? convert_reference_name(str_sym) : str_sym
|
90
|
-
end
|
91
|
-
|
92
|
-
def symbol_name(str_sym)
|
93
|
-
str_sym.is_a?(String) ? convert_reference_name(str_sym) : str_sym
|
94
|
-
end
|
95
|
-
|
96
|
-
def titleize(str)
|
97
|
-
humanize(underscore(str)).gsub(/\b([a-z])/) { $1.capitalize }
|
98
|
-
end
|
99
|
-
|
100
|
-
def humanize(str)
|
101
|
-
str.to_s.gsub(/_id$/, "").gsub(/_/, " ").capitalize
|
102
|
-
end
|
103
|
-
|
104
|
-
def underscore(str)
|
105
|
-
str.to_s.gsub(/::/, '/').
|
106
|
-
gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
|
107
|
-
gsub(/([a-z\d])([A-Z])/,'\1_\2').
|
108
|
-
tr("-", "_").downcase
|
37
|
+
Lockdown::Configuration.user_model.underscore + "_id"
|
109
38
|
end
|
110
39
|
end
|
111
40
|
end
|
@@ -1,11 +1,9 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
1
3
|
module Lockdown
|
2
4
|
module Orms
|
3
5
|
module ActiveRecord
|
4
6
|
class << self
|
5
|
-
def use_me?
|
6
|
-
Object.const_defined?("ActiveRecord") && ::ActiveRecord.const_defined?("Base")
|
7
|
-
end
|
8
|
-
|
9
7
|
def included(mod)
|
10
8
|
mod.extend Lockdown::Orms::ActiveRecord::Helper
|
11
9
|
mixin
|
@@ -51,15 +49,15 @@ module Lockdown
|
|
51
49
|
end
|
52
50
|
|
53
51
|
def create_with_stamps
|
54
|
-
pid = current_who_did_it || Lockdown::
|
55
|
-
self[:created_by] = pid if
|
56
|
-
self[:updated_by] = pid if
|
52
|
+
pid = current_who_did_it || Lockdown::Configuration.default_who_did_it
|
53
|
+
self[:created_by] = pid if respond_to?(:created_by)
|
54
|
+
self[:updated_by] = pid if respond_to?(:updated_by)
|
57
55
|
create_without_stamps
|
58
56
|
end
|
59
57
|
|
60
58
|
def update_with_stamps
|
61
|
-
pid = current_who_did_it || Lockdown::
|
62
|
-
self[:updated_by] = pid if
|
59
|
+
pid = current_who_did_it || Lockdown::Configuration.default_who_did_it
|
60
|
+
self[:updated_by] = pid if respond_to?(:updated_by)
|
63
61
|
update_without_stamps
|
64
62
|
end
|
65
63
|
end
|
data/lib/lockdown/permission.rb
CHANGED
@@ -1,222 +1,56 @@
|
|
1
|
-
|
2
|
-
class Controller
|
3
|
-
attr_accessor :name, :access_methods, :only_methods, :except_methods
|
4
|
-
|
5
|
-
def initialize(name)
|
6
|
-
@name = name
|
7
|
-
@except_methods = []
|
8
|
-
end
|
9
|
-
|
10
|
-
def set_access_methods
|
11
|
-
if @only_methods
|
12
|
-
@access_methods = paths_for(@name, *@only_methods)
|
13
|
-
else
|
14
|
-
@access_methods = paths_for(@name)
|
15
|
-
end
|
16
|
-
|
17
|
-
apply_exceptions if @except_methods.length > 0
|
18
|
-
end
|
19
|
-
|
20
|
-
private
|
21
|
-
|
22
|
-
def apply_exceptions
|
23
|
-
exceptions = paths_for(@name, *@except_methods)
|
24
|
-
@access_methods = @access_methods - exceptions
|
25
|
-
end
|
26
|
-
|
27
|
-
def paths_for(str_sym, *methods)
|
28
|
-
Lockdown::System.paths_for(str_sym, *methods)
|
29
|
-
end
|
30
|
-
end
|
1
|
+
# encoding: utf-8
|
31
2
|
|
32
|
-
|
33
|
-
attr_accessor :name, :controller_method, :model_method, :association, :param
|
34
|
-
|
35
|
-
def initialize(name, param = :id)
|
36
|
-
@name = name
|
37
|
-
@param = param
|
38
|
-
end
|
39
|
-
|
40
|
-
def class_name
|
41
|
-
self.name.to_s.camelize
|
42
|
-
end
|
43
|
-
|
44
|
-
end
|
45
|
-
|
3
|
+
module Lockdown
|
46
4
|
class Permission
|
47
|
-
|
48
|
-
|
49
|
-
#
|
50
|
-
|
51
|
-
#
|
52
|
-
# ==== Summary of controller oriented methods:
|
53
|
-
#
|
54
|
-
# # defines which controller we're talking about
|
55
|
-
# .with_controller(:controller_name) #all_methods is the default
|
56
|
-
#
|
57
|
-
# # only these methods on the controller
|
58
|
-
# .only_methods(:meth1, :meth2)
|
59
|
-
#
|
60
|
-
# # all controller methods except these
|
61
|
-
# .except_methods(:meth1, :meth2)
|
62
|
-
#
|
63
|
-
# ==== Summary of model oriented methods:
|
64
|
-
#
|
65
|
-
# # defines which model we're talking about
|
66
|
-
# .to_model(:model)
|
67
|
-
#
|
68
|
-
# # model_method is simply a public method on :model
|
69
|
-
# .where(:model_method)
|
70
|
-
#
|
71
|
-
# # controller_method must equal model_method
|
72
|
-
# .equals(:controller_method)
|
73
|
-
#
|
74
|
-
# # controller_method.include?(model_method)
|
75
|
-
# .is_in(:controller_method)
|
76
|
-
#
|
77
|
-
#
|
78
|
-
# ==== Example:
|
79
|
-
#
|
80
|
-
# # Define a permission called 'Manage Users' that allows users access
|
81
|
-
# # all methods on the users_controller
|
82
|
-
#
|
83
|
-
# set_permission(:manage_users).
|
84
|
-
# with_controller(:users)
|
85
|
-
#
|
86
|
-
# # Define a permission called "My Account" that only allows a user access
|
87
|
-
# # to methods show and update and the current_user_id must match the id
|
88
|
-
# # of the user being modified
|
89
|
-
#
|
90
|
-
# set_permission(:my_account).
|
91
|
-
# with_controller(:users).
|
92
|
-
# only_methods(:show, :update).
|
93
|
-
# to_model(:user).
|
94
|
-
# where(:current_user_id).
|
95
|
-
# equals(:id)
|
96
|
-
#
|
97
|
-
def initialize(name_symbol)
|
98
|
-
@name = name_symbol
|
99
|
-
@controllers = {}
|
100
|
-
@models = {}
|
101
|
-
@current_context = Lockdown::RootContext.new(name_symbol)
|
102
|
-
@public_access = false
|
103
|
-
@protected_access = false
|
104
|
-
end
|
105
|
-
|
106
|
-
def with_controller(name_symbol)
|
107
|
-
validate_context
|
108
|
-
|
109
|
-
controller = Controller.new(name_symbol)
|
110
|
-
@controllers[name_symbol] = controller
|
111
|
-
@current_context = Lockdown::ControllerContext.new(name_symbol)
|
112
|
-
self
|
113
|
-
end
|
114
|
-
|
115
|
-
alias_method :and_controller, :with_controller
|
116
|
-
|
117
|
-
def only_methods(*methods)
|
118
|
-
validate_context
|
5
|
+
# Name of permission
|
6
|
+
attr_accessor :name
|
7
|
+
# Array of resource objects that define the access rights for this permission
|
8
|
+
attr_reader :resources
|
119
9
|
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
validate_context
|
127
|
-
|
128
|
-
current_controller.except_methods = methods
|
129
|
-
|
130
|
-
@current_context = Lockdown::RootContext.new(@name)
|
131
|
-
self
|
132
|
-
end
|
133
|
-
|
134
|
-
def to_model(name_symbol, param = :id)
|
135
|
-
validate_context
|
136
|
-
|
137
|
-
@models[name_symbol] = Model.new(name_symbol, param)
|
138
|
-
@current_context = Lockdown::ModelContext.new(name_symbol)
|
139
|
-
self
|
140
|
-
end
|
141
|
-
|
142
|
-
def where(model_method)
|
143
|
-
validate_context
|
144
|
-
|
145
|
-
current_model.model_method = model_method
|
146
|
-
@current_context = Lockdown::ModelWhereContext.new(current_context.name)
|
147
|
-
self
|
148
|
-
end
|
149
|
-
|
150
|
-
def equals(controller_method)
|
151
|
-
validate_context
|
152
|
-
|
153
|
-
associate_controller_method(controller_method, :==)
|
154
|
-
@current_context = Lockdown::RootContext.new(@name)
|
155
|
-
self
|
156
|
-
end
|
157
|
-
|
158
|
-
def is_in(controller_method)
|
159
|
-
validate_context
|
160
|
-
|
161
|
-
associate_controller_method(controller_method, :include?)
|
162
|
-
@current_context = Lockdown::RootContext.new(@name)
|
163
|
-
self
|
164
|
-
end
|
165
|
-
|
166
|
-
alias_method :includes, :is_in
|
167
|
-
|
168
|
-
def public_access?
|
169
|
-
@public_access
|
170
|
-
end
|
171
|
-
|
172
|
-
def protected_access?
|
173
|
-
@protected_access
|
10
|
+
# @param [String,Symbol] name permission reference.
|
11
|
+
def initialize(name)
|
12
|
+
@name = name.to_s
|
13
|
+
@resources = []
|
14
|
+
@ispublic = false
|
15
|
+
@isprotected = false
|
174
16
|
end
|
175
17
|
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
18
|
+
# @param [String,Symbol] name resource reference.
|
19
|
+
# @return new resource
|
20
|
+
def resource(name, &block)
|
21
|
+
resource = Lockdown::Resource.new(name)
|
22
|
+
resource.instance_eval(&block) if block_given?
|
23
|
+
@resources << resource
|
24
|
+
resource
|
181
25
|
end
|
182
26
|
|
183
|
-
|
184
|
-
if public_access?
|
185
|
-
raise Lockdown::PermissionScopeCollision, "Permission: #{name} already marked as public and trying to set as protected."
|
186
|
-
end
|
187
|
-
@protected_access = true
|
188
|
-
end
|
27
|
+
alias_method :controller, :resource
|
189
28
|
|
190
|
-
def
|
191
|
-
@
|
29
|
+
def controllers
|
30
|
+
@resources
|
192
31
|
end
|
193
32
|
|
194
|
-
def
|
195
|
-
@
|
33
|
+
def is_public
|
34
|
+
@ispublic = true
|
35
|
+
@isprotected = false
|
196
36
|
end
|
197
37
|
|
198
|
-
def
|
199
|
-
@
|
38
|
+
def public?
|
39
|
+
@ispublic
|
200
40
|
end
|
201
41
|
|
202
|
-
def
|
203
|
-
|
42
|
+
def is_protected
|
43
|
+
@isprotected = true
|
44
|
+
@ispublic = false
|
204
45
|
end
|
205
46
|
|
206
|
-
|
207
|
-
|
208
|
-
def associate_controller_method(controller_method, association)
|
209
|
-
current_model.controller_method = controller_method
|
210
|
-
current_model.association = association
|
211
|
-
@current_context = Lockdown::RootContext.new(@name)
|
47
|
+
def protected?
|
48
|
+
@isprotected
|
212
49
|
end
|
213
50
|
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
unless current_context.allows?(calling_method)
|
218
|
-
raise Lockdown::InvalidRuleContext, "Method: #{calling_method} was called on wrong context #{current_context}. Allowed methods are: #{current_context.allowed_methods.join(',')}."
|
219
|
-
end
|
51
|
+
# @return String representing all resources defining this permission
|
52
|
+
def regex_pattern
|
53
|
+
resources.collect{|r| "(#{r.regex_pattern})"}.join("|")
|
220
54
|
end
|
221
|
-
end
|
222
|
-
end
|
55
|
+
end # Permission
|
56
|
+
end # Lockdown
|