From 16227e38ac02b99045629882d3af54cde96448c2 Mon Sep 17 00:00:00 2001 From: Dan Ungureanu Date: Wed, 30 Jun 2021 12:00:47 +0300 Subject: [PATCH] FIX: Do not redirect to a topic user cannot see (#13550) Inviting a user to a private topic used to redirect them to a 404 page immediately after sign up. --- app/controllers/invites_controller.rb | 18 +++++++++---- spec/requests/invites_controller_spec.rb | 34 ++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 5 deletions(-) diff --git a/app/controllers/invites_controller.rb b/app/controllers/invites_controller.rb index 997f6e877d5..0ef40298b82 100644 --- a/app/controllers/invites_controller.rb +++ b/app/controllers/invites_controller.rb @@ -251,11 +251,19 @@ class InvitesController < ApplicationController topic = invite.topics.first response = {} - if user.present? && user.active? - response[:redirect_to] = topic.present? ? path(topic.relative_url) : path("/") - elsif user.present? - response[:message] = I18n.t('invite.confirm_email') - cookies[:destination_url] = path(topic.relative_url) if topic.present? + if user.present? + if user.active? + if user.guardian.can_see?(topic) + response[:redirect_to] = path(topic.relative_url) + else + response[:redirect_to] = path("/") + end + else + response[:message] = I18n.t('invite.confirm_email') + if user.guardian.can_see?(topic) + cookies[:destination_url] = path(topic.relative_url) + end + end end render json: success_json.merge(response) diff --git a/spec/requests/invites_controller_spec.rb b/spec/requests/invites_controller_spec.rb index 41dd9998e29..6d74c455e0c 100644 --- a/spec/requests/invites_controller_spec.rb +++ b/spec/requests/invites_controller_spec.rb @@ -684,6 +684,40 @@ describe InvitesController do expect(response.body).to include(I18n.t('login.already_logged_in', current_user: user.username)) end end + + context 'topic invites' do + fab!(:invite) { Fabricate(:invite, email: 'test@example.com') } + + fab!(:secured_category) do + secured_category = Fabricate(:category) + secured_category.permissions = { staff: :full } + secured_category.save! + secured_category + end + + it 'redirects user to topic if activated' do + topic = Fabricate(:topic) + TopicInvite.create!(invite: invite, topic: topic) + + put "/invites/show/#{invite.invite_key}.json", params: { email_token: invite.email_token } + expect(response.parsed_body['redirect_to']).to eq(topic.relative_url) + end + + it 'sets destination_url cookie if user is not activated' do + topic = Fabricate(:topic) + TopicInvite.create!(invite: invite, topic: topic) + + put "/invites/show/#{invite.invite_key}.json" + expect(cookies['destination_url']).to eq(topic.relative_url) + end + + it 'does not redirect user if they cannot see topic' do + TopicInvite.create!(invite: invite, topic: Fabricate(:topic, category: secured_category)) + + put "/invites/show/#{invite.invite_key}.json", params: { email_token: invite.email_token } + expect(response.parsed_body['redirect_to']).to eq("/") + end + end end context '#destroy_all_expired' do