Skip to content

Commit 8cb8355

Browse files
authored
Merge pull request #1905 from codidact/0valt/1903/my_routes
Fix misbehaving /me subroutes
2 parents 7c888fd + ff2ae2b commit 8cb8355

File tree

4 files changed

+77
-32
lines changed

4 files changed

+77
-32
lines changed

app/controllers/application_controller.rb

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,14 @@ def second_level_post_types
144144
helpers.post_type_ids(is_top_level: false, has_parent: true)
145145
end
146146

147+
[:json, :html, :xml].each do |format|
148+
define_method "#{format}_request?" do
149+
return false unless request.format.respond_to?("#{format}?")
150+
151+
request.format.send("#{format}?")
152+
end
153+
end
154+
147155
private
148156

149157
def distinguish_fake_community
@@ -379,16 +387,20 @@ def devise_sign_in_enabled?
379387
helpers.devise_sign_in_enabled?
380388
end
381389

390+
def redirect_to_sign_in
391+
if devise_sign_in_enabled?
392+
redirect_to new_user_session_path
393+
else
394+
redirect_to new_saml_user_session_path
395+
end
396+
end
397+
382398
def authenticate_user!(_fav = nil, **_opts)
383399
unless user_signed_in?
384400
respond_to do |format|
385401
format.html do
386402
flash[:error] = 'You need to sign in or sign up to continue.'
387-
if devise_sign_in_enabled?
388-
redirect_to new_user_session_path
389-
else
390-
redirect_to new_saml_user_session_path
391-
end
403+
redirect_to_sign_in
392404
end
393405
format.json do
394406
render json: { error: 'You need to sign in or sign up to continue.' }, status: 401

app/controllers/users_controller.rb

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,14 @@
44
class UsersController < ApplicationController
55
include Devise::Controllers::Rememberable
66

7-
before_action :authenticate_user!, only: [:edit_profile, :update_profile, :stack_redirect, :transfer_se_content,
8-
:qr_login_code, :me, :preferences, :set_preference, :my_vote_summary,
7+
before_action :authenticate_user!, only: [:edit_profile, :update_profile, :stack_redirect,
8+
:transfer_se_content, :qr_login_code,
9+
:me, :my_activity, :my_network, :my_vote_summary,
10+
:preferences, :set_preference,
911
:disconnect_sso, :confirm_disconnect_sso]
12+
13+
before_action :redirect_to_sign_in, only: [:filters], unless: [:user_signed_in?, :json_request?]
14+
1015
before_action :verify_moderator, only: [:mod, :destroy, :soft_delete, :role_toggle, :full_log,
1116
:annotate, :annotations, :mod_privileges, :mod_privilege_action]
1217
before_action :set_user, only: [:show, :mod, :destroy, :soft_delete, :posts, :role_toggle, :full_log, :activity,
@@ -240,6 +245,10 @@ def network
240245
render layout: 'without_sidebar'
241246
end
242247

248+
def my_activity
249+
redirect_to user_activity_path(current_user)
250+
end
251+
243252
def activity
244253
@posts = Post.undeleted.by(@user).count
245254
@comments = Comment.by(@user).joins(:comment_thread, :post).undeleted.where(comment_threads: { deleted: false },

config/routes.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,7 @@
194194
get '/mobile-login', to: 'users#qr_login_code', as: :qr_login_code
195195
get '/mobile-login/:token', to: 'users#do_qr_login', as: :qr_login
196196
get '/me', to: 'users#me', as: :users_me
197+
get '/me/activity', to: 'users#my_activity', as: :my_activity
197198
get '/me/preferences', to: 'users#preferences', as: :user_preferences
198199
post '/me/preferences', to: 'users#set_preference', as: :set_user_preference
199200
get '/me/filters', to: 'users#filters', as: :user_filters

test/controllers/users_controller_test.rb

Lines changed: 48 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -300,29 +300,49 @@ class UsersControllerTest < ActionController::TestCase
300300
assert_not_nil assigns(:user)
301301
end
302302

303-
# We can only test for one user per test block, hence there are
304-
# three test blocks of users with different permission models to
305-
# have a more unbiased check.
306-
307-
test 'my vote summary redirects to current user summary (#1 deleter)' do
308-
sign_in users(:deleter)
309-
get :my_vote_summary
310-
assert_redirected_to vote_summary_path(users(:deleter))
311-
sign_out :user
303+
test 'my_activity should redirect to user activity or to sign in for anonymous access' do
304+
users.each do |user|
305+
sign_in user
306+
get :my_activity
307+
308+
if user.deleted? || user.community_user.deleted?
309+
assert_redirected_to_sign_in
310+
else
311+
assert_redirected_to user_activity_path(user), "user #{user.name} is incorrectly redirected"
312+
end
313+
314+
sign_out :user
315+
end
312316
end
313317

314-
test 'my vote summary redirects to current user summary (#2 std user)' do
315-
sign_in users(:standard_user)
316-
get :my_vote_summary
317-
assert_redirected_to vote_summary_path(users(:standard_user))
318-
sign_out :user
318+
test 'my_network should redirect to user network profile or to sign in for anonymous access' do
319+
users.each do |user|
320+
sign_in user
321+
get :my_network
322+
323+
if user.deleted? || user.community_user.deleted?
324+
assert_redirected_to_sign_in
325+
else
326+
assert_redirected_to network_path(user), "user #{user.name} is incorrectly redirected"
327+
end
328+
329+
sign_out :user
330+
end
319331
end
320332

321-
test 'my vote summary redirects to current user summary (#3 global_admin)' do
322-
sign_in users(:global_admin)
323-
get :my_vote_summary
324-
assert_redirected_to vote_summary_path(users(:global_admin))
325-
sign_out :user
333+
test 'my_vote_summary should redirect to user summary or to sign in for anonymous access' do
334+
users.each do |user|
335+
sign_in user
336+
get :my_vote_summary
337+
338+
if user.deleted? || user.community_user.deleted?
339+
assert_redirected_to_sign_in
340+
else
341+
assert_redirected_to vote_summary_path(user), "user #{user.name} is incorrectly redirected"
342+
end
343+
344+
sign_out :user
345+
end
326346
end
327347

328348
test 'vote summary rendered for all users, signed in or out, own or others' do
@@ -606,8 +626,13 @@ class UsersControllerTest < ActionController::TestCase
606626
assert_json_success
607627
end
608628

609-
test 'filters should only return system filters for anonymous users' do
610-
try_filters
629+
test 'HTML filters should redirect to sign in for anonymous users' do
630+
try_filters(format: :html)
631+
assert_redirected_to_sign_in
632+
end
633+
634+
test 'JSON filters should return system filters for anonymous users' do
635+
try_filters(format: :json)
611636

612637
assert_response(:success)
613638
assert_valid_json_response
@@ -629,10 +654,8 @@ def create_other_user
629654
other_user
630655
end
631656

632-
def try_filters
633-
get :filters, params: {
634-
format: :json
635-
}
657+
def try_filters(format: :json)
658+
get :filters, params: { format: format }
636659
end
637660

638661
def try_default_filter(category)

0 commit comments

Comments
 (0)