| @@ -245,7 +245,7 @@ class AccountsController < ApplicationController | |||
| end | |||
| def set_autologin_cookie(user) | |||
| token = Token.get_or_create_permanent_login_token(user, "autologin") | |||
| token = Token.get_or_create_permanent_login_token(user, autologin_cookie_name) | |||
| cookie_options = { | |||
| :value => token.value, | |||
| :expires => 1.month.from_now, | |||
| @@ -373,7 +373,7 @@ class ApplicationController < ActionController::Base | |||
| # auto-login feature starts a new session | |||
| user = nil | |||
| Rails.logger.info("111111111111111111#{default_yun_session}, session is #{session[:"#{default_yun_session}"]} ") | |||
| user = User.try_to_autologin(cookies[autologin_cookie_name]) | |||
| user = User.try_to_autologin(cookies[autologin_cookie_name], autologin_cookie_name) | |||
| # start_user_session(user) if user # TODO 解决sso退出不同步的问题 | |||
| user | |||
| end | |||
| @@ -33,6 +33,7 @@ class AttachmentsController < ApplicationController | |||
| # 2. 上传到云 | |||
| begin | |||
| upload_file = params["file"] || params["#{params[:file_param_name]}"]# 这里的file_param_name是为了方便其他插件名称 | |||
| dun_check_file = upload_file.dup | |||
| uid_logger("#########################file_params####{params["#{params[:file_param_name]}"]}") | |||
| raise "未上传文件" unless upload_file | |||
| @@ -71,7 +72,15 @@ class AttachmentsController < ApplicationController | |||
| @attachment.author_id = current_user.id | |||
| @attachment.disk_directory = month_folder | |||
| @attachment.cloud_url = remote_path | |||
| @attachment.save! | |||
| # @attachment.save! | |||
| if @attachment.save! | |||
| check_result = Attachment.check_image_able(dun_check_file) | |||
| if check_result[:status].to_i == -1 | |||
| @attachment.destroy | |||
| raise "上传失败,#{check_result[:message]}" | |||
| # return render json: {status: -1, message: "上传失败,#{check_result[:message]}" } | |||
| end | |||
| end | |||
| else | |||
| logger.info "文件已存在,id = #{@attachment.id}, filename = #{@attachment.filename}" | |||
| end | |||
| @@ -6,12 +6,12 @@ module LoginHelper | |||
| end | |||
| def autologin_cookie_name | |||
| edu_setting('autologin_cookie_name').presence || 'autologin' | |||
| edu_setting('autologin_cookie_name').presence || 'autologin_forge_military' | |||
| end | |||
| def set_autologin_cookie(user) | |||
| token = Token.get_or_create_permanent_login_token(user, "autologin") | |||
| Rails.logger.info "###### def set_autologin_cookie and get_or_create_permanent_login_token result: #{token&.value}" | |||
| Rails.logger.info("set_cookie_user_id is=======> #{user.id}") | |||
| token = Token.get_or_create_permanent_login_token(user, autologin_cookie_name) | |||
| cookie_options = { | |||
| :value => token.value, | |||
| :expires => 1.month.from_now, | |||
| @@ -140,7 +140,7 @@ class IssuesController < ApplicationController | |||
| # normal_status(0, "创建成功",) | |||
| render :json => { status: 0, message: "创建成功", id: @issue.id} | |||
| else | |||
| normal_status(-1, "创建失败") | |||
| normal_status(-1, @issue.errors.messages.values[0][0]) | |||
| end | |||
| end | |||
| @@ -202,7 +202,7 @@ class IssuesController < ApplicationController | |||
| @issue.create_journal_detail(change_files, issue_files, issue_file_ids, current_user&.id) | |||
| normal_status(0, "更新成功") | |||
| else | |||
| normal_status(-1, "更新失败") | |||
| normal_status(-1, @issue.errors.messages.values[0][0]) | |||
| end | |||
| end | |||
| @@ -46,7 +46,7 @@ class JournalsController < ApplicationController | |||
| render :json => { status: 0, message: "评论成功", id: journal.id} | |||
| # normal_status(0, "评论成功") | |||
| else | |||
| normal_status(-1, "评论失败") | |||
| normal_status(-1, journal.errors.messages.values[0][0]) | |||
| end | |||
| end | |||
| end | |||
| @@ -70,7 +70,7 @@ class JournalsController < ApplicationController | |||
| if @journal.update_attribute(:notes, content) | |||
| normal_status(0, "更新成功") | |||
| else | |||
| normal_status(-1, "更新失败") | |||
| normal_status(-1, @journal.errors.messages.values[0][0]) | |||
| end | |||
| else | |||
| normal_status(-1, "评论的内容不能为空") | |||
| @@ -96,8 +96,10 @@ class PullRequestsController < ApplicationController | |||
| normal_status(-1, "PullRequest创建失败") | |||
| end | |||
| else | |||
| normal_status(-1, "PullRequest创建失败") | |||
| normal_status(-1, local_requests.errors.messages.values[0][0]) | |||
| end | |||
| else | |||
| normal_status(-1, pull_issue.errors.messages.values[0][0]) | |||
| end | |||
| rescue => e | |||
| normal_status(-1, e.message) | |||
| @@ -147,8 +149,10 @@ class PullRequestsController < ApplicationController | |||
| normal_status(-1, "PullRequest更新失败") | |||
| end | |||
| else | |||
| normal_status(-1, "PullRequest更新失败") | |||
| normal_status(-1, @pull_request.errors.messages.values[0][0]) | |||
| end | |||
| else | |||
| normal_status(-1, @issue.errors.messages.values[0][0]) | |||
| end | |||
| rescue => e | |||
| normal_status(-1, e.message) | |||
| @@ -12,11 +12,11 @@ class SyncForgeController < ApplicationController | |||
| end | |||
| end | |||
| # def create | |||
| # def create | |||
| # ActiveRecord::Base.transaction do | |||
| # params.permit! | |||
| # sync_params = params[:sync_params] | |||
| # project_user = User.where(login: sync_params[:owner_login])&.first | |||
| # project_user = User.where(login: sync_params[:owner_login])&.first | |||
| # #以前已同步的项目,那么肯定存在仓库 | |||
| # SyncLog.sync_log("=================begin_to_sync_forge: project_identifier: #{sync_params[:identifier]}========") | |||
| # user_projects = Project.where(user_id: project_user.id) | |||
| @@ -38,7 +38,7 @@ class SyncForgeController < ApplicationController | |||
| # check_sync_project(project, sync_params) | |||
| # else #新建项目 | |||
| # SyncLog.sync_log("=================begin_to_create_new_project========") | |||
| # project_params = { | |||
| # repository_name: sync_params[:identifier], | |||
| # user_id: project_user.id, | |||
| @@ -53,7 +53,7 @@ class SyncForgeController < ApplicationController | |||
| # new_project_score = ProjectScore.create(score_params) | |||
| # SyncLog.sync_log("=================new_project_score:#{new_project_score.try(:id)}========") | |||
| # end | |||
| # SyncRepositoryJob.perform_later(sync_params[:owner_login], sync_params[:identifier], sync_params[:repository], get_sudomain) if sync_params[:repository].present? | |||
| # check_new_project(project, sync_params) | |||
| # else | |||
| @@ -115,7 +115,7 @@ class SyncForgeController < ApplicationController | |||
| # SyncLog.sync_log("=================sync_user_failed====#{e}") | |||
| # end | |||
| # private | |||
| # private | |||
| # def check_sync_project(project,sync_params) | |||
| # begin | |||
| @@ -125,8 +125,8 @@ class SyncForgeController < ApplicationController | |||
| # # end | |||
| # SyncLog.sync_log("----begin_to_check_sync_project----project_id:#{project.id}---------------") | |||
| # change_project_score(project, sync_params[:project_score], sync_params[:repository]) if sync_params[:repository].present? #更新project_score | |||
| # change_project_issues(project, sync_params[:issues],project.id, gitea_main) | |||
| # change_project_score(project, sync_params[:project_score], sync_params[:repository]) if sync_params[:repository].present? #更新project_score | |||
| # change_project_issues(project, sync_params[:issues],project.id, gitea_main) | |||
| # change_project_members(project, sync_params[:members],gitea_main) | |||
| # change_project_versions(project, sync_params[:project_versions],gitea_main) | |||
| # change_project_watchers(project, sync_params[:project_watchers],gitea_main) | |||
| @@ -134,7 +134,7 @@ class SyncForgeController < ApplicationController | |||
| # rescue => e | |||
| # SyncLog.sync_log("=========check_sync_project_errors:#{e}===================") | |||
| # end | |||
| # end | |||
| # def check_new_project(project,sync_params) | |||
| @@ -167,7 +167,7 @@ class SyncForgeController < ApplicationController | |||
| # parent_id: project.id | |||
| # } | |||
| # SyncProjectsJob.perform_later(sync_projects_params,gitea_main) | |||
| # SyncLog.sync_log("***6. end_to_sync_parises---------------") | |||
| # end | |||
| # end | |||
| @@ -189,7 +189,7 @@ class SyncForgeController < ApplicationController | |||
| # end | |||
| # end | |||
| # pre_project_score.save! if change_num > 0 #如果 project_score有变化则更新 | |||
| # else | |||
| # else | |||
| # ProjectScore.create!(project_scores.merge(project_id: project.id)) | |||
| # end | |||
| # SyncLog.sync_log("***1. end_to_sync_project_score---------------") | |||
| @@ -206,7 +206,7 @@ class SyncForgeController < ApplicationController | |||
| # SyncLog.sync_log("***2--01. forge_issue_ids-#{forge_issue_ids.size.to_i}--------------") | |||
| # if forge_issue_ids.size.to_i <= old_issues_params[:count].to_i | |||
| # diff_issue_ids = old_issues_params[:ids] - forge_issue_ids | |||
| # if diff_issue_ids.size == 0 #issue数量一样,判断评论是否有增减 | |||
| # forge_journal_ids = Journal.select([:id, :journalized_id, :journalized_type]).where(journalized_id: forge_issue_ids).pluck(:id) | |||
| # diff_journal_ids = old_issues_params[:journals][:ids] - forge_journal_ids | |||
| @@ -241,10 +241,10 @@ class SyncForgeController < ApplicationController | |||
| # # } | |||
| # # SyncLog.sync_log("***2--03. sync_projects_params_groups-#{sync_projects_params}--------------") | |||
| # # SyncProjectsJob.perform_later(sync_projects_params, gitea_main) | |||
| # end | |||
| # end | |||
| # # SyncProjectsJob.perform_later(sync_projects_params, gitea_main) if sync_projects_params.present? | |||
| # SyncLog.sync_log("***2. end_to_syncissues---------------") | |||
| # rescue Exception => e | |||
| @@ -265,7 +265,7 @@ class SyncForgeController < ApplicationController | |||
| # parent_id: project.id | |||
| # } | |||
| # SyncProjectsJob.perform_later(sync_projects_params,gitea_main) | |||
| # end | |||
| # end | |||
| # SyncLog.sync_log("***5. begin_to_sync_watchers---------------") | |||
| @@ -285,7 +285,7 @@ class SyncForgeController < ApplicationController | |||
| # } | |||
| # SyncProjectsJob.perform_later(sync_projects_params,gitea_main) | |||
| # end | |||
| # SyncLog.sync_log("***4. end_to_sync_versions---------------") | |||
| # end | |||
| # end | |||
| @@ -304,12 +304,13 @@ class SyncForgeController < ApplicationController | |||
| # } | |||
| # SyncProjectsJob.perform_later(sync_projects_params,gitea_main) | |||
| # end | |||
| # SyncLog.sync_log("***3. end_to_sync_members---------------") | |||
| <<<<<<< HEAD | |||
| # end | |||
| # end | |||
| # def check_token | |||
| # def check_token | |||
| # sync_params = params[:sync_params] | |||
| # unless sync_params[:token] && sync_params[:token] == get_token | |||
| # render json: {message: "token_errors"} | |||
| @@ -320,6 +321,22 @@ class SyncForgeController < ApplicationController | |||
| # "34c82f51e0b699d9d16d70fd6497c9b1e4821d6ea3e872558a6537a091076b8e" | |||
| # end | |||
| ======= | |||
| # end | |||
| # end | |||
| # # def check_token | |||
| # # sync_params = params[:sync_params] | |||
| # # unless sync_params[:token] && sync_params[:token] == get_token | |||
| # # render json: {message: "token_errors"} | |||
| # # end | |||
| # # end | |||
| # def get_token | |||
| # "34c82f51e0b699d9d16d70fd6497c9b1e4821d6ea3e872558a6537a091076b8e" | |||
| # end | |||
| >>>>>>> e0bedf175fa89ad61d0759c620f4050758307288 | |||
| # def get_sudomain | |||
| # SyncLog.sync_log("=================request.subdomain:#{request.subdomain}========") | |||
| # gitea_main = "gitea.trustie.net" | |||
| @@ -331,4 +348,4 @@ class SyncForgeController < ApplicationController | |||
| # return gitea_main | |||
| # end | |||
| end | |||
| end | |||
| @@ -140,8 +140,7 @@ class UsersController < ApplicationController | |||
| # 其他平台登录后,必须将token同步到forge平台,实现sso登录功能 | |||
| def sync_token | |||
| return render_error('未找相关用户!') unless @user | |||
| token = Token.get_or_create_permanent_login_token(@user, 'autologin') | |||
| token = Token.get_or_create_permanent_login_token(@user, autologin_cookie_name) | |||
| token.update_column(:value, params[:token]) | |||
| render_ok | |||
| end | |||
| @@ -83,7 +83,7 @@ class VersionsController < ApplicationController | |||
| if version.save | |||
| normal_status(0, "里程碑创建成功") | |||
| else | |||
| normal_status(-1, "里程碑创建失败") | |||
| normal_status(-1, version.errors.messages.values[0][0]) | |||
| end | |||
| end | |||
| @@ -121,7 +121,7 @@ class VersionsController < ApplicationController | |||
| if @version.update_attributes(tag_params) | |||
| normal_status(0, "里程碑更新成功") | |||
| else | |||
| normal_status(-1, "里程碑更新失败") | |||
| normal_status(-1, version.errors.messages.values[0][0]) | |||
| end | |||
| end | |||
| else | |||
| @@ -1,13 +1,24 @@ | |||
| class Contents::CreateForm < BaseForm | |||
| attr_accessor :filepath, :branch, :new_branch | |||
| attr_accessor :filepath, :branch, :new_branch, :content | |||
| validates :filepath, presence: true | |||
| validate :check_branch | |||
| validate :dun_content_check | |||
| def check_branch | |||
| raise "branch和new_branch必须存在一个 " if branch.blank? && new_branch.blank? | |||
| # raise "branch和new_branch只能存在一个" if !branch.blank? && !new_branch.blank? | |||
| end | |||
| def dun_content_check | |||
| if content.present? | |||
| check_result = DunCheck::TextCheck.new({title: "", content: content}).call | |||
| if check_result[:status].to_i == -1 | |||
| raise "内容含有:#{check_result[:extra_params][:infos]},请修改" | |||
| end | |||
| end | |||
| end | |||
| end | |||
| @@ -149,7 +149,7 @@ module ApplicationHelper | |||
| File.join("images/avatars", ["#{source.class}", "#{source.id}"]) + "?t=#{ctime}" | |||
| end | |||
| elsif source.class.to_s == 'User' | |||
| str = source.user_extension.try(:gender).to_i == 0 ? "b" : "g" | |||
| str = source.user_extension.try(:gender).to_i == 0 ? "boy.jpg" : "girl.jpg" | |||
| File.join(relative_path, "#{source.class}", str) | |||
| elsif source.class.to_s == 'Subject' | |||
| File.join("images","educoder", "index", "subject", "subject#{rand(17)}.jpg") | |||
| @@ -47,7 +47,8 @@ module Gitea | |||
| { | |||
| filepath: @params[:filepath], | |||
| branch: @params[:branch], | |||
| new_branch: @params[:new_branch] | |||
| new_branch: @params[:new_branch], | |||
| content: @params[:content] | |||
| } | |||
| end | |||
| @@ -0,0 +1,48 @@ | |||
| class SyncForgeProjectJob < ApplicationJob | |||
| queue_as :default | |||
| def perform(sync_parmas) | |||
| # sync_parmas.permit! | |||
| Rails.logger.info("=======begin to sync forge projects, and sync_parmas: #{sync_parmas}") | |||
| get_rand_user = rand_user | |||
| project_params = sync_parmas[:project] | |||
| repository_params = sync_parmas[:repository] | |||
| project_socre_params = sync_parmas[:project_socre] | |||
| begin | |||
| unless Project.select(:identifier).exists?(identifier: project_params[:identifier]) | |||
| project_params = project_params.merge({user_id: get_rand_user.id }) | |||
| project = Project.new(project_params) | |||
| if project.save | |||
| repository_params = { | |||
| hidden: false, | |||
| identifier: repository_params[:identifier], | |||
| mirror_url: repository_params[:url].to_s.gsub("https://gitea.", "https://git."), | |||
| user_id: get_rand_user.id, | |||
| login: get_rand_user.login, | |||
| password: "", | |||
| is_mirror: false | |||
| } | |||
| Repositories::MigrateService.new(get_rand_user, project, repository_params).call | |||
| project_score = ProjectScore.new(project_socre_params.merge({project_id: project.id})) | |||
| project_score.save | |||
| end | |||
| end | |||
| Rails.logger.info("=======end to sync forge projects") | |||
| rescue => e | |||
| Rails.logger.info("=======sync forge projects has errors: #{e}") | |||
| raise ActiveRecord::Rollback | |||
| end | |||
| end | |||
| private | |||
| def rand_user | |||
| user_ids = User.select(:id, :type, :gitea_token, :gitea_uid).where("gitea_token is not null and gitea_uid is not null and type = ?", "User").pluck(:id) | |||
| range_user_id = user_ids[rand(user_ids.length-1)] | |||
| rand_sync_user = User.find_by_id(range_user_id) #生成随机用户 | |||
| unless rand_sync_user.present? | |||
| rand_user | |||
| end | |||
| rand_sync_user | |||
| end | |||
| end | |||
| @@ -6,6 +6,6 @@ class SyncMirroredRepositoryJob < ApplicationJob | |||
| current_user = User.find_by(id: user_id) | |||
| return if repo.blank? || current_user.blank? | |||
| result = Gitea::Repository::SyncMirroredService.new(repo.user.login, repo.identifier, token: current_user.gitea_token).call | |||
| repo&.mirror.set_status! if result[:status] === 200 | |||
| repo&.mirror&.set_status! if result[:status] == 200 && repo.mirror.present? | |||
| end | |||
| end | |||
| @@ -0,0 +1,167 @@ | |||
| class DunCheck::ImageCheck | |||
| #检测结果,0:通过,1:嫌疑,2:不通过 | |||
| # include ActionView::Helpers::LoopTextsHelper | |||
| require 'uri' | |||
| require 'net/http' | |||
| def initialize(image_params) | |||
| @image_params = image_params | |||
| end | |||
| def call | |||
| begin | |||
| Rails.logger.info("==========@image_params===========#{@image_params}") | |||
| dun_params = check_dun_params(@image_params) | |||
| api_url = EduSetting.get("dun_image_api") | |||
| uri = URI.parse(api_url) | |||
| http = Net::HTTP.new(uri.hostname, uri.port) | |||
| if api_url.include?("https://") | |||
| http.use_ssl = true | |||
| end | |||
| dun_params_str = URI.encode_www_form(dun_params) | |||
| header = {'content-type':'application/x-www-form-urlencoded'} | |||
| response = http.post(uri.path, dun_params_str, header) | |||
| response_body = JSON.parse(response.body) | |||
| if response_body["code"].to_i == 200 | |||
| response_body_result = response_body["antispam"] | |||
| response_lables = response_body_result[0]["labels"] | |||
| return_sub_lable = "" | |||
| if response_lables.present? | |||
| return_sub_lable = get_sub_labels(response_lables) | |||
| end | |||
| render_status = response_body_result[0]["action"].to_i == 0 ? 1 : -1 | |||
| tip_status(render_status, return_sub_lable.present? ? "图片含有: #{return_sub_lable}" : response_body["msg"] ) | |||
| else | |||
| tip_status(-1, response_body["msg"]) | |||
| end | |||
| rescue Exception => ex | |||
| Rails.logger.info "*** transaction abored!" | |||
| Rails.logger.info "*** errors: #{ex.message}" | |||
| tip_status(-1, "检测失败") | |||
| end | |||
| end | |||
| private | |||
| def check_dun_params(image_params) | |||
| dun_public_params = DunCheck::PublicParams.new("image") | |||
| check_params = { | |||
| version: "v4", | |||
| images: image_params.to_json | |||
| } | |||
| check_params.merge!(dun_public_params.call) | |||
| dun_params = dun_public_params.generate_sign(check_params) | |||
| return dun_params | |||
| end | |||
| def tip_status(status, message, msg_params={}) | |||
| return {status: status, message: message, extra_params: msg_params} | |||
| end | |||
| def get_sub_labels(labels) | |||
| _sub_labels = [] | |||
| labels.each do |label| | |||
| error_label = label["subLabels"].present? ? label["subLabels"][0]["subLabel"] : "" | |||
| if error_label.present? | |||
| _sub_labels.push(sub_lables[:"#{error_label.to_s}"]) | |||
| end | |||
| end | |||
| return _sub_labels.present? ? _sub_labels.join(",") : "" | |||
| end | |||
| def sub_lables | |||
| { | |||
| "10000": "色情", | |||
| "10001": "女下体", | |||
| "10002": "女胸", | |||
| "10003": "男下体", | |||
| "10004": "性行为", | |||
| "10005": "臀部", | |||
| "10006": "口交", | |||
| "10007": "卡通色情", | |||
| "10008": "色情人物", | |||
| "10009": "儿童色情", | |||
| "11000": "性感低俗", | |||
| "11001": "亲吻", | |||
| "11002": "腿部特写", | |||
| "11003": "非漏点赤膊", | |||
| "11004": "胸部", | |||
| "100001": "色情文字-色情其他", | |||
| "100002": "色情文字-色情传播", | |||
| "100003": "色情文字-色情性器官", | |||
| "100004": "色情文字-色情挑逗", | |||
| "100005": "色情文字-色情低俗段子", | |||
| "100006": "色情文字-色情性行为", | |||
| "100007": "色情文字-色情舆情事件", | |||
| "100008": "色情文字-色情交友类", | |||
| "20000": "广告", | |||
| "20001": "广告带文字", | |||
| "200009": "广告文字-商业推广", | |||
| "200010": "广告文字-广告法", | |||
| "200011": "刷量行为", | |||
| "200012": "广告其他", | |||
| "260052": "广告文字-广告法-涉医疗用语", | |||
| "260053": "广告文字-广告法-迷信用语", | |||
| "260054": "广告文字-广告法-需要凭证", | |||
| "260055": "广告文字-广告法-限时性用语", | |||
| "260056": "广告文字-广告法-涉嫌诱导消费者", | |||
| "260057": "广告文字-广告法-涉嫌欺诈消费者", | |||
| "260058": "广告文字-广告法-法律风险较高", | |||
| "260059": "广告文字-广告法-极限词", | |||
| "21000": "二维码", | |||
| "30000": "暴恐", | |||
| "30001": "暴恐图集", | |||
| "30002": "暴恐旗帜", | |||
| "30003": "暴恐人物", | |||
| "30004": "暴恐标识", | |||
| "30005": "暴恐场景", | |||
| "300016": "暴恐文字-暴恐其他", | |||
| "40000": "违禁", | |||
| "40001": "违禁图集", | |||
| "40002": "违禁品", | |||
| "40003": "特殊标识", | |||
| "40004": "血腥模型", | |||
| "40005": "公职服饰", | |||
| "40006": "不文明", | |||
| "40007": "违禁人物", | |||
| "40008": "违禁场景", | |||
| "40009": "火焰", | |||
| "40010": "骷髅", | |||
| "40011": "货币", | |||
| "40012": "毒品", | |||
| "400017": "违禁文字-违禁其他", | |||
| "600018": "违禁文字-谩骂其他", | |||
| "50000": "涉政", | |||
| "50001": "涉政图集", | |||
| "50002": "中国地图", | |||
| "50003": "涉政人物", | |||
| "50004": "涉政旗帜", | |||
| "50005": "涉政标识", | |||
| "50006": "涉政场景", | |||
| "500013": "涉政文字-涉政其他", | |||
| "500014": "涉政文字-敏感专项", | |||
| "500015": "涉政文字-严格涉政", | |||
| "500039": "涉政文字-时事报道", | |||
| "500040": "涉政文字-领导人相关", | |||
| "500041": "涉政文字-英雄烈士相关", | |||
| "500042": "涉政文字-邪教迷信", | |||
| "500043": "涉政文字-落马官员相关", | |||
| "500044": "涉政文字-热点舆情", | |||
| "500045": "涉政文字-涉政综合", | |||
| "90000": "其他", | |||
| "90002": "自定义用户名单", | |||
| "90003": "自定义IP名单", | |||
| "900020": "文字违规-其他" | |||
| } | |||
| end | |||
| end | |||
| @@ -0,0 +1,31 @@ | |||
| class DunCheck::PublicParams | |||
| def initialize(type) | |||
| @type = type | |||
| end | |||
| def call | |||
| public_params = { | |||
| secretId: EduSetting.get("dun_secret_id"), | |||
| businessId: EduSetting.get("dun_#{@type}_businessId"), | |||
| timestamp: DateTime.current.strftime('%Q').to_i, | |||
| nonce: rand(10 ** 11).to_i | |||
| } | |||
| return public_params | |||
| end | |||
| def generate_sign(params) | |||
| secretkey = EduSetting.get("dun_secrect_key") | |||
| sort_params = params.sort.to_h | |||
| sign_str = "" | |||
| sort_params.each do |k,v| | |||
| sign_str += "#{k.to_s}#{v.to_s}" | |||
| end | |||
| sign_str += secretkey | |||
| md5_sign = Digest::MD5.hexdigest(sign_str.to_s.force_encoding("UTF-8")) | |||
| return sort_params.merge!(signature: md5_sign) | |||
| end | |||
| end | |||
| @@ -0,0 +1,164 @@ | |||
| class DunCheck::TextCheck | |||
| # include DunCheck::PublicParams | |||
| #text_params = { | |||
| # content: "ccc", #内容 | |||
| # ip: "xxx", #用户ip | |||
| # account: "xxx", #登录login | |||
| # nickname: "xxx", #用户姓名 | |||
| # title: "xxx", #帖子的标题 | |||
| # } | |||
| #检测结果,0:通过,1:嫌疑,2:不通过 | |||
| # include ActionView::Helpers::LoopTextsHelper | |||
| require 'uri' | |||
| require 'net/http' | |||
| def initialize(text_params) | |||
| @text_params = text_params | |||
| end | |||
| def call | |||
| new_text_params = @text_params | |||
| text_long_array = [] | |||
| check_content = new_text_params[:content] | |||
| format_text(check_content,text_long_array) | |||
| (1..text_long_array.size).each do |i| | |||
| new_text_params.merge!(content: text_long_array[i-1]) | |||
| check_result = check_text(new_text_params) | |||
| if check_result[:status].to_i == -1 | |||
| return check_result | |||
| break | |||
| else | |||
| if i == text_long_array.size | |||
| return check_result | |||
| else | |||
| next | |||
| end | |||
| end | |||
| end | |||
| end | |||
| def check_text(text_params) | |||
| begin | |||
| dun_params = check_dun_params(text_params) | |||
| # api_url = Redmine::Configuration['dun']['text_api'] | |||
| api_url = EduSetting.get("dun_text_api") | |||
| uri = URI.parse(api_url) | |||
| http = Net::HTTP.new(uri.hostname, uri.port) | |||
| if api_url.include?("https://") | |||
| http.use_ssl = true | |||
| end | |||
| dun_params_str = URI.encode_www_form(dun_params) | |||
| header = {'content-type':'application/x-www-form-urlencoded'} | |||
| response = http.post(uri.path, dun_params_str, header) | |||
| response_body = eval(response.body) | |||
| Rails.logger.info("======response========#{response_body}") | |||
| if response_body[:code].to_i == 200 | |||
| response_body_result = response_body[:result] | |||
| response_body_labels = response_body_result[:labels].present? ? response_body_result[:labels][0] : [] | |||
| extra_params = { | |||
| action: response_body_result[:action], | |||
| taskId: response_body_result[:taskId], | |||
| infos: response_body_labels.present? ? sub_lables[:"#{response_body_labels[:subLabels][0][:subLabel]}"] : "" | |||
| } | |||
| render_status = response_body_result[:action].to_i == 0 ? 1 : -1 | |||
| tip_status(render_status, response_body[:msg], extra_params) | |||
| else | |||
| tip_status(-1, response_body[:msg]) | |||
| end | |||
| rescue Exception => ex | |||
| Rails.logger.info "*** transaction abored!" | |||
| Rails.logger.info "*** errors: #{ex.message}" | |||
| tip_status(-1, "检测失败") | |||
| end | |||
| end | |||
| private | |||
| def check_dun_params(text_params) | |||
| dun_public_params = DunCheck::PublicParams.new("text") | |||
| rand_data_id = random_dataId | |||
| check_params = { | |||
| dataId: rand_data_id, | |||
| version: "v3.1", | |||
| callback: rand_data_id | |||
| }.merge(text_params) | |||
| check_params.merge!(dun_public_params.call) | |||
| dun_params = dun_public_params.generate_sign(check_params) | |||
| return dun_params | |||
| end | |||
| def format_text(text_long, text_long_array) | |||
| slice_content = text_long.slice(0..4998) | |||
| last_slice_content = text_long.slice(4999..-1) | |||
| text_long_array.push(slice_content) | |||
| if last_slice_content.present? | |||
| if last_slice_content.length > 4999 | |||
| format_text(last_slice_content, text_long_array) | |||
| else | |||
| text_long_array.push(last_slice_content) | |||
| end | |||
| end | |||
| end | |||
| def random_dataId | |||
| Digest::MD5.hexdigest(rand(100000000).to_s) | |||
| end | |||
| def check_labels | |||
| # 100:色情,200:广告,260:广告法,300:暴恐,400:违禁,500:涉政,600:谩骂,700:灌水 | |||
| %w(100 200 260 300 400 500 600 700).join(",") | |||
| end | |||
| def tip_status(status, message, msg_params={}) | |||
| return {status: status, message: message, extra_params: msg_params} | |||
| end | |||
| def sub_lables | |||
| { | |||
| "100001": "色情其他", | |||
| "100002": "色情传播", | |||
| "100003": "色情性器官", | |||
| "100004": "色情挑逗", | |||
| "100005": "色情低俗段子", | |||
| "100006": "色情性行为", | |||
| "100007": "色情舆情事件", | |||
| "100008": "色情交友类", | |||
| "200009": "商业推广", | |||
| "200010": "广告法", | |||
| "200011": "刷量行为", | |||
| "200012": "广告其他", | |||
| "260052": "广告法-涉医疗用语(非药品禁止宣传药效)", | |||
| "260053": "广告法-迷信用语", | |||
| "260054": "广告法-需要凭证(可以写但需要凭证证明)", | |||
| "260055": "广告法-限时性用语(可以写但必须有具体时间)", | |||
| "260056": "广告法-涉嫌诱导消费者", | |||
| "260057": "广告法-涉嫌欺诈消费者", | |||
| "260058": "广告法-法律风险较高", | |||
| "260059": "广告法-极限词(用语绝对化)", | |||
| "300016": "暴恐其他", | |||
| "400017": "违禁其他", | |||
| "400021": "违禁网监要求", | |||
| "500013": "涉政其他", | |||
| "500014": "敏感专项", | |||
| "500015": "严格涉政", | |||
| "500039": "时事报道", | |||
| "500040": "领导人相关", | |||
| "500041": "英雄烈士相关", | |||
| "500042": "邪教迷信", | |||
| "500043": "落马官员相关", | |||
| "500044": "热点舆情", | |||
| "500045": "涉政综合", | |||
| "600018": "谩骂其他", | |||
| "700019": "灌水其他", | |||
| "900020": "其他", | |||
| } | |||
| end | |||
| end | |||
| @@ -3,7 +3,7 @@ class Attachment < ApplicationRecord | |||
| include Publicable | |||
| include Publishable | |||
| include Lockable | |||
| include DunCheckImageAble | |||
| belongs_to :container, polymorphic: true, optional: true | |||
| belongs_to :author, class_name: "User", foreign_key: :author_id | |||
| # belongs_to :course, foreign_key: :container_id, optional: true | |||
| @@ -0,0 +1,50 @@ | |||
| module DunCheckAble | |||
| extend ActiveSupport::Concern | |||
| included do | |||
| validate :check_text_able | |||
| end | |||
| def check_text_able | |||
| dun_check_params = get_model | |||
| if dun_check_params[:is_change] | |||
| dun_check_params.delete(:is_change) | |||
| check_result = DunCheck::TextCheck.new(dun_check_params).call | |||
| if check_result[:status].to_i == -1 | |||
| errors.add(:base, "内容含有:#{check_result[:extra_params][:infos]},请修改") | |||
| # raise ActiveRecord::RecordInvalid.new(self) | |||
| end | |||
| end | |||
| end | |||
| def get_model | |||
| dun_model = self.class.name | |||
| case dun_model | |||
| when "Issue" | |||
| check_params = { | |||
| title: self.subject, | |||
| content: self.description, | |||
| is_change: (self.subject_changed? || self.description_changed?) && self.subject.present? && self.description.present? | |||
| } | |||
| when "PullRequest" | |||
| check_params = { | |||
| title: "", | |||
| content: self.body, | |||
| is_change: self.body_changed? && self.body.present? | |||
| } | |||
| when "Journal" | |||
| check_params = { | |||
| title: "", | |||
| content: self.notes, | |||
| is_change: self.notes_changed? && self.notes.present? | |||
| } | |||
| when "Version" | |||
| check_params = { | |||
| title: self.name, | |||
| content: self.description, | |||
| is_change: (self.name_changed? || self.description_changed?) && self.name.present? && self.description.present? | |||
| } | |||
| end | |||
| return check_params | |||
| end | |||
| end | |||
| @@ -0,0 +1,34 @@ | |||
| module DunCheckImageAble | |||
| extend ActiveSupport::Concern | |||
| included do | |||
| def self.check_image_able(file) | |||
| original_filename = file.original_filename | |||
| file_extention = original_filename.split(".").last | |||
| check_include = %w(jpg png bmp gif webp tiff jpeg) | |||
| if file_extention && check_include.include?(file_extention) | |||
| base64_file = Base64.encode64(file.open.read.force_encoding(Encoding::UTF_8)) | |||
| check_params = [ | |||
| { | |||
| name: original_filename, | |||
| type: 2, | |||
| data: base64_file, | |||
| } | |||
| ] | |||
| check_result = DunCheck::ImageCheck.new(check_params).call | |||
| if check_result[:status].to_i == -1 | |||
| return {status: -1, message: check_result[:message]} | |||
| else | |||
| return {status: 1} | |||
| end | |||
| else | |||
| return {status: 1} | |||
| end | |||
| end | |||
| end | |||
| end | |||
| @@ -1,5 +1,6 @@ | |||
| class Issue < ApplicationRecord | |||
| #issue_type 1为普通,2为悬赏 | |||
| include DunCheckAble | |||
| belongs_to :project, :counter_cache => true | |||
| belongs_to :tracker,optional: true | |||
| has_many :project_trends, as: :trend, dependent: :destroy | |||
| @@ -1,4 +1,5 @@ | |||
| class Journal < ApplicationRecord | |||
| include DunCheckAble | |||
| belongs_to :user | |||
| belongs_to :issue, foreign_key: :journalized_id, :touch => true | |||
| has_many :journal_details, :dependent => :delete_all | |||
| @@ -1,5 +1,6 @@ | |||
| class PullRequest < ApplicationRecord | |||
| #status 0 默认未合并, 1表示合并, 2表示请求拒绝 | |||
| include DunCheckAble | |||
| belongs_to :issue | |||
| belongs_to :user | |||
| belongs_to :project, :counter_cache => true | |||
| @@ -54,7 +54,7 @@ class Token < ActiveRecord::Base | |||
| # Delete all expired tokens | |||
| def self.destroy_expired | |||
| Token.delete_all ["action NOT IN (?) AND created_on < ?", ['feeds', 'api', 'autologin'], Time.now - @@validity_time] | |||
| Token.delete_all ["action NOT IN (?) AND created_on < ?", ['feeds', 'api', 'autologin', 'autologin_forge_military'], Time.now - @@validity_time] | |||
| end | |||
| # Returns the active user who owns the key for the given action | |||
| @@ -124,7 +124,7 @@ class User < ApplicationRecord | |||
| # 删除自动登录的token,一旦退出下次会提示需要登录 | |||
| def delete_autologin_token(value) | |||
| Token.where(:user_id => id, :action => 'autologin', :value => value).delete_all | |||
| Token.where(:user_id => id, :action => autologin_name, :value => value).delete_all | |||
| end | |||
| def delete_session_token(value) | |||
| @@ -510,8 +510,8 @@ class User < ApplicationRecord | |||
| end | |||
| # Returns the user who matches the given autologin +key+ or nil | |||
| def self.try_to_autologin(key) | |||
| user = Token.find_active_user('autologin', key) | |||
| def self.try_to_autologin(key,type) | |||
| user = Token.find_active_user(type, key) | |||
| user.update(last_login_on: Time.now) if user | |||
| user | |||
| end | |||
| @@ -675,6 +675,10 @@ class User < ApplicationRecord | |||
| raise("昵称包含敏感词汇,请重新输入") if nickname && !HarmoniousDictionary.clean?(nickname) | |||
| end | |||
| def autologin_name | |||
| EduSetting.get('autologin_cookie_name') || "autologin_forge_military" | |||
| end | |||
| def set_laboratory | |||
| return unless new_record? | |||
| @@ -1,4 +1,5 @@ | |||
| class Version < ApplicationRecord | |||
| include DunCheckAble | |||
| belongs_to :project, counter_cache: true | |||
| has_many :issues, class_name: "Issue", foreign_key: "fixed_version_id" | |||
| belongs_to :user, optional: true | |||
| @@ -0,0 +1,20 @@ | |||
| require 'uri' | |||
| require 'net/http' | |||
| class SyncForgeProjectsRake | |||
| # 运行示例: 检查哪些项目的repo不存在,bundle exec rails runner "SyncForgeProjectsRake.new.call(5)" -e production | |||
| def call(count) | |||
| url = "https://forgeplus.trustie.net/api/sync_forge/sync_range_projects" #trustie上的相关路由 | |||
| count_params = { | |||
| sync_count: count || 10 | |||
| } | |||
| Rails.logger.info("============begin to sync project,count: #{count_params} ===========") | |||
| uri = URI.parse(url) | |||
| http = Net::HTTP.new(uri.hostname, uri.port) | |||
| http.use_ssl = true | |||
| response = http.send_request('POST', uri.path, count_params.to_json, {'Content-Type' => 'application/json'}) | |||
| Rails.logger.info("============end to sync project, status: #{response.code} ===========") | |||
| end | |||
| end | |||
| @@ -19,10 +19,14 @@ | |||
| maxlength: 15, class: 'form-control font-16', | |||
| 'onKeyUp': 'value=value.replace(/[^\w\-\/]/ig,"").toLowerCase()', | |||
| style: 'text-transform:lowercase'%> | |||
| <div class="input-group-append"> | |||
| <% | |||
| =begin%> | |||
| <div class="input-group-append"> | |||
| <% rails_env = EduSetting.get('rails_env') %> | |||
| <span class="input-group-text font-14" id="site-prefix"><%= rails_env && rails_env != 'production' ? ".#{rails_env}.educoder.net" : '.educoder.net' %></span> | |||
| </div> | |||
| </div> | |||
| <% | |||
| =end%> | |||
| </div> | |||
| <%# if @laboratory.errors && @laboratory.errors.key?(:identifier) %> | |||
| <!-- <span id="identifier-error" class="danger text-danger">二级域名已被使用</span>--> | |||
| @@ -1,2 +1,3 @@ | |||
| json.status 0 | |||
| json.id @attachment.id | |||
| json.filesize @attachment.filesize | |||
| @@ -17,7 +17,7 @@ Rails.application.routes.draw do | |||
| get 'oauth/bind', to: 'oauth/educoder#bind' | |||
| get 'oauth/register', to: 'oauth#register' | |||
| post 'oauth/auto_register', to: 'oauth#auto_register' | |||
| resources :edu_settings | |||
| scope '/api' do | |||