cla fix and add token verify

This commit is contained in:
chenjing 2023-06-20 15:27:03 +08:00
parent d35bbcf6fb
commit 65816a980b
9 changed files with 123 additions and 10 deletions

View File

@ -4,9 +4,9 @@ class ProjectsController < ApplicationController
include ProjectsHelper
include Acceleratorable
before_action :require_login, except: %i[index branches branches_slice group_type_list simple show fork_users praise_users watch_users recommend banner_recommend about menu_list]
before_action :require_profile_completed, only: [:create, :migrate]
before_action :load_repository, except: %i[index group_type_list migrate create recommend banner_recommend]
before_action :require_login, except: %i[index branches branches_slice group_type_list simple show fork_users praise_users watch_users recommend banner_recommend about menu_list verify_auth_token]
before_action :require_profile_completed, only: [:create, :migrate,:verify_auth_token]
before_action :load_repository, except: %i[index group_type_list migrate create recommend banner_recommend verify_auth_token]
before_action :authorizate_user_can_edit_project!, only: %i[update]
before_action :project_public?, only: %i[fork_users praise_users watch_users]
before_action :request_limit, only: %i[index]
@ -63,6 +63,15 @@ class ProjectsController < ApplicationController
tip_exception(e.message)
end
def verify_auth_token
data = Projects::VerifyAuthTokenService.call(params[:clone_addr], params[:auth_token])
if data
render_ok
else
render_error('token验证不通过')
end
end
def migrate
Projects::MigrateForm.new(mirror_params).validate!

View File

@ -11,14 +11,16 @@ class Users::ClasController < Users::BaseController
def create
@user_cla = current_user.user_clas.find_by(cla_id: params[:cla_id])
if @user_cla
@user_cla.update_attributes(state: 1)
else
if @user_cla.nil?
ActiveRecord::Base.transaction do
Users::UserClaForm.new(user_cla_params).validate!
@user_cla = UserCla.build(user_cla_params, current_user.id)
end
elsif @user_cla.state == "failed"
@user_cla.update_by_params(user_cla_params)
elsif @user_cla.state == "signed"
return render_error('协议生效中,请勿重复签署')
end
render_ok
rescue Exception => e

View File

@ -40,6 +40,7 @@ class Cla < ApplicationRecord
user_clas.where(user_id: user_id, state:1).present?
end
def fresh_count
update(count:self.users.count)
number = self.user_clas.where(state: 1).count
update(count: number)
end
end

View File

@ -10,6 +10,7 @@
# state :integer default("0")
# created_at :datetime not null
# updated_at :datetime not null
# sign_time :datetime
#
# Indexes
#
@ -22,7 +23,8 @@ class UserCla < ApplicationRecord
belongs_to :cla
# identity 0: 教师教授 1: 学生, 2: 专业人士, 3: 开发者
enum state: { deafult: 0, signed: 1, failed: 2}
after_create do
after_save do
cla.fresh_count
end
@ -35,10 +37,20 @@ class UserCla < ApplicationRecord
cla_id: params[:cla_id],
real_name: params[:real_name],
email: params[:email],
sign_time: Time.now,
state: 1
)
end
def update_by_params(params)
update(\
state: 1,
sign_time: Time.now,
real_name: params[:real_name],
email: params[:email],
)
end
def fresh_pull_request
project_ids = cla.organization.projects.pluck(:id)
if state == "signed"

View File

@ -0,0 +1,83 @@
class Projects::VerifyAuthTokenService < ApplicationService
attr_accessor :url, :token
def initialize(url, token)
@url = url
@token = token
@repo = nil
@owner = nil
@website = nil
@success = nil
end
def call
Rails.logger.info("###### VerifyAuthTokenService begin ######")
regular_url
to_verify
Rails.logger.info("##### VerifyAuthTokenService end ######")
return @success
end
private
def regular_url
regx = /\/\/[\s\S]*.git$/ #获取字串
data = (regx.match @url).to_s[2..-5].split("/")
@website = data[0]
@owner = data[1]
@repo = data[2]
end
def to_verify
data = case @website
when "github.com"
github_verify
when "gitlab.com"
gitlab_verify
when "gitee.com"
gitee_verify
end
end
def gitee_verify
url = "/api/v5/repos/#{@owner}/#{@repo}"
api_url= "https://gitee.com"
client = Faraday.new(url: api_url)
client.options["open_timeout"] = 1
client.options["timeout"] = 1
client.options["write_timeout"] = 1
req_params={
access_token: @token,
owner: @owner,
repo: @repo
}
response = client.public_send("get", url, req_params)
@success = true if response.status == 200
end
def github_verify
url = "/octocat"
api_url= "https://api.github.com"
client = Faraday.new(url: api_url)
client.options["open_timeout"] = 1
client.options["timeout"] = 1
client.options["write_timeout"] = 1
client.headers["Authorization"] = "Bearer #{@token}"
response = client.public_send("get", url)
@success = true if response.status == 200
end
def gitlab_verify
url = "/api/v4/projects"
api_url= "https://gitlab.com"
client = Faraday.new(url: api_url)
client.options["open_timeout"] = 1
client.options["timeout"] = 1
client.options["write_timeout"] = 1
req_params={
private_token: @token
}
response = client.public_send("get", url, req_params)
@success = true if response.status == 200
end
end

View File

@ -20,7 +20,7 @@ class PullRequests::SendJournalService < ApplicationService
journalized_id: @issue.id ,
journalized_type: "Issue",
user_id: sender_id ,
notes: "@#{@current_user.nickname} 您好!欢迎参与 #{@project.name} 的贡献。首次进行贡献请完成《<a href='/#{@project.owner.login}/cla/#{@project.owner.cla.key}' target='_blank'>#{@project.owner.cla.name}</a>》的签署,签署完成后,项目成员才可查看到您的合并请求",
notes: "<b>#{@current_user.nickname}</b>您好!欢迎参与 #{@project.name} 的贡献。首次进行贡献请完成《<a href='/#{@project.owner.login}/cla/#{@project.owner.cla.key}' target='_blank'>#{@project.owner.cla.name}</a>》的签署,签署完成后,项目成员才可查看到您的合并请求",
}
journal = Journal.new journal_params
if journal.save

View File

@ -2,7 +2,7 @@ json.id user_cla.id
json.real_name user_cla.real_name
json.email user_cla.email
json.state user_cla.state
json.created_at format_time(user_cla.created_at)
json.created_at format_time(user_cla.sign_time)
json.cla do
json.partial! "/organizations/clas/detail", locals: {cla: user_cla.cla}
end

View File

@ -241,6 +241,7 @@ Rails.application.routes.draw do
get :group_type_list
get :recommend
get :banner_recommend
post :verify_auth_token
end
end

View File

@ -0,0 +1,5 @@
class AddSignTimeToUserClas < ActiveRecord::Migration[5.2]
def change
add_column :user_clas, :sign_time, :datetime
end
end