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