Show More
Commit Description:
Merge pull request #20 from nattee/master...
Commit Description:
Merge pull request #20 from nattee/master
feature merge
References:
File last commit:
Show/Diff file:
Action:
app/controllers/application_controller.rb
| 138 lines
| 4.1 KiB
| text/x-ruby
| RubyLexer
|
|
r162 | class ApplicationController < ActionController::Base | ||
|
r318 | protect_from_forgery | ||
|
r162 | |||
r627 | before_filter :current_user | |||
r554 | ||||
|
r162 | SINGLE_USER_MODE_CONF_KEY = 'system.single_user_mode' | ||
r525 | MULTIPLE_IP_LOGIN_CONF_KEY = 'right.multiple_ip_login' | |||
|
r162 | |||
r593 | #report and redirect for unauthorized activities | |||
def unauthorized_redirect | ||||
flash[:notice] = 'You are not authorized to view the page you requested' | ||||
redirect_to :controller => 'main', :action => 'login' | ||||
end | ||||
r554 | # Returns the current logged-in user (if any). | |||
def current_user | ||||
r556 | return nil unless session[:user_id] | |||
r554 | @current_user ||= User.find(session[:user_id]) | |||
end | ||||
|
r162 | def admin_authorization | ||
return false unless authenticate | ||||
r619 | user = User.includes(:roles).find(session[:user_id]) | |||
r425 | unless user.admin? | |||
r593 | unauthorized_redirect | |||
r425 | return false | |||
end | ||||
return true | ||||
|
r162 | end | ||
def authorization_by_roles(allowed_roles) | ||||
return false unless authenticate | ||||
user = User.find(session[:user_id]) | ||||
unless user.roles.detect { |role| allowed_roles.member?(role.name) } | ||||
r593 | unauthorized_redirect | |||
|
r162 | return false | ||
end | ||||
end | ||||
r625 | def testcase_authorization | |||
#admin always has privileged | ||||
if @current_user.admin? | ||||
return true | ||||
end | ||||
r632 | unauthorized_redirect unless GraderConfiguration["right.view_testcase"] | |||
r625 | end | |||
|
r162 | protected | ||
def authenticate | ||||
unless session[:user_id] | ||||
r424 | flash[:notice] = 'You need to login' | |||
if GraderConfiguration[SINGLE_USER_MODE_CONF_KEY] | ||||
flash[:notice] = 'You need to login but you cannot log in at this time' | ||||
end | ||||
|
r162 | redirect_to :controller => 'main', :action => 'login' | ||
return false | ||||
end | ||||
r670 | ||||
|
r162 | # check if run in single user mode | ||
|
r320 | if GraderConfiguration[SINGLE_USER_MODE_CONF_KEY] | ||
r670 | if @current_user==nil or (not @current_user.admin?) | |||
|
r301 | flash[:notice] = 'You cannot log in at this time' | ||
|
r162 | redirect_to :controller => 'main', :action => 'login' | ||
return false | ||||
end | ||||
|
r295 | return true | ||
|
r162 | end | ||
r670 | # check if the user is enabled | |||
unless @current_user.enabled? or @current_user.admin? | ||||
flash[:notice] = 'Your account is disabled' | ||||
redirect_to :controller => 'main', :action => 'login' | ||||
return false | ||||
end | ||||
|
r320 | if GraderConfiguration.multicontests? | ||
r670 | return true if @current_user.admin? | |||
|
r295 | begin | ||
r670 | if @current_user.contest_stat(true).forced_logout | |||
|
r295 | flash[:notice] = 'You have been automatically logged out.' | ||
redirect_to :controller => 'main', :action => 'index' | ||||
end | ||||
rescue | ||||
end | ||||
end | ||||
|
r162 | return true | ||
end | ||||
r525 | def authenticate_by_ip_address | |||
#this assume that we have already authenticate normally | ||||
unless GraderConfiguration[MULTIPLE_IP_LOGIN_CONF_KEY] | ||||
user = User.find(session[:user_id]) | ||||
if (not user.admin? and user.last_ip and user.last_ip != request.remote_ip) | ||||
flash[:notice] = "You cannot use the system from #{request.remote_ip}. Your last ip is #{user.last_ip}" | ||||
redirect_to :controller => 'main', :action => 'login' | ||||
r539 | puts "CHEAT: user #{user.login} tried to login from '#{request.remote_ip}' while last ip is '#{user.last_ip}' at #{Time.zone.now}" | |||
r525 | return false | |||
end | ||||
unless user.last_ip | ||||
user.last_ip = request.remote_ip | ||||
user.save | ||||
end | ||||
end | ||||
return true | ||||
end | ||||
|
r162 | def authorization | ||
return false unless authenticate | ||||
user = User.find(session[:user_id]) | ||||
unless user.roles.detect { |role| | ||||
r632 | role.rights.detect{ |right| | |||
right.controller == self.class.controller_name and | ||||
(right.action == 'all' or right.action == action_name) | ||||
} | ||||
|
r162 | } | ||
flash[:notice] = 'You are not authorized to view the page you requested' | ||||
#request.env['HTTP_REFERER'] ? (redirect_to :back) : (redirect_to :controller => 'login') | ||||
redirect_to :controller => 'main', :action => 'login' | ||||
return false | ||||
end | ||||
end | ||||
def verify_time_limit | ||||
return true if session[:user_id]==nil | ||||
user = User.find(session[:user_id], :include => :site) | ||||
return true if user==nil or user.site == nil | ||||
|
r217 | if user.contest_finished? | ||
flash[:notice] = 'Error: the contest you are participating is over.' | ||||
|
r162 | redirect_to :back | ||
return false | ||||
end | ||||
return true | ||||
end | ||||
end | ||||