Skip to content

Commit c2be485

Browse files
Dp/use warden to manage sessions (#162)
* add logging to debug staging * test it out * make linter and tests happy * add logging * add logging * add logging * remove timeout * comment out tests * remove current state file archived intake * fixes tests * rename find_or_create_state_file_archived_intake * fix seeds and find and create method --------- Co-authored-by: Drew Proebstel <dproebstel@codeforamerica.org>
1 parent db8c623 commit c2be485

20 files changed

Lines changed: 381 additions & 325 deletions

app/controllers/base_controller.rb

Lines changed: 25 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,35 @@
11
class BaseController < ApplicationController
2-
def current_archived_intake
3-
return current_state_file_archived_intake if state_file_archived_intake_signed_in?
4-
# If a user does not have an associated email or phone, we still create an ArchivedIntake
5-
# so they can go through the flow. This prevents it from being obvious whether
6-
# an email or phone is linked to an existing intake.
7-
#
8-
# These intakes are created without an IP address, meaning the user will not
9-
# be able to pass the identification number controller.
10-
return nil if session[:year_selected].nil?
2+
def create_and_login_state_file_archived_intake(phone_number: nil, email_address: nil)
3+
if session[:year_selected].blank?
4+
return redirect_to(root_path)
5+
end
6+
117
tax_year = session[:year_selected].to_i
128

13-
if session[:phone_number].present?
14-
phone = session[:phone_number]
15-
existing = StateFileArchivedIntake.find_by(phone_number: phone, tax_year: tax_year)
16-
existing || StateFileArchivedIntake.create(phone_number: phone, contact_preference: "text", tax_year: tax_year)
17-
elsif session[:email_address].present?
18-
email = session[:email_address].downcase
19-
existing = StateFileArchivedIntake.find_by("LOWER(email_address) = ? AND tax_year = ?", email, tax_year)
20-
existing || StateFileArchivedIntake.create(email_address: email, contact_preference: "email", tax_year: tax_year)
9+
if phone_number.present?
10+
existing = StateFileArchivedIntake.find_by(phone_number: phone_number, tax_year: tax_year)
11+
intake = existing || StateFileArchivedIntake.create!(
12+
phone_number: phone_number,
13+
contact_preference: "text",
14+
tax_year: tax_year
15+
)
16+
elsif email_address.present?
17+
email_downcase = email_address.downcase
18+
existing = StateFileArchivedIntake.find_by(email_address: email_downcase, tax_year: tax_year)
19+
intake = existing || StateFileArchivedIntake.create!(
20+
email_address: email_downcase,
21+
contact_preference: "email",
22+
tax_year: tax_year
23+
)
24+
else
25+
return redirect_to(root_path)
2126
end
27+
28+
sign_in intake
2229
end
2330

2431
def is_intake_unavailable
25-
if current_archived_intake.nil? || current_archived_intake.access_locked? || current_archived_intake.permanently_locked_at.present?
32+
if current_state_file_archived_intake.nil? || current_state_file_archived_intake.access_locked? || current_state_file_archived_intake.permanently_locked_at.present?
2633
redirect_to knock_out_path
2734
end
2835
end

app/controllers/email_address_controller.rb

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,9 @@ def update
1010
session[:ssn_verified] = false
1111
session[:mailing_verified] = false
1212
session[:code_verified] = false
13-
session[:email_address] = @form.email_address
14-
session[:phone_number] = nil
1513

16-
intake = current_archived_intake
17-
sign_in intake
14+
create_and_login_state_file_archived_intake(email_address: @form.email_address)
15+
return if performed?
1816

1917
redirect_to edit_verification_code_path
2018
else

app/controllers/identification_number_controller.rb

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,24 +4,24 @@ class IdentificationNumberController < BaseController
44
before_action :is_intake_unavailable
55

66
def edit
7-
@form = IdentificationNumberForm.new(archived_intake: current_archived_intake)
7+
@form = IdentificationNumberForm.new(archived_intake: current_state_file_archived_intake)
88
render :edit
99
end
1010

1111
def update
12-
@form = IdentificationNumberForm.new(current_archived_intake, identification_number_form_params)
12+
@form = IdentificationNumberForm.new(current_state_file_archived_intake, identification_number_form_params)
1313

1414
if @form.valid?
15-
EventLogger.log("correct ssn challenge", current_archived_intake.id)
16-
current_archived_intake.reset_failed_attempts!
15+
EventLogger.log("correct ssn challenge", current_state_file_archived_intake.id)
16+
current_state_file_archived_intake.reset_failed_attempts!
1717
session[:ssn_verified] = true
18-
EventLogger.log("issued mailing address challenge", current_archived_intake.id)
18+
EventLogger.log("issued mailing address challenge", current_state_file_archived_intake.id)
1919
redirect_to edit_mailing_address_validation_path
2020
else
21-
EventLogger.log("incorrect ssn challenge", current_archived_intake.id)
22-
current_archived_intake.increment_failed_attempts
23-
if current_archived_intake.access_locked?
24-
EventLogger.log("client lockout begin", current_archived_intake.id)
21+
EventLogger.log("incorrect ssn challenge", current_state_file_archived_intake.id)
22+
current_state_file_archived_intake.increment_failed_attempts
23+
if current_state_file_archived_intake.access_locked?
24+
EventLogger.log("client lockout begin", current_state_file_archived_intake.id)
2525
redirect_to knock_out_path
2626
return
2727
end
@@ -35,7 +35,7 @@ def identification_number_form_params
3535

3636
def confirm_code_verification
3737
unless session[:code_verified]
38-
EventLogger.log("unauthorized ssn attempt", current_archived_intake&.id)
38+
EventLogger.log("unauthorized ssn attempt", current_state_file_archived_intake&.id)
3939
redirect_to root_path
4040
end
4141
end

app/controllers/mailing_address_validation_controller.rb

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,22 +4,22 @@ class MailingAddressValidationController < BaseController
44
before_action :confirm_code_and_ssn_verification
55

66
def edit
7-
@addresses = current_archived_intake.address_challenge_set
8-
@year = current_archived_intake.tax_year
9-
@form = MailingAddressValidationForm.new(addresses: @addresses, current_address: current_archived_intake.full_address)
7+
@addresses = current_state_file_archived_intake.address_challenge_set
8+
@year = current_state_file_archived_intake.tax_year
9+
@form = MailingAddressValidationForm.new(addresses: @addresses, current_address: current_state_file_archived_intake.full_address)
1010
end
1111

1212
def update
13-
@addresses = current_archived_intake.address_challenge_set
14-
@form = MailingAddressValidationForm.new(mailing_address_validation_form_params, addresses: @addresses, current_address: current_archived_intake.full_address)
13+
@addresses = current_state_file_archived_intake.address_challenge_set
14+
@form = MailingAddressValidationForm.new(mailing_address_validation_form_params, addresses: @addresses, current_address: current_state_file_archived_intake.full_address)
1515
if @form.valid?
16-
EventLogger.log("correct mailing address", current_archived_intake.id)
16+
EventLogger.log("correct mailing address", current_state_file_archived_intake.id)
1717
session[:mailing_verified] = true
1818

1919
redirect_to pdf_index_path
2020
elsif params["mailing_address_validation_form"].present?
21-
EventLogger.log("incorrect mailing address", current_archived_intake.id)
22-
current_archived_intake.update(permanently_locked_at: Time.now)
21+
EventLogger.log("incorrect mailing address", current_state_file_archived_intake.id)
22+
current_state_file_archived_intake.update(permanently_locked_at: Time.now)
2323
redirect_to knock_out_path
2424
else
2525
render :edit
@@ -30,7 +30,7 @@ def update
3030

3131
def confirm_code_and_ssn_verification
3232
unless session[:code_verified] && session[:ssn_verified]
33-
EventLogger.log("unauthorized mailing attempt", current_archived_intake&.id)
33+
EventLogger.log("unauthorized mailing attempt", current_state_file_archived_intake&.id)
3434
redirect_to root_path
3535
end
3636
end

app/controllers/pages_controller.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,6 @@ def home
33
end
44

55
def knock_out
6-
@intake = current_archived_intake
6+
@intake = current_state_file_archived_intake
77
end
88
end

app/controllers/pdf_controller.rb

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
class PdfController < BaseController
22
prepend_before_action :authenticate_state_file_archived_intake!
33
before_action :is_intake_unavailable
4-
before_action :require_contact_preference
54
before_action :require_verification_code_verified
65
before_action :require_ssn_verified
76
before_action :require_mailing_address_verified
@@ -13,14 +12,14 @@ class PdfController < BaseController
1312
end
1413

1514
def index
16-
EventLogger.log("issued pdf download link", current_archived_intake.id)
17-
@state = current_archived_intake.state_name
15+
EventLogger.log("issued pdf download link", current_state_file_archived_intake.id)
16+
@state = current_state_file_archived_intake.state_name
1817
@year = session[:year_selected]
1918
end
2019

2120
def log_and_redirect
22-
EventLogger.log("client pdf download click", current_archived_intake.id)
23-
pdf_url = current_archived_intake.submission_pdf.url(expires_in: pdf_expiration_time, disposition: "inline")
21+
EventLogger.log("client pdf download click", current_state_file_archived_intake.id)
22+
pdf_url = current_state_file_archived_intake.submission_pdf.url(expires_in: pdf_expiration_time, disposition: "inline")
2423
redirect_to pdf_url, allow_other_host: true
2524
end
2625

@@ -34,12 +33,6 @@ def pdf_expiration_time
3433
end
3534
end
3635

37-
def require_contact_preference
38-
return if session[:email_address].present? || session[:phone_number].present?
39-
40-
redirect_to knock_out_path
41-
end
42-
4336
def require_verification_code_verified
4437
return if session[:code_verified].present?
4538

app/controllers/phone_number_controller.rb

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,9 @@ def update
1010
session[:ssn_verified] = false
1111
session[:mailing_verified] = false
1212
session[:code_verified] = false
13-
session[:phone_number] = @form.phone_number
14-
session[:email_address] = nil
1513

16-
intake = current_archived_intake
17-
sign_in intake
14+
create_and_login_state_file_archived_intake(phone_number: @form.phone_number)
15+
return if performed?
1816

1917
redirect_to edit_verification_code_path
2018
else

app/controllers/verification_code_controller.rb

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -4,23 +4,23 @@ class VerificationCodeController < BaseController
44
before_action :setup_contact
55

66
def setup_contact
7-
@contact_type = current_archived_intake.contact_preference
8-
@contact_info = current_archived_intake.contact
7+
@contact_type = current_state_file_archived_intake.contact_preference
8+
@contact_info = current_state_file_archived_intake.contact
99
end
1010

1111
def edit
12-
@form = VerificationCodeForm.new(contact_info: @contact_info, contact_preference: current_archived_intake.contact_preference)
13-
case current_archived_intake.contact_preference
12+
@form = VerificationCodeForm.new(contact_info: @contact_info, contact_preference: current_state_file_archived_intake.contact_preference)
13+
case current_state_file_archived_intake.contact_preference
1414
when "text"
15-
@phone_number = current_archived_intake.phone_number
16-
EventLogger.log("issued text challenge", current_archived_intake.id)
15+
@phone_number = current_state_file_archived_intake.phone_number
16+
EventLogger.log("issued text challenge", current_state_file_archived_intake.id)
1717
TextMessageVerificationCodeJob.perform_later(
1818
phone_number: @phone_number,
1919
locale: I18n.locale
2020
)
2121
when "email"
22-
@email_address = current_archived_intake.email_address
23-
EventLogger.log("issued email challenge", current_archived_intake.id)
22+
@email_address = current_state_file_archived_intake.email_address
23+
EventLogger.log("issued email challenge", current_state_file_archived_intake.id)
2424
EmailVerificationCodeJob.perform_later(
2525
email_address: @email_address,
2626
locale: I18n.locale
@@ -31,28 +31,28 @@ def edit
3131
end
3232

3333
def update
34-
@form = VerificationCodeForm.new(verification_code_form_params, contact_info: current_archived_intake.contact, contact_preference: current_archived_intake.contact_preference)
34+
@form = VerificationCodeForm.new(verification_code_form_params, contact_info: current_state_file_archived_intake.contact, contact_preference: current_state_file_archived_intake.contact_preference)
3535
if @form.valid?
36-
case current_archived_intake.contact_preference
36+
case current_state_file_archived_intake.contact_preference
3737
when "text"
38-
EventLogger.log("correct text challenge", current_archived_intake.id)
38+
EventLogger.log("correct text challenge", current_state_file_archived_intake.id)
3939
when "email"
40-
EventLogger.log("correct email code", current_archived_intake.id)
40+
EventLogger.log("correct email code", current_state_file_archived_intake.id)
4141
end
42-
current_archived_intake.reset_failed_attempts!
42+
current_state_file_archived_intake.reset_failed_attempts!
4343
session[:code_verified] = true
44-
EventLogger.log("issued ssn challenge", current_archived_intake.id)
44+
EventLogger.log("issued ssn challenge", current_state_file_archived_intake.id)
4545
redirect_to edit_identification_number_path
4646
else
47-
case current_archived_intake.contact_preference
47+
case current_state_file_archived_intake.contact_preference
4848
when "text"
49-
EventLogger.log("incorrect text code", current_archived_intake.id)
49+
EventLogger.log("incorrect text code", current_state_file_archived_intake.id)
5050
when "email"
51-
EventLogger.log("incorrect email code", current_archived_intake.id)
51+
EventLogger.log("incorrect email code", current_state_file_archived_intake.id)
5252
end
53-
current_archived_intake.increment_failed_attempts
54-
if current_archived_intake.access_locked?
55-
EventLogger.log("client lockout begin", current_archived_intake.id)
53+
current_state_file_archived_intake.increment_failed_attempts
54+
if current_state_file_archived_intake.access_locked?
55+
EventLogger.log("client lockout begin", current_state_file_archived_intake.id)
5656
redirect_to knock_out_path
5757
return
5858
end

app/lib/custom_failure_app.rb

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# frozen_string_literal: true
2+
3+
class CustomFailureApp < Devise::FailureApp
4+
def redirect_url
5+
if locked_out?
6+
knock_out_path
7+
else
8+
super
9+
end
10+
end
11+
12+
private
13+
14+
def locked_out?
15+
warden_message == :locked
16+
end
17+
18+
def locked_out_path
19+
Rails.application.routes.url_helpers.knock_out_path(locale: i18n_locale)
20+
end
21+
end

config/initializers/devise.rb

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@
99
# Use this hook to configure devise mailer, warden hooks and so forth.
1010
# Many of these configuration options can be set straight in your model.
1111
Devise.setup do |config|
12+
config.warden do |manager|
13+
manager.failure_app = CustomFailureApp
14+
end
1215
# The secret key used by Devise. Devise uses this key to generate
1316
# random tokens. Changing this key will render invalid all existing
1417
# confirmation, reset password and unlock tokens in the database.

0 commit comments

Comments
 (0)