Description:
merge with upstream
Commit status:
[Not Reviewed]
References:
merge algo
Comments:
0 Commit comments 0 Inline Comments
Unresolved TODOs:
There are no unresolved TODOs
Add another comment

r779:df983f8fc960 - - 8 files changed: 76 inserted, 13 deleted

@@ -0,0 +1,33
1 + # Authentication and user imports through programming.in.th web request
2 + require 'net/http'
3 + require 'uri'
4 + require 'json'
5 +
6 + class ProgrammingAuthenticator
7 + PROGRAMMING_AUTHEN_URL = "https://programming.in.th/authen.php"
8 +
9 + def find_or_create_user(result)
10 + user = User.find_by(login: result['username'])
11 + if not user
12 + user = User.new(login: result['username'],
13 + full_name: result['firstname'] + ' ' + result['surname'],
14 + alias: result['display'],
15 + email: result['email'])
16 + user.password = User.random_password
17 + user.save
18 + end
19 + return user
20 + end
21 +
22 + def authenticate(login, password)
23 + uri = URI(PROGRAMMING_AUTHEN_URL)
24 + result = Net::HTTP.post_form(uri, 'username' => login, 'password' => password)
25 + request_result = JSON.parse(result.body)
26 +
27 + if request_result.fetch('status', 'incorrect') == 'OK'
28 + return find_or_create_user(request_result)
29 + else
30 + return nil
31 + end
32 + end
33 + end
@@ -1,22 +1,24
1 1 class LoginController < ApplicationController
2 2
3 + @@authenticators = []
4 +
3 5 def index
4 6 # show login screen
5 7 reset_session
6 8 redirect_to :controller => 'main', :action => 'login'
7 9 end
8 10
9 11 def login
10 - user = User.authenticate(params[:login], params[:password])
12 + user = get_authenticated_user(params[:login], params[:password])
11 13 unless user
12 14 flash[:notice] = 'Wrong password'
13 15 redirect_to :controller => 'main', :action => 'login'
14 16 return
15 17 end
16 18
17 19 if (!GraderConfiguration['right.bypass_agreement']) and (!params[:accept_agree]) and !user.admin?
18 20 flash[:notice] = 'You must accept the agreement before logging in'
19 21 redirect_to :controller => 'main', :action => 'login'
20 22 return
21 23 end
22 24
@@ -55,13 +57,33
55 57 session[:site_id] = site.id
56 58 redirect_to :controller => 'site', :action => 'index'
57 59 else
58 60 flash[:notice] = 'Wrong site password'
59 61 redirect_to :controller => 'site', :action => 'login'
60 62 end
61 63 end
62 64
63 65 def logout
64 66 redirect_to root_path
65 67 end
66 68
69 + def self.add_authenticator(authenticator)
70 + @@authenticators << authenticator
71 + end
72 +
73 + protected
74 +
75 + def get_authenticated_user(login, password)
76 + if @@authenticators.empty?
77 + return User.authenticate(login, password)
78 + else
79 + user = User.authenticate(login, password)
80 + @@authenticators.each do |authenticator|
81 + if not user
82 + user = authenticator.authenticate(login, password)
83 + end
84 + end
85 + return user
86 + end
87 + end
88 +
67 89 end
@@ -1,41 +1,37
1 1 class ProblemsController < ApplicationController
2 2
3 3 before_action :admin_authorization
4 4
5 - #NOTE: ghost from the past?
6 - #before_action :testcase_authorization, only: [:show_testcase]
7 -
8 -
9 5 in_place_edit_for :problem, :name
10 6 in_place_edit_for :problem, :full_name
11 7 in_place_edit_for :problem, :full_score
12 8
13 9 def index
14 10 @problems = Problem.order(date_added: :desc)
15 11 end
16 12
17 13
18 14 def show
19 15 @problem = Problem.find(params[:id])
20 16 end
21 17
22 18 def new
23 19 @problem = Problem.new
24 20 @description = nil
25 21 end
26 22
27 23 def create
28 24 @problem = Problem.new(problem_params)
29 - @description = Description.new(problem_params[:description])
25 + @description = Description.new(description_params)
30 26 if @description.body!=''
31 27 if !@description.save
32 28 render :action => new and return
33 29 end
34 30 else
35 31 @description = nil
36 32 end
37 33 @problem.description = @description
38 34 if @problem.save
39 35 flash[:notice] = 'Problem was successfully created.'
40 36 redirect_to action: :index
41 37 else
@@ -296,16 +292,16
296 292 end
297 293
298 294 def get_problems_stat
299 295 end
300 296
301 297 private
302 298
303 299 def problem_params
304 300 params.require(:problem).permit(:name, :full_name, :full_score, :change_date_added, :date_added, :available, :test_allowed,:output_only, :url, :description, tag_ids:[])
305 301 end
306 302
307 303 def description_params
308 - params.require(:description).permit(:body, :markdown)
304 + params.require(:description).permit(:body, :markdowned)
309 305 end
310 306
311 307 end
@@ -118,37 +118,39
118 118 begin
119 119 self.problem = Problem.find(self.problem_id)
120 120 rescue ActiveRecord::RecordNotFound
121 121 self.problem = nil
122 122 end
123 123 else
124 124 self.problem = Submission.find_problem_in_source(self.source,
125 125 self.source_filename)
126 126 end
127 127 end
128 128
129 129 def assign_language
130 - self.language = Submission.find_language_in_source(self.source,
131 - self.source_filename)
130 + if self.language == nil
131 + self.language = Submission.find_language_in_source(self.source,
132 + self.source_filename)
133 + end
132 134 end
133 135
134 136 # validation codes
135 137 def must_specify_language
136 138 return if self.source==nil
137 139
138 140 # for output_only tasks
139 141 return if self.problem!=nil and self.problem.output_only
140 142
141 - if self.language==nil
142 - errors.add('source',"Cannot detect language. Did you submit a correct source file?") unless self.language!=nil
143 + if self.language == nil
144 + errors.add('source',"Cannot detect language. Did you submit a correct source file?")
143 145 end
144 146 end
145 147
146 148 def must_have_valid_problem
147 149 return if self.source==nil
148 150 if self.problem==nil
149 151 errors.add('problem',"must be specified.")
150 152 else
151 153 #admin always have right
152 154 return if self.user.admin?
153 155
154 156 #check if user has the right to submit the problem
@@ -31,25 +31,25
31 31
32 32 scope :activated_users, -> {where activated: true}
33 33
34 34 validates_presence_of :login
35 35 validates_uniqueness_of :login
36 36 validates_format_of :login, :with => /\A[\_A-Za-z0-9]+\z/
37 37 validates_length_of :login, :within => 3..30
38 38
39 39 validates_presence_of :full_name
40 40 validates_length_of :full_name, :minimum => 1
41 41
42 42 validates_presence_of :password, :if => :password_required?
43 - validates_length_of :password, :within => 4..20, :if => :password_required?
43 + validates_length_of :password, :within => 4..50, :if => :password_required?
44 44 validates_confirmation_of :password, :if => :password_required?
45 45
46 46 validates_format_of :email,
47 47 :with => /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/i,
48 48 :if => :email_validation?
49 49 validate :uniqueness_of_email_from_activated_users,
50 50 :if => :email_validation?
51 51 validate :enough_time_interval_between_same_email_registrations,
52 52 :if => :email_validation?
53 53
54 54 # these are for ytopc
55 55 # disable for now
@@ -76,13 +76,12
76 76 e.setValue(theFile.target.result);
77 77 e.gotoLine(1);
78 78 };
79 79 reader.readAsText(file)
80 80 });
81 81
82 82 //brython();
83 83 });
84 84
85 85
86 86
87 87
88 -
@@ -19,12 +19,15
19 19 # This is mainly for Code Jom contest.
20 20 ALLOW_TEST_PAIR_IMPORT = false
21 21
22 22 # Uncomment so that the system validates user e-mails
23 23 # VALIDATE_USER_EMAILS = true
24 24
25 25 # Uncomment so that Apache X-Sendfile is used when delivering files
26 26 # (e.g., in /tasks/view).
27 27 # USE_APACHE_XSENDFILE = true
28 28
29 29 # Uncomment so that configuration is read only once when the server is loaded
30 30 # CONFIGURATION_CACHE_ENABLED = true
31 +
32 + # Uncomment to allow authentication and user import from programming.in.th
33 + # LoginController.add_authenticator(ProgrammingAuthenticator.new)
@@ -93,24 +93,32
93 93 :key => 'right.heartbeat_response_full',
94 94 :value_type => 'string',
95 95 :default_value => 'OK',
96 96 :description => 'Heart beat response text when user got full score (set this value to the empty string to disable this feature)'
97 97 },
98 98
99 99 {
100 100 :key => 'right.view_testcase',
101 101 :value_type => 'boolean',
102 102 :default_value => 'false',
103 103 :description => 'When true, any user can view/download test data'
104 104 },
105 +
106 + {
107 + :key => 'system.online_registration',
108 + :value_type => 'boolean',
109 + :default_value => 'false',
110 + :description => 'This option enables online registration.'
111 + },
112 +
105 113 # If Configuration['system.online_registration'] is true, the
106 114 # system allows online registration, and will use these
107 115 # information for sending confirmation emails.
108 116 {
109 117 :key => 'system.online_registration.smtp',
110 118 :value_type => 'string',
111 119 :default_value => 'smtp.somehost.com'
112 120 },
113 121
114 122 {
115 123 :key => 'system.online_registration.from',
116 124 :value_type => 'string',
You need to be logged in to leave comments. Login now