diff --git a/app/controllers/accounts_controller.rb b/app/controllers/accounts_controller.rb index a837e952f..b80282798 100644 --- a/app/controllers/accounts_controller.rb +++ b/app/controllers/accounts_controller.rb @@ -1,6 +1,25 @@ class AccountsController < ApplicationController + before_action :require_login, only: [:login_check, :simple_update] include ApplicationHelper + #skip_before_action :check_account, :only => [:logout] + + def simple_update + simple_update_params.merge!(username: params[:username]&.gsub(/\s+/, "")) + simple_update_params.merge!(email: params[:email]&.gsub(/\s+/, "")) + simple_update_params.merge!(platform: (params[:platform] || 'forge')&.gsub(/\s+/, "")) + Register::RemoteForm.new(simple_update_params).validate! + + ActiveRecord::Base.transaction do + result = auto_update(current_user, simple_update_params) + if result[:message].blank? + render_ok + else + render_error(result[:message]) + end + end + end + def index render json: session end @@ -315,6 +334,11 @@ class AccountsController < ApplicationController Register::CheckColumnsForm.new(check_params).validate! render_ok end + + def login_check + Register::LoginCheckColumnsForm.new(check_params.merge(user: current_user)).validate! + render_ok + end private @@ -383,4 +407,7 @@ class AccountsController < ApplicationController params.permit(:username, :email, :password, :platform) end + def simple_update_params + params.permit(:username, :email, :password, :platform) + end end diff --git a/app/controllers/concerns/register_helper.rb b/app/controllers/concerns/register_helper.rb index 9d2f420a0..2e910d8c4 100644 --- a/app/controllers/concerns/register_helper.rb +++ b/app/controllers/concerns/register_helper.rb @@ -58,4 +58,32 @@ module RegisterHelper end end + def auto_update(user, params={}) + return if params.blank? + result = {message: nil, user: nil} + before_login = user.login + user.login = params[:username] + user.password = params[:password] + user.mail = params[:email] + + if user.save! + sync_params = { + password: params[:password].to_s, + email: params[:email], + login_name: params[:username], + new_name: params[:username], + source_id: 0 + } + + interactor = Gitea::User::UpdateInteractor.call(before_login, sync_params) + if interactor.success? + result[:user] = user + else + result[:message] = '用户同步Gitea失败!' + end + else + result[:message] = user.errors.full_messages.join(",") + return + end + end end diff --git a/app/controllers/concerns/render_helper.rb b/app/controllers/concerns/render_helper.rb index b54ac90ce..851a3ccf8 100644 --- a/app/controllers/concerns/render_helper.rb +++ b/app/controllers/concerns/render_helper.rb @@ -4,7 +4,7 @@ module RenderHelper end def render_error(message = '') - render json: { status: -1, message: message } + render json: { status: status, message: message } end def render_not_acceptable(message = '请求已拒绝') diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index a04a16aa9..056909f64 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -8,7 +8,7 @@ class UsersController < ApplicationController before_action :connect_to_ci_db, only: [:get_user_info] before_action :convert_image!, only: [:update, :update_image] skip_before_action :check_sign, only: [:attachment_show] - # before_action :sso_login, only: [:get_user_info] + before_action :sso_login, only: [:get_user_info] def connect_to_ci_db(options={}) if !(current_user && !current_user.is_a?(AnonymousUser) && current_user.devops_certification?) @@ -302,6 +302,11 @@ class UsersController < ApplicationController end end + def email_search + return render_error('请输入email') if params[:email].blank? + @user = User.find_by(mail: params[:email]) + end + private def load_user @user = User.find_by_login(params[:id]) || User.find_by(id: params[:id]) @@ -331,35 +336,64 @@ class UsersController < ApplicationController end def sso_login - if params[:ticket].present? && !current_user.logged? && params[:websiteName].nil? - info = Base64.decode64(params[:ticket]) || Base64.decode64(params[:info].gsub(" ", "+")).force_encoding("utf-8") - # login 邮箱 手机号 姓名 学校/单位 - user_info = info.split("&&") - # Rails.logger.info("user_info====== #{info}") - login = user_info[0] - email = user_info[1] - phone = user_info[2] - real_name = user_info[3] - department_name = user_info[4] - - # 没有登录时,新建用户并登录 - if current_user.logged? - user = current_user - else - user = User.where("login = ? or phone = ? or mail = ? ", "edu_#{login}", phone, email).first - unless user - ActiveRecord::Base.transaction do - phone_rand = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9].sample(4).join - user_params = { status: 1, type: 'User', login: "e_#{login}", lastname: "#{real_name}", mail: "#{email}", - nickname: "#{real_name}", professional_certification: 0, certification: 0, grade: 0, - password: "12345678", phone: "#{phone_rand}", profile_completed: 1 } - user = User.create!(user_params) - UserExtension.create!(user_id: user.id, gender: 1, custom_department: "#{department_name}") - end - end + if params[:login].present? && !current_user.logged? && params[:websiteName].present? + user = User.where("login = ?", "#{params[:login].presence}").first + # 已同步注册,直接登录 + if user.present? successful_authentication(user) + else + autologin_register_by_educoder(params[:login].presence) end end end -end \ No newline at end of file + # 通过login参数查询头歌账号信息,注册并登录 + def autologin_register_by_educoder(edu_login) + req_params = { "login" => "#{edu_login}", "private_token" => "hriEn3UwXfJs3PmyXnSH" } + api_url= "https://data.educoder.net" + client = Faraday.new(url: api_url) + response = client.public_send("get", "/api/sources/get_user_info_by_login", req_params) + result = JSON.parse(response.body) + #查询 + return nil if result["status"].to_s != "0" + + # login 邮箱 手机号 姓名 学校/单位 + user_info = result["data"] + Rails.logger.info("user_info====== #{user_info}") + login = user_info["login"] + email = user_info["mail"] + phone = user_info["phone"] + real_name = user_info["username"] + department_name = user_info["school"] + password = "12345678" + + # 没有用户时,新建用户并登录 + user = User.where("login = ? or phone = ? or mail = ? ", "#{login}", phone, email).first + if user.present? + # 手机号先记录,后续用 + user.update_column(:phone, "#{phone}") if phone.present? + else + ActiveRecord::Base.transaction do + email = "#{login}@gitlink.org.cn" if email.blank? + user_params = { status: 1, type: 'User', login: "#{login}", lastname: "#{real_name}", mail: "#{email}", + nickname: "#{real_name}", professional_certification: 0, certification: 0, grade: 0, + password: "#{password}", phone: "#{phone}", profile_completed: 1 } + user = User.create!(user_params) + UserExtension.create!(user_id: user.id, gender: 1, custom_department: "#{department_name}") + interactor = Gitea::RegisterInteractor.call({username: login, email: email, password: password}) + if interactor.success? + gitea_user = interactor.result + Rails.logger.info("Gitea::RegisterInteractor.call result====== #{gitea_user}") + result = Gitea::User::GenerateTokenService.call(login, password) + user.gitea_token = result['sha1'] + user.gitea_uid = gitea_user[:body]['id'] + user.save! + else + Rails.logger.info("Gitea::RegisterInteractor.call error====== #{interactor.error}") + end + end + end + successful_authentication(user) if user.present? + end + +end diff --git a/app/forms/gitea/user/update_form.rb b/app/forms/gitea/user/update_form.rb index 7912d51fa..401282ff1 100644 --- a/app/forms/gitea/user/update_form.rb +++ b/app/forms/gitea/user/update_form.rb @@ -4,7 +4,7 @@ class Gitea::User::UpdateForm attr_accessor :username, :email, :admin, :allow_create_organization, :allow_git_hook, :allow_import_local, :full_name, :location, :login_name, :max_repo_creation, :must_change_password, :password, :prohibit_login, - :source_id, :website + :source_id, :website, :new_name validates :username, presence: true validates :email, presence: true, format: { with: EMAIL_REGEX, multiline: true } diff --git a/app/forms/register/base_form.rb b/app/forms/register/base_form.rb index 150fef73a..8824fc23c 100644 --- a/app/forms/register/base_form.rb +++ b/app/forms/register/base_form.rb @@ -3,28 +3,40 @@ module Register include ActiveModel::Model private - def check_login(login) + def check_login(login, user=nil) login = strip(login) raise LoginError, "登录名格式有误" unless login =~ CustomRegexp::LOGIN login_exist = Owner.exists?(login: login) || ReversedKeyword.check_exists?(login) - raise LoginError, '登录名已被使用' if login_exist + if user.present? + raise LoginError, '登录名已被使用' if login_exist && login != user&.login + else + raise LoginError, '登录名已被使用' if login_exist + end end - def check_mail(mail) + def check_mail(mail, user=nil) mail = strip(mail) raise EmailError, "邮件格式有误" unless mail =~ CustomRegexp::EMAIL mail_exist = Owner.exists?(mail: mail) - raise EmailError, '邮箱已被使用' if mail_exist + if user.present? + raise EmailError, '邮箱已被使用' if mail_exist && mail != user&.mail + else + raise EmailError, '邮箱已被使用' if mail_exist + end end - def check_phone(phone) + def check_phone(phone, user=nil) phone = strip(phone) raise PhoneError, "手机号格式有误" unless phone =~ CustomRegexp::PHONE phone_exist = Owner.exists?(phone: phone) - raise PhoneError, '手机号已被使用' if phone_exist + if user.present? + raise PhoneError, '手机号已被使用' if phone_exist && phone != user&.phone + else + raise PhoneError, '手机号已被使用' if phone_exist + end end end end diff --git a/app/forms/register/login_check_columns_form.rb b/app/forms/register/login_check_columns_form.rb new file mode 100644 index 000000000..0c6a93af3 --- /dev/null +++ b/app/forms/register/login_check_columns_form.rb @@ -0,0 +1,19 @@ +module Register + class LoginCheckColumnsForm < Register::BaseForm + attr_accessor :type, :value, :user + + validates :type, presence: true, numericality: true + validates :value, presence: true + validate :check! + + def check! + # params[:type] 为事件类型 1:登录名(login) 2:email(邮箱) 3:phone(手机号) + case strip(type).to_i + when 1 then check_login(strip(value), user) + when 2 then check_mail(strip(value), user) + when 3 then check_phone(strip(value), user) + else raise("type值无效") + end + end + end +end diff --git a/app/interactors/gitea/register_interactor.rb b/app/interactors/gitea/register_interactor.rb index d8dbc6cad..e188809ac 100644 --- a/app/interactors/gitea/register_interactor.rb +++ b/app/interactors/gitea/register_interactor.rb @@ -13,7 +13,7 @@ module Gitea end def success? - @error.nil? + @error.nil? && @result[:status].to_s == "success" end def result diff --git a/app/services/projects/transfer_service.rb b/app/services/projects/transfer_service.rb index 7d1214eb8..157263962 100644 --- a/app/services/projects/transfer_service.rb +++ b/app/services/projects/transfer_service.rb @@ -24,7 +24,8 @@ class Projects::TransferService < ApplicationService private def update_owner - project.members.map{|m| m.destroy! if m.user_id == owner.id || (new_owner.is_a?(Organization) && new_owner.is_member?(m.user_id)) } + project.members.map{|m| m.destroy! if m.user_id == owner.id || project.member(new_owner.id) || (new_owner.is_a?(Organization) && new_owner.is_member?(m.user_id)) } + project.set_owner_permission(new_owner) project.update!(user_id: new_owner.id) end diff --git a/app/views/users/email_search.json.jbuilder b/app/views/users/email_search.json.jbuilder new file mode 100644 index 000000000..c077c3fad --- /dev/null +++ b/app/views/users/email_search.json.jbuilder @@ -0,0 +1,5 @@ +if @user.present? + json.partial! 'users/user', locals: { user: @user } +else + json.null +end diff --git a/app/views/users/get_user_info.json.jbuilder b/app/views/users/get_user_info.json.jbuilder index d60f46ade..0e8cda5e3 100644 --- a/app/views/users/get_user_info.json.jbuilder +++ b/app/views/users/get_user_info.json.jbuilder @@ -1,28 +1,29 @@ -json.username @user.full_name -json.real_name @user.real_name -json.nickname @user.nickname -json.gender @user.gender -json.login @user.login -json.user_id @user.id -json.image_url url_to_avatar(@user) -json.admin @user.admin? -json.is_teacher @user.user_extension&.teacher? -json.user_identity @user.identity -json.tidding_count 0 -json.user_phone_binded @user.phone.present? -json.need_edit_info @user.need_edit_info? -# json.phone @user.phone -# json.email @user.mail -json.profile_completed @user.profile_is_completed? -json.professional_certification @user.professional_certification -json.devops_step @user.devops_step -json.ci_certification @user.ci_certification? -json.email @user.mail -json.province @user.province -json.city @user.city -json.custom_department @user.custom_department -json.description @user.description -json.super_description @user.super_description -json.(@user, :show_email, :show_department, :show_location, :show_super_description) -json.message_unread_total @message_unread_total -json.has_trace_user @user.trace_user.present? \ No newline at end of file +json.username @user.full_name +json.real_name @user.real_name +json.nickname @user.nickname +json.gender @user.gender +json.login @user.login +json.user_id @user.id +json.image_url url_to_avatar(@user) +json.admin @user.admin? +json.is_teacher @user.user_extension&.teacher? +json.user_identity @user.identity +json.tidding_count 0 +json.user_phone_binded @user.phone.present? +json.need_edit_info @user.need_edit_info? +# json.phone @user.phone +# json.email @user.mail +json.profile_completed @user.profile_is_completed? +json.professional_certification @user.professional_certification +json.devops_step @user.devops_step +json.ci_certification @user.ci_certification? +json.email @user.mail +json.province @user.province +json.city @user.city +json.custom_department @user.custom_department +json.description @user.description +json.super_description @user.super_description +json.(@user, :show_email, :show_department, :show_location, :show_super_description) +json.message_unread_total @message_unread_total +json.has_trace_user @user.trace_user.present? +json.is_new @user.login.present? && params[:login].to_s.include?("#{@user.login}") \ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index 097aaf2a7..ed81d6c88 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -214,6 +214,8 @@ Rails.application.routes.draw do post :remote_password post :change_password post :check + post :login_check + post :simple_update end end @@ -247,6 +249,7 @@ Rails.application.routes.draw do get :trustie_projects get :trustie_related_projects post :sync_user_info + get :email_search scope '/ci', module: :ci do scope do