Skip to content
Snippets Groups Projects
Commit b04360fa authored by Jan-Hendrik Willms's avatar Jan-Hendrik Willms
Browse files

resurrect trails parameter type 'string', fixes #2165

Closes #2165

Merge request studip/studip!1399
parent 5cf583cc
No related branches found
No related tags found
1 merge request!4Draft: Icon creation
...@@ -145,11 +145,11 @@ abstract class StudipController extends Trails_Controller ...@@ -145,11 +145,11 @@ abstract class StudipController extends Trails_Controller
/** /**
* Validate arguments based on a list of given types. The types are: * Validate arguments based on a list of given types. The types are:
* 'int', 'float', 'option'. If the list of types is NULL * 'int', 'float', 'option' and 'string'. If the list of types is NULL
* or shorter than the argument list, 'option' is assumed for all * or shorter than the argument list, 'option' is assumed for all
* remaining arguments. 'option' differs from Request::option() in * remaining arguments. 'option' differs from Request::option() in
* that it also accepts the charaters '-' and ',' in addition to all * that it also accepts the charaters '-' and ',' in addition to all
* word charaters. * word characters.
* *
* Since Stud.IP 4.0 it is also possible to directly inject * Since Stud.IP 4.0 it is also possible to directly inject
* SimpleORMap objects. If types is NULL, the signature of the called * SimpleORMap objects. If types is NULL, the signature of the called
...@@ -160,15 +160,15 @@ abstract class StudipController extends Trails_Controller ...@@ -160,15 +160,15 @@ abstract class StudipController extends Trails_Controller
* If $_autobind is set to true, the created object is also assigned * If $_autobind is set to true, the created object is also assigned
* to the controller so that it is available in a view. * to the controller so that it is available in a view.
* *
* @param array an array of arguments to the action * @param array $args an array of arguments to the action
* @param array list of argument types (optional) * @param array $types list of argument types (optional)
*/ */
public function validate_args(&$args, $types = null) public function validate_args(&$args, $types = null)
{ {
$class_infos = []; $class_infos = [];
if ($types === null) { if ($types === null) {
$types = array_fill(0, count($args), 'option'); $types = [];
} }
if ($this->has_action($this->current_action)) { if ($this->has_action($this->current_action)) {
...@@ -177,10 +177,11 @@ abstract class StudipController extends Trails_Controller ...@@ -177,10 +177,11 @@ abstract class StudipController extends Trails_Controller
foreach ($parameters as $i => $parameter) { foreach ($parameters as $i => $parameter) {
$class_type = $parameter->getType(); $class_type = $parameter->getType();
if (!$class_type if (
!$class_type
|| !class_exists($class_type->getName()) || !class_exists($class_type->getName())
|| !is_a($class_type->getName(), SimpleORMap::class, true)) || !is_a($class_type->getName(), SimpleORMap::class, true)
{ ) {
continue; continue;
} }
...@@ -198,7 +199,7 @@ abstract class StudipController extends Trails_Controller ...@@ -198,7 +199,7 @@ abstract class StudipController extends Trails_Controller
} }
foreach ($args as $i => &$arg) { foreach ($args as $i => &$arg) {
$type = $types[$i] ?: 'option'; $type = $types[$i] ?? 'option';
switch ($type) { switch ($type) {
case 'int': case 'int':
$arg = (int) $arg; $arg = (int) $arg;
...@@ -241,6 +242,9 @@ abstract class StudipController extends Trails_Controller ...@@ -241,6 +242,9 @@ abstract class StudipController extends Trails_Controller
} }
break; break;
case 'string':
break;
default: default:
throw new Trails_Exception(500, 'Unknown type "' . $type . '"'); throw new Trails_Exception(500, 'Unknown type "' . $type . '"');
} }
......
...@@ -228,6 +228,29 @@ final class StudipControllerTest extends Codeception\Test\Unit ...@@ -228,6 +228,29 @@ final class StudipControllerTest extends Codeception\Test\Unit
$this->assertEquals([23], $variables['bad']); $this->assertEquals([23], $variables['bad']);
} }
/**
* @dataProvider argumentValidationProvider
* @covers StudipController::validate_args
*/
public function testArgumentValidation(array $args, array $expected, ?array $types): void
{
$this->getController()->validate_args($args, $types);
$this->assertEquals($expected, $args);
}
/**
* @dataProvider argumentValidationOptionProvider
* @covers StudipController::validate_args
*/
public function testArgumentValidationOption(string $should_fail): void
{
$args = [$should_fail];
$this->expectException(Trails_Exception::class);
$this->getController()->validate_args($args);
}
/** /**
* Returns a relative url for Stud.IP if given url matches. * Returns a relative url for Stud.IP if given url matches.
*/ */
...@@ -293,6 +316,29 @@ final class StudipControllerTest extends Codeception\Test\Unit ...@@ -293,6 +316,29 @@ final class StudipControllerTest extends Codeception\Test\Unit
'url-and-parameters' => [false, 'https://example.org', ['foo' => 'bar', 'baz' => 42]], 'url-and-parameters' => [false, 'https://example.org', ['foo' => 'bar', 'baz' => 42]],
]; ];
} }
public function argumentValidationProvider(): array
{
return [
'default' => [['2', '2,5', 'abc', 'a-b-c'], ['2', '2,5', 'abc', 'a-b-c'], null],
'typed' => [['2.5', '2.5', 'abc', 'a-b-c'], [2, 2.5, 'abc', 'a-b-c'], ['int', 'float', 'option', 'string']],
'int' => [['1.5', '2.5', '-1.5'], [1, 2, -1], ['int', 'int', 'int']],
'float' => [['1.5', '2.5', '-1.5'], [1.5, 2.5, -1.5], ['float', 'float', 'float']],
'option' => [['a-b', '1,2,3', 'foobar'], ['a-b', '1,2,3', 'foobar'], ['option', 'option', 'option']],
'string' => [['a', 'b!', 'http://c#?'], ['a', 'b!', 'http://c#?'], ['string', 'string', 'string']],
];
}
public function argumentValidationOptionProvider(): array
{
return [
'space' => [' '],
'float' => ['1.5'],
'url' => ['http://example.org'],
'special' => ['a#b'],
'little-bobby-tables' => ["Robert'); DROP TABLE STUDENTS; --"],
];
}
} }
class StudipControllerTestController extends StudipController class StudipControllerTestController extends StudipController
...@@ -303,4 +349,9 @@ class StudipControllerTestController extends StudipController ...@@ -303,4 +349,9 @@ class StudipControllerTestController extends StudipController
$this->current_action = 'foo'; $this->current_action = 'foo';
} }
public function foo_action(int $int, float $float, string $option, string $string): void
{
$this->render_text('In a test?');
}
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment