137 lines
4.0 KiB
Ruby
137 lines
4.0 KiB
Ruby
module AuthenticationSystem
|
|
def self.included(controller)
|
|
controller.helper_method(:current_user, :current_ask_part, :logged_in?, :admin?, :editor?, :group_admin_of?, :new_user?) if controller.respond_to?(:helper_method)
|
|
end
|
|
|
|
def group_admin_required_of(board)
|
|
render_404 unless group_admin_of?(board)
|
|
end
|
|
|
|
protected
|
|
def login_required
|
|
login_by_token unless logged_in?
|
|
if logged_in?
|
|
if current_user.disable?
|
|
if request.xml_http_request?
|
|
render(:update, :status => 302){|page| page.redirect_to("/index/disable_user_notice")}
|
|
return false
|
|
else
|
|
render '/main/disable_user_notice', :layout => 'application'
|
|
end
|
|
elsif UnsafeUser.find_by_id_and_password(current_user.id, current_user.encrypted_password)
|
|
render '/main/unsafe_user_notice', :layout => 'application'
|
|
elsif new_user?
|
|
if request.xml_http_request?
|
|
render(:update, :status => 302){|page| page.redirect_to("/index/new_user_notice")}
|
|
return false
|
|
else
|
|
render '/main/new_user_notice', :layout => 'application'
|
|
end
|
|
elsif forum_actions? && (current_user.blocked? || !current_user.certified?)
|
|
if current_user.blocked?
|
|
redirect_to_action = "forum_blocked_notice"
|
|
elsif !current_user.certified?
|
|
redirect_to_action = "forum_certify"
|
|
end
|
|
|
|
if request.xml_http_request?
|
|
render(:update, :status => 302){|page| page.redirect_to("/index/#{redirect_to_action}")}
|
|
return false
|
|
else
|
|
redirect_to :controller => "/main", :action => redirect_to_action and return false
|
|
end
|
|
elsif not authorized?
|
|
flash[:error] = "您没有权限执行这项操作,请检查登录的账号是否正确"
|
|
redirect_to login_path
|
|
elsif current_user.name =~ /[@ ]/
|
|
if request.xml_http_request?
|
|
render(:update, :status => 302){|page| page.redirect_to("/index/rename")}
|
|
return false
|
|
else
|
|
redirect_to :controller => "/main", :action => "rename", :host => DEFAULT_SITE_DOMAIN
|
|
end
|
|
end
|
|
else
|
|
if request.xml_http_request?
|
|
render :update, :status => 401 do |page|
|
|
page << "if(confirm('您需要登录以后才能执行这个操作,现在要登录吗?')) window.location.href = '/login';"
|
|
end
|
|
else
|
|
session[:original_uri] = request.url if request.get? && !session[:original_uri]
|
|
flash[:error] = "请您先登录,才能继续操作"
|
|
redirect_to "http://#{DEFAULT_SITE_DOMAIN}/login"
|
|
end
|
|
end
|
|
end
|
|
|
|
def login_by_token
|
|
if cookies[:login_token] && !logged_in?
|
|
token = Base64.decode64(cookies[:login_token]).split(/_/)
|
|
user = User.find_by_id_and_encrypted_password(token.first.to_i, token.last)
|
|
if user.nil?
|
|
cookies[:login_token] = {:domain => DEFAULT_ROOT_DOMAIN ,:value => nil, :path => '/', :expires => Time.at(0)}
|
|
else
|
|
session[:user_id] = user.id
|
|
@current_user = user
|
|
end
|
|
end
|
|
end
|
|
|
|
def new_user?
|
|
current_user.new_registered?
|
|
end
|
|
|
|
def forum_actions?
|
|
false
|
|
end
|
|
|
|
def authorized?
|
|
true
|
|
end
|
|
|
|
def current_user
|
|
@current_user ||= ((session[:user_id] && User.find_by_id(session[:user_id])) || -1)
|
|
end
|
|
|
|
def current_ask_part
|
|
@_ask_part ||= current_user.ask_part if logged_in?
|
|
end
|
|
|
|
def logged_in?
|
|
current_user != -1
|
|
end
|
|
|
|
def admin?
|
|
logged_in? && current_user.admin?
|
|
end
|
|
|
|
def editor?
|
|
logged_in? && current_user.editor?
|
|
end
|
|
|
|
def editor_required
|
|
render_404 unless editor?
|
|
end
|
|
|
|
def group_admin?
|
|
@group_admin ||= group_admin_of?("groups")
|
|
end
|
|
|
|
def group_admin_of?(board)
|
|
(group? && ((logged_in? && @group.admin_by?(current_user)) || admin_of?(board)))
|
|
end
|
|
|
|
def group_admin_required
|
|
render_404 unless group_admin?
|
|
end
|
|
|
|
def redirect_or_remote_to(url)
|
|
if request.xhr?
|
|
render(:update, :status => 302){|page| page.redirect_to url}
|
|
return false
|
|
else
|
|
redirect_to url
|
|
end
|
|
end
|
|
end
|