From 30e4ab98db9e428c09acfa57e1af43a69a8066a1 Mon Sep 17 00:00:00 2001 From: yystopf Date: Mon, 6 Sep 2021 16:42:48 +0800 Subject: [PATCH 1/7] fix: owner team can change nickname --- app/services/organizations/teams/update_service.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/services/organizations/teams/update_service.rb b/app/services/organizations/teams/update_service.rb index 275dad886..d77bba9e4 100644 --- a/app/services/organizations/teams/update_service.rb +++ b/app/services/organizations/teams/update_service.rb @@ -25,7 +25,7 @@ class Organizations::Teams::UpdateService < ApplicationService private def update_params if team.authorize == "owner" - update_params = params.slice(:description) + update_params = params.slice(:description, :nickname) else update_params = params.slice(:name, :nickname, :description, :authorize, :includes_all_project, :can_create_org_project) end From 74a9743bcc95b835bb701a4286cdeafb090784ed Mon Sep 17 00:00:00 2001 From: yystopf Date: Tue, 7 Sep 2021 15:17:52 +0800 Subject: [PATCH 2/7] fix: annoymous user visit project --- app/controllers/application_controller.rb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 6848fffaa..11ea87dd9 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -762,10 +762,10 @@ class ApplicationController < ActionController::Base if @project and current_user.can_read_project?(@project) logger.info "###########: has project and can read project" @project - elsif @project && current_user.is_a?(AnonymousUser) - logger.info "###########:This is AnonymousUser" - @project = nil if !@project.is_public? - render_forbidden and return + # elsif @project && current_user.is_a?(AnonymousUser) + # logger.info "###########:This is AnonymousUser" + # @project = nil if !@project.is_public? + # render_forbidden and return else logger.info "###########:project not found" @project = nil From 84aed0391adb913d2fa08b71a12b7fe733aaced3 Mon Sep 17 00:00:00 2001 From: yystopf Date: Tue, 7 Sep 2021 17:19:38 +0800 Subject: [PATCH 3/7] fix: project list query --- app/controllers/projects_controller.rb | 2 +- app/models/project.rb | 12 ++++++++++++ app/queries/projects/list_query.rb | 7 ++++--- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index 2936b35ea..6bb4c0945 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -28,7 +28,7 @@ class ProjectsController < ApplicationController end def index - scope = Projects::ListQuery.call(params) + scope = current_user.logged? ? Projects::ListQuery.call(params, current_user.id) : Projects::ListQuery.call(params) # @projects = kaminari_paginate(scope) @projects = paginate scope.includes(:project_category, :project_language, :repository, :project_educoder, :owner, :project_units) diff --git a/app/models/project.rb b/app/models/project.rb index ff285f179..93d7e6470 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -137,6 +137,18 @@ class Project < ApplicationRecord delegate :content, to: :project_detail, allow_nil: true delegate :name, to: :license, prefix: true, allow_nil: true + def self.all_visible(user_id=nil) + user_projects_sql = Project.joins(:owner).where(users: {type: 'User'}).to_sql + org_public_projects_sql = Project.joins(:owner).merge(Organization.joins(:organization_extension).where(organization_extensions: {visibility: 'common'})).to_sql + if user_id.present? + org_limit_projects_sql = Project.joins(:owner).merge(Organization.joins(:organization_extension).where(organization_extensions: {visibility: 'limited'})).to_sql + org_privacy_projects_sql = Project.joins(:owner).merge(Organization.joins(:organization_extension, :organization_users).where(organization_extensions: {visibility: 'privacy'}, organization_users: {user_id: user_id})).to_sql + return Project.from("( #{ user_projects_sql } UNION #{ org_public_projects_sql } UNION #{ org_limit_projects_sql } UNION #{org_privacy_projects_sql} ) AS projects").visible + else + return Project.from("( #{ user_projects_sql } UNION #{ org_public_projects_sql } ) AS projects").visible + end + end + def reset_cache_data if changes[:user_id].present? first_owner = Owner.find_by_id(changes[:user_id].first) diff --git a/app/queries/projects/list_query.rb b/app/queries/projects/list_query.rb index 04f1d168b..771d4c927 100644 --- a/app/queries/projects/list_query.rb +++ b/app/queries/projects/list_query.rb @@ -1,16 +1,17 @@ class Projects::ListQuery < ApplicationQuery include CustomSortable - attr_reader :params + attr_reader :params, :current_user_id sort_columns :updated_on, :created_on, :forked_count, :praises_count, default_by: :updated_on, default_direction: :desc - def initialize(params) + def initialize(params, current_user_id=nil) @params = params + @current_user_id = current_user_id end def call - q = Project.visible.by_name_or_identifier(params[:search]) + q = Project.all_visible(current_user_id).by_name_or_identifier(params[:search]) scope = q .with_project_type(params[:project_type]) From d5de6aa66b8697b56f7fd4ba00e2bc80e4af1bda Mon Sep 17 00:00:00 2001 From: yystopf Date: Wed, 8 Sep 2021 18:16:02 +0800 Subject: [PATCH 4/7] fix: transfer repository owner complete not include organization --- app/services/projects/apply_transfer_service.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/services/projects/apply_transfer_service.rb b/app/services/projects/apply_transfer_service.rb index 0d9d41e7d..2953cd3d2 100644 --- a/app/services/projects/apply_transfer_service.rb +++ b/app/services/projects/apply_transfer_service.rb @@ -24,7 +24,7 @@ class Projects::ApplyTransferService < ApplicationService raise Error, '仓库标识不正确' if @project.identifier != params[:identifier] raise Error, '该仓库正在迁移' if @project.is_transfering raise Error, '新拥有者不存在' unless @owner.present? - raise Error, '新拥有者资料不完善' unless @owner.profile_completed + raise Error, '新拥有者资料不完善' if @owner.is_a?(User) && !@owner.profile_completed raise Error, '新拥有者已经存在同名仓库!' if Project.where(user_id: @owner.id, identifier: params[:identifier]).present? raise Error, '未拥有转移权限' unless is_permit_owner end From 90ace8b7533882506c4128d89dbca8afa3a238f0 Mon Sep 17 00:00:00 2001 From: yystopf Date: Fri, 10 Sep 2021 10:52:21 +0800 Subject: [PATCH 5/7] fix: download file need authorize --- app/controllers/repositories_controller.rb | 11 +++++++++++ app/helpers/projects_helper.rb | 4 ++++ app/views/repositories/_simple_entry.json.jbuilder | 3 ++- config/routes.rb | 1 + 4 files changed, 18 insertions(+), 1 deletion(-) diff --git a/app/controllers/repositories_controller.rb b/app/controllers/repositories_controller.rb index 8e3f496be..9ef440903 100644 --- a/app/controllers/repositories_controller.rb +++ b/app/controllers/repositories_controller.rb @@ -205,6 +205,17 @@ class RepositoriesController < ApplicationController redirect_to file_path end + + def raw + domain = Gitea.gitea_config[:domain] + api_url = Gitea.gitea_config[:base_url] + + url = "/repos/#{@owner.login}/#{@repository.identifier}/raw/#{params[:filepath]}?ref=#{params[:ref]}" + file_path = [domain, api_url, url].join + file_path = [file_path, "access_token=#{current_user&.gitea_token}"].join("&") if @repository.hidden? + + redirect_to file_path + end private diff --git a/app/helpers/projects_helper.rb b/app/helpers/projects_helper.rb index 8af542190..cc4a3fe02 100644 --- a/app/helpers/projects_helper.rb +++ b/app/helpers/projects_helper.rb @@ -21,6 +21,10 @@ module ProjectsHelper [base_url, archive_repositories_path(owner&.login, repository, "#{archive}.tar.gz")].join end + def render_download_file_url(owner, repository, filepath, ref) + [base_url, "/api/#{owner&.login}/#{repository.identifier}/raw?filepath=#{filepath}&ref=#{ref}"].join + end + def render_http_url(project) [gitea_domain, project.owner.login, "#{project.identifier}.git"].join('/') end diff --git a/app/views/repositories/_simple_entry.json.jbuilder b/app/views/repositories/_simple_entry.json.jbuilder index 6c2088755..cc9bdc3ae 100644 --- a/app/views/repositories/_simple_entry.json.jbuilder +++ b/app/views/repositories/_simple_entry.json.jbuilder @@ -17,7 +17,8 @@ if @project.forge? dir_path = [@owner.login, @repository.identifier, "raw/branch", @ref].join('/') render_download_image_url(dir_path, entry['path'], decode64_content(entry, @owner, @repository, @ref)) else - entry['download_url'] + # entry['download_url'] + render_download_file_url(@owner, @repository, entry['path'].to_s, @ref) end json.download_url download_url diff --git a/config/routes.rb b/config/routes.rb index 346468fb7..2b92e939b 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -434,6 +434,7 @@ Rails.application.routes.draw do get 'readme' get 'languages' get 'archive/:archive', to: 'repositories#archive', as: "archive", constraints: { archive: /.+/, format: /(zip|gzip)/ } + get 'raw', to: 'repositories#raw', as: "raw" end end From 02f8e453f1b22cd564ea60c17fb0ddbd400c95c1 Mon Sep 17 00:00:00 2001 From: yystopf Date: Fri, 10 Sep 2021 11:26:01 +0800 Subject: [PATCH 6/7] fix: remove watcher when project change is_public --- app/models/project.rb | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/app/models/project.rb b/app/models/project.rb index 93d7e6470..293e6c478 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -127,8 +127,8 @@ class Project < ApplicationRecord has_many :has_pinned_users, through: :pinned_projects, source: :user has_many :webhooks, class_name: "Gitea::Webhook", primary_key: :gpid, foreign_key: :repo_id - after_save :check_project_members, :reset_cache_data - before_save :set_invite_code + after_save :check_project_members + before_save :set_invite_code, :reset_cache_data, :reset_unmember_followed after_destroy :reset_cache_data scope :project_statics_select, -> {select(:id,:name, :is_public, :identifier, :status, :project_type, :user_id, :forked_count, :visits, :project_category_id, :project_language_id, :license_id, :ignore_id, :watchers_count, :created_on)} scope :no_anomory_projects, -> {where("projects.user_id is not null and projects.user_id != ?", 2)} @@ -158,6 +158,12 @@ class Project < ApplicationRecord self.reset_user_cache_async_job(self.owner) end + def reset_unmember_followed + if changes[:is_public].present? && changes[:is_public] == [true, false] + self.watchers.where.not(user_id: self.all_collaborators).destroy_all + end + end + def set_invite_code if self.invite_code.nil? self.invite_code= self.generate_dcode('invite_code', 6) From cd569f4b8a93e8fb9c0e33e7c61691a78a610a1a Mon Sep 17 00:00:00 2001 From: yystopf Date: Fri, 10 Sep 2021 15:53:38 +0800 Subject: [PATCH 7/7] fix: download url redirect delay --- app/controllers/attachments_controller.rb | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/app/controllers/attachments_controller.rb b/app/controllers/attachments_controller.rb index 14e53b3e2..1f3bd97f8 100644 --- a/app/controllers/attachments_controller.rb +++ b/app/controllers/attachments_controller.rb @@ -32,8 +32,17 @@ class AttachmentsController < ApplicationController def get_file normal_status(-1, "参数缺失") if params[:download_url].blank? url = URI.encode(params[:download_url].to_s.gsub("http:", "https:")) - response = Faraday.get(url) - filename = params[:download_url].to_s.split("/").pop() + if url.starts_with?(base_url) + domain = Gitea.gitea_config[:domain] + api_url = Gitea.gitea_config[:base_url] + url = url.split(base_url)[1].gsub("api", "repos").gsub('?filepath=', '/').gsub('&', '?') + request_url = [domain, api_url, url, "?ref=#{params[:ref]}&access_token=#{current_user&.gitea_token}"].join + response = Faraday.get(request_url) + filename = url.to_s.split("/").pop() + else + response = Faraday.get(url) + filename = params[:download_url].to_s.split("/").pop() + end send_data(response.body.force_encoding("UTF-8"), filename: filename, type: "application/octet-stream", disposition: 'attachment') end