diff --git a/app/controllers/tasks_controller.rb b/app/controllers/tasks_controller.rb --- a/app/controllers/tasks_controller.rb +++ b/app/controllers/tasks_controller.rb @@ -12,11 +12,15 @@ end def view - base_filename = File.basename("#{params[:file]}.#{params[:ext]}") - filename = "#{RAILS_ROOT}/data/tasks/#{base_filename}" - #filename = "/home/ioi/web_grader/data/tasks/#{base_filename}" - #filename = "/home/ioi/web_grader/public/images/rails.png" - if !FileTest.exists?(filename) + base_name = params[:file] + if !check_user_viewability(base_name) + redirect_to :action => 'index' and return + end + + base_filename = File.basename("#{base_name}.#{params[:ext]}") + filename = "#{Problem.download_file_basedir}/#{base_filename}" + + if !check_user_viewability(base_name) or !FileTest.exists?(filename) redirect_to :action => 'index' and return end @@ -34,11 +38,17 @@ protected def check_viewability - user = User.find(session[:user_id]) - if user==nil or !Configuration.show_tasks_to?(user) + @user = User.find(session[:user_id]) + if @user==nil or !Configuration.show_tasks_to?(@user) redirect_to :controller => 'main', :action => 'list' return false end end + def check_user_viewability(filename) + # individual file access control shall be added here + return false if not @user + return Configuration.show_tasks_to?(@user) + end + end diff --git a/app/helpers/main_helper.rb b/app/helpers/main_helper.rb --- a/app/helpers/main_helper.rb +++ b/app/helpers/main_helper.rb @@ -1,3 +1,18 @@ module MainHelper + def link_to_description_if_any(name, problem, options={}) + if !problem.url.blank? + return link_to name, problem.url, options + elsif !problem.description_filename.blank? + basename, ext = problem.description_filename.split('.') + options[:controller] = 'tasks' + options[:action] = 'view' + options[:file] = basename + options[:ext] = ext + return link_to name, options + else + return '' + end + end + end diff --git a/app/models/problem.rb b/app/models/problem.rb --- a/app/models/problem.rb +++ b/app/models/problem.rb @@ -10,7 +10,7 @@ DEFAULT_TIME_LIMIT = 1 DEFAULT_MEMORY_LIMIT = 32 - + def self.find_available_problems find(:all, :conditions => {:available => true}, :order => "date_added DESC") end @@ -47,6 +47,10 @@ return problem, importer.log_msg end + def self.download_file_basedir + return "#{RAILS_ROOT}/data/tasks" + end + protected def self.to_i_or_default(st, default) diff --git a/app/views/main/_problem.html.erb b/app/views/main/_problem.html.erb --- a/app/views/main/_problem.html.erb +++ b/app/views/main/_problem.html.erb @@ -4,7 +4,7 @@