From 730d5541bda70a35a1c10f09a1b693536c05a9de Mon Sep 17 00:00:00 2001 From: Ralf Teusner Date: Fri, 19 Oct 2018 15:25:05 +0200 Subject: [PATCH] allow running, testing and scoring of files in subfolders by using the full filepath --- app/assets/javascripts/editor/editor.js.erb | 4 ++-- app/assets/javascripts/editor/execution.js.erb | 5 +++-- app/models/code_ocean/file.rb | 8 ++++++++ lib/docker_client.rb | 12 +++++++++--- 4 files changed, 22 insertions(+), 7 deletions(-) diff --git a/app/assets/javascripts/editor/editor.js.erb b/app/assets/javascripts/editor/editor.js.erb index 0ff03915..6bb6dc27 100644 --- a/app/assets/javascripts/editor/editor.js.erb +++ b/app/assets/javascripts/editor/editor.js.erb @@ -270,8 +270,8 @@ configureEditors: function () { $('#files').jstree($('#files').data('entries')); $('#files').on('click', 'li.jstree-leaf', function (event) { this.setActiveFile( - filename: $(event.target).parent().text(), - id: parseInt($(event.target).parent().attr('id')) + $(event.target).parent().text(), + parseInt($(event.target).parent().attr('id')) ); var frame = $('[data-file-id="' + this.active_file.id + '"]').parent(); this.showFrame(frame); diff --git a/app/assets/javascripts/editor/execution.js.erb b/app/assets/javascripts/editor/execution.js.erb index a5126462..5f8aa248 100644 --- a/app/assets/javascripts/editor/execution.js.erb +++ b/app/assets/javascripts/editor/execution.js.erb @@ -2,8 +2,9 @@ CodeOceanEditorWebsocket = { websocket: null, createSocketUrl: function(url) { - var sockURL = new URL(window.location); - sockURL.pathname = url; + var sockURL = new URL(url, window.location); + // not needed any longer, we put it directly into the url: sockURL.pathname = url; + // sanitize socket protocol string, strip trailing slash and other malicious chars if they are there sockURL.protocol = '<%= DockerClient.config['ws_client_protocol']&.match(/(\w+):*\/*/)&.to_a&.at(1) %>:'; diff --git a/app/models/code_ocean/file.rb b/app/models/code_ocean/file.rb index 9ae40b19..380f4989 100644 --- a/app/models/code_ocean/file.rb +++ b/app/models/code_ocean/file.rb @@ -80,6 +80,14 @@ module CodeOcean end private :content_present? + def filepath + if path.present? + ::File.join(path, name_with_extension) + else + name_with_extension + end + end + def hash_content self.hashed_content = Digest::MD5.new.hexdigest(file_type.try(:binary?) ? ::File.new(native_file.file.path, 'r').read : content) end diff --git a/lib/docker_client.rb b/lib/docker_client.rb index b44191aa..55c458ca 100644 --- a/lib/docker_client.rb +++ b/lib/docker_client.rb @@ -32,7 +32,11 @@ class DockerClient end def command_substitutions(filename) - {class_name: File.basename(filename, File.extname(filename)).camelize, filename: filename, module_name: File.basename(filename, File.extname(filename)).underscore} + { + class_name: File.basename(filename, File.extname(filename)).camelize, + filename: filename, + module_name: File.basename(filename, File.extname(filename)).underscore + } end private :command_substitutions @@ -310,7 +314,8 @@ class DockerClient """ Run commands by attaching a websocket to Docker. """ - command = submission.execution_environment.run_command % command_substitutions(filename) + filepath = submission.collect_files.find{|f| f.name_with_extension == filename}.filepath + command = submission.execution_environment.run_command % command_substitutions(filepath) create_workspace_files = proc { create_workspace_files(container, submission) } open_websocket_connection(command, create_workspace_files, block) # actual run command is run in the submissions controller, after all listeners are attached. @@ -320,7 +325,8 @@ class DockerClient """ Stick to existing Docker API with exec command. """ - command = submission.execution_environment.test_command % command_substitutions(filename) + filepath = submission.collect_files.find{|f| f.name_with_extension == filename}.filepath + command = submission.execution_environment.test_command % command_substitutions(filepath) create_workspace_files = proc { create_workspace_files(container, submission) } execute_command(command, create_workspace_files, block) end