#coding=utf-8 # Redmine - project management software # Copyright (C) 2006-2013 Jean-Philippe Lang # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. class AccountController < ApplicationController helper :custom_fields include CustomFieldsHelper # prevents login action to be filtered by check_if_login_required application scope filter skip_before_filter :check_if_login_required skip_before_filter :check_authentication, :only => [:login, :logout, :user_join, :avatar, :authentication, :professional_certification, :security_settings, :change_psd, :user_info] before_filter :auth_login1, :only => [:avatar, :authentication, :professional_certification, :security_settings, :change_psd, :reset_psd, :user_info] skip_before_filter :verify_authenticity_token, :only =>[:codepedia_login, :login, :register] before_filter :require_login, only: [:avatar, :authentication, :professional_certification, :security_settings, :change_psd, :user_info, :user_auth, :apply_auth, :apply_pro_certification, :check_student_id, :bind_email, :change_or_bind] include ApplicationHelper include AccountHelper # Login request and validation CODES = %W(1 2 3 4 5 6 7 8 9 A B C D E F G H J K L N M O P Q R S T U V W X Y Z) def login Rails.logger.info("login: request type is #{request.method}") if params[:type] == "activated" @message = l(:notice_account_activated) elsif params[:type] == "expired" @message = l(:notice_account_expired) end @name = params[:name] @c_name = params[:c_name] login = User.current.login login_error = false # login 匹配不到字母,或者 含有特殊字符 则login不规范 if (login =~ /(^(?=.*?[a-zA-Z]).*$)/).nil? || !(login =~ /[@#\$%\^&\*]+/).nil? login_error = true end if request.get? @login = params[:login] || true if User.current.logged? # 判断用户基本资料是否完善,不完善讲强制完善基本资料,完善进入主页 user = UserExtensions.where(:user_id => User.current.id).first Rails.logger.info("#######################login_error: ##{login_error}") if User.current.lastname.blank? || user.school_id.blank? || user.identity.blank? || login_error redirect_to user_info_path() else redirect_back_or_default user_path(User.current), :referer => true end else render :layout => 'login' end else # ajax请求类型 # REDO:测试的时候注意是否 if request.xhr? login = params[:username].strip password = params[:password] # 验证用户名密码是否正确 @user, last_login_on = User.try_to_login(login, password) if @user.present? Rails.logger.info("successful_authentication, user is #{@user.try(:login)}") # 登录重置session;重新开启session有效时间等 self.logged_user = @user # generate a key and set cookie if autologin if params[:autologin] && Setting.autologin? set_autologin_cookie(@user) end # 记录用户登录行为 UserActions.create(:action_id => @user.id, :action_type => "Login", :user_id => @user.id) end respond_to do |format| format.js end else authenticate_user end end end def codepedia_login logger.info("codepedia_login#########################################") logger.info("#{params}") user, last_login_on = User.try_to_login(params[:username], params[:password]) logger.info(user) if user.blank? render :json => { status: 0 } else render :json => { status: 1, user: user} end end def user_join if params[:type] == "activated" @message = l(:notice_account_activated) elsif params[:type] == "expired" @message = l(:notice_account_expired) end if request.get? @login = params[:login] || true @name = params[:name] if User.current.logged? # 判断用户基本资料是否完善,不完善讲强制完善基本资料,完善进入主页 user = UserExtensions.where(:user_id => User.current.id).first if user.gender.nil? || user.school_id.nil? || User.current.lastname.nil? redirect_to my_account_path(:tip => 1) elsif user.identity == 3 && user.school_id.nil? redirect_to my_account_path(:tip => 1) else redirect_to user_path(User.current) end else render :layout =>'login' end else authenticate_user end end def help @index = params[:index].to_i == 0 ? 1 : params[:index].to_i if @index == 6 && !User.current.logged? redirect_to signin_path return end code = CODES.sample(8).join @resubmit = "#{code}" @agreement = Help.first @cooperation = Cooperation.all @url = params[:url] @com_coop_img = CooImg.where(:img_type => 'com_coop').order("position asc") @edu_coop_img = CooImg.where(:img_type => 'edu_coop').order("position asc") render :layout => 'base_edu' end def update_help @edu_coop = "edu_coop" @com_coop = "com_coop" end def update_agreement if User.current.admin? help = Help.first unless params[:tabs] if help.present? case params[:tab].to_i when 1 help.update_attribute(:agreement, params[:description]) redirect_to help_path(:index => 4) when 2 help.update_attribute(:about_us, params[:description]) redirect_to help_path() when 3 help.update_attribute(:help_center, params[:description]) redirect_to help_path(:index => 5) end else case params[:tab].to_i when 1 Help.create(:agreement => params[:description]) redirect_to help_path(:index => 4) when 2 Help.create(:about_us => params[:description]) redirect_to help_path() when 3 Help.create(:help_center => params[:description]) redirect_to help_path(:index => 5) end end else unless help.present? Help.create(:status =>params[:status]) redirect_to help_path(:index => 2) else help.update_attribute(:status,params[:status]) redirect_to help_path(:index => 2) end end else redirect_to help_path() end end def update_contact_us if Cooperation.where(:user_type => params[:user_type]).present? Cooperation.where(:user_type => params[:user_type]).first.update_attributes(:name => params[:name],:qq => params[:qq],:mail =>params[:mail]) else Cooperation.create(:user_type => params[:user_type],:name =>params[:name],:qq =>params[:qq],:mail =>params[:mail]) end redirect_to help_path(:index => 2) end def insert_suggest content = "
[#{params[:question_kind]}]
" + "问题页面网址:#{params[:url]}
" + params[:description] PrivateMessage.create(:user_id => User.current.id, :target_id => 1, :sender_id => User.current.id, :receiver_id => 1, :content => content, :send_time => Time.now, :status => 1) PrivateMessage.create(:user_id => 1, :target_id => User.current.id, :sender_id => User.current.id, :receiver_id => 1, :content => content, :send_time => Time.now, :status => 0) redirect_to message_detail_user_path(User.current, :user_id => 1) end # 合作伙伴 def cooperative_partner render :layout =>'base_edu' end def update_cooperative_part diskfile1 = disk_filename(params[:sourse_type], params[:source_id]) diskfile2 = disk_coo_filename(params[:sourse_type], params[:source_id]) diskfile = diskfile1 + 'temp' begin FileUtils.mv diskfile, diskfile1, force: true if File.exist? diskfile ensure File.delete(diskfile) if File.exist?(diskfile) end if File.exist?(diskfile1) pos = CooImg.order("position asc").last.position CooImg.create(:src_states =>params[:img_url] ,:url_states => diskfile2,:img_type =>params[:sourse_type], :position => pos) end redirect_to help_path(:index => 3) end # 改变广告位置 # params: id: 广告的id, position:广告的新位置, type:图片类型 def change_coop_position logger.info("##############{params[:position]}") position = params[:position].to_i type = params[:type] img = CooImg.find params[:id] coop_imgs = CooImg.where("img_type = ? and position > ?" , type, params[:position].to_i) coop_imgs.map{|img| img.increment!(:position)} img.update_attribute(:position, position + 1) render :json => {status: 1} end def delete_coop # @coo_img = CooImg.find_by_id(params[:id]) # @coo_img.destroy # render_404 if @coo_img.nil? # redirect_to help_path(:index => 3) # rescue ActiveRecord::RecordNotFound # render_404 @coo_img = CooImg.find_by_id(params[:id]) @sourse = @coo_img.url_states diskfile = File.join(Rails.root, "public") diskfile1 = diskfile + @sourse unless diskfile1.nil? || diskfile1 == "" path = File.dirname(diskfile1) if File.directory?(path) File.delete(diskfile1) @coo_img.destroy end end redirect_to help_path(:index => 3) rescue Exception => e logger.info e.message respond_to do |format| format.js format.api { if saved render :action => 'upload', :status => :created else render_validation_errors(@avatar) end } end end # Log out current user and redirect to welcome page def logout if User.current.anonymous? redirect_to home_path else UserActions.create(:action_id => User.current.id, :action_type => "Logout", :user_id => User.current.id) logout_user # 记录用户登出行为 redirect_to home_path end # display the logout form end def heartbeat render :json => session[:user_id] end # Lets user choose a new password def lost_password (redirect_to(signin_path); return) unless Setting.lost_password? if params[:token] @token = Token.find_token("recovery", params[:token].to_s) if @token.nil? || @token.expired? redirect_to signin_path return end @user = @token.user unless @user && @user.active? redirect_to signin_path return end if request.post? @user.password, @user.password_confirmation = params[:new_password], params[:new_password_confirmation] if @user.save @token.destroy flash[:notice] = l(:notice_account_password_updated) redirect_to signin_url return end end render :template => "account/password_recovery" return else if request.post? user = User.find_by_mail(params[:mail].to_s) # user not found or not active unless user && user.active? flash.now[:error] = l(:notice_account_unknown_email) render :layout => 'static_base' return end # user cannot change its password unless user.change_password_allowed? flash.now[:error] = l(:notice_can_t_change_password) return end # create a new token for password recovery token = Token.new(:user => user, :action => "recovery") if token.save Mailer.run.lost_password(token) flash[:notice] = l(:notice_account_lost_email_sent) redirect_to lost_password_path return end end render :layout => 'login' end end # User self-registration def register (redirect_to(signin_path); return) unless Setting.self_registration? || session[:auth_source_registration] if request.get? session[:auth_source_registration] = nil @user = User.new(:language => current_language.to_s) else user_params = params[:user] || {} if session[:auth_source_registration] @user.activate @user.login = session[:auth_source_registration][:login] @user.auth_source_id = session[:auth_source_registration][:auth_source_id] if @user.save session[:auth_source_registration] = nil self.logged_user = @user flash[:notice] = l(:notice_account_activated) redirect_to my_account_path(:tip => 1) end else us = UsersService.new @user = us.register user_params.merge(:should_confirmation_password => false) =begin case Setting.self_registration when '1' #register_by_email_activation(@user) unless @user.new_record? # if params[:user][:phone] =~ /^[a-zA-Z0-9]+([._\\]*[a-z0-9])*@([a-z0-9]+[-a-z0-9]*[a-z0-9]+.){1,63}[a-z0-9]+$/ # redirect_to account_email_valid_path(:mail => @user.mail, :user_id => @user.id) # else self.logged_user = @user redirect_to user_info_path() # end # flash[:notice] = l(:notice_account_register_done) # render action: 'email_valid', locals: {:mail => @user.mail} end when '3' #register_automatically(@user) if !@user.new_record? self.logged_user = @user flash[:notice] = l(:notice_account_activated) redirect_to user_info_path() else redirect_to signin_path end else #register_manually_by_administrator(@user) unless @user.new_record? account_pending end end =end if !@user.new_record? self.logged_user = @user flash[:notice] = l(:notice_account_activated) redirect_to user_info_path() else redirect_to signin_path end if params[:user][:phone] =~ /^[a-zA-Z0-9]+([._\\]*[a-z0-9])*@([a-z0-9]+[-a-z0-9]*[a-z0-9]+.){1,63}[a-z0-9]+$/ reward_grade(@user, @user.id, 'Mail', 500) elsif params[:user][:phone] =~ /^1\d{10}$/ reward_grade(@user, @user.id, 'Phone', 500) end end end end # 注册完后绑定邮箱(可选) def bind_email @user = User.current if request.get? render :layout =>'login' else @user.update_attributes!(:mail => params[:mail]) reward_grade(@user, @user.id, 'Mail', 500) redirect_to user_info_path() end end # 注册完/绑定邮箱 后完善资料 def user_info @user = User.current #是否是Oschina过来的 @is_ecoder_user = @user.ecoder_user_id.to_i>0 #是否没设置过密码 @is_set_password = @user.hashed_password.present? if request.get? # 如果是登录的请求进来,则需要判断登录名是否合法 if (@user.login =~ /(^(?=.*?[a-zA-Z]).*$)/).nil? || !(@user.login =~ /[@#\$%\^&\*\.]+/).nil? @login_error = true end render :layout =>'login' else lg = @user.login @pref = @user.pref @se = @user.extensions # 已授权的用户修改单位名称,需要重新授权 if @se.school_id != params[:occupation].to_i && @user.certification == 1 @user.certification = 0 apply_user = ApplyAction.where(:user_id => @user.id, :container_type => "TrialAuthorization") apply_user.update_all(:status => 2) unless apply_user.blank? end if @is_ecoder_user && !@is_set_password @user.password = params[:new_password] @user.password_confirmation = params[:new_password_confirmation] if @user.password.size<8 @password_len_error = true render :user_info and return end if @user.password != @user.password_confirmation @password_match_error = true render :user_info and return end end @user.lastname = params[:lastname] @user.firstname = "" @user.show_realname = params[:hide_realname] ? 0 : 1 @user.nickname = params[:hide_realname] ? params[:nickname] : params[:lastname] @user.pref.attributes = params[:pref] @user.pref[:no_self_notified] = (params[:no_self_notified] == '1') @user.mail = params[:mail] if params[:mail] Rails.logger.info("###############login: #{params[:login]}") if params[:login] if (params[:login] =~ /(^(?=.*?[a-zA-Z]).*$)/).present? && (params[:login] =~ /[@#\$%\^&\*\.]+/).nil? @user.login = params[:login] Gitlab.client.edit_user(@user.gid, :username => params[:login]) if @user.gid end end @se.school_id = params[:occupation] @se.department_id = params[:department_id] @se.gender = params[:sex] # @se.location = params[:province] if params[:province] # @se.location_city = params[:city] if params[:city] @se.identity = params[:identity].to_i if params[:identity] if @se.identity == 0 @se.technical_title = params[:te_technical_title] if params[:te_technical_title] @se.student_id = nil elsif @se.identity == 1 @se.student_id = params[:no] if params[:no] @se.technical_title = nil elsif @se.identity == 2 @se.technical_title = params[:pro_technical_title] if params[:pro_technical_title] @se.student_id = nil end # @se.brief_introduction = params[:brief_introduction] if @user.save && @se.save reward_grade(@user, @user.id, 'Account', 500) if @user.certification != 1 school_ids = School.where(:auto_users_trial => 1).map(&:id) # 授权单位中的只有学生身份才自动授权,且创建试用授权记录 if !@se.school.nil? && school_ids.include?(@se.school_id) && @se.identity == 1 @user.certification = 1 @user.update_attributes(:certification => 1) apply_action = ApplyAction.where(:user_id => @user.id, :container_type => "TrialAuthorization", :status => 0).first if apply_action.present? apply_action.update_attributes(:status => 1, :noticed => 1) else ApplyAction.create(:user_id => @user.id, :container_type => "TrialAuthorization", :ip_addr => request.remote_ip, :status => 1, :noticed => 1) end end end # 授权的教师加入示例课堂 join_ex_course(@user) if @se.identity == 0 && @user.certification == 1 @user.pref.save set_language_if_valid @user.language flash[:notice] = l(:notice_account_updated) first_update = Grade.where(:user_id => @user.id, :container_id => @user.id, :container_type => 'Account').first if @user.certification == 1 || (Time.now.to_i - first_update.created_at.to_i) < 86400 if @user.certification != 1 && !@user.user_day_certifications.first.present? # 更新字段是为了在user页面弹框提示 @user.update_attributes(:certification => 3) UserDayCertification.create(:user_id => @user.id, :status => 1) end redirect_to user_path(@user) else redirect_to my_account_url end return else @user.login = lg logger.info "save user: #{@user.errors}" end end end def check_email logger.info("###################################") user_count = User.where(:login => params[:login]).count status = user_count > 0 ? -1 : 0 render :json => {status: status} end #should_confirmation_password是否验证密码 def create_and_save_user login,password,email,password_confirmation,should_confirmation_password @user = User.new @user.admin = false @user.register @user.login = login @user.mail = email if should_confirmation_password && !password.blank? && !password_confirmation.blank? @user.password,@user.password_confirmation = password,password_confirmation elsif !should_confirmation_password && !password.blank? @user.password = password else @user.password = "" end case Setting.self_registration when '1' register_by_email_activation(@user) when '3' register_automatically(@user) else register_manually_by_administrator(@user) end if @user.id != nil ue = @user.user_extensions ||= UserExtensions.new ue.user_id = @user.id ue.save end @user end # Token based account activation def activate (redirect_to(signin_path); return) unless Setting.self_registration? && params[:token].present? token = Token.find_token('register', params[:token].to_s) type = l(:notice_account_expired) if (token && token.expired?) (redirect_to(signin_path(:type => "expired")); return) unless token and !token.expired? user = token.user (redirect_to(signin_path); return) unless user.registered? user.activate if user.save token.destroy flash[:notice] = l(:notice_account_activated) end redirect_to signin_url(:type => "activated") end def api_register login,password,email users_service = UsersService.new users_service.register({login: login, password: password, email: eamil}) end def valid_ajax req = Hash.new(false) req[:message] = '' valid_attr = params[:valid] valid_value = params[:value] faker = User.new if valid_attr.eql?('') req[:valid] = User.where("phone = '#{params[:value]}' or mail = '#{params[:value]}' or login = '#{params[:value]}'").blank? end if valid_attr.eql?('login') faker.login = valid_value faker.valid? req[:valid] = faker.errors[:login].blank? req[:message] = faker.errors[:login] end if valid_attr.eql?('phone') faker.phone = valid_value faker.valid? req[:valid] = faker.errors[:phone].blank? req[:message] = "" end if valid_attr.eql?('mail') faker.mail = valid_value faker.valid? req[:valid] = faker.errors[:mail].blank? req[:message] = faker.errors[:mail] end req[:message] = l(:modal_valid_passing) if req[:message].blank? render :json => req end # 手机号或邮箱是否已注册 def valid_register_user req = Hash.new(false) req[:message] = '' valid_attr = params[:valid] valid_value = params[:value] if valid_attr.eql?('phone') user = User.where(:phone => valid_value).first req[:valid] = !user.nil? req[:message] = user.nil? ? "该手机号未注册" : "" elsif valid_attr.eql?('mail') user = User.where(:mail => valid_value).first req[:valid] = !user.nil? req[:message] = user.nil? ? "该邮箱未注册" : "" end render :json => req end # 发送验证码:type 1:注册手机验证码 2:找回密码手机验证码 3:找回密码邮箱验证码 4:绑定手机 5:绑定邮箱 6:手机验证码登录 7:邮箱验证码登录 8:邮箱注册验证码 # 验证码是否有效 def valid_verification_code req = Hash.new(false) req[:valid] = false type = params[:type].to_i if Redmine::Configuration['gitlab_address'].include?("test") && params[:code] == "134790" req[:valid] = true else if type == 1 || type == 2 || type == 4 || type == 6 || params[:phone] =~ /^1\d{10}$/ code = VerificationCode.where(:phone => params[:phone], :code => params[:code], :code_type => (params[:type].to_i != 1 && params[:type].to_i != 2 && params[:type].to_i != 4) ? 2 : params[:type].to_i ).last else code = VerificationCode.where(:email => params[:phone], :code => params[:code], :code_type => params[:type].to_i).last end req[:valid] = !code.nil? && (Time.now.to_i - code.created_at.to_i) <= 10*60 end render :json => req end # 发送验证码:type 1:注册手机验证码 2:找回密码手机验证码 3:找回密码邮箱验证码 4:绑定手机 5:绑定邮箱 6:手机验证码登录 7:邮箱验证码登录 8:邮箱注册验证码 def get_verification_code code = %W(0 1 2 3 4 5 6 7 8 9) type = params[:type].to_i req = Hash.new(false) req[:status] = 0 req[:msg] = '' if type == 1 if User.where(:phone => params[:value]).count > 0 req[:status] = 2 #已注册 else begin verification_code = code.sample(6).join status = Trustie::Sms.send(mobile: params[:value], code: verification_code) if status == 0 VerificationCode.create(:phone => params[:value], :status => 1, :code_type => 1, :code => verification_code) end req[:msg] = code_msg status rescue => e Rails.logger.error "发送验证码出错: #{e}" end req[:status] = 1 end elsif type == 8 if User.where(:mail => params[:value]).count > 0 req[:status] = 2 #已注册 else begin verification_code = code.sample(6).join user = User.current token = Token.new(:user => user, :action => "bind") if token.save Mailer.run.email_register(token, verification_code, params[:value]) VerificationCode.create(:email => params[:value], :status => 1, :code_type => 8, :code => verification_code) end rescue => e Rails.logger.error "发送验证码出错: #{e}" end req[:status] = 1 req[:msg] = params[:value].split("@")[1] end elsif type == 2 || type == 3 || type == 6 || type == 7 if params[:value] =~ /^[a-zA-Z0-9]+([._\\]*[a-zA-Z0-9])*@([a-z0-9]+[-a-z0-9]*[a-z0-9]+.){1,63}[a-z0-9]+$/ if User.where(:mail => params[:value]).count == 0 req[:status] = 2 #未注册 else begin verification_code = code.sample(6).join user = User.where(:mail => params[:value]).first if type == 3 token = Token.new(:user => user, :action => "recovery") if token.save Mailer.run.lost_password(token, verification_code) VerificationCode.create(:email => params[:value], :status => 1, :code_type => 3, :code => verification_code) end else token = Token.new(:user => user, :action => "login") if token.save Mailer.run.code_login(token, verification_code) VerificationCode.create(:email => params[:value], :status => 1, :code_type => 7, :code => verification_code) end end rescue => e Rails.logger.error "发送验证码出错: #{e}" end req[:status] = 3 req[:link] = params[:value].split("@")[1] end elsif params[:value] =~ /^1\d{10}$/ if User.where(:phone => params[:value]).count == 0 req[:status] = 2 else begin verification_code = code.sample(6).join status = Trustie::Sms.send(mobile: params[:value], code: verification_code) if status == 0 VerificationCode.create(:phone => params[:value], :status => 1, :code_type => type, :code => verification_code) end req[:msg] = code_msg status rescue => e Rails.logger.error "发送验证码出错: #{e}" end req[:status] = 1 end else req[:status] = 2 end else if params[:value] =~ /^[a-zA-Z0-9]+([._\\]*[a-z0-9])*@([a-z0-9]+[-a-z0-9]*[a-z0-9]+.){1,63}[a-z0-9]+$/ if User.where(:mail => params[:value]).count > 0 req[:status] = 2 #已绑定 req[:msg] = '该邮箱已被绑定' else begin verification_code = code.sample(6).join user = User.current token = Token.new(:user => user, :action => "bind") if token.save Mailer.run.bind_email(token, verification_code, params[:value]) VerificationCode.create(:email => params[:value], :status => 1, :code_type => 5, :code => verification_code) end rescue => e Rails.logger.error "发送验证码出错: #{e}" end req[:status] = 3 req[:msg] = params[:value].split("@")[1] end elsif params[:value] =~ /^1\d{10}$/ if User.where(:phone => params[:value]).count > 0 req[:status] = 2 req[:msg] = '该手机号已被绑定' else begin verification_code = code.sample(6).join status = Trustie::Sms.send(mobile: params[:value], code: verification_code) if status == 0 VerificationCode.create(:phone => params[:value], :status => 1, :code_type => 4, :code => verification_code) end req[:msg] = code_msg status rescue => e Rails.logger.error "发送验证码出错: #{e}" end req[:status] = 1 end else req[:status] = 2 end end Rails.logger.info "#{req[:status]} - #{req[:msg]}" render :json => req end def avatar @user = params[:user_id].nil? ? User.current : User.find(params[:user_id]) @setting_type = 2 render :layout => 'login' end # 实名认证 def authentication @user = User.current @apply_user_auth = ApplyUserAuthentication.where(:user_id => @user.id, :auth_type => 1).order("created_at asc").last @setting_type = 3 render :layout => 'login' end # 职业认证 def professional_certification @user = User.current @apply_user_auth = ApplyUserAuthentication.where(:user_id => @user.id, :auth_type => 2, :status => [0, 2]).order("created_at asc").last @setting_type = 4 render :layout => 'login' end def apply_auth @user = User.current old_name = @user.lastname+@user.firstname @user.lastname = params[:lastname].strip @user.firstname = "" @user.ID_number = params[:ID_number].blank? ? nil : params[:ID_number] if @user.save @user.update_attributes(:authentication => 0) if params[:upload_img] && params[:upload_img].to_i == 1 diskfile1 = disk_auth_filename('UserAuthentication', @user.id, 'ID') diskfileID = diskfile1 + 'temp' begin FileUtils.mv diskfileID, diskfile1, force: true if File.exist? diskfileID ensure File.delete(diskfileID) if File.exist?(diskfileID) end end # 提交认证 if params[:save_or_submit] && params[:save_or_submit] == "1" if ApplyUserAuthentication.where(:user_id => @user.id, :status => 0, :auth_type => 1).count == 0 ApplyUserAuthentication.create(:user_id => @user.id, :status => 0, :auth_type => 1) begin status = Trustie::Sms.send(mobile: '18173242757', send_type:'apply_auth' , name: '管理员') rescue => e Rails.logger.error "发送验证码出错: #{e}" end end end # 已授权的用户修改真实姓名,需要重新授权 if @user.certification == 1 && old_name != params[:lastname] school_ids = School.where(:auto_users_trial => 1).map(&:id) if !(((@user.user_extensions.identity == 1 && @user.user_extensions.student_id.present?) || @user.user_extensions.identity == 0) && !@user.user_extensions.school.nil? && school_ids.include?(@user.user_extensions.school_id)) @user.update_attributes(:certification => 0) apply_user = ApplyAction.where(:user_id => @user.id, :container_type => "TrialAuthorization") apply_user.update_all(:status => 2) unless apply_user.blank? end end end redirect_to my_account_path end def apply_pro_certification @user = User.current @se = @user.extensions # 已授权的用户修改单位名称,需要重新授权 if (@se.school_id != params[:occupation].to_i || @se.identity != params[:identity].to_i) && @user.certification == 1 @user.certification = 0 apply_user = ApplyAction.where(:user_id => @user.id, :container_type => "TrialAuthorization") apply_user.update_all(:status => 2) unless apply_user.blank? end @se.school_id = params[:occupation] @se.department_id = params[:department_id] @se.identity = params[:identity].to_i if params[:identity] if @se.identity == 0 @se.technical_title = params[:te_technical_title] if params[:te_technical_title] @se.student_id = nil elsif @se.identity == 1 @se.student_id = params[:no] if params[:no] @se.technical_title = nil elsif @se.identity == 2 @se.technical_title = params[:pro_technical_title] if params[:pro_technical_title] @se.student_id = nil end if @user.save && @se.save @user.update_attributes(:professional_certification => 0) if params[:upload_img] && params[:upload_img].to_i == 1 diskfile2 = disk_auth_filename('UserAuthentication', @user.id, 'PRO') diskfilePRO = diskfile2 + 'temp' begin FileUtils.mv diskfilePRO, diskfile2, force: true if File.exist? diskfilePRO ensure File.delete(diskfilePRO) if File.exist?(diskfilePRO) end end # 提交认证 if params[:save_or_submit] && params[:save_or_submit] == "1" if @se.identity == 1 if ApplyUserAuthentication.where(:user_id => @user.id, :status => 0, :auth_type => 2).count == 0 ApplyUserAuthentication.create(:user_id => @user.id, :status => 0, :auth_type => 2) begin status = Trustie::Sms.send(mobile: '18173242757', send_type:'apply_pro_certification' , name: '管理员') rescue => e Rails.logger.error "发送验证码出错: #{e}" end end else if File.exist?(diskfile2) ApplyUserAuthentication.create(:user_id => @user.id, :status => 0, :auth_type => 2) begin status = Trustie::Sms.send(mobile: '18173242757', send_type:'apply_pro_certification' , name: '管理员') rescue => e Rails.logger.error "发送验证码出错: #{e}" end end end end # 只对试用授权的用户处理,修改职业信息的时候,如果变成了教师,则判断用户是否已加入示例课堂,没有则将其加入 if @se.identity == 0 && @user.certification == 1 join_ex_course @user end end redirect_to my_account_path end # 修改资料时判断学号是否已使用 def check_user_student_id data = {result:0, account:""} if params[:student_id] && params[:school_id] if UserExtensions.where("student_id = '#{params[:student_id]}' and school_id = #{params[:school_id]} and user_id != #{User.current.id}").count > 0 user = User.where(:id => UserExtensions.where("student_id = '#{params[:student_id]}' and school_id = #{params[:school_id]} and user_id != #{User.current.id}").map(&:user_id)).first data[:account] = user.mail.blank? ? user.user_phone : user.user_mail else data[:result] = 1 end end render :json => data end # 实名认证时判断学号是否已使用 def check_student_id data = {result:0, account:""} if params[:student_id] && params[:school_id] auth_count = User.where(:id => UserExtensions.where(:student_id => params[:student_id], :school_id => params[:school_id]).map(&:user_id)).count # apply_count = ApplyUserAuthentication.where(:status => 0, :user_id => User.where(:id => UserExtensions.where(:student_id => params[:student_id], :school_id => params[:school_id]).map(&:user_id), :professional_certification => 0).map(&:id)).count if auth_count == 0 data[:result] = 1 else user = User.where(:id => UserExtensions.where(:student_id => params[:student_id], :school_id => params[:school_id]).map(&:user_id)).first if user != User.current data[:account] = user.mail.blank? ? user.user_phone : user.user_mail else data[:result] = 1 end end end render :json => data end # 实名认证时判断证件号码是否已使用 def check_id_number data = {result:0, account:""} if params[:id_number] id_number = [params[:id_number].downcase, params[:id_number].upcase] auth_count = User.where(:ID_number => id_number, :authentication => 1).count apply_count = ApplyUserAuthentication.where(:status => 0, :user_id => User.where(:ID_number => id_number, :authentication => 0).map(&:id)).count if auth_count == 0 && apply_count == 0 data[:result] = 1 else user = auth_count != 0 ? User.where(:ID_number => id_number, :authentication => 1).first : ApplyUserAuthentication.where(:status => 0, :user_id => User.where(:ID_number => id_number, :authentication => 0).map(&:id)).first.user if user != User.current data[:account] = user.mail.blank? ? user.user_phone : user.user_mail else data[:result] = 1 end end end render :json => data end def cancel_pro_apply unless params[:auth_type] == "2" && User.current.professional_certification @apply_user_auth = ApplyUserAuthentication.where(:user_id => User.current.id, :auth_type => params[:auth_type], :status => 0).first if @apply_user_auth.present? @apply_user_auth.tidings.destroy_all @apply_user_auth.update_attribute('status', 3) diskfile2 = disk_auth_filename('UserAuthentication', User.current.id, params[:auth_type].to_i == 1 ? 'ID' : 'PRO') diskfilePRO = diskfile2 + 'temp' FileUtils.rm diskfilePRO, :force => true FileUtils.rm diskfile2, :force => true end end @user = User.current respond_to do |format| format.js format.html { if params[:auth_type] == "1" redirect_to authentication_account_path else redirect_to professional_certification_account_path end } end end def apply_trail apply_action = ApplyAction.where(:user_id => User.current.id, :container_type => "TrialAuthorization", :status => 0).first school_ids = School.where(:auto_users_trial => 1).map(&:id) user_ex = User.current.user_extensions if user_ex.identity == 1 && user_ex.student_id.present? && !user_ex.school.nil? && school_ids.include?(user_ex.school_id) User.current.update_attributes(:certification => 1) logger.warn("apply_trail #######{User.current.login} ****#{User.current.user_extensions.school_id}") @tip = "申请已提交,我们将在1分钟内完成审核" unless apply_action.present? ApplyAction.create(:user_id => User.current.id, :status => 1, :ip_addr => request.remote_ip, :container_type => "TrialAuthorization", :apply_reason => params[:apply_reason]) else apply_action.update_attributes(:status => 1) end # begin # if User.current.phone.present? # status = Trustie::Sms.send(mobile:User.current.phone.to_s, send_type:'trial_authorization' ,user_name:User.current.show_name,result:'已通过') # end # rescue => e # Rails.logger.error "发送验证码出错: #{e}" # end elsif !User.current.user_extensions.school.nil? @tip = "申请已提交,我们将在5分钟内完成审核" unless apply_action.present? ApplyAction.create(:user_id => User.current.id, :status => 0, :ip_addr => request.remote_ip, :container_type => "TrialAuthorization", :apply_reason => params[:apply_reason]) begin status = Trustie::Sms.send(mobile:18175896138, send_type:'user_apply_auth',name:'管理员' ) rescue => e Rails.logger.error "发送验证码出错: #{e}" end end end if params[:from_user] && params[:from_user] == '1' @url = "#{user_path(User.current)}" else @url = "#{my_account_path}" end respond_to do |format| format.js end end def user_auth @user = User.current diskfile1 = disk_auth_filename('UserAuthentication', @user.id, 'ID') diskfile2 = disk_auth_filename('UserAuthentication', @user.id, 'PRO') diskfileID = diskfile1 + 'temp' diskfilePRO = diskfile2 + 'temp' begin FileUtils.mv diskfileID, diskfile1, force: true if File.exist? diskfileID FileUtils.mv diskfilePRO, diskfile2, force: true if File.exist? diskfilePRO ensure File.delete(diskfileID) if File.exist?(diskfileID) File.delete(diskfilePRO) if File.exist?(diskfilePRO) end if File.exist?(diskfile1) && File.exist?(diskfile2) ApplyUserAuthentication.create(:user_id => @user.id, :status => 0) end redirect_to authentication_account_path end def security_settings @user = User.current @setting_type = 5 render :layout => 'login' end def change_psd @user = User.current @setting_type = 5 render :layout => 'login' end # 修改密码时判断密码是否输入正确 def valid_psd @user = User.current req = Hash.new(false) req[:valid] = false req[:valid] = @user.check_password?(params[:value]) render :json => req end def change_or_bind @user = User.current @type = params[:type] @setting_type = 5 render :layout => 'login' end def bind_email_or_phone @user = User.current begin ActiveRecord::Base.transaction do if params[:type] == "phone" @user.update_attributes!(:phone => params[:value]) reward_grade(@user, @user.id, 'Phone', 500) else @user.update_attributes!(:mail => params[:value]) # Gitlab.client.edit_user_email(@user.gid, :email => @user.mail) if @user.gid reward_grade(@user, @user.id, 'Mail', 500) end end rescue raise ActiveRecord::Rollback end redirect_to my_account_path end def phone_bind if request.get? render :layout =>'login' else User.current.update_attributes!(:phone => params[:phone]) reward_grade(User.current, User.current.id, 'Phone', 500) redirect_to user_path(User.current) end end def unbind_phone if User.current.mail.blank? User.current.update_attribute('phone', nil) User.current.lock! redirect_to signin_path else User.current.update_attribute('phone', nil) redirect_to my_account_path end end def unbind_mail if User.current.phone.blank? User.current.update_attribute('mail', nil) User.current.lock! redirect_to signin_path else User.current.update_attribute('mail', nil) redirect_to my_account_path end end def wechat_bind respond_to do |format| format.html { render :layout => "login_bigdata"} end end def reset_psd if params[:lost_psd_phone] && params[:lost_psd_phone].strip != "" @user = User.where("phone = '#{params[:lost_psd_phone].to_s}'").first code = VerificationCode.where(:phone => params[:lost_psd_phone], :code => params[:code], :code_type => 2).last elsif params[:lost_psd_email] && params[:lost_psd_email].strip != "" @user = User.where("mail = '#{params[:lost_psd_email].to_s}'").first code = VerificationCode.where(:email => params[:lost_psd_email], :code => params[:code], :code_type => 3).last end if !code.nil? && (Time.now.to_i - code.created_at.to_i) <= 10*60 if @user.present? @user.password, @user.password_confirmation = params[:new_password], params[:new_password_confirmation] if @user.save Token.where(:user_id => @user, :action => "recovery").destroy_all respond_to do |format| format.js end else redirect_to signin_path return end else redirect_to signin_path return end else @status = 0 end end def email_valid begin @mail_type = params[:mail].split("@")[1] @user = User.find(params[:user_id]) rescue return render_404 end respond_to do |format| format.html { render :layout => "login_bigdata"} format.js end end def resendmail result = {:status=>1, :email=>""} user = User.find(params[:user]) if params[:user] result[:email] = user.mail token = Token.new(:user => user, :action => "register") if token.save # Mailer.run.register(token) Mailer.register(token).deliver else yield if block_given? result[:status] = 0 end render :json => result end def change_email user = User.find params[:user_id].to_i user.update_attributes(:mail => params[:value]) token = Token.create(:user => user, :action => "register") Mailer.run.register(token) result = {:email => user.mail, :email_link => user.mail.split("@")[1]} render :json => result end def email_activation end def gold_record @user = User.current # 用户签到情况 attendance = Attendance.where(:user_id => @user).first @can_attendance = true @next_attachment_score = 5 if attendance.present? if time_between_days(Time.now, attendance.created_at) == 0 @can_attendance = false end @next_attachment_score = attendance.next_score end @type = params[:type] ? params[:type].to_i : 0 @user_grades = @type == 0 ? @user.grades.reorder("created_at desc") : @type == 1 ? @user.grades.where("score > 0").reorder("created_at desc") : @type == 2 ? @user.grades.where("score < 0").reorder("created_at desc") : [] @user_grades = paginateHelper @user_grades, 8 @setting_type = 7 respond_to do |format| format.js format.html{render :layout => 'base_edu_user'} end end def experience_record @user = User.current # 用户评测情况 @evaluate = Output.where(:game_id => @user.games.map(&:id)).reorder("created_at desc").first @user_experiences = @user.experiences.reorder("created_at desc") @user_experiences = paginateHelper @user_experiences, 8 @setting_type = 8 respond_to do |format| format.js format.html{render :layout => 'base_edu_account'} end end private def authenticate_user Rails.logger.info("authenticate_user start") if Setting.openid? && using_open_id? Rails.logger.info("authenticate_user start1") open_id_authenticate(params[:openid_url]) elsif params[:code] Rails.logger.info("authenticate_user start2") code_authentication else Rails.logger.info("authenticate_user start3") password_authentication end end def password_authentication user, last_login_on = User.try_to_login(params[:username], params[:password]) Rails.logger.info("password_authentication: params[:username] is #{params[:username]}, user is #{user}") if user.nil? Rails.logger.info("password_authentication: successful_authentication1") invalid_credentials elsif user.status == 2 Rails.logger.info("password_authentication: successful_authentication2") @user = user invalid_credentials_new elsif user.new_record? Rails.logger.info("password_authentication: successful_authentication3") onthefly_creation_failed(user, {:login => user.login, :auth_source_id => user.auth_source_id }) else # Valid user Rails.logger.info("password_authentication: successful_authentication4") successful_authentication(user, last_login_on) end end def code_authentication if params[:username] =~ /^[a-zA-Z0-9]+([._\\]*[a-zA-Z0-9])*@([a-z0-9]+[-a-z0-9]*[a-z0-9]+.){1,63}[a-z0-9]+$/ code = VerificationCode.where(:email => params[:username], :code => params[:code], :code_type => 7).last user = User.where(:mail => params[:username]).first elsif params[:username] =~ /^1\d{10}$/ code = VerificationCode.where(:phone => params[:username], :code => params[:code], :code_type => 6).last user = User.where(:phone => params[:username]).first end if user && code && (Time.now.to_i - code.created_at.to_i) <= 10*60 user.update_column(:last_login_on, Time.now) successful_authentication(user, user.last_login_on.nil? ? '' : user.last_login_on.to_s) else logger.warn "Failed login for '#{params[:username]}' from #{request.remote_ip} at #{Time.now.utc}" flash[:error] = l(:notice_account_invalid_code) redirect_to signin_path(:c_name=>params[:username]) end end def open_id_authenticate(openid_url) back_url = signin_url(:autologin => params[:autologin]) authenticate_with_open_id(openid_url, :required => [:nickname, :fullname, :email], :return_to => back_url, :method => :post) do |result, identity_url, registration| if result.successful? user = User.find_or_initialize_by_identity_url(identity_url) if user.new_record? # Self-registration off (redirect_to(signin_path); return) unless Setting.self_registration? # Create on the fly user.login = registration['nickname'] unless registration['nickname'].nil? user.mail = registration['email'] unless registration['email'].nil? user.firstname, user.lastname = registration['fullname'].split(' ') unless registration['fullname'].nil? user.random_password user.register case Setting.self_registration when '1' register_by_email_activation(user) do onthefly_creation_failed(user) end when '3' register_automatically(user) do onthefly_creation_failed(user) end else register_manually_by_administrator(user) do onthefly_creation_failed(user) end end else # Existing record if user.active? successful_authentication(user) else account_pending end end end end end def successful_authentication(user, last_login_on) logger.info "Successful authentication for '#{user.login}' from #{request.remote_ip} at #{Time.now.utc}" # Valid user self.logged_user = user # generate a key and set cookie if autologin if params[:autologin] && Setting.autologin? set_autologin_cookie(user) end call_hook(:controller_account_success_authentication_after, {:user => user }) code = /\d*/ # 记录用户登录行为 UserActions.create(:action_id => User.current.id, :action_type => "Login", :user_id => User.current.id) =begin if user.created_on.strftime('%Y-%m-%d %H:%M:%S') > "2018-01-01 00:00:00" && user.phone.blank? redirect_to change_or_bind_path(:type => 'phone') return end =end #根据home_url生产正则表达式 eval("code = " + "/^" + home_url.gsub(/\//,"\\\/") + "\\\/*(welcome)?\\\/*(\\\/index\\\/*.*)?\$/") login_error = false if (User.current.login =~ /(^(?=.*?[a-zA-Z]).*$)/).nil? || !(User.current.login =~ /[@#\$%\^&\*]+/).nil? login_error = true end if (code=~params[:back_url] || params[:back_url].to_s.include?('lost_password')) && last_login_on != '' && !login_error # enroll_status_cookie(user) redirect_to user_path(user,host: Setting.host_user) else if last_login_on == '' redirect_to my_account_url else #by young #redirect_back_or_default my_page_path # 基本资料不完善的用户,将强制用户完善基本资料。 user = UserExtensions.where(:user_id => User.current.id).first if User.current.lastname.blank? || user.school_id.blank? || user.identity.blank? || login_error redirect_to user_info_path() else # enroll_status_cookie(User.current) redirect_back_or_default User.current, params[:back_url] end end end end def set_autologin_cookie(user) token = Token.get_or_create_permanent_login_token(user) cookie_options = { :value => token.value, :expires => 1.month.from_now, :path => (Redmine::Configuration['autologin_cookie_path'] || '/'), :secure => (Redmine::Configuration['autologin_cookie_secure'] ? true : false), :httponly => true } if Redmine::Configuration['cookie_domain'].present? cookie_options = cookie_options.merge(domain: Redmine::Configuration['cookie_domain']) end cookies[autologin_cookie_name] = cookie_options end # Onthefly creation failed, display the registration form to fill/fix attributes def onthefly_creation_failed(user, auth_source_options = { }) @user = user session[:auth_source_registration] = auth_source_options unless auth_source_options.empty? render :action => 'register' end def invalid_credentials logger.warn "Failed login for '#{params[:username]}' from #{request.remote_ip} at #{Time.now.utc}" flash[:error] = l(:notice_account_invalid_creditentials) # render :layout => 'login' redirect_to signin_path(:name=>params[:username]) end def invalid_credentials_new logger.warn "Failed login for '#{params[:username]}' from #{request.remote_ip} at #{Time.now.utc}" # flash[:error] = l(:notice_account_invalid_creditentials_new) # render signin_path(:login=>true) render :action => 'email_activation',:layout => 'login_bigdata' end # Register a user for email activation. # # Pass a block for behavior when a user fails to save def register_by_email_activation(user, &block) token = Token.new(:user => user, :action => "register") if user.save and token.save UserStatus.create(:user_id => user.id, :changsets_count => 0, :watchers_count => 0) Mailer.run.register(token) flash[:notice] = l(:notice_account_register_done) render action: 'email_valid', locals: {:mail => user.mail} else yield if block_given? end end # Automatically register a user # # Pass a block for behavior when a user fails to save def register_automatically(user, &block) # Automatic activation user.activate user.last_login_on = Time.now if user.save UserStatus.create(:user_id => user.id, :changsets_count => 0, :watchers_count => 0) self.logged_user = user flash[:notice] = l(:notice_account_activated) redirect_to my_account_url else yield if block_given? end end # Manual activation by the administrator # # Pass a block for behavior when a user fails to save def register_manually_by_administrator(user, &block) if user.save UserStatus.create(:user_id => user.id ,:changsets_count => 0, :watchers_count => 0) # Sends an email to the administrators Mailer.run.account_activation_request(user) account_pending else yield if block_given? end end def account_pending flash[:notice] = l(:notice_account_pending) redirect_to signin_url end end