Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions app/controllers/sign_out_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ class SignOutController < ApplicationController
include FullyAuthenticatable

def destroy
analytics.track_event(Analytics::LOGOUT_INITIATED, method: 'cancel link')
url_after_cancellation = decorated_session.cancel_link_url
sign_out
flash[:success] = t('devise.sessions.signed_out')
Expand Down
2 changes: 1 addition & 1 deletion app/controllers/sign_up/completions_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ def update
private

def show_completions_page?
service_providers = session[:sp].present? || @view_model.user_has_identities?
service_providers = sp_session[:issuer].present? || @view_model.user_has_identities?
user_fully_authenticated? && service_providers
end

Expand Down
4 changes: 4 additions & 0 deletions app/forms/password_form.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ def initialize(user)

def submit(params)
submitted_password = params[:password]
@request_id = params[:request_id]

self.password = submitted_password

Expand All @@ -16,9 +17,12 @@ def submit(params)

private

attr_reader :request_id

def extra_analytics_attributes
{
user_id: user.uuid,
request_id_present: request_id.present?,
}
end
end
30 changes: 23 additions & 7 deletions app/services/store_sp_metadata_in_session.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,23 +5,39 @@ def initialize(session:, request_id:)
end

def call
session[:sp] = {
issuer: sp_request.issuer,
loa3: loa3_requested?,
request_url: sp_request.url,
request_id: sp_request.uuid,
requested_attributes: sp_request.requested_attributes,
}
Rails.logger.info(event_attributes)

return if sp_request.is_a?(NullServiceProviderRequest)

update_session
end

private

attr_reader :session, :request_id

def event_attributes
{
event: 'StoreSpMetadataInSession',
request_id_present: request_id.present?,
sp_request_class: sp_request.class.to_s,
}.to_json
end

def sp_request
@sp_request ||= ServiceProviderRequest.from_uuid(request_id)
end

def update_session
session[:sp] = {
issuer: sp_request.issuer,
loa3: loa3_requested?,
request_url: sp_request.url,
request_id: sp_request.uuid,
requested_attributes: sp_request.requested_attributes,
}
end

def loa3_requested?
sp_request.loa == Saml::Idp::Constants::LOA3_AUTHN_CONTEXT_CLASSREF
end
Expand Down
11 changes: 11 additions & 0 deletions spec/controllers/sign_out_controller_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -18,5 +18,16 @@

get :destroy
end

it 'tracks the event' do
stub_sign_in_before_2fa
stub_analytics
allow(controller.decorated_session).to receive(:cancel_link_url).and_return('foo')

expect(@analytics).
to receive(:track_event).with(Analytics::LOGOUT_INITIATED, method: 'cancel link')

get :destroy
end
end
end
15 changes: 12 additions & 3 deletions spec/controllers/sign_up/completions_controller_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
context 'LOA1' do
it 'tracks page visit' do
stub_sign_in
subject.session[:sp] = { loa3: false }
subject.session[:sp] = { issuer: 'awesome sp', loa3: false }
get :show

expect(@analytics).to have_received(:track_event).with(
Expand All @@ -25,7 +25,7 @@
it 'tracks page visit' do
user = create(:user, profiles: [create(:profile, :verified, :active)])
stub_sign_in(user)
subject.session[:sp] = { loa3: true }
subject.session[:sp] = { issuer: 'awesome sp', loa3: true }

get :show

Expand Down Expand Up @@ -59,9 +59,18 @@
expect(response).to redirect_to(account_url)
end

it 'requires service provider issuer in session' do
stub_sign_in
subject.session[:sp] = { issuer: nil }

get :show

expect(response).to redirect_to(account_url)
end

it 'renders show if the user has an sp in the active session' do
stub_sign_in
subject.session[:sp] = { loa3: false }
subject.session[:sp] = { issuer: 'awesome sp', loa3: false }
get :show

expect(response).to render_template(:show)
Expand Down
2 changes: 2 additions & 0 deletions spec/controllers/sign_up/passwords_controller_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
success: true,
errors: {},
user_id: user.uuid,
request_id_present: false,
}

expect(@analytics).to receive(:track_event).
Expand All @@ -38,6 +39,7 @@
success: false,
errors: { password: ['is too short (minimum is 8 characters)'] },
user_id: user.uuid,
request_id_present: false,
}

expect(@analytics).to receive(:track_event).
Expand Down
20 changes: 20 additions & 0 deletions spec/forms/password_form_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@

extra = {
user_id: user.uuid,
request_id_present: false,
}

result = instance_double(FormResponse)
Expand All @@ -40,6 +41,7 @@

extra = {
user_id: '123',
request_id_present: false,
}

result = instance_double(FormResponse)
Expand Down Expand Up @@ -70,6 +72,7 @@
passwords.each do |password|
extra = {
user_id: '123',
request_id_present: false,
}
result = instance_double(FormResponse)

Expand All @@ -79,5 +82,22 @@
end
end
end

context 'when the request_id is passed in the params' do
it 'tracks that it is present' do
user = build_stubbed(:user)
form = PasswordForm.new(user)
password = 'valid password'
extra = {
user_id: user.uuid,
request_id_present: true,
}
result = instance_double(FormResponse)

expect(FormResponse).to receive(:new).
with(success: true, errors: {}, extra: extra).and_return(result)
expect(form.submit(password: password, request_id: 'foo')).to eq result
end
end
end
end
55 changes: 55 additions & 0 deletions spec/services/store_sp_metadata_in_session_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
require 'rails_helper'

describe StoreSpMetadataInSession do
describe '#call' do
context 'when a ServiceProviderRequest is not found' do
it 'does not set the session[:sp] hash' do
allow(Rails.logger).to receive(:info)
app_session = {}
instance = StoreSpMetadataInSession.new(session: app_session, request_id: 'foo')
info_hash = {
event: 'StoreSpMetadataInSession',
request_id_present: true,
sp_request_class: 'NullServiceProviderRequest',
}.to_json

expect { instance.call }.to_not change(app_session, :keys)
expect(Rails.logger).to have_received(:info).with(info_hash)
end
end

context 'when a ServiceProviderRequest is found' do
it 'sets the session[:sp] hash' do
allow(Rails.logger).to receive(:info)

app_session = {}
request_id = SecureRandom.uuid
ServiceProviderRequest.find_or_create_by(uuid: request_id) do |sp_request|
sp_request.issuer = 'issuer'
sp_request.loa = 'loa1'
sp_request.url = 'http://issuer.gov'
sp_request.requested_attributes = %w[email]
end
instance = StoreSpMetadataInSession.new(session: app_session, request_id: request_id)

info_hash = {
event: 'StoreSpMetadataInSession',
request_id_present: true,
sp_request_class: 'ServiceProviderRequest',
}.to_json

app_session_hash = {
issuer: 'issuer',
loa3: false,
request_url: 'http://issuer.gov',
request_id: request_id,
requested_attributes: %w[email],
}

instance.call
expect(Rails.logger).to have_received(:info).with(info_hash)
expect(app_session[:sp]).to eq app_session_hash
end
end
end
end