diff --git a/Gemfile b/Gemfile index 859090feb..e454889f6 100644 --- a/Gemfile +++ b/Gemfile @@ -49,6 +49,8 @@ gem 'rqrcode_png' gem 'acts-as-taggable-on', '~> 6.0' +gem 'omniauth-cas' + group :development, :test do gem 'rspec-rails', '~> 3.8' end diff --git a/app/controllers/games_controller.rb b/app/controllers/games_controller.rb index fcdd81953..4c9e7fc0e 100644 --- a/app/controllers/games_controller.rb +++ b/app/controllers/games_controller.rb @@ -524,11 +524,11 @@ class GamesController < ApplicationController else {updated_at: Time.now} end - logger.info("#############myshixuns_update: ##{myshixuns_update}") + #logger.info("#############myshixuns_update: ##{myshixuns_update}") @myshixun.update_attributes!(myshixuns_update) gitUrl = repo_ip_url @myshixun.repo_path - logger.info("#############giturl: ##{gitUrl}") + #logger.info("#############giturl: ##{gitUrl}") gitUrl = Base64.urlsafe_encode64(gitUrl) shixun_tomcat = edu_setting('cloud_bridge') @@ -554,7 +554,7 @@ class GamesController < ApplicationController testSet << test_cases end - logger.info("##############testSet: #{testSet}") + #logger.info("##############testSet: #{testSet}") testCases = Base64.urlsafe_encode64(testSet.to_json) unless testSet.blank? # 评测类型: 0,1,2 用于webssh的评测, 3用于vnc @@ -581,7 +581,7 @@ class GamesController < ApplicationController if secret_rep&.repo_name secretGitUrl = repo_ip_url secret_rep.repo_path br_params.merge!({secretGitUrl: Base64.urlsafe_encode64(secretGitUrl), secretDir: secret_rep.secret_dir_path}) - logger.info("#######br_params:#{br_params}") + #logger.info("#######br_params:#{br_params}") end # 中间层交互 @@ -700,10 +700,10 @@ class GamesController < ApplicationController resubmit_identifier = @game.resubmit_identifier # 如果没有超时并且正在评测中 # 判断评测中的状态有两种:1、如果之前没有通关的,只需判断status为1即可;如果通过关,则判断game的resubmit_identifier是否更新 - uid_logger("################game_status: #{@game.status}") - uid_logger("################params[:resubmit]: #{params[:resubmit]}") - uid_logger("################resubmit_identifier: #{resubmit_identifier}") - uid_logger("################time_out: #{params[:time_out]}") + #uid_logger("################game_status: #{@game.status}") + #uid_logger("################params[:resubmit]: #{params[:resubmit]}") + #uid_logger("################resubmit_identifier: #{resubmit_identifier}") + #uid_logger("################time_out: #{params[:time_out]}") sec_key = params[:sec_key] if (params[:time_out] == "false") && ((params[:resubmit].blank? && @game.status == 1) || (params[:resubmit].present? && (params[:resubmit] != resubmit_identifier))) @@ -762,7 +762,7 @@ class GamesController < ApplicationController end end - uid_logger("game is #{@game.id}, record id is #{e_record.try(:id)}, time is**** #{Time.now.strftime("%Y-%m-%d %H:%M:%S.%L")}") + #uid_logger("game is #{@game.id}, record id is #{e_record.try(:id)}, time is**** #{Time.now.strftime("%Y-%m-%d %H:%M:%S.%L")}") # 记录前端总耗时 record_consume_time = e_record.try(:pod_execute) max_mem = e_record.try(:max_mem) @@ -848,7 +848,7 @@ class GamesController < ApplicationController @allowed_hidden_testset = @identity < User::EDU_GAME_MANAGER || @game.test_sets_view #解锁的用户 if max_query_index > 0 - uid_logger("max_query_index is #{max_query_index} game id is #{@game.id}, challenge_id is #{challenge.id}") + #uid_logger("max_query_index is #{max_query_index} game id is #{@game.id}, challenge_id is #{challenge.id}") @qurey_test_sets = TestSet.find_by_sql("SELECT o.code, o.actual_output, o.out_put, o.result, o.test_set_position, o.ts_time, o.ts_mem, o.query_index, t.is_public, t.input, t.output, o.compile_success FROM outputs o, games g, challenges c, test_sets t where g.id=#{@game.id} and c.id=#{challenge.id} and o.query_index=#{max_query_index} diff --git a/app/controllers/myshixuns_controller.rb b/app/controllers/myshixuns_controller.rb index f4c73a6a4..893bf28d7 100644 --- a/app/controllers/myshixuns_controller.rb +++ b/app/controllers/myshixuns_controller.rb @@ -91,7 +91,7 @@ class MyshixunsController < ApplicationController ActiveRecord::Base.transaction do begin t1 = Time.now - uid_logger_dubug("@@@222222#{params[:jsonTestDetails]}") + #uid_logger_dubug("@@@222222#{params[:jsonTestDetails]}") jsonTestDetails = JSON.parse(params[:jsonTestDetails]) timeCost = JSON.parse(params[:timeCost]) brige_end_time = Time.parse(timeCost['evaluateEnd']) if timeCost['evaluateEnd'].present? @@ -100,7 +100,7 @@ class MyshixunsController < ApplicationController game_id = jsonTestDetails['buildID'] sec_key = jsonTestDetails['sec_key'] - uid_logger_dubug("training_task_status start-#{game_id}-1#{Time.now.strftime("%Y-%m-%d %H:%M:%S.%L")}") + #uid_logger_dubug("training_task_status start-#{game_id}-1#{Time.now.strftime("%Y-%m-%d %H:%M:%S.%L")}") resubmit = jsonTestDetails['resubmit'] outPut = tran_base64_decode64(jsonTestDetails['outPut']) @@ -262,7 +262,7 @@ class MyshixunsController < ApplicationController @sec_key = generate_identifier(EvaluateRecord, 12) record = EvaluateRecord.create!(:user_id => current_user.id, :shixun_id => @myshixun.shixun_id, :game_id => game_id, :identifier => @sec_key, :exec_time => exec_time) - uid_logger_dubug("-- game build: file update #{@sec_key}, record id is #{record.id}, time is **** #{Time.now.strftime("%Y-%m-%d %H:%M:%S.%L")}") + #uid_logger_dubug("-- game build: file update #{@sec_key}, record id is #{record.id}, time is **** #{Time.now.strftime("%Y-%m-%d %H:%M:%S.%L")}") end # 隐藏代码文件 和 VNC的都不需要走版本库 vnc = @myshixun.shixun&.vnc @@ -277,8 +277,6 @@ class MyshixunsController < ApplicationController else params[:content] end - uid_logger_dubug("content_#{@myshixun.identifier}: #{content}") - uid_logger_dubug("###last_content_#{@myshixun.identifier}####{last_content}") if content != last_content @content_modified = 1 @@ -286,9 +284,6 @@ class MyshixunsController < ApplicationController author_name = current_user.real_name author_email = current_user.git_mail message = params[:evaluate] == 0 ? "System automatically submitted" : "User submitted" - uid_logger_dubug("112233#{author_name}") - uid_logger_dubug("112233#{author_email}") - uid_logger_dubug("daiao_debug_#{@myshixun.identifier}: #{@repo_path}: #{path}; #{message}; #{content}; ") @content = GitService.update_file(repo_path: @repo_path, file_path: path, message: message, diff --git a/app/controllers/oauth/cas_controller.rb b/app/controllers/oauth/cas_controller.rb new file mode 100644 index 000000000..d5abc8cbe --- /dev/null +++ b/app/controllers/oauth/cas_controller.rb @@ -0,0 +1,13 @@ +class Oauth::CasController < Oauth::BaseController + def create + user, is_new_user = Oauth::CreateORFindCasUserService.call(current_user, auth_hash) + successful_authentication(user) + + render_ok(new_user: is_new_user) + end + + + def auth_hash + JSON.parse(CGI.unescape(request.env['omniauth.auth'].extra.to_json)) + end +end \ No newline at end of file diff --git a/app/models/open_users/cas.rb b/app/models/open_users/cas.rb new file mode 100644 index 000000000..301a197a0 --- /dev/null +++ b/app/models/open_users/cas.rb @@ -0,0 +1,9 @@ +class OpenUsers::Cas < OpenUser + def nickname + extra&.[]('nickname') + end + + def en_type + 'cas' + end +end \ No newline at end of file diff --git a/app/services/oauth/create_or_find_cas_user_service.rb b/app/services/oauth/create_or_find_cas_user_service.rb new file mode 100644 index 000000000..0b6715471 --- /dev/null +++ b/app/services/oauth/create_or_find_cas_user_service.rb @@ -0,0 +1,31 @@ +class Oauth::CreateORFindCasUserService < ApplicationService + + def initialize(user, params) + @user = user + @params = params + end + + def call + return [@user, false] if @user + + open_user = OpenUsers::Cas.find_or_initialize_by(uid: @params['user']) do |u| + u.extra = @params + end + + return [open_user.user, false] if open_user.persisted? + + @user = User.new(login: User.generate_login('C'), type: 'User', status: User::STATUS_ACTIVE, nickname: @params['comsys_name'], lastname: @params['comsys_name']) + + ActiveRecord::Base.transaction do + @user.save! + @user.create_user_extension! + + open_user.user = @user + open_user.save! + + Rails.cache.write(open_user.can_bind_cache_key, 1, expires_in: 1.hours) + end + + [@user, true] + end +end \ No newline at end of file diff --git a/config/application.rb b/config/application.rb index baa0011f2..31a94e7ed 100644 --- a/config/application.rb +++ b/config/application.rb @@ -29,6 +29,10 @@ module Educoderplus # job config.active_job.queue_adapter = :sidekiq + config.middleware.use OmniAuth::Builder do + provider :cas, url: 'https://urp.tfswufe.edu.cn/cas' + end + config.middleware.insert_before 0, Rack::Cors do allow do origins '*' diff --git a/config/routes.rb b/config/routes.rb index 7592432dd..ba0827676 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -8,8 +8,8 @@ Rails.application.routes.draw do get 'attachments/download/:id/:filename', to: 'attachments#show' get 'auth/qq/callback', to: 'oauth/qq#create' get 'auth/failure', to: 'oauth/base#auth_failure' + get 'auth/cas/callback', to: 'oauth/cas#create' - resources :edu_settings scope '/api' do @@ -26,7 +26,7 @@ Rails.application.routes.draw do put 'commons/unhidden', to: 'commons#unhidden' delete 'commons/delete', to: 'commons#delete' - resources :jupyters do + resources :jupyters do collection do get :save_with_tpi get :save_with_tpm @@ -42,7 +42,7 @@ Rails.application.routes.draw do post :import_with_tpm end end - + resources :memos do member do post :sticky_or_cancel