From 629c925e77203b8e4270a9c2feb3166a68f76d72 Mon Sep 17 00:00:00 2001 From: Jan Graichen Date: Fri, 19 Oct 2018 12:34:12 +0200 Subject: [PATCH 1/2] Fix setting active file in editor The file select hook did construct an active_file but did not assign it to the actual variables. This commit changes the hook to use the existing setActiveFile helper function. --- app/assets/javascripts/editor/editor.js.erb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/assets/javascripts/editor/editor.js.erb b/app/assets/javascripts/editor/editor.js.erb index 1e254dd3..0ff03915 100644 --- a/app/assets/javascripts/editor/editor.js.erb +++ b/app/assets/javascripts/editor/editor.js.erb @@ -269,11 +269,11 @@ configureEditors: function () { initializeFileTree: function () { $('#files').jstree($('#files').data('entries')); $('#files').on('click', 'li.jstree-leaf', function (event) { - active_file = { + this.setActiveFile( filename: $(event.target).parent().text(), id: parseInt($(event.target).parent().attr('id')) - }; - var frame = $('[data-file-id="' + active_file.id + '"]').parent(); + ); + var frame = $('[data-file-id="' + this.active_file.id + '"]').parent(); this.showFrame(frame); this.toggleButtonStates(); }.bind(this)); From 730d5541bda70a35a1c10f09a1b693536c05a9de Mon Sep 17 00:00:00 2001 From: Ralf Teusner Date: Fri, 19 Oct 2018 15:25:05 +0200 Subject: [PATCH 2/2] 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