4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
|
# File 'lib/devise_masquerade/controllers/helpers.rb', line 4
def self.define_helpers(mapping)
name = mapping.name
class_name = mapping.class_name
class_eval <<-METHODS, __FILE__, __LINE__ + 1
def masquerade!
return if params["#{Devise.masquerade_param}"].blank?
klass = unless params[:masqueraded_resource_class].blank?
params[:masqueraded_resource_class].constantize
else
if Devise.masqueraded_resource_class_name.present?
Devise.masqueraded_resource_class_name.constantize
elsif Devise.masqueraded_resource_class
Devise.masqueraded_resource_class
elsif defined?(User)
User
end
end
return unless klass
resource = GlobalID::Locator.locate_signed params[Devise.masquerade_param], for: 'masquerade'
if resource
masquerade_sign_in(resource)
end
end
def masquerade_#{name}!
return if params["#{Devise.masquerade_param}"].blank?
resource = GlobalID::Locator.locate_signed params[Devise.masquerade_param], for: 'masquerade'
if resource
masquerade_sign_in(resource)
end
end
def #{name}_masquerade?
return false if current_#{name}.blank?
return false if session[#{name}_helper_session_key].blank?
if Devise.masquerade_storage_method_session?
session[#{name}_helper_session_key].present?
else
::Rails.cache.exist?(#{name}_helper_session_key).present?
end
end
def #{name}_masquerade_owner
return unless send(:#{name}_masquerade?)
if Devise.masquerade_storage_method_session?
resource_id = session[#{name}_helper_session_key]
masqueraded_resource_class.find(resource_id)
else
sgid = ::Rails.cache.read(#{name}_helper_session_key)
GlobalID::Locator.locate_signed(sgid, for: 'masquerade')
end
end
private
def #{name}_helper_session_key
["devise_masquerade_#{name}", current_#{name}.id, #{name}_helper_masquerading_resource_guid].join("_")
end
def #{name}_helper_masquerading_resource_guid
session["devise_masquerade_masquerading_resource_guid"].to_s
end
def masquerade_sign_in(resource)
if Devise.masquerade_bypass_warden_callback
if respond_to?(:bypass_sign_in)
bypass_sign_in(resource)
else
sign_in(resource, bypass: true)
end
else
sign_in(resource)
end
end
def masqueraded_resource_class
@masqueraded_resource_class ||= begin
unless params[:masqueraded_resource_class].blank?
params[:masqueraded_resource_class].constantize
else
unless session[session_key_masqueraded_resource_class].blank?
session[session_key_masqueraded_resource_class].constantize
else
if Devise.masqueraded_resource_class_name.present?
Devise.masqueraded_resource_class_name.constantize
else
Devise.masqueraded_resource_class || resource_class
end
end
end
end
end
def session_key_masqueraded_resource_class
"devise_masquerade_masqueraded_resource_class"
end
def session_key_masquerading_resource_class
"devise_masquerade_masquerading_resource_class"
end
def session_key_masquerading_resource_guid
"devise_masquerade_masquerading_resource_guid"
end
METHODS
ActiveSupport.on_load(:action_controller) do
if respond_to?(:helper_method)
helper_method "#{name}_masquerade?"
helper_method "#{name}_masquerade_owner"
helper_method :masqueraded_resource_class
helper_method :session_key_masqueraded_resource_class
helper_method :session_key_masquerading_resource_class
helper_method :session_key_masquerading_resource_guid
end
end
end
|