From 8fbf231ca6e6ab38e3c951b8913c10564edc745d Mon Sep 17 00:00:00 2001 From: Elaine Knight Date: Sat, 27 May 2023 19:53:39 -0700 Subject: [PATCH] Add an impersonate flow (#552) Add a Development-environment-only flow to impersonate any user, without requiring local OAuth, to make it easier to test users in various states. --- app/controllers/sessions_controller.rb | 17 +++++++++++++++++ app/helpers/sessions_helper.rb | 14 ++++++++++++++ app/views/sessions/impersonate.html.haml | 5 +++++ app/views/sessions/login.html.haml | 3 +++ config/routes.rb | 5 +++++ 5 files changed, 44 insertions(+) create mode 100644 app/helpers/sessions_helper.rb create mode 100644 app/views/sessions/impersonate.html.haml diff --git a/app/controllers/sessions_controller.rb b/app/controllers/sessions_controller.rb index f775a0a6..c0d34ca0 100644 --- a/app/controllers/sessions_controller.rb +++ b/app/controllers/sessions_controller.rb @@ -67,6 +67,23 @@ def confirm_email end end + # Development Only + + def impersonate + raise unless Rails.env.development? + + @all_users = User.all + end + + def impersonate_login + raise unless Rails.env.development? + + user = User.find(params[:user]) + + reset_session + set_session_and_redirect_returning_users(user) + end + private def set_session_and_redirect_returning_users(user) diff --git a/app/helpers/sessions_helper.rb b/app/helpers/sessions_helper.rb new file mode 100644 index 00000000..92c34519 --- /dev/null +++ b/app/helpers/sessions_helper.rb @@ -0,0 +1,14 @@ +module SessionsHelper + def users_grouped_by_role_for_select(users) + users_by_state = users.group_by do |user| + user.is_admin? ? "Admin" : user.state.humanize + end + + grouped_options = users_by_state.keys.sort.map do |state| + options = users_by_state[state].map { |user| [user.name, user.id] } + [state, options] + end + + return grouped_options_for_select(grouped_options) + end +end \ No newline at end of file diff --git a/app/views/sessions/impersonate.html.haml b/app/views/sessions/impersonate.html.haml new file mode 100644 index 00000000..cfed2298 --- /dev/null +++ b/app/views/sessions/impersonate.html.haml @@ -0,0 +1,5 @@ +%h2 (DEV) Impersonate User + += form_tag impersonate_login_path, class: "form", method: :post do |f| + = select_tag :user, users_grouped_by_role_for_select(@all_users) + = submit_tag "Impersonate", class: "btn btn-primary" diff --git a/app/views/sessions/login.html.haml b/app/views/sessions/login.html.haml index 272b4071..9e855d18 100644 --- a/app/views/sessions/login.html.haml +++ b/app/views/sessions/login.html.haml @@ -16,6 +16,9 @@ %p.ib= link_to 'Sign in with GitHub', github_login_path, class: 'btn btn-primary btn-lg mr-20' %p.ib= link_to 'Sign in with Google', google_login_path, class: 'btn btn-primary btn-lg' +- if Rails.env.development? + %p= link_to '(DEV) Impersonate User', impersonate_path, class: 'btn btn-default' + - if Configurable[:accepting_applications] %p To start an application, first authenticate with GitHub or Google. If you have any questions, email us at #{ mail_to JOIN_EMAIL }. diff --git a/config/routes.rb b/config/routes.rb index a6b4fb99..10f8433f 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -57,6 +57,11 @@ get "get_email" => "sessions#get_email" post "confirm_email" => "sessions#confirm_email" + if Rails.env.development? + get "impersonate" => "sessions#impersonate" + post "impersonate_login" => "sessions#impersonate_login" + end + post "add_github_auth" => "authentications#add_github_auth" post "add_google_auth" => "authentications#add_google_auth"