summaryrefslogtreecommitdiff
path: root/app/controllers/concerns/impersonation.rb
diff options
context:
space:
mode:
Diffstat (limited to 'app/controllers/concerns/impersonation.rb')
-rw-r--r--app/controllers/concerns/impersonation.rb43
1 files changed, 43 insertions, 0 deletions
diff --git a/app/controllers/concerns/impersonation.rb b/app/controllers/concerns/impersonation.rb
new file mode 100644
index 00000000000..a4f2c263eb4
--- /dev/null
+++ b/app/controllers/concerns/impersonation.rb
@@ -0,0 +1,43 @@
+# frozen_string_literal: true
+
+module Impersonation
+ include Gitlab::Utils::StrongMemoize
+
+ def current_user
+ user = super
+
+ user.impersonator = impersonator if impersonator
+
+ user
+ end
+
+ protected
+
+ def check_impersonation_availability
+ return unless session[:impersonator_id]
+
+ unless Gitlab.config.gitlab.impersonation_enabled
+ stop_impersonation
+ access_denied! _('Impersonation has been disabled')
+ end
+ end
+
+ def stop_impersonation
+ log_impersonation_event
+
+ warden.set_user(impersonator, scope: :user)
+ session[:impersonator_id] = nil
+
+ current_user
+ end
+
+ def log_impersonation_event
+ Gitlab::AppLogger.info("User #{impersonator.username} has stopped impersonating #{current_user.username}")
+ end
+
+ def impersonator
+ strong_memoize(:impersonator) do
+ User.find(session[:impersonator_id]) if session[:impersonator_id]
+ end
+ end
+end