debian-mirror-gitlab/app/controllers/users_controller.rb

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

304 lines
7.8 KiB
Ruby
Raw Normal View History

2018-12-05 23:21:45 +05:30
# frozen_string_literal: true
2014-09-02 18:07:02 +05:30
class UsersController < ApplicationController
2021-03-11 19:13:27 +05:30
include InternalRedirect
2017-08-17 22:00:37 +05:30
include RoutableActions
2018-03-17 18:26:18 +05:30
include RendersMemberAccess
2020-07-28 23:09:34 +05:30
include RendersProjectsList
2018-03-27 19:54:05 +05:30
include ControllerWithCrossProjectAccessCheck
2019-12-04 20:38:33 +05:30
include Gitlab::NoteableMetadata
2018-03-27 19:54:05 +05:30
requires_cross_project_access show: false,
2023-05-27 22:25:52 +05:30
groups: false,
projects: false,
contributed: false,
snippets: true,
calendar: false,
followers: false,
following: false,
calendar_activities: true
2017-08-17 22:00:37 +05:30
2015-09-11 14:41:01 +05:30
skip_before_action :authenticate_user!
2018-11-29 20:51:05 +05:30
prepend_before_action(only: [:show]) { authenticate_sessionless_user!(:rss) }
2021-09-04 01:27:46 +05:30
before_action :user, except: [:exists]
2023-05-27 22:25:52 +05:30
before_action :authorize_read_user_profile!, only: [
:calendar, :calendar_activities, :groups, :projects, :contributed, :starred, :snippets, :followers, :following
]
2022-03-02 08:16:31 +05:30
before_action only: [:exists] do
2022-05-07 20:08:51 +05:30
check_rate_limit!(:username_exists, scope: request.ip)
2022-03-02 08:16:31 +05:30
end
2023-04-23 21:23:45 +05:30
before_action only: [:show] do
push_frontend_feature_flag(:profile_tabs_vue, current_user)
end
2014-09-02 18:07:02 +05:30
2023-04-23 21:23:45 +05:30
feature_category :user_profile, [:show, :activity, :groups, :projects, :contributed, :starred,
2022-06-21 17:19:12 +05:30
:followers, :following, :calendar, :calendar_activities,
2022-07-23 23:45:48 +05:30
:exists, :activity, :follow, :unfollow, :ssh_keys]
2022-06-21 17:19:12 +05:30
2023-03-04 22:38:38 +05:30
feature_category :source_code_management, [:snippets, :gpg_keys]
2022-06-21 17:19:12 +05:30
# TODO: Set higher urgency after resolving https://gitlab.com/gitlab-org/gitlab/-/issues/357914
2022-11-25 23:54:43 +05:30
urgency :low, [:show, :calendar_activities, :contributed, :activity, :projects, :groups, :calendar, :snippets]
2022-07-23 23:45:48 +05:30
urgency :default, [:followers, :following, :starred]
2022-07-16 23:28:13 +05:30
urgency :high, [:exists]
2021-01-03 14:25:43 +05:30
2014-09-02 18:07:02 +05:30
def show
2015-04-26 12:48:37 +05:30
respond_to do |format|
format.html
format.atom do
load_events
2022-05-07 20:08:51 +05:30
render layout: 'xml'
2015-04-26 12:48:37 +05:30
end
format.json do
2021-03-08 18:12:59 +05:30
msg = "This endpoint is deprecated. Use %s instead." % user_activity_path
render json: { message: msg }, status: :not_found
2015-04-26 12:48:37 +05:30
end
end
end
2021-02-22 17:27:13 +05:30
# Get all keys of a user(params[:username]) in a text format
# Helpful for sysadmins to put in respective servers
def ssh_keys
2022-08-13 15:12:31 +05:30
keys = user.all_ssh_keys.join("\n")
keys << "\n" unless keys.empty?
render plain: keys
2021-02-22 17:27:13 +05:30
end
2018-12-05 23:21:45 +05:30
def activity
respond_to do |format|
format.html { render 'show' }
2021-02-22 17:27:13 +05:30
format.json do
load_events
2023-05-27 22:25:52 +05:30
if Feature.enabled?(:profile_tabs_vue, current_user)
@events = if user.include_private_contributions?
@events
else
@events.select { |event| event.visible_to_user?(current_user) }
end
render json: ::Profile::EventSerializer.new(current_user: current_user, target_user: user)
.represent(@events)
else
pager_json("events/_events", @events.count, events: @events)
end
2021-02-22 17:27:13 +05:30
end
2018-12-05 23:21:45 +05:30
end
end
2021-02-22 17:27:13 +05:30
# Get all gpg keys of a user(params[:username]) in a text format
def gpg_keys
2022-08-13 15:12:31 +05:30
keys = user.gpg_keys.filter_map { |gpg_key| gpg_key.key if gpg_key.verified? }.join("\n")
keys << "\n" unless keys.empty?
render plain: keys
2021-02-22 17:27:13 +05:30
end
2016-06-02 11:05:42 +05:30
def groups
load_groups
respond_to do |format|
format.html { render 'show' }
format.json do
render json: {
html: view_to_html_string("shared/groups/_list", groups: @groups)
}
end
end
end
def projects
load_projects
2019-10-12 21:52:04 +05:30
present_projects(@projects)
2016-06-02 11:05:42 +05:30
end
def contributed
load_contributed_projects
2019-10-12 21:52:04 +05:30
present_projects(@contributed_projects)
end
def starred
load_starred_projects
present_projects(@starred_projects)
end
2021-03-11 19:13:27 +05:30
def followers
@user_followers = user.followers.page(params[:page])
present_users(@user_followers)
end
def following
@user_following = user.followees.page(params[:page])
present_users(@user_following)
end
2019-10-12 21:52:04 +05:30
def present_projects(projects)
skip_pagination = Gitlab::Utils.to_boolean(params[:skip_pagination])
skip_namespace = Gitlab::Utils.to_boolean(params[:skip_namespace])
compact_mode = Gitlab::Utils.to_boolean(params[:compact_mode])
2016-06-02 11:05:42 +05:30
respond_to do |format|
format.html { render 'show' }
format.json do
2019-10-12 21:52:04 +05:30
pager_json("shared/projects/_list", projects.count, projects: projects, skip_pagination: skip_pagination, skip_namespace: skip_namespace, compact_mode: compact_mode)
2016-06-02 11:05:42 +05:30
end
end
end
def snippets
load_snippets
respond_to do |format|
format.html { render 'show' }
format.json do
render json: {
2017-08-17 22:00:37 +05:30
html: view_to_html_string("snippets/_snippets", collection: @snippets)
2016-06-02 11:05:42 +05:30
}
end
end
end
2015-04-26 12:48:37 +05:30
def calendar
2017-09-10 17:25:29 +05:30
render json: contributions_calendar.activity_dates
2015-04-26 12:48:37 +05:30
end
def calendar_activities
2022-08-27 11:52:29 +05:30
@calendar_date = begin
Date.parse(params[:date])
rescue StandardError
Date.today
end
2021-01-03 14:25:43 +05:30
@events = contributions_calendar.events_by_date(@calendar_date).map(&:present)
2015-04-26 12:48:37 +05:30
render 'calendar_activities', layout: false
2014-09-02 18:07:02 +05:30
end
2016-11-03 12:29:30 +05:30
def exists
2022-04-04 11:22:00 +05:30
if Gitlab::CurrentSettings.signup_enabled? || current_user
2023-07-09 08:55:56 +05:30
render json: { exists: !!Namespace.without_project_namespaces.find_by_path_or_name(params[:username]) }
2022-04-04 11:22:00 +05:30
else
render json: { error: _('You must be authenticated to access this path.') }, status: :unauthorized
end
2016-11-03 12:29:30 +05:30
end
2021-03-11 19:13:27 +05:30
def follow
2022-11-25 23:54:43 +05:30
followee = current_user.follow(user)
2021-03-11 19:13:27 +05:30
2023-07-09 08:55:56 +05:30
if followee
flash[:alert] = followee.errors.full_messages.join(', ') if followee&.errors&.any?
else
flash[:alert] = s_('Action not allowed.')
end
2021-03-11 19:13:27 +05:30
redirect_path = referer_path(request) || @user
redirect_to redirect_path
end
def unfollow
current_user.unfollow(user)
redirect_path = referer_path(request) || @user
redirect_to redirect_path
end
2015-04-26 12:48:37 +05:30
private
2016-06-02 11:05:42 +05:30
def user
2021-11-11 11:23:49 +05:30
@user ||= find_routable!(User, params[:username], request.fullpath)
2015-04-26 12:48:37 +05:30
end
2020-04-22 19:07:51 +05:30
def personal_projects
PersonalProjectsFinder.new(user).execute(current_user)
end
2015-04-26 12:48:37 +05:30
def contributed_projects
2016-06-02 11:05:42 +05:30
ContributedProjectsFinder.new(user).execute(current_user)
2015-04-26 12:48:37 +05:30
end
2019-10-12 21:52:04 +05:30
def starred_projects
2022-04-04 11:22:00 +05:30
StarredProjectsFinder.new(user, params: finder_params, current_user: current_user).execute
2019-10-12 21:52:04 +05:30
end
2015-04-26 12:48:37 +05:30
def contributions_calendar
2016-11-24 13:41:30 +05:30
@contributions_calendar ||= Gitlab::ContributionsCalendar.new(user, current_user)
2015-04-26 12:48:37 +05:30
end
def load_events
2021-03-11 19:13:27 +05:30
@events = UserRecentEventsFinder.new(current_user, user, nil, params).execute
2018-03-17 18:26:18 +05:30
Events::RenderService.new(current_user).execute(@events, atom_request: request.format.atom?)
2015-11-26 14:37:03 +05:30
end
2015-04-26 12:48:37 +05:30
2016-06-02 11:05:42 +05:30
def load_projects
2020-04-22 19:07:51 +05:30
@projects = personal_projects
2016-06-02 11:05:42 +05:30
.page(params[:page])
2018-12-05 23:21:45 +05:30
.per(params[:limit])
2018-03-17 18:26:18 +05:30
prepare_projects_for_rendering(@projects)
2016-06-02 11:05:42 +05:30
end
def load_contributed_projects
@contributed_projects = contributed_projects.joined(user)
2018-03-17 18:26:18 +05:30
prepare_projects_for_rendering(@contributed_projects)
2016-06-02 11:05:42 +05:30
end
2019-10-12 21:52:04 +05:30
def load_starred_projects
@starred_projects = starred_projects
prepare_projects_for_rendering(@starred_projects)
end
2016-06-02 11:05:42 +05:30
def load_groups
@groups = JoinedGroupsFinder.new(user).execute(current_user)
2018-03-17 18:26:18 +05:30
prepare_groups_for_rendering(@groups)
2016-06-02 11:05:42 +05:30
end
def load_snippets
2019-12-04 20:38:33 +05:30
@snippets = SnippetsFinder.new(current_user, author: user, scope: params[:scope])
.execute
.page(params[:page])
.inc_author
@noteable_meta_data = noteable_meta_data(@snippets, 'Snippet')
2016-06-02 11:05:42 +05:30
end
2017-08-17 22:00:37 +05:30
def build_canonical_path(user)
2018-06-27 16:04:02 +05:30
url_for(safe_params.merge(username: user.to_param))
2015-04-26 12:48:37 +05:30
end
2018-11-18 11:00:15 +05:30
def authorize_read_user_profile!
access_denied! unless can?(current_user, :read_user_profile, user)
end
2021-03-11 19:13:27 +05:30
def present_users(users)
respond_to do |format|
format.html { render 'show' }
format.json do
render json: {
html: view_to_html_string("shared/users/index", users: users)
}
end
end
end
2022-04-04 11:22:00 +05:30
def finder_params
{
# don't display projects marked for deletion
not_aimed_for_deletion: true
}
end
2014-09-02 18:07:02 +05:30
end
2019-12-04 20:38:33 +05:30
2021-06-08 01:23:25 +05:30
UsersController.prepend_mod_with('UsersController')