223 lines
9.5 KiB
Ruby
223 lines
9.5 KiB
Ruby
module ProjectsHelper
|
||
def menu_hash_by_name(name)
|
||
{
|
||
menu_name: name
|
||
}
|
||
end
|
||
|
||
def render_zh_project_type(project_type)
|
||
case project_type
|
||
when 'common' then "开源托管项目"
|
||
when 'sync_mirror' then "镜像托管项目"
|
||
when 'mirror' then "开源镜像项目"
|
||
end
|
||
end
|
||
|
||
def render_zip_url(owner, repository, archive)
|
||
[base_url, archive_repositories_path(owner&.login, repository, "#{archive}.zip")].join
|
||
end
|
||
|
||
def render_tar_url(owner, repository, archive)
|
||
[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/#{CGI.escape(filepath)}?ref=#{CGI.escape(ref)}"].join
|
||
end
|
||
|
||
def render_http_url(project)
|
||
[gitea_domain, project.owner.login, "#{project.identifier}.git"].join('/')
|
||
end
|
||
|
||
def gitea_domain
|
||
GiteaService.gitea_config[:domain]
|
||
end
|
||
|
||
def find_user_by_login_or_mail(identifier)
|
||
(User.find_by_login identifier) || (User.find_by_mail identifier)
|
||
end
|
||
|
||
def json_response(project, user)
|
||
repo = Repository.includes(:mirror).select(:id, :is_mirror, :mirror_url, :source_clone_url).find_by(project: project)
|
||
|
||
tmp_json = {}
|
||
unless project.common?
|
||
tmp_json = tmp_json.merge({
|
||
is_mirror: repo.is_mirror ? true : false,
|
||
mirror_status: repo.mirror_status,
|
||
mirror_num: repo.mirror_num,
|
||
mirror_url: repo.remote_mirror_url,
|
||
first_sync: repo.first_sync?
|
||
})
|
||
end
|
||
|
||
tmp_json = tmp_json.merge({
|
||
identifier: render_identifier(project),
|
||
name: project.name,
|
||
platform: project.platform,
|
||
id: project.id,
|
||
repo_id: repo.id,
|
||
open_devops: (user.blank? || user.is_a?(AnonymousUser)) ? false : project.open_devops?,
|
||
type: project.numerical_for_project_type,
|
||
author: render_owner(project),
|
||
project_category_id: project.project_category_id,
|
||
project_language_id: project.project_language_id,
|
||
license_id: project.license_id,
|
||
jianmu_devops: jianmu_devops_code(project, user),
|
||
jianmu_devops_url: jianmu_devops_url,
|
||
cloud_ide_saas_url: cloud_ide_saas_url(user),
|
||
open_blockchain: Site.has_blockchain? && project.use_blockchain,
|
||
ignore_id: project.ignore_id
|
||
}).compact
|
||
|
||
render json: tmp_json
|
||
end
|
||
|
||
def render_owner(project)
|
||
if project.educoder?
|
||
{
|
||
login: project.project_educoder.owner,
|
||
name: project.project_educoder.owner,
|
||
type: 'Educoder',
|
||
image_url: project.project_educoder.image_url
|
||
}
|
||
else
|
||
{
|
||
login: @owner.login,
|
||
name: @owner.real_name,
|
||
type: @owner.type,
|
||
image_url: url_to_avatar(@owner)
|
||
}
|
||
end
|
||
end
|
||
|
||
def render_identifier(project)
|
||
project.educoder? ? project.project_educoder&.repo_name&.split('/')[1] : project.identifier
|
||
end
|
||
|
||
def render_author(project)
|
||
project.educoder? ? project.project_educoder&.repo_name&.split('/')[0] : project.owner.login
|
||
end
|
||
|
||
def render_educoder_avatar_url(project_educoder)
|
||
[Rails.application.config_for(:configuration)['educoder']['cdn_url'], project_educoder&.image_url].join('/')
|
||
end
|
||
|
||
# 静默登录方式:
|
||
#
|
||
# 数据格式为JSON:
|
||
# {
|
||
# "userId": "xxx", // 用户唯一标识
|
||
# "ref": "xxx", // 仓库唯一标识
|
||
# "owner": "xxx", // 用户登录名或组织账号
|
||
# "timestamp": xxx // 当前时间戳,单位:毫秒
|
||
# }
|
||
# 加密方式:把数据序列化成JSON字符串,用Client Secret和固定IV(5183666c72eec9e4)对称加密(模式:AES-256-CBC)
|
||
#
|
||
# API:
|
||
# GET:https://ci-v3.test.jianmuhub.com/oauth2/authorize?code=${encode(密文)}
|
||
def jianmu_devops_code(project, user)
|
||
if user.admin? || project.member?(user.id)
|
||
data = { userId: user.id, ref: project.identifier, owner: project.owner.login, timestamp: Time.now.to_i * 1000 }
|
||
# uid = EduSetting.get("jianmu_oauth2_uid") || 'oedKx4v-WyAfu2oy_AsFpFQCH_-g91ms0PQKN7YcEuw'
|
||
# app = Doorkeeper::Application.find_by(uid: uid)
|
||
key = 'bf3c199c2470cb477d907b1e0917c17b'
|
||
aes_encrypt(key, data.to_json)
|
||
end
|
||
end
|
||
|
||
def jianmu_devops_url
|
||
EduSetting.get("jianmu_devops_url") || "https://ci-v3.test.jianmuhub.com"
|
||
end
|
||
|
||
|
||
def cloud_ide_saas_url(user)
|
||
"" unless user.logged?
|
||
token = Token.get_token_from_user(user, "autologin")
|
||
oauth_url = "#{Rails.application.config_for(:configuration)['platform_url']}/api/users/info.json"
|
||
saas_url = EduSetting.get("cloud_ide_saas_url") || "https://saasfactory.test.opentrs.com"
|
||
"#{saas_url}/oauth/login?product_account_id=PA1001218&tenant_code=TI1001383&oauth_url=#{oauth_url}&token=#{token.value}"
|
||
end
|
||
|
||
def ai_shang_v1_url(project)
|
||
url = EduSetting.get("ai_shang_url") || "https://shang.gitlink.org.cn"
|
||
case project.identifier.to_s.downcase
|
||
when nil then ""
|
||
when 'rails' then "#{url}/v1/rails/entropy"
|
||
when 'jittor' then "#{url}/v1/jittor/entropy"
|
||
when 'paddle' then "#{url}/v1/Paddle/entropy"
|
||
when 'vue' then "#{url}/v1/vue/entropy"
|
||
when 'bootstrap' then "#{url}/v1/bootstrap/entropy"
|
||
when 'tensorflow' then "#{url}/v1/tensorflow/entropy"
|
||
when 'kernel' then "#{url}/v1/openeuler/entropy"
|
||
when 'opengauss-server' then "#{url}/v1/opengauss/entropy"
|
||
when 'mindspore' then "#{url}/v1/mindspore/entropy"
|
||
else ''
|
||
end
|
||
end
|
||
|
||
def ai_shang_v2_url(project)
|
||
url = EduSetting.get("ai_shang_url") || "https://shang.gitlink.org.cn"
|
||
case project.identifier.to_s.downcase
|
||
when nil then ""
|
||
when 'rails' then "#{url}/v2/getMediumData?repo_login=rails&repo_name=rails"
|
||
when 'jittor' then "#{url}/v2/getMediumData?repo_login=Jittor&repo_name=jittor"
|
||
when 'paddle' then "#{url}/v2/getMediumData?repo_login=PaddlePaddle&repo_name=Paddle"
|
||
when 'vue' then "#{url}/v2/getMediumData?repo_login=vuejs&repo_name=vue"
|
||
when 'bootstrap' then "#{url}/v2/getMediumData?repo_login=twbs&repo_name=bootstrap"
|
||
when 'tensorflow' then "#{url}/v2/getMediumData?repo_login=tensorflow&repo_name=tensorflow"
|
||
when 'kernel' then "#{url}/v2/getMediumData?repo_login=openeuler&repo_name=kernel"
|
||
when 'opengauss-server' then "#{url}/v2/getMediumData?repo_login=opengauss&repo_name=openGauss-server"
|
||
when 'mindspore' then "#{url}/v2/getMediumData?repo_login=mindspore&repo_name=mindspore"
|
||
else ''
|
||
end
|
||
end
|
||
|
||
def ai_shang_v4_url(project)
|
||
url = EduSetting.get("ai_shang_url") || "https://shang.gitlink.org.cn"
|
||
case project.identifier.to_s.downcase
|
||
when nil then ""
|
||
when 'rails' then "#{url}/v2/getIndexData?repo_login=rails&repo_name=rails"
|
||
when 'jittor' then "#{url}/v2/getIndexData?repo_login=Jittor&repo_name=jittor"
|
||
when 'paddle' then "#{url}/v2/getIndexData?repo_login=PaddlePaddle&repo_name=Paddle"
|
||
when 'vue' then "#{url}/v2/getIndexData?repo_login=vuejs&repo_name=vue"
|
||
when 'bootstrap' then "#{url}/v2/getIndexData?repo_login=twbs&repo_name=bootstrap"
|
||
when 'tensorflow' then "#{url}/v2/getIndexData?repo_login=tensorflow&repo_name=tensorflow"
|
||
when 'kernel' then "#{url}/v2/getIndexData?repo_login=openeuler&repo_name=kernel"
|
||
when 'opengauss-server' then "#{url}/v2/getIndexData?repo_login=opengauss&repo_name=openGauss-server"
|
||
when 'mindspore' then "#{url}/v2/getIndexData?repo_login=mindspore&repo_name=mindspore"
|
||
else ''
|
||
end
|
||
end
|
||
|
||
def ai_shang_v3_url(project)
|
||
url = EduSetting.get("ai_shang_v3_url") || "https://shang.gitlink.org.cn/v3"
|
||
case project.identifier.to_s.downcase
|
||
when nil then ""
|
||
when 'rails' then "#{url}/rails/entropy"
|
||
when 'jittor' then "#{url}/jittor/entropy"
|
||
when 'paddle' then "#{url}/paddle/entropy"
|
||
when 'vue' then "#{url}/vue/entropy"
|
||
when 'bootstrap' then "#{url}/bootstrap/entropy"
|
||
when 'tensorflow' then "#{url}/tensorflow/entropy"
|
||
when 'kernel' then "#{url}/openeuler/entropy"
|
||
when 'opengauss-server' then "#{url}/opengauss/entropy"
|
||
when 'mindspore' then "#{url}/mindspore/entropy"
|
||
else ''
|
||
end
|
||
end
|
||
|
||
def aes_encrypt(key, des_text)
|
||
# des_text='{"access_key_id":"STS.NTuC9RVmWfJqj3JkcMzPnDf7X","access_key_secret":"E8NxRZWGNxxMfwgt5nFLnBFgg6AzgXCZkSNCyqygLuHM","end_point":"oss-accelerate.aliyuncs.com","security_token":"CAIS8gF1q6Ft5B2yfSjIr5fACIPmu7J20YiaaBX7j2MYdt9Cq6Ocujz2IHhMenVhA+8Wv/02n2hR7PcYlq9IS55VWEqc/VXLaywQo22beIPkl5Gfz95t0e+IewW6Dxr8w7WhAYHQR8/cffGAck3NkjQJr5LxaTSlWS7OU/TL8+kFCO4aRQ6ldzFLKc5LLw950q8gOGDWKOymP2yB4AOSLjIx6lAt2T8vs/7hmZPFukSFtjCglL9J/baWC4O/csxhMK14V9qIx+FsfsLDqnUIs0YWpf0p3P0doGyf54vMWUM05A6dduPS7txkLAJwerjVl1/ADxc0/hqAASXhPeiktbmDjwvnSn4iKcSGQ+xoQB468eHXNdvf13dUlbbE1+JhRi0pZIB2UCtN9oTsLHcwIHt+EJaoMd3+hGwPVmvHSXzECDFHylZ8l/pzTwlE/aCtZyVmI5cZEvmWu2xBa3GRbULo7lLvyeX1cHTVmVWf4Nk6D09PzTU8qlAj","bucket":"edu-bigfiles1","region":"oss-cn-hangzhou","callback_url":"https://data.educoder.net/api/buckets/callback.json","bucket_host":"data.educoder.net"}'
|
||
# des = OpenSSL::Cipher::Cipher.new('aes-256-ctr')
|
||
des = OpenSSL::Cipher.new('AES-256-CBC')
|
||
des.encrypt
|
||
# des.padding =
|
||
des.key = key
|
||
des.iv = "5183666c72eec9e4"
|
||
result = des.update(des_text)
|
||
result << des.final
|
||
Base64.strict_encode64 result
|
||
end
|
||
end
|