Skip to content

Commit 7f4b0f9

Browse files
committed
Add a very rough enforce_sudo_mode implementation
1 parent ebdf6c3 commit 7f4b0f9

File tree

3 files changed

+53
-0
lines changed

3 files changed

+53
-0
lines changed

app/controllers/users_controller.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ class UsersController < ApplicationController
2020
:complete_sms_auth_verification,
2121
:start_sms_auth_verification]
2222
before_action :set_shown_private_feature_previews, only: [:edit, :edit_featurepreviews, :edit_security, :edit_admin]
23+
before_action :enforce_sudo_mode, only: [:update]
2324

2425
wrap_parameters format: :url_encoded_form
2526

app/helpers/sessions_helper.rb

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,4 +152,35 @@ def sign_out_of_all_sessions(user = current_user)
152152
def sudo_mode?
153153
current_session&.sudo_mode?
154154
end
155+
156+
def enforce_sudo_mode
157+
return if sudo_mode?
158+
159+
if params[:_sudo]
160+
@login = Login.incomplete.active.find_by_hashid!(params[:_sudo][:login_id])
161+
162+
UserService::ExchangeLoginCodeForUser.new(
163+
user_id: current_user.id,
164+
login_code: params[:_sudo][:login_code],
165+
sms: false,
166+
).run
167+
168+
@login.update!(authenticated_with_email: true)
169+
@login.update!(user_session: current_session)
170+
171+
current_session.reload
172+
else
173+
@login = Login.create!(
174+
user: current_user,
175+
initial_login: current_session.initial_login
176+
)
177+
178+
LoginCodeService::Request.new(email: current_user.email, sms: false, ip_address: request.remote_ip, user_agent: request.user_agent).run
179+
180+
render(
181+
template: "sudo_mode/reauthenticate",
182+
status: :unprocessable_entity
183+
)
184+
end
185+
end
155186
end
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<h1>Confirm Access</h1>
2+
3+
<p>Signed in as <%= current_user.email %></p>
4+
5+
<%= form_tag(request.path, method: request.request_method_symbol) do %>
6+
<%
7+
Rack::Utils
8+
.parse_query(request.request_parameters.to_query)
9+
.except("authenticity_token", "_method")
10+
.each do |name, value|
11+
%>
12+
<%= hidden_field_tag(name, value) %>
13+
<% end %>
14+
15+
<%= hidden_field_tag("_sudo[login_id]", @login.hashid) %>
16+
17+
<%= label_tag("_sudo[login_code]", "Login code") %>
18+
<%= text_field_tag("_sudo[login_code]") %>
19+
20+
<%= submit_tag("Continue") %>
21+
<% end %>

0 commit comments

Comments
 (0)