From 9cd7bb37648e405001ad987dbd9f6cd92ffd4d65 Mon Sep 17 00:00:00 2001 From: Andrew Nicols Date: Tue, 22 Apr 2014 22:45:33 +0800 Subject: [PATCH] MDL-45221 admin: configexecutable admin settings should only accept files --- lib/adminlib.php | 2 +- lib/tests/admintree_test.php | 30 ++++++++++++++++++++++++++++++ lib/tests/other/executable.php | 0 3 files changed, 31 insertions(+), 1 deletion(-) create mode 100755 lib/tests/other/executable.php diff --git a/lib/adminlib.php b/lib/adminlib.php index ac4f6ffa71e..eabb1a105eb 100644 --- a/lib/adminlib.php +++ b/lib/adminlib.php @@ -2466,7 +2466,7 @@ class admin_setting_configexecutable extends admin_setting_configfile { $default = $this->get_defaultsetting(); if ($data) { - if (file_exists($data) and is_executable($data)) { + if (file_exists($data) and !is_dir($data) and is_executable($data)) { $executable = ''; } else { $executable = ''; diff --git a/lib/tests/admintree_test.php b/lib/tests/admintree_test.php index e8389deafa9..623199f6cc0 100644 --- a/lib/tests/admintree_test.php +++ b/lib/tests/admintree_test.php @@ -111,6 +111,36 @@ class core_admintree_testcase extends advanced_testcase { $tree->add('root', new admin_category('bar', 'Bar'), ''); } + /** + * Testing whether a configexecutable setting is executable. + */ + public function test_admin_setting_configexecutable() { + global $CFG; + $this->resetAfterTest(); + + $executable = new admin_setting_configexecutable('test1', 'Text 1', 'Help Path', ''); + + // Check for an invalid path. + $result = $executable->output_html($CFG->dirroot . '/lib/tests/other/file_does_not_exist'); + $this->assertRegexp('/class="patherror"/', $result); + + // Check for a directory. + $result = $executable->output_html($CFG->dirroot); + $this->assertRegexp('/class="patherror"/', $result); + + // Check for a file which is not executable. + $result = $executable->output_html($CFG->dirroot . '/config.php'); + $this->assertRegexp('/class="patherror"/', $result); + + // Check for an executable file. + $result = $executable->output_html($CFG->dirroot . '/lib/tests/other/executable.php'); + $this->assertRegexp('/class="pathok"/', $result); + + // Check for no file specified. + $result = $executable->output_html(''); + $this->assertRegexp('/name="s__test1" value=""/', $result); + } + /** * Saving of values. */ diff --git a/lib/tests/other/executable.php b/lib/tests/other/executable.php new file mode 100755 index 00000000000..e69de29bb2d