Commit c099074fcc96304d948cc028ff7ae5913b561ed3

Authored by Jason Hollingsworth
1 parent 23d180f5

Fix 404 on project page for unauthenticated user

Eliminate a 404 error when user is not logged in and attempts to visit
a project page.

The 404 page will still show up when user is logged in and the project
doesn’t exist or the user doesn’t have access.
CHANGELOG
... ... @@ -8,6 +8,7 @@ v 6.4.0
8 8 - Internal projects (Jason Hollingsworth)
9 9 - Allow removal of avatar (Drew Blessing)
10 10 - Project web hooks now support issues and merge request events
  11 + - Visiting project page while not logged in will redirect to sign-in instead of 404 (Jason Hollingsworth)
11 12  
12 13 v 6.3.0
13 14 - API for adding gitlab-ci service
... ...
app/controllers/application_controller.rb
... ... @@ -81,6 +81,9 @@ class ApplicationController < ActionController::Base
81 81  
82 82 if @project and can?(current_user, :read_project, @project)
83 83 @project
  84 + elsif current_user.nil?
  85 + @project = nil
  86 + authenticate_user!
84 87 else
85 88 @project = nil
86 89 render_404 and return
... ...
features/project/redirects.feature 0 → 100644
... ... @@ -0,0 +1,26 @@
  1 +Feature: Project Redirects
  2 + Background:
  3 + Given public project "Community"
  4 + And private project "Enterprise"
  5 +
  6 + Scenario: I visit public project page
  7 + When I visit project "Community" page
  8 + Then I should see project "Community" home page
  9 +
  10 + Scenario: I visit private project page
  11 + When I visit project "Enterprise" page
  12 + Then I should be redirected to sign in page
  13 +
  14 + Scenario: I visit a non-existent project page
  15 + When I visit project "CommunityDoesNotExist" page
  16 + Then I should be redirected to sign in page
  17 +
  18 + Scenario: I visit a non-existent project page as user
  19 + Given I sign in as a user
  20 + When I visit project "CommunityDoesNotExist" page
  21 + Then page status code should be 404
  22 +
  23 + Scenario: I visit unauthorized project page as user
  24 + Given I sign in as a user
  25 + When I visit project "Enterprise" page
  26 + Then page status code should be 404
... ...
features/public/public_projects.feature
... ... @@ -16,11 +16,11 @@ Feature: Public Projects Feature
16 16  
17 17 Scenario: I visit internal project page
18 18 When I visit project "Internal" page
19   - Then page status code should be 404
  19 + Then I should be redirected to sign in page
20 20  
21 21 Scenario: I visit private project page
22 22 When I visit project "Enterprise" page
23   - Then page status code should be 404
  23 + Then I should be redirected to sign in page
24 24  
25 25 Scenario: I visit an empty public project page
26 26 Given public empty project "Empty Public Project"
... ...
features/steps/profile/profile.rb
... ... @@ -88,10 +88,6 @@ class Profile < Spinach::FeatureSteps
88 88 page.should have_content "Password doesn't match confirmation"
89 89 end
90 90  
91   - step 'I should be redirected to sign in page' do
92   - current_path.should == new_user_session_path
93   - end
94   -
95 91 step 'I reset my token' do
96 92 within '.update-token' do
97 93 @old_token = @user.private_token
... ...
features/steps/project/redirects.rb 0 → 100644
... ... @@ -0,0 +1,35 @@
  1 +class Spinach::Features::ProjectRedirects < Spinach::FeatureSteps
  2 + include SharedAuthentication
  3 + include SharedPaths
  4 + include SharedProject
  5 +
  6 + step 'public project "Community"' do
  7 + create :project_with_code, name: 'Community', visibility_level: Gitlab::VisibilityLevel::PUBLIC
  8 + end
  9 +
  10 + step 'private project "Enterprise"' do
  11 + create :project, name: 'Enterprise'
  12 + end
  13 +
  14 + step 'I visit project "Community" page' do
  15 + project = Project.find_by_name('Community')
  16 + visit project_path(project)
  17 + end
  18 +
  19 + step 'I should see project "Community" home page' do
  20 + within '.project-home-title' do
  21 + page.should have_content 'Community'
  22 + end
  23 + end
  24 +
  25 + step 'I visit project "Enterprise" page' do
  26 + project = Project.find_by_name('Enterprise')
  27 + visit project_path(project)
  28 + end
  29 +
  30 + step 'I visit project "CommunityDoesNotExist" page' do
  31 + project = Project.find_by_name('Community')
  32 + visit project_path(project) + 'DoesNotExist'
  33 + end
  34 +end
  35 +
... ...
features/steps/shared/authentication.rb
... ... @@ -12,6 +12,10 @@ module SharedAuthentication
12 12 login_as :admin
13 13 end
14 14  
  15 + step 'I should be redirected to sign in page' do
  16 + current_path.should == new_user_session_path
  17 + end
  18 +
15 19 def current_user
16 20 @user || User.first
17 21 end
... ...