lockdown 0.1.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/History.txt +4 -0
- data/License.txt +20 -0
- data/Manifest.txt +39 -0
- data/PostInstall.txt +3 -0
- data/README +0 -0
- data/README.txt +60 -0
- data/Rakefile +4 -0
- data/app_generators/lockdown/USAGE +5 -0
- data/app_generators/lockdown/lockdown_generator.rb +25 -0
- data/app_generators/lockdown/lockdown_generator.rb.orig +69 -0
- data/app_generators/lockdown/templates/access.rb +108 -0
- data/app_generators/lockdown/templates/session.rb +72 -0
- data/bin/lockdown +140 -0
- data/config/hoe.rb +73 -0
- data/config/requirements.rb +15 -0
- data/lib/lockdown/controller.rb +220 -0
- data/lib/lockdown/controller_inspector.rb +214 -0
- data/lib/lockdown/helper.rb +53 -0
- data/lib/lockdown/model.rb +40 -0
- data/lib/lockdown/version.rb +9 -0
- data/lib/lockdown/view.rb +82 -0
- data/lib/lockdown.rb +172 -0
- data/script/console +10 -0
- data/script/destroy +14 -0
- data/script/generate +14 -0
- data/script/txt2html +82 -0
- data/setup.rb +1585 -0
- data/tasks/deployment.rake +34 -0
- data/tasks/environment.rake +7 -0
- data/tasks/website.rake +17 -0
- data/test/test_generator_helper.rb +20 -0
- data/test/test_helper.rb +2 -0
- data/test/test_lockdown.rb +11 -0
- data/test/test_lockdown_generator.rb +43 -0
- data/website/index.html +302 -0
- data/website/index.txt +218 -0
- data/website/javascripts/rounded_corners_lite.inc.js +285 -0
- data/website/stylesheets/screen.css +138 -0
- data/website/template.html.erb +54 -0
- metadata +104 -0
@@ -0,0 +1,220 @@
|
|
1
|
+
module Lockdown
|
2
|
+
module Controller#:nodoc:
|
3
|
+
#
|
4
|
+
# Core Controller locking methods
|
5
|
+
#
|
6
|
+
module Core
|
7
|
+
def self.included(base)
|
8
|
+
base.send :include, Lockdown::Controller::Core::InstanceMethods
|
9
|
+
end
|
10
|
+
|
11
|
+
module InstanceMethods
|
12
|
+
def configure_lock_down
|
13
|
+
check_session_expiry
|
14
|
+
store_location
|
15
|
+
end
|
16
|
+
|
17
|
+
def set_current_user
|
18
|
+
login_from_basic_auth? unless logged_in?
|
19
|
+
if logged_in?
|
20
|
+
Thread.current[:profile_id] = current_profile_id
|
21
|
+
Thread.current[:client_id] = current_client_id if respond_to? :current_client_id
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def check_request_authorization
|
26
|
+
unless authorized?(path_from_hash(params))
|
27
|
+
raise SecurityError, "Authorization failed for params #{params.inspect}"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def redirect_back_or_default(default)
|
32
|
+
session[:prevpage] ? send_to(session[:prevpage]) : send_to(default)
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
def path_allowed?(url)
|
38
|
+
req = Lockdown.format_controller_action(url)
|
39
|
+
session[:access_rights] ||= Lockdown::UserGroups[:public_access]
|
40
|
+
session[:access_rights].each do |ar|
|
41
|
+
return true if req =~ /#{ar}$/
|
42
|
+
end
|
43
|
+
false
|
44
|
+
end
|
45
|
+
|
46
|
+
def check_session_expiry
|
47
|
+
if session[:expiry_time] && session[:expiry_time] < Time.now
|
48
|
+
nil_lockdown_values
|
49
|
+
end
|
50
|
+
session[:expiry_time] = Time.now + Lockdown::SESSION_TIMEOUT
|
51
|
+
end
|
52
|
+
|
53
|
+
def store_location
|
54
|
+
if request.method == :get && !(session[:thispage] == sent_from_uri)
|
55
|
+
session[:prevpage] = session[:thispage] || ''
|
56
|
+
session[:thispage] = sent_from_uri
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
# Called from current_user. Now, attempt to login by
|
61
|
+
# basic authentication information.
|
62
|
+
def login_from_basic_auth?
|
63
|
+
username, passwd = get_auth_data
|
64
|
+
if username && passwd
|
65
|
+
set_session_user User.authenticate(username, passwd)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
@@http_auth_headers = %w(X-HTTP_AUTHORIZATION HTTP_AUTHORIZATION Authorization)
|
70
|
+
# gets BASIC auth info
|
71
|
+
def get_auth_data
|
72
|
+
auth_key = @@http_auth_headers.detect { |h| request.env.has_key?(h) }
|
73
|
+
auth_data = request.env[auth_key].to_s.split unless auth_key.blank?
|
74
|
+
return auth_data && auth_data[0] == 'Basic' ? Base64.decode64(auth_data[1]).split(':')[0..1] : [nil, nil]
|
75
|
+
end
|
76
|
+
end # InstanceMethods
|
77
|
+
end # Core
|
78
|
+
|
79
|
+
#
|
80
|
+
# Merb Controller locking methods
|
81
|
+
#
|
82
|
+
module Merb
|
83
|
+
def self.included(base)
|
84
|
+
base.send :include, Lockdown::Controller::Merb::InstanceMethods
|
85
|
+
|
86
|
+
base.before :set_current_user
|
87
|
+
base.before :configure_lock_down
|
88
|
+
base.before :check_request_authorization
|
89
|
+
end
|
90
|
+
|
91
|
+
module InstanceMethods
|
92
|
+
def self.included(base)
|
93
|
+
base.class_eval do
|
94
|
+
alias :send_to :redirect
|
95
|
+
end
|
96
|
+
base.send :include, Lockdown::Controller::Core
|
97
|
+
end
|
98
|
+
|
99
|
+
def sent_from_uri
|
100
|
+
request.uri
|
101
|
+
end
|
102
|
+
|
103
|
+
def authorized?(path)
|
104
|
+
return true if current_user_is_admin?
|
105
|
+
|
106
|
+
# See if path is known
|
107
|
+
return true if path_allowed?(path)
|
108
|
+
|
109
|
+
return false
|
110
|
+
end
|
111
|
+
|
112
|
+
# Can log Error => e if desired, I don't desire to now.
|
113
|
+
# For now, just send home, but will probably make this configurable
|
114
|
+
def access_denied(e)
|
115
|
+
send_to "/"
|
116
|
+
end
|
117
|
+
|
118
|
+
def path_from_hash(hsh)
|
119
|
+
return hsh if hsh.is_a?(String)
|
120
|
+
hsh = hsh.to_hash if hsh.is_a?(Mash)
|
121
|
+
hsh['controller'].to_s + "/" + hsh['action'].to_s
|
122
|
+
end
|
123
|
+
|
124
|
+
end # InstanceMethods
|
125
|
+
end # Merb
|
126
|
+
|
127
|
+
#
|
128
|
+
# Rails Controller locking methods
|
129
|
+
#
|
130
|
+
module Rails
|
131
|
+
def self.included(base)
|
132
|
+
base.send :include, Lockdown::Controller::Rails::InstanceMethods
|
133
|
+
|
134
|
+
base.before_filter do |controller|
|
135
|
+
controller.set_current_user
|
136
|
+
controller.configure_lock_down
|
137
|
+
controller.check_request_authorization
|
138
|
+
end
|
139
|
+
|
140
|
+
base.send :helper_method, :authorized?
|
141
|
+
|
142
|
+
base.filter_parameter_logging :password, :password_confirmation
|
143
|
+
|
144
|
+
base.rescue_from SecurityError,
|
145
|
+
:with => proc{|e| access_denied(e)}
|
146
|
+
end
|
147
|
+
|
148
|
+
module InstanceMethods
|
149
|
+
def self.included(base)
|
150
|
+
base.class_eval do
|
151
|
+
alias :send_to :redirect_to
|
152
|
+
end
|
153
|
+
base.send :include, Lockdown::Controller::Core
|
154
|
+
end
|
155
|
+
|
156
|
+
def sent_from_uri
|
157
|
+
request.request_uri
|
158
|
+
end
|
159
|
+
|
160
|
+
def authorized?(options)
|
161
|
+
return true if current_user_is_admin?
|
162
|
+
|
163
|
+
url_parts = URI::split url_for(options)
|
164
|
+
|
165
|
+
path = url_parts[5]
|
166
|
+
|
167
|
+
# See if path is known
|
168
|
+
return true if path_allowed?(path)
|
169
|
+
|
170
|
+
if options.is_a?(String)
|
171
|
+
# Test for a named routed
|
172
|
+
begin
|
173
|
+
hsh = ActionController::Routing::Routes.recognize_path(options)
|
174
|
+
return true if path_allowed?(path_from_hash(hsh)) unless hsh.nil?
|
175
|
+
rescue Exception => e
|
176
|
+
# continue on
|
177
|
+
end
|
178
|
+
end
|
179
|
+
|
180
|
+
# Test to see if using a get method (show)
|
181
|
+
path += "/show" if path.split("/").last.to_i > 0
|
182
|
+
|
183
|
+
return true if path_allowed?(path)
|
184
|
+
|
185
|
+
return false
|
186
|
+
end
|
187
|
+
|
188
|
+
def access_denied(e)
|
189
|
+
reset_session
|
190
|
+
respond_to do |accepts|
|
191
|
+
accepts.html do
|
192
|
+
store_location
|
193
|
+
send_to login_path
|
194
|
+
end
|
195
|
+
accepts.xml do
|
196
|
+
headers["Status"] = "Unauthorized"
|
197
|
+
headers["WWW-Authenticate"] = %(Basic realm="Web Password")
|
198
|
+
render :text => e.message, :status => "401 Unauthorized"
|
199
|
+
end
|
200
|
+
end
|
201
|
+
false
|
202
|
+
end
|
203
|
+
|
204
|
+
def path_from_hash(hsh)
|
205
|
+
hsh[:controller].to_s + "/" + hsh[:action].to_s
|
206
|
+
end
|
207
|
+
|
208
|
+
end # InstanceMethods
|
209
|
+
end # Rails
|
210
|
+
|
211
|
+
|
212
|
+
end # Controller
|
213
|
+
end # Lockdown
|
214
|
+
|
215
|
+
if Lockdown.merb_app?
|
216
|
+
Merb::Controller.send :include, Lockdown::Controller::Merb
|
217
|
+
elsif Lockdown.rails_app?
|
218
|
+
ActionController::Base.send :include, Lockdown::Controller::Rails
|
219
|
+
end
|
220
|
+
|
@@ -0,0 +1,214 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), "helper") unless Lockdown.const_defined?("Helper")
|
2
|
+
|
3
|
+
module Lockdown
|
4
|
+
module ControllerInspector
|
5
|
+
def self.included(base)
|
6
|
+
if Lockdown.merb_app?
|
7
|
+
base.send :include, Lockdown::ControllerInspector::Merb
|
8
|
+
elsif Lockdown.rails_app?
|
9
|
+
base.send :include, Lockdown::ControllerInspector::Rails
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
module Core
|
14
|
+
include Lockdown::Helper
|
15
|
+
#
|
16
|
+
# *syms is a splat of controller symbols,
|
17
|
+
# e.g all_methods(:users, :authors, :books)
|
18
|
+
#
|
19
|
+
def all_methods(*syms)
|
20
|
+
syms.collect{ |sym| paths_for(sym) }.flatten
|
21
|
+
end
|
22
|
+
|
23
|
+
#
|
24
|
+
# controller name (sym) and a splat of methods to
|
25
|
+
# exclude from result
|
26
|
+
#
|
27
|
+
# All user methods except destroy:
|
28
|
+
# e.g all_except_methods(:users, :destroy)
|
29
|
+
#
|
30
|
+
def all_except_methods(sym, *methods)
|
31
|
+
paths_for(sym) - paths_for(sym, *methods)
|
32
|
+
end
|
33
|
+
|
34
|
+
#
|
35
|
+
# controller name (sym) and a splat of methods to
|
36
|
+
# to build the result
|
37
|
+
#
|
38
|
+
# Only user methods index (list), show (good for readonly access):
|
39
|
+
# e.g only_methods(:users, :index, :show)
|
40
|
+
#
|
41
|
+
def only_methods(sym, *methods)
|
42
|
+
paths_for(sym, *methods)
|
43
|
+
end
|
44
|
+
|
45
|
+
#
|
46
|
+
# all controllers, all actions
|
47
|
+
#
|
48
|
+
# This is admin access
|
49
|
+
#
|
50
|
+
def all_controllers
|
51
|
+
controllers = find_all_controller_classes
|
52
|
+
|
53
|
+
controllers.collect do |controller|
|
54
|
+
methods = available_actions(controller)
|
55
|
+
paths_for(controller_name(controller), methods)
|
56
|
+
end.flatten!
|
57
|
+
end
|
58
|
+
|
59
|
+
private
|
60
|
+
|
61
|
+
def paths_for(sym_str, *methods)
|
62
|
+
str = sym_str.to_s if sym_str.is_a?(Symbol)
|
63
|
+
if methods.empty?
|
64
|
+
klass = get_controller_class(str)
|
65
|
+
methods = available_actions(klass)
|
66
|
+
end
|
67
|
+
methods.collect{|meth| ctr_path(str) + "/" + meth.to_s }
|
68
|
+
end
|
69
|
+
|
70
|
+
def get_controller_class(str)
|
71
|
+
load_controller(str)
|
72
|
+
lockdown_const_get(str)
|
73
|
+
end
|
74
|
+
|
75
|
+
def find_all_controller_classes
|
76
|
+
load_all_controllers
|
77
|
+
return ObjectSpace.controller_classes
|
78
|
+
end
|
79
|
+
|
80
|
+
def ObjectSpace.controller_classes
|
81
|
+
subclasses = []
|
82
|
+
self.each_object(Class) do |klass|
|
83
|
+
subclasses << klass if klass.ancestors.include?(Lockdown.controller_parent)
|
84
|
+
end
|
85
|
+
subclasses
|
86
|
+
end
|
87
|
+
|
88
|
+
def load_controller(str)
|
89
|
+
unless lockdown_const_defined?("Application")
|
90
|
+
require(Lockdown.project_root + "/app/controllers/application.rb")
|
91
|
+
end
|
92
|
+
|
93
|
+
unless lockdown_const_defined?(kontroller_class_name(str))
|
94
|
+
require(Lockdown.project_root + "/app/controllers/#{kontroller_file_name(str)}")
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
def load_all_controllers
|
99
|
+
Dir["#{Lockdown.project_root}/app/controllers/**/*.rb"].sort.each do |c|
|
100
|
+
require(c) unless c == "application.rb"
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
def lockdown_const_defined?(str)
|
105
|
+
if str.include?("__")
|
106
|
+
# this is a namespaced controller. need to apply const_defined_to the namespace
|
107
|
+
parts = str.split("__")
|
108
|
+
eval("#{camelize(parts[0])}.const_defined?(\"#{kontroller_class_name(parts[1])}\")")
|
109
|
+
else
|
110
|
+
const_defined?(camelize(str))
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
def lockdown_const_get(str)
|
115
|
+
if str.include?("__")
|
116
|
+
# this is a namespaced controller. need to apply const_get the namespace
|
117
|
+
parts = str.split("__")
|
118
|
+
eval("#{camelize(parts[0])}.const_get(\"#{kontroller_class_name(parts[1])}\")")
|
119
|
+
else
|
120
|
+
const_get(kontroller_class_name(str))
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
def ctr_path(str)
|
125
|
+
str.gsub("__","\/")
|
126
|
+
end
|
127
|
+
|
128
|
+
#
|
129
|
+
# Convert the str parameter (originally the symbol) to the
|
130
|
+
# class name.
|
131
|
+
#
|
132
|
+
# For a controller defined as :users in access.rb, the str
|
133
|
+
# parameter here would be "users". The result of this method
|
134
|
+
# would be "/users"
|
135
|
+
#
|
136
|
+
# For a namespaced controller:
|
137
|
+
# In access.rb it would be defined as :admin__users.
|
138
|
+
# The str paramter would be "admin__users".
|
139
|
+
# The result would be "/admin/users".
|
140
|
+
#
|
141
|
+
def controller_file_name(str)
|
142
|
+
if str.include?("__")
|
143
|
+
str.split("__").join("/")
|
144
|
+
else
|
145
|
+
str
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
#
|
150
|
+
# Convert the str parameter (originally the symbol) to the
|
151
|
+
# class name.
|
152
|
+
#
|
153
|
+
# For a controller defined as :users in access.rb, the str
|
154
|
+
# parameter here would be "users". The result of this method
|
155
|
+
# would be "Users"
|
156
|
+
#
|
157
|
+
def controller_class_name(str)
|
158
|
+
if str.include?("__")
|
159
|
+
str.split("__").collect{|p| camelize(p)}.join("::")
|
160
|
+
else
|
161
|
+
camelize(str)
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
#
|
166
|
+
# The reverse of controller_class_name. Convert the controllers
|
167
|
+
# class name to the string version of the symbols used in acces.rb.
|
168
|
+
#
|
169
|
+
# For a controller defined as :users in access.rb, the klass
|
170
|
+
# parameter here would be Users (the class). The result of this method
|
171
|
+
# would be "users", the string version of :users.
|
172
|
+
#
|
173
|
+
# Luckily both Rails and Merb have the controller_name method. This
|
174
|
+
# is here in case that changes.
|
175
|
+
#
|
176
|
+
def controller_name(klass)
|
177
|
+
klass.controller_name
|
178
|
+
end
|
179
|
+
end #Core
|
180
|
+
|
181
|
+
module Rails #:nodoc:
|
182
|
+
include Lockdown::ControllerInspector::Core
|
183
|
+
|
184
|
+
def kontroller_class_name(str)
|
185
|
+
"#{controller_class_name(str)}Controller"
|
186
|
+
end
|
187
|
+
|
188
|
+
def kontroller_file_name(str)
|
189
|
+
"#{controller_file_name(str)}_controller.rb"
|
190
|
+
end
|
191
|
+
|
192
|
+
def available_actions(klass)
|
193
|
+
klass.public_instance_methods - klass.hidden_actions
|
194
|
+
end
|
195
|
+
end # Rails
|
196
|
+
|
197
|
+
module Merb #:nodoc:
|
198
|
+
include Lockdown::ControllerInspector::Core
|
199
|
+
|
200
|
+
def kontroller_class_name(str)
|
201
|
+
controller_class_name(str)
|
202
|
+
end
|
203
|
+
|
204
|
+
def kontroller_file_name(str)
|
205
|
+
controller_file_name(str) + ".rb"
|
206
|
+
end
|
207
|
+
|
208
|
+
def available_actions(klass)
|
209
|
+
klass.callable_actions.keys
|
210
|
+
end
|
211
|
+
|
212
|
+
end # Merb
|
213
|
+
end # ControllerInspector
|
214
|
+
end # Lockdown
|
@@ -0,0 +1,53 @@
|
|
1
|
+
module Lockdown
|
2
|
+
module Helper
|
3
|
+
def syms_from_names(ary)
|
4
|
+
rvalue = []
|
5
|
+
ary.each{|ar| rvalue << symbolize(ar.name)}
|
6
|
+
rvalue
|
7
|
+
end
|
8
|
+
|
9
|
+
#
|
10
|
+
# If str_sym is a Symbol (:users), give me back "Users"
|
11
|
+
# If str_sym is a String ("Users"), give me back :users
|
12
|
+
#
|
13
|
+
# Was :to_title_sym for String and :to_title_str for Symbol
|
14
|
+
#
|
15
|
+
def convert_reference_name(str_sym)
|
16
|
+
if str_sym.is_a?(Symbol)
|
17
|
+
titleize(str_sym)
|
18
|
+
else
|
19
|
+
underscore(str_sym).tr(' ','_').to_sym
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def symbolize(str)
|
24
|
+
str.downcase.gsub("admin ","admin__").gsub(" ","_").to_sym
|
25
|
+
end
|
26
|
+
|
27
|
+
def camelize(str)
|
28
|
+
str.to_s.gsub(/\/(.?)/) { "::" + $1.upcase }.gsub(/(^|_)(.)/) { $2.upcase }
|
29
|
+
end
|
30
|
+
|
31
|
+
|
32
|
+
def random_string(len = 10)
|
33
|
+
chars = ("a".."z").to_a + ("A".."Z").to_a + ("0".."9").to_a
|
34
|
+
Array.new(len){||chars[rand(chars.size)]}.join
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
def titleize(str)
|
39
|
+
humanize(underscore(str)).gsub(/\b([a-z])/) { $1.capitalize }
|
40
|
+
end
|
41
|
+
|
42
|
+
def humanize(str)
|
43
|
+
str.to_s.gsub(/_id$/, "").gsub(/_/, " ").capitalize
|
44
|
+
end
|
45
|
+
|
46
|
+
def underscore(str)
|
47
|
+
str.to_s.gsub(/::/, '/').
|
48
|
+
gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
|
49
|
+
gsub(/([a-z\d])([A-Z])/,'\1_\2').
|
50
|
+
tr("-", "_").downcase
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), "helper") unless Lockdown.const_defined?("Helper")
|
2
|
+
|
3
|
+
module Lockdown
|
4
|
+
module Model
|
5
|
+
def self.included(base)
|
6
|
+
base.send :include, Lockdown::Model::InstanceMethods
|
7
|
+
end
|
8
|
+
|
9
|
+
module InstanceMethods
|
10
|
+
def self.included(base)
|
11
|
+
base.class_eval do
|
12
|
+
alias :create_without_stamps :create
|
13
|
+
alias :update_without_stamps :update
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def current_profile_id
|
18
|
+
Thread.current[:profile_id]
|
19
|
+
end
|
20
|
+
|
21
|
+
|
22
|
+
def create_with_stamps
|
23
|
+
profile_id = current_profile_id || Profile::SYSTEM
|
24
|
+
self[:created_by] = profile_id if self.respond_to?(:created_by)
|
25
|
+
self[:updated_by] = profile_id if self.respond_to?(:updated_by)
|
26
|
+
create_without_stamps
|
27
|
+
end
|
28
|
+
alias :create :create_with_stamps
|
29
|
+
|
30
|
+
def update_with_stamps
|
31
|
+
profile_id = current_profile_id || Profile::SYSTEM
|
32
|
+
self[:updated_by] = profile_id if self.respond_to?(:updated_by)
|
33
|
+
update_without_stamps
|
34
|
+
end
|
35
|
+
alias :update :update_with_stamps
|
36
|
+
end # InstanceMethods
|
37
|
+
end # Model
|
38
|
+
end # Lockdown
|
39
|
+
|
40
|
+
Lockdown.orm_parent.send :include, Lockdown::Model
|
@@ -0,0 +1,82 @@
|
|
1
|
+
module Lockdown
|
2
|
+
module View
|
3
|
+
module Core
|
4
|
+
def links(*lis)
|
5
|
+
rvalue = []
|
6
|
+
lis.each{|link| rvalue << link if link.length > 0 }
|
7
|
+
rvalue.join(" | ")
|
8
|
+
end
|
9
|
+
end # Core
|
10
|
+
|
11
|
+
module Merb
|
12
|
+
include Lockdown::View::Core
|
13
|
+
def self.included(base)
|
14
|
+
base.send :alias_method, :merb_link_to, :link_to
|
15
|
+
end
|
16
|
+
|
17
|
+
def link_to(name, url = '', options = {})
|
18
|
+
if authorized? url
|
19
|
+
return merb_link_to(name, url, options)
|
20
|
+
end
|
21
|
+
return ""
|
22
|
+
end
|
23
|
+
|
24
|
+
def link_to_or_show(name, url = '', options = {})
|
25
|
+
lnk = link_to(name, options, html_options)
|
26
|
+
lnk.length == 0 ? name : lnk
|
27
|
+
end
|
28
|
+
end # Merb
|
29
|
+
|
30
|
+
module Rails
|
31
|
+
include Lockdown::View::Core
|
32
|
+
def self.included(base)
|
33
|
+
base.send :alias_method, :rails_link_to, :link_to
|
34
|
+
base.send :alias_method, :rails_button_to, :button_to
|
35
|
+
end
|
36
|
+
|
37
|
+
def ld_link_to(name, options = {}, html_options = nil)
|
38
|
+
url = lock_down_url(options, html_options)
|
39
|
+
if authorized? url
|
40
|
+
return rails_link_to(name,options,html_options)
|
41
|
+
end
|
42
|
+
return ""
|
43
|
+
end
|
44
|
+
|
45
|
+
def link_to_or_show(name, options = {}, html_options = nil)
|
46
|
+
lnk = link_to(name, options, html_options)
|
47
|
+
lnk.length == 0 ? name : lnk
|
48
|
+
end
|
49
|
+
|
50
|
+
|
51
|
+
def button_to(name, options = {}, html_options = nil)
|
52
|
+
url = lock_down_url(options, html_options)
|
53
|
+
if authorized? url
|
54
|
+
return rails_button_to(name,options,html_options)
|
55
|
+
end
|
56
|
+
return ""
|
57
|
+
end
|
58
|
+
|
59
|
+
|
60
|
+
private
|
61
|
+
def lock_down_url(options, html_options = {})
|
62
|
+
return options unless options.respond_to?(:new_record?)
|
63
|
+
p = polymorphic_path(options)
|
64
|
+
if html_options.is_a?(Hash) && html_options[:method] == :delete
|
65
|
+
p += "/destroy"
|
66
|
+
elsif p.split("/").last.to_i > 0
|
67
|
+
p += "/show"
|
68
|
+
end
|
69
|
+
return p
|
70
|
+
end
|
71
|
+
end # Rails
|
72
|
+
end # View
|
73
|
+
end # Lockdown
|
74
|
+
|
75
|
+
if Object.const_defined?("Merb") && Merb.const_defined?("AssetsMixin")
|
76
|
+
Merb::AssetsMixin.send :include, Lockdown::View::Merb
|
77
|
+
elsif Object.const_defined?("ActionView")
|
78
|
+
ActionView::Base.send :include, Lockdown::View::Rails
|
79
|
+
else
|
80
|
+
raise NotImplementedError, "Application helper unknown to Lockdown."
|
81
|
+
end
|
82
|
+
|