diff --git a/app/controllers/forks_controller.rb b/app/controllers/forks_controller.rb index 7d7db9350..967c1d4d2 100644 --- a/app/controllers/forks_controller.rb +++ b/app/controllers/forks_controller.rb @@ -2,18 +2,44 @@ class ForksController < ApplicationController before_action :require_login before_action :require_profile_completed, only: [:create] before_action :load_project - before_action :authenticate_project!, :authenticate_user! + before_action :authenticate_user! + before_action :authenticate_project!, only: [:create] + + def fork_list + @user = current_user + @organizations = current_user.organizations + + end def create - @new_project = Projects::ForkService.new(current_user, @project, params[:organization], params[:new_name], params[:new_identifier]).call + target_owner = if params[:organization].present? && @organization + @organization + else + current_user + end + @new_project = Projects::ForkService.new(target_owner, @project, params[:organization], params[:new_name], params[:new_identifier]).call + if @new_project == false + render_result(-1, "已fork过一次该项目,无法再次进行fork") + end end private def authenticate_project! - if current_user&.id == @project.user_id && (params[:new_identifier].blank? || params[:new_identifier] == @project.identifier) - render_result(-1, "自己不能fork自己的项目") - elsif Project.exists?(user_id: current_user.id, identifier: (params[:new_identifier] || @project.identifier)) - render_result(0, "fork失败,你已拥有了这个项目") + if params[:organization].present? + return render_forbidden('参数错误,当organization存在时不允许fork重命名') if params[:new_identifier].present? || params[:new_name].present? + @organization = Organization.find_by(login:params[:organization]) + return render_forbidden('仓库不存在') unless @organization.present? + return render_forbidden('你没有权限操作') unless @organization.is_admin?(current_user.id) + end + + if params[:organization].blank? && Project.exists?(user_id: current_user.id, identifier: (params[:new_identifier] || @project.identifier)) + render_result(-1, "fork失败,您已拥有了这个项目") + elsif @organization && Project.exists?(user_id: [@organization.id], identifier: (params[:new_identifier] || @project.identifier)) + render_result(-1, "fork失败,组织已拥有了这个项目") + elsif gitea_check_exit(current_user) + render_result(-1, "fork失败,请联系系统管理员") + elsif @organization && gitea_check_exit(@organization) + render_result(-1, "fork失败,请联系系统管理员") end # return if current_user != @project.owner # render_result(-1, "自己不能fork自己的项目") @@ -24,4 +50,9 @@ class ForksController < ApplicationController return if @project.member?(current_user) || current_user.admin? render_forbidden('你没有权限操作') end + + def gitea_check_exit(user) + data = Gitea::Repository::GetService.new(user, params[:new_identifier]|| @project.identifier).call + data.present? + end end diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index f292f9a70..25c8ce570 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -212,6 +212,8 @@ class UsersController < ApplicationController def update return render_not_found unless @user = User.find_by(login: params[:id]) || User.find_by_id(params[:id]) return render_forbidden unless User.current.logged? && (current_user&.admin? || current_user.id == @user.id) + keywords = user_params[:nickname].to_s.each_char.select { |c| c.bytes.first < 240 }.join('') + return normal_status(-1, "昵称中包含关键词:#{keywords},请重新命名") if ReversedKeyword.check_exists?(keywords) Util.write_file(@image, avatar_path(@user)) if user_params[:image].present? @user.attributes = user_params.except(:image) unless @user.save diff --git a/app/services/gitea/user/get_token_service.rb b/app/services/gitea/user/get_token_service.rb index 21a75a076..d751ca9f4 100644 --- a/app/services/gitea/user/get_token_service.rb +++ b/app/services/gitea/user/get_token_service.rb @@ -9,7 +9,7 @@ class Gitea::User::GetTokenService < Gitea::ClientService def call params = {} url = "/users/#{username}/tokens".freeze - params = params.merge(page: 1, limit: 200, token: token) + params = params.merge(sudo: username, page: 1, limit: 200, token: token) response = get(url, params) render_status(response) end diff --git a/app/services/projects/fork_service.rb b/app/services/projects/fork_service.rb index 3e6a153fb..a46b8d86a 100644 --- a/app/services/projects/fork_service.rb +++ b/app/services/projects/fork_service.rb @@ -18,7 +18,7 @@ class Projects::ForkService < ApplicationService :license_id, :ignore_id, {repository: [:identifier, :hidden]}] result = Gitea::Repository::ForkService.new(@project.owner, @target_owner, @project.identifier, @organization, @new_identifier).call - + return false if result['clone_url'].nil? clone_project.owner = @target_owner clone_project.forked_from_project_id = @project.id clone_project.gpid = result['id'] diff --git a/app/services/pull_requests/create_service.rb b/app/services/pull_requests/create_service.rb index 2b4767f31..070b564d9 100644 --- a/app/services/pull_requests/create_service.rb +++ b/app/services/pull_requests/create_service.rb @@ -180,7 +180,7 @@ class PullRequests::CreateService < ApplicationService end def compare_head_base! - head = pull_request.is_original && @params[:merge_user_login] ? "#{@params[:merge_user_login]}/#{@project.identifier}:#{@params[:head]}" : @params[:head] + head = pull_request.is_original && @params[:merge_user_login] ? "#{@params[:merge_user_login]}/#{@params[:merge_project_identifier]}:#{@params[:head]}" : @params[:head] compare_result = Gitea::Repository::Commits::CompareService.call(@owner.login, @project.identifier, Addressable::URI.escape(@params[:base]), Addressable::URI.escape(head), @current_user.gitea_token) raise '分支内容相同,无需创建合并请求' if compare_result["Commits"].blank? && compare_result["Diff"].blank? end diff --git a/app/views/forks/fork_list.json.jbuilder b/app/views/forks/fork_list.json.jbuilder new file mode 100644 index 000000000..185b8e4fc --- /dev/null +++ b/app/views/forks/fork_list.json.jbuilder @@ -0,0 +1,16 @@ +json.user do + json.id @user.id + json.type @user.type + json.name @user.real_name + json.login @user.login + json.image_url url_to_avatar(@user) + json.forked Project.exists?(user_id: @user.id, forked_from_project_id: @project.id) +end +json.organizations @organizations do |organization| + json.forked Project.exists?(user_id: organization.id, forked_from_project_id: @project.id) + json.id organization.id + json.name organization.login + json.nickname organization.nickname.blank? ? organization.name : organization.nickname + json.avatar_url url_to_avatar(organization) + json.created_at organization.created_on.strftime("%Y-%m-%d") +end diff --git a/config/routes.rb b/config/routes.rb index 0d04c498a..8750508ea 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -625,7 +625,11 @@ Rails.application.routes.draw do end resources :hooks - resources :forks, only: [:create] + resources :forks, only: [:create] do + collection do + get :fork_list + end + end resources :project_trends, :path => :activity, only: [:index, :create] resources :issue_tags, :path => :labels, only: [:create, :edit, :update, :destroy, :index] resources :version_releases, :path => :releases, only: [:index,:new, :show, :create, :edit, :update, :destroy]