Description:
fixed user confirmation bug git-svn-id: http://theory.cpe.ku.ac.th/grader/web/trunk@305 6386c4cd-e34a-4fa8-8920-d93eb39b512e
Commit status:
[Not Reviewed]
References:
Comments:
0 Commit comments 0 Inline Comments
Unresolved TODOs:
There are no unresolved TODOs
Add another comment

r160:0138848b0c5b - - 5 files changed: 23 inserted, 12 deleted

@@ -1,222 +1,230
1 class MainController < ApplicationController
1 class MainController < ApplicationController
2
2
3 SYSTEM_MODE_CONF_KEY = 'system.mode'
3 SYSTEM_MODE_CONF_KEY = 'system.mode'
4
4
5 before_filter :authenticate, :except => [:index, :login]
5 before_filter :authenticate, :except => [:index, :login]
6 before_filter :check_viewability, :except => [:index, :login]
6 before_filter :check_viewability, :except => [:index, :login]
7
7
8 - #
8 + # COMMENTED OUT: filter in each action instead
9 - # COMMENT OUT: filter in each action instead
10 - #
11 # before_filter :verify_time_limit, :only => [:submit]
9 # before_filter :verify_time_limit, :only => [:submit]
12
10
13 verify :method => :post, :only => [:submit],
11 verify :method => :post, :only => [:submit],
14 :redirect_to => { :action => :index }
12 :redirect_to => { :action => :index }
15
13
16 - # COMMENT OUT, only need when having high load
14 + # COMMENT OUT: only need when having high load
17 # caches_action :index, :login
15 # caches_action :index, :login
18
16
17 + # NOTE: This method is not actually needed, 'config/routes.rb' has
18 + # assigned action login as a default action.
19 def index
19 def index
20 redirect_to :action => 'login'
20 redirect_to :action => 'login'
21 end
21 end
22
22
23 def login
23 def login
24 saved_notice = flash[:notice]
24 saved_notice = flash[:notice]
25 reset_session
25 reset_session
26 flash[:notice] = saved_notice
26 flash[:notice] = saved_notice
27
27
28 + # EXPERIMENT:
29 + # Hide login if in single user mode and the url does not
30 + # explicitly specify /login
28 #
31 #
29 - # These are for site administrator login
32 + # logger.info "PATH: #{request.path}"
30 - #
33 + # if Configuration['system.single_user_mode'] and
34 + # request.path!='/main/login'
35 + # @hidelogin = true
36 + # end
37 +
38 + # Site administrator login
31 @countries = Country.find(:all, :include => :sites)
39 @countries = Country.find(:all, :include => :sites)
32 @country_select = @countries.collect { |c| [c.name, c.id] }
40 @country_select = @countries.collect { |c| [c.name, c.id] }
33
41
34 @country_select_with_all = [['Any',0]]
42 @country_select_with_all = [['Any',0]]
35 @countries.each do |country|
43 @countries.each do |country|
36 @country_select_with_all << [country.name, country.id]
44 @country_select_with_all << [country.name, country.id]
37 end
45 end
38
46
39 @site_select = []
47 @site_select = []
40 @countries.each do |country|
48 @countries.each do |country|
41 country.sites.each do |site|
49 country.sites.each do |site|
42 @site_select << ["#{site.name}, #{country.name}", site.id]
50 @site_select << ["#{site.name}, #{country.name}", site.id]
43 end
51 end
44 end
52 end
45
53
46 @announcements = Announcement.find_for_frontpage
54 @announcements = Announcement.find_for_frontpage
47 render :action => 'login', :layout => 'empty'
55 render :action => 'login', :layout => 'empty'
48 end
56 end
49
57
50 def list
58 def list
51 prepare_list_information
59 prepare_list_information
52 end
60 end
53
61
54 def help
62 def help
55 @user = User.find(session[:user_id])
63 @user = User.find(session[:user_id])
56 end
64 end
57
65
58 def submit
66 def submit
59 user = User.find(session[:user_id])
67 user = User.find(session[:user_id])
60
68
61 @submission = Submission.new(params[:submission])
69 @submission = Submission.new(params[:submission])
62 @submission.user = user
70 @submission.user = user
63 @submission.language_id = 0
71 @submission.language_id = 0
64 if params['file']!=''
72 if params['file']!=''
65 @submission.source = params['file'].read
73 @submission.source = params['file'].read
66 @submission.source_filename = params['file'].original_filename
74 @submission.source_filename = params['file'].original_filename
67 end
75 end
68 @submission.submitted_at = Time.new.gmtime
76 @submission.submitted_at = Time.new.gmtime
69
77
70 if Configuration[SYSTEM_MODE_CONF_KEY]=='contest' and
78 if Configuration[SYSTEM_MODE_CONF_KEY]=='contest' and
71 user.site!=nil and user.site.finished?
79 user.site!=nil and user.site.finished?
72 @submission.errors.add_to_base "The contest is over."
80 @submission.errors.add_to_base "The contest is over."
73 prepare_list_information
81 prepare_list_information
74 render :action => 'list' and return
82 render :action => 'list' and return
75 end
83 end
76
84
77 if @submission.valid?
85 if @submission.valid?
78 if @submission.save == false
86 if @submission.save == false
79 flash[:notice] = 'Error saving your submission'
87 flash[:notice] = 'Error saving your submission'
80 elsif Task.create(:submission_id => @submission.id,
88 elsif Task.create(:submission_id => @submission.id,
81 :status => Task::STATUS_INQUEUE) == false
89 :status => Task::STATUS_INQUEUE) == false
82 flash[:notice] = 'Error adding your submission to task queue'
90 flash[:notice] = 'Error adding your submission to task queue'
83 end
91 end
84 else
92 else
85 prepare_list_information
93 prepare_list_information
86 render :action => 'list' and return
94 render :action => 'list' and return
87 end
95 end
88 redirect_to :action => 'list'
96 redirect_to :action => 'list'
89 end
97 end
90
98
91 def source
99 def source
92 submission = Submission.find(params[:id])
100 submission = Submission.find(params[:id])
93 if submission.user_id == session[:user_id]
101 if submission.user_id == session[:user_id]
94 if submission.problem.output_only
102 if submission.problem.output_only
95 fname = submission.source_filename
103 fname = submission.source_filename
96 else
104 else
97 fname = submission.problem.name + '.' + submission.language.ext
105 fname = submission.problem.name + '.' + submission.language.ext
98 end
106 end
99 send_data(submission.source,
107 send_data(submission.source,
100 {:filename => fname,
108 {:filename => fname,
101 :type => 'text/plain'})
109 :type => 'text/plain'})
102 else
110 else
103 flash[:notice] = 'Error viewing source'
111 flash[:notice] = 'Error viewing source'
104 redirect_to :action => 'list'
112 redirect_to :action => 'list'
105 end
113 end
106 end
114 end
107
115
108 def compiler_msg
116 def compiler_msg
109 @submission = Submission.find(params[:id])
117 @submission = Submission.find(params[:id])
110 if @submission.user_id == session[:user_id]
118 if @submission.user_id == session[:user_id]
111 render :action => 'compiler_msg', :layout => 'empty'
119 render :action => 'compiler_msg', :layout => 'empty'
112 else
120 else
113 flash[:notice] = 'Error viewing source'
121 flash[:notice] = 'Error viewing source'
114 redirect_to :action => 'list'
122 redirect_to :action => 'list'
115 end
123 end
116 end
124 end
117
125
118 def submission
126 def submission
119 @user = User.find(session[:user_id])
127 @user = User.find(session[:user_id])
120 @problems = Problem.find_available_problems
128 @problems = Problem.find_available_problems
121 if params[:id]==nil
129 if params[:id]==nil
122 @problem = nil
130 @problem = nil
123 @submissions = nil
131 @submissions = nil
124 else
132 else
125 @problem = Problem.find_by_name(params[:id])
133 @problem = Problem.find_by_name(params[:id])
126 if not @problem.available
134 if not @problem.available
127 redirect_to :action => 'list'
135 redirect_to :action => 'list'
128 flash[:notice] = 'Error: submissions for that problem are not viewable.'
136 flash[:notice] = 'Error: submissions for that problem are not viewable.'
129 return
137 return
130 end
138 end
131 @submissions = Submission.find_all_by_user_problem(@user.id, @problem.id)
139 @submissions = Submission.find_all_by_user_problem(@user.id, @problem.id)
132 end
140 end
133 end
141 end
134
142
135 def result
143 def result
136 if !Configuration.show_grading_result
144 if !Configuration.show_grading_result
137 redirect_to :action => 'list' and return
145 redirect_to :action => 'list' and return
138 end
146 end
139 @user = User.find(session[:user_id])
147 @user = User.find(session[:user_id])
140 @submission = Submission.find(params[:id])
148 @submission = Submission.find(params[:id])
141 if @submission.user!=@user
149 if @submission.user!=@user
142 flash[:notice] = 'You are not allowed to view result of other users.'
150 flash[:notice] = 'You are not allowed to view result of other users.'
143 redirect_to :action => 'list' and return
151 redirect_to :action => 'list' and return
144 end
152 end
145 prepare_grading_result(@submission)
153 prepare_grading_result(@submission)
146 end
154 end
147
155
148 def load_output
156 def load_output
149 if !Configuration.show_grading_result or params[:num]==nil
157 if !Configuration.show_grading_result or params[:num]==nil
150 redirect_to :action => 'list' and return
158 redirect_to :action => 'list' and return
151 end
159 end
152 @user = User.find(session[:user_id])
160 @user = User.find(session[:user_id])
153 @submission = Submission.find(params[:id])
161 @submission = Submission.find(params[:id])
154 if @submission.user!=@user
162 if @submission.user!=@user
155 flash[:notice] = 'You are not allowed to view result of other users.'
163 flash[:notice] = 'You are not allowed to view result of other users.'
156 redirect_to :action => 'list' and return
164 redirect_to :action => 'list' and return
157 end
165 end
158 case_num = params[:num].to_i
166 case_num = params[:num].to_i
159 out_filename = output_filename(@user.login,
167 out_filename = output_filename(@user.login,
160 @submission.problem.name,
168 @submission.problem.name,
161 @submission.id,
169 @submission.id,
162 case_num)
170 case_num)
163 if !FileTest.exists?(out_filename)
171 if !FileTest.exists?(out_filename)
164 flash[:notice] = 'Output not found.'
172 flash[:notice] = 'Output not found.'
165 redirect_to :action => 'list' and return
173 redirect_to :action => 'list' and return
166 end
174 end
167
175
168 response.headers['Content-Type'] = "application/force-download"
176 response.headers['Content-Type'] = "application/force-download"
169 response.headers['Content-Disposition'] = "attachment; filename=\"output-#{case_num}.txt\""
177 response.headers['Content-Disposition'] = "attachment; filename=\"output-#{case_num}.txt\""
170 response.headers["X-Sendfile"] = out_filename
178 response.headers["X-Sendfile"] = out_filename
171 response.headers['Content-length'] = File.size(out_filename)
179 response.headers['Content-length'] = File.size(out_filename)
172 render :nothing => true
180 render :nothing => true
173 end
181 end
174
182
175 def error
183 def error
176 @user = User.find(session[:user_id])
184 @user = User.find(session[:user_id])
177 end
185 end
178
186
179 protected
187 protected
180 def prepare_list_information
188 def prepare_list_information
181 @problems = Problem.find_available_problems
189 @problems = Problem.find_available_problems
182 @prob_submissions = Array.new
190 @prob_submissions = Array.new
183 @user = User.find(session[:user_id])
191 @user = User.find(session[:user_id])
184 @problems.each do |p|
192 @problems.each do |p|
185 sub = Submission.find_last_by_user_and_problem(@user.id,p.id)
193 sub = Submission.find_last_by_user_and_problem(@user.id,p.id)
186 if sub!=nil
194 if sub!=nil
187 @prob_submissions << { :count => sub.number, :submission => sub }
195 @prob_submissions << { :count => sub.number, :submission => sub }
188 else
196 else
189 @prob_submissions << { :count => 0, :submission => nil }
197 @prob_submissions << { :count => 0, :submission => nil }
190 end
198 end
191 end
199 end
192 @announcements = Announcement.find_published
200 @announcements = Announcement.find_published
193 end
201 end
194
202
195 def check_viewability
203 def check_viewability
196 @user = User.find(session[:user_id])
204 @user = User.find(session[:user_id])
197 if (!Configuration.show_tasks_to?(@user)) and
205 if (!Configuration.show_tasks_to?(@user)) and
198 ((action_name=='submission') or (action_name=='submit'))
206 ((action_name=='submission') or (action_name=='submit'))
199 redirect_to :action => 'list' and return
207 redirect_to :action => 'list' and return
200 end
208 end
201 end
209 end
202
210
203 def prepare_grading_result(submission)
211 def prepare_grading_result(submission)
204 grading_info = Configuration.task_grading_info[submission.problem.name]
212 grading_info = Configuration.task_grading_info[submission.problem.name]
205 @test_runs = []
213 @test_runs = []
206 if grading_info['testruns'].is_a? Integer
214 if grading_info['testruns'].is_a? Integer
207 trun_count = grading_info['testruns']
215 trun_count = grading_info['testruns']
208 trun_count.times do |i|
216 trun_count.times do |i|
209 @test_runs << [ read_grading_result(@user.login,
217 @test_runs << [ read_grading_result(@user.login,
210 submission.problem.name,
218 submission.problem.name,
211 submission.id,
219 submission.id,
212 i+1) ]
220 i+1) ]
213 end
221 end
214 else
222 else
215 grading_info['testruns'].keys.sort.each do |num|
223 grading_info['testruns'].keys.sort.each do |num|
216 run = []
224 run = []
217 testrun = grading_info['testruns'][num]
225 testrun = grading_info['testruns'][num]
218 testrun.each do |c|
226 testrun.each do |c|
219 run << read_grading_result(@user.login,
227 run << read_grading_result(@user.login,
220 submission.problem.name,
228 submission.problem.name,
221 submission.id,
229 submission.id,
222 c)
230 c)
@@ -1,116 +1,116
1 require 'tmail'
1 require 'tmail'
2 require 'net/smtp'
2 require 'net/smtp'
3
3
4 class UsersController < ApplicationController
4 class UsersController < ApplicationController
5
5
6 before_filter :authenticate, :except => [:new, :register, :confirm]
6 before_filter :authenticate, :except => [:new, :register, :confirm]
7
7
8 verify :method => :post, :only => [:chg_passwd],
8 verify :method => :post, :only => [:chg_passwd],
9 :redirect_to => { :action => :index }
9 :redirect_to => { :action => :index }
10
10
11 in_place_edit_for :user, :alias_for_editing
11 in_place_edit_for :user, :alias_for_editing
12 in_place_edit_for :user, :email_for_editing
12 in_place_edit_for :user, :email_for_editing
13
13
14 def index
14 def index
15 if !Configuration['system.user_setting_enabled']
15 if !Configuration['system.user_setting_enabled']
16 redirect_to :controller => 'main', :action => 'list'
16 redirect_to :controller => 'main', :action => 'list'
17 else
17 else
18 @user = User.find(session[:user_id])
18 @user = User.find(session[:user_id])
19 end
19 end
20 end
20 end
21
21
22 def chg_passwd
22 def chg_passwd
23 user = User.find(session[:user_id])
23 user = User.find(session[:user_id])
24 user.password = params[:passwd]
24 user.password = params[:passwd]
25 user.password_confirmation = params[:passwd_verify]
25 user.password_confirmation = params[:passwd_verify]
26 if user.save
26 if user.save
27 flash[:notice] = 'password changed'
27 flash[:notice] = 'password changed'
28 else
28 else
29 flash[:notice] = 'Error: password changing failed'
29 flash[:notice] = 'Error: password changing failed'
30 end
30 end
31 redirect_to :action => 'index'
31 redirect_to :action => 'index'
32 end
32 end
33
33
34 def new
34 def new
35 @user = User.new
35 @user = User.new
36 render :action => 'new', :layout => 'empty'
36 render :action => 'new', :layout => 'empty'
37 end
37 end
38
38
39 def register
39 def register
40 @user = User.new(params[:user])
40 @user = User.new(params[:user])
41 @user.password_confirmation = @user.password = User.random_password
41 @user.password_confirmation = @user.password = User.random_password
42 @user.activated = false
42 @user.activated = false
43 if (@user.valid?) and (@user.save)
43 if (@user.valid?) and (@user.save)
44 if send_confirmation_email(@user)
44 if send_confirmation_email(@user)
45 render :action => 'new_splash', :layout => 'empty'
45 render :action => 'new_splash', :layout => 'empty'
46 else
46 else
47 render :action => 'email_error', :layout => 'empty'
47 render :action => 'email_error', :layout => 'empty'
48 end
48 end
49 else
49 else
50 @user.errors.add_to_base("Email cannot be blank") if @user.email==''
50 @user.errors.add_to_base("Email cannot be blank") if @user.email==''
51 render :action => 'new', :layout => 'empty'
51 render :action => 'new', :layout => 'empty'
52 end
52 end
53 end
53 end
54
54
55 def confirm
55 def confirm
56 login = params[:login]
56 login = params[:login]
57 key = params[:activation]
57 key = params[:activation]
58 - user = User.find_by_login(login)
58 + @user = User.find_by_login(login)
59 - if (user) and (user.verify_activation_key(key))
59 + if (@user) and (@user.verify_activation_key(key))
60 - if user.valid? # check uniquenss of email
60 + if @user.valid? # check uniquenss of email
61 - user.activated = true
61 + @user.activated = true
62 - user.save
62 + @user.save
63 @result = :successful
63 @result = :successful
64 else
64 else
65 @result = :email_used
65 @result = :email_used
66 end
66 end
67 else
67 else
68 @result = :failed
68 @result = :failed
69 end
69 end
70 render :action => 'confirm', :layout => 'empty'
70 render :action => 'confirm', :layout => 'empty'
71 end
71 end
72
72
73 protected
73 protected
74
74
75 def send_confirmation_email(user)
75 def send_confirmation_email(user)
76 contest_name = Configuration['contest.name']
76 contest_name = Configuration['contest.name']
77 activation_url = url_for(:action => 'confirm',
77 activation_url = url_for(:action => 'confirm',
78 :login => user.login,
78 :login => user.login,
79 :activation => user.activation_key)
79 :activation => user.activation_key)
80 home_url = url_for(:controller => 'main', :action => 'index')
80 home_url = url_for(:controller => 'main', :action => 'index')
81 mail = TMail::Mail.new
81 mail = TMail::Mail.new
82 mail.to = user.email
82 mail.to = user.email
83 mail.from = Configuration['system.online_registration.from']
83 mail.from = Configuration['system.online_registration.from']
84 mail.subject = "[#{contest_name}] Confirmation"
84 mail.subject = "[#{contest_name}] Confirmation"
85 mail.body = <<-EOF
85 mail.body = <<-EOF
86 Hello #{user.full_name},
86 Hello #{user.full_name},
87
87
88 You have registered for #{contest_name} (#{home_url}).
88 You have registered for #{contest_name} (#{home_url}).
89
89
90 Your login is: #{user.login}
90 Your login is: #{user.login}
91 Your password is: #{user.password}
91 Your password is: #{user.password}
92
92
93 Please follow the link:
93 Please follow the link:
94 #{activation_url}
94 #{activation_url}
95 to activate your user account.
95 to activate your user account.
96
96
97 If you did not register, please ignore this e-mail.
97 If you did not register, please ignore this e-mail.
98
98
99 Thanks!
99 Thanks!
100 EOF
100 EOF
101
101
102 smtp_server = Configuration['system.online_registration.smtp']
102 smtp_server = Configuration['system.online_registration.smtp']
103
103
104 begin
104 begin
105 Net::SMTP.start(smtp_server) do |smtp|
105 Net::SMTP.start(smtp_server) do |smtp|
106 smtp.send_message(mail.to_s, mail.from, mail.to)
106 smtp.send_message(mail.to_s, mail.from, mail.to)
107 end
107 end
108 result = true
108 result = true
109 rescue
109 rescue
110 result = false
110 result = false
111 end
111 end
112
112
113 return result
113 return result
114 end
114 end
115
115
116 end
116 end
@@ -1,138 +1,139
1 require 'digest/sha1'
1 require 'digest/sha1'
2
2
3 class User < ActiveRecord::Base
3 class User < ActiveRecord::Base
4
4
5 has_and_belongs_to_many :roles
5 has_and_belongs_to_many :roles
6
6
7 has_many :test_requests, :order => "submitted_at DESC"
7 has_many :test_requests, :order => "submitted_at DESC"
8
8
9 has_many :messages,
9 has_many :messages,
10 :class_name => "Message",
10 :class_name => "Message",
11 :foreign_key => "sender_id",
11 :foreign_key => "sender_id",
12 :order => 'created_at DESC'
12 :order => 'created_at DESC'
13
13
14 has_many :replied_messages,
14 has_many :replied_messages,
15 :class_name => "Message",
15 :class_name => "Message",
16 :foreign_key => "receiver_id",
16 :foreign_key => "receiver_id",
17 :order => 'created_at DESC'
17 :order => 'created_at DESC'
18
18
19 belongs_to :site
19 belongs_to :site
20 belongs_to :country
20 belongs_to :country
21
21
22 named_scope :activated_users, :conditions => {:activated => true}
22 named_scope :activated_users, :conditions => {:activated => true}
23
23
24 validates_presence_of :login
24 validates_presence_of :login
25 validates_uniqueness_of :login
25 validates_uniqueness_of :login
26 validates_format_of :login, :with => /^[\_a-z0-9]+$/
26 validates_format_of :login, :with => /^[\_a-z0-9]+$/
27 validates_length_of :login, :within => 3..10
27 validates_length_of :login, :within => 3..10
28
28
29 validates_presence_of :full_name
29 validates_presence_of :full_name
30 validates_length_of :full_name, :minimum => 1
30 validates_length_of :full_name, :minimum => 1
31
31
32 validates_presence_of :password, :if => :password_required?
32 validates_presence_of :password, :if => :password_required?
33 validates_length_of :password, :within => 4..20, :if => :password_required?
33 validates_length_of :password, :within => 4..20, :if => :password_required?
34 validates_confirmation_of :password, :if => :password_required?
34 validates_confirmation_of :password, :if => :password_required?
35
35
36 validates_format_of :email, :with => /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/i, :allow_blank => true
36 validates_format_of :email, :with => /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/i, :allow_blank => true
37
37
38 validate :uniqueness_of_email_from_activated_users
38 validate :uniqueness_of_email_from_activated_users
39 validate :enough_time_interval_between_same_email_registrations
39 validate :enough_time_interval_between_same_email_registrations
40
40
41 attr_accessor :password
41 attr_accessor :password
42
42
43 before_save :encrypt_new_password
43 before_save :encrypt_new_password
44
44
45 def self.authenticate(login, password)
45 def self.authenticate(login, password)
46 user = find_by_login(login)
46 user = find_by_login(login)
47 return user if user && user.authenticated?(password)
47 return user if user && user.authenticated?(password)
48 end
48 end
49
49
50 def authenticated?(password)
50 def authenticated?(password)
51 if self.activated
51 if self.activated
52 hashed_password == User.encrypt(password,self.salt)
52 hashed_password == User.encrypt(password,self.salt)
53 else
53 else
54 false
54 false
55 end
55 end
56 end
56 end
57
57
58 def admin?
58 def admin?
59 self.roles.detect {|r| r.name == 'admin' }
59 self.roles.detect {|r| r.name == 'admin' }
60 end
60 end
61
61
62 def email_for_editing
62 def email_for_editing
63 if self.email==nil
63 if self.email==nil
64 "(unknown)"
64 "(unknown)"
65 elsif self.email==''
65 elsif self.email==''
66 "(blank)"
66 "(blank)"
67 else
67 else
68 self.email
68 self.email
69 end
69 end
70 end
70 end
71
71
72 def email_for_editing=(e)
72 def email_for_editing=(e)
73 self.email=e
73 self.email=e
74 end
74 end
75
75
76 def alias_for_editing
76 def alias_for_editing
77 if self.alias==nil
77 if self.alias==nil
78 "(unknown)"
78 "(unknown)"
79 elsif self.alias==''
79 elsif self.alias==''
80 "(blank)"
80 "(blank)"
81 else
81 else
82 self.alias
82 self.alias
83 end
83 end
84 end
84 end
85
85
86 def alias_for_editing=(e)
86 def alias_for_editing=(e)
87 self.alias=e
87 self.alias=e
88 end
88 end
89
89
90 def activation_key
90 def activation_key
91 if self.hashed_password==nil
91 if self.hashed_password==nil
92 encrypt_new_password
92 encrypt_new_password
93 end
93 end
94 Digest::SHA1.hexdigest(self.hashed_password)[0..7]
94 Digest::SHA1.hexdigest(self.hashed_password)[0..7]
95 end
95 end
96
96
97 def verify_activation_key(key)
97 def verify_activation_key(key)
98 key == activation_key
98 key == activation_key
99 end
99 end
100
100
101 def self.random_password(length=5)
101 def self.random_password(length=5)
102 chars = 'abcdefghjkmnopqrstuvwxyz'
102 chars = 'abcdefghjkmnopqrstuvwxyz'
103 password = ''
103 password = ''
104 length.times { password << chars[rand(chars.length - 1)] }
104 length.times { password << chars[rand(chars.length - 1)] }
105 password
105 password
106 end
106 end
107
107
108 protected
108 protected
109 def encrypt_new_password
109 def encrypt_new_password
110 return if password.blank?
110 return if password.blank?
111 self.salt = (10+rand(90)).to_s
111 self.salt = (10+rand(90)).to_s
112 self.hashed_password = User.encrypt(self.password,self.salt)
112 self.hashed_password = User.encrypt(self.password,self.salt)
113 end
113 end
114
114
115 def password_required?
115 def password_required?
116 self.hashed_password.blank? || !self.password.blank?
116 self.hashed_password.blank? || !self.password.blank?
117 end
117 end
118
118
119 def self.encrypt(string,salt)
119 def self.encrypt(string,salt)
120 Digest::SHA1.hexdigest(salt + string)
120 Digest::SHA1.hexdigest(salt + string)
121 end
121 end
122
122
123 def uniqueness_of_email_from_activated_users
123 def uniqueness_of_email_from_activated_users
124 user = User.activated_users.find_by_email(self.email)
124 user = User.activated_users.find_by_email(self.email)
125 if user and (user.login != self.login)
125 if user and (user.login != self.login)
126 self.errors.add_to_base("Email has already been taken")
126 self.errors.add_to_base("Email has already been taken")
127 end
127 end
128 end
128 end
129
129
130 def enough_time_interval_between_same_email_registrations
130 def enough_time_interval_between_same_email_registrations
131 + return if !self.new_record?
131 open_user = User.find_by_email(self.email,
132 open_user = User.find_by_email(self.email,
132 :order => 'created_at DESC')
133 :order => 'created_at DESC')
133 if open_user and open_user.created_at and
134 if open_user and open_user.created_at and
134 (open_user.created_at > Time.now.gmtime - 5.minutes)
135 (open_user.created_at > Time.now.gmtime - 5.minutes)
135 self.errors.add_to_base("There are already unactivated registrations with this e-mail address (please wait for 5 minutes)")
136 self.errors.add_to_base("There are already unactivated registrations with this e-mail address (please wait for 5 minutes)")
136 end
137 end
137 end
138 end
138 end
139 end
@@ -1,69 +1,70
1 %h1= Configuration['ui.front.title']
1 %h1= Configuration['ui.front.title']
2
2
3 - if @announcements.length!=0
3 - if @announcements.length!=0
4 .announcementbox
4 .announcementbox
5 %span{:class => 'title'}
5 %span{:class => 'title'}
6 Announcements
6 Announcements
7 = render :partial => 'announcement', :collection => @announcements
7 = render :partial => 'announcement', :collection => @announcements
8
8
9 %b= Configuration['ui.front.welcome_message']
9 %b= Configuration['ui.front.welcome_message']
10 %br/
10 %br/
11 +
12 + - if !@hidelogin
11 Please login to see the problem list.
13 Please login to see the problem list.
12 %br/
14 %br/
13 %br/
15 %br/
14
16
15 - if flash[:notice]
17 - if flash[:notice]
16 %hr/
18 %hr/
17 %b= flash[:notice]
19 %b= flash[:notice]
18 %hr/
20 %hr/
19
21
20 %div{ :style => "border: solid 1px gray; padding: 2px; background: #f0f0f0;"}
22 %div{ :style => "border: solid 1px gray; padding: 2px; background: #f0f0f0;"}
21 - form_tag :controller => 'login', :action => 'login' do
23 - form_tag :controller => 'login', :action => 'login' do
22 %table
24 %table
23 %tr
25 %tr
24 %td{:align => "right"} Login:
26 %td{:align => "right"} Login:
25 %td= text_field_tag 'login'
27 %td= text_field_tag 'login'
26 %tr
28 %tr
27 %td{:align => "right"} Password:
29 %td{:align => "right"} Password:
28 %td= password_field_tag
30 %td= password_field_tag
29 = submit_tag 'Login'
31 = submit_tag 'Login'
30 -
31 %br/
32 %br/
32
33
33 - if Configuration['system.online_registration']
34 - if Configuration['system.online_registration']
34 Want to participate?
35 Want to participate?
35 %b
36 %b
36 Please
37 Please
37 = link_to 'register.', :controller => :users, :action => :new
38 = link_to 'register.', :controller => :users, :action => :new
38 %br/
39 %br/
39
40
40 - if (Configuration['system.mode']=='contest') and (Configuration['contest.multisites'])
41 - if (Configuration['system.mode']=='contest') and (Configuration['contest.multisites'])
41 %script{:type => 'text/javascript'}
42 %script{:type => 'text/javascript'}
42 var siteList = new Array();
43 var siteList = new Array();
43 - @countries.each do |country|
44 - @countries.each do |country|
44 = "siteList[#{country.id}] = new Array();"
45 = "siteList[#{country.id}] = new Array();"
45 - country.sites.each do |site|
46 - country.sites.each do |site|
46 = "siteList[#{country.id}][#{site.id}] = \"#{site.name}\";"
47 = "siteList[#{country.id}][#{site.id}] = \"#{site.name}\";"
47
48
48 var allSiteList = new Array();
49 var allSiteList = new Array();
49 - @site_select.each do |sel|
50 - @site_select.each do |sel|
50 = "allSiteList[#{sel[1]}]=\"#{sel[0]}\";"
51 = "allSiteList[#{sel[1]}]=\"#{sel[0]}\";"
51
52
52 %script{:type => 'text/javascript', :src => '/javascripts/site_update.js'}
53 %script{:type => 'text/javascript', :src => '/javascripts/site_update.js'}
53
54
54 %div{ :style => "border: solid 1px gray; padding: 2px; background: #f0f0f0;"}
55 %div{ :style => "border: solid 1px gray; padding: 2px; background: #f0f0f0;"}
55 %b For Site Administrator.
56 %b For Site Administrator.
56 %br/
57 %br/
57 Please select your country and site and login.
58 Please select your country and site and login.
58 - form_for :login, nil, :url => {:controller => 'login', :action => 'site_login'} do |f|
59 - form_for :login, nil, :url => {:controller => 'login', :action => 'site_login'} do |f|
59 Country:
60 Country:
60 = select :site_country, :id, @country_select_with_all, {}, {:onchange => "updateSiteList();", :onclick => "updateSiteList();" }
61 = select :site_country, :id, @country_select_with_all, {}, {:onchange => "updateSiteList();", :onclick => "updateSiteList();" }
61 Site:
62 Site:
62 = select :login, :site_id, @site_select
63 = select :login, :site_id, @site_select
63 %br/
64 %br/
64 Password:
65 Password:
65 = f.password_field :password
66 = f.password_field :password
66 = submit_tag "Site Administrator Login"
67 = submit_tag "Site Administrator Login"
67
68
68 %script{:type => 'text/javascript'}
69 %script{:type => 'text/javascript'}
69 updateSiteList();
70 updateSiteList();
@@ -1,95 +1,96
1
1
2 require File.dirname(__FILE__) + '/../spec_helper'
2 require File.dirname(__FILE__) + '/../spec_helper'
3
3
4 describe UsersController, "when a new user registers" do
4 describe UsersController, "when a new user registers" do
5
5
6 before(:each) do
6 before(:each) do
7 # create john
7 # create john
8
8
9 @john_info = {:login => 'john',
9 @john_info = {:login => 'john',
10 :full_name => 'John John',
10 :full_name => 'John John',
11 :email => 'john@space.com'}
11 :email => 'john@space.com'}
12 @john = User.new(@john_info)
12 @john = User.new(@john_info)
13
13
14 @john_activation_key = "123456"
14 @john_activation_key = "123456"
15
15
16 @john.should_receive(:activation_key).
16 @john.should_receive(:activation_key).
17 any_number_of_times.
17 any_number_of_times.
18 and_return(@john_activation_key)
18 and_return(@john_activation_key)
19
19
20 get :new
20 get :new
21 response.should render_template('users/new')
21 response.should render_template('users/new')
22 end
22 end
23
23
24 it "should show the new form again when user information is invalid" do
24 it "should show the new form again when user information is invalid" do
25 User.should_receive(:new).with(any_args()).and_return(@john)
25 User.should_receive(:new).with(any_args()).and_return(@john)
26 @john.should_receive(:activated=).with(false)
26 @john.should_receive(:activated=).with(false)
27 @john.should_receive(:valid?).and_return(false)
27 @john.should_receive(:valid?).and_return(false)
28 @john.should_not_receive(:save)
28 @john.should_not_receive(:save)
29
29
30 post :register, :login => @john_info[:login],
30 post :register, :login => @john_info[:login],
31 :full_name => @john_info[:full_name],
31 :full_name => @john_info[:full_name],
32 :email => @john_info[:email]
32 :email => @john_info[:email]
33
33
34 response.should render_template('users/new')
34 response.should render_template('users/new')
35 end
35 end
36
36
37 it "should create unactivated user and send e-mail with activation key" do
37 it "should create unactivated user and send e-mail with activation key" do
38 User.should_receive(:new).with(any_args()).and_return(@john)
38 User.should_receive(:new).with(any_args()).and_return(@john)
39 @john.should_receive(:activated=).with(false)
39 @john.should_receive(:activated=).with(false)
40 @john.should_receive(:valid?).and_return(true)
40 @john.should_receive(:valid?).and_return(true)
41 @john.should_receive(:save).and_return(true)
41 @john.should_receive(:save).and_return(true)
42
42
43 smtp_mock = mock("smtp")
43 smtp_mock = mock("smtp")
44 smtp_mock.should_receive(:send_message) do |msg,fr,to|
44 smtp_mock.should_receive(:send_message) do |msg,fr,to|
45 to.should == [@john_info[:email]]
45 to.should == [@john_info[:email]]
46 msg.index(@john_activation_key).should_not be_nil
46 msg.index(@john_activation_key).should_not be_nil
47 end
47 end
48
48
49 Net::SMTP.should_receive(:start).
49 Net::SMTP.should_receive(:start).
50 with(any_args()).
50 with(any_args()).
51 and_yield(smtp_mock)
51 and_yield(smtp_mock)
52
52
53 post :register, :login => @john_info[:login],
53 post :register, :login => @john_info[:login],
54 :full_name => @john_info[:full_name],
54 :full_name => @john_info[:full_name],
55 :email => @john_info[:email]
55 :email => @john_info[:email]
56
56
57 response.should render_template('users/new_splash')
57 response.should render_template('users/new_splash')
58 end
58 end
59
59
60 it "should create unactivated user and return error page when e-mail sending error" do
60 it "should create unactivated user and return error page when e-mail sending error" do
61 User.should_receive(:new).with(any_args()).and_return(@john)
61 User.should_receive(:new).with(any_args()).and_return(@john)
62 @john.should_receive(:activated=).with(false)
62 @john.should_receive(:activated=).with(false)
63 @john.should_receive(:valid?).and_return(true)
63 @john.should_receive(:valid?).and_return(true)
64 @john.should_receive(:save).and_return(true)
64 @john.should_receive(:save).and_return(true)
65
65
66 smtp_mock = mock("smtp")
66 smtp_mock = mock("smtp")
67 smtp_mock.should_receive(:send_message).
67 smtp_mock.should_receive(:send_message).
68 and_throw(:error)
68 and_throw(:error)
69
69
70 Net::SMTP.should_receive(:start).
70 Net::SMTP.should_receive(:start).
71 with(any_args()).
71 with(any_args()).
72 and_yield(smtp_mock)
72 and_yield(smtp_mock)
73
73
74 post :register, :login => @john_info[:login],
74 post :register, :login => @john_info[:login],
75 :full_name => @john_info[:full_name],
75 :full_name => @john_info[:full_name],
76 :email => @john_info[:email]
76 :email => @john_info[:email]
77
77
78 response.should render_template('users/email_error')
78 response.should render_template('users/email_error')
79 end
79 end
80
80
81 it "should activate user with valid activation key" do
81 it "should activate user with valid activation key" do
82 login = @john_info[:login]
82 login = @john_info[:login]
83 User.should_receive(:find_by_login).
83 User.should_receive(:find_by_login).
84 with(login).
84 with(login).
85 and_return(@john)
85 and_return(@john)
86 + User.should_not_receive(:find_by_email)
86 @john.should_receive(:valid?).and_return(true)
87 @john.should_receive(:valid?).and_return(true)
87 @john.should_receive(:activated=).with(true)
88 @john.should_receive(:activated=).with(true)
88 @john.should_receive(:save).and_return(true)
89 @john.should_receive(:save).and_return(true)
89
90
90 get :confirm, :login => login, :activation => @john_activation_key
91 get :confirm, :login => login, :activation => @john_activation_key
91
92
92 response.should render_template('users/confirm')
93 response.should render_template('users/confirm')
93 end
94 end
94
95
95 end
96 end
You need to be logged in to leave comments. Login now