Skip to content

Commit 7e21f12

Browse files
Only ensure a CbrainFileList read access at task submission, resolves #1057
1 parent 3987f3d commit 7e21f12

File tree

2 files changed

+19
-10
lines changed

2 files changed

+19
-10
lines changed

BrainPortal/app/models/boutiques_portal_task.rb

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -307,7 +307,11 @@ def final_task_list #:nodoc:
307307
original_userfiles_ids = self.params[:interface_userfile_ids].dup
308308
self.params[:interface_userfile_ids] = [] # zap it; we'll re-introduce each userfile.id as needed
309309
tasklist = original_userfiles_ids.map do |userfile_id|
310-
f = Userfile.find_accessible_by_user( userfile_id, self.user, :access_requested => file_access_symbol() )
310+
if CbrainFileList.find_by(:id => userfile_id)
311+
f = CbrainFileList.find_accessible_by_user( userfile_id, self.user, :access_requested => :read )
312+
else
313+
f = Userfile.find_accessible_by_user( userfile_id, self.user, :access_requested => :read )
314+
end
311315

312316
# One task for that file
313317
if (! f.is_a?( CbrainFileList ) || input.list) # in case of a list input, we *do* assign it the CbFileList
@@ -406,7 +410,7 @@ def cbcsv_files(descriptor = self.descriptor_for_after_form)
406410
next if isInactive(input)
407411
userfile_id = invoke_params[input.id]
408412
next if userfile_id.blank?
409-
userfile = Userfile.find_accessible_by_user(userfile_id, self.user, :access_requested => file_access_symbol())
413+
userfile = Userfile.find_accessible_by_user(userfile_id, self.user, :access_requested => :read)
410414
next unless ( userfile.is_a?(CbrainFileList) || (userfile.suggested_file_type || Object) <= CbrainFileList )
411415
[ input, userfile ]
412416
end.compact
@@ -481,7 +485,6 @@ def validateCols(cbcsv,id)
481485
# Raises an exception for the input parameter name if the parameter's value
482486
# is not adequate.
483487
def sanitize_param(input)
484-
485488
name = input.id
486489
type = input.type.downcase.to_sym # old code convention from previous integrator
487490

@@ -542,7 +545,7 @@ def sanitize_param(input)
542545
next nil # remove bad value
543546
end
544547

545-
file = Userfile.find_accessible_by_user(value, self.user, :access_requested => file_access_symbol()) rescue nil
548+
file = Userfile.find_accessible_by_user(value, self.user, :access_requested => :read) rescue nil
546549
unless file
547550
params_errors.add(invokename, ": cannot find userfile (ID #{value})")
548551
next nil # remove bad value

BrainPortal/lib/cbrain_task_generators/templates/portal.rb.erb

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -439,7 +439,8 @@ class CbrainTask::<%= name %> < <%= (descriptor['custom'] || {})['cbrain:inherit
439439
begin # Check that the user has access to all of the files in the cbcsv
440440
fs = f.userfiles_accessible_by_user!(self.user,nil,nil,file_access)
441441
for i in f.ordered_raw_ids.select{ |r| (! r.nil?) && (r.to_s != '0') }
442-
accessible = ! ( Userfile.find_accessible_by_user( i, self.user, :access_requested => file_access ) rescue nil ).nil?
442+
accessible = ! ( Userfile.find_accessible_by_user( i, self.user, :access_requested => file_access ) rescue nil ).nil?
443+
accessible |= ! ( CbrainFileList.find_accessible_by_user( i, self.user, :access_requested => :read ) rescue nil ).nil?
443444
params_errors.add( id, msg1.(i) ) unless accessible
444445
errFlag = false unless accessible
445446
end
@@ -463,14 +464,17 @@ class CbrainTask::<%= name %> < <%= (descriptor['custom'] || {})['cbrain:inherit
463464
# Get cbcsvs (note: we get files that end with cbcsv, but may not be of that class; the user is warned when this occurs, i.e. after_form fails)
464465
files = self.params[:interface_userfile_ids].map do |f|
465466
begin
466-
Userfile.find_accessible_by_user( f, self.user, :access_requested => file_access )
467+
# for file list read access is enough
468+
file = CbrainFileList.find_accessible_by_user( f, self.user, :access_requested => :read ) rescue nil
469+
# for individual files or collections, write access is needed if tool may mutate inputs
470+
file ||= Userfile.find_accessible_by_user( f, self.user, :access_requested => file_access )
467471
rescue => e
468472
params_errors.add(<%= ":'#{single_file['id']}'" %>, "encountered an error trying to find file #{f}. Ensure the file exists and you can access it.")
469473
return ""
470474
end
471475
end
472476
cbcsvs = files.select(&:presence).map do |f|
473-
Userfile.find_accessible_by_user( f, self.user, :access_requested => file_access )
477+
Userfile.find_accessible_by_user( f, self.user, :access_requested => :read )
474478
end.select do |f|
475479
f.is_a?(CbrainFileList) || (f.suggested_file_type || Object) <= CbrainFileList
476480
end
@@ -531,7 +535,7 @@ class CbrainTask::<%= name %> < <%= (descriptor['custom'] || {})['cbrain:inherit
531535
<%= "file_lists = [%s]" % file_lists.map { |f| ":'#{f['id']}'" }.join( ', ' ) %>
532536
return [] if files.nil? || files.length == 0
533537
files.select { |f| self.params[f].present? && ! file_lists.include?(f) } # Prevent problems with file-type inputs with list=true
534-
.map { |f| [f, Userfile.find_accessible_by_user(self.params[f], self.user, :access_requested => file_access)] }
538+
.map { |f| [f, Userfile.find_accessible_by_user(self.params[f], self.user, :access_requested => :read)] }
535539
.select { |f| f[1].is_a?(CbrainFileList) || (f[1].suggested_file_type || Object) <= CbrainFileList }
536540
end
537541

@@ -567,7 +571,8 @@ class CbrainTask::<%= name %> < <%= (descriptor['custom'] || {})['cbrain:inherit
567571
tsk
568572
end
569573
# Expand cbcsvs and generate tasks from them
570-
f = Userfile.find_accessible_by_user( id, self.user, :access_requested => file_access )
574+
f = CbrainFileList.find_accessible_by_user( id, self.user, :access_requested => :read ) rescue nil
575+
f ||= Userfile.find_accessible_by_user( id, self.user, :access_requested => file_access )
571576
if f.is_a?( CbrainFileList )
572577
ufiles = f.userfiles_accessible_by_user!( self.user, nil, nil, file_access )
573578
# Skip files that are purposefully nil (e.g. given id 0 by the user)
@@ -724,7 +729,8 @@ class CbrainTask::<%= name %> < <%= (descriptor['custom'] || {})['cbrain:inherit
724729
next value
725730
end
726731

727-
unless (file = Userfile.find_accessible_by_user(value, self.user, :access_requested => file_access) rescue nil)
732+
unless (file = Userfile.find_accessible_by_user(value, self.user, :access_requested => file_access) rescue nil ||
733+
CbrainFileList.find_accessible_by_user(value, self.user, :access_requested => :read) rescue nil )
728734
params_errors.add(name, ": cannot find userfile (ID #{value})")
729735
next value
730736
end

0 commit comments

Comments
 (0)