Description:
change to encrypted cookies
Commit status:
[Not Reviewed]
References:
Comments:
0 Commit comments 0 Inline Comments
Unresolved TODOs:
There are no unresolved TODOs
Add another comment

r853:da84d756f1f9 - - 2 files changed: 8 inserted, 6 deleted

@@ -12,100 +12,102
12 MULTIPLE_IP_LOGIN_CONF_KEY = 'right.multiple_ip_login'
12 MULTIPLE_IP_LOGIN_CONF_KEY = 'right.multiple_ip_login'
13 WHITELIST_IGNORE_CONF_KEY = 'right.whitelist_ignore'
13 WHITELIST_IGNORE_CONF_KEY = 'right.whitelist_ignore'
14 WHITELIST_IP_CONF_KEY = 'right.whitelist_ip'
14 WHITELIST_IP_CONF_KEY = 'right.whitelist_ip'
15
15
16 #report and redirect for unauthorized activities
16 #report and redirect for unauthorized activities
17 def unauthorized_redirect(notice = 'You are not authorized to view the page you requested')
17 def unauthorized_redirect(notice = 'You are not authorized to view the page you requested')
18 flash[:notice] = notice
18 flash[:notice] = notice
19 redirect_to login_main_path
19 redirect_to login_main_path
20 end
20 end
21
21
22 # Returns the current logged-in user (if any).
22 # Returns the current logged-in user (if any).
23 def current_user
23 def current_user
24 return nil unless session[:user_id]
24 return nil unless session[:user_id]
25 @current_user ||= User.find(session[:user_id])
25 @current_user ||= User.find(session[:user_id])
26 end
26 end
27
27
28 def nav_announcement
28 def nav_announcement
29 @nav_announcement = Announcement.where(on_nav_bar: true)
29 @nav_announcement = Announcement.where(on_nav_bar: true)
30 end
30 end
31
31
32 def admin_authorization
32 def admin_authorization
33 return false unless check_valid_login
33 return false unless check_valid_login
34 user = User.includes(:roles).find(session[:user_id])
34 user = User.includes(:roles).find(session[:user_id])
35 unless user.admin?
35 unless user.admin?
36 unauthorized_redirect
36 unauthorized_redirect
37 return false
37 return false
38 end
38 end
39 return true
39 return true
40 end
40 end
41
41
42 def authorization_by_roles(allowed_roles)
42 def authorization_by_roles(allowed_roles)
43 return false unless check_valid_login
43 return false unless check_valid_login
44 unless @current_user.roles.detect { |role| allowed_roles.member?(role.name) }
44 unless @current_user.roles.detect { |role| allowed_roles.member?(role.name) }
45 unauthorized_redirect
45 unauthorized_redirect
46 return false
46 return false
47 end
47 end
48 end
48 end
49
49
50 def testcase_authorization
50 def testcase_authorization
51 #admin always has privileged
51 #admin always has privileged
52 if @current_user.admin?
52 if @current_user.admin?
53 return true
53 return true
54 end
54 end
55
55
56 unauthorized_redirect unless GraderConfiguration["right.view_testcase"]
56 unauthorized_redirect unless GraderConfiguration["right.view_testcase"]
57 end
57 end
58
58
59 def unique_visitor_id
59 def unique_visitor_id
60 - unless cookies[:uuid]
60 + unless cookies.encrypted[:uuid]
61 value = SecureRandom.uuid
61 value = SecureRandom.uuid
62 - cookies[:uuid] = { value: value, expires: 20.year }
62 + cookies.encrypted[:uuid] = { value: value, expires: 20.year }
63 end
63 end
64 + puts "encrypt " + cookies.encrypted[:uuid]
65 + puts cookies[:uuid]
64 end
66 end
65
67
66 protected
68 protected
67
69
68 #redirect to root (and also force logout)
70 #redirect to root (and also force logout)
69 #if the user is not logged_in or the system is in "ADMIN ONLY" mode
71 #if the user is not logged_in or the system is in "ADMIN ONLY" mode
70 def check_valid_login
72 def check_valid_login
71 #check if logged in
73 #check if logged in
72 unless session[:user_id]
74 unless session[:user_id]
73 if GraderConfiguration[SINGLE_USER_MODE_CONF_KEY]
75 if GraderConfiguration[SINGLE_USER_MODE_CONF_KEY]
74 unauthorized_redirect('You need to login but you cannot log in at this time')
76 unauthorized_redirect('You need to login but you cannot log in at this time')
75 else
77 else
76 unauthorized_redirect('You need to login')
78 unauthorized_redirect('You need to login')
77 end
79 end
78 return false
80 return false
79 end
81 end
80
82
81 # check if run in single user mode
83 # check if run in single user mode
82 if GraderConfiguration[SINGLE_USER_MODE_CONF_KEY]
84 if GraderConfiguration[SINGLE_USER_MODE_CONF_KEY]
83 if @current_user==nil || (!@current_user.admin?)
85 if @current_user==nil || (!@current_user.admin?)
84 unauthorized_redirect('You cannot log in at this time')
86 unauthorized_redirect('You cannot log in at this time')
85 return false
87 return false
86 end
88 end
87 end
89 end
88
90
89 # check if the user is enabled
91 # check if the user is enabled
90 unless @current_user.enabled? || @current_user.admin?
92 unless @current_user.enabled? || @current_user.admin?
91 unauthorized_redirect 'Your account is disabled'
93 unauthorized_redirect 'Your account is disabled'
92 return false
94 return false
93 end
95 end
94
96
95 # check if user ip is allowed
97 # check if user ip is allowed
96 unless @current_user.admin? || GraderConfiguration[WHITELIST_IGNORE_CONF_KEY]
98 unless @current_user.admin? || GraderConfiguration[WHITELIST_IGNORE_CONF_KEY]
97 unless is_request_ip_allowed?
99 unless is_request_ip_allowed?
98 unauthorized_redirect 'Your IP is not allowed to login at this time.'
100 unauthorized_redirect 'Your IP is not allowed to login at this time.'
99 return false
101 return false
100 end
102 end
101 end
103 end
102
104
103 if GraderConfiguration.multicontests?
105 if GraderConfiguration.multicontests?
104 return true if @current_user.admin?
106 return true if @current_user.admin?
105 begin
107 begin
106 if @current_user.contest_stat(true).forced_logout
108 if @current_user.contest_stat(true).forced_logout
107 flash[:notice] = 'You have been automatically logged out.'
109 flash[:notice] = 'You have been automatically logged out.'
108 redirect_to :controller => 'main', :action => 'index'
110 redirect_to :controller => 'main', :action => 'index'
109 end
111 end
110 rescue
112 rescue
111 end
113 end
@@ -1,99 +1,99
1 class LoginController < ApplicationController
1 class LoginController < ApplicationController
2
2
3 @@authenticators = []
3 @@authenticators = []
4
4
5 def index
5 def index
6 # show login screen
6 # show login screen
7 reset_session
7 reset_session
8 redirect_to :controller => 'main', :action => 'login'
8 redirect_to :controller => 'main', :action => 'login'
9 end
9 end
10
10
11 def login
11 def login
12 user = get_authenticated_user(params[:login], params[:password])
12 user = get_authenticated_user(params[:login], params[:password])
13 unless user
13 unless user
14 flash[:notice] = 'Wrong password'
14 flash[:notice] = 'Wrong password'
15 redirect_to :controller => 'main', :action => 'login'
15 redirect_to :controller => 'main', :action => 'login'
16 return
16 return
17 end
17 end
18
18
19 if (!GraderConfiguration['right.bypass_agreement']) and (!params[:accept_agree]) and !user.admin?
19 if (!GraderConfiguration['right.bypass_agreement']) and (!params[:accept_agree]) and !user.admin?
20 flash[:notice] = 'You must accept the agreement before logging in'
20 flash[:notice] = 'You must accept the agreement before logging in'
21 redirect_to :controller => 'main', :action => 'login'
21 redirect_to :controller => 'main', :action => 'login'
22 return
22 return
23 end
23 end
24
24
25 #store uuid when login
25 #store uuid when login
26 if user.last_ip.nil?
26 if user.last_ip.nil?
27 - user.last_ip = cookies[:uuid]
27 + user.last_ip = cookies.encrypted[:uuid]
28 else
28 else
29 - if user.last_ip != cookies[:uuid]
29 + if user.last_ip != cookies.encrypted[:uuid]
30 - user.last_ip =cookies[:uuid]
30 + user.last_ip =cookies.encrypted[:uuid]
31 #log different login
31 #log different login
32 end
32 end
33 end
33 end
34
34
35 #process logging in
35 #process logging in
36 session[:user_id] = user.id
36 session[:user_id] = user.id
37 session[:admin] = user.admin?
37 session[:admin] = user.admin?
38
38
39 # clear forced logout flag for multicontests contest change
39 # clear forced logout flag for multicontests contest change
40 if GraderConfiguration.multicontests?
40 if GraderConfiguration.multicontests?
41 contest_stat = user.contest_stat
41 contest_stat = user.contest_stat
42 if contest_stat.respond_to? :forced_logout
42 if contest_stat.respond_to? :forced_logout
43 if contest_stat.forced_logout
43 if contest_stat.forced_logout
44 contest_stat.forced_logout = false
44 contest_stat.forced_logout = false
45 contest_stat.save
45 contest_stat.save
46 end
46 end
47 end
47 end
48 end
48 end
49
49
50 #save login information
50 #save login information
51 - Login.create(user_id: user.id, ip_address: cookies[:uuid])
51 + Login.create(user_id: user.id, ip_address: cookies.encrypted[:uuid])
52
52
53 redirect_to :controller => 'main', :action => 'list'
53 redirect_to :controller => 'main', :action => 'list'
54 end
54 end
55
55
56 def site_login
56 def site_login
57 begin
57 begin
58 site = Site.find(params[:login][:site_id])
58 site = Site.find(params[:login][:site_id])
59 rescue ActiveRecord::RecordNotFound
59 rescue ActiveRecord::RecordNotFound
60 site = nil
60 site = nil
61 end
61 end
62 if site==nil
62 if site==nil
63 flash[:notice] = 'Wrong site'
63 flash[:notice] = 'Wrong site'
64 redirect_to :controller => 'main', :action => 'login' and return
64 redirect_to :controller => 'main', :action => 'login' and return
65 end
65 end
66 if (site.password) and (site.password == params[:login][:password])
66 if (site.password) and (site.password == params[:login][:password])
67 session[:site_id] = site.id
67 session[:site_id] = site.id
68 redirect_to :controller => 'site', :action => 'index'
68 redirect_to :controller => 'site', :action => 'index'
69 else
69 else
70 flash[:notice] = 'Wrong site password'
70 flash[:notice] = 'Wrong site password'
71 redirect_to :controller => 'site', :action => 'login'
71 redirect_to :controller => 'site', :action => 'login'
72 end
72 end
73 end
73 end
74
74
75 def logout
75 def logout
76 redirect_to root_path
76 redirect_to root_path
77 end
77 end
78
78
79 def self.add_authenticator(authenticator)
79 def self.add_authenticator(authenticator)
80 @@authenticators << authenticator
80 @@authenticators << authenticator
81 end
81 end
82
82
83 protected
83 protected
84
84
85 def get_authenticated_user(login, password)
85 def get_authenticated_user(login, password)
86 if @@authenticators.empty?
86 if @@authenticators.empty?
87 return User.authenticate(login, password)
87 return User.authenticate(login, password)
88 else
88 else
89 user = User.authenticate(login, password)
89 user = User.authenticate(login, password)
90 @@authenticators.each do |authenticator|
90 @@authenticators.each do |authenticator|
91 if not user
91 if not user
92 user = authenticator.authenticate(login, password)
92 user = authenticator.authenticate(login, password)
93 end
93 end
94 end
94 end
95 return user
95 return user
96 end
96 end
97 end
97 end
98
98
99 end
99 end
You need to be logged in to leave comments. Login now